diff gldragon.cpp @ 25:2403030a0352

"Finish" implementing multiple lights support in scene files. If scene defines no lights, a default light will be used. Light objects will have default values and can redefine only color, position etc.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 22 Nov 2019 06:47:13 +0200
parents c1897cfc8463
children 67647ed860f0
line wrap: on
line diff
--- a/gldragon.cpp	Fri Nov 22 05:49:14 2019 +0200
+++ b/gldragon.cpp	Fri Nov 22 06:47:13 2019 +0200
@@ -185,7 +185,7 @@
 
     // Add transforms
     glScalef(model.scale.x, model.scale.y, model.scale.z);
-    glTranslatef(model.translate.x, model.translate.y, model.translate. z);
+    glTranslatef(model.translate.x, model.translate.y, model.translate.z);
     glRotatef(model.rotate.x, 1.0f, 0.0f, 0.0f);
     glRotatef(model.rotate.y, 0.0f, 1.0f, 0.0f);
     glRotatef(model.rotate.z, 0.0f, 0.0f, 1.0f);
@@ -286,6 +286,16 @@
 }
 
 
+void dmSetupLight(const int n, const DMLight &light)
+{
+    glEnable(GL_LIGHT0 + n);
+    glLightfv(GL_LIGHT0 + n, GL_AMBIENT, light.ambient.values);
+    glLightfv(GL_LIGHT0 + n, GL_DIFFUSE, light.diffuse.values);
+    glLightfv(GL_LIGHT0 + n, GL_SPECULAR, light.specular.values);
+    glLightfv(GL_LIGHT0 + n, GL_POSITION, light.position.values);
+}
+
+
 int main(int argc, char *argv[])
 {
     int startTime, cycleStart, cycleFrames = 0, totalFrames = 0;
@@ -438,29 +448,25 @@
             dmLinkModelShaders(model);
         }
     }
-    else
+
     {
         float specReflection[] = { 0.8f, 0.8f, 0.8f, 1.0f };
-
         glEnable(GL_COLOR_MATERIAL);
-
         glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
         glMateriali(GL_FRONT, GL_SHININESS, 96);
         glMaterialfv(GL_FRONT, GL_SPECULAR, specReflection);
-
-        glEnable(GL_LIGHT0);
+    }
 
-        // Define the light components and position
-        GLfloat ambient[]  = {   0.2f,  0.2f,  0.2f,  1.0f };
-        GLfloat diffuse[]  = {   0.8f,  0.8f,  0.8f,  1.0f };
-        GLfloat specular[] = {   0.5f,  0.5f,  0.5f,  1.0f };
-        GLfloat position[] = {  10.0f, 10.0f,  0.0f,  0.0f };
-
-        // Define the light components and position
-        glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
-        glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
-        glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
-        glLightfv(GL_LIGHT0, GL_POSITION, position);
+    // Define lights
+    if (scene.lights.size() == 0)
+    {
+        DMLight light; // Default light
+        dmSetupLight(0, light);
+    }
+    else
+    {
+        for (size_t n = 0; n < scene.lights.size(); n++)
+            dmSetupLight(n, scene.lights[n]);
     }
 
     // Define the camera