SpriteComponent.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // ----------------------------------------------------------------
  2. // From Game Programming in C++ by Sanjay Madhav
  3. // Copyright (C) 2017 Sanjay Madhav. All rights reserved.
  4. //
  5. // Released under the BSD License
  6. // See LICENSE in root directory for full details.
  7. // ----------------------------------------------------------------
  8. #include "SpriteComponent.h"
  9. #include "Texture.h"
  10. #include "Shader.h"
  11. #include "Actor.h"
  12. #include "Game.h"
  13. #include "Renderer.h"
  14. #include "LevelLoader.h"
  15. SpriteComponent::SpriteComponent(Actor* owner, int drawOrder)
  16. :Component(owner)
  17. ,mTexture(nullptr)
  18. ,mDrawOrder(drawOrder)
  19. ,mTexWidth(0)
  20. ,mTexHeight(0)
  21. ,mVisible(true)
  22. {
  23. mOwner->GetGame()->GetRenderer()->AddSprite(this);
  24. }
  25. SpriteComponent::~SpriteComponent()
  26. {
  27. mOwner->GetGame()->GetRenderer()->RemoveSprite(this);
  28. }
  29. void SpriteComponent::Draw(Shader* shader)
  30. {
  31. if (mTexture)
  32. {
  33. // Scale the quad by the width/height of texture
  34. Matrix4 scaleMat = Matrix4::CreateScale(
  35. static_cast<float>(mTexWidth),
  36. static_cast<float>(mTexHeight),
  37. 1.0f);
  38. Matrix4 world = scaleMat * mOwner->GetWorldTransform();
  39. // Since all sprites use the same shader/vertices,
  40. // the game first sets them active before any sprite draws
  41. // Set world transform
  42. shader->SetMatrixUniform("uWorldTransform", world);
  43. // Set current texture
  44. mTexture->SetActive();
  45. // Draw quad
  46. glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);
  47. }
  48. }
  49. void SpriteComponent::SetTexture(Texture* texture)
  50. {
  51. mTexture = texture;
  52. // Set width/height
  53. mTexWidth = texture->GetWidth();
  54. mTexHeight = texture->GetHeight();
  55. }
  56. void SpriteComponent::LoadProperties(const rapidjson::Value& inObj)
  57. {
  58. Component::LoadProperties(inObj);
  59. std::string texFile;
  60. if (JsonHelper::GetString(inObj, "textureFile", texFile))
  61. {
  62. SetTexture(mOwner->GetGame()->GetRenderer()->GetTexture(texFile));
  63. }
  64. JsonHelper::GetInt(inObj, "drawOrder", mDrawOrder);
  65. JsonHelper::GetBool(inObj, "visible", mVisible);
  66. }
  67. void SpriteComponent::SaveProperties(rapidjson::Document::AllocatorType& alloc, rapidjson::Value& inObj) const
  68. {
  69. Component::SaveProperties(alloc, inObj);
  70. if (mTexture)
  71. {
  72. JsonHelper::AddString(alloc, inObj, "textureFile", mTexture->GetFileName());
  73. }
  74. JsonHelper::AddInt(alloc, inObj, "drawOrder", mDrawOrder);
  75. JsonHelper::AddBool(alloc, inObj, "visible", mVisible);
  76. }