dmuratshin 8 년 전
부모
커밋
2c35f1d5d8

+ 22 - 50
examples/Demo/src/TestColorFont.h

@@ -2,52 +2,36 @@
 #include "test.h"
 #include "test.h"
 
 
 
 
-DECLARE_SMART(ShaderTextField, spShaderTextField);
-class CustomShader : public Material
+class ColoredShaderMat : public STDMaterialX
 {
 {
 public:
 public:
-    static CustomShader* get(Actor* a)
-    {
-        return safeCast<CustomShader*>(a->getMaterial());
-    }
+    MATX(ColoredShaderMat);
 
 
-    CustomShader(UberShaderProgram* shader): _shader(shader) {}
+    Vector4 uniformBlack = Vector4(0.0f, 0.0f, 0.0f, 1.0f);
+    Vector4 uniformWhite = Vector4(1.0f, 1.0f, 1.0f, 1.0f);
 
 
-    void apply(Actor* a)
-    {
-        a->setMaterial(this);
-    }
 
 
-    void free()
+    void rehash(size_t& hash) const override
     {
     {
-
+        data.init(hash);
+        hash_combine(hash, uniformBlack.x, uniformBlack.y, uniformBlack.z, uniformBlack.w);
+        hash_combine(hash, uniformWhite.x, uniformWhite.y, uniformWhite.z, uniformWhite.w);
     }
     }
 
 
-    void setUniforms(IVideoDriver* driver, ShaderProgram* prog)
+    static bool cmp(const ColoredShaderMat& a, const ColoredShaderMat& b)
     {
     {
-        //driver->setUniform("userValue", &_val, 1);
-
-        /*Color q(_adata, _adata, _adata, _adata);
-        Vector4 c;
-        c = tovec(_outer * q);
-        driver->setUniform("_black", &c, 1);
-        c = tovec(getColor() * _style.color * q);
-        driver->setUniform("_white", &c, 1);*/
+        if (!MaterialTX<STDMatData>::cmp(a, b))
+            return false;
+
+        return a.uniformWhite == b.uniformWhite && a.uniformBlack == b.uniformBlack;
     }
     }
 
 
-    void doRender(Actor* actor, RenderState& rs)
+    void apply()
     {
     {
-        /* _shader->setShaderUniformsCallback(CLOSURE(this, &CustomShader::setUniforms));
-         STDRenderer* renderer = safeCast<STDRenderer*>(rs.renderer);
-         renderer->setUberShaderProgram(_shader);
-
-         actor->doRender(rs);
-
-         renderer->setUberShaderProgram(&Renderer::uberShader);
-         _shader->setShaderUniformsCallback(UberShaderProgram::ShaderUniformsCallback());*/
+        MaterialTX<STDMatData>::apply();
+        IVideoDriver::instance->setUniform("_black", uniformBlack);
+        IVideoDriver::instance->setUniform("_white", uniformWhite);
     }
     }
-
-    UberShaderProgram* _shader;
 };
 };
 
 
 class ShaderTextField : public TextField
 class ShaderTextField : public TextField
@@ -76,11 +60,12 @@ public:
         delete shader;
         delete shader;
     }
     }
 
 
-    //void set
+    ColoredShaderMat mat;
 
 
     ShaderTextField() : _outer(Color::White)
     ShaderTextField() : _outer(Color::White)
     {
     {
-
+        mat.data._uberShader = shader;
+        _mat = mc().cache(mat);
     }
     }
 
 
     const Color& getOuterColor() const
     const Color& getOuterColor() const
@@ -107,24 +92,11 @@ private:
         c = (getColor() * _style.color * q).toVector();
         c = (getColor() * _style.color * q).toVector();
         driver->setUniform("_white", c);
         driver->setUniform("_white", c);
     }
     }
-
-    void doRender(const RenderState& rs)
-    {
-        Material::setCurrent(rs.material);
-
-        STDRenderer* renderer = STDRenderer::getCurrent();
-        _adata = rs.alpha;
-        shader->setShaderUniformsCallback(CLOSURE(this, &ShaderTextField::setUniforms));
-        renderer->setUberShaderProgram(shader);
-        TextField::doRender(rs);
-        renderer->setUberShaderProgram(&STDRenderer::uberShader);
-
-        shader->setShaderUniformsCallback(UberShaderProgram::ShaderUniformsCallback());
-    }
 };
 };
 
 
-UberShaderProgram* ShaderTextField::shader = 0;
+DECLARE_SMART(ShaderTextField, spShaderTextField);
 
 
+UberShaderProgram* ShaderTextField::shader = 0;
 
 
 class TestColorFont : public Test
 class TestColorFont : public Test
 {
 {

+ 21 - 38
examples/Demo/src/TestUserShader.h

@@ -2,10 +2,10 @@
 #include "test.h"
 #include "test.h"
 
 
 
 
-class MyTestMat : public MaterialTX<STDMatData>
+class CustomUniformMat : public MaterialTX<STDMatData>
 {
 {
 public:
 public:
-    MATX(MyTestMat);
+    MATX(CustomUniformMat);
 
 
     Vector4 uniform = Vector4(0.0f, 0.0f, 0.0f, 0.0f);
     Vector4 uniform = Vector4(0.0f, 0.0f, 0.0f, 0.0f);
 
 
@@ -16,7 +16,7 @@ public:
         hash_combine(hash, uniform.x, uniform.y, uniform.z, uniform.w);
         hash_combine(hash, uniform.x, uniform.y, uniform.z, uniform.w);
     }
     }
 
 
-    static bool cmp(const MyTestMat& a, const MyTestMat& b)
+    static bool cmp(const CustomUniformMat& a, const CustomUniformMat& b)
     {
     {
         if (!MaterialTX<STDMatData>::cmp(a, b))
         if (!MaterialTX<STDMatData>::cmp(a, b))
             return false;
             return false;
@@ -32,51 +32,30 @@ public:
 };
 };
 
 
 
 
-class TweenShader: public Tween//, public Material
+class TweenUniform: public Tween
 {
 {
 public:
 public:
-    UberShaderProgram* _program;
-    Vector4 _val;
-    TweenShader(UberShaderProgram* prog) : _program(prog), _val(0, 0, 0, 0) {}
-    ~TweenShader()
-    {
-        if (_client)
-            _client->setMaterial(0);
-    }
+    TweenUniform() {}
 
 
     void _start(Actor& actor) override
     void _start(Actor& actor) override
     {
     {
-        Sprite& spr = (Sprite&)actor;
-
-        MyTestMat my;
-        my.data = spr._mat->data;
-        my.data.us = _program;
-        my.uniform = _val;
-
-        spr._mat = mc().add2(my);
+        upd(actor, Vector4(0,0,0,0));
     }
     }
 
 
-    void _update(Actor& actor, const UpdateState& us) override
+    void upd(Actor& actor, const Vector4 &val)
     {
     {
         Sprite& spr = (Sprite&)actor;
         Sprite& spr = (Sprite&)actor;
 
 
-        _val = lerp(Vector4(1, 1, 1, 0), Vector4(0, 0, 0, 0),  _percent);
-
-        MyTestMat my;
-        my.data = spr._mat->data;
-        my.data.us = _program;
-        my.uniform = _val;
-
+        CustomUniformMat& my = *safeCast<CustomUniformMat*>(spr._mat.get());
+        my.uniform = val;
 
 
-        spr._mat = mc().add2(my);
+        spr._mat = mc().cache(my);
     }
     }
 
 
-    void _done(Actor& actor, const UpdateState& us) override
+    void _update(Actor& actor, const UpdateState& us) override
     {
     {
-        Sprite& spr = (Sprite&)actor;
-        STDMaterialX mat;
-        mat.data = spr._mat->data;
-        spr._mat = mc().add2(mat);
+        Vector4 val = lerp(Vector4(1, 1, 1, 0), Vector4(0, 0, 0, 0),  _percent);
+        upd(actor, val);
     }
     }
 };
 };
 
 
@@ -130,8 +109,6 @@ public:
         _sprite->setResAnim(resources.getResAnim("bg"));
         _sprite->setResAnim(resources.getResAnim("bg"));
         _sprite->attachTo(content);
         _sprite->attachTo(content);
 
 
-        //_sprite->addTween2(new TweenShader(_shaderInvert), TweenOptions(2000).twoSides(true).loops(-1));
-
         toggle t[] =
         toggle t[] =
         {
         {
             toggle("->shader:add color", 0, _shaderAddColor),
             toggle("->shader:add color", 0, _shaderAddColor),
@@ -154,10 +131,16 @@ public:
     {
     {
         if (id == "shader")
         if (id == "shader")
         {
         {
+            _sprite->removeTweens();
+
             UberShaderProgram* shader = (UberShaderProgram*)data->data;
             UberShaderProgram* shader = (UberShaderProgram*)data->data;
 
 
-            _sprite->removeTweens();
-            _sprite->addTween2(new TweenShader(shader), TweenOptions(3000).twoSides(true).loops(-1));
+            CustomUniformMat mat;
+            mat.data = _sprite->_mat->data;
+            mat.data._uberShader = shader;
+            _sprite->_mat = mc().cache(mat);
+
+            _sprite->addTween2(new TweenUniform(), TweenOptions(3000).twoSides(true).loops(-1));
         }
         }
     }
     }
 
 

+ 1 - 1
oxygine/src/oxygine/ColorRectSprite.cpp

@@ -16,7 +16,7 @@ namespace oxygine
         STDMaterialX mat;
         STDMaterialX mat;
         mat.data._base = STDRenderer::white;
         mat.data._base = STDRenderer::white;
 
 
-        _mat = mc().add2(mat);
+        _mat = mc().cache(mat);
     }
     }
 
 
     ColorRectSprite::~ColorRectSprite()
     ColorRectSprite::~ColorRectSprite()

+ 5 - 5
oxygine/src/oxygine/MaterialX.cpp

@@ -7,7 +7,7 @@ namespace oxygine
 {
 {
     spMaterialX currentMat;
     spMaterialX currentMat;
 
 
-    bool STDMatData::isSame(const STDMatData& b) const
+    bool STDMatData::cmp(const STDMatData& b) const
     {
     {
         if (_base != b._base)
         if (_base != b._base)
             return false;
             return false;
@@ -17,12 +17,12 @@ namespace oxygine
             return false;
             return false;
         if (_flags != b._flags)
         if (_flags != b._flags)
             return false;
             return false;
-        if (us != b.us)
+        if (_uberShader != b._uberShader)
             return false;
             return false;
         return true;
         return true;
     }
     }
 
 
-    STDMatData::STDMatData() : _blend(blend_alpha), _flags(0), us(&STDRenderer::uberShader)
+    STDMatData::STDMatData() : _blend(blend_alpha), _flags(0), _uberShader(&STDRenderer::uberShader)
     {
     {
 
 
     }
     }
@@ -33,13 +33,13 @@ namespace oxygine
         hash_combine(hash, _alpha.get());
         hash_combine(hash, _alpha.get());
         hash_combine(hash, (int)_blend);
         hash_combine(hash, (int)_blend);
         hash_combine(hash, _flags);
         hash_combine(hash, _flags);
-        hash_combine(hash, us);
+        hash_combine(hash, _uberShader);
     }
     }
 
 
     void STDMatData::apply()
     void STDMatData::apply()
     {
     {
         STDRenderer* r = STDRenderer::getCurrent();
         STDRenderer* r = STDRenderer::getCurrent();
-        r->setUberShaderProgram(us);
+        r->setUberShaderProgram(_uberShader);
         r->setShaderFlags(_flags);
         r->setShaderFlags(_flags);
         r->setTextureNew(UberShaderProgram::SAMPLER_BASE, _base);
         r->setTextureNew(UberShaderProgram::SAMPLER_BASE, _base);
         r->setTextureNew(UberShaderProgram::SAMPLER_ALPHA, _alpha);
         r->setTextureNew(UberShaderProgram::SAMPLER_ALPHA, _alpha);

+ 8 - 9
oxygine/src/oxygine/MaterialX.h

@@ -101,14 +101,13 @@ namespace oxygine
         template<class C>
         template<class C>
         static bool cmp(const MaterialTX<C>& a, const MaterialTX<C>& b)
         static bool cmp(const MaterialTX<C>& a, const MaterialTX<C>& b)
         {
         {
-            return a.data.isSame(b.data);
+            return a.data.cmp(b.data);
         }
         }
 
 
         void apply() override
         void apply() override
         {
         {
             data.apply();
             data.apply();
         }
         }
-
     };
     };
 
 
 
 
@@ -128,15 +127,15 @@ namespace oxygine
     public:
     public:
         STDMatData();
         STDMatData();
 
 
-        spNativeTexture _base;
-        spNativeTexture _alpha;
-        blend_mode      _blend;
-        UberShaderProgram* us;
-        int             _flags;
+        spNativeTexture    _base;
+        spNativeTexture    _alpha;
+        blend_mode         _blend;
+        UberShaderProgram* _uberShader;
+        int                _flags;
 
 
         void init(size_t& hash) const;
         void init(size_t& hash) const;
         void apply();
         void apply();
-        bool isSame(const STDMatData& b) const;
+        bool cmp(const STDMatData& b) const;
     };
     };
 
 
 
 
@@ -153,7 +152,7 @@ namespace oxygine
 
 
 
 
         template<class T>
         template<class T>
-        intrusive_ptr<T> add2(const T& other)
+        intrusive_ptr<T> cache(const T& other)
         {
         {
             size_t hash;
             size_t hash;
             MaterialX::compare cm;
             MaterialX::compare cm;

+ 1 - 1
oxygine/src/oxygine/Sprite.cpp

@@ -230,7 +230,7 @@ namespace oxygine
         mat.data._alpha = _frame.getDiffuse().alpha;
         mat.data._alpha = _frame.getDiffuse().alpha;
         mat.data._flags = _frame.getDiffuse().premultiplied ? 0 : UberShaderProgram::ALPHA_PREMULTIPLY;
         mat.data._flags = _frame.getDiffuse().premultiplied ? 0 : UberShaderProgram::ALPHA_PREMULTIPLY;
 
 
-        _mat = mc().add2(mat);
+        _mat = mc().cache(mat);
 
 
         animFrameChanged(_frame);
         animFrameChanged(_frame);
     }
     }

+ 2 - 2
oxygine/src/oxygine/VisualStyle.cpp

@@ -17,7 +17,7 @@ namespace oxygine
         MaterialTX<STDMatData> mat;
         MaterialTX<STDMatData> mat;
         mat.data._blend = blend_premultiplied_alpha;
         mat.data._blend = blend_premultiplied_alpha;
 
 
-        _mat = mc().add2(mat);
+        _mat = mc().cache(mat);
     }
     }
 
 
     void VStyleActor::copyFrom(const VStyleActor& src, cloneOptions opt)
     void VStyleActor::copyFrom(const VStyleActor& src, cloneOptions opt)
@@ -93,7 +93,7 @@ namespace oxygine
 
 
         _mat = _mat->clone();
         _mat = _mat->clone();
         _mat->data._blend = mode;
         _mat->data._blend = mode;
-        _mat = mc().add2(*_mat.get());
+        _mat = mc().cache(*_mat.get());
 
 
         blendModeChanged(mode);
         blendModeChanged(mode);
     }
     }

+ 1 - 1
oxygine/src/oxygine/text_utils/Node.cpp

@@ -204,7 +204,7 @@ namespace oxygine
                         mat.data._base = gl->texture;
                         mat.data._base = gl->texture;
 
 
 
 
-                        s.materialX = mc().add2(mat);
+                        s.materialX = mc().cache(mat);
                     }
                     }
                     ++i;
                     ++i;
                     if (i < 0)
                     if (i < 0)