STDMaterial.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. #include "STDMaterial.h"
  2. #include "VisualStyle.h"
  3. #include "Sprite.h"
  4. #include "TextField.h"
  5. #include "text_utils/Node.h"
  6. #include "ColorRectSprite.h"
  7. #include "RenderState.h"
  8. #include "STDRenderer.h"
  9. #include "MaskedRenderer.h"
  10. #include "MaskedSprite.h"
  11. #include "ClipRectActor.h"
  12. #include "core/oxygine.h"
  13. #include "res/ResFont.h"
  14. namespace oxygine
  15. {
  16. STDMaterial* STDMaterial::instance = 0;
  17. void Material::render(Actor* parent, const RenderState& parentRS)
  18. {
  19. RenderState rs;
  20. if (!parent->internalRender(rs, parentRS))
  21. return;
  22. Actor* actor = parent->getFirstChild().get();
  23. while (actor)
  24. {
  25. OX_ASSERT(actor->getParent());
  26. actor->render(rs);
  27. actor = actor->getNextSibling().get();
  28. }
  29. }
  30. void STDMaterial::setViewProj(const Matrix& vp)
  31. {
  32. _renderer->setViewProjTransform(vp);
  33. }
  34. void STDMaterial::render(ClipRectActor* actor, const RenderState& parentRS)
  35. {
  36. //Material::render(actor, parentRS);
  37. //return;
  38. Material::setCurrent(this);
  39. RenderState rs = parentRS;
  40. const RectF* parentClippedRect = parentRS.clip;
  41. RectF clippedRect = *parentClippedRect;
  42. rs.clip = &clippedRect;
  43. Rect scissorRect(0, 0, 0, 0);
  44. bool scissorEnabled = _renderer->getDriver()->getScissorRect(scissorRect);
  45. bool vis = true;
  46. if (actor->getClipping())
  47. {
  48. _renderer->drawBatch();
  49. RectF ss_rect = getActorTransformedDestRect(actor, actor->getTransform() * parentRS.transform);
  50. clippedRect.clip(ss_rect);
  51. if (!clippedRect.isEmpty())
  52. {
  53. Rect gl_rect = Rect(
  54. int(clippedRect.pos.x + 0.01f),
  55. int(clippedRect.pos.y + 0.01f),
  56. int(clippedRect.size.x + 0.01f),
  57. int(clippedRect.size.y + 0.01f));
  58. if (!_renderer->getDriver()->getRenderTarget()->getHandle())
  59. {
  60. Point vp_size = core::getDisplaySize();
  61. gl_rect.pos.y = vp_size.y - gl_rect.getBottom();
  62. }
  63. _renderer->getDriver()->setScissorRect(&gl_rect);
  64. }
  65. else
  66. {
  67. vis = false;
  68. }
  69. }
  70. if (vis)
  71. actor->Actor::render(rs);
  72. if (actor->getClipping())
  73. {
  74. _renderer->drawBatch();
  75. _renderer->getDriver()->setScissorRect(scissorEnabled ? &scissorRect : 0);
  76. }
  77. }
  78. void STDMaterial::render(MaskedSprite* sprite, const RenderState& parentRS)
  79. {
  80. Material::setCurrent(this);
  81. spSprite mask = sprite->getMask();
  82. if (mask && mask->getAnimFrame().getDiffuse().base)
  83. {
  84. Transform t = mask->computeGlobalTransform();
  85. RectF maskDest = mask->getDestRect();
  86. RectF maskSrc = mask->getSrcRect();
  87. const Diffuse& df = mask->getAnimFrame().getDiffuse();
  88. bool useR = sprite->getUseRChannel();
  89. bool rchannel = useR ? true : (df.alpha ? true : false);
  90. spNativeTexture msk = useR ? df.base : (df.alpha ? df.alpha : df.base);
  91. STDRenderer* original = _renderer;
  92. _renderer->drawBatch();
  93. MaskedRenderer mr(msk, maskSrc, maskDest, t, rchannel, original->getDriver());
  94. mr.begin(_renderer);
  95. _renderer = &mr;
  96. RenderState rs = parentRS;
  97. sprite->Sprite::render(rs);
  98. mr.end();
  99. _renderer = original;
  100. }
  101. else
  102. {
  103. sprite->Sprite::render(parentRS);
  104. }
  105. }
  106. void STDMaterial::doRender(Sprite* sprite, const RenderState& rs)
  107. {
  108. Material::setCurrent(rs.material);
  109. const AnimationFrame& frame = sprite->getAnimFrame();
  110. const Diffuse& df = frame.getDiffuse();
  111. const spNativeTexture& base = df.base;
  112. #ifdef EMSCRIPTEN
  113. _renderer->setTexture(df.base, df.alpha, df.premultiplied);//preload
  114. if (base && base->getHandle())
  115. #else
  116. if (base)
  117. #endif
  118. {
  119. _renderer->setBlendMode(sprite->getBlendMode());
  120. #ifndef EMSCRIPTEN
  121. _renderer->setTexture(df.base, df.alpha, df.premultiplied);//preload
  122. #endif
  123. _renderer->setTransform(rs.transform);
  124. _renderer->draw(rs.getFinalColor(sprite->getColor()), frame.getSrcRect(), sprite->getDestRect());
  125. }
  126. }
  127. void STDMaterial::doRender(TextField* tf, const RenderState& rs)
  128. {
  129. float scale = sqrtf(rs.transform.a * rs.transform.a + rs.transform.c * rs.transform.c);
  130. text::Node* root = tf->getRootNode(scale);
  131. if (!root)
  132. return;
  133. Material::setCurrent(this);
  134. text::DrawContext dc;
  135. dc.primary = rs.getFinalColor(tf->getColor()).premultiplied();
  136. dc.color = tf->getStyle().color * dc.primary;
  137. dc.renderer = _renderer;
  138. _renderer->setBlendMode(tf->getBlendMode());
  139. _renderer->setTransform(rs.transform);
  140. int sdfSize;
  141. if (tf->getFont()->isSDF(sdfSize))
  142. {
  143. if (tf->getFontSize())
  144. scale = scale * tf->getFontSize() / sdfSize;
  145. float contrast = 3.0f + scale * 8.0f;
  146. float offset = tf->getWeight();
  147. float outline = tf->getWeight() - tf->getOutline();
  148. _renderer->beginSDFont(contrast, offset, tf->getOutlineColor(), outline);
  149. root->draw(dc);
  150. _renderer->endSDFont();
  151. }
  152. else
  153. {
  154. _renderer->beginElementRendering(true);
  155. root->draw(dc);
  156. }
  157. }
  158. void STDMaterial::doRender(ColorRectSprite* sprite, const RenderState& rs)
  159. {
  160. Material::setCurrent(this);
  161. _renderer->setBlendMode(sprite->getBlendMode());
  162. _renderer->setTexture(STDRenderer::white);
  163. _renderer->setTransform(rs.transform);
  164. _renderer->draw(rs.getFinalColor(sprite->getColor()), RectF(0, 0, 1, 1), sprite->getDestRect());
  165. }
  166. void STDMaterial::doRender(ProgressBar*, const RenderState& rs)
  167. {
  168. }
  169. void STDMaterial::apply(Material* prev)
  170. {
  171. _renderer->begin(0);
  172. _renderer->setUberShaderProgram(&STDRenderer::uberShader);
  173. }
  174. void STDMaterial::finish()
  175. {
  176. if (!_renderer)
  177. return;
  178. _renderer->end();
  179. }
  180. }