dmuratshin 8 years ago
parent
commit
f53fd6527d

+ 0 - 1
examples/Demo/proj.win32/Demo.vcxproj

@@ -141,7 +141,6 @@
     <ClInclude Include="../src/TestTweenText.h" />
     <ClInclude Include="../src/TestTweens.h" />
     <ClInclude Include="../src/TestUserShader.h" />
-    <ClInclude Include="../src/TestUserShader2.h" />
     <ClInclude Include="../src/example.h" />
     <ClInclude Include="../src/test.h" />
     <ClInclude Include="..\src\TestCamera.h" />

+ 0 - 1
examples/Demo/proj.win32/Demo.vcxproj.filters

@@ -31,7 +31,6 @@
     <ClInclude Include="../src/TestTweenText.h" />
     <ClInclude Include="../src/TestTweens.h" />
     <ClInclude Include="../src/TestUserShader.h" />
-    <ClInclude Include="../src/TestUserShader2.h" />
     <ClInclude Include="../src/example.h" />
     <ClInclude Include="../src/test.h" />
     <ClInclude Include="..\src\TestEdges.h" />

+ 12 - 12
examples/Demo/src/TestSignedDistanceFont.h

@@ -12,14 +12,14 @@ public:
     float offset = 0.5f;
     float outline = 0.4f;
 
-    static UberShaderProgram *uberShader;
+    static UberShaderProgram* uberShader;
 
 
     static void initMaterial()
     {
         uberShader = new UberShaderProgram();
         uberShader->init(STDRenderer::uberShaderBody,
-            R"(
+                         R"(
                 #define REPLACED_GET_BASE
                 #define DONT_MULT_BY_RESULT_COLOR
 
@@ -27,7 +27,7 @@ public:
                 uniform mediump vec4 sdf_params;
             )",
 
-            R"(
+                         R"(
 #ifdef PS
                 lowp vec4 replaced_get_base()
                 {
@@ -49,7 +49,7 @@ public:
         delete uberShader;
     }
 
-    void init() override 
+    void init() override
     {
         _uberShader = uberShader;
     }
@@ -68,12 +68,12 @@ public:
         return a.outlineColor == b.outlineColor && a.offset == b.offset && a.outline == b.outline;
     }
 
-    void xapply() override 
+    void xapply() override
     {
         STDMaterialX::xapply();
 
-        const AffineTransform &tr = STDRenderer::getCurrent()->getTransform();
-        float scale = sqrt(tr.a *tr.a + tr.c * tr.c);
+        const AffineTransform& tr = STDRenderer::getCurrent()->getTransform();
+        float scale = sqrt(tr.a * tr.a + tr.c * tr.c);
         float contrast = 3.0f + scale * 8.0f;
 
         Vector4 sdfParams(offset, contrast, outline, contrast);
@@ -81,11 +81,11 @@ public:
 
         Vector4 color = outlineColor.toVector();
         IVideoDriver::instance->setUniform("sdf_outline_color", color);
-        
+
     }
 };
 
-UberShaderProgram *SDFMaterial::uberShader = 0;
+UberShaderProgram* SDFMaterial::uberShader = 0;
 
 class TestSignedDistanceFont : public Test
 {
@@ -139,9 +139,9 @@ public:
         txt->setAnchor(0.5f, 0.5f);
         txt->addTween(Actor::TweenRotationDegrees(360), 10000, -1);
 
-        SDFMaterial sdf;
+        spSDFMaterial sdf = new SDFMaterial;
 
-        txt->setMat(mc().cache(sdf));
+        txt->setMat(sdf);
 
 
         addButton("scale+", "scale+");
@@ -178,7 +178,7 @@ public:
         if (id == "weight-")
             mat->offset -= 0.01f;
 
-        //_txt->setMat(mat);
+        _txt->setMat(mat);
 
     }
 

+ 0 - 147
examples/Demo/src/TestUserShader2.h

@@ -1,147 +0,0 @@
-#pragma once
-
-#include "test.h"
-
-class LightningMaterial : public Material
-{
-public:
-    const VertexDeclaration* _vdecl;
-    ShaderProgramGL* _lightShader;
-    Vector2 _light;
-
-    vector<vertexPCT2T2> _vertices;
-    AnimationFrame _normal;
-    spNativeTexture _base;
-
-    LightningMaterial()
-    {
-        _normal = resources.getResAnim("normal")->getFrame(0);
-
-        _light = getStage()->getSize() / 2;
-
-        IVideoDriver* driver = IVideoDriver::instance;
-        _vdecl = driver->getVertexDeclaration(vertexPCT2T2::FORMAT);
-
-        //load vertex shader
-        file::buffer vsdata;
-        file::read("light_vs.glsl", vsdata);
-        vsdata.push_back(0);///null terminating string
-        unsigned int vs = ShaderProgramGL::createShader(GL_VERTEX_SHADER, (const char*)&vsdata.front(), "", "");
-
-        //load fragment shader
-        file::buffer fsdata;
-        file::read("light_fs.glsl", fsdata);
-        fsdata.push_back(0);///null terminating string
-        unsigned int ps = ShaderProgramGL::createShader(GL_FRAGMENT_SHADER, (const char*)&fsdata.front(), "", "");
-
-        //link into 1 shader program
-        unsigned int pr = ShaderProgramGL::createProgram(vs, ps, static_cast<const VertexDeclarationGL*>(IVideoDriver::instance->getVertexDeclaration(vertexPCT2T2::FORMAT)));
-        _lightShader = new ShaderProgramGL(pr);
-
-        //set shader and apply samplers uniforms
-        driver->setShaderProgram(_lightShader);
-        driver->setUniformInt("base_texture", 0);
-        driver->setUniformInt("normal_texture", 1);
-    }
-
-    void apply(Material* prev) override
-    {
-        IVideoDriver* driver = IVideoDriver::instance;
-        driver->setShaderProgram(_lightShader);
-
-        Vector2 light = getStage()->getDescendant("light")->getPosition();
-
-        driver->setUniform("light", light);
-        driver->setUniform("mat", STDRenderer::getCurrent()->getViewProjection());
-
-        driver->setTexture(1, _normal.getDiffuse().base);
-
-        driver->setState(IVideoDriver::STATE_BLEND, 0);
-        driver->setBlendFunc(IVideoDriver::BT_ONE, IVideoDriver::BT_ONE_MINUS_SRC_ALPHA);
-        driver->setBlendFunc(IVideoDriver::BT_SRC_ALPHA, IVideoDriver::BT_ONE_MINUS_SRC_ALPHA);
-    }
-
-    void finish() override
-    {
-        drawBatch(IVideoDriver::instance);
-    }
-
-    void drawBatch(IVideoDriver* driver)
-    {
-        size_t count = _vertices.size();
-        if (!count)
-            return;
-
-        size_t indices = (count * 3) / 2;
-
-        driver->setTexture(0, _base);
-        driver->draw(IVideoDriver::PT_TRIANGLES, _vdecl, &_vertices.front(), (unsigned int)count, &STDRenderer::indices16.front(), (unsigned int)indices);
-
-        _vertices.clear();
-    }
-
-
-    void doRender(Sprite* sprite, const RenderState& rs) override
-    {
-        Material::setCurrent(this);
-
-        vertexPCT2T2 v[4];
-        const AnimationFrame& frame = sprite->getAnimFrame();
-
-        if (frame.getDiffuse().base != _base)
-        {
-            drawBatch(IVideoDriver::instance);
-            _base = frame.getDiffuse().base;
-        }
-
-        fillQuadT2(v, frame.getSrcRect(), _normal.getSrcRect(), sprite->getDestRect(), rs.transform, 0xffFFffFF);
-        _vertices.insert(_vertices.end(), v, v + 4);
-    }
-};
-
-class TestUserShader2 : public Test
-{
-public:
-    Draggable drag;
-
-    TestUserShader2()
-    {
-        LightningMaterial* mat = new LightningMaterial;
-
-        spSprite spr = new Sprite();
-        spr->setResAnim(resources.getResAnim("tiled2"));
-        spr->setScale(2);
-        spr->setAnchor(0.5f, 0.5f);
-        spr->setPosition(content->getSize() / 2);
-        spr->attachTo(content);
-        spr->setMaterial(mat);
-
-
-        spr = new Sprite();
-        spr->setResAnim(resources.getResAnim("tiled2"));
-        spr->setScale(2);
-        spr->setAnchor(0.5f, 0.5f);
-        spr->setPosition(content->getSize() / 2 + Vector2(300, 50));
-        spr->attachTo(content);
-        spr->setMaterial(mat);
-
-        spr = new Sprite();
-        spr->setResAnim(resources.getResAnim("tiled2"));
-        spr->setScale(2);
-        spr->setAnchor(0.5f, 0.5f);
-        spr->setPosition(content->getSize() / 2 + Vector2(-200, 50));
-        spr->attachTo(content);
-        spr->setMaterial(mat);
-
-
-        spSprite light = new Sprite;
-        light->setName("light");
-        light->setResAnim(resources.getResAnim("light"));
-        light->setAnchor(0.5f, 0.5f);
-        drag.init(light.get());
-        light->setPosition(getSize() / 2);
-
-        content->addChild(light);
-    }
-
-};

+ 0 - 3
examples/Demo/src/example.cpp

@@ -14,7 +14,6 @@
 #include "TestBox9Sprite.h"
 #include "TestClipRect.h"
 #include "TestUserShader.h"
-#include "TestUserShader2.h"
 #include "TestMask.h"
 #include "TestPolygon.h"
 #include "TestInputText.h"
@@ -78,7 +77,6 @@ public:
         addButton("box9sprite", "Box9 Sprite");
         addButton("cliprect", "ClipRect Actor");
         addButton("usershader", "Extended UberShader");
-        addButton("usershader2", "Custom shaders and render");
         addButton("opengl", "OpenGL usage");
         addButton("multicolorfont", "Outer Font Color");
         addButton("sdf", "Signed Distance Field Font");
@@ -135,7 +133,6 @@ public:
         if (id == "box9sprite") showTest(new TestBox9Sprite);
         if (id == "cliprect") showTest(new TestClipRect);
         if (id == "usershader") showTest(new TestUserShader);
-        if (id == "usershader2") showTest(new TestUserShader2);
         if (id == "opengl") showTest(new TestOpenGL);
         if (id == "mask") showTest(new TestMask);
         if (id == "polygon") showTest(new TestPolygon);

+ 1 - 1
examples/Demo/src/main.cpp

@@ -68,7 +68,7 @@ void run()
     getStage()->setSize(size);
 
     // DebugActor is a helper actor node. It shows FPS, memory usage and other useful stuff
-    //DebugActor::show();
+    DebugActor::show();
 
     // Initializes our example game. See example.cpp
     example_init();

+ 22 - 5
oxygine/src/oxygine/Sprite.cpp

@@ -223,13 +223,30 @@ namespace oxygine
         _setSize(_frame.getSize().mult(_localScale));
 
 
+        const Diffuse& df = _frame.getDiffuse();
+        if (df.base  != _mat->_base ||
+                df.alpha != _mat->_alpha)
+        {
+            spSTDMaterialX mat = _mat->clone();
+
+            mat->_base  = df.base;
+            mat->_alpha = df.alpha;
+
+            if (df.premultiplied)
+                mat->_flags &= ~UberShaderProgram::ALPHA_PREMULTIPLY;
+            else
+                mat->_flags |= UberShaderProgram::ALPHA_PREMULTIPLY;
+
+            if (df.alpha)
+                mat->_flags |= UberShaderProgram::SEPARATE_ALPHA;
+            else
+                mat->_flags &= ~UberShaderProgram::SEPARATE_ALPHA;
+
+
+            _mat = mc().cache(*mat.get());
+        }
 
-        spSTDMaterialX mat = _mat->clone();
-        mat->_base = _frame.getDiffuse().base;
-        mat->_alpha = _frame.getDiffuse().alpha;
-        mat->_flags = _frame.getDiffuse().premultiplied ? 0 : UberShaderProgram::ALPHA_PREMULTIPLY;
 
-        _mat = mc().cache(*mat.get());
 
         animFrameChanged(_frame);
     }

+ 1 - 1
oxygine/src/oxygine/TextField.h

@@ -71,7 +71,7 @@ namespace oxygine
 
         /**Overwrites TextStyle font.*/
         void setFont(const ResFont* rs);
-        
+
         void setStyle(const TextStyle& st);
         /**Changes text utf-8 string*/
         void setText(const std::string& str);

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


+ 1 - 1
oxygine/src/oxygine/res/ResFontBM.cpp

@@ -64,7 +64,7 @@ namespace oxygine
     {
         cleanup();
     }
-    
+
     const oxygine::Font* ResFontBM::getClosestFont(float worldScale, int styleFontSize, float& resScale) const
     {
         if (!styleFontSize)

+ 9 - 5
oxygine/src/oxygine/text_utils/Node.cpp

@@ -230,12 +230,16 @@ namespace oxygine
                             }
                         }
 
-                        spSTDMaterialX mat = rd.mat->clone();
-
-                        mat->_base = gl->texture;
-
+                        if (rd.mat->_base == gl->texture)
+                            s.mat = rd.mat;
+                        else
+                        {
+                            spSTDMaterialX mat = rd.mat->clone();
+                            mat->_base = gl->texture;
 
-                        s.mat = mc().cache(*mat.get());
+                            s.mat = mc().cache(*mat.get());
+                            rd.mat = s.mat;
+                        }
                     }
                     ++i;
                     if (i < 0)

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

@@ -44,6 +44,7 @@ lowp vec4 replaced_get_color();
 lowp vec4 get_base()
 {
 	lowp vec4 base = texture2D(base_texture, result_uv);	
+	
 #ifdef SEPARATE_ALPHA
 	base.a = texture2D(alpha_texture, result_uv).r;	
 #endif

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