void Text3D::UpdateTextMaterials(bool forceUpdate) { batches_.Resize(uiBatches_.Size()); geometries_.Resize(uiBatches_.Size()); for (unsigned i = 0; i < batches_.Size(); ++i) { if (!geometries_[i]) { Geometry* geometry = new Geometry(context_); geometry->SetVertexBuffer(0, vertexBuffer_, MASK_POSITION | MASK_COLOR | MASK_TEXCOORD1); batches_[i].geometry_ = geometries_[i] = geometry; } if (!batches_[i].material_ || forceUpdate) { // If material not defined, create a reasonable default from scratch if (!material_) { Material* material = new Material(context_); Technique* tech = new Technique(context_); Pass* pass = tech->CreatePass(PASS_ALPHA); pass->SetVertexShader("Text"); pass->SetPixelShader("Text"); if (GetFont()->IsSDFFont()) { switch (GetTextEffect()) { case TE_NONE: pass->SetPixelShaderDefines("SIGNED_DISTANCE_FIELD"); break; case TE_SHADOW: pass->SetPixelShaderDefines("SIGNED_DISTANCE_FIELD TEXT_EFFECT_SHADOW"); break; case TE_STROKE: pass->SetPixelShaderDefines("SIGNED_DISTANCE_FIELD TEXT_EFFECT_STROKE"); break; } } pass->SetBlendMode(BLEND_ALPHA); pass->SetDepthWrite(false); material->SetTechnique(0, tech); material->SetCullMode(CULL_NONE); batches_[i].material_ = material; } else batches_[i].material_ = material_->Clone(); } Material* material = batches_[i].material_; Texture* texture = uiBatches_[i].texture_; material->SetTexture(TU_DIFFUSE, texture); if (GetFont()->IsSDFFont()) { switch (GetTextEffect()) { case TE_SHADOW: if (texture) { Vector2 shadowOffset(0.5f / texture->GetWidth(), 0.5f / texture->GetHeight()); material->SetShaderParameter("ShadowOffset", shadowOffset); } material->SetShaderParameter("ShadowColor", GetEffectColor()); break; case TE_STROKE: material->SetShaderParameter("StrokeColor", GetEffectColor()); break; default: break; } } } }
void Text3D::UpdateTextMaterials(bool forceUpdate) { Font* font = GetFont(); bool isSDFFont = font ? font->IsSDFFont() : false; batches_.Resize(uiBatches_.Size()); geometries_.Resize(uiBatches_.Size()); for (unsigned i = 0; i < batches_.Size(); ++i) { if (!geometries_[i]) { Geometry* geometry = new Geometry(context_); geometry->SetVertexBuffer(0, vertexBuffer_); batches_[i].geometry_ = geometries_[i] = geometry; } if (!batches_[i].material_ || forceUpdate || isSDFFont != usingSDFShader_) { // If material not defined, create a reasonable default from scratch if (!material_) { Material* material = new Material(context_); Technique* tech = new Technique(context_); Pass* pass = tech->CreatePass("alpha"); pass->SetVertexShader("Text"); pass->SetPixelShader("Text"); if (isSDFFont) { switch (GetTextEffect()) { case TE_NONE: pass->SetPixelShaderDefines("SIGNED_DISTANCE_FIELD"); break; case TE_SHADOW: pass->SetPixelShaderDefines("SIGNED_DISTANCE_FIELD TEXT_EFFECT_SHADOW"); break; case TE_STROKE: pass->SetPixelShaderDefines("SIGNED_DISTANCE_FIELD TEXT_EFFECT_STROKE"); break; } } pass->SetBlendMode(BLEND_ALPHA); pass->SetDepthWrite(false); material->SetTechnique(0, tech); material->SetCullMode(CULL_NONE); batches_[i].material_ = material; } else batches_[i].material_ = material_->Clone(); // Note: custom material is assumed to use the right kind of shader; it is not modified to define SIGNED_DISTANCE_FIELD usingSDFShader_ = isSDFFont; } Material* material = batches_[i].material_; Texture* texture = uiBatches_[i].texture_; material->SetTexture(TU_DIFFUSE, texture); if (isSDFFont) { switch (GetTextEffect()) { case TE_SHADOW: if (texture) { Vector2 shadowOffset(0.5f / texture->GetWidth(), 0.5f / texture->GetHeight()); material->SetShaderParameter("ShadowOffset", shadowOffset); } material->SetShaderParameter("ShadowColor", GetEffectColor()); break; case TE_STROKE: material->SetShaderParameter("StrokeColor", GetEffectColor()); break; default: break; } } } }