BsGUIColor.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsGUIColor.h"
  4. #include "BsImageSprite.h"
  5. #include "BsGUIDimensions.h"
  6. #include "BsGUIMouseEvent.h"
  7. #include "BsGUIHelper.h"
  8. #include "BsBuiltinResources.h"
  9. #include "BsSpriteTexture.h"
  10. namespace BansheeEngine
  11. {
  12. const float GUIColor::ALPHA_SPLIT_POSITION = 0.75f;
  13. GUIColor::GUIColor(const String& styleName, const GUIDimensions& dimensions)
  14. :GUIElement(styleName, dimensions), mColorSprite(nullptr), mAlphaSprite(nullptr)
  15. {
  16. mColorSprite = bs_new<ImageSprite>();
  17. mAlphaSprite = bs_new<ImageSprite>();
  18. mColorImageDesc.texture = BuiltinResources::instance().getWhiteSpriteTexture().getInternalPtr();
  19. mAlphaImageDesc.texture = BuiltinResources::instance().getWhiteSpriteTexture().getInternalPtr();
  20. }
  21. GUIColor::~GUIColor()
  22. {
  23. bs_delete(mColorSprite);
  24. bs_delete(mAlphaSprite);
  25. }
  26. const String& GUIColor::getGUITypeName()
  27. {
  28. static String name = "Color";
  29. return name;
  30. }
  31. GUIColor* GUIColor::create(const String& styleName)
  32. {
  33. return new (bs_alloc<GUIColor>()) GUIColor(getStyleName<GUIColor>(styleName), GUIDimensions::create());
  34. }
  35. GUIColor* GUIColor::create(const GUIOptions& options, const String& styleName)
  36. {
  37. return new (bs_alloc<GUIColor>()) GUIColor(getStyleName<GUIColor>(styleName), GUIDimensions::create(options));
  38. }
  39. void GUIColor::setColor(const Color& color)
  40. {
  41. if (color != mValue)
  42. {
  43. mValue = color;
  44. _markContentAsDirty();
  45. }
  46. }
  47. UINT32 GUIColor::_getNumRenderElements() const
  48. {
  49. UINT32 numElements = mColorSprite->getNumRenderElements();
  50. numElements += mAlphaSprite->getNumRenderElements();
  51. return numElements;
  52. }
  53. const SpriteMaterialInfo& GUIColor::_getMaterial(UINT32 renderElementIdx) const
  54. {
  55. UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
  56. if(renderElementIdx >= alphaSpriteIdx)
  57. return mAlphaSprite->getMaterialInfo(alphaSpriteIdx - renderElementIdx);
  58. else
  59. return mColorSprite->getMaterialInfo(renderElementIdx);
  60. }
  61. UINT32 GUIColor::_getNumQuads(UINT32 renderElementIdx) const
  62. {
  63. UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
  64. UINT32 numQuads = 0;
  65. if(renderElementIdx >= alphaSpriteIdx)
  66. numQuads = mAlphaSprite->getNumQuads(alphaSpriteIdx - renderElementIdx);
  67. else
  68. numQuads = mColorSprite->getNumQuads(renderElementIdx);
  69. return numQuads;
  70. }
  71. void GUIColor::updateRenderElementsInternal()
  72. {
  73. Color color = mValue * getTint();
  74. mColorImageDesc.color = color;
  75. mColorImageDesc.color.a = 1.0f;
  76. mAlphaImageDesc.color = Color::White * color.a;
  77. mAlphaImageDesc.color.a = 1.0f;
  78. mColorImageDesc.width = (UINT32)(mLayoutData.area.width * ALPHA_SPLIT_POSITION);
  79. mColorImageDesc.height = mLayoutData.area.height;
  80. mAlphaImageDesc.width = mLayoutData.area.width - mColorImageDesc.width;
  81. mAlphaImageDesc.height = mLayoutData.area.height;
  82. mColorSprite->update(mColorImageDesc, (UINT64)_getParentWidget());
  83. mAlphaSprite->update(mAlphaImageDesc, (UINT64)_getParentWidget());
  84. GUIElement::updateRenderElementsInternal();
  85. }
  86. Vector2I GUIColor::_getOptimalSize() const
  87. {
  88. return GUIHelper::calcOptimalContentsSize(Vector2I(80, 10), *_getStyle(), _getDimensions()); // Arbitrary size
  89. }
  90. void GUIColor::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads,
  91. UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
  92. {
  93. UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
  94. Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
  95. if(renderElementIdx < alphaSpriteIdx)
  96. {
  97. mColorSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads,
  98. vertexStride, indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
  99. return;
  100. }
  101. else if(renderElementIdx >= alphaSpriteIdx)
  102. {
  103. Vector2I alphaOffset = offset;
  104. UINT32 xOffset = (UINT32)(mLayoutData.area.width * ALPHA_SPLIT_POSITION);
  105. alphaOffset.x += xOffset;
  106. Rect2I alphaClipRect = mLayoutData.getLocalClipRect();
  107. alphaClipRect.x -= xOffset;
  108. mAlphaSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads,
  109. vertexStride, indexStride, alphaSpriteIdx - renderElementIdx, alphaOffset, alphaClipRect);
  110. }
  111. }
  112. bool GUIColor::_mouseEvent(const GUIMouseEvent& ev)
  113. {
  114. if(ev.getType() == GUIMouseEventType::MouseUp)
  115. {
  116. if (!_isDisabled())
  117. onClicked();
  118. return true;
  119. }
  120. return false;
  121. }
  122. }