Browse Source

Add text effect code to text shader for Text3D.

aster2013 11 years ago
parent
commit
09baed3460

+ 32 - 3
Bin/CoreData/Shaders/GLSL/Text.glsl

@@ -5,6 +5,15 @@
 varying vec2 vTexCoord;
 varying vec4 vColor;
 
+#ifdef TEXT_EFFECT_SHADOW
+uniform vec2 cShadowOffset;
+uniform vec4 cShadowColor;
+#endif
+
+#ifdef TEXT_EFFECT_STROKE
+uniform vec4 cStrokeColor;
+#endif
+
 void VS()
 {
     mat4 modelMatrix = iModelMatrix;
@@ -22,11 +31,31 @@ void PS()
 #ifdef SIGNED_DISTANCE_FIELD
     float distance = texture2D(sDiffMap, vTexCoord).a;
     if (distance < 0.5f)
-        gl_FragColor.a = 0.0;
+    {
+    #ifdef TEXT_EFFECT_SHADOW
+        if (texture2D(sDiffMap, vTexCoord - cShadowOffset).a > 0.5f)
+        {
+            gl_FragColor.rgb = cShadowColor.rgb;
+            gl_FragColor.a = 1.0f;
+        }
+    #else
+        gl_FragColor.a = 0.0f;
+    #endif
+    }
     else
-        gl_FragColor.a = vColor.a;
+    {
+    #ifdef TEXT_EFFECT_STROKE
+        if (distance < 0.525f)
+            gl_FragColor.rgb = cStrokeColor.rgb;
+    #endif
 
-    gl_FragColor.a *= smoothstep(0.5f, 0.505f, distance);
+    #ifdef TEXT_EFFECT_SHADOW
+        if (tex2D(sDiffMap, vTexCoord + cShadowOffset).a < 0.5f)
+            gl_FragColor.a = 1.0f;
+        else
+    #endif
+        gl_FragColor.a = vColor.a * smoothstep(0.5f, 0.505f, distance);
+    }
 #else
     gl_FragColor.a = vColor.a * texture2D(sDiffMap, vTexCoord).a;
 #endif

+ 32 - 4
Bin/CoreData/Shaders/HLSL/Text.hlsl

@@ -2,6 +2,15 @@
 #include "Samplers.hlsl"
 #include "Transform.hlsl"
 
+#ifdef TEXT_EFFECT_SHADOW
+uniform float2 cShadowOffset;
+uniform float4 cShadowColor;
+#endif
+
+#ifdef TEXT_EFFECT_STROKE
+uniform float4 cStrokeColor;
+#endif
+
 void VS(float4 iPos : POSITION,
         float4 iColor : COLOR0,
         float2 iTexCoord : TEXCOORD0,
@@ -25,13 +34,32 @@ void PS(float4 iColor : COLOR0,
 #ifdef SIGNED_DISTANCE_FIELD
     float distance = tex2D(sDiffMap, iTexCoord).a;
     if (distance < 0.5f)
+    {
+    #ifdef TEXT_EFFECT_SHADOW
+        if (tex2D(sDiffMap, iTexCoord - cShadowOffset).a > 0.5f)
+        {
+            oColor.rgb = cShadowColor.rgb;
+            oColor.a = 1.0f;
+        }
+    #else
         oColor.a = 0.0f;
+    #endif
+    }
     else
-        oColor.a = iColor.a;
+    {
+    #ifdef TEXT_EFFECT_STROKE
+        if (distance < 0.525f)
+            oColor.rgb = cStrokeColor.rgb;
+    #endif
 
-    oColor.a *= smoothstep(0.5f, 0.505f, distance);
+    #ifdef TEXT_EFFECT_SHADOW
+        if (tex2D(sDiffMap, iTexCoord + cShadowOffset).a < 0.5f)
+            oColor.a = 1.0f;
+        else
+    #endif
+        oColor.a = iColor.a * smoothstep(0.5f, 0.505f, distance);
+    }
 #else
     oColor.a = iColor.a * tex2D(sDiffMap, iTexCoord).a;
 #endif
-}
-
+}

+ 14 - 5
Bin/Data/LuaScripts/35_SignedDistanceFieldText.lua

@@ -69,13 +69,22 @@ function CreateScene()
         mushroomTitleNode.position = Vector3(0.0, 1.2, 0.0)
         local mushroomTitleText = mushroomTitleNode:CreateComponent("Text3D")
         mushroomTitleText.text = "Mushroom " .. i
-        if (i % 2) == 0 then
-            mushroomTitleText:SetFont(cache:GetResource("Font", "Fonts/BlueHighway.sdf"), 24)
+
+        mushroomTitleText:SetFont(cache:GetResource("Font", "Fonts/BlueHighway.sdf"), 24)
+        mushroomTitleText.color = Color(1.0, 0.0, 0.0)
+
+        if (i % 3) == 1 then
             mushroomTitleText.color = Color(0.0, 1.0, 0.0)
-        else
-            mushroomTitleText:SetFont(cache:GetResource("Font", "Fonts/Anonymous Pro.sdf"), 24)
-            mushroomTitleText.color = Color(1.0, 0.0, 0.0)
+            mushroomTitleText.textEffect = TE_SHADOW
+            mushroomTitleText.effectColor = Color(0.5, 0.5, 0.5)
+        end
+
+        if (i % 3) == 2 then
+            mushroomTitleText.color = Color(1.0, 1.0, 0.0)
+            mushroomTitleText.textEffect = TE_STROKE
+            mushroomTitleText.effectColor = Color(0.5, 0.5, 0.5)
         end
+        
         mushroomTitleText:SetAlignment(HA_CENTER, VA_CENTER)
     end
 

+ 12 - 5
Bin/Data/Scripts/35_SignedDistanceFieldText.as

@@ -72,16 +72,23 @@ void CreateScene()
         mushroomTitleNode.position = Vector3(0.0f, 1.2f, 0.0f);
         Text3D@ mushroomTitleText = mushroomTitleNode.CreateComponent("Text3D");
         mushroomTitleText.text = "Mushroom " + i;
-        if ((i % 2) == 0)
+
+        mushroomTitleText.SetFont(cache.GetResource("Font", "Fonts/BlueHighway.sdf"), 24);
+        mushroomTitleText.color = Color(1.0f, 0.0f, 0.0f);
+
+        if (i % 3 == 1)
         {
-            mushroomTitleText.SetFont(cache.GetResource("Font", "Fonts/BlueHighway.sdf"), 24);
             mushroomTitleText.color = Color(0.0f, 1.0f, 0.0f);
+            mushroomTitleText.textEffect = TE_SHADOW;
+            mushroomTitleText.effectColor = Color(0.5f, 0.5f, 0.5f);
         }
-        else
+        else if (i % 3 == 2)
         {
-            mushroomTitleText.SetFont(cache.GetResource("Font", "Fonts/Anonymous Pro.sdf"), 24);
-            mushroomTitleText.color = Color(1.0f, 0.0f, 0.0f);
+            mushroomTitleText.color = Color(1.0f, 1.0f, 0.0f);
+            mushroomTitleText.textEffect = TE_STROKE;
+            mushroomTitleText.effectColor = Color(0.5f, 0.5f, 0.5f);
         }
+
         mushroomTitleText.SetAlignment(HA_CENTER, VA_CENTER);
     }
 

+ 2 - 1
Source/Engine/UI/Text.cpp

@@ -175,6 +175,7 @@ void Text::GetBatches(PODVector<UIBatch>& batches, PODVector<float>& vertexData,
     }
 
     // Text batch
+    TextEffect textEffect = font_->IsSDFFont() ? TE_NONE : textEffect_;
     const Vector<SharedPtr<Texture2D> >& textures = face->GetTextures();
     for (unsigned n = 0; n < textures.Size() && n < pageGlyphLocations_.Size(); ++n)
     {
@@ -183,7 +184,7 @@ void Text::GetBatches(PODVector<UIBatch>& batches, PODVector<float>& vertexData,
 
         const PODVector<GlyphLocation>& pageGlyphLocation = pageGlyphLocations_[n];
 
-        switch (textEffect_)
+        switch (textEffect)
         {
         case TE_NONE:
             ConstructBatch(pageBatch, pageGlyphLocation, 0, 0);

+ 42 - 3
Source/Engine/UI/Text3D.cpp

@@ -238,6 +238,7 @@ void Text3D::SetTextEffect(TextEffect textEffect)
     text_.SetTextEffect(textEffect);
     
     MarkTextDirty();
+    UpdateTextMaterials(true);
 }
 
 void Text3D::SetEffectColor(const Color& effectColor)
@@ -245,6 +246,7 @@ void Text3D::SetEffectColor(const Color& effectColor)
     text_.SetEffectColor(effectColor);
     
     MarkTextDirty();
+    UpdateTextMaterials();
 }
 
 void Text3D::SetEffectDepthBias(float bias)
@@ -526,7 +528,22 @@ void Text3D::UpdateTextMaterials(bool forceUpdate)
                 pass->SetPixelShader("Text");
 
                 if (GetFont()->IsSDFFont())
-                    pass->SetPixelShaderDefines("SIGNED_DISTANCE_FIELD");
+                {
+                    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);
@@ -539,9 +556,31 @@ void Text3D::UpdateTextMaterials(bool forceUpdate)
         }
         
         Material* material = batches_[i].material_;
-        material->SetTexture(TU_DIFFUSE, uiBatches_[i].texture_);
+        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;
+            }
+        }
     }
 }
 
-
 }

+ 12 - 5
Source/Samples/35_SignedDistanceFieldText/SignedDistanceFieldText.cpp

@@ -115,16 +115,23 @@ void SignedDistanceFieldText::CreateScene()
         mushroomTitleNode->SetPosition(Vector3(0.0f, 1.2f, 0.0f));
         Text3D* mushroomTitleText = mushroomTitleNode->CreateComponent<Text3D>();
         mushroomTitleText->SetText("Mushroom " + String(i));
-        if ((i % 2) == 0)
+        mushroomTitleText->SetFont(cache->GetResource<Font>("Fonts/BlueHighway.sdf"), 24);
+
+        mushroomTitleText->SetColor(Color::RED);
+        
+        if (i % 3 == 1)
         {
-            mushroomTitleText->SetFont(cache->GetResource<Font>("Fonts/BlueHighway.sdf"), 24);
             mushroomTitleText->SetColor(Color::GREEN);
+            mushroomTitleText->SetTextEffect(TE_SHADOW);
+            mushroomTitleText->SetEffectColor(Color(0.5f, 0.5f, 0.5f));
         }
-        else
+        else if (i % 3 == 2)
         {
-            mushroomTitleText->SetFont(cache->GetResource<Font>("Fonts/Anonymous Pro.sdf"), 24);
-            mushroomTitleText->SetColor(Color::RED);
+            mushroomTitleText->SetColor(Color::YELLOW);
+            mushroomTitleText->SetTextEffect(TE_STROKE);
+            mushroomTitleText->SetEffectColor(Color(0.5f, 0.5f, 0.5f));
         }
+
         mushroomTitleText->SetAlignment(HA_CENTER, VA_CENTER);
     }