5 namespace gfx::drivers;
7 public class CubeMap : Bitmap
10 void Load(DisplaySystem displaySystem, const String * names, const String extension, bool oldStyle)
13 for(i = 0; i < 6; i++)
15 char location[MAX_LOCATION];
16 Bitmap face = i > 0 ? { } : this;
17 strcpy(location, names[i]);
19 ChangeExtension(location, extension, location);
20 if(face.Load(location, null, null))
22 face.driverData = driverData;
23 displaySystem.driver.MakeDDBitmap(displaySystem, face, true, (i + 1) | (oldStyle << 3));
35 // ********** Default Shader **********
36 public enum LightMode { off, dir, pos, posAtt, posSpot, posSpotAtt };
37 public enum SwizzleMode { off, alpha, red };
39 public class DefaultShaderBits : uint64
43 bool nonLocalViewer:1;
46 bool separateSpecular:1;
49 bool perVertexColor:1;
50 SwizzleMode swizzle:2;
56 bool normalsMapping:1;
57 bool specularMapping:1;
58 bool environmentMapping:1;
65 public class CompiledDefaultShader : CompiledShader
78 int uLightsDiffuse[8];
79 int uLightsAmbient[8];
80 int uLightsSpecular[8];
82 int uLightsSpotDir[8];
83 int uLightsSpotCutOffCos[8];
84 int uLightsSpotExp[8];
100 void registerUniforms(int program, DefaultShaderBits state)
102 #if ENABLE_GL_SHADERS
103 uPrjMatrix = glGetUniformLocation(program, "projection_matrix");
104 uMatDiffuse = glGetUniformLocation(program, "matDiffuse");
107 uMVMatrix = glGetUniformLocation(program, "modelview_matrix");
113 for(i = 0; i < 8; i++)
117 sprintf(name, "lightsPos[%d]", i);
118 uLightsPos[i] = glGetUniformLocation(program, name);
120 sprintf(name, "lightsDiffuse[%d]", i);
121 uLightsDiffuse[i] = glGetUniformLocation(program, name);
123 sprintf(name, "lightsAmbient[%d]", i);
124 uLightsAmbient[i] = glGetUniformLocation(program, name);
126 sprintf(name, "lightsSpecular[%d]", i);
127 uLightsSpecular[i] = glGetUniformLocation(program, name);
129 sprintf(name, "lightsAtt[%d]", i);
130 uLightsAtt[i] = glGetUniformLocation(program, name);
132 sprintf(name, "lightsSpotDir[%d]", i);
133 uLightsSpotDir[i] = glGetUniformLocation(program, name);
135 sprintf(name, "lightsSpotCutOffCos[%d]", i);
136 uLightsSpotCutOffCos[i] = glGetUniformLocation(program, name);
138 sprintf(name, "lightsSpotExp[%d]", i);
139 uLightsSpotExp[i] = glGetUniformLocation(program, name);
142 uNearPlane = glGetUniformLocation(program, "nearPlane");
143 uNormalsMatrix = glGetUniformLocation(program, "normals_matrix");
144 uGlobalAmbient = glGetUniformLocation(program, "globalAmbient");
145 uMatAmbient = glGetUniformLocation(program, "matAmbient");
146 uMatEmissive = glGetUniformLocation(program, "matEmissive");
149 uMatSpecular = glGetUniformLocation(program, "matSpecular");
150 uMatPower = glGetUniformLocation(program, "matPower");
154 if((state.specularMapping || state.normalsMapping || state.texturing || state.reflectionMap || state.cubeMap) && state.textureMatrix)
155 uTextureMatrix = glGetUniformLocation(program, "texture_matrix");
156 if(state.texturing || state.cubeMap)
157 uDiffuseTex = glGetUniformLocation(program, "diffuseTex");
158 if(state.normalsMapping)
159 uBumpTex = glGetUniformLocation(program, "bumpTex");
160 if(state.specularMapping)
161 uSpecularTex = glGetUniformLocation(program, "specularTex");
162 if(state.environmentMapping)
164 uEnvTex = glGetUniformLocation(program, "envTex");
165 uCubeMapMatrix = glGetUniformLocation(program, "cubemap_matrix");
168 uRefractionETA = glGetUniformLocation(program, "matRefractionETA");
170 uMatReflectivity = glGetUniformLocation(program, "matReflectivity");
171 if(state.reflectionMap)
172 uReflectTex = glGetUniformLocation(program, "reflectTex");
177 uFogDensity = glGetUniformLocation(program, "fogDensity");
178 uFogColor = glGetUniformLocation(program, "fogColor");
184 public class DefaultShader : Shader
186 vertexShaderFile = "<:ecere>shaders/default.vert";
187 fragmentShaderFile = "<:ecere>shaders/default.frag";
191 float projection[16];
192 float matTexture[16];
193 float cubemap_matrix[16];
195 float normalsMatrix[16];
197 float globalAmbient[3];
200 float lDiffuse [8][4];
201 float lAmbient [8][3];
202 float lSpecular[8][3];
203 float lPosition[8][3];
206 float lSpotDir[8][3];
215 float refractionETA, reflectivity;
226 color[0] = 1, color[1] = 1, color[2] = 1, color[3] = 1;
227 diffuse[0] = 1, diffuse[1] = 1, diffuse[2] = 1, diffuse[3] = 1;
228 ambient[0] = 1, ambient[1] = 1, ambient[2] = 1;
230 // state = DefaultShaderBits { blinnSpecular = true };
233 void bindAttribs(int program)
235 #if ENABLE_GL_SHADERS
236 DefaultShaderBits state = this.state;
237 glBindAttribLocation(program, GLBufferContents::vertex, "vertex");
238 if(state.perVertexColor)
239 glBindAttribLocation(program, GLBufferContents::color, "color");
240 if(state.texturing || state.normalsMapping || state.specularMapping || state.reflectionMap)
241 glBindAttribLocation(program, GLBufferContents::texCoord, "texCoord");
243 glBindAttribLocation(program, GLBufferContents::normal, "normal");
244 if(state.normalsMapping)
246 glBindAttribLocation(program, GLBufferContents::tangent1, "tangent1");
247 glBindAttribLocation(program, GLBufferContents::tangent2, "tangent2");
252 CompiledDefaultShader registerShader(int program, uint64 state)
254 CompiledDefaultShader shader { };
255 shader.registerUniforms(program, state);
259 ZString getDefinitions(uint64 _state)
261 DefaultShaderBits state = _state;
262 ZString defs { allocType = heap, minSize = 5000 };
266 PrintLn("Compiling shader for state: ", state);
269 defs.concatf("#version 100\n");
270 defs.concatf("\n#define NUM_LIGHTS %d", 8);
271 defs.concatf("\n#define MODELVIEW %d", state.modelView ? 1 : 0);
272 defs.concatf("\n#define PER_VERTEX_COLOR %d", state.perVertexColor ? 1 : 0);
273 defs.concatf("\n#define LIGHTING_ON %d", state.lighting ? 1 : 0);
274 defs.concatf("\n#define NON_LOCAL_VIEWER %d", state.nonLocalViewer ? 1 : 0);
275 defs.concatf("\n#define MAT_TWOSIDED %d", state.twoSided ? 1 : 0);
276 defs.concatf("\n#define MAT_SPECULAR %d", state.specular ? 1 : 0);
277 defs.concatf("\n#define MAT_SEPARATE_SPECULAR %d", state.separateSpecular ? 1 : 0);
278 defs.concatf("\n#define SPECULAR_MAPPING %d", state.specularMapping ? 1 : 0);
279 defs.concatf("\n#define ENVIRONMENT_MAPPING %d", state.environmentMapping ? 1 : 0);
280 defs.concatf("\n#define ENVIRONMENT_REFLECTION %d", state.reflection ? 1 : 0);
281 defs.concatf("\n#define ENVIRONMENT_REFRACTION %d", state.refraction ? 1 : 0);
282 defs.concatf("\n#define REFLECTION_MAP %d", state.reflectionMap ? 1 : 0);
283 defs.concatf("\n#define NORMALS_MAPPING %d", state.normalsMapping ? 1 : 0);
284 defs.concatf("\n#define CUBEMAP_ON %d", state.cubeMap ? 1 : 0);
285 defs.concatf("\n#define LIGHTING_SPECULAR_BLINN %d", state.blinnSpecular ? 1 : 0);
286 defs.concatf("\n#define TEXTURE_ON %d", state.texturing ? 1 : 0);
287 defs.concatf("\n#define TEXTURE_MATRIX %d", state.textureMatrix ? 1 : 0);
288 defs.concatf("\n#define SWIZZLE_ALPHA %d", state.swizzle == alpha ? 1 : 0);
289 defs.concatf("\n#define SWIZZLE_RED %d", state.swizzle == red ? 1 : 0);
290 defs.concatf("\n#define FOG_ON %d\n", state.fog ? 1 : 0);
291 defs.concatf("\n#define DEBUGGING %d\n", state.debugging ? 1 : 0);
292 for(i = 0; i < 8; i++)
294 LightMode mode = (LightMode)((state.lightBits & (0x7 << (3*i))) >> (3*i));
295 defs.concatf("\n#define LIGHT%d_ON %d", i, mode ? 1 : 0);
296 defs.concatf("\n#define LIGHT%d_POSITIONAL %d", i, mode >= pos ? 1 : 0);
297 defs.concatf("\n#define LIGHT%d_SPOT %d", i, mode >= posSpot ? 1 : 0);
298 defs.concatf("\n#define LIGHT%d_ATT %d\n", i, mode == posAtt || mode == posSpotAtt ? 1 : 0);
300 defs.concatf("\n\n#line 0\n");
303 printf((String)defs._string);
308 void uploadUniforms(CompiledDefaultShader shader)
310 #if ENABLE_GL_SHADERS
311 DefaultShaderBits state = this.state;
318 Matrix * mv = &mvMatrix;
319 Matrix * prj = &prjMatrix;
321 mat.Multiply(mv, prj);
325 (float)mat.m[0][0], (float)mat.m[0][1], (float)mat.m[0][2], (float)mat.m[0][3],
326 (float)mat.m[1][0], (float)mat.m[1][1], (float)mat.m[1][2], (float)mat.m[1][3],
327 (float)mat.m[2][0], (float)mat.m[2][1], (float)mat.m[2][2], (float)mat.m[2][3],
328 (float)mat.m[3][0], (float)mat.m[3][1], (float)mat.m[3][2], (float)mat.m[3][3]
330 float mvz[4] = { (float)mv->m[0][2], (float)mv->m[1][2], (float)mv->m[2][2], (float)mv->m[3][2] };
331 glUniformMatrix4fv(shader.uPrjMatrix, 1, GL_FALSE, m);
333 glUniform3fv(uMVZ, 1, mvz);
338 glUniformMatrix4fv(shader.uPrjMatrix, 1, GL_FALSE, projection);
341 glUniformMatrix4fv(shader.uMVMatrix, 1, GL_FALSE, modelView);
347 for(i = 0; i < 8; i++)
349 LightMode mode = (LightMode)((state.lightBits & (0x7 << (3*i))) >> (3*i));
352 if(mode == posSpot || mode == posSpotAtt)
354 glUniform3fv(shader.uLightsSpotDir[i], 1, lSpotDir[i]);
355 glUniform1f(shader.uLightsSpotCutOffCos[i], lCutOffCos[i]);
356 glUniform1f(shader.uLightsSpotExp[i], lSpotExp[i]);
358 if(mode == posAtt || mode == posSpotAtt)
359 glUniform3fv(shader.uLightsAtt[i], 1, lAtt[i]);
361 glUniform3fv(shader.uLightsSpecular[i], 1, lSpecular[i]);
362 glUniform3fv(shader.uLightsPos[i], 1, lPosition[i]);
363 glUniform3fv(shader.uLightsDiffuse[i], 1, lDiffuse[i]);
364 glUniform3fv(shader.uLightsAmbient[i], 1, lAmbient[i]);
369 glUniform4fv(shader.uMatDiffuse, 1, diffuse);
370 glUniform3fv(shader.uMatAmbient, 1, ambient);
371 glUniform3fv(shader.uMatEmissive, 1, emissive);
374 glUniform3fv(shader.uMatSpecular, 1, specular);
375 glUniform1f(shader.uMatPower, state.blinnSpecular ? power : power / 4.0f);
378 glUniform1f(shader.uNearPlane, nearPlane);
379 glUniform3fv(shader.uGlobalAmbient, 1, globalAmbient);
381 glUniformMatrix4fv(shader.uNormalsMatrix, 1, GL_FALSE, normalsMatrix);
383 if(state.normalsMapping)
384 glUniform1i(shader.uBumpTex, 1);
386 if(state.specularMapping)
387 glUniform1i(shader.uSpecularTex, 2);
390 glUniform4fv(shader.uMatDiffuse, 1, color);
392 if(state.environmentMapping)
394 glUniform1i(shader.uEnvTex, 3);
395 glUniformMatrix4fv(shader.uCubeMapMatrix, 1, GL_FALSE, cubemap_matrix);
397 glUniform1f(shader.uMatReflectivity, reflectivity);
399 glUniform1f(shader.uRefractionETA, refractionETA);
400 if(state.reflectionMap)
401 glUniform1i(shader.uReflectTex, 4);
404 if(state.texturing || state.cubeMap)
405 glUniform1i(shader.uDiffuseTex, 0);
406 if((state.texturing || state.normalsMapping || state.specularMapping || state.reflectionMap || state.cubeMap) && state.textureMatrix)
407 glUniformMatrix4fv(shader.uTextureMatrix, 1, GL_FALSE, matTexture);
411 glUniform1f(shader.uFogDensity, fogDensity);
412 glUniform3fv(shader.uFogColor, 1, fogColor);
417 void setCamera(Camera camera)
419 double * c = camera.inverseTranspose.array;
422 (float) c[0], (float) c[1], (float)-c[2], 0,
423 (float)-c[4], (float) c[5], (float) c[6], 0,
424 (float)-c[8], (float) c[9], (float) c[10], 0,
427 memcpy(cubemap_matrix, m, 16 * sizeof(float));
428 uniformsModified = true;
431 void updateMatrix(MatrixMode mode, Matrix matrix, bool isIdentity)
435 (float)matrix.m[0][0], (float)matrix.m[0][1], (float)matrix.m[0][2], (float)matrix.m[0][3],
436 (float)matrix.m[1][0], (float)matrix.m[1][1], (float)matrix.m[1][2], (float)matrix.m[1][3],
437 (float)matrix.m[2][0], (float)matrix.m[2][1], (float)matrix.m[2][2], (float)matrix.m[2][3],
438 (float)matrix.m[3][0], (float)matrix.m[3][1], (float)matrix.m[3][2], (float)matrix.m[3][3]
440 if(mode == projection)
442 memcpy(projection, m, 16 * sizeof(float));
443 nearPlane = (float)::nearPlane;
444 uniformsModified = true;
446 else if(mode == modelView)
449 double * i = inv.array;
451 memcpy(modelView, m, 16 * sizeof(float));
452 ((DefaultShaderBits)state).modelView = !isIdentity;
455 //prjViewModified = true;
464 (float)i[0],(float)i[1],(float)i[2],(float)i[3],
465 (float)i[4],(float)i[5],(float)i[6],(float)i[7],
466 (float)i[8],(float)i[9],(float)i[10],(float)i[11],
467 (float)i[12],(float)i[13],(float)i[14],(float)i[15]
469 memcpy(normalsMatrix, m, 16 * sizeof(float));
472 uniformsModified = true;
474 else if(mode == texture)
476 memcpy(matTexture, m, 16 * sizeof(float));
477 ((DefaultShaderBits)state).textureMatrix = !isIdentity;
478 if(((DefaultShaderBits)state).texturing || ((DefaultShaderBits)state).normalsMapping || ((DefaultShaderBits)state).specularMapping ||
479 ((DefaultShaderBits)state).reflectionMap || ((DefaultShaderBits)state).cubeMap)
480 uniformsModified = true;
484 void setGlobalAmbient(float r, float g, float b, float a)
486 globalAmbient[0] = r, globalAmbient[1] = g, globalAmbient[2] = b;
487 if(((DefaultShaderBits)state).lighting)
488 uniformsModified = true;
491 void setColor(float r, float g, float b, float a)
493 color[0] = r, color[1] = g, color[2] = b, color[3] = a;
494 uniformsModified = true;
497 void lighting(bool on)
499 if(((DefaultShaderBits)state).lighting != on)
501 ((DefaultShaderBits)state).lighting = on;
502 uniformsModified = true;
504 state &= ~DefaultShaderBits
506 nonLocalViewer = true;
509 separateSpecular = true;
510 blinnSpecular = true;
511 lightBits = 0xFFFFFF;
514 state |= DefaultShaderBits { separateSpecular = true };
523 ((DefaultShaderBits)state).fog = fogOn && fogDensity;
524 uniformsModified = true;
528 void setFogDensity(float density)
530 if(fogDensity != density)
532 fogDensity = density;
533 ((DefaultShaderBits)state).fog = fogOn && fogDensity;
535 uniformsModified = true;
539 void setFogColor(float r, float g, float b)
541 fogColor[0] = r, fogColor[1] = g, fogColor[2] = b;
543 uniformsModified = true;
546 void texturing(bool on)
548 if(((DefaultShaderBits)state).texturing != on)
550 ((DefaultShaderBits)state).texturing = on;
552 state &= ~DefaultShaderBits { swizzle = (SwizzleMode)0x3 };
553 if(!on && !((DefaultShaderBits)state).normalsMapping && !((DefaultShaderBits)state).specularMapping && !((DefaultShaderBits)state).reflectionMap && !((DefaultShaderBits)state).cubeMap)
554 state &= ~DefaultShaderBits { textureMatrix = true };
555 uniformsModified = true;
559 void debugging(bool on)
561 if(((DefaultShaderBits)state).debugging != on)
563 ((DefaultShaderBits)state).debugging = on;
564 uniformsModified = true;
568 void swizzle(SwizzleMode swizzle)
571 if(swizzle && !((DefaultShaderBits)state).texturing && !((DefaultShaderBits)state).cubeMap)
572 printf("swizzle() with texturing off\n");
574 if(((DefaultShaderBits)state).swizzle != swizzle)
576 ((DefaultShaderBits)state).swizzle = swizzle;
577 if(((DefaultShaderBits)state).texturing || ((DefaultShaderBits)state).cubeMap)
578 uniformsModified = true;
582 void setSimpleMaterial(ColorAlpha color, bool twoSided)
584 float r = color.color.r / 255.0f;
585 float g = color.color.g / 255.0f;
586 float b = color.color.b / 255.0f;
588 if(!((DefaultShaderBits)state).lighting)
589 printf("setSimpleMaterial() with lighting off\n");
591 diffuse[0] = r, diffuse[1] = g, diffuse[2] = b, diffuse[3] = color.a / 255.0f;
592 ambient[0] = r, ambient[1] = g, ambient[2] = b;
593 emissive[0] = 0, emissive[1] = 0, emissive[2] = 0;
594 ((DefaultShaderBits)state).perVertexColor = false;
595 ((DefaultShaderBits)state).normalsMapping = false;
596 ((DefaultShaderBits)state).environmentMapping = false;
597 ((DefaultShaderBits)state).reflectionMap = false;
598 ((DefaultShaderBits)state).specularMapping = false;
599 ((DefaultShaderBits)state).reflection = false;
600 ((DefaultShaderBits)state).refraction = false;
601 ((DefaultShaderBits)state).texturing = false;
602 ((DefaultShaderBits)state).cubeMap = false;
603 ((DefaultShaderBits)state).specular = false;
604 ((DefaultShaderBits)state).twoSided = twoSided;
605 uniformsModified = true;
608 void setPerVertexColor(bool perVertexColor)
610 if(((DefaultShaderBits)state).perVertexColor != perVertexColor)
612 ((DefaultShaderBits)state).perVertexColor = perVertexColor;
613 uniformsModified = true;
617 #if !defined(ECERE_NO3D)
618 void setMaterial(Material material, MeshFeatures flags)
620 #if ENABLE_GL_SHADERS
623 ((DefaultShaderBits)state).specular = material.power && (material.specular.r || material.specular.g || material.specular.b);
624 ((DefaultShaderBits)state).perVertexColor = flags.colors;
625 ((DefaultShaderBits)state).separateSpecular = ((DefaultShaderBits)state).specular && material.flags.separateSpecular;
626 ((DefaultShaderBits)state).cubeMap = material && material.flags.cubeMap && material.baseMap;
627 ((DefaultShaderBits)state).twoSided = material.flags.doubleSided && !material.flags.singleSideLight;
628 ((DefaultShaderBits)state).lightBits = material.flags.noLighting ? 0 : lightBits;
629 ((DefaultShaderBits)state).lighting = (!material.flags.noLighting && lightBits) ? true : false;
630 diffuse[0] = material.diffuse.r, diffuse[1] = material.diffuse.g, diffuse[2] = material.diffuse.b, diffuse[3] = material.opacity;
631 ambient[0] = material.ambient.r, ambient[1] = material.ambient.g, ambient[2] = material.ambient.b;
632 specular[0] = material.specular.r, specular[1] = material.specular.g, specular[2] = material.specular.b;
633 emissive[0] = material.emissive.r, emissive[1] = material.emissive.g, emissive[2] = material.emissive.b;
634 power = material.power;
638 ((DefaultShaderBits)state).cubeMap = false;
639 ((DefaultShaderBits)state).perVertexColor = false;
640 ((DefaultShaderBits)state).separateSpecular = false;
641 ((DefaultShaderBits)state).twoSided = false;
642 ((DefaultShaderBits)state).textureMatrix = false;
645 if(material && material.bumpMap && flags.tangents)
647 glActiveTexture(GL_TEXTURE1);
648 glBindTexture(GL_TEXTURE_2D, (GLuint)(uintptr)material.bumpMap.driverData);
649 if(material.flags.tile)
651 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
652 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
656 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
657 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
660 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, material.bumpMap.mipMaps ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
661 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
662 glActiveTexture(GL_TEXTURE0);
663 ((DefaultShaderBits)state).normalsMapping = true;
666 ((DefaultShaderBits)state).normalsMapping = false;
668 if(material && material.envMap && (material.refractiveIndex || material.refractiveIndexContainer || material.reflectivity || material.reflectMap))
670 CubeMap cube = material.envMap;
671 glActiveTexture(GL_TEXTURE3);
672 glBindTexture(GL_TEXTURE_CUBE_MAP, (GLuint)(uintptr)cube.driverData);
673 glActiveTexture(GL_TEXTURE0);
674 ((DefaultShaderBits)state).environmentMapping = true;
676 if(material.refractiveIndex || material.refractiveIndexContainer)
679 (material.refractiveIndexContainer ? material.refractiveIndexContainer : 1.0) /
680 (material.refractiveIndex ? material.refractiveIndex : 1.0);
682 ((DefaultShaderBits)state).refraction = true;
685 if(material.reflectivity || material.reflectMap)
687 reflectivity = material.reflectivity;
688 if(!reflectivity && material.reflectMap) reflectivity = 1.0;
690 if(material.reflectMap)
692 glActiveTexture(GL_TEXTURE4);
693 glBindTexture(GL_TEXTURE_2D, (GLuint)(uintptr)material.reflectMap.driverData);
694 if(material.flags.tile)
696 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
697 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
701 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
702 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
705 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, material.reflectMap.mipMaps ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
706 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
707 glActiveTexture(GL_TEXTURE0);
709 ((DefaultShaderBits)state).reflectionMap = true;
712 ((DefaultShaderBits)state).reflectionMap = false;
713 ((DefaultShaderBits)state).reflection = true;
718 ((DefaultShaderBits)state).environmentMapping = false;
719 ((DefaultShaderBits)state).refraction = false;
720 ((DefaultShaderBits)state).reflection = false;
721 ((DefaultShaderBits)state).reflectionMap = false;
724 if(material && material.specularMap)
726 glActiveTexture(GL_TEXTURE2);
727 glBindTexture(GL_TEXTURE_2D, (GLuint)(uintptr)material.specularMap.driverData);
728 if(material.flags.tile)
730 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
731 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
735 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
736 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
739 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, material.specularMap.mipMaps ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
740 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
741 glActiveTexture(GL_TEXTURE0);
742 ((DefaultShaderBits)state).specularMapping = true;
745 ((DefaultShaderBits)state).specularMapping = false;
747 uniformsModified = true;
751 void setLight(Display display, uint id, Light light)
754 bool lightOn = light && !light.flags.off;
755 LightMode mode = (LightMode)((((DefaultShaderBits)state).lightBits & (0x7 << lShift)) >> lShift);
757 if(lightOn && !((DefaultShaderBits)state).lighting)
758 ((DefaultShaderBits)state).lighting = true;
760 if(lightOn || (lightOn != (mode != off)))
761 uniformsModified = true;
765 Object lightObject = light.lightObject;
766 float multiplier = light.multiplier;
767 Matrix m = matrixStack[0][matrixIndex[0]];
769 m.Scale(::nearPlane, ::nearPlane, ::nearPlane);
771 if(!multiplier) multiplier = 1.0f;
773 lDiffuse[id][0] = light.diffuse.r * multiplier;
774 lDiffuse[id][1] = light.diffuse.g * multiplier;
775 lDiffuse[id][2] = light.diffuse.b * multiplier;
777 lAmbient[id][0] = light.ambient.r * multiplier;
778 lAmbient[id][1] = light.ambient.g * multiplier;
779 lAmbient[id][2] = light.ambient.b * multiplier;
781 lSpecular[id][0] = light.specular.r * multiplier;
782 lSpecular[id][1] = light.specular.g * multiplier;
783 lSpecular[id][2] = light.specular.b * multiplier;
787 // Positional Lights (Including Spot Lights and Omni with flags.spot not set)
788 Matrix * mat = &lightObject.matrix;
789 Vector3D positionVector { mat->m[3][0], mat->m[3][1], mat->m[3][2] };
790 if(display.display3D.camera)
791 positionVector.Subtract(positionVector, display.display3D.camera.cPosition);
793 l.MultMatrix(positionVector, m);
794 lPosition[id][0] = (float)l.x, lPosition[id][1] = (float)-l.y, lPosition[id][2] = (float)l.z;
796 // Display Light Position
798 GLSetupLighting(false);
799 glDisable(GL_DEPTH_TEST);
801 light.diffuse.r * multiplier,
802 light.diffuse.g * multiplier,
803 light.diffuse.b * multiplier);
806 GLVertex3dv((double *)&positionVector);
808 glEnable(GL_DEPTH_TEST);
809 GLSetupLighting(true);
816 Vector3D positionVector;
817 if(lightObject.flags.root || !lightObject.parent)
819 positionVector = light.target.transform.position;
820 positionVector.Subtract(positionVector, display.camera.cPosition);
824 positionVector.MultMatrix(light.target.transform.position,
825 lightObject.light.target.parent.matrix);
826 positionVector.Subtract(positionVector, display.camera.cPosition);
828 GLSetupLighting(false);
829 glDisable(GL_DEPTH_TEST);
833 GLVertex3dv((double *)&positionVector);
835 glEnable(GL_DEPTH_TEST);
836 GLSetupLighting(false);
840 if(light.flags.attenuation)
842 lAtt[id][0] = light.Kc;
843 lAtt[id][1] = light.Kl;
844 lAtt[id][2] = light.Kq;
847 if((light.flags.spot && light.fallOff < 360) || (lightObject && (light.direction.x || light.direction.y || light.direction.z)))
850 // Figure out exponent out of the hot spot
851 float exponent = light.flags.spot ? (float)(log(MAXLIGHT) / log(cos(light.hotSpot / 2))) : 1;
852 Degrees cutOff = light.flags.spot ? light.fallOff/2 : 90;
854 l.MultMatrix(light.direction, m);
858 lSpotDir[id][0] = (float)n.x, lSpotDir[id][1] = (float)-n.y, lSpotDir[id][2] = (float)n.z;
859 lCutOffCos[id] = (float)cos(Degrees { cutOff });
860 lSpotExp[id] = exponent;
862 mode = light.flags.attenuation ? posSpotAtt : posSpot;
865 mode = light.flags.attenuation ? posAtt : pos;
870 Vector3D vector { 0,0,-1 };
871 Vector3D direction, v;
873 mat.RotationQuaternion(light.orientation);
874 direction.MultMatrix(vector, mat);
875 v.Normalize(direction);
878 lPosition[id][0] = (float)l.x, lPosition[id][1] = (float)-l.y, lPosition[id][2] = (float)l.z;
884 lightBits = (lightBits & ~(0x7 << lShift)) | (mode << lShift);
885 ((DefaultShaderBits)state).lightBits = lightBits;
889 DefaultShader ::shader() { return defaultShader; }
892 DefaultShader defaultShader { };