From: sapier Date: Sun, 15 Jan 2012 19:22:41 +0000 (+0100) Subject: added plantlike luaentity X-Git-Tag: sapier-20120115~7 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=f0679969b2d512c0093c31608172425a2ac0f740;p=oweals%2Fminetest.git added plantlike luaentity --- diff --git a/src/content_cao.cpp b/src/content_cao.cpp index d581b35dc..76f23082d 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -1802,6 +1802,15 @@ public: m_meshnode = smgr->addMeshSceneNode(mesh, NULL); mesh->drop(); + m_meshnode->setScale(v3f(1)); + // Will be shown when we know the brightness + m_meshnode->setVisible(false); + } else if (m_prop->visual == "plant") { + infostream<<"LuaEntityCAO::addToScene(): plant"<addMeshSceneNode(mesh, NULL); + mesh->drop(); + m_meshnode->setScale(v3f(1)); // Will be shown when we know the brightness m_meshnode->setVisible(false); @@ -1957,26 +1966,51 @@ public: tsrc->getTextureRaw(texturestring)); } if(m_meshnode){ - for (u32 i = 0; i < 6; ++i) - { - std::string texturestring = "unknown_block.png"; - if(m_prop->textures.size() > i) - texturestring = m_prop->textures[i]; - texturestring += mod; - AtlasPointer ap = tsrc->getTexture(texturestring); - - // Get the tile texture and atlas transformation - video::ITexture* atlas = ap.atlas; - v2f pos = ap.pos; - v2f size = ap.size; - - // Set material flags and texture - video::SMaterial& material = m_meshnode->getMaterial(i); - material.setFlag(video::EMF_LIGHTING, false); - material.setFlag(video::EMF_BILINEAR_FILTER, false); - material.setTexture(0, atlas); - material.getTextureMatrix(0).setTextureTranslate(pos.X, pos.Y); - material.getTextureMatrix(0).setTextureScale(size.X, size.Y); + if (m_prop->visual == "plant") { + for (u32 i = 0; i < 4; ++i) { + std::string texturestring = "unknown_block.png"; + if(m_prop->textures.size() > 0) + texturestring = m_prop->textures[0]; + texturestring += mod; + AtlasPointer ap = tsrc->getTexture(texturestring); + + // Get the tile texture and atlas transformation + video::ITexture* atlas = ap.atlas; + v2f pos = ap.pos; + v2f size = ap.size; + + // Set material flags and texture + video::SMaterial& material = m_meshnode->getMaterial(i); + material.setFlag(video::EMF_LIGHTING, false); + material.setFlag(video::EMF_BILINEAR_FILTER, false); + material.setTexture(0, atlas); + material.getTextureMatrix(0).setTextureTranslate(pos.X, pos.Y); + material.getTextureMatrix(0).setTextureScale(size.X, size.Y); + material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; + } + } + else { + for (u32 i = 0; i < 6; ++i) { + std::string texturestring = "unknown_block.png"; + if(m_prop->textures.size() > i) + texturestring = m_prop->textures[i]; + texturestring += mod; + AtlasPointer ap = tsrc->getTexture(texturestring); + + // Get the tile texture and atlas transformation + video::ITexture* atlas = ap.atlas; + v2f pos = ap.pos; + v2f size = ap.size; + + // Set material flags and texture + video::SMaterial& material = m_meshnode->getMaterial(i); + material.setFlag(video::EMF_LIGHTING, false); + material.setFlag(video::EMF_BILINEAR_FILTER, false); + material.setTexture(0, atlas); + material.getTextureMatrix(0).setTextureTranslate(pos.X, pos.Y); + material.getTextureMatrix(0).setTextureScale(size.X, size.Y); + material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; + } } } } diff --git a/src/mesh.cpp b/src/mesh.cpp index 1d347a09f..8b9668593 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -82,6 +82,52 @@ scene::IAnimatedMesh* createCubeMesh(v3f scale) return anim_mesh; } +scene::IAnimatedMesh* createPlantMesh(v3f scale) +{ + video::SColor c(255,255,255,255); + video::S3DVertex vertices[16] = + { + // Plane 1 Front + video::S3DVertex(-0.5,-0.5,-0.5, 0.5,0,-0.5, c, 0,1), + video::S3DVertex(-0.5,+0.5,-0.5, 0.5,0,-0.5, c, 0,0), + video::S3DVertex(+0.5,+0.5,+0.5, 0.5,0,-0.5, c, 1,0), + video::S3DVertex(+0.5,-0.5,+0.5, 0.5,0,-0.5, c, 1,1), + // Plane 1 Back + video::S3DVertex(+0.5,-0.5,+0.5, -0.5,0,0.5, c, 1,1), + video::S3DVertex(+0.5,+0.5,+0.5, -0.5,0,0.5, c, 1,0), + video::S3DVertex(-0.5,+0.5,-0.5, -0.5,0,0.5, c, 0,0), + video::S3DVertex(-0.5,-0.5,-0.5, -0.5,0,0.5, c, 0,1), + + // Plane 2 Front + video::S3DVertex(-0.5,-0.5,+0.5, -0.5,0,-0.5, c, 1,1), + video::S3DVertex(-0.5,+0.5,+0.5, -0.5,0,-0.5, c, 1,0), + video::S3DVertex(+0.5,+0.5,-0.5, -0.5,0,-0.5, c, 0,0), + video::S3DVertex(+0.5,-0.5,-0.5, -0.5,0,-0.5, c, 0,1), + + // Plane 2 Back + video::S3DVertex(+0.5,-0.5,-0.5, 0.5,0,0.5, c, 0,1), + video::S3DVertex(+0.5,+0.5,-0.5, 0.5,0,0.5, c, 0,0), + video::S3DVertex(-0.5,+0.5,+0.5, 0.5,0,0.5, c, 1,0), + video::S3DVertex(-0.5,-0.5,+0.5, 0.5,0,0.5, c, 1,1) + + }; + + u16 indices[6] = {0,1,2,2,3,0}; + + scene::SMesh *mesh = new scene::SMesh(); + for (u32 i=0; i<4; ++i) + { + scene::IMeshBuffer *buf = new scene::SMeshBuffer(); + buf->append(vertices + 4 * i, 4, indices, 6); + mesh->addMeshBuffer(buf); + buf->drop(); + } + scene::SAnimatedMesh *anim_mesh = new scene::SAnimatedMesh(mesh); + mesh->drop(); + scaleMesh(anim_mesh, scale); // also recalculates bounding box + return anim_mesh; +} + static scene::IAnimatedMesh* extrudeARGB(u32 twidth, u32 theight, u8 *data) { const s32 argb_wstep = 4 * twidth; diff --git a/src/mesh.h b/src/mesh.h index 33e072927..d9268267b 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -41,6 +41,16 @@ scene::IAnimatedMesh* createCubeMesh(v3f scale); scene::IAnimatedMesh* createExtrudedMesh(video::ITexture *texture, video::IVideoDriver *driver, v3f scale); + +/* + Create a new cube mesh. + Vertices are at (+-scale.X/2, +-scale.Y/2, +-scale.Z/2). + + The resulting mesh has 6 materials (up, down, right, left, back, front) + which must be defined by the caller. +*/ +scene::IAnimatedMesh* createPlantMesh(v3f scale); + /* Multiplies each vertex coordinate by the specified scaling factors (componentwise vector multiplication).