From 3454e6779337d8523ae76c7fa16eb8c565aa2381 Mon Sep 17 00:00:00 2001 From: sapier Date: Sun, 15 Jan 2012 20:30:26 +0100 Subject: [PATCH] added new entity style irregular_cube --- src/content_cao.cpp | 9 ++++++++ src/mesh.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++++ src/mesh.h | 9 ++++++++ 3 files changed, 71 insertions(+) diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 76f23082d..83f1cedff 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -1811,6 +1811,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 == "cube_disorted") { + infostream<<"LuaEntityCAO::addToScene(): irregular_cube"<collisionbox); + 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); diff --git a/src/mesh.cpp b/src/mesh.cpp index 8b9668593..c0b1419d4 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -82,6 +82,59 @@ scene::IAnimatedMesh* createCubeMesh(v3f scale) return anim_mesh; } +scene::IAnimatedMesh* createCubeMesh(v3f scale,core::aabbox3d box) +{ + video::SColor c(255,255,255,255); + video::S3DVertex vertices[24] = + { + // Up + video::S3DVertex(box.MinEdge.X,box.MaxEdge.Y,box.MinEdge.Z, 0,1,0, c, 0,1), + video::S3DVertex(box.MinEdge.X,box.MaxEdge.Y,box.MaxEdge.Z, 0,1,0, c, 0,0), + video::S3DVertex(box.MaxEdge.X,box.MaxEdge.Y,box.MaxEdge.Z, 0,1,0, c, 1,0), + video::S3DVertex(box.MaxEdge.X,box.MaxEdge.Y,box.MinEdge.Z, 0,1,0, c, 1,1), + // Down + video::S3DVertex(box.MinEdge.X,box.MinEdge.Y,box.MinEdge.Z, 0,-1,0, c, 0,0), + video::S3DVertex(box.MaxEdge.X,box.MinEdge.Y,box.MinEdge.Z, 0,-1,0, c, 1,0), + video::S3DVertex(box.MaxEdge.X,box.MinEdge.Y,box.MaxEdge.Z, 0,-1,0, c, 1,1), + video::S3DVertex(box.MinEdge.X,box.MinEdge.Y,box.MaxEdge.Z, 0,-1,0, c, 0,1), + // Right + video::S3DVertex(box.MaxEdge.X,box.MinEdge.Y,box.MinEdge.Z, 1,0,0, c, 0,1), + video::S3DVertex(box.MaxEdge.X,box.MaxEdge.Y,box.MinEdge.Z, 1,0,0, c, 0,0), + video::S3DVertex(box.MaxEdge.X,box.MaxEdge.Y,box.MaxEdge.Z, 1,0,0, c, 1,0), + video::S3DVertex(box.MaxEdge.X,box.MinEdge.Y,box.MaxEdge.Z, 1,0,0, c, 1,1), + // Left + video::S3DVertex(box.MinEdge.X,box.MinEdge.Y,box.MinEdge.Z, -1,0,0, c, 1,1), + video::S3DVertex(box.MinEdge.X,box.MinEdge.Y,box.MaxEdge.Z, -1,0,0, c, 0,1), + video::S3DVertex(box.MinEdge.X,box.MaxEdge.Y,box.MaxEdge.Z, -1,0,0, c, 0,0), + video::S3DVertex(box.MinEdge.X,box.MaxEdge.Y,box.MinEdge.Z, -1,0,0, c, 1,0), + // Back + video::S3DVertex(box.MinEdge.X,box.MinEdge.Y,box.MaxEdge.Z, 0,0,1, c, 1,1), + video::S3DVertex(box.MaxEdge.X,box.MinEdge.Y,box.MaxEdge.Z, 0,0,1, c, 0,1), + video::S3DVertex(box.MaxEdge.X,box.MaxEdge.Y,box.MaxEdge.Z, 0,0,1, c, 0,0), + video::S3DVertex(box.MinEdge.X,box.MaxEdge.Y,box.MaxEdge.Z, 0,0,1, c, 1,0), + // Front + video::S3DVertex(box.MinEdge.X,box.MinEdge.Y,box.MinEdge.Z, 0,0,-1, c, 0,1), + video::S3DVertex(box.MinEdge.X,box.MaxEdge.Y,box.MinEdge.Z, 0,0,-1, c, 0,0), + video::S3DVertex(box.MaxEdge.X,box.MaxEdge.Y,box.MinEdge.Z, 0,0,-1, c, 1,0), + video::S3DVertex(box.MaxEdge.X,box.MinEdge.Y,box.MinEdge.Z, 0,0,-1, c, 1,1), + }; + + u16 indices[6] = {0,1,2,2,3,0}; + + scene::SMesh *mesh = new scene::SMesh(); + for (u32 i=0; i<6; ++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; +} + scene::IAnimatedMesh* createPlantMesh(v3f scale) { video::SColor c(255,255,255,255); diff --git a/src/mesh.h b/src/mesh.h index 78c0dc1e7..b22ccc318 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -31,6 +31,15 @@ with this program; if not, write to the Free Software Foundation, Inc., */ scene::IAnimatedMesh* createCubeMesh(v3f scale); +/* + Create a new cube mesh not linked to mapnode size. + Vertices are defined by given box. + + The resulting mesh has 6 materials (up, down, right, left, back, front) + which must be defined by the caller. +*/ +scene::IAnimatedMesh* createCubeMesh(v3f scale,core::aabbox3d box); + /* Create a new extruded mesh from a texture. Maximum bounding box is (+-scale.X/2, +-scale.Y/2, +-scale.Z). -- 2.25.1