Rename any instance of scene layer or render layer in code with view layer
[blender.git] / source / blender / freestyle / intern / scene_graph / SceneHash.cpp
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 /** \file blender/freestyle/intern/scene_graph/SceneHash.cpp
22  *  \ingroup freestyle
23  */
24
25 #include "SceneHash.h"
26
27 #include <sstream>
28
29 namespace Freestyle {
30
31 string SceneHash::toString()
32 {
33         stringstream ss;
34         ss << hex << _sum;
35         return ss.str();
36 }
37
38 void SceneHash::visitNodeViewLayer(NodeViewLayer& node)
39 {
40         struct RenderData *r = &node.scene().r;
41         adler32((unsigned char *)&r->xsch, sizeof(r->xsch));  // resolution_x
42         adler32((unsigned char *)&r->ysch, sizeof(r->ysch));  // resolution_y
43         adler32((unsigned char *)&r->size, sizeof(r->size));  // resolution_percentage
44
45         struct FreestyleConfig *config = &node.sceneLayer().freestyle_config;
46         adler32((unsigned char *)&config->flags, sizeof(config->flags));
47         adler32((unsigned char *)&config->crease_angle, sizeof(config->crease_angle));
48         adler32((unsigned char *)&config->sphere_radius, sizeof(config->sphere_radius));
49         adler32((unsigned char *)&config->dkr_epsilon, sizeof(config->dkr_epsilon));
50 }
51
52 void SceneHash::visitNodeCamera(NodeCamera& cam)
53 {
54         double *proj = cam.projectionMatrix();
55         for (int i = 0; i < 16; i++) {
56                 adler32((unsigned char *)&proj[i], sizeof(double));
57         }
58 }
59
60 void SceneHash::visitIndexedFaceSet(IndexedFaceSet& ifs)
61 {
62         const float *v = ifs.vertices();
63         const unsigned n = ifs.vsize();
64
65         for (unsigned i = 0; i < n; i++) {
66                 adler32((unsigned char *)&v[i], sizeof(v[i]));
67         }
68 }
69
70 static const int MOD_ADLER = 65521;
71
72 void SceneHash::adler32(unsigned char *data, int size)
73 {
74         uint32_t sum1 = _sum & 0xffff;
75         uint32_t sum2 = (_sum >> 16) & 0xffff;
76
77         for (int i = 0; i < size; i++) {
78                 sum1 = (sum1 + data[i]) % MOD_ADLER;
79                 sum2 = (sum1 + sum2) % MOD_ADLER;
80         }
81         _sum = sum1 | (sum2 << 16);
82 }
83
84 } /* namespace Freestyle */