Add a subfolder for models and transfer models from server to client

(obj, md2 and md3 are currently allowed)

Get rid of the texture string and use the existing textures array. Segmented meshes have multiple materials, and this will allow us to texture each. Do not switch to this commit yet!

If a texture string is left empty in LUA, don't modify that material. Useful so a script can change specific textures without affecting others
This commit is contained in:
MirceaKitsune 2012-10-24 00:11:24 +03:00 committed by Perttu Ahola
parent cb40b3517a
commit f9675bd2b4
6 changed files with 42 additions and 15 deletions

@ -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;

@ -1060,18 +1060,28 @@ public:
{
if(m_prop.visual == "mesh")
{
// fallback texture
if(m_prop.texture == "")
m_prop.texture = "unknown_block.png";
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();
m_animated_meshnode->setMaterialTexture(0, driver->getTexture(m_prop.texture.c_str()));
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
video::SMaterial& material = m_animated_meshnode->getMaterial(0);
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)
{
if(m_prop.visual == "cube")

@ -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);

@ -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;

@ -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))
@ -6592,6 +6591,8 @@ void scriptapi_luaentity_get_properties(lua_State *L, u16 id,
getstringfield(L, -1, "visual", prop->visual);
getstringfield(L, -1, "mesh", prop->mesh);
// Deprecated: read object properties directly
read_object_properties(L, -1, prop);

@ -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) == ""){