Properly read the mesh from LUA.
authorMirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>
Tue, 23 Oct 2012 17:03:06 +0000 (20:03 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sun, 25 Nov 2012 16:14:14 +0000 (18:14 +0200)
Players can now be set to meshes using the following test script:

function switch_player_visual()
prop = {
mesh="player.obj",
texture="player.png",
visual="mesh",
}
for _, obj in pairs(minetest.get_connected_players()) do
obj:set_properties(prop)
end
minetest.after(1.0, switch_player_visual)
end
minetest.after(1.0, switch_player_visual)

src/content_cao.cpp
src/content_sao.cpp
src/object_properties.cpp
src/scriptapi.cpp

index e177fa15cbe8fa71781cb6aa4669646e0ddc214d..985f3cbbde0d34d75f0c8385d2b963c373070245 100644 (file)
@@ -802,14 +802,18 @@ public:
                else if(m_prop.visual == "mesh"){
                        infostream<<"GenericCAO::addToScene(): mesh"<<std::endl;
                        scene::IAnimatedMesh *mesh = smgr->getMesh(m_prop.mesh.c_str());
-                       m_animated_meshnode = smgr->addAnimatedMeshSceneNode(mesh, NULL);
-                       mesh->drop();
-                       
-                       m_animated_meshnode->setScale(v3f(m_prop.visual_size.X,
-                                       m_prop.visual_size.Y,
-                                       m_prop.visual_size.X));
-                       u8 li = m_last_light;
-                       setMeshColor(m_animated_meshnode->getMesh(), video::SColor(255,li,li,li));
+                       if(mesh)
+                       {
+                               m_animated_meshnode = smgr->addAnimatedMeshSceneNode(mesh, NULL);
+                               
+                               m_animated_meshnode->setScale(v3f(m_prop.visual_size.X,
+                                               m_prop.visual_size.Y,
+                                               m_prop.visual_size.X));
+                               u8 li = m_last_light;
+                               setMeshColor(m_animated_meshnode->getMesh(), video::SColor(255,li,li,li));
+                       }
+                       else
+                               errorstream<<"GenericCAO::addToScene(): Could not load mesh "<<m_prop.mesh<<std::endl;
                }
                else if(m_prop.visual == "wielditem"){
                        infostream<<"GenericCAO::addToScene(): node"<<std::endl;
index a372b986fa879143d9f773afe8583c75f6dabd1e..6c2abf8f6b3a7e91f253dbed26ff7e90ae945a73 100644 (file)
@@ -783,14 +783,14 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
        m_prop.weight = 75;
        m_prop.collisionbox = core::aabbox3d<f32>(-1/3.,-1.0,-1/3., 1/3.,1.0,1/3.);
        // start of default appearance, this should be overwritten by LUA
-       m_prop.visual = "upright-sprite";
+       m_prop.visual = "upright_sprite";
        m_prop.visual_size = v2f(1, 2);
        m_prop.textures.clear();
        m_prop.textures.push_back("player.png");
        m_prop.textures.push_back("player_back.png");
        m_prop.spritediv = v2s16(1,1);
        // end of default appearance
-       m_prop.is_visible = (getHP() != 0);
+       m_prop.is_visible = (getHP() != 0); // TODO: Use a death animation instead for mesh players
        m_prop.makes_footstep_sound = true;
 }
 
@@ -1138,7 +1138,6 @@ void PlayerSAO::disconnected()
        }
 }
 
-
 std::string PlayerSAO::getPropertyPacket()
 {
        m_prop.is_visible = (getHP() != 0);
index e67b78b520974667bb26c0de836e93e93b144132..3a36addc75e57265f4a761bfb7552f21bacac3a2 100644 (file)
@@ -30,6 +30,8 @@ ObjectProperties::ObjectProperties():
        weight(5),
        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),
@@ -48,6 +50,8 @@ std::string ObjectProperties::dump()
        os<<", weight="<<weight;
        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++){
@@ -71,6 +75,8 @@ void ObjectProperties::serialize(std::ostream &os) const
        writeV3F1000(os, collisionbox.MinEdge);
        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++){
@@ -94,6 +100,8 @@ void ObjectProperties::deSerialize(std::istream &is)
        collisionbox.MinEdge = readV3F1000(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);
index 09900ce1f664ab3ba8d272e84c8c8fbc81ba8ee3..7eda636e39163aa26bc769695d410858a5a7924c 100644 (file)
@@ -936,6 +936,9 @@ static void read_object_properties(lua_State *L, int index,
        lua_pop(L, 1);
 
        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))