BsGUIColor.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "GUI/BsGUIColor.h"
  4. #include "2D/BsImageSprite.h"
  5. #include "GUI/BsGUIDimensions.h"
  6. #include "GUI/BsGUIMouseEvent.h"
  7. #include "GUI/BsGUIHelper.h"
  8. #include "Resources/BsBuiltinResources.h"
  9. #include "2D/BsSpriteTexture.h"
  10. namespace bs
  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, SpriteMaterial** material) const
  54. {
  55. UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
  56. if (renderElementIdx >= alphaSpriteIdx)
  57. {
  58. *material = mAlphaSprite->getMaterial(alphaSpriteIdx - renderElementIdx);
  59. return mAlphaSprite->getMaterialInfo(alphaSpriteIdx - renderElementIdx);
  60. }
  61. else
  62. {
  63. *material = mColorSprite->getMaterial(renderElementIdx);
  64. return mColorSprite->getMaterialInfo(renderElementIdx);
  65. }
  66. }
  67. void GUIColor::_getMeshInfo(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices, GUIMeshType& type) const
  68. {
  69. UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
  70. UINT32 numQuads = 0;
  71. if(renderElementIdx >= alphaSpriteIdx)
  72. numQuads = mAlphaSprite->getNumQuads(alphaSpriteIdx - renderElementIdx);
  73. else
  74. numQuads = mColorSprite->getNumQuads(renderElementIdx);
  75. numVertices = numQuads * 4;
  76. numIndices = numQuads * 6;
  77. type = GUIMeshType::Triangle;
  78. }
  79. void GUIColor::updateRenderElementsInternal()
  80. {
  81. Color color = mValue * getTint();
  82. mColorImageDesc.color = color;
  83. mColorImageDesc.color.a = 1.0f;
  84. mAlphaImageDesc.color = Color::White * color.a;
  85. mAlphaImageDesc.color.a = 1.0f;
  86. mColorImageDesc.width = (UINT32)(mLayoutData.area.width * ALPHA_SPLIT_POSITION);
  87. mColorImageDesc.height = mLayoutData.area.height;
  88. mAlphaImageDesc.width = mLayoutData.area.width - mColorImageDesc.width;
  89. mAlphaImageDesc.height = mLayoutData.area.height;
  90. mColorSprite->update(mColorImageDesc, (UINT64)_getParentWidget());
  91. mAlphaSprite->update(mAlphaImageDesc, (UINT64)_getParentWidget());
  92. GUIElement::updateRenderElementsInternal();
  93. }
  94. Vector2I GUIColor::_getOptimalSize() const
  95. {
  96. return GUIHelper::calcOptimalContentsSize(Vector2I(80, 10), *_getStyle(), _getDimensions()); // Arbitrary size
  97. }
  98. void GUIColor::_fillBuffer(UINT8* vertices, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
  99. UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 renderElementIdx) const
  100. {
  101. UINT8* uvs = vertices + sizeof(Vector2);
  102. UINT32 vertexStride = sizeof(Vector2) * 2;
  103. UINT32 indexStride = sizeof(UINT32);
  104. UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
  105. Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
  106. if(renderElementIdx < alphaSpriteIdx)
  107. {
  108. mColorSprite->fillBuffer(vertices, uvs, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices,
  109. vertexStride, indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
  110. }
  111. else if(renderElementIdx >= alphaSpriteIdx)
  112. {
  113. Vector2I alphaOffset = offset;
  114. UINT32 xOffset = (UINT32)(mLayoutData.area.width * ALPHA_SPLIT_POSITION);
  115. alphaOffset.x += xOffset;
  116. Rect2I alphaClipRect = mLayoutData.getLocalClipRect();
  117. alphaClipRect.x -= xOffset;
  118. mAlphaSprite->fillBuffer(vertices, uvs, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices,
  119. vertexStride, indexStride, alphaSpriteIdx - renderElementIdx, alphaOffset, alphaClipRect);
  120. }
  121. }
  122. bool GUIColor::_mouseEvent(const GUIMouseEvent& ev)
  123. {
  124. if(ev.getType() == GUIMouseEventType::MouseUp)
  125. {
  126. if (!_isDisabled())
  127. onClicked();
  128. return true;
  129. }
  130. return false;
  131. }
  132. }