BsGUIColor.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "BsGUIColor.h"
  2. #include "BsImageSprite.h"
  3. #include "BsGUIWidget.h"
  4. #include "BsGUISkin.h"
  5. #include "BsSpriteTexture.h"
  6. #include "BsGUILayoutOptions.h"
  7. #include "BsGUIMouseEvent.h"
  8. #include "BsGUIHelper.h"
  9. #include "BsBuiltinResources.h"
  10. #include "CmTexture.h"
  11. using namespace CamelotFramework;
  12. using namespace BansheeEngine;
  13. namespace BansheeEditor
  14. {
  15. const float GUIColor::ALPHA_SPLIT_POSITION = 0.75f;
  16. GUIColor::GUIColor(GUIWidget& parent, const GUIElementStyle* style, const GUILayoutOptions& layoutOptions)
  17. :GUIElement(parent, style, layoutOptions), mColorSprite(nullptr), mAlphaSprite(nullptr)
  18. {
  19. mColorSprite = cm_new<ImageSprite, PoolAlloc>();
  20. mAlphaSprite = cm_new<ImageSprite, PoolAlloc>();
  21. mColorImageDesc.texture = BuiltinResources::instance().getWhiteSpriteTexture().getInternalPtr();
  22. mAlphaImageDesc.texture = BuiltinResources::instance().getWhiteSpriteTexture().getInternalPtr();
  23. }
  24. GUIColor::~GUIColor()
  25. {
  26. cm_delete<PoolAlloc>(mColorSprite);
  27. cm_delete<PoolAlloc>(mAlphaSprite);
  28. }
  29. const String& GUIColor::getGUITypeName()
  30. {
  31. static String name = "Color";
  32. return name;
  33. }
  34. GUIColor* GUIColor::create(GUIWidget& parent, const GUIElementStyle* style)
  35. {
  36. if(style == nullptr)
  37. {
  38. const GUISkin& skin = parent.getSkin();
  39. style = skin.getStyle(getGUITypeName());
  40. }
  41. return new (cm_alloc<GUIColor, PoolAlloc>()) GUIColor(parent, style, GUILayoutOptions::create(style));
  42. }
  43. GUIColor* GUIColor::create(GUIWidget& parent, const GUIOptions& layoutOptions, const GUIElementStyle* style)
  44. {
  45. if(style == nullptr)
  46. {
  47. const GUISkin& skin = parent.getSkin();
  48. style = skin.getStyle(getGUITypeName());
  49. }
  50. return new (cm_alloc<GUIColor, PoolAlloc>()) GUIColor(parent, style, GUILayoutOptions::create(layoutOptions, style));
  51. }
  52. void GUIColor::setColor(const Color& color)
  53. {
  54. mColor = color;
  55. mColorImageDesc.color = mColor;
  56. mColorImageDesc.color.a = 1.0f;
  57. mAlphaImageDesc.color = Color::White * mColor.a;
  58. mAlphaImageDesc.color.a = 1.0f;
  59. markContentAsDirty();
  60. }
  61. UINT32 GUIColor::getNumRenderElements() const
  62. {
  63. UINT32 numElements = mColorSprite->getNumRenderElements();
  64. numElements += mAlphaSprite->getNumRenderElements();
  65. return numElements;
  66. }
  67. const GUIMaterialInfo& GUIColor::getMaterial(UINT32 renderElementIdx) const
  68. {
  69. UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
  70. if(renderElementIdx >= alphaSpriteIdx)
  71. return mAlphaSprite->getMaterial(alphaSpriteIdx - renderElementIdx);
  72. else
  73. return mColorSprite->getMaterial(renderElementIdx);
  74. }
  75. UINT32 GUIColor::getNumQuads(UINT32 renderElementIdx) const
  76. {
  77. UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
  78. UINT32 numQuads = 0;
  79. if(renderElementIdx >= alphaSpriteIdx)
  80. numQuads = mAlphaSprite->getNumQuads(alphaSpriteIdx - renderElementIdx);
  81. else
  82. numQuads = mColorSprite->getNumQuads(renderElementIdx);
  83. return numQuads;
  84. }
  85. void GUIColor::updateRenderElementsInternal()
  86. {
  87. mColorImageDesc.width = (UINT32)(mWidth * ALPHA_SPLIT_POSITION);
  88. mColorImageDesc.height = mHeight;
  89. mAlphaImageDesc.width = mWidth - mColorImageDesc.width;
  90. mAlphaImageDesc.height = mHeight;
  91. mColorSprite->update(mColorImageDesc);
  92. mAlphaSprite->update(mAlphaImageDesc);
  93. GUIElement::updateRenderElementsInternal();
  94. }
  95. void GUIColor::updateClippedBounds()
  96. {
  97. mClippedBounds = RectI(0, 0, mWidth, mHeight);
  98. if(mClipRect.width > 0 && mClipRect.height > 0)
  99. mClippedBounds.clip(mClipRect);
  100. mClippedBounds.x += mOffset.x;
  101. mClippedBounds.y += mOffset.y;
  102. }
  103. Vector2I GUIColor::_getOptimalSize() const
  104. {
  105. return GUIHelper::calcOptimalContentsSize(Vector2I(80, 10), *mStyle, _getLayoutOptions()); // Arbitrary size
  106. }
  107. void GUIColor::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads,
  108. UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
  109. {
  110. UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
  111. if(renderElementIdx < alphaSpriteIdx)
  112. {
  113. mColorSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads,
  114. vertexStride, indexStride, renderElementIdx, mOffset, mClipRect);
  115. return;
  116. }
  117. else if(renderElementIdx >= alphaSpriteIdx)
  118. {
  119. Vector2I alphaOffset = mOffset;
  120. UINT32 xOffset = (UINT32)(mWidth * ALPHA_SPLIT_POSITION);
  121. alphaOffset.x += xOffset;
  122. RectI alphaClipRect = mClipRect;
  123. alphaClipRect.x -= xOffset;
  124. mAlphaSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads,
  125. vertexStride, indexStride, alphaSpriteIdx - renderElementIdx, alphaOffset, alphaClipRect);
  126. }
  127. }
  128. bool GUIColor::mouseEvent(const GUIMouseEvent& ev)
  129. {
  130. if(ev.getType() == GUIMouseEventType::MouseUp)
  131. {
  132. // TODO
  133. return true;
  134. }
  135. return false;
  136. }
  137. }