diff options
-rw-r--r-- | src/client.cpp | 19 | ||||
-rw-r--r-- | src/content_cao.cpp | 30 | ||||
-rw-r--r-- | src/object_properties.cpp | 4 | ||||
-rw-r--r-- | src/object_properties.h | 1 | ||||
-rw-r--r-- | src/scriptapi.cpp | 3 | ||||
-rw-r--r-- | src/server.cpp | 2 |
6 files changed, 43 insertions, 16 deletions
diff --git a/src/client.cpp b/src/client.cpp index e47bce142..504297a6d 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -860,6 +860,25 @@ bool Client::loadMedia(const std::string &data, const std::string &filename) return true; } + const char *model_ext[] = { + ".b3d", ".md2", ".obj", + NULL + }; + name = removeStringEnd(filename, model_ext); + if(name != "") + { + verbosestream<<"Client: Storing model into Irrlicht: " + <<"file \""<<filename<<"\""<<std::endl; + + io::IFileSystem *irrfs = m_device->getFileSystem(); + + // Create an irrlicht memory file + io::IReadFile *rfile = irrfs->createMemoryReadFile(*data_rw, data_rw.getSize(), filename.c_str(), true); + assert(rfile); + //rfile->drop(); + return true; + } + errorstream<<"Client: Don't know how to load file \"" <<filename<<"\""<<std::endl; return false; diff --git a/src/content_cao.cpp b/src/content_cao.cpp index c0be4e4cd..b3c0370b8 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -1060,16 +1060,26 @@ public: { if(m_prop.visual == "mesh") { - // fallback texture - if(m_prop.texture == "") - m_prop.texture = "unknown_block.png"; - video::IVideoDriver* driver = m_animated_meshnode->getSceneManager()->getVideoDriver(); - m_animated_meshnode->setMaterialTexture(0, driver->getTexture(m_prop.texture.c_str())); - - // Set material flags and texture - video::SMaterial& material = m_animated_meshnode->getMaterial(0); - material.setFlag(video::EMF_LIGHTING, false); - material.setFlag(video::EMF_BILINEAR_FILTER, false); + for (u32 i = 0; i < m_prop.textures.size(); ++i) + { + std::string texturestring = m_prop.textures[i]; + if(texturestring == "") + continue; // Empty texture string means don't modify that material + texturestring += mod; + video::IVideoDriver* driver = m_animated_meshnode->getSceneManager()->getVideoDriver(); + video::ITexture* texture = driver->getTexture(texturestring.c_str()); + if(!texture) + { + errorstream<<"GenericCAO::updateTextures(): Could not load texture "<<texturestring<<std::endl; + continue; + } + + // Set material flags and texture + m_animated_meshnode->setMaterialTexture(i, texture); + video::SMaterial& material = m_animated_meshnode->getMaterial(i); + material.setFlag(video::EMF_LIGHTING, false); + material.setFlag(video::EMF_BILINEAR_FILTER, false); + } } } if(m_meshnode) diff --git a/src/object_properties.cpp b/src/object_properties.cpp index 3a36addc7..c91384ada 100644 --- a/src/object_properties.cpp +++ b/src/object_properties.cpp @@ -31,7 +31,6 @@ ObjectProperties::ObjectProperties(): collisionbox(-0.5,-0.5,-0.5, 0.5,0.5,0.5), visual("sprite"), mesh(""), - texture(""), visual_size(1,1), spritediv(1,1), initial_sprite_basepos(0,0), @@ -51,7 +50,6 @@ std::string ObjectProperties::dump() os<<", collisionbox="<<PP(collisionbox.MinEdge)<<","<<PP(collisionbox.MaxEdge); os<<", visual="<<visual; os<<", mesh="<<mesh; - os<<", texture="<<texture; os<<", visual_size="<<PP2(visual_size); os<<", textures=["; for(u32 i=0; i<textures.size(); i++){ @@ -76,7 +74,6 @@ void ObjectProperties::serialize(std::ostream &os) const writeV3F1000(os, collisionbox.MaxEdge); os<<serializeString(visual); os<<serializeString(mesh); - os<<serializeString(texture); writeV2F1000(os, visual_size); writeU16(os, textures.size()); for(u32 i=0; i<textures.size(); i++){ @@ -101,7 +98,6 @@ void ObjectProperties::deSerialize(std::istream &is) collisionbox.MaxEdge = readV3F1000(is); visual = deSerializeString(is); mesh = deSerializeString(is); - texture = deSerializeString(is); visual_size = readV2F1000(is); textures.clear(); u32 texture_count = readU16(is); diff --git a/src/object_properties.h b/src/object_properties.h index f60ecefa4..48240e6ea 100644 --- a/src/object_properties.h +++ b/src/object_properties.h @@ -33,7 +33,6 @@ struct ObjectProperties core::aabbox3d<f32> collisionbox; std::string visual; std::string mesh; - std::string texture; v2f visual_size; core::array<std::string> textures; v2s16 spritediv; diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index 7eda636e3..9293e2b65 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -938,7 +938,6 @@ static void read_object_properties(lua_State *L, int index, getstringfield(L, -1, "visual", prop->visual); getstringfield(L, -1, "mesh", prop->mesh); - getstringfield(L, -1, "texture", prop->texture); lua_getfield(L, -1, "visual_size"); if(lua_istable(L, -1)) @@ -6591,6 +6590,8 @@ void scriptapi_luaentity_get_properties(lua_State *L, u16 id, lua_pop(L, 1); getstringfield(L, -1, "visual", prop->visual); + + getstringfield(L, -1, "mesh", prop->mesh); // Deprecated: read object properties directly read_object_properties(L, -1, prop); diff --git a/src/server.cpp b/src/server.cpp index 2da9cbe24..92fd567e5 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -4029,6 +4029,7 @@ void Server::fillMediaCache() paths.push_back(mod.path + DIR_DELIM + "textures"); paths.push_back(mod.path + DIR_DELIM + "sounds"); paths.push_back(mod.path + DIR_DELIM + "media"); + paths.push_back(mod.path + DIR_DELIM + "models"); } std::string path_all = "textures"; paths.push_back(path_all + DIR_DELIM + "all"); @@ -4054,6 +4055,7 @@ void Server::fillMediaCache() ".png", ".jpg", ".bmp", ".tga", ".pcx", ".ppm", ".psd", ".wal", ".rgb", ".ogg", + ".b3d", ".md2", ".obj", NULL }; if(removeStringEnd(filename, supported_ext) == ""){ |