Freestyle: Fix for view map caching not flashed properly in view port rendering.
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>
Sat, 4 Oct 2014 15:29:09 +0000 (00:29 +0900)
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>
Wed, 26 Nov 2014 14:26:20 +0000 (23:26 +0900)
source/blender/freestyle/intern/application/Controller.cpp
source/blender/freestyle/intern/scene_graph/NodeCamera.h
source/blender/freestyle/intern/scene_graph/SceneHash.cpp
source/blender/freestyle/intern/scene_graph/SceneHash.h

index 86322bcd350a0690679d3cfdd25e56c9f5ca38ed..237176df5e38362eaa2991c0deee32f723d67ac4 100644 (file)
@@ -220,11 +220,10 @@ bool Controller::hitViewMapCache()
        if (!_EnableViewMapCache) {
                return false;
        }
-       real hashCode = sceneHashFunc.getValue();
-       if (prevSceneHash == hashCode) {
+       if (sceneHashFunc.match()) {
                return (NULL != _ViewMap);
        }
-       prevSceneHash = hashCode;
+       sceneHashFunc.store();
        return false;
 }
 
@@ -281,10 +280,26 @@ int Controller::LoadMesh(Render *re, SceneRenderLayer *srl)
                return 0;
 
        if (_EnableViewMapCache) {
+
+               NodeCamera *cam;
+               if (freestyle_proj[3][3] != 0.0)
+                       cam = new NodeOrthographicCamera;
+               else
+                       cam = new NodePerspectiveCamera;
+               double proj[16];
+               for (int i = 0; i < 4; i++) {
+                       for (int j = 0; j < 4; j++) {
+                               proj[i * 4 + j] = freestyle_proj[i][j];
+                       }
+               }
+               cam->setProjectionMatrix(proj);
+               _RootNode->AddChild(cam);
+
                sceneHashFunc.reset();
-               blenderScene->accept(sceneHashFunc);
+               //blenderScene->accept(sceneHashFunc);
+               _RootNode->accept(sceneHashFunc);
                if (G.debug & G_DEBUG_FREESTYLE) {
-                       printf("Scene hash       : %.16e\n", sceneHashFunc.getValue());
+                       cout << "Scene hash       : " << sceneHashFunc.toString() << endl;
                }
                if (hitViewMapCache()) {
                        ClearRootNode();
index 5d84a624830796a8b094b0c137bdfa91fb0cb138..78c34fdef6d4f3f753d85c5919a8ae4cb94dd5b7 100644 (file)
@@ -53,7 +53,9 @@ public:
 
        /*! Default matrices: Identity for both projection and modelview. */
        NodeCamera(CameraType camera_type = GENERIC); 
+#if 0  /* UNUSED, gives warning in gcc */
        NodeCamera(const NodeCamera& iBrother);
+#endif
 
        virtual ~NodeCamera() {}
 
index 6e8856f1b93e1cc86dd235481ed73bb38c4b0c14..60b95aaf6c5e82bc054a40c35aa16f68886ea05d 100644 (file)
 
 #include "SceneHash.h"
 
+#include <sstream>
+
 namespace Freestyle {
 
+string SceneHash::toString()
+{
+        stringstream ss;
+        ss << hex << _sum;
+        return ss.str();
+}
+
+void SceneHash::visitNodeCamera(NodeCamera& cam)
+{
+       double *proj = cam.projectionMatrix();
+       for (int i = 0; i < 16; i++) {
+               adler32((unsigned char *)&proj[i], sizeof(double));
+       }
+}
+
 void SceneHash::visitIndexedFaceSet(IndexedFaceSet& ifs)
 {
        const real *v = ifs.vertices();
        const unsigned n = ifs.vsize();
 
        for (unsigned i = 0; i < n; i++) {
-               _hashcode += v[i];
+               adler32((unsigned char *)&v[i], sizeof(v[i]));
+       }
+}
+
+static const int MOD_ADLER = 65521;
+
+void SceneHash::adler32(unsigned char *data, int size)
+{
+       uint32_t sum1 = _sum & 0xffff;
+       uint32_t sum2 = (_sum >> 16) & 0xffff;
+
+       for (int i = 0; i < size; i++) {
+               sum1 = (sum1 + data[i]) % MOD_ADLER;
+               sum2 = (sum1 + sum2) % MOD_ADLER;
        }
+       _sum = sum1 | (sum2 << 16);
 }
 
 } /* namespace Freestyle */
index 8f5f847eaab43123c77dd807105fed6766031251..5521b792e89d30765ece83e597e8100c31fb35d8 100644 (file)
  */
 
 #include "IndexedFaceSet.h"
+#include "NodeCamera.h"
 #include "SceneVisitor.h"
 
+#include "BLI_sys_types.h"
+
 #ifdef WITH_CXX_GUARDEDALLOC
 #include "MEM_guardedalloc.h"
 #endif
@@ -39,23 +42,33 @@ class SceneHash : public SceneVisitor
 public:
        inline SceneHash() : SceneVisitor()
        {
-               _hashcode = 0.0;
+               _sum = 1;
        }
 
        virtual ~SceneHash() {}
 
+       VISIT_DECL(NodeCamera)
        VISIT_DECL(IndexedFaceSet)
 
-       inline real getValue() {
-               return _hashcode;
+       string toString();
+
+       inline bool match() {
+               return _sum == _prevSum;
+       }
+
+       inline void store() {
+               _prevSum = _sum;
        }
 
        inline void reset() {
-               _hashcode = 0.0;
+               _sum = 1;
        }
 
 private:
-       real _hashcode;
+       void adler32(unsigned char *data, int size);
+
+       uint32_t _sum;
+       uint32_t _prevSum;
 
 #ifdef WITH_CXX_GUARDEDALLOC
        MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:SceneHash")