diff options
Diffstat (limited to 'src/client/shader.cpp')
-rw-r--r-- | src/client/shader.cpp | 381 |
1 files changed, 190 insertions, 191 deletions
diff --git a/src/client/shader.cpp b/src/client/shader.cpp index ee6079f7a..9e0b73696 100644 --- a/src/client/shader.cpp +++ b/src/client/shader.cpp @@ -52,8 +52,7 @@ MutexedMap<std::string, std::string> g_shadername_to_path_cache; Utilizes a thread-safe cache. */ -std::string getShaderPath(const std::string &name_of_shader, - const std::string &filename) +std::string getShaderPath(const std::string &name_of_shader, const std::string &filename) { std::string combined = name_of_shader + DIR_DELIM + filename; std::string fullpath; @@ -61,7 +60,7 @@ std::string getShaderPath(const std::string &name_of_shader, Check from cache */ bool incache = g_shadername_to_path_cache.get(combined, &fullpath); - if(incache) + if (incache) return fullpath; /* @@ -70,7 +69,7 @@ std::string getShaderPath(const std::string &name_of_shader, std::string shader_path = g_settings->get("shader_path"); if (!shader_path.empty()) { std::string testpath = shader_path + DIR_DELIM + combined; - if(fs::PathExists(testpath)) + if (fs::PathExists(testpath)) fullpath = testpath; } @@ -78,12 +77,10 @@ std::string getShaderPath(const std::string &name_of_shader, Check from default data directory */ if (fullpath.empty()) { - std::string rel_path = std::string("client") + DIR_DELIM - + "shaders" + DIR_DELIM - + name_of_shader + DIR_DELIM - + filename; + std::string rel_path = std::string("client") + DIR_DELIM + "shaders" + + DIR_DELIM + name_of_shader + DIR_DELIM + filename; std::string testpath = porting::path_share + DIR_DELIM + rel_path; - if(fs::PathExists(testpath)) + if (fs::PathExists(testpath)) fullpath = testpath; } @@ -102,13 +99,13 @@ class SourceShaderCache { public: void insert(const std::string &name_of_shader, const std::string &filename, - const std::string &program, bool prefer_local) + const std::string &program, bool prefer_local) { std::string combined = name_of_shader + DIR_DELIM + filename; // Try to use local shader instead if asked to - if(prefer_local){ + if (prefer_local) { std::string path = getShaderPath(name_of_shader, filename); - if(!path.empty()){ + if (!path.empty()) { std::string p = readFile(path); if (!p.empty()) { m_programs[combined] = p; @@ -119,8 +116,7 @@ public: m_programs[combined] = program; } - std::string get(const std::string &name_of_shader, - const std::string &filename) + std::string get(const std::string &name_of_shader, const std::string &filename) { std::string combined = name_of_shader + DIR_DELIM + filename; StringMap::iterator n = m_programs.find(combined); @@ -130,8 +126,8 @@ public: } // Primarily fetches from cache, secondarily tries to read from filesystem - std::string getOrLoad(const std::string &name_of_shader, - const std::string &filename) + std::string getOrLoad( + const std::string &name_of_shader, const std::string &filename) { std::string combined = name_of_shader + DIR_DELIM + filename; StringMap::iterator n = m_programs.find(combined); @@ -139,12 +135,13 @@ public: return n->second; std::string path = getShaderPath(name_of_shader, filename); if (path.empty()) { - infostream << "SourceShaderCache::getOrLoad(): No path found for \"" - << combined << "\"" << std::endl; + infostream << "SourceShaderCache::getOrLoad(): No path found for " + "\"" + << combined << "\"" << std::endl; return ""; } - infostream << "SourceShaderCache::getOrLoad(): Loading path \"" - << path << "\"" << std::endl; + infostream << "SourceShaderCache::getOrLoad(): Loading path \"" << path + << "\"" << std::endl; std::string p = readFile(path); if (!p.empty()) { m_programs[combined] = p; @@ -152,13 +149,14 @@ public: } return ""; } + private: StringMap m_programs; std::string readFile(const std::string &path) { std::ifstream is(path.c_str(), std::ios::binary); - if(!is.is_open()) + if (!is.is_open()) return ""; std::ostringstream tmp_os; tmp_os << is.rdbuf(); @@ -166,14 +164,13 @@ private: } }; - /* ShaderCallback: Sets constants that can be used in shaders */ class ShaderCallback : public video::IShaderConstantSetCallBack { - std::vector<IShaderConstantSetter*> m_setters; + std::vector<IShaderConstantSetter *> m_setters; public: ShaderCallback(const std::vector<IShaderConstantSetterFactory *> &factories) @@ -188,7 +185,8 @@ public: delete setter; } - virtual void OnSetConstants(video::IMaterialRendererServices *services, s32 userData) override + virtual void OnSetConstants( + video::IMaterialRendererServices *services, s32 userData) override { video::IVideoDriver *driver = services->getVideoDriver(); sanity_check(driver != NULL); @@ -199,14 +197,13 @@ public: setter->onSetConstants(services, is_highlevel); } - virtual void OnSetMaterial(const video::SMaterial& material) override + virtual void OnSetMaterial(const video::SMaterial &material) override { for (IShaderConstantSetter *setter : m_setters) setter->onSetMaterial(material); } }; - /* MainShaderConstantSetter: Set basic constants required for almost everything */ @@ -218,13 +215,13 @@ class MainShaderConstantSetter : public IShaderConstantSetter public: MainShaderConstantSetter() : - m_world_view_proj("mWorldViewProj"), - m_world("mWorld") - {} + m_world_view_proj("mWorldViewProj"), m_world("mWorld") + { + } ~MainShaderConstantSetter() = default; - virtual void onSetConstants(video::IMaterialRendererServices *services, - bool is_highlevel) + virtual void onSetConstants( + video::IMaterialRendererServices *services, bool is_highlevel) { video::IVideoDriver *driver = services->getVideoDriver(); sanity_check(driver); @@ -235,29 +232,28 @@ public: worldViewProj *= driver->getTransform(video::ETS_VIEW); worldViewProj *= driver->getTransform(video::ETS_WORLD); if (is_highlevel) - m_world_view_proj.set(*reinterpret_cast<float(*)[16]>(worldViewProj.pointer()), services); + m_world_view_proj.set(*reinterpret_cast<float(*)[16]>( + worldViewProj.pointer()), + services); else services->setVertexShaderConstant(worldViewProj.pointer(), 0, 4); // Set world matrix core::matrix4 world = driver->getTransform(video::ETS_WORLD); if (is_highlevel) - m_world.set(*reinterpret_cast<float(*)[16]>(world.pointer()), services); + m_world.set(*reinterpret_cast<float(*)[16]>(world.pointer()), + services); else services->setVertexShaderConstant(world.pointer(), 4, 4); - } }; - class MainShaderConstantSetterFactory : public IShaderConstantSetterFactory { public: - virtual IShaderConstantSetter* create() - { return new MainShaderConstantSetter(); } + virtual IShaderConstantSetter *create() { return new MainShaderConstantSetter(); } }; - /* ShaderSource */ @@ -275,8 +271,8 @@ public: The id 0 points to a null shader. Its material is EMT_SOLID. */ - u32 getShaderIdDirect(const std::string &name, - const u8 material_type, const u8 drawtype); + u32 getShaderIdDirect(const std::string &name, const u8 material_type, + const u8 drawtype); /* If shader specified by the name pointed by the id doesn't @@ -287,8 +283,7 @@ public: for processing. */ - u32 getShader(const std::string &name, - const u8 material_type, const u8 drawtype); + u32 getShader(const std::string &name, const u8 material_type, const u8 drawtype); ShaderInfo getShaderInfo(u32 id); @@ -299,7 +294,7 @@ public: // Insert a shader program into the cache without touching the // filesystem. Shall be called from the main thread. void insertSourceShader(const std::string &name_of_shader, - const std::string &filename, const std::string &program); + const std::string &filename, const std::string &program); // Rebuild shaders from the current set of source shaders // Shall be called from the main thread. @@ -311,7 +306,6 @@ public: } private: - // The id of the thread that is allowed to use irrlicht directly std::thread::id m_main_thread; @@ -343,8 +337,8 @@ IWritableShaderSource *createShaderSource() /* Generate shader given the shader name. */ -ShaderInfo generate_shader(const std::string &name, - u8 material_type, u8 drawtype, std::vector<ShaderCallback *> &callbacks, +ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtype, + std::vector<ShaderCallback *> &callbacks, const std::vector<IShaderConstantSetterFactory *> &setter_factories, SourceShaderCache *sourcecache); @@ -377,8 +371,8 @@ ShaderSource::~ShaderSource() } } -u32 ShaderSource::getShader(const std::string &name, - const u8 material_type, const u8 drawtype) +u32 ShaderSource::getShader( + const std::string &name, const u8 material_type, const u8 drawtype) { /* Get shader @@ -400,15 +394,15 @@ u32 ShaderSource::getShader(const std::string &name, /* infostream<<"Waiting for shader from main thread, name=\"" <<name<<"\""<<std::endl;*/ - while(true) { - GetResult<std::string, u32, u8, u8> - result = result_queue.pop_frontNoEx(); + while (true) { + GetResult<std::string, u32, u8, u8> result = result_queue.pop_frontNoEx(); if (result.key == name) { return result.item; } - errorstream << "Got shader with invalid name: " << result.key << std::endl; + errorstream << "Got shader with invalid name: " << result.key + << std::endl; } infostream << "getShader(): Failed" << std::endl; @@ -419,22 +413,22 @@ u32 ShaderSource::getShader(const std::string &name, /* This method generates all the shaders */ -u32 ShaderSource::getShaderIdDirect(const std::string &name, - const u8 material_type, const u8 drawtype) +u32 ShaderSource::getShaderIdDirect( + const std::string &name, const u8 material_type, const u8 drawtype) { - //infostream<<"getShaderIdDirect(): name=\""<<name<<"\""<<std::endl; + // infostream<<"getShaderIdDirect(): name=\""<<name<<"\""<<std::endl; // Empty name means shader 0 if (name.empty()) { - infostream<<"getShaderIdDirect(): name is empty"<<std::endl; + infostream << "getShaderIdDirect(): name is empty" << std::endl; return 0; } // Check if already have such instance - for(u32 i=0; i<m_shaderinfo_cache.size(); i++){ + for (u32 i = 0; i < m_shaderinfo_cache.size(); i++) { ShaderInfo *info = &m_shaderinfo_cache[i]; - if(info->name == name && info->material_type == material_type && - info->drawtype == drawtype) + if (info->name == name && info->material_type == material_type && + info->drawtype == drawtype) return i; } @@ -442,13 +436,14 @@ u32 ShaderSource::getShaderIdDirect(const std::string &name, Calling only allowed from main thread */ if (std::this_thread::get_id() != m_main_thread) { - errorstream<<"ShaderSource::getShaderIdDirect() " - "called not from main thread"<<std::endl; + errorstream << "ShaderSource::getShaderIdDirect() " + "called not from main thread" + << std::endl; return 0; } - ShaderInfo info = generate_shader(name, material_type, drawtype, - m_callbacks, m_setter_factories, &m_sourcecache); + ShaderInfo info = generate_shader(name, material_type, drawtype, m_callbacks, + m_setter_factories, &m_sourcecache); /* Add shader to caches (add dummy shaders too) @@ -459,18 +454,18 @@ u32 ShaderSource::getShaderIdDirect(const std::string &name, u32 id = m_shaderinfo_cache.size(); m_shaderinfo_cache.push_back(info); - infostream<<"getShaderIdDirect(): " - <<"Returning id="<<id<<" for name \""<<name<<"\""<<std::endl; + infostream << "getShaderIdDirect(): " + << "Returning id=" << id << " for name \"" << name << "\"" + << std::endl; return id; } - ShaderInfo ShaderSource::getShaderInfo(u32 id) { MutexAutoLock lock(m_shaderinfo_cache_mutex); - if(id >= m_shaderinfo_cache.size()) + if (id >= m_shaderinfo_cache.size()) return ShaderInfo(); return m_shaderinfo_cache[id]; @@ -478,8 +473,6 @@ ShaderInfo ShaderSource::getShaderInfo(u32 id) void ShaderSource::processQueue() { - - } void ShaderSource::insertSourceShader(const std::string &name_of_shader, @@ -513,13 +506,12 @@ void ShaderSource::rebuildShaders() ShaderInfo *info = &i; if (!info->name.empty()) { *info = generate_shader(info->name, info->material_type, - info->drawtype, m_callbacks, - m_setter_factories, &m_sourcecache); + info->drawtype, m_callbacks, m_setter_factories, + &m_sourcecache); } } } - ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtype, std::vector<ShaderCallback *> &callbacks, const std::vector<IShaderConstantSetterFactory *> &setter_factories, @@ -558,11 +550,13 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp video::IVideoDriver *driver = RenderingEngine::get_video_driver(); video::IGPUProgrammingServices *gpu = driver->getGPUProgrammingServices(); - if(!gpu){ - errorstream<<"generate_shader(): " - "failed to generate \""<<name<<"\", " - "GPU programming not supported." - <<std::endl; + if (!gpu) { + errorstream << "generate_shader(): " + "failed to generate \"" + << name + << "\", " + "GPU programming not supported." + << std::endl; return shaderinfo; } @@ -572,31 +566,30 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp std::string pixel_program; std::string geometry_program; bool is_highlevel; - load_shaders(name, sourcecache, driver->getDriverType(), - enable_shaders, vertex_program, pixel_program, - geometry_program, is_highlevel); + load_shaders(name, sourcecache, driver->getDriverType(), enable_shaders, + vertex_program, pixel_program, geometry_program, is_highlevel); // Check hardware/driver support if (!vertex_program.empty() && !driver->queryFeature(video::EVDF_VERTEX_SHADER_1_1) && - !driver->queryFeature(video::EVDF_ARB_VERTEX_PROGRAM_1)){ - infostream<<"generate_shader(): vertex shaders disabled " - "because of missing driver/hardware support." - <<std::endl; + !driver->queryFeature(video::EVDF_ARB_VERTEX_PROGRAM_1)) { + infostream << "generate_shader(): vertex shaders disabled " + "because of missing driver/hardware support." + << std::endl; vertex_program = ""; } if (!pixel_program.empty() && !driver->queryFeature(video::EVDF_PIXEL_SHADER_1_1) && - !driver->queryFeature(video::EVDF_ARB_FRAGMENT_PROGRAM_1)){ - infostream<<"generate_shader(): pixel shaders disabled " - "because of missing driver/hardware support." - <<std::endl; + !driver->queryFeature(video::EVDF_ARB_FRAGMENT_PROGRAM_1)) { + infostream << "generate_shader(): pixel shaders disabled " + "because of missing driver/hardware support." + << std::endl; pixel_program = ""; } if (!geometry_program.empty() && - !driver->queryFeature(video::EVDF_GEOMETRY_SHADER)){ - infostream<<"generate_shader(): geometry shaders disabled " - "because of missing driver/hardware support." - <<std::endl; + !driver->queryFeature(video::EVDF_GEOMETRY_SHADER)) { + infostream << "generate_shader(): geometry shaders disabled " + "because of missing driver/hardware support." + << std::endl; geometry_program = ""; } @@ -607,27 +600,27 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp // Create shaders header std::string shaders_header = "#version 120\n"; - static const char* drawTypes[] = { - "NDT_NORMAL", - "NDT_AIRLIKE", - "NDT_LIQUID", - "NDT_FLOWINGLIQUID", - "NDT_GLASSLIKE", - "NDT_ALLFACES", - "NDT_ALLFACES_OPTIONAL", - "NDT_TORCHLIKE", - "NDT_SIGNLIKE", - "NDT_PLANTLIKE", - "NDT_FENCELIKE", - "NDT_RAILLIKE", - "NDT_NODEBOX", - "NDT_GLASSLIKE_FRAMED", - "NDT_FIRELIKE", - "NDT_GLASSLIKE_FRAMED_OPTIONAL", - "NDT_PLANTLIKE_ROOTED", + static const char *drawTypes[] = { + "NDT_NORMAL", + "NDT_AIRLIKE", + "NDT_LIQUID", + "NDT_FLOWINGLIQUID", + "NDT_GLASSLIKE", + "NDT_ALLFACES", + "NDT_ALLFACES_OPTIONAL", + "NDT_TORCHLIKE", + "NDT_SIGNLIKE", + "NDT_PLANTLIKE", + "NDT_FENCELIKE", + "NDT_RAILLIKE", + "NDT_NODEBOX", + "NDT_GLASSLIKE_FRAMED", + "NDT_FIRELIKE", + "NDT_GLASSLIKE_FRAMED_OPTIONAL", + "NDT_PLANTLIKE_ROOTED", }; - for (int i = 0; i < 14; i++){ + for (int i = 0; i < 14; i++) { shaders_header += "#define "; shaders_header += drawTypes[i]; shaders_header += " "; @@ -635,22 +628,22 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp shaders_header += "\n"; } - static const char* materialTypes[] = { - "TILE_MATERIAL_BASIC", - "TILE_MATERIAL_ALPHA", - "TILE_MATERIAL_LIQUID_TRANSPARENT", - "TILE_MATERIAL_LIQUID_OPAQUE", - "TILE_MATERIAL_WAVING_LEAVES", - "TILE_MATERIAL_WAVING_PLANTS", - "TILE_MATERIAL_OPAQUE", - "TILE_MATERIAL_WAVING_LIQUID_BASIC", - "TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT", - "TILE_MATERIAL_WAVING_LIQUID_OPAQUE", - "TILE_MATERIAL_PLAIN", - "TILE_MATERIAL_PLAIN_ALPHA", + static const char *materialTypes[] = { + "TILE_MATERIAL_BASIC", + "TILE_MATERIAL_ALPHA", + "TILE_MATERIAL_LIQUID_TRANSPARENT", + "TILE_MATERIAL_LIQUID_OPAQUE", + "TILE_MATERIAL_WAVING_LEAVES", + "TILE_MATERIAL_WAVING_PLANTS", + "TILE_MATERIAL_OPAQUE", + "TILE_MATERIAL_WAVING_LIQUID_BASIC", + "TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT", + "TILE_MATERIAL_WAVING_LIQUID_OPAQUE", + "TILE_MATERIAL_PLAIN", + "TILE_MATERIAL_PLAIN_ALPHA", }; - for (int i = 0; i < 12; i++){ + for (int i = 0; i < 12; i++) { shaders_header += "#define "; shaders_header += materialTypes[i]; shaders_header += " "; @@ -675,7 +668,7 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp shaders_header += "\n"; float sample_step; int smooth = (int)g_settings->getFloat("normalmaps_smooth"); - switch (smooth){ + switch (smooth) { case 0: sample_step = 0.0078125; // 1.0 / 128.0 break; @@ -696,7 +689,7 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp if (g_settings->getBool("enable_bumpmapping")) shaders_header += "#define ENABLE_BUMPMAPPING\n"; - if (g_settings->getBool("enable_parallax_occlusion")){ + if (g_settings->getBool("enable_parallax_occlusion")) { int mode = g_settings->getFloat("parallax_occlusion_mode"); float scale = g_settings->getFloat("parallax_occlusion_scale"); float bias = g_settings->getFloat("parallax_occlusion_bias"); @@ -717,12 +710,13 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp } shaders_header += "#define USE_NORMALMAPS "; - if (g_settings->getBool("enable_bumpmapping") || g_settings->getBool("enable_parallax_occlusion")) + if (g_settings->getBool("enable_bumpmapping") || + g_settings->getBool("enable_parallax_occlusion")) shaders_header += "1\n"; else shaders_header += "0\n"; - if (g_settings->getBool("enable_waving_water")){ + if (g_settings->getBool("enable_waving_water")) { shaders_header += "#define ENABLE_WAVING_WATER 1\n"; shaders_header += "#define WATER_WAVE_HEIGHT "; shaders_header += ftos(g_settings->getFloat("water_wave_height")); @@ -733,7 +727,7 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp shaders_header += "#define WATER_WAVE_SPEED "; shaders_header += ftos(g_settings->getFloat("water_wave_speed")); shaders_header += "\n"; - } else{ + } else { shaders_header += "#define ENABLE_WAVING_WATER 0\n"; } @@ -757,9 +751,9 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp shaders_header += "\n"; // Call addHighLevelShaderMaterial() or addShaderMaterial() - const c8* vertex_program_ptr = 0; - const c8* pixel_program_ptr = 0; - const c8* geometry_program_ptr = 0; + const c8 *vertex_program_ptr = 0; + const c8 *pixel_program_ptr = 0; + const c8 *geometry_program_ptr = 0; if (!vertex_program.empty()) { vertex_program = shaders_header + vertex_program; vertex_program_ptr = vertex_program.c_str(); @@ -774,54 +768,57 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp } ShaderCallback *cb = new ShaderCallback(setter_factories); s32 shadermat = -1; - if(is_highlevel){ - infostream<<"Compiling high level shaders for "<<name<<std::endl; + if (is_highlevel) { + infostream << "Compiling high level shaders for " << name << std::endl; shadermat = gpu->addHighLevelShaderMaterial( - vertex_program_ptr, // Vertex shader program - "vertexMain", // Vertex shader entry point - video::EVST_VS_1_1, // Vertex shader version - pixel_program_ptr, // Pixel shader program - "pixelMain", // Pixel shader entry point - video::EPST_PS_1_2, // Pixel shader version - geometry_program_ptr, // Geometry shader program - "geometryMain", // Geometry shader entry point - video::EGST_GS_4_0, // Geometry shader version - scene::EPT_TRIANGLES, // Geometry shader input - scene::EPT_TRIANGLE_STRIP, // Geometry shader output - 0, // Support maximum number of vertices - cb, // Set-constant callback - shaderinfo.base_material, // Base material - 1 // Userdata passed to callback - ); - if(shadermat == -1){ - errorstream<<"generate_shader(): " - "failed to generate \""<<name<<"\", " - "addHighLevelShaderMaterial failed." - <<std::endl; + vertex_program_ptr, // Vertex shader program + "vertexMain", // Vertex shader entry point + video::EVST_VS_1_1, // Vertex shader version + pixel_program_ptr, // Pixel shader program + "pixelMain", // Pixel shader entry point + video::EPST_PS_1_2, // Pixel shader version + geometry_program_ptr, // Geometry shader program + "geometryMain", // Geometry shader entry point + video::EGST_GS_4_0, // Geometry shader version + scene::EPT_TRIANGLES, // Geometry shader input + scene::EPT_TRIANGLE_STRIP, // Geometry shader output + 0, // Support maximum number of vertices + cb, // Set-constant callback + shaderinfo.base_material, // Base material + 1 // Userdata passed to callback + ); + if (shadermat == -1) { + errorstream << "generate_shader(): " + "failed to generate \"" + << name + << "\", " + "addHighLevelShaderMaterial failed." + << std::endl; dumpShaderProgram(warningstream, "Vertex", vertex_program); dumpShaderProgram(warningstream, "Pixel", pixel_program); dumpShaderProgram(warningstream, "Geometry", geometry_program); delete cb; return shaderinfo; } - } - else{ - infostream<<"Compiling assembly shaders for "<<name<<std::endl; + } else { + infostream << "Compiling assembly shaders for " << name << std::endl; shadermat = gpu->addShaderMaterial( - vertex_program_ptr, // Vertex shader program - pixel_program_ptr, // Pixel shader program - cb, // Set-constant callback - shaderinfo.base_material, // Base material - 0 // Userdata passed to callback - ); - - if(shadermat == -1){ - errorstream<<"generate_shader(): " - "failed to generate \""<<name<<"\", " - "addShaderMaterial failed." - <<std::endl; + vertex_program_ptr, // Vertex shader program + pixel_program_ptr, // Pixel shader program + cb, // Set-constant callback + shaderinfo.base_material, // Base material + 0 // Userdata passed to callback + ); + + if (shadermat == -1) { + errorstream << "generate_shader(): " + "failed to generate \"" + << name + << "\", " + "addShaderMaterial failed." + << std::endl; dumpShaderProgram(warningstream, "Vertex", vertex_program); - dumpShaderProgram(warningstream,"Pixel", pixel_program); + dumpShaderProgram(warningstream, "Pixel", pixel_program); delete cb; return shaderinfo; } @@ -833,7 +830,7 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp driver->getMaterialRenderer(shadermat)->grab(); // Apply the newly created material type - shaderinfo.material = (video::E_MATERIAL_TYPE) shadermat; + shaderinfo.material = (video::E_MATERIAL_TYPE)shadermat; return shaderinfo; } @@ -847,43 +844,45 @@ void load_shaders(const std::string &name, SourceShaderCache *sourcecache, geometry_program = ""; is_highlevel = false; - if(enable_shaders){ + if (enable_shaders) { // Look for high level shaders - if(drivertype == video::EDT_DIRECT3D9){ + if (drivertype == video::EDT_DIRECT3D9) { // Direct3D 9: HLSL // (All shaders in one file) vertex_program = sourcecache->getOrLoad(name, "d3d9.hlsl"); pixel_program = vertex_program; geometry_program = vertex_program; - } - else if(drivertype == video::EDT_OPENGL){ + } else if (drivertype == video::EDT_OPENGL) { // OpenGL: GLSL - vertex_program = sourcecache->getOrLoad(name, "opengl_vertex.glsl"); - pixel_program = sourcecache->getOrLoad(name, "opengl_fragment.glsl"); - geometry_program = sourcecache->getOrLoad(name, "opengl_geometry.glsl"); + vertex_program = sourcecache->getOrLoad( + name, "opengl_vertex.glsl"); + pixel_program = sourcecache->getOrLoad( + name, "opengl_fragment.glsl"); + geometry_program = sourcecache->getOrLoad( + name, "opengl_geometry.glsl"); } - if (!vertex_program.empty() || !pixel_program.empty() || !geometry_program.empty()){ + if (!vertex_program.empty() || !pixel_program.empty() || + !geometry_program.empty()) { is_highlevel = true; return; } } - } -void dumpShaderProgram(std::ostream &output_stream, - const std::string &program_type, const std::string &program) +void dumpShaderProgram(std::ostream &output_stream, const std::string &program_type, + const std::string &program) { - output_stream << program_type << " shader program:" << std::endl << - "----------------------------------" << std::endl; + output_stream << program_type << " shader program:" << std::endl + << "----------------------------------" << std::endl; size_t pos = 0; size_t prev = 0; s16 line = 1; while ((pos = program.find('\n', prev)) != std::string::npos) { - output_stream << line++ << ": "<< program.substr(prev, pos - prev) << - std::endl; + output_stream << line++ << ": " << program.substr(prev, pos - prev) + << std::endl; prev = pos + 1; } - output_stream << line << ": " << program.substr(prev) << std::endl << - "End of " << program_type << " shader program." << std::endl << - " " << std::endl; + output_stream << line << ": " << program.substr(prev) << std::endl + << "End of " << program_type << " shader program." << std::endl + << " " << std::endl; } |