dmuratshin 8 سال پیش
والد
کامیت
d75d2052f9

+ 3 - 0
examples/Demo/src/TestSignedDistanceFont.h

@@ -53,6 +53,9 @@ public:
         txt->setWidth(getStage()->getWidth() / 2);
         txt->setAnchor(0.5f, 0.5f);
 
+        SDFMaterial sdf;
+
+        txt->setMat(mc().cache(sdf));
 
 
         addButton("scale+", "scale+");

+ 19 - 2
oxygine/src/oxygine/MaterialX.cpp

@@ -5,7 +5,7 @@
 
 namespace oxygine
 {
-    spMaterialX currentMat;
+    spMaterialX MaterialX::current;
 
     bool STDMatData::cmp(const STDMatData& b) const
     {
@@ -22,7 +22,7 @@ namespace oxygine
         return true;
     }
 
-    STDMatData::STDMatData() : _blend(blend_alpha), _flags(0), _uberShader(&STDRenderer::uberShader)
+    STDMatData::STDMatData() : _blend(blend_premultiplied_alpha), _flags(0), _uberShader(&STDRenderer::uberShader)
     {
 
     }
@@ -64,11 +64,28 @@ namespace oxygine
 
     void MaterialX::render(const AffineTransform &tr, const Color& c, const RectF& src, const RectF& dest)
     {
+        /*
+        if (current.get() != this)
+        {
+            STDRenderer::getCurrent()->flush();
+            apply();
+            current = this;
+        }
+        */
         STDRenderer::getCurrent()->draw(this, tr, c, src, dest);
     }
 
     void MaterialX::render(const Color& c, const RectF& src, const RectF& dest)
     {
+        /*
+        if (current.get() != this)
+        {
+            STDRenderer::getCurrent()->flush();
+            apply();
+            current = this;
+        }
+        */
+
         STDRenderer::getCurrent()->draw(this, c, src, dest);
     }
 

+ 7 - 2
oxygine/src/oxygine/MaterialX.h

@@ -11,6 +11,7 @@ namespace oxygine
         typedef bool (*fn)(const cl&a, const cl&b);\
         fn f = &cl::cmp;\
         _compare = (compare)f;\
+        init();\
     }\
     void copyFrom(const MaterialX &r) override {*this = (cl&)r;}\
     cl* clone() const override {return new cl(*this);}\
@@ -28,6 +29,8 @@ namespace oxygine
     {
     public:
 
+        static spMaterialX current;
+
         typedef bool(*compare)(const MaterialX* a, const MaterialX* b);
 
         MaterialX();
@@ -36,17 +39,19 @@ namespace oxygine
         MaterialX(compare cmp);
         MaterialX(const MaterialX& other);
 
+
         size_t _hash;
         compare _compare;
 
+        virtual void init() {}
         virtual void apply() = 0;
         virtual MaterialX* clone() const = 0;
         virtual void copyFrom(const MaterialX& r) = 0;
         virtual void update(size_t& hash, compare&) const = 0;
         virtual void rehash(size_t& hash) const = 0;
 
-        void render(const AffineTransform &tr, const Color& c, const RectF& src, const RectF& dest);
-        void render(const Color& c, const RectF& src, const RectF& dest);
+        virtual void render(const AffineTransform &tr, const Color& c, const RectF& src, const RectF& dest);
+        virtual void render(const Color& c, const RectF& src, const RectF& dest);
     };
 
     typedef intrusive_ptr<MaterialX> spMaterialX;

+ 14 - 0
oxygine/src/oxygine/STDRenderer.cpp

@@ -837,6 +837,15 @@ namespace oxygine
     }
 
 
+    void SDFMaterial::init()
+    {
+        data._flags = UberShaderProgram::SDF;
+        //if (outlineOffset < offset)
+        data._flags |= UberShaderProgram::SDF_OUTLINE;
+        outlineParams = Vector4(0.25f, 6.25f, 0.15f, 12.5f);
+        outlineColor = Vector4(1, 1, 1, 1);
+    }
+
     void SDFMaterial::rehash(size_t& hash) const
     {
         data.init(hash);
@@ -859,4 +868,9 @@ namespace oxygine
         IVideoDriver::instance->setUniform("sdf_params", outlineParams);
     }
 
+    void SDFMaterial::render(const Color& c, const RectF& src, const RectF& dest)
+    {
+        STDRenderer::getCurrent()->draw(this, c, src, dest);
+    }
+
 }

+ 3 - 0
oxygine/src/oxygine/STDRenderer.h

@@ -10,6 +10,8 @@ namespace oxygine
     public:
         MATX(SDFMaterial);
 
+        void init() override;
+
         Vector4 outlineColor = Vector4(0.0f, 0.0f, 0.0f, 0.0f);
         Vector4 outlineParams = Vector4(0.0f, 0.0f, 0.0f, 0.0f);
 
@@ -19,6 +21,7 @@ namespace oxygine
         static bool cmp(const SDFMaterial& a, const SDFMaterial& b);
 
         void apply();
+        void render(const Color& c, const RectF& src, const RectF& dest) override;
     };
 
     class STDRenderer : public IElementRenderer