SpriteComponent.cpp 1.5 KB

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