dmuratshin 8 years ago
parent
commit
0767240af3

+ 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();

+ 30 - 1
oxygine/src/oxygine/TextField.cpp

@@ -191,7 +191,13 @@ namespace oxygine
     void TextField::matChanged()
     {
         log::warning("not optimal");
-        needRebuild();
+        if (_flags & flag_rebuild)
+            return;
+
+        if (!_root)
+            return;
+
+        _root->updateMaterial(*_mat.get());
     }
 
     void TextField::setText(const std::string& str)
@@ -344,6 +350,29 @@ namespace oxygine
 
             _textRect = rd.bounds;
         }
+        else
+        {
+            int sdfSize;
+            if (_style.font && _style.font->isSDF(sdfSize))
+            {
+                SDFMaterial *sdf = safeCast<SDFMaterial*>(_mat.get());
+                static float lastGS = 0;
+                if (lastGS != globalScale)
+                {
+                    if (getFontSize())
+                        scale = scale * getFontSize() / sdfSize;
+
+                    float contrast = 3.0f + scale * 8.0f;
+                    float offset = getWeight();
+                    float outline = getWeight() - getOutline();
+
+                    Vector4 vvv(offset, contrast, outline, contrast);
+                    sdf->outlineParams = vvv;
+                    matChanged();
+                }
+                lastGS = globalScale;
+            }
+        }
 
         return _root;
     }

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

@@ -100,6 +100,17 @@ namespace oxygine
 
 
 
+        void Node::updateMaterial(const STDMaterialX& mat)
+        {
+            Node* node = _firstChild;
+            while (node)
+            {
+                node->updateMaterial(mat);
+                node = node->_nextSibling;
+            }
+            xupdateMaterial(mat);
+        }
+
         /*
         bool test()
         {
@@ -151,7 +162,8 @@ namespace oxygine
 
         void TextNode::draw(DrawContext& dc)
         {
-            for (size_t i = 0; i < _data.size(); ++i)
+            size_t size = _data.size();
+            for (size_t i = 0; i < size; ++i)
             {
                 const Symbol& s = _data[i];
                 if (!s.mat)
@@ -163,6 +175,22 @@ namespace oxygine
             drawChildren(dc);
         }
 
+        void TextNode::xupdateMaterial(const STDMaterialX& mat)
+        {
+            for (size_t i = 0; i < _data.size(); ++i)
+            {
+                size_t size = _data.size();
+                for (size_t i = 0; i < size; ++i)
+                {
+                    Symbol& s = _data[i];
+
+                    spSTDMaterialX m = mat.clone();
+
+                    s.mat = mc().cache(mat);
+                }
+            }
+        }
+
         int _defMissing = '?';
         void TextNode::setDefaultMissingSymbol(int v)
         {

+ 4 - 0
oxygine/src/oxygine/text_utils/Node.h

@@ -57,6 +57,9 @@ namespace oxygine
             virtual void xresize(Aligner& rd) {}
             virtual void xfinalPass(Aligner& rd) {}
 
+            void updateMaterial(const STDMaterialX& mat);
+            virtual void xupdateMaterial(const STDMaterialX& mat) {}
+
 
             Node* _firstChild;
             Node* _lastChild;
@@ -74,6 +77,7 @@ namespace oxygine
             void xresize(Aligner& rd) override;
             void xfinalPass(Aligner& rd) override;
             void draw(DrawContext& dc) override;
+            void xupdateMaterial(const STDMaterialX& mat) override;
 
             Symbol* getSymbol(int& pos) override;