From 32143b8bb4072c85ff0552516907dffe7ae43f9b Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Tue, 15 Apr 2014 12:32:04 +0000 Subject: [PATCH] scene: allow to rotate sprites around the Z axis. --- demos/tutorial/06_sprite.cpp | 2 +- src/emitter.cpp | 2 +- src/font.cpp | 2 +- src/scene.cpp | 6 ++++-- src/scene.h | 2 +- src/sprite.cpp | 2 +- src/tileset.cpp | 4 +++- src/tileset.h | 2 +- 8 files changed, 13 insertions(+), 9 deletions(-) diff --git a/demos/tutorial/06_sprite.cpp b/demos/tutorial/06_sprite.cpp index fa56caba..bd73a579 100644 --- a/demos/tutorial/06_sprite.cpp +++ b/demos/tutorial/06_sprite.cpp @@ -78,7 +78,7 @@ public: int frame = (int)(m_sprites[i].m2 * FRAME_COUNT); // m_sprites[i].m1.z = frame; g_scene->AddTile(m_tileset, frame, - (ivec3)m_sprites[i].m1, 0, vec2(2.f)); + (ivec3)m_sprites[i].m1, 0, vec2(2.f), 0.f); } } diff --git a/src/emitter.cpp b/src/emitter.cpp index 55e85e38..31dfaebc 100644 --- a/src/emitter.cpp +++ b/src/emitter.cpp @@ -74,7 +74,7 @@ void Emitter::TickDraw(float seconds) for (int i = 0; i < data->nparticles; i++) g_scene->AddTile(data->tileset, data->particles[i], - data->positions[i], 0, vec2(1.0f)); + data->positions[i], 0, vec2(1.0f), 0.0f); } void Emitter::AddParticle(int id, vec3 pos, vec3 vel) diff --git a/src/font.cpp b/src/font.cpp index ae4e9e2c..dd99a0da 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -89,7 +89,7 @@ void Font::Print(vec3 pos, char const *str, vec2 scale) break; default: if (ch != ' ') - g_scene->AddTile(data->tileset, ch & 255, pos, 0, scale); + g_scene->AddTile(data->tileset, ch & 255, pos, 0, scale, 0.0f); pos.x += data->size.x * scale.x; break; } diff --git a/src/scene.cpp b/src/scene.cpp index 7fa6e3e2..d9f21eea 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -44,6 +44,7 @@ struct Tile uint32_t prio; vec3 pos; vec2 scale; + float angle; int id, o; }; @@ -169,7 +170,7 @@ void Scene::AddPrimitive(Mesh *mesh, Shader *shader, mat4 const &matrix) data->m_primitives.Push(Primitive(mesh, shader, matrix)); } -void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale) +void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale, float angle) { ASSERT(id < tileset->GetTileCount()); @@ -181,6 +182,7 @@ void Scene::AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale) t.pos = pos; t.o = o; t.scale = scale; + t.angle = angle; data->m_tiles.Push(t); } @@ -310,7 +312,7 @@ void Scene::RenderTiles() // XXX: rename to Blit() { data->m_tiles[i].tileset->BlitTile(data->m_tiles[j].id, data->m_tiles[j].pos, data->m_tiles[j].o, - data->m_tiles[j].scale, + data->m_tiles[j].scale, data->m_tiles[j].angle, vertex + 6 * (j - i), texture + 6 * (j - i)); } diff --git a/src/scene.h b/src/scene.h index 2e8d6dcf..44134870 100644 --- a/src/scene.h +++ b/src/scene.h @@ -52,7 +52,7 @@ public: /* FIXME: this should be deprecated -- it doesn't really match * the architecture we want to build */ - void AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale); + void AddTile(TileSet *tileset, int id, vec3 pos, int o, vec2 scale, float angle); void SetLineTime(float new_time=-1.f); void SetLineMask(int new_mask=0xFFFFFFFF); void SetLineSegmentSize(float new_segment_size=100000.f); diff --git a/src/sprite.cpp b/src/sprite.cpp index 5bf7c553..9ee58502 100644 --- a/src/sprite.cpp +++ b/src/sprite.cpp @@ -50,7 +50,7 @@ void Sprite::TickDraw(float seconds) { Entity::TickDraw(seconds); - g_scene->AddTile(data->tileset, data->id, m_position, 0, vec2(1.0f)); + g_scene->AddTile(data->tileset, data->id, m_position, 0, vec2(1.0f), 0.0f); } Sprite::~Sprite() diff --git a/src/tileset.cpp b/src/tileset.cpp index 72b9ca53..3e37b4f5 100644 --- a/src/tileset.cpp +++ b/src/tileset.cpp @@ -196,7 +196,7 @@ void TileSet::Unbind() ; } -void TileSet::BlitTile(uint32_t id, vec3 pos, int o, vec2 scale, +void TileSet::BlitTile(uint32_t id, vec3 pos, int o, vec2 scale, float angle, vec3 *vertex, vec2 *texture) { ibox2 pixels = m_data->m_tiles[id].m1; @@ -231,6 +231,8 @@ void TileSet::BlitTile(uint32_t id, vec3 pos, int o, vec2 scale, vec3 extent_x = 0.5f * vec3(dx, 0.f, 0.f); vec3 extent_y = 0.5f * vec3(0.f, dy, dz); vec3 center = pos + extent_x + extent_y; + extent_x = mat3::rotate(angle, vec3::axis_z) * extent_x; + extent_y = mat3::rotate(angle, vec3::axis_z) * extent_y; if (!m_data->m_image && m_data->m_texture) { diff --git a/src/tileset.h b/src/tileset.h index 67513327..21ac224e 100644 --- a/src/tileset.h +++ b/src/tileset.h @@ -52,7 +52,7 @@ public: ShaderTexture GetTexture() const; void Bind(); void Unbind(); - void BlitTile(uint32_t id, vec3 pos, int o, vec2 scale, + void BlitTile(uint32_t id, vec3 pos, int o, vec2 scale, float angle, vec3 *vertex, vec2 *texture); private: