diff options
author | RealBadAngel <maciej.kasatkin@o2.pl> | 2014-07-15 09:07:52 +0200 |
---|---|---|
committer | sapier <Sapier at GMX dot net> | 2014-07-17 22:28:14 +0200 |
commit | f0db6c4423db86203db83538704cc34152c59a09 (patch) | |
tree | da1362d260f341898e26f7983a3b1156cce47820 /src/nodedef.cpp | |
parent | 625489dff4cf7d97f49035f5e490476ced42e38f (diff) | |
download | minetest-f0db6c4423db86203db83538704cc34152c59a09.tar.gz minetest-f0db6c4423db86203db83538704cc34152c59a09.tar.bz2 minetest-f0db6c4423db86203db83538704cc34152c59a09.zip |
Speedup mapblock_mesh
Diffstat (limited to 'src/nodedef.cpp')
-rw-r--r-- | src/nodedef.cpp | 65 |
1 files changed, 41 insertions, 24 deletions
diff --git a/src/nodedef.cpp b/src/nodedef.cpp index f62c9e82c..e972ab927 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -607,6 +607,9 @@ public: bool new_style_water = g_settings->getBool("new_style_water"); bool new_style_leaves = g_settings->getBool("new_style_leaves"); bool opaque_water = g_settings->getBool("opaque_water"); + bool enable_shaders = g_settings->getBool("enable_shaders"); + bool enable_bumpmapping = g_settings->getBool("enable_bumpmapping"); + bool enable_parallax_occlusion = g_settings->getBool("enable_parallax_occlusion"); for(u32 i=0; i<m_content_features.size(); i++) { @@ -716,6 +719,9 @@ public: f->tiles[j].texture = tsrc->getTexture( tiledef[j].name, &f->tiles[j].texture_id); + // Normal texture + if (enable_shaders && (enable_bumpmapping || enable_parallax_occlusion)) + f->tiles[j].normal_texture = tsrc->getNormalTexture(tiledef[j].name); // Alpha f->tiles[j].alpha = f->alpha; // Material type @@ -727,28 +733,32 @@ public: if(tiledef[j].animation.type == TAT_VERTICAL_FRAMES) f->tiles[j].material_flags |= MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES; // Animation parameters - if(f->tiles[j].material_flags & - MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) - { + int frame_count = 1; + if(f->tiles[j].material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) { // Get texture size to determine frame count by // aspect ratio v2u32 size = f->tiles[j].texture->getOriginalSize(); int frame_height = (float)size.X / (float)tiledef[j].animation.aspect_w * (float)tiledef[j].animation.aspect_h; - int frame_count = size.Y / frame_height; + frame_count = size.Y / frame_height; int frame_length_ms = 1000.0 * tiledef[j].animation.length / frame_count; f->tiles[j].animation_frame_count = frame_count; f->tiles[j].animation_frame_length_ms = frame_length_ms; - - // If there are no frames for an animation, switch - // animation off (so that having specified an animation - // for something but not using it in the texture pack - // gives no overhead) - if(frame_count == 1){ - f->tiles[j].material_flags &= - ~MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES; + } + if(frame_count == 1) { + f->tiles[j].material_flags &= ~MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES; + } else { + std::ostringstream os(std::ios::binary); + for (int i = 0; i < frame_count; i++) { + FrameSpec frame; + os.str(""); + os<<tiledef[j].name<<"^[verticalframe:"<<frame_count<<":"<<i; + frame.texture = tsrc->getTexture(os.str(), &frame.texture_id); + if (f->tiles[j].normal_texture) + frame.normal_texture = tsrc->getNormalTexture(os.str()); + f->tiles[j].frames[i]=frame; } } } @@ -760,6 +770,9 @@ public: f->special_tiles[j].texture = tsrc->getTexture( f->tiledef_special[j].name, &f->special_tiles[j].texture_id); + // Normal texture + if (enable_shaders && (enable_bumpmapping || enable_parallax_occlusion)) + f->special_tiles[j].normal_texture = tsrc->getNormalTexture(f->tiledef_special[j].name); // Alpha f->special_tiles[j].alpha = f->alpha; // Material type @@ -771,28 +784,32 @@ public: if(f->tiledef_special[j].animation.type == TAT_VERTICAL_FRAMES) f->special_tiles[j].material_flags |= MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES; // Animation parameters - if(f->special_tiles[j].material_flags & - MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) - { + int frame_count = 1; + if(f->special_tiles[j].material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) { // Get texture size to determine frame count by // aspect ratio v2u32 size = f->special_tiles[j].texture->getOriginalSize(); int frame_height = (float)size.X / (float)f->tiledef_special[j].animation.aspect_w * (float)f->tiledef_special[j].animation.aspect_h; - int frame_count = size.Y / frame_height; + frame_count = size.Y / frame_height; int frame_length_ms = 1000.0 * f->tiledef_special[j].animation.length / frame_count; f->special_tiles[j].animation_frame_count = frame_count; f->special_tiles[j].animation_frame_length_ms = frame_length_ms; - - // If there are no frames for an animation, switch - // animation off (so that having specified an animation - // for something but not using it in the texture pack - // gives no overhead) - if(frame_count == 1){ - f->special_tiles[j].material_flags &= - ~MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES; + } + if(frame_count == 1) { + f->special_tiles[j].material_flags &= ~MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES; + } else { + std::ostringstream os(std::ios::binary); + for (int i = 0; i < frame_count; i++) { + FrameSpec frame; + os.str(""); + os<<f->tiledef_special[j].name<<"^[verticalframe:"<<frame_count<<":"<<i; + frame.texture = tsrc->getTexture(os.str(), &frame.texture_id); + if (f->special_tiles[j].normal_texture) + frame.normal_texture = tsrc->getNormalTexture(os.str()); + f->special_tiles[j].frames[i]=frame; } } } |