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;
{
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)
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),
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++){
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++){
collisionbox.MaxEdge = readV3F1000(is);
visual = deSerializeString(is);
mesh = deSerializeString(is);
- texture = deSerializeString(is);
visual_size = readV2F1000(is);
textures.clear();
u32 texture_count = readU16(is);
core::aabbox3d<f32> collisionbox;
std::string visual;
std::string mesh;
- std::string texture;
v2f visual_size;
core::array<std::string> textures;
v2s16 spritediv;
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))
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);
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");
".png", ".jpg", ".bmp", ".tga",
".pcx", ".ppm", ".psd", ".wal", ".rgb",
".ogg",
+ ".b3d", ".md2", ".obj",
NULL
};
if(removeStringEnd(filename, supported_ext) == ""){