mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 10:03:45 +01:00
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:
parent
cb40b3517a
commit
f9675bd2b4
@ -860,6 +860,25 @@ bool Client::loadMedia(const std::string &data, const std::string &filename)
|
|||||||
return true;
|
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 \""
|
errorstream<<"Client: Don't know how to load file \""
|
||||||
<<filename<<"\""<<std::endl;
|
<<filename<<"\""<<std::endl;
|
||||||
return false;
|
return false;
|
||||||
|
@ -1060,18 +1060,28 @@ public:
|
|||||||
{
|
{
|
||||||
if(m_prop.visual == "mesh")
|
if(m_prop.visual == "mesh")
|
||||||
{
|
{
|
||||||
// fallback texture
|
for (u32 i = 0; i < m_prop.textures.size(); ++i)
|
||||||
if(m_prop.texture == "")
|
{
|
||||||
m_prop.texture = "unknown_block.png";
|
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::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
|
// 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_LIGHTING, false);
|
||||||
material.setFlag(video::EMF_BILINEAR_FILTER, false);
|
material.setFlag(video::EMF_BILINEAR_FILTER, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if(m_meshnode)
|
if(m_meshnode)
|
||||||
{
|
{
|
||||||
if(m_prop.visual == "cube")
|
if(m_prop.visual == "cube")
|
||||||
|
@ -31,7 +31,6 @@ ObjectProperties::ObjectProperties():
|
|||||||
collisionbox(-0.5,-0.5,-0.5, 0.5,0.5,0.5),
|
collisionbox(-0.5,-0.5,-0.5, 0.5,0.5,0.5),
|
||||||
visual("sprite"),
|
visual("sprite"),
|
||||||
mesh(""),
|
mesh(""),
|
||||||
texture(""),
|
|
||||||
visual_size(1,1),
|
visual_size(1,1),
|
||||||
spritediv(1,1),
|
spritediv(1,1),
|
||||||
initial_sprite_basepos(0,0),
|
initial_sprite_basepos(0,0),
|
||||||
@ -51,7 +50,6 @@ std::string ObjectProperties::dump()
|
|||||||
os<<", collisionbox="<<PP(collisionbox.MinEdge)<<","<<PP(collisionbox.MaxEdge);
|
os<<", collisionbox="<<PP(collisionbox.MinEdge)<<","<<PP(collisionbox.MaxEdge);
|
||||||
os<<", visual="<<visual;
|
os<<", visual="<<visual;
|
||||||
os<<", mesh="<<mesh;
|
os<<", mesh="<<mesh;
|
||||||
os<<", texture="<<texture;
|
|
||||||
os<<", visual_size="<<PP2(visual_size);
|
os<<", visual_size="<<PP2(visual_size);
|
||||||
os<<", textures=[";
|
os<<", textures=[";
|
||||||
for(u32 i=0; i<textures.size(); i++){
|
for(u32 i=0; i<textures.size(); i++){
|
||||||
@ -76,7 +74,6 @@ void ObjectProperties::serialize(std::ostream &os) const
|
|||||||
writeV3F1000(os, collisionbox.MaxEdge);
|
writeV3F1000(os, collisionbox.MaxEdge);
|
||||||
os<<serializeString(visual);
|
os<<serializeString(visual);
|
||||||
os<<serializeString(mesh);
|
os<<serializeString(mesh);
|
||||||
os<<serializeString(texture);
|
|
||||||
writeV2F1000(os, visual_size);
|
writeV2F1000(os, visual_size);
|
||||||
writeU16(os, textures.size());
|
writeU16(os, textures.size());
|
||||||
for(u32 i=0; i<textures.size(); i++){
|
for(u32 i=0; i<textures.size(); i++){
|
||||||
@ -101,7 +98,6 @@ void ObjectProperties::deSerialize(std::istream &is)
|
|||||||
collisionbox.MaxEdge = readV3F1000(is);
|
collisionbox.MaxEdge = readV3F1000(is);
|
||||||
visual = deSerializeString(is);
|
visual = deSerializeString(is);
|
||||||
mesh = deSerializeString(is);
|
mesh = deSerializeString(is);
|
||||||
texture = deSerializeString(is);
|
|
||||||
visual_size = readV2F1000(is);
|
visual_size = readV2F1000(is);
|
||||||
textures.clear();
|
textures.clear();
|
||||||
u32 texture_count = readU16(is);
|
u32 texture_count = readU16(is);
|
||||||
|
@ -33,7 +33,6 @@ struct ObjectProperties
|
|||||||
core::aabbox3d<f32> collisionbox;
|
core::aabbox3d<f32> collisionbox;
|
||||||
std::string visual;
|
std::string visual;
|
||||||
std::string mesh;
|
std::string mesh;
|
||||||
std::string texture;
|
|
||||||
v2f visual_size;
|
v2f visual_size;
|
||||||
core::array<std::string> textures;
|
core::array<std::string> textures;
|
||||||
v2s16 spritediv;
|
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, "visual", prop->visual);
|
||||||
|
|
||||||
getstringfield(L, -1, "mesh", prop->mesh);
|
getstringfield(L, -1, "mesh", prop->mesh);
|
||||||
getstringfield(L, -1, "texture", prop->texture);
|
|
||||||
|
|
||||||
lua_getfield(L, -1, "visual_size");
|
lua_getfield(L, -1, "visual_size");
|
||||||
if(lua_istable(L, -1))
|
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, "visual", prop->visual);
|
||||||
|
|
||||||
|
getstringfield(L, -1, "mesh", prop->mesh);
|
||||||
|
|
||||||
// Deprecated: read object properties directly
|
// Deprecated: read object properties directly
|
||||||
read_object_properties(L, -1, prop);
|
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 + "textures");
|
||||||
paths.push_back(mod.path + DIR_DELIM + "sounds");
|
paths.push_back(mod.path + DIR_DELIM + "sounds");
|
||||||
paths.push_back(mod.path + DIR_DELIM + "media");
|
paths.push_back(mod.path + DIR_DELIM + "media");
|
||||||
|
paths.push_back(mod.path + DIR_DELIM + "models");
|
||||||
}
|
}
|
||||||
std::string path_all = "textures";
|
std::string path_all = "textures";
|
||||||
paths.push_back(path_all + DIR_DELIM + "all");
|
paths.push_back(path_all + DIR_DELIM + "all");
|
||||||
@ -4054,6 +4055,7 @@ void Server::fillMediaCache()
|
|||||||
".png", ".jpg", ".bmp", ".tga",
|
".png", ".jpg", ".bmp", ".tga",
|
||||||
".pcx", ".ppm", ".psd", ".wal", ".rgb",
|
".pcx", ".ppm", ".psd", ".wal", ".rgb",
|
||||||
".ogg",
|
".ogg",
|
||||||
|
".b3d", ".md2", ".obj",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
if(removeStringEnd(filename, supported_ext) == ""){
|
if(removeStringEnd(filename, supported_ext) == ""){
|
||||||
|
Loading…
Reference in New Issue
Block a user