diff options
Diffstat (limited to 'source/blender/freestyle/intern/scene_graph/SceneHash.cpp')
-rw-r--r-- | source/blender/freestyle/intern/scene_graph/SceneHash.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/source/blender/freestyle/intern/scene_graph/SceneHash.cpp b/source/blender/freestyle/intern/scene_graph/SceneHash.cpp index 6e8856f1b93..ee1d0c53b87 100644 --- a/source/blender/freestyle/intern/scene_graph/SceneHash.cpp +++ b/source/blender/freestyle/intern/scene_graph/SceneHash.cpp @@ -24,16 +24,56 @@ #include "SceneHash.h" +#include <sstream> + namespace Freestyle { +string SceneHash::toString() +{ + stringstream ss; + ss << hex << _sum; + return ss.str(); +} + +void SceneHash::visitNodeSceneRenderLayer(NodeSceneRenderLayer& srl) +{ + struct FreestyleConfig *config = &srl.sceneRenderLayer().freestyleConfig; + adler32((unsigned char *)&config->flags, sizeof(int)); + adler32((unsigned char *)&config->crease_angle, sizeof(float)); + adler32((unsigned char *)&config->sphere_radius, sizeof(float)); + adler32((unsigned char *)&config->dkr_epsilon, sizeof(float)); +} + +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 */ |