From eed727c61b51f46f6d172c56ecd26a3b1752d449 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Tue, 15 Nov 2011 19:58:36 +0200 Subject: Completely generalized mesh generation; ContentFeatures serialization --- src/nodedef.cpp | 315 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 309 insertions(+), 6 deletions(-) (limited to 'src/nodedef.cpp') diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 045615fbb..996b20781 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -25,6 +25,54 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "tile.h" #endif #include "log.h" +#include "settings.h" + +void NodeBox::serialize(std::ostream &os) +{ + writeU8(os, 0); // version + writeU8(os, type); + writeV3F1000(os, fixed.MinEdge); + writeV3F1000(os, fixed.MaxEdge); + writeV3F1000(os, wall_top.MinEdge); + writeV3F1000(os, wall_top.MaxEdge); + writeV3F1000(os, wall_bottom.MinEdge); + writeV3F1000(os, wall_bottom.MaxEdge); + writeV3F1000(os, wall_side.MinEdge); + writeV3F1000(os, wall_side.MaxEdge); +} + +void NodeBox::deSerialize(std::istream &is) +{ + int version = readU8(is); + if(version != 0) + throw SerializationError("unsupported NodeBox version"); + type = (enum NodeBoxType)readU8(is); + fixed.MinEdge = readV3F1000(is); + fixed.MaxEdge = readV3F1000(is); + wall_top.MinEdge = readV3F1000(is); + wall_top.MaxEdge = readV3F1000(is); + wall_bottom.MinEdge = readV3F1000(is); + wall_bottom.MaxEdge = readV3F1000(is); + wall_side.MinEdge = readV3F1000(is); + wall_side.MaxEdge = readV3F1000(is); +} + +void MaterialSpec::serialize(std::ostream &os) +{ + os<serialize(os); + } else { + writeU8(os, false); + } + writeU8(os, liquid_type); + writeU16(os, liquid_alternative_flowing); + writeU16(os, liquid_alternative_source); + writeU8(os, liquid_viscosity); + writeU8(os, light_source); + writeU32(os, damage_per_second); + selection_box.serialize(os); + material.serialize(os); +} + +void ContentFeatures::deSerialize(std::istream &is, IGameDef *gamedef) +{ + int version = readU8(is); + if(version != 0) + throw SerializationError("unsupported ContentFeatures version"); + drawtype = (enum NodeDrawType)readU8(is); + visual_scale = readF1000(is); + if(readU8(is) != 6) + throw SerializationError("unsupported tile count"); + for(u32 i=0; i<6; i++) + tname_tiles[i] = deSerializeString(is); + tname_inventory = deSerializeString(is); + if(readU8(is) != CF_SPECIAL_COUNT) + throw SerializationError("unsupported CF_SPECIAL_COUNT"); + for(u32 i=0; ireset(); - if(i == CONTENT_IGNORE || i == CONTENT_AIR) + f->reset(); // Reset to defaults + f->modified = false; // Not changed from default + if(i == CONTENT_IGNORE || i == CONTENT_AIR){ + f->drawtype = NDT_AIRLIKE; continue; + } f->setAllTextures("unknown_block.png"); - f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; + //f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; } +#ifndef SERVER // Make CONTENT_IGNORE to not block the view when occlusion culling m_content_features[CONTENT_IGNORE].solidness = 0; +#endif + } + CNodeDefManager() + { + clear(); } virtual ~CNodeDefManager() { @@ -116,6 +327,7 @@ public: virtual ContentFeatures* getModifiable(content_t c) { assert(c <= MAX_CONTENT); + m_content_features[c].modified = true; // Assume it is modified return &m_content_features[c]; } virtual void updateTextures(ITextureSource *tsrc) @@ -123,10 +335,72 @@ public: #ifndef SERVER infostream<<"CNodeDefManager::updateTextures(): Updating " <<"textures in node definitions"<getBool("new_style_water"); + bool new_style_leaves = g_settings->getBool("new_style_leaves"); + bool opaque_water = g_settings->getBool("opaque_water"); + for(u16 i=0; i<=MAX_CONTENT; i++) { - infostream<<"Updating content "<drawtype){ + default: + case NDT_NORMAL: + f->solidness = 2; + break; + case NDT_AIRLIKE: + f->solidness = 0; + break; + case NDT_LIQUID: + assert(f->liquid_type == LIQUID_SOURCE); + if(opaque_water) + f->alpha = 255; + if(new_style_water){ + f->solidness = 0; + } else { + f->solidness = 1; + if(f->alpha == 255) + f->solidness = 2; + } + break; + case NDT_FLOWINGLIQUID: + assert(f->liquid_type == LIQUID_FLOWING); + f->solidness = 0; + if(opaque_water) + f->alpha = 255; + break; + case NDT_GLASSLIKE: + f->solidness = 0; + f->visual_solidness = 1; + break; + case NDT_ALLFACES: + f->solidness = 0; + f->visual_solidness = 1; + break; + case NDT_ALLFACES_OPTIONAL: + if(new_style_leaves){ + f->drawtype = NDT_ALLFACES; + f->solidness = 0; + f->visual_solidness = 1; + } else { + f->drawtype = NDT_NORMAL; + f->solidness = 1; + for(u32 i=0; i<6; i++){ + f->tname_tiles[i] = std::string("[noalpha:") + + f->tname_tiles[i]; + } + } + break; + case NDT_TORCHLIKE: + case NDT_SIGNLIKE: + case NDT_PLANTLIKE: + case NDT_FENCELIKE: + case NDT_RAILLIKE: + f->solidness = 0; + break; + } + // Inventory texture if(f->tname_inventory != "") f->inventory_texture = tsrc->getTextureRaw(f->tname_inventory); @@ -175,6 +449,35 @@ public: } #endif } + void serialize(std::ostream &os) + { + std::ostringstream tmp_os(std::ios::binary); + for(u16 i=0; i<=MAX_CONTENT; i++) + { + ContentFeatures *f = &m_content_features[i]; + if(!f->modified) + continue; + writeU16(tmp_os, i); + f->serialize(tmp_os); + } + os< MAX_CONTENT){ + errorstream<<"ContentFeatures::deSerialize(): " + <<"Too large content id: "<deSerialize(tmp_is, gamedef); + f->modified = true; + } + } private: ContentFeatures m_content_features[MAX_CONTENT+1]; }; -- cgit v1.2.3