summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsfan5 <sfan5@live.de>2020-07-30 17:39:57 +0200
committerGitHub <noreply@github.com>2020-07-30 17:39:57 +0200
commit9bba52c4000a06043f5100dbb0ef66d869707ffc (patch)
tree36d5ac4a64a03a72f17192821611d3045fa50d33 /src
parente5725dfb8e476a5a6f63f020a23a53ca3ef610e9 (diff)
downloadminetest-9bba52c4000a06043f5100dbb0ef66d869707ffc.tar.gz
minetest-9bba52c4000a06043f5100dbb0ef66d869707ffc.tar.bz2
minetest-9bba52c4000a06043f5100dbb0ef66d869707ffc.zip
content_cao: Support texture animation for upright_sprite (#10020)
Diffstat (limited to 'src')
-rw-r--r--src/client/content_cao.cpp28
-rw-r--r--src/client/mesh.cpp9
-rw-r--r--src/client/mesh.h7
3 files changed, 41 insertions, 3 deletions
diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp
index 4f949f6b0..88688d18c 100644
--- a/src/client/content_cao.cpp
+++ b/src/client/content_cao.cpp
@@ -1176,6 +1176,7 @@ void GenericCAO::updateTexturePos()
int row = m_tx_basepos.Y;
int col = m_tx_basepos.X;
+ // Yawpitch goes rightwards
if (m_tx_select_horiz_by_yawpitch) {
if (cam_to_entity.Y > 0.75)
col += 5;
@@ -1206,6 +1207,27 @@ void GenericCAO::updateTexturePos()
float tys = m_tx_size.Y;
setBillboardTextureMatrix(m_spritenode, txs, tys, col, row);
}
+
+ else if (m_meshnode) {
+ if (m_prop.visual == "upright_sprite") {
+ int row = m_tx_basepos.Y;
+ int col = m_tx_basepos.X;
+
+ // Animation goes downwards
+ row += m_anim_frame;
+
+ const auto &tx = m_tx_size;
+ v2f t[4] = { // cf. vertices in GenericCAO::addToScene()
+ tx * v2f(col+1, row+1),
+ tx * v2f(col, row+1),
+ tx * v2f(col, row),
+ tx * v2f(col+1, row),
+ };
+ auto mesh = m_meshnode->getMesh();
+ setMeshBufferTextureCoords(mesh->getMeshBuffer(0), t, 4);
+ setMeshBufferTextureCoords(mesh->getMeshBuffer(1), t, 4);
+ }
+ }
}
// Do not pass by reference, see header.
@@ -1247,7 +1269,7 @@ void GenericCAO::updateTextures(std::string mod)
}
}
- if (m_animated_meshnode) {
+ else if (m_animated_meshnode) {
if (m_prop.visual == "mesh") {
for (u32 i = 0; i < m_prop.textures.size() &&
i < m_animated_meshnode->getMaterialCount(); ++i) {
@@ -1296,8 +1318,8 @@ void GenericCAO::updateTextures(std::string mod)
}
}
}
- if(m_meshnode)
- {
+
+ else if (m_meshnode) {
if(m_prop.visual == "cube")
{
for (u32 i = 0; i < 6; ++i)
diff --git a/src/client/mesh.cpp b/src/client/mesh.cpp
index e1ec22068..2400a374c 100644
--- a/src/client/mesh.cpp
+++ b/src/client/mesh.cpp
@@ -203,6 +203,15 @@ void setMeshColor(scene::IMesh *mesh, const video::SColor &color)
setMeshBufferColor(mesh->getMeshBuffer(j), color);
}
+void setMeshBufferTextureCoords(scene::IMeshBuffer *buf, const v2f *uv, u32 count)
+{
+ const u32 stride = getVertexPitchFromType(buf->getVertexType());
+ assert(buf->getVertexCount() >= count);
+ u8 *vertices = (u8 *) buf->getVertices();
+ for (u32 i = 0; i < count; i++)
+ ((video::S3DVertex*) (vertices + i * stride))->TCoords = uv[i];
+}
+
template <typename F>
static void applyToMesh(scene::IMesh *mesh, const F &fn)
{
diff --git a/src/client/mesh.h b/src/client/mesh.h
index 103c61e45..dbc091a06 100644
--- a/src/client/mesh.h
+++ b/src/client/mesh.h
@@ -58,6 +58,13 @@ void setMeshBufferColor(scene::IMeshBuffer *buf, const video::SColor &color);
*/
void setMeshColor(scene::IMesh *mesh, const video::SColor &color);
+
+/*
+ Sets texture coords for vertices in the mesh buffer.
+ `uv[]` must have `count` elements
+*/
+void setMeshBufferTextureCoords(scene::IMeshBuffer *buf, const v2f *uv, u32 count);
+
/*
Set a constant color for an animated mesh
*/