aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/content_cao.cpp74
-rw-r--r--src/mesh.cpp46
-rw-r--r--src/mesh.h10
3 files changed, 110 insertions, 20 deletions
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
@@ -1805,6 +1805,15 @@ public:
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"<<std::endl;
+ scene::IMesh *mesh = createPlantMesh(v3f(BS,BS,BS));
+ 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 {
infostream<<"LuaEntityCAO::addToScene(): \""<<m_prop->visual
<<"\" not supported"<<std::endl;
@@ -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).