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);
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 ""
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;
/*
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));
}
}
// 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);
+ }
}
}
setter->onSetConstants(services, is_highlevel);
}
}
-
+
ShaderInfo generate_shader(std::string name, IrrlichtDevice *device,
video::IShaderConstantSetCallBack *callback,
SourceShaderCache *sourcecache)
}
}
- // 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();
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;
}
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)
{
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
}
}
- 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;
- }
}