content_cao: Support texture animation for upright_sprite (#10020)

This commit is contained in:
sfan5 2020-07-30 17:39:57 +02:00 committed by GitHub
parent e5725dfb8e
commit 9bba52c400
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 64 additions and 14 deletions

@ -6077,15 +6077,15 @@ object you are working with still exists.
* `get_yaw()`: returns number in radians * `get_yaw()`: returns number in radians
* `set_texture_mod(mod)` * `set_texture_mod(mod)`
* `get_texture_mod()` returns current texture modifier * `get_texture_mod()` returns current texture modifier
* `set_sprite(p, num_frames, framelength, select_horiz_by_yawpitch)` * `set_sprite(p, num_frames, framelength, select_x_by_camera)`
* Select sprite from spritesheet with optional animation and Dungeon Master * Specifies and starts a sprite animation
style texture selection based on yaw relative to camera * Animations iterate along the frame `y` position.
* `p`: {x=number, y=number}, the coordinate of the first frame * `p`: {x=column number, y=row number}, the coordinate of the first frame
(x: column, y: row), default: `{x=0, y=0}` default: `{x=0, y=0}`
* `num_frames`: number, default: `1` * `num_frames`: Total frames in the texture, default: `1`
* `framelength`: number, default: `0.2` * `framelength`: Time per animated frame in seconds, default: `0.2`
* `select_horiz_by_yawpitch`: boolean, this was once used for the Dungeon * `select_x_by_camera`: Only for visual = `sprite`. Changes the frame `x`
Master mob, default: `false` position according to the view direction. default: `false`.
* `get_entity_name()` (**Deprecated**: Will be removed in a future version) * `get_entity_name()` (**Deprecated**: Will be removed in a future version)
* `get_luaentity()` * `get_luaentity()`

@ -68,7 +68,7 @@ minetest.register_entity("testentities:mesh_unshaded", {
-- Advanced visual tests -- Advanced visual tests
-- A test entity for testing animated and yaw-modulated sprites -- An entity for testing animated and yaw-modulated sprites
minetest.register_entity("testentities:yawsprite", { minetest.register_entity("testentities:yawsprite", {
initial_properties = { initial_properties = {
selectionbox = {-0.3, -0.5, -0.3, 0.3, 0.3, 0.3}, selectionbox = {-0.3, -0.5, -0.3, 0.3, 0.3, 0.3},
@ -79,6 +79,18 @@ minetest.register_entity("testentities:yawsprite", {
initial_sprite_basepos = {x=0, y=0}, initial_sprite_basepos = {x=0, y=0},
}, },
on_activate = function(self, staticdata) on_activate = function(self, staticdata)
self.object:set_sprite({x=0, y=0}, 1, 0, true) self.object:set_sprite({x=0, y=0}, 3, 0.5, true)
end,
})
-- An entity for testing animated upright sprites
minetest.register_entity("testentities:upright_animated", {
initial_properties = {
visual = "upright_sprite",
textures = {"testnodes_anim.png"},
spritediv = {x = 1, y = 4},
},
on_activate = function(self)
self.object:set_sprite({x=0, y=0}, 4, 1.0, false)
end, end,
}) })

@ -1176,6 +1176,7 @@ void GenericCAO::updateTexturePos()
int row = m_tx_basepos.Y; int row = m_tx_basepos.Y;
int col = m_tx_basepos.X; int col = m_tx_basepos.X;
// Yawpitch goes rightwards
if (m_tx_select_horiz_by_yawpitch) { if (m_tx_select_horiz_by_yawpitch) {
if (cam_to_entity.Y > 0.75) if (cam_to_entity.Y > 0.75)
col += 5; col += 5;
@ -1206,6 +1207,27 @@ void GenericCAO::updateTexturePos()
float tys = m_tx_size.Y; float tys = m_tx_size.Y;
setBillboardTextureMatrix(m_spritenode, txs, tys, col, row); 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. // 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") { if (m_prop.visual == "mesh") {
for (u32 i = 0; i < m_prop.textures.size() && for (u32 i = 0; i < m_prop.textures.size() &&
i < m_animated_meshnode->getMaterialCount(); ++i) { 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") if(m_prop.visual == "cube")
{ {
for (u32 i = 0; i < 6; ++i) for (u32 i = 0; i < 6; ++i)

@ -203,6 +203,15 @@ void setMeshColor(scene::IMesh *mesh, const video::SColor &color)
setMeshBufferColor(mesh->getMeshBuffer(j), 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> template <typename F>
static void applyToMesh(scene::IMesh *mesh, const F &fn) static void applyToMesh(scene::IMesh *mesh, const F &fn)
{ {

@ -58,6 +58,13 @@ void setMeshBufferColor(scene::IMeshBuffer *buf, const video::SColor &color);
*/ */
void setMeshColor(scene::IMesh *mesh, 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 Set a constant color for an animated mesh
*/ */