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_OGL_GLSL_SC
|
---|
15 | @define STDDEF_OGL_GLSL_SC
|
---|
16 |
|
---|
17 | ///////////////////////////////////////////////////////////////////////////////
|
---|
18 |
|
---|
19 | // default to 4 for bone transformation w/o bone subcriptions
|
---|
20 | @ifndef S3D_MATBONE_CNT
|
---|
21 | @define S3D_MATBONE_CNT 4
|
---|
22 | @endif
|
---|
23 |
|
---|
24 | @ifdef S3D_USE_BONESUBSCR
|
---|
25 |
|
---|
26 | @define S3D_BONE_TRANSF_SUBSCR(matBoneFinal, matBone, boneWgh, boneSubscr) \
|
---|
27 | matBoneFinal \
|
---|
28 | = boneWgh.x * matBone[int(boneSubscr.x)] \
|
---|
29 | + boneWgh.y * matBone[int(boneSubscr.y)] \
|
---|
30 | + boneWgh.z * matBone[int(boneSubscr.z)] \
|
---|
31 | + boneWgh.w * matBone[int(boneSubscr.w)];
|
---|
32 |
|
---|
33 | @define S3D_BONE_DECL_STD(boneWgh, boneSubscr) \
|
---|
34 | attribute vec4 boneWgh; \
|
---|
35 | attribute vec4 boneSubscr;
|
---|
36 |
|
---|
37 | @define S3D_MATBONE_DECL_STD(matBone) \
|
---|
38 | uniform mat4 matBone[S3D_MATBONE_CNT];
|
---|
39 |
|
---|
40 | @define S3D_BONE_TRANSF_STD(matBoneFinal, matBone, boneWgh, boneSubscr) \
|
---|
41 | mat4 matBoneFinal; \
|
---|
42 | S3D_BONE_TRANSF_SUBSCR(matBoneFinal, matBone, boneWgh, boneSubscr)
|
---|
43 |
|
---|
44 | @else
|
---|
45 |
|
---|
46 | @ifdef S3D_USE_BONEWGH
|
---|
47 |
|
---|
48 | @define S3D_BONE_TRANSF_WGH(matBoneFinal, matBone, boneWgh) \
|
---|
49 | matBoneFinal \
|
---|
50 | = boneWgh.x * matBone[0] \
|
---|
51 | + boneWgh.y * matBone[1] \
|
---|
52 | + boneWgh.z * matBone[2] \
|
---|
53 | + boneWgh.w * matBone[3];
|
---|
54 |
|
---|
55 | @define S3D_BONE_DECL_STD(boneWgh, boneSubscr) \
|
---|
56 | attribute vec4 boneWgh;
|
---|
57 |
|
---|
58 | @define S3D_MATBONE_DECL_STD(matBone) \
|
---|
59 | uniform mat4 matBone[S3D_MATBONE_CNT];
|
---|
60 |
|
---|
61 | @define S3D_BONE_TRANSF_STD(matBoneFinal, matBone, boneWgh, boneSubscr) \
|
---|
62 | mat4 matBoneFinal; \
|
---|
63 | S3D_BONE_TRANSF_WGH(matBoneFinal, matBone, boneWgh)
|
---|
64 |
|
---|
65 | @else
|
---|
66 |
|
---|
67 | @define S3D_BONE_DECL_STD(boneWgh, boneSubscr)
|
---|
68 |
|
---|
69 | @define S3D_MATBONE_DECL_STD(matBone)
|
---|
70 |
|
---|
71 | @define S3D_BONE_TRANSF_STD(matBoneFinal, matBone, boneWgh, boneSubscr) \
|
---|
72 | mat4 matBoneFinal = gl_ModelViewMatrix
|
---|
73 |
|
---|
74 | @endif
|
---|
75 |
|
---|
76 | @endif
|
---|
77 |
|
---|
78 | ///////////////////////////////////////////////////////////////////////////////
|
---|
79 |
|
---|
80 | float s3d_calcLightRangeFac(float dist, vec4 posRange)
|
---|
81 | {
|
---|
82 | float lightRsqRange = 1.0 / (posRange.w * posRange.w);
|
---|
83 | float rangeFac = max(1.0 - dist * dist * lightRsqRange, 0.0);
|
---|
84 | return rangeFac;
|
---|
85 | }
|
---|
86 |
|
---|
87 | float s3d_calcLightRangeFac(float dist, float quadraticAtten)
|
---|
88 | {
|
---|
89 | float lightRsqRange = quadraticAtten * 0.25;
|
---|
90 | float rangeFac = max(1.0 - dist * dist * lightRsqRange, 0.0);
|
---|
91 | return rangeFac;
|
---|
92 | }
|
---|
93 |
|
---|
94 | ///////////////////////////////////////////////////////////////////////////////
|
---|
95 |
|
---|
96 | struct s3d_ColPair
|
---|
97 | {
|
---|
98 | vec4 diffuse;
|
---|
99 | vec4 specular;
|
---|
100 | };
|
---|
101 |
|
---|
102 | @define s3d_calcPointLightTermImpl( \
|
---|
103 | result, camToVertView, normalView, mtrlPower, \
|
---|
104 | lightPos, lightAmbient, lightDiffuse, lightSpecular, quadraticAtten) \
|
---|
105 | { \
|
---|
106 | vec3 vertToLightDirView = normalize(lightPos.xyz - camToVertView.xyz); \
|
---|
107 | float normalDotVertToLightDir = dot(normalView, vertToLightDirView); \
|
---|
108 | vec3 camToVertDirView = normalize(camToVertView.xyz); \
|
---|
109 | vec3 HalfDirView = normalize(vertToLightDirView - camToVertDirView); \
|
---|
110 | float normalDotHalfDir= dot(normalView, HalfDirView); \
|
---|
111 | \
|
---|
112 | float dist = length(lightPos.xyz - camToVertView.xyz); \
|
---|
113 | float rangeFac = s3d_calcLightRangeFac(dist, quadraticAtten); \
|
---|
114 | float specular = pow(max(0.0, normalDotHalfDir), mtrlPower) * rangeFac; \
|
---|
115 | \
|
---|
116 | result.diffuse = lightAmbient * rangeFac; \
|
---|
117 | float diffuse = normalDotVertToLightDir * rangeFac; \
|
---|
118 | result.diffuse += lightDiffuse * diffuse; \
|
---|
119 | result.specular = lightSpecular * specular; \
|
---|
120 | }
|
---|
121 |
|
---|
122 | @define s3d_calcPointLightTerm( \
|
---|
123 | result, camToVertView, normalView, mtrlPower, light, lightProd) \
|
---|
124 | { \
|
---|
125 | s3d_calcPointLightTermImpl( \
|
---|
126 | result, camToVertView, normalView, mtrlPower, light.position, \
|
---|
127 | lightProd.ambient, lightProd.diffuse, \
|
---|
128 | lightProd.specular, light.quadraticAttenuation); \
|
---|
129 | }
|
---|
130 |
|
---|
131 | ///////////////////////////////////////////////////////////////////////////////
|
---|
132 |
|
---|
133 | void s3d_calcBump(
|
---|
134 | out vec3 diffuseDirSurf, out vec3 specularDirSurf,
|
---|
135 | vec3 normalView, vec3 vertToLightDirView, vec3 halfDirView,
|
---|
136 | vec3 tangentUView, vec3 tangentVView)
|
---|
137 | {
|
---|
138 | diffuseDirSurf.x = dot(tangentUView, vertToLightDirView);
|
---|
139 | diffuseDirSurf.y = dot(tangentVView, vertToLightDirView);
|
---|
140 | diffuseDirSurf.z = dot(normalView, vertToLightDirView);
|
---|
141 |
|
---|
142 | specularDirSurf.x = dot(tangentUView, halfDirView);
|
---|
143 | specularDirSurf.y = dot(tangentVView, halfDirView);
|
---|
144 | specularDirSurf.z = dot(normalView, halfDirView);
|
---|
145 | }
|
---|
146 |
|
---|
147 | ///////////////////////////////////////////////////////////////////////////////
|
---|
148 |
|
---|
149 | vec3 s3d_uncomprNormal(vec3 comprNormal)
|
---|
150 | {
|
---|
151 | @ifdef S3D_COMPR_NORMAL
|
---|
152 | return comprNormal / 127.5 - 1;
|
---|
153 | @else
|
---|
154 | return comprNormal;
|
---|
155 | @endif
|
---|
156 | }
|
---|
157 |
|
---|
158 | ///////////////////////////////////////////////////////////////////////////////
|
---|
159 |
|
---|
160 | @endif // STDDEF_OGL_GLSL_SC
|
---|