Browse Source

integrating Signed Distance Font

dmuratshin 9 years ago
parent
commit
b0a41122fe

+ 0 - 11
examples/Demo/data/pp_blit_fs.glsl

@@ -1,11 +0,0 @@
-/* BlurFragmentShader.glsl */
-//precision mediump float;
- 
-uniform mediump sampler2D s_texture;
- 
-varying mediump vec2 v_texCoord;
- 
-void main()
-{
-    gl_FragColor = texture2D(s_texture, v_texCoord);
-}

+ 0 - 16
examples/Demo/data/pp_blit_vs.glsl

@@ -1,16 +0,0 @@
-/* VBlurVertexShader.glsl */
-attribute  vec3 position;
-attribute  vec4 color;
-attribute  vec2 uv;
- 
-uniform mediump float step;
-
-varying mediump vec2 v_texCoord;
-varying mediump vec4 v_color;
- 
-void main()
-{
-    gl_Position = vec4(position.xyz, 1.0);
-    v_texCoord = uv;
-    v_color = color;
-}

+ 0 - 48
examples/Demo/data/pp_hblur_vs.glsl

@@ -1,48 +0,0 @@
-/* VBlurVertexShader.glsl */
-attribute vec3 position;
-attribute vec4 color;
-attribute vec2 uv;
- 
-uniform mediump float step;
-
-
-varying mediump vec4 v_color;
-varying mediump vec2 v_texCoord;
-varying mediump vec2 v_blurTexCoords0;
-varying mediump vec2 v_blurTexCoords1;
-varying mediump vec2 v_blurTexCoords2;
-varying mediump vec2 v_blurTexCoords3;
-varying mediump vec2 v_blurTexCoords4;
-varying mediump vec2 v_blurTexCoords5;
-varying mediump vec2 v_blurTexCoords6;
-varying mediump vec2 v_blurTexCoords7;
-varying mediump vec2 v_blurTexCoords8;
-varying mediump vec2 v_blurTexCoords9;
-varying mediump vec2 v_blurTexCoords10;
-varying mediump vec2 v_blurTexCoords11;
-varying mediump vec2 v_blurTexCoords12;
-varying mediump vec2 v_blurTexCoords13;
- 
-
-void main()
-{
-    gl_Position = vec4(position.xy, 0, 1.0);
-    mediump float z = step;
-
-    v_color = color;
-    v_texCoord = uv;
-    v_blurTexCoords0 = v_texCoord + vec2(-z * 7.0, 0.0);
-    v_blurTexCoords1 = v_texCoord + vec2(-z * 6.0, 0.0);
-    v_blurTexCoords2 = v_texCoord + vec2(-z * 5.0, 0.0);
-    v_blurTexCoords3 = v_texCoord + vec2(-z * 4.0, 0.0);
-    v_blurTexCoords4 = v_texCoord + vec2(-z * 3.0, 0.0);
-    v_blurTexCoords5 = v_texCoord + vec2(-z * 2.0, 0.0);
-    v_blurTexCoords6 = v_texCoord + vec2(-z      , 0.0);
-    v_blurTexCoords7 = v_texCoord + vec2( z      , 0.0);
-    v_blurTexCoords8 = v_texCoord + vec2( z * 2.0, 0.0);
-    v_blurTexCoords9 = v_texCoord + vec2( z * 3.0, 0.0);
-    v_blurTexCoords10 = v_texCoord + vec2( z * 4.0, 0.0);
-    v_blurTexCoords11 = v_texCoord + vec2( z * 5.0, 0.0);
-    v_blurTexCoords12 = v_texCoord + vec2( z * 6.0, 0.0);
-    v_blurTexCoords13 = v_texCoord + vec2( z * 7.0, 0.0);
-}

+ 0 - 45
examples/Demo/data/pp_rast_fs.glsl

@@ -1,45 +0,0 @@
-/* BlurFragmentShader.glsl */
-//precision mediump float;
- 
-uniform lowp sampler2D s_texture;
- 
-varying mediump vec4 v_color;
-varying mediump vec2 v_texCoord;
-varying mediump vec2 v_blurTexCoords0;
-varying mediump vec2 v_blurTexCoords1;
-varying mediump vec2 v_blurTexCoords2;
-varying mediump vec2 v_blurTexCoords3;
-varying mediump vec2 v_blurTexCoords4;
-varying mediump vec2 v_blurTexCoords5;
-varying mediump vec2 v_blurTexCoords6;
-varying mediump vec2 v_blurTexCoords7;
-varying mediump vec2 v_blurTexCoords8;
-varying mediump vec2 v_blurTexCoords9;
-varying mediump vec2 v_blurTexCoords10;
-varying mediump vec2 v_blurTexCoords11;
-varying mediump vec2 v_blurTexCoords12;
-varying mediump vec2 v_blurTexCoords13;
- 
- 
- 
-void main()
-{
-    const mediump float M = 3.0;
-    gl_FragColor = vec4(0.0);
-    gl_FragColor += texture2D(s_texture, v_blurTexCoords0)*0.0044299121055113265 * M;
-    gl_FragColor += texture2D(s_texture, v_blurTexCoords1)*0.00895781211794 * M;
-    gl_FragColor += texture2D(s_texture, v_blurTexCoords2)*0.0215963866053 * M;
-    gl_FragColor += texture2D(s_texture, v_blurTexCoords3)*0.0443683338718 * M;
-    gl_FragColor += texture2D(s_texture, v_blurTexCoords4)*0.0776744219933 * M;
-    gl_FragColor += texture2D(s_texture, v_blurTexCoords5)*0.115876621105 * M;
-    gl_FragColor += texture2D(s_texture, v_blurTexCoords6)*0.147308056121 * M;
-    gl_FragColor += texture2D(s_texture, v_texCoord      )*0.159576912161 * M;
-    gl_FragColor += texture2D(s_texture, v_blurTexCoords7)*0.147308056121 * M;
-    gl_FragColor += texture2D(s_texture, v_blurTexCoords8)*0.115876621105 * M;
-    gl_FragColor += texture2D(s_texture, v_blurTexCoords9)*0.0776744219933 * M;
-    gl_FragColor += texture2D(s_texture, v_blurTexCoords10)*0.0443683338718 * M;
-    gl_FragColor += texture2D(s_texture, v_blurTexCoords11)*0.0215963866053 * M;
-    gl_FragColor += texture2D(s_texture, v_blurTexCoords12)*0.00895781211794 * M;
-    gl_FragColor += texture2D(s_texture, v_blurTexCoords13)*0.0044299121055113265 * M;
-    gl_FragColor = v_color * min(gl_FragColor.a, 1.0);
-}

+ 0 - 47
examples/Demo/data/pp_vblur_vs.glsl

@@ -1,47 +0,0 @@
-/* VBlurVertexShader.glsl */
-attribute  vec3 position;
-attribute  vec4 color;
-attribute  vec2 uv;
- 
-uniform mediump float step;
-
-varying mediump vec4 v_color;
-varying mediump vec2 v_texCoord;
-varying mediump vec2 v_blurTexCoords0;
-varying mediump vec2 v_blurTexCoords1;
-varying mediump vec2 v_blurTexCoords2;
-varying mediump vec2 v_blurTexCoords3;
-varying mediump vec2 v_blurTexCoords4;
-varying mediump vec2 v_blurTexCoords5;
-varying mediump vec2 v_blurTexCoords6;
-varying mediump vec2 v_blurTexCoords7;
-varying mediump vec2 v_blurTexCoords8;
-varying mediump vec2 v_blurTexCoords9;
-varying mediump vec2 v_blurTexCoords10;
-varying mediump vec2 v_blurTexCoords11;
-varying mediump vec2 v_blurTexCoords12;
-varying mediump vec2 v_blurTexCoords13;
- 
- 
-void main()
-{
-    gl_Position = vec4(position.xy, 0, 1.0);
-    mediump float z = step;
-
-    v_color = color;
-    v_texCoord = uv;
-    v_blurTexCoords0 = v_texCoord + vec2(0.0, -z * 7.0);
-    v_blurTexCoords1 = v_texCoord + vec2(0.0, -z * 6.0);
-    v_blurTexCoords2 = v_texCoord + vec2(0.0, -z * 5.0);
-    v_blurTexCoords3 = v_texCoord + vec2(0.0, -z * 4.0);
-    v_blurTexCoords4 = v_texCoord + vec2(0.0, -z * 3.0);
-    v_blurTexCoords5 = v_texCoord + vec2(0.0, -z * 2.0);
-    v_blurTexCoords6 = v_texCoord + vec2(0.0, -z);
-    v_blurTexCoords7 = v_texCoord + vec2(0.0,  z);
-    v_blurTexCoords8 = v_texCoord + vec2(0.0,  z * 2.0);
-    v_blurTexCoords9 = v_texCoord + vec2(0.0,  z * 3.0);
-    v_blurTexCoords10 = v_texCoord + vec2(0.0,  z * 4.0);
-    v_blurTexCoords11 = v_texCoord + vec2(0.0,  z * 5.0);
-    v_blurTexCoords12 = v_texCoord + vec2(0.0,  z * 6.0);
-    v_blurTexCoords13 = v_texCoord + vec2(0.0,  z * 7.0);
-}

+ 8 - 2
oxygine/src/Font.cpp

@@ -18,7 +18,7 @@ namespace oxygine
     }
     */
 
-    Font::Font() : _size(0), _baselineDistance(0), _scale(1.0f)
+    Font::Font() : _size(0), _baselineDistance(0), _scale(1.0f), _sdf(false)
     {
     }
 
@@ -26,9 +26,10 @@ namespace oxygine
     {
     }
 
-    void Font::init(const char* name, int realSize, int baselineDistance, int lineHeight)
+    void Font::init(const char* name, int realSize, int baselineDistance, int lineHeight, bool sdf)
     {
         setName(name);
+        _sdf = sdf;
         _size = realSize;
         _baselineDistance = baselineDistance;
         _lineHeight = lineHeight;
@@ -101,4 +102,9 @@ namespace oxygine
     {
         return _lineHeight;
     }
+
+    bool Font::isSDF() const
+    {
+        return _sdf;
+    }
 }

+ 3 - 1
oxygine/src/Font.h

@@ -46,7 +46,7 @@ namespace oxygine
         Font();
         ~Font();
 
-        void init(const char* name, int size, int baselineDistance, int lineHeight);
+        void init(const char* name, int size, int baselineDistance, int lineHeight, bool sdf = false);
 
         void addGlyph(const glyph& g);
         void sortGlyphs() {}
@@ -58,6 +58,7 @@ namespace oxygine
         int             getSize() const;
         float           getScale() const;
         int             getLineHeight() const;
+        bool            isSDF() const;
 
     protected:
         const glyph* findGlyph(int code) const;
@@ -72,6 +73,7 @@ namespace oxygine
         glyphs _glyphs;
 
         float _scale;
+        bool _sdf;
 
         int _size;
         int _baselineDistance;

+ 27 - 1
oxygine/src/STDMaterial.cpp

@@ -174,10 +174,36 @@ namespace oxygine
 
         _renderer->setBlendMode(tf->getBlendMode());
         _renderer->setTransform(rs.transform);
-        _renderer->beginElementRendering(true);
+
+
+        if (tf->getFont()->isSDF())
+        {
+            float scale = sqrtf(rs.transform.a * rs.transform.a + rs.transform.c * rs.transform.c);
+            if (tf->getFontSize2Scale())
+                scale = scale * tf->getFontSize2Scale() / tf->getFont()->getSize();
+
+            float contrast = 3.0 + 30 * scale / 3.7f;
+            float offset = 0.35f + 0.05f * scale / 3.7f;
+            offset = 0.35f;
+
+
+            if (scale < 1.0f)
+            {
+                contrast /= 2;
+                offset = 0.25;
+            }
+
+            float outline = offset - tf->getOutline();
+            _renderer->beginSDFont(contrast, offset, tf->getOutlineColor(), outline);
+        }
+        else
+            _renderer->beginElementRendering(true);
+
         dc.renderer = _renderer;
 
         root->draw(dc);
+
+        _renderer->endSDFont();
     }
 
     void STDMaterial::doRender(ColorRectSprite* sprite, const RenderState& rs)

+ 36 - 0
oxygine/src/STDRenderer.cpp

@@ -608,6 +608,42 @@ namespace oxygine
         _uberShader = pr;
     }
 
+    void STDRenderer::beginSDFont(float contrast, float offset, const Color& outlineColor, float outlineOffset)
+    {
+        if (_alpha)
+        {
+            drawBatch();
+            _shaderFlags &= ~UberShaderProgram::SEPARATE_ALPHA;
+            _alpha = 0;
+        }
+
+        unsigned int shaderFlags = _shaderFlags;
+        shaderFlags |= UberShaderProgram::SDF;
+
+        if (_shaderFlags != shaderFlags)
+        {
+            drawBatch();
+        }
+
+        _shaderFlags = shaderFlags;
+
+        ShaderProgram* prog = _uberShader->getShaderProgram(_shaderFlags)->program;
+        setShader(prog);
+
+        Vector4 c;
+        c = Vector4(outlineColor.getRedF(), outlineColor.getGreenF(), outlineColor.getBlueF(), outlineColor.getAlphaF());
+        _driver->setUniform("sdf_outline_color", &c, 1);
+
+        c = Vector4(offset, contrast, outlineOffset, contrast);
+        _driver->setUniform("sdf_params", &c, 1);
+    }
+
+    void STDRenderer::endSDFont()
+    {
+        drawBatch();
+        _shaderFlags &= ~UberShaderProgram::SDF;
+    }
+
     void STDRenderer::beginElementRendering(bool basePremultiplied)
     {
         if (_alpha)

+ 2 - 0
oxygine/src/STDRenderer.h

@@ -57,6 +57,8 @@ namespace oxygine
         void setTransform(const Transform& tr) { _transform = tr; }
 
         void beginElementRendering(bool basePremultiplied);// OVERRIDE;
+        void beginSDFont(float contrast, float offset, const Color& outlineColor, float outlineOffset);
+        void endSDFont();
         void drawElement(const spNativeTexture& texture, unsigned int color, const RectF& src, const RectF& dest) OVERRIDE;
         void draw(const Color&, const RectF& srcRect, const RectF& destRect);
         /**Draws existing batch immediately.*/

+ 4 - 3
oxygine/src/core/UberShaderProgram.cpp

@@ -64,9 +64,10 @@ namespace oxygine
                 strcat(prepend, "#define MASK_R_CHANNEL\n");
 
             if (flags & MASK)
-            {
                 strcat(prepend, "#define MASK\n");
-            }
+
+            if (flags & SDF)
+                strcat(prepend, "#define SDF\n");
 
             char* end = prepend + strlen(prepend);
             strcat(prepend, "#define program_main_ps main\n");
@@ -117,7 +118,7 @@ namespace oxygine
 
     void UberShaderProgram::releaseShaders()
     {
-        for (int i = 0; i < SIZE; ++i)
+        for (int i = 0; i < _SIZE; ++i)
         {
             shader& s = _shaders[i];
             delete s.program;

+ 3 - 2
oxygine/src/core/UberShaderProgram.h

@@ -59,7 +59,8 @@ namespace oxygine
             SEPARATE_ALPHA = 1 << 1,
             MASK_R_CHANNEL = 1 << 2,
             MASK = 1 << 3,
-            SIZE = 1 << 4
+            SDF = 1 << 4,
+            _SIZE = 1 << 5
         };
 
         enum
@@ -76,6 +77,6 @@ namespace oxygine
 
     protected:
         void releaseShaders() OVERRIDE;
-        shader _shaders[SIZE];
+        shader _shaders[_SIZE];
     };
 }

File diff suppressed because it is too large
+ 0 - 1
oxygine/src/core/system_data.cpp


+ 4 - 3
oxygine/src/res/ResFontBM.cpp

@@ -53,7 +53,7 @@ namespace oxygine
         return font;
     }
 
-    ResFontBM::ResFontBM(): _font(0), _format(TF_R8G8B8A8), _premultipliedAlpha(false)
+    ResFontBM::ResFontBM(): _font(0), _format(TF_R8G8B8A8), _premultipliedAlpha(false), _sdf(false)
     {
 
     }
@@ -73,6 +73,7 @@ namespace oxygine
 
     void ResFontBM::initSD(const char* fntPath, int downsample)
     {
+        _sdf = true;
         _premultipliedAlpha = true;
         _file = fntPath;
         _createFont(0, true, false, downsample);
@@ -312,7 +313,7 @@ namespace oxygine
 
         fontSize = abs(fontSize);
         Font* font = new Font();
-        font->init(getName().c_str(), fontSize, fontSize, lineHeight + fontSize - base);
+        font->init(getName().c_str(), fontSize, fontSize, lineHeight + fontSize - base, _sdf);
         _font = font;
 
         if (context)
@@ -502,7 +503,7 @@ namespace oxygine
 
         fontSize = abs(fontSize);
         Font* font = new Font();
-        font->init(getName().c_str(), fontSize, fontSize, lineHeight + fontSize - base);
+        font->init(getName().c_str(), fontSize, fontSize, lineHeight + fontSize - base, _sdf);
         _font = font;
 
         if (context)

+ 3 - 0
oxygine/src/res/ResFontBM.h

@@ -31,6 +31,8 @@ namespace oxygine
 
         const Font* getFont(const char* name = 0, int size = 0) const OVERRIDE;
 
+        bool isSignedDistance() const { return _sdf; }
+
     private:
         struct page
         {
@@ -50,6 +52,7 @@ namespace oxygine
         typedef std::vector<page> pages;
         pages _pages;
         Font* _font;
+        bool _sdf;
 
         TextureFormat _format;
 

+ 23 - 0
oxygine/system_data/original/system/shader.glsl

@@ -3,6 +3,10 @@ varying lowp vec4 result_color;
 varying mediump vec2 result_uv;
 varying mediump vec2 result_uv2;
 
+//SDF data
+uniform lowp vec4 sdf_outline_color;
+uniform mediump vec4 sdf_params;
+
 #ifdef VS
 uniform mediump mat4 mat;
 uniform mediump vec3 msk[4];
@@ -35,6 +39,10 @@ uniform lowp sampler2D base_texture;
 uniform lowp sampler2D mask_texture;
 uniform lowp sampler2D alpha_texture;
 
+#ifdef SDF
+#define DONT_MULT_BY_RESULT_COLOR
+#endif
+
 lowp vec4 get_base()
 {
 	lowp vec4 base = texture2D(base_texture, result_uv);	
@@ -59,6 +67,17 @@ lowp vec4 get_base()
 	return base;
 }
 
+
+lowp vec4 get_base_sdf()
+{
+	lowp float tx = texture2D(base_texture, result_uv).r;
+     
+    lowp float b =   min((tx - sdf_params.z) * sdf_params.w, 1.0);
+    lowp float a = clamp((tx - sdf_params.x) * sdf_params.y, 0.0, 1.0);
+
+    return lowp vec4(sdf_outline_color + (result_color - sdf_outline_color)*a) * b;
+}
+
 lowp vec4 get_color()
 {
 
@@ -66,7 +85,11 @@ lowp vec4 get_color()
 	//define REPLACED_GET_BASE and declare your own function replaced_get_base()
 	lowp vec4 base = replaced_get_base();
 #else
+#	ifdef SDF
+	lowp vec4 base = get_base_sdf();
+#	else
 	lowp vec4 base = get_base();
+#	endif
 #endif
 
 

Some files were not shown because too many files changed in this diff