sprite.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  2. * Copyright (c) 2012-2014 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "sprite.h"
  6. #include "vector3.h"
  7. #include "quaternion.h"
  8. #include "sprite_resource.h"
  9. #include "allocator.h"
  10. #include "scene_graph.h"
  11. #include "unit.h"
  12. #include "material.h"
  13. #include "render_world.h"
  14. #include "device.h"
  15. #include "material_manager.h"
  16. namespace crown
  17. {
  18. Sprite::Sprite(RenderWorld& render_world, SceneGraph& sg, int32_t node, const SpriteResource* sr)
  19. : m_render_world(render_world)
  20. , m_scene_graph(sg)
  21. , m_node(node)
  22. , m_resource(sr)
  23. , m_frame(0)
  24. {
  25. }
  26. Vector3 Sprite::local_position() const
  27. {
  28. return m_scene_graph.local_position(m_node);
  29. }
  30. Quaternion Sprite::local_rotation() const
  31. {
  32. return m_scene_graph.local_rotation(m_node);
  33. }
  34. Matrix4x4 Sprite::local_pose() const
  35. {
  36. return m_scene_graph.local_pose(m_node);
  37. }
  38. Vector3 Sprite::world_position() const
  39. {
  40. return m_scene_graph.world_position(m_node);
  41. }
  42. Quaternion Sprite::world_rotation() const
  43. {
  44. return m_scene_graph.world_rotation(m_node);
  45. }
  46. Matrix4x4 Sprite::world_pose() const
  47. {
  48. return m_scene_graph.world_pose(m_node);
  49. }
  50. void Sprite::set_local_position(Unit* unit, const Vector3& pos)
  51. {
  52. unit->set_local_position(m_node, pos);
  53. }
  54. void Sprite::set_local_rotation(Unit* unit, const Quaternion& rot)
  55. {
  56. unit->set_local_rotation(m_node, rot);
  57. }
  58. void Sprite::set_local_pose(Unit* unit, const Matrix4x4& pose)
  59. {
  60. unit->set_local_pose(m_node, pose);
  61. }
  62. void Sprite::set_material(MaterialId id)
  63. {
  64. m_material = id;
  65. }
  66. void Sprite::set_frame(uint32_t i)
  67. {
  68. m_frame = i;
  69. }
  70. void Sprite::render()
  71. {
  72. if (m_material.id != INVALID_ID)
  73. material_manager::get()->lookup_material(m_material)->bind();
  74. bgfx::setState(BGFX_STATE_RGB_WRITE
  75. | BGFX_STATE_ALPHA_WRITE
  76. | BGFX_STATE_DEPTH_TEST_LEQUAL
  77. | BGFX_STATE_DEPTH_WRITE
  78. | BGFX_STATE_CULL_CW
  79. | BGFX_STATE_MSAA
  80. | BGFX_STATE_BLEND_ALPHA);
  81. bgfx::setVertexBuffer(m_resource->vb);
  82. bgfx::setIndexBuffer(m_resource->ib, m_frame * 6, 6);
  83. bgfx::setTransform(matrix4x4::to_float_ptr(world_pose()));
  84. bgfx::submit(0);
  85. }
  86. } // namespace crown