diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2014-01-28 18:24:59 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2014-10-02 12:52:13 +0400 |
commit | dd9c53b312a62f1cc87e26cab3fde0c568c14844 (patch) | |
tree | f8e18efe9794aadd892386668b303b637e394a18 /source/blender/freestyle/intern/scene_graph | |
parent | 6bde5381bb7c275cb9005babaf455bdc8ff62f4e (diff) |
Freestyle: View map caching.
New render layer option named "View map cache" is added to reuse a
previously computed view map for subsequent rendering. The cache is
automatically updated when the mesh geometry of the input 3D scene has
been changed.
This functionality offers a major performance boost for Freestyle
animation rendering when camera-space mesh geometry is static, as well
as for repeated still renders with updates of line stylization options.
Although the "View map cache" toggle is a render layer option, the cache
memory is shared by all render layers and scenes. This means that if
Freestyle is used for two or more render layers (possibly in different
scenes through the compositor), then the cached view map for one render
layer is replaced by a new view map for another render layer and hence
no performance gain is expected.
Diffstat (limited to 'source/blender/freestyle/intern/scene_graph')
-rw-r--r-- | source/blender/freestyle/intern/scene_graph/SceneHash.cpp | 39 | ||||
-rw-r--r-- | source/blender/freestyle/intern/scene_graph/SceneHash.h | 67 |
2 files changed, 106 insertions, 0 deletions
diff --git a/source/blender/freestyle/intern/scene_graph/SceneHash.cpp b/source/blender/freestyle/intern/scene_graph/SceneHash.cpp new file mode 100644 index 00000000000..6e8856f1b93 --- /dev/null +++ b/source/blender/freestyle/intern/scene_graph/SceneHash.cpp @@ -0,0 +1,39 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/freestyle/intern/scene_graph/SceneHash.cpp + * \ingroup freestyle + */ + +#include "SceneHash.h" + +namespace Freestyle { + +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]; + } +} + +} /* namespace Freestyle */ diff --git a/source/blender/freestyle/intern/scene_graph/SceneHash.h b/source/blender/freestyle/intern/scene_graph/SceneHash.h new file mode 100644 index 00000000000..8f5f847eaab --- /dev/null +++ b/source/blender/freestyle/intern/scene_graph/SceneHash.h @@ -0,0 +1,67 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#ifndef __FREESTYLE_SCENE_HASH_H__ +#define __FREESTYLE_SCENE_HASH_H__ + +/** \file blender/freestyle/intern/scene_graph/SceneHash.h + * \ingroup freestyle + */ + +#include "IndexedFaceSet.h" +#include "SceneVisitor.h" + +#ifdef WITH_CXX_GUARDEDALLOC +#include "MEM_guardedalloc.h" +#endif + +namespace Freestyle { + +class SceneHash : public SceneVisitor +{ +public: + inline SceneHash() : SceneVisitor() + { + _hashcode = 0.0; + } + + virtual ~SceneHash() {} + + VISIT_DECL(IndexedFaceSet) + + inline real getValue() { + return _hashcode; + } + + inline void reset() { + _hashcode = 0.0; + } + +private: + real _hashcode; + +#ifdef WITH_CXX_GUARDEDALLOC + MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:SceneHash") +#endif +}; + +} /* namespace Freestyle */ + +#endif // __FREESTYLE_SCENE_HASH_H__ |