X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fnodedef.cpp;h=93751c70e3160e3355e7042ec3f47ee2c3ebea08;hb=86a0f5603b9e936b8527ae22c4aeaf5714c9d279;hp=96dca730bf7785e1463ef43bbb627fbc76aa7b5f;hpb=3aedfac9685c2d9ae8bac5a5b7e72e527f22c08d;p=oweals%2Fminetest.git diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 96dca730b..93751c70e 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -46,10 +46,15 @@ void NodeBox::reset() wall_side = aabb3f(-BS/2, -BS/2, -BS/2, -BS/2+BS/16., BS/2, BS/2); } -void NodeBox::serialize(std::ostream &os) const +void NodeBox::serialize(std::ostream &os, u16 protocol_version) const { - writeU8(os, 1); // version - writeU8(os, type); + int version = protocol_version >= 21 ? 2 : 1; + writeU8(os, version); + + if (version == 1 && type == NODEBOX_LEVELED) + writeU8(os, NODEBOX_FIXED); + else + writeU8(os, type); if(type == NODEBOX_FIXED || type == NODEBOX_LEVELED) { @@ -76,7 +81,7 @@ void NodeBox::serialize(std::ostream &os) const void NodeBox::deSerialize(std::istream &is) { int version = readU8(is); - if(version != 1) + if(version < 1 || version > 2) throw SerializationError("unsupported NodeBox version"); reset(); @@ -112,7 +117,7 @@ void NodeBox::deSerialize(std::istream &is) void TileDef::serialize(std::ostream &os, u16 protocol_version) const { if(protocol_version >= 17) - writeU8(os, 1); + writeU8(os, 1); else writeU8(os, 0); os<first; - + std::map::iterator j = m_group_to_items.find(group_name); if (j == m_group_to_items.end()) { @@ -588,7 +597,8 @@ public: } } } - virtual void updateTextures(ITextureSource *tsrc) + virtual void updateTextures(ITextureSource *tsrc, + IShaderSource *shdsrc) { #ifndef SERVER infostream<<"CNodeDefManager::updateTextures(): Updating " @@ -597,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; itiledef[j]; if(tiledef[j].name == "") @@ -612,6 +625,11 @@ public: } bool is_liquid = false; + bool is_water_surface = false; + + u8 material_type; + material_type = (f->alpha == 255) ? TILE_MATERIAL_BASIC : TILE_MATERIAL_ALPHA; + switch(f->drawtype){ default: case NDT_NORMAL: @@ -663,10 +681,14 @@ public: tiledef[i].name += std::string("^[noalpha"); } } + if (f->waving == 1) + material_type = TILE_MATERIAL_WAVING_LEAVES; break; case NDT_PLANTLIKE: f->solidness = 0; f->backface_culling = false; + if (f->waving == 1) + material_type = TILE_MATERIAL_WAVING_PLANTS; break; case NDT_TORCHLIKE: case NDT_SIGNLIKE: @@ -677,18 +699,29 @@ public: break; } - u8 material_type; - if (is_liquid) + if (is_liquid){ material_type = (f->alpha == 255) ? TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT; - else - material_type = (f->alpha == 255) ? TILE_MATERIAL_BASIC : TILE_MATERIAL_ALPHA; + if (f->name == "default:water_source") + is_water_surface = true; + } + u32 tile_shader[6]; + for(u16 j=0; j<6; j++) + tile_shader[j] = shdsrc->getShader("nodes_shader",material_type, f->drawtype); + + if (is_water_surface) + tile_shader[0] = shdsrc->getShader("water_surface_shader",material_type, f->drawtype); // Tiles (fill in f->tiles[]) - for(u16 j=0; j<6; j++){ + for(u16 j = 0; j < 6; j++){ + // Shader + f->tiles[j].shader_id = tile_shader[j]; // Texture 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 @@ -700,37 +733,46 @@ 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<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; } } } // Special tiles (fill in f->special_tiles[]) for(u16 j=0; jspecial_tiles[j].shader_id = tile_shader[j]; // Texture 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 @@ -742,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<tiledef_special[j].name<<"^[verticalframe:"<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; } } } @@ -775,7 +821,7 @@ public: writeU8(os, 1); // version u16 count = 0; std::ostringstream os2(std::ios::binary); - for(u32 i=0; i 13 && protocol_version < 24) { + writeU8(os, 6); // version + os<first); + writeS16(os, i->second); + } + writeU8(os, drawtype); + writeF1000(os, visual_scale); + writeU8(os, 6); + for(u32 i = 0; i < 6; i++) + tiledef[i].serialize(os, protocol_version); + //CF_SPECIAL_COUNT = 2 before cf ver. 7 and protocol ver. 24 + writeU8(os, 2); + for(u32 i = 0; i < 2; i++){ + tiledef_special[i].serialize(os, protocol_version); + } + writeU8(os, alpha); + writeU8(os, post_effect_color.getAlpha()); + writeU8(os, post_effect_color.getRed()); + writeU8(os, post_effect_color.getGreen()); + writeU8(os, post_effect_color.getBlue()); + writeU8(os, param_type); + writeU8(os, param_type_2); + writeU8(os, is_ground_content); + writeU8(os, light_propagates); + writeU8(os, sunlight_propagates); + writeU8(os, walkable); + writeU8(os, pointable); + writeU8(os, diggable); + writeU8(os, climbable); + writeU8(os, buildable_to); + os<