mirror of
https://github.com/minetest/minetest.git
synced 2024-12-29 20:20:29 +01:00
content_cao: Support texture animation for upright_sprite (#10020)
This commit is contained in:
parent
e5725dfb8e
commit
9bba52c400
@ -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
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user