[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    playground/games/astrododge/src
From:       Rivo Laks <rivolaks () hot ! ee>
Date:       2009-07-24 19:32:06
Message-ID: 1248463926.066160.23091.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1002016 by rivol:

Precompile shaders before the game starts to avoid possible delays.

 M  +14 -0     gameview.cpp  
 M  +25 -1     loadingview.cpp  
 M  +1 -0      loadingview.h  
 M  +15 -0     shadermanager.cpp  
 M  +2 -0      shadermanager.h  


--- trunk/playground/games/astrododge/src/gameview.cpp #1002015:1002016
@@ -138,6 +138,20 @@
     mShaderManager->setLightDirection(lightDir);
     renderObjects(mWorld->objects());
 
+    mShaderManager->setLight("spot");
+    mShaderManager->setLightColor(Vector3f(0.8, 0.8, 1.2));
+    renderObjects(mWorld->objects());
+
+    foreach (Bullet* obj, *mWorld->bullets()) {
+        mShaderManager->setLight("point");
+        mShaderManager->setLightColor(Vector3f(2.0, 1.6, 0.8));
+        mShaderManager->setLightRadius(200);
+        Vector3f lightPos = (camera()->modelviewMatrix() * obj->position());
+        //     kDebug() << "Light pos:" << lightPos.x() << lightPos.y() << \
lightPos.z() << lightPos.w(); +        \
mShaderManager->setLightPosition(lightPos.start<3>()); +        \
renderObjects(mWorld->objects()); +    }
+
     // Restore states
     glDepthMask(GL_TRUE);
     glDepthFunc(GL_LESS);
--- trunk/playground/games/astrododge/src/loadingview.cpp #1002015:1002016
@@ -23,6 +23,7 @@
 #include "planet.h"
 #include "model.h"
 #include "datastore.h"
+#include "shadermanager.h"
 
 #include <kgllib/textrenderer.h>
 #include <kgllib/geometrybuffer.h>
@@ -55,7 +56,8 @@
     mStateInfos[Load_ObjectModelInfos]      = LoadingStateInfo( 45, "Loading object \
                models");
     mStateInfos[Load_FinalizeModels]        = LoadingStateInfo( 50, "Finalizing \
                models");
     mStateInfos[Load_AssignObjectModels]    = LoadingStateInfo( 55, "Creating \
                objects");
-    mStateInfos[Load_AssignAsteroidModels]  = LoadingStateInfo( 98, "Creating \
asteroids"); +    mStateInfos[Load_AssignAsteroidModels]  = LoadingStateInfo( 95, \
"Creating asteroids"); +    mStateInfos[Load_PrecompileShaders]     = \
                LoadingStateInfo( 98, "Compiling shaders");
     mStateInfos[Load_Done]                  = LoadingStateInfo(100, "Starting \
game");  }
 
@@ -202,6 +204,28 @@
         i++;
     }
 
+    updateProgress(Load_PrecompileShaders);
+    QStringList lightTypes;
+    QSet<QString> materials;
+    lightTypes << "directional" << "spot" << "point";
+    materials << "asteroid";
+    foreach (const QString& modelName, mModel2Objects.keys()) {
+        materials << mWorld->data()->model(modelName)->material();
+    }
+
+    foreach (const QString& material, materials) {
+        // For "light" renderMode, use all light types
+        foreach (const QString& light, lightTypes) {
+            if (!mWorld->data()->shaderManager()->precompileProgram("light", light, \
material)) { +                return false;
+            }
+        }
+        // For "ambient" mode, just use "directional"
+        if (!mWorld->data()->shaderManager()->precompileProgram("ambient", \
"directional", material)) { +            return false;
+        }
+    }
+
     updateProgress(Load_Done);
     return true;
 }
--- trunk/playground/games/astrododge/src/loadingview.h #1002015:1002016
@@ -79,6 +79,7 @@
             Load_FinalizeModels,
             Load_AssignObjectModels,
             Load_AssignAsteroidModels,
+            Load_PrecompileShaders,
             Load_Done
         };
         struct LoadingStateInfo
--- trunk/playground/games/astrododge/src/shadermanager.cpp #1002015:1002016
@@ -68,6 +68,21 @@
     return prog;
 }
 
+bool ShaderManager::precompileProgram(const QString& renderMode, const QString& \
lightType, const QString& material) +{
+    ShaderInfo info;
+    info.renderMode = renderMode;
+    info.lightType = lightType;
+    info.materialType = material;
+
+    Program* prog = compileProgram(info);
+    if (!prog) {
+        return false;
+    }
+    mPrograms.insert(info, prog);
+    return true;
+}
+
 void ShaderManager::disableShader()
 {
     if (mActiveProgram) {
--- trunk/playground/games/astrododge/src/shadermanager.h #1002015:1002016
@@ -37,6 +37,8 @@
         KGLLib::Program* activateShader();
         void disableShader();
 
+        bool precompileProgram(const QString& renderMode, const QString& lightType, \
const QString& material); +
         void setNoLight();
         void setLight(const QString& type);
         void setLightColor(const Eigen::Vector3f& color);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic