]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/shader.cpp
Revert "Fix settings to honor numeric conversion errors"
[dragonfireclient.git] / src / shader.cpp
index 9cef7f353d321a22cc08fe592ab643324afd4fca..d29c9d3a707e9166bd2a2a0ee26b471b2ddb254e 100644 (file)
@@ -362,7 +362,7 @@ ShaderInfo generate_shader(std::string name, IrrlichtDevice *device,
        Load shader programs
 */
 void load_shaders(std::string name, SourceShaderCache *sourcecache,
-               video::E_DRIVER_TYPE drivertype, s32 enable_shaders,
+               video::E_DRIVER_TYPE drivertype, bool enable_shaders,
                std::string &vertex_program, std::string &pixel_program,
                std::string &geometry_program, bool &is_highlevel);
 
@@ -373,8 +373,6 @@ ShaderSource::ShaderSource(IrrlichtDevice *device):
 
        m_shader_callback = new ShaderCallback(this, "default");
 
-       m_shaderinfo_cache_mutex.Init();
-
        m_main_thread = get_current_thread_id();
 
        // Add a dummy ShaderInfo as the first index, named ""
@@ -417,31 +415,30 @@ u32 ShaderSource::getShaderId(const std::string &name)
        if(get_current_thread_id() == m_main_thread){
                return getShaderIdDirect(name);
        } else {
-               infostream<<"getShaderId(): Queued: name=\""<<name<<"\""<<std::endl;
+               /*errorstream<<"getShaderId(): Queued: name=\""<<name<<"\""<<std::endl;*/
 
                // We're gonna ask the result to be put into here
-               ResultQueue<std::string, u32, u8, u8> result_queue;
+
+               static ResultQueue<std::string, u32, u8, u8> result_queue;
 
                // Throw a request in
                m_get_shader_queue.add(name, 0, 0, &result_queue);
 
-               infostream<<"Waiting for shader from main thread, name=\""
-                               <<name<<"\""<<std::endl;
+               /* infostream<<"Waiting for shader from main thread, name=\""
+                               <<name<<"\""<<std::endl;*/
 
-               try{
-                       // Wait result for a second
+               while(true) {
                        GetResult<std::string, u32, u8, u8>
-                                       result = result_queue.pop_front(1000);
+                               result = result_queue.pop_frontNoEx();
 
-                       // Check that at least something worked OK
-                       assert(result.key == name);
-
-                       return result.item;
-               }
-               catch(ItemNotFoundException &e){
-                       infostream<<"Waiting for shader timed out."<<std::endl;
-                       return 0;
+                       if (result.key == name) {
+                               return result.item;
+                       }
+                       else {
+                               errorstream << "Got shader with invalid name: " << result.key << std::endl;
+                       }
                }
+
        }
 
        infostream<<"getShaderId(): Failed"<<std::endl;
@@ -537,22 +534,17 @@ void ShaderSource::processQueue()
        /*
                Fetch shaders
        */
+       //NOTE this is only thread safe for ONE consumer thread!
        if(!m_get_shader_queue.empty()){
                GetRequest<std::string, u32, u8, u8>
                                request = m_get_shader_queue.pop();
 
-               /*infostream<<"ShaderSource::processQueue(): "
+               /**errorstream<<"ShaderSource::processQueue(): "
                                <<"got shader request with "
                                <<"name=\""<<request.key<<"\""
-                               <<std::endl;*/
+                               <<std::endl;**/
 
-               GetResult<std::string, u32, u8, u8>
-                               result;
-               result.key = request.key;
-               result.callers = request.callers;
-               result.item = getShaderIdDirect(request.key);
-
-               request.dest->push_back(result);
+               m_get_shader_queue.pushResult(request,getShaderIdDirect(request.key));
        }
 }
 
@@ -585,8 +577,10 @@ void ShaderSource::rebuildShaders()
        // Recreate shaders
        for(u32 i=0; i<m_shaderinfo_cache.size(); i++){
                ShaderInfo *info = &m_shaderinfo_cache[i];
-               *info = generate_shader(info->name, m_device,
-                               m_shader_callback, &m_sourcecache);
+               if(info->name != ""){
+                       *info = generate_shader(info->name, m_device,
+                                       m_shader_callback, &m_sourcecache);
+               }
        }
 }
 
@@ -598,7 +592,7 @@ void ShaderSource::onSetConstants(video::IMaterialRendererServices *services,
                setter->onSetConstants(services, is_highlevel);
        }
 }
+
 ShaderInfo generate_shader(std::string name, IrrlichtDevice *device,
                video::IShaderConstantSetCallBack *callback,
                SourceShaderCache *sourcecache)
@@ -622,9 +616,8 @@ ShaderInfo generate_shader(std::string name, IrrlichtDevice *device,
                }
        }
 
-       // 0 = off, 1 = assembly shaders only, 2 = highlevel or assembly
-       s32 enable_shaders = g_settings->getS32("enable_shaders");
-       if(enable_shaders <= 0)
+       bool enable_shaders = g_settings->getBool("enable_shaders");
+       if(!enable_shaders)
                return shaderinfo;
 
        video::IVideoDriver* driver = device->getVideoDriver();
@@ -678,6 +671,51 @@ ShaderInfo generate_shader(std::string name, IrrlichtDevice *device,
        if(vertex_program == "" && pixel_program == "" && geometry_program == "")
                return shaderinfo;
 
+       // Create shaders header
+       std::string shaders_header = "#version 120\n";
+       
+       if (g_settings->getBool("enable_bumpmapping"))
+               shaders_header += "#define ENABLE_BUMPMAPPING\n";
+
+       if (g_settings->getBool("enable_parallax_occlusion")){
+               shaders_header += "#define ENABLE_PARALLAX_OCCLUSION\n";
+               shaders_header += "#define PARALLAX_OCCLUSION_SCALE ";
+               shaders_header += ftos(g_settings->getFloat("parallax_occlusion_scale"));
+               shaders_header += "\n";
+               shaders_header += "#define PARALLAX_OCCLUSION_BIAS ";
+               shaders_header += ftos(g_settings->getFloat("parallax_occlusion_bias"));
+               shaders_header += "\n";
+               }
+
+       if (g_settings->getBool("enable_bumpmapping") || g_settings->getBool("enable_parallax_occlusion"))
+               shaders_header += "#define USE_NORMALMAPS\n";
+
+       if (g_settings->getBool("enable_waving_water")){
+               shaders_header += "#define ENABLE_WAVING_WATER\n";
+               shaders_header += "#define WATER_WAVE_HEIGHT ";
+               shaders_header += ftos(g_settings->getFloat("water_wave_height"));
+               shaders_header += "\n";
+               shaders_header += "#define WATER_WAVE_LENGTH ";
+               shaders_header += ftos(g_settings->getFloat("water_wave_length"));
+               shaders_header += "\n";
+               shaders_header += "#define WATER_WAVE_SPEED ";
+               shaders_header += ftos(g_settings->getFloat("water_wave_speed"));
+               shaders_header += "\n";
+       }
+
+       if (g_settings->getBool("enable_waving_leaves"))
+               shaders_header += "#define ENABLE_WAVING_LEAVES\n";
+
+       if (g_settings->getBool("enable_waving_plants"))
+               shaders_header += "#define ENABLE_WAVING_PLANTS\n";
+
+       if(pixel_program != "")
+               pixel_program = shaders_header + pixel_program;
+       if(vertex_program != "")
+               vertex_program = shaders_header + vertex_program;
+       if(geometry_program != "")
+               geometry_program = shaders_header + geometry_program;
+
        // Call addHighLevelShaderMaterial() or addShaderMaterial()
        const c8* vertex_program_ptr = 0;
        const c8* pixel_program_ptr = 0;
@@ -746,7 +784,7 @@ ShaderInfo generate_shader(std::string name, IrrlichtDevice *device,
 }
 
 void load_shaders(std::string name, SourceShaderCache *sourcecache,
-               video::E_DRIVER_TYPE drivertype, s32 enable_shaders,
+               video::E_DRIVER_TYPE drivertype, bool enable_shaders,
                std::string &vertex_program, std::string &pixel_program,
                std::string &geometry_program, bool &is_highlevel)
 {
@@ -755,7 +793,7 @@ void load_shaders(std::string name, SourceShaderCache *sourcecache,
        geometry_program = "";
        is_highlevel = false;
 
-       if(enable_shaders >= 2){
+       if(enable_shaders){
                // Look for high level shaders
                if(drivertype == video::EDT_DIRECT3D9){
                        // Direct3D 9: HLSL
@@ -776,24 +814,4 @@ void load_shaders(std::string name, SourceShaderCache *sourcecache,
                }
        }
 
-       if(enable_shaders >= 1){
-               // Look for assembly shaders
-               if(drivertype == video::EDT_DIRECT3D8){
-                       // Direct3D 8 assembly shaders
-                       vertex_program = sourcecache->getOrLoad(name, "d3d8_vertex.asm");
-                       pixel_program = sourcecache->getOrLoad(name, "d3d8_pixel.asm");
-               }
-               else if(drivertype == video::EDT_DIRECT3D9){
-                       // Direct3D 9 assembly shaders
-                       vertex_program = sourcecache->getOrLoad(name, "d3d9_vertex.asm");
-                       pixel_program = sourcecache->getOrLoad(name, "d3d9_pixel.asm");
-               }
-               else if(drivertype == video::EDT_OPENGL){
-                       // OpenGL assembly shaders
-                       vertex_program = sourcecache->getOrLoad(name, "opengl_vertex.asm");
-                       pixel_program = sourcecache->getOrLoad(name, "opengl_fragment.asm");
-               }
-               if(vertex_program != "" || pixel_program != "")
-                       return;
-       }
 }