summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client.cpp19
-rw-r--r--src/content_cao.cpp30
-rw-r--r--src/object_properties.cpp4
-rw-r--r--src/object_properties.h1
-rw-r--r--src/scriptapi.cpp3
-rw-r--r--src/server.cpp2
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) == ""){