source: GTP/trunk/App/Demos/Illum/Shark3D/version164x12u/IllumDemo/src/res/levelutil/shader/prog/d3d9_hlsl/include_stddef_d3d9_hlsl.s3d_shadercode @ 2196

Revision 2196, 6.6 KB checked in by szirmay, 17 years ago (diff)
Line 
1///////////////////////////////////////////////////////////////////////////////
2//
3//      ##  ######
4//       ######  ###
5//  ## ###############        Shark 3D Engine (www.shark3d.com)
6//   ########## # # #
7//    ########                Copyright (c) 1996-2006 Spinor GmbH.
8//   ######### # # #          All rights reserved.
9//  ##   ##########
10//      ##
11//
12///////////////////////////////////////////////////////////////////////////////
13
14#ifndef STDDEF_D3D9_HLSL_SC
15#define STDDEF_D3D9_HLSL_SC
16
17///////////////////////////////////////////////////////////////////////////////
18
19#include \
20    <levelutil/shader/prog/d3d9_hlsl/include_stdstate_d3d9_hlsl.s3d_shadercode_run>
21
22///////////////////////////////////////////////////////////////////////////////
23// Compression
24///////////////////////////////////////////////////////////////////////////////
25
26float3 s3d_uncomprNormal(
27        float3 comprNormal)
28{
29#ifdef S3D_COMPR_NORMAL
30    return comprNormal / 127.5 - 1.0;
31#else
32    return comprNormal;
33#endif   
34}
35
36float4 s3d_uncomprBoneWgh(
37        float4 comprBoneWgh)
38{
39#ifdef S3D_COMPR_BONEWGH
40    return  comprBoneWgh / 255.0f;
41#else
42    return comprBoneWgh;
43#endif   
44}
45
46///////////////////////////////////////////////////////////////////////////////
47// Bones
48///////////////////////////////////////////////////////////////////////////////
49
50// default to 4 for bone transformation w/o bone subscriptions
51#ifndef S3D_MATBONE_CNT
52#define S3D_MATBONE_CNT 4
53#endif
54
55// works w/ compressed and uncompressed bone weights.
56void s3d_calcBoneTransfSubscr(
57        out float4x4 matBoneFinal, const float4x4 matBone[S3D_MATBONE_CNT],
58        const float4 boneWgh, const int4 boneSubscr)
59{
60    float4 uncomprBoneWgh = s3d_uncomprBoneWgh(boneWgh);
61
62    matBoneFinal = uncomprBoneWgh.x * matBone[boneSubscr.x];
63    matBoneFinal += uncomprBoneWgh.y * matBone[boneSubscr.y];
64    matBoneFinal += uncomprBoneWgh.z * matBone[boneSubscr.z];
65    matBoneFinal += uncomprBoneWgh.w * matBone[boneSubscr.w];
66}
67
68///////////////////////////////////////////////////////////////////////////////
69
70#ifdef S3D_USE_BONESUBSCR
71
72#define S3D_BONE_DECL_STD(boneWgh, boneSubscr) \
73        float4 boneWgh: BLENDWEIGHT; \
74        int4 boneSubscr: BLENDINDICES;
75 
76#define S3D_MATBONE_DECL_STD(matBone) \
77        const float4x4 matBone[S3D_MATBONE_CNT];
78
79#define S3D_BONE_TRANSF_STD(matBoneFinal, matBone, boneWgh, boneSubscr) \
80        s3d_calcBoneTransfSubscr(matBoneFinal, matBone, boneWgh, boneSubscr);
81
82#else
83#ifdef S3D_USE_BONEWGH
84
85#define S3D_BONE_DECL_STD(boneWgh, boneSubscr) \
86        float4 boneWgh: BLENDWEIGHT;
87
88#define S3D_MATBONE_DECL_STD(matBone) \
89        const float4x4 matBone[S3D_MATBONE_CNT];\
90        static const int4 dummyBoneSubscr = int4(0, 1, 2, 3);
91       
92#define S3D_BONE_TRANSF_STD(matBoneFinal, matBone, boneWgh, boneSubscr) \
93        s3d_calcBoneTransfSubscr( \
94                matBoneFinal, matBone, boneWgh, dummyBoneSubscr);
95
96#else
97
98#define S3D_BONE_DECL_STD(boneWgh, boneSubscr)
99
100#define S3D_MATBONE_DECL_STD(matBone)
101
102#define S3D_BONE_TRANSF_STD(matBoneFinal, matBone, boneWgh, boneSubscr) \
103    matBoneFinal = matView;
104
105#endif
106#endif
107
108///////////////////////////////////////////////////////////////////////////////
109// Lighting
110///////////////////////////////////////////////////////////////////////////////
111
112float s3d_calcLightRangeFac(float dist, float range)
113{
114    float lightRsqRange = 1.0 / (range * range);
115    float rangeFac = max(1.0 - dist * dist * lightRsqRange, 0.0);
116    return rangeFac;
117}
118
119float s3d_calcLightRangeFac(float dist, float4 posRange)
120{
121    return s3d_calcLightRangeFac(dist, posRange.w);
122}
123
124///////////////////////////////////////////////////////////////////////////////
125
126s3d_ColPair s3d_calcPointLightTerm(
127        float3 camToVertView, float3 normalView, float mtrlPower,
128        float4 lightPos, float4 lightAmbient, float4 lightDiffuse,
129        float4 lightSpecular, float4 lightAtten)
130{
131    float3 vertToLightDirView = normalize(lightPos - camToVertView);
132    float normalDotVertToLightDir = dot(normalView, vertToLightDirView);
133    float3 camToVertDirView = normalize(camToVertView);
134    float3 HalfDirView = normalize(vertToLightDirView - camToVertDirView);
135    float normalDotHalfDir = dot(normalView, HalfDirView);
136 
137    float dist = length(lightPos - camToVertView);
138    float rangeFac = s3d_calcLightRangeFac(dist, lightAtten);
139    float4 litVec = lit(normalDotVertToLightDir,
140            normalDotHalfDir, mtrlPower) * rangeFac;
141    float ambient = litVec.x;
142    float diffuse = litVec.y;
143    float specular = litVec.z;
144
145    s3d_ColPair result;
146    result.diffuse  = lightAmbient * ambient;
147    result.diffuse += lightDiffuse * diffuse;
148    result.specular = lightSpecular * specular;
149
150    return result;
151}
152
153s3d_ColPair s3d_calcPointLightTerm(
154        float3 camToVertView, float3 normalView,
155        float mtrlPower, s3d_StdProgLight light)
156{
157    return s3d_calcPointLightTerm(
158            camToVertView, normalView, mtrlPower, light.pos,
159            light.ambient, light.diffuse, light.specular,
160            light.atten);
161}
162
163///////////////////////////////////////////////////////////////////////////////
164
165void s3d_calcBump(
166        out float3 diffuseDirSurf, out float3 specularDirSurf,
167        float3 normalView, float3 vertToLightDirView, float3 halfDirView,
168        float3 tangentUView, float3 tangentVView)
169{
170    diffuseDirSurf.x = dot(tangentUView, vertToLightDirView);
171    diffuseDirSurf.y = dot(tangentVView, vertToLightDirView);
172    diffuseDirSurf.z = dot(normalView, vertToLightDirView);
173
174    specularDirSurf.x = dot(tangentUView, halfDirView);
175    specularDirSurf.y = dot(tangentVView, halfDirView);
176    specularDirSurf.z = dot(normalView, halfDirView);
177}
178
179///////////////////////////////////////////////////////////////////////////////
180// Fog
181///////////////////////////////////////////////////////////////////////////////
182
183float3 s3d_calcFogExp(
184        float3 color, float3 fogColor, float fogDensity, float fogCoord)
185{
186    float fogFactor = exp(-clamp(fogDensity, 0, 1) * fogCoord);
187    return lerp(fogColor, color, fogFactor);
188}
189
190float3 s3d_calcFogExp2(
191        float3 color, float3 fogColor, float fogDensity, float fogCoord)
192{
193    float fogFactor = exp(-pow(clamp(fogDensity, 0, 1) * fogCoord, 2));
194    return lerp(fogColor, color, fogFactor);
195}
196
197///////////////////////////////////////////////////////////////////////////////
198// Tex
199///////////////////////////////////////////////////////////////////////////////
200
201#endif // STDDEF_D3D9_HLSL_SC
Note: See TracBrowser for help on using the repository browser.