Pārlūkot izejas kodu

+ Added support for constant shader values
~ Fixed shader parameter setting that wasn't properly loading the values for the shader to use

Signed-off-by: Alexis Maiquez Murcia <almamu@almamu.com>

Alexis Maiquez Murcia 7 gadi atpakaļ
vecāks
revīzija
6abd73e843
4 mainītis faili ar 37 papildinājumiem un 21 dzēšanām
  1. 1 1
      CMakeLists.txt
  2. 2 0
      main.cpp
  3. 33 20
      wallpaperengine/effect.cpp
  4. 1 0
      wallpaperengine/fs/utils.cpp

+ 1 - 1
CMakeLists.txt

@@ -15,6 +15,6 @@ find_package(LZ4 REQUIRED)
 
 include_directories(${X11_INCLUDE_DIR} ${IRRLICHT_INCLUDE_DIR} ${LZ4_INCLUDE_DIR} .)
 
-add_executable(wallengine main.cpp wallpaperengine/shaders/compiler.h wallpaperengine/shaders/compiler.cpp wallpaperengine/project.cpp wallpaperengine/project.h wallpaperengine/scene.cpp wallpaperengine/scene.h wallpaperengine/object.cpp wallpaperengine/object.h wallpaperengine/camera.cpp wallpaperengine/camera.h wallpaperengine/core.cpp wallpaperengine/core.h wallpaperengine/image.cpp wallpaperengine/image.h wallpaperengine/object3d.cpp wallpaperengine/object3d.h wallpaperengine/effect.cpp wallpaperengine/effect.h wallpaperengine/fs/utils.cpp wallpaperengine/fs/utils.h wallpaperengine/irrlicht.cpp wallpaperengine/irrlicht.h wallpaperengine/video/renderer.cpp wallpaperengine/video/renderer.h wallpaperengine/video/node.cpp wallpaperengine/video/node.h wallpaperengine/video/material.cpp wallpaperengine/video/material.h wallpaperengine/texture.cpp wallpaperengine/texture.h wallpaperengine/irr/CImageLoaderTEX.h wallpaperengine/irr/CImageLoaderTEX.cpp wallpaperengine/irr/CPkgReader.h wallpaperengine/irr/CPkgReader.cpp wallpaperengine/irr/CFileList.h wallpaperengine/irr/CFileList.cpp wallpaperengine/irr/vector4d.h)
+add_executable(wallengine main.cpp wallpaperengine/shaders/compiler.h wallpaperengine/shaders/compiler.cpp wallpaperengine/project.cpp wallpaperengine/project.h wallpaperengine/scene.cpp wallpaperengine/scene.h wallpaperengine/object.cpp wallpaperengine/object.h wallpaperengine/camera.cpp wallpaperengine/camera.h wallpaperengine/core.cpp wallpaperengine/core.h wallpaperengine/image.cpp wallpaperengine/image.h wallpaperengine/object3d.cpp wallpaperengine/object3d.h wallpaperengine/effect.cpp wallpaperengine/effect.h wallpaperengine/fs/utils.cpp wallpaperengine/fs/utils.h wallpaperengine/irrlicht.cpp wallpaperengine/irrlicht.h wallpaperengine/video/renderer.cpp wallpaperengine/video/renderer.h wallpaperengine/video/node.cpp wallpaperengine/video/node.h wallpaperengine/video/material.cpp wallpaperengine/video/material.h wallpaperengine/texture.cpp wallpaperengine/texture.h wallpaperengine/irr/CImageLoaderTEX.h wallpaperengine/irr/CImageLoaderTEX.cpp wallpaperengine/irr/CPkgReader.h wallpaperengine/irr/CPkgReader.cpp wallpaperengine/irr/CFileList.h wallpaperengine/irr/CFileList.cpp)
 
 target_link_libraries(wallengine ${X11_LIBRARIES} ${X11_Xxf86vm_LIB} ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} ${ZLIB_LIBRARIES} ${IRRLICHT_LIBRARY} ${LZ4_LIBRARY})

+ 2 - 0
main.cpp

@@ -200,5 +200,7 @@ int main (int argc, char* argv[])
         }
     }
 
+    delete wp_project;
+
     return 0;
 }

+ 33 - 20
wallpaperengine/effect.cpp

@@ -116,12 +116,18 @@ namespace wp
         {
             wp::shaders::compiler::ShaderParameter* param = (*cur);
             ShaderParameter* parameter = new ShaderParameter;
+            void* defaultValue = param->defaultValue;
+
+            std::map<std::string,void*>::const_iterator constant = this->m_constants.find (param->identifierName);
+
+            if (constant != this->m_constants.end ())
+                defaultValue = (*constant).second;
 
             parameter->value = nullptr;
 
             if (param->type == "vec4")
             {
-                irr::core::vector3df* vec = (irr::core::vector3df*) param->defaultValue;
+                irr::core::vector3df* vec = (irr::core::vector3df*) defaultValue;
                 irr::f32* val = new irr::f32 [4];
 
                 val [0] = vec->X;
@@ -134,7 +140,7 @@ namespace wp
             }
             else if (param->type == "vec3")
             {
-                irr::core::vector3df* vec = (irr::core::vector3df*) param->defaultValue;
+                irr::core::vector3df* vec = (irr::core::vector3df*) defaultValue;
                 irr::f32* val = new irr::f32 [3];
 
                 val [0] = vec->X;
@@ -146,7 +152,7 @@ namespace wp
             }
             else if (param->type == "vec2")
             {
-                irr::core::vector2df* vec = (irr::core::vector2df*) param->defaultValue;
+                irr::core::vector2df* vec = (irr::core::vector2df*) defaultValue;
                 irr::f32* val = new irr::f32 [2];
 
                 val [0] = vec->X;
@@ -157,7 +163,7 @@ namespace wp
             }
             else if (param->type == "float")
             {
-                irr::f32* org = (irr::f32*) param->defaultValue;
+                irr::f32* org = (irr::f32*) defaultValue;
                 irr::f32* val = new irr::f32;
 
                 *val = *org;
@@ -167,7 +173,7 @@ namespace wp
             }
             else if (param->type == "int")
             {
-                irr::s32* org = (irr::s32*) param->defaultValue;
+                irr::s32* org = (irr::s32*) defaultValue;
                 irr::s32* val = new irr::s32;
 
                 *val = *org;
@@ -196,13 +202,20 @@ namespace wp
             if (param == nullptr)
                 continue;
 
+            void* defaultValue = param->defaultValue;
+
+            std::map<std::string,void*>::const_iterator constant = this->m_constants.find (param->identifierName);
+
+            if (constant != this->m_constants.end ())
+                defaultValue = (*constant).second;
+
             ShaderParameter* parameter = new ShaderParameter;
 
             parameter->value = nullptr;
 
             if (param->type == "vec4")
             {
-                irr::core::vector3df* vec = (irr::core::vector3df*) param->defaultValue;
+                irr::core::vector3df* vec = (irr::core::vector3df*) defaultValue;
 
                 parameter->value = new irr::f32 [4];
 
@@ -215,7 +228,7 @@ namespace wp
             }
             else if (param->type == "vec3")
             {
-                irr::core::vector3df* vec = (irr::core::vector3df*) param->defaultValue;
+                irr::core::vector3df* vec = (irr::core::vector3df*) defaultValue;
 
                 parameter->value = new irr::f32 [3];
 
@@ -227,7 +240,7 @@ namespace wp
             }
             else if (param->type == "vec2")
             {
-                irr::core::vector2df* vec = (irr::core::vector2df*) param->defaultValue;
+                irr::core::vector2df* vec = (irr::core::vector2df*) defaultValue;
 
                 parameter->value = new irr::f32 [2];
 
@@ -239,14 +252,14 @@ namespace wp
             else if (param->type == "float")
             {
                 parameter->value = new irr::f32;
-                *(irr::f32*) parameter->value = *(irr::f32*) param->defaultValue;
+                *(irr::f32*) parameter->value = *(irr::f32*) defaultValue;
 
                 parameter->type = ParameterType::TYPE_FLOAT;
             }
             else if (param->type == "int")
             {
                 parameter->value = new irr::s32;
-                *(irr::s32*) parameter->value = *(irr::s32*) param->defaultValue;
+                *(irr::s32*) parameter->value = *(irr::s32*) defaultValue;
 
                 parameter->type = ParameterType::TYPE_INT;
             }
@@ -413,19 +426,19 @@ namespace wp
             switch ((*vertcur).second->type)
             {
                 case ParameterType::TYPE_FLOAT:
-                    services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::f32*) (*vertcur).second, 1);
+                    services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::f32*) (*vertcur).second->value, 1);
                     break;
                 case ParameterType::TYPE_VEC2:
-                    services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::f32*) (*vertcur).second, 2);
+                    services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::f32*) (*vertcur).second->value, 2);
                     break;
                 case ParameterType::TYPE_VEC3:
-                    services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::f32*) (*vertcur).second, 3);
+                    services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::f32*) (*vertcur).second->value, 3);
                     break;
                 case ParameterType::TYPE_VEC4:
-                    services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::f32*) (*vertcur).second, 4);
+                    services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::f32*) (*vertcur).second->value, 4);
                     break;
                 case ParameterType::TYPE_INT:
-                    services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::s32*) (*vertcur).second, 1);
+                    services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::s32*) (*vertcur).second->value, 1);
                     break;
 
             }
@@ -439,19 +452,19 @@ namespace wp
             switch ((*pixelcur).second->type)
             {
                 case ParameterType::TYPE_FLOAT:
-                    services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::f32*) (*pixelcur).second, 1);
+                    services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::f32*) (*pixelcur).second->value, 1);
                     break;
                 case ParameterType::TYPE_VEC2:
-                    services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::f32*) (*pixelcur).second, 2);
+                    services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::f32*) (*pixelcur).second->value, 2);
                     break;
                 case ParameterType::TYPE_VEC3:
-                    services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::f32*) (*pixelcur).second, 3);
+                    services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::f32*) (*pixelcur).second->value, 3);
                     break;
                 case ParameterType::TYPE_VEC4:
-                    services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::f32*) (*pixelcur).second, 4);
+                    services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::f32*) (*pixelcur).second->value, 4);
                     break;
                 case ParameterType::TYPE_INT:
-                    services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::s32*) (*pixelcur).second, 1);
+                    services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::s32*) (*pixelcur).second->value, 1);
                     break;
 
             }

+ 1 - 0
wallpaperengine/fs/utils.cpp

@@ -22,6 +22,7 @@ namespace wp
             memset (filedata, 0, reader->getSize () + 1);
 
             reader->read (filedata, reader->getSize ());
+            reader->drop ();
 
             std::string content = filedata;
             delete [] filedata;