SpriteComponent.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. SpriteComponent::SpriteComponent(Actor* owner, int drawOrder)
  15. :Component(owner)
  16. ,mTexture(nullptr)
  17. ,mDrawOrder(drawOrder)
  18. ,mTexWidth(0)
  19. ,mTexHeight(0)
  20. {
  21. mOwner->GetGame()->GetRenderer()->AddSprite(this);
  22. }
  23. SpriteComponent::~SpriteComponent()
  24. {
  25. mOwner->GetGame()->GetRenderer()->RemoveSprite(this);
  26. }
  27. void SpriteComponent::Draw(Shader* shader)
  28. {
  29. if (mTexture)
  30. {
  31. // Scale the quad by the width/height of texture
  32. Matrix4 scaleMat = Matrix4::CreateScale(
  33. static_cast<float>(mTexWidth),
  34. static_cast<float>(mTexHeight),
  35. 1.0f);
  36. Matrix4 world = scaleMat * mOwner->GetWorldTransform();
  37. // Since all sprites use the same shader/vertices,
  38. // the game first sets them active before any sprite draws
  39. // Set world transform
  40. shader->SetMatrixUniform("uWorldTransform", world);
  41. // Set current texture
  42. mTexture->SetActive();
  43. // Draw quad
  44. glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);
  45. }
  46. }
  47. void SpriteComponent::SetTexture(Texture* texture)
  48. {
  49. mTexture = texture;
  50. // Set width/height
  51. mTexWidth = texture->GetWidth();
  52. mTexHeight = texture->GetHeight();
  53. }