[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43422] trunk/blender/intern/cycles: Cycles: add option to cache BVH's between subsequent renders, storing the BVH on
Daniel Salazar - 3Developer.com
zanqdo at gmail.com
Mon Jan 16 17:05:48 CET 2012
Woa great! does it work with dyn cache too? for obj level animation?
Daniel Salazar
patazstudio.com
On Mon, Jan 16, 2012 at 7:13 AM, Brecht Van Lommel
<brechtvanlommel at pandora.be> wrote:
> Revision: 43422
> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43422
> Author: blendix
> Date: 2012-01-16 13:13:37 +0000 (Mon, 16 Jan 2012)
> Log Message:
> -----------
> Cycles: add option to cache BVH's between subsequent renders, storing the BVH on
> disk to be reused by the next render.
>
> This is useful for rendering animations where only the camera or materials change.
> Note that saving the BVH to disk only to be removed for the next frame is slower
> if this is not the case and the meshes do actually change.
>
> For a render, it will save bvh files to the cache user directory, and remove all
> cache files from other renders. The files are named using a MD5 hash based on the
> mesh, to verify if the meshes are still the same.
>
> Modified Paths:
> --------------
> trunk/blender/intern/cycles/blender/addon/properties.py
> trunk/blender/intern/cycles/blender/addon/ui.py
> trunk/blender/intern/cycles/blender/blender_sync.cpp
> trunk/blender/intern/cycles/bvh/bvh.cpp
> trunk/blender/intern/cycles/bvh/bvh.h
> trunk/blender/intern/cycles/bvh/bvh_params.h
> trunk/blender/intern/cycles/render/mesh.cpp
> trunk/blender/intern/cycles/util/util_cache.cpp
> trunk/blender/intern/cycles/util/util_cache.h
>
> Modified: trunk/blender/intern/cycles/blender/addon/properties.py
> ===================================================================
> --- trunk/blender/intern/cycles/blender/addon/properties.py 2012-01-16 11:50:17 UTC (rev 43421)
> +++ trunk/blender/intern/cycles/blender/addon/properties.py 2012-01-16 13:13:37 UTC (rev 43422)
> @@ -103,6 +103,8 @@
> items=enums.bvh_types, default="DYNAMIC_BVH")
> cls.debug_use_spatial_splits = BoolProperty(name="Use Spatial Splits", description="Use BVH spatial splits: longer builder time, faster render",
> default=False)
> + cls.use_cache = BoolProperty(name="Cache BVH", description="Cache last built BVH to disk for faster re-render if no geometry changed",
> + default=False)
>
> @classmethod
> def unregister(cls):
>
> Modified: trunk/blender/intern/cycles/blender/addon/ui.py
> ===================================================================
> --- trunk/blender/intern/cycles/blender/addon/ui.py 2012-01-16 11:50:17 UTC (rev 43421)
> +++ trunk/blender/intern/cycles/blender/addon/ui.py 2012-01-16 13:13:37 UTC (rev 43422)
> @@ -147,6 +147,7 @@
> sub.label(text="Acceleration structure:")
> sub.prop(cscene, "debug_bvh_type", text="")
> sub.prop(cscene, "debug_use_spatial_splits")
> + sub.prop(cscene, "use_cache")
>
> class CyclesRender_PT_layers(CyclesButtonsPanel, Panel):
> bl_label = "Layers"
>
> Modified: trunk/blender/intern/cycles/blender/blender_sync.cpp
> ===================================================================
> --- trunk/blender/intern/cycles/blender/blender_sync.cpp 2012-01-16 11:50:17 UTC (rev 43421)
> +++ trunk/blender/intern/cycles/blender/blender_sync.cpp 2012-01-16 13:13:37 UTC (rev 43422)
> @@ -236,6 +236,7 @@
> params.bvh_type = (SceneParams::BVHType)RNA_enum_get(&cscene, "debug_bvh_type");
>
> params.use_bvh_spatial_split = RNA_boolean_get(&cscene, "debug_use_spatial_splits");
> + params.use_bvh_cache = (background)? RNA_boolean_get(&cscene, "use_cache"): false;
>
> return params;
> }
>
> Modified: trunk/blender/intern/cycles/bvh/bvh.cpp
> ===================================================================
> --- trunk/blender/intern/cycles/bvh/bvh.cpp 2012-01-16 11:50:17 UTC (rev 43421)
> +++ trunk/blender/intern/cycles/bvh/bvh.cpp 2012-01-16 13:13:37 UTC (rev 43422)
> @@ -75,12 +75,18 @@
> foreach(Object *ob, objects) {
> key.add(ob->mesh->verts);
> key.add(ob->mesh->triangles);
> + key.add(&ob->bounds, sizeof(ob->bounds));
> + key.add(&ob->visibility, sizeof(ob->visibility));
> + key.add(&ob->mesh->transform_applied, sizeof(bool));
> }
>
> CacheData value;
>
> if(Cache::global.lookup(key, value)) {
> + cache_filename = key.get_filename();
> +
> value.read(pack.root_index);
> + value.read(pack.SAH);
>
> value.read(pack.nodes);
> value.read(pack.object_node);
> @@ -101,6 +107,7 @@
> CacheData value;
>
> value.add(pack.root_index);
> + value.add(pack.SAH);
>
> value.add(pack.nodes);
> value.add(pack.object_node);
> @@ -111,8 +118,28 @@
> value.add(pack.is_leaf);
>
> Cache::global.insert(key, value);
> +
> + cache_filename = key.get_filename();
> }
>
> +void BVH::clear_cache_except()
> +{
> + set<string> except;
> +
> + if(!cache_filename.empty())
> + except.insert(cache_filename);
> +
> + foreach(Object *ob, objects) {
> + Mesh *mesh = ob->mesh;
> + BVH *bvh = mesh->bvh;
> +
> + if(bvh && !bvh->cache_filename.empty())
> + except.insert(bvh->cache_filename);
> + }
> +
> + Cache::global.clear_except("bvh", except);
> +}
> +
> /* Building */
>
> void BVH::build(Progress& progress)
> @@ -177,6 +204,10 @@
> if(params.use_cache) {
> progress.set_substatus("Writing BVH cache");
> cache_write(key);
> +
> + /* clear other bvh files from cache */
> + if(params.top_level)
> + clear_cache_except();
> }
> }
>
>
> Modified: trunk/blender/intern/cycles/bvh/bvh.h
> ===================================================================
> --- trunk/blender/intern/cycles/bvh/bvh.h 2012-01-16 11:50:17 UTC (rev 43421)
> +++ trunk/blender/intern/cycles/bvh/bvh.h 2012-01-16 13:13:37 UTC (rev 43422)
> @@ -20,6 +20,7 @@
>
> #include "bvh_params.h"
>
> +#include "util_string.h"
> #include "util_types.h"
> #include "util_vector.h"
>
> @@ -83,6 +84,7 @@
> PackedBVH pack;
> BVHParams params;
> vector<Object*> objects;
> + string cache_filename;
>
> static BVH *create(const BVHParams& params, const vector<Object*>& objects);
> virtual ~BVH() {}
> @@ -90,6 +92,8 @@
> void build(Progress& progress);
> void refit(Progress& progress);
>
> + void clear_cache_except();
> +
> protected:
> BVH(const BVHParams& params, const vector<Object*>& objects);
>
>
> Modified: trunk/blender/intern/cycles/bvh/bvh_params.h
> ===================================================================
> --- trunk/blender/intern/cycles/bvh/bvh_params.h 2012-01-16 11:50:17 UTC (rev 43421)
> +++ trunk/blender/intern/cycles/bvh/bvh_params.h 2012-01-16 13:13:37 UTC (rev 43422)
> @@ -26,7 +26,7 @@
> {
> public:
> /* spatial split area threshold */
> - bool use_spatial_split;
> + int use_spatial_split;
> float spatial_split_alpha;
>
> /* SAH costs */
> @@ -38,14 +38,16 @@
> int max_leaf_size;
>
> /* object or mesh level bvh */
> - bool top_level;
> + int top_level;
>
> /* disk cache */
> - bool use_cache;
> + int use_cache;
>
> /* QBVH */
> - bool use_qbvh;
> + int use_qbvh;
>
> + int pad;
> +
> /* fixed parameters */
> enum {
> MAX_DEPTH = 64,
> @@ -67,6 +69,7 @@
> top_level = false;
> use_cache = false;
> use_qbvh = false;
> + pad = false;
> }
>
> /* SAH costs */
>
> Modified: trunk/blender/intern/cycles/render/mesh.cpp
> ===================================================================
> --- trunk/blender/intern/cycles/render/mesh.cpp 2012-01-16 11:50:17 UTC (rev 43421)
> +++ trunk/blender/intern/cycles/render/mesh.cpp 2012-01-16 13:13:37 UTC (rev 43422)
> @@ -586,6 +586,7 @@
> bparams.top_level = true;
> bparams.use_qbvh = scene->params.use_qbvh;
> bparams.use_spatial_split = scene->params.use_bvh_spatial_split;
> + bparams.use_cache = scene->params.use_bvh_cache;
>
> delete bvh;
> bvh = BVH::create(bparams, scene->objects);
>
> Modified: trunk/blender/intern/cycles/util/util_cache.cpp
> ===================================================================
> --- trunk/blender/intern/cycles/util/util_cache.cpp 2012-01-16 11:50:17 UTC (rev 43421)
> +++ trunk/blender/intern/cycles/util/util_cache.cpp 2012-01-16 13:13:37 UTC (rev 43422)
> @@ -19,11 +19,18 @@
> #include <stdio.h>
>
> #include "util_cache.h"
> +#include "util_debug.h"
> #include "util_foreach.h"
> +#include "util_map.h"
> #include "util_md5.h"
> #include "util_path.h"
> #include "util_types.h"
>
> +#define BOOST_FILESYSTEM_VERSION 2
> +
> +#include <boost/filesystem.hpp>
> +#include <boost/algorithm/string.hpp>
> +
> CCL_NAMESPACE_BEGIN
>
> /* CacheData */
> @@ -32,6 +39,7 @@
> {
> name = name_;
> f = NULL;
> + have_filename = false;
> }
>
> CacheData::~CacheData()
> @@ -40,24 +48,35 @@
> fclose(f);
> }
>
> +const string& CacheData::get_filename()
> +{
> + if(!have_filename) {
> + MD5Hash hash;
> +
> + foreach(const CacheBuffer& buffer, buffers)
> + if(buffer.size)
> + hash.append((uint8_t*)buffer.data, buffer.size);
> +
> + filename = name + "_" + hash.get_hex();
> + have_filename = true;
> + }
> +
> + return filename;
> +}
> +
> /* Cache */
>
> Cache Cache::global;
>
> -string Cache::data_filename(const CacheData& key)
> +string Cache::data_filename(CacheData& key)
> {
> - MD5Hash hash;
> -
> - foreach(const CacheBuffer& buffer, key.buffers)
> - hash.append((uint8_t*)buffer.data, buffer.size);
> -
> - string fname = key.name + "_" + hash.get_hex();
> - return path_get("cache/" + fname);
> + return path_user_get(path_join("cache", key.get_filename()));
> }
>
> -void Cache::insert(const CacheData& key, const CacheData& value)
> +void Cache::insert(CacheData& key, CacheData& value)
> {
> string filename = data_filename(key);
> + path_create_directories(filename);
> FILE *f = fopen(filename.c_str(), "wb");
>
> if(!f) {
> @@ -65,17 +84,18 @@
> return;
> }
>
> - foreach(const CacheBuffer& buffer, value.buffers) {
> + foreach(CacheBuffer& buffer, value.buffers) {
> if(!fwrite(&buffer.size, sizeof(buffer.size), 1, f))
> fprintf(stderr, "Failed to write to file %s.\n", filename.c_str());
> - if(!fwrite(buffer.data, buffer.size, 1, f))
> - fprintf(stderr, "Failed to write to file %s.\n", filename.c_str());
> + if(buffer.size)
> + if(!fwrite(buffer.data, buffer.size, 1, f))
> + fprintf(stderr, "Failed to write to file %s.\n", filename.c_str());
> }
>
> fclose(f);
> }
>
> -bool Cache::lookup(const CacheData& key, CacheData& value)
> +bool Cache::lookup(CacheData& key, CacheData& value)
> {
> string filename = data_filename(key);
> FILE *f = fopen(filename.c_str(), "rb");
> @@ -89,5 +109,22 @@
> return true;
> }
>
> +void Cache::clear_except(const string& name, const set<string>& except)
> +{
> + string dir = path_user_get("cache");
> +
> + if(boost::filesystem::exists(dir)) {
> + boost::filesystem::directory_iterator it(dir), it_end;
> +
> + for(; it != it_end; it++) {
> + string filename = it->path().filename();
> +
> + if(boost::starts_with(filename, name))
> + if(except.find(filename) == except.end())
> + boost::filesystem::remove(it->path());
> + }
> + }
> +}
> +
> CCL_NAMESPACE_END
>
>
> Modified: trunk/blender/intern/cycles/util/util_cache.h
> ===================================================================
> --- trunk/blender/intern/cycles/util/util_cache.h 2012-01-16 11:50:17 UTC (rev 43421)
> +++ trunk/blender/intern/cycles/util/util_cache.h 2012-01-16 13:13:37 UTC (rev 43422)
> @@ -32,6 +32,7 @@
> * different scenes where it may be hard to detect duplicate work.
> */
>
> +#include "util_set.h"
> #include "util_string.h"
> #include "util_vector.h"
>
> @@ -50,25 +51,25 @@
> public:
> vector<CacheBuffer> buffers;
> string name;
> + string filename;
> + bool have_filename;
> FILE *f;
>
> CacheData(const string& name = "");
> ~CacheData();
>
> + const string& get_filename();
> +
> template<typename T> void add(const vector<T>& data)
> {
> - if(data.size()) {
> - CacheBuffer buffer(&data[0], data.size()*sizeof(T));
> - buffers.push_back(buffer);
> - }
> + CacheBuffer buffer(data.size()? &data[0]: NULL, data.size()*sizeof(T));
> + buffers.push_back(buffer);
> }
>
> template<typename T> void add(const array<T>& data)
> {
> - if(data.size()) {
> - CacheBuffer buffer(&data[0], data.size()*sizeof(T));
> - buffers.push_back(buffer);
> - }
> + CacheBuffer buffer(data.size()? &data[0]: NULL, data.size()*sizeof(T));
> + buffers.push_back(buffer);
> }
>
> void add(void *data, size_t size)
> @@ -85,6 +86,12 @@
> buffers.push_back(buffer);
> }
>
> + void add(float& data)
> + {
> + CacheBuffer buffer(&data, sizeof(float));
> + buffers.push_back(buffer);
> + }
> +
> void add(size_t& data)
> {
> CacheBuffer buffer(&data, sizeof(size_t));
> @@ -113,12 +120,30 @@
>
> void read(int& data)
> {
> + size_t size;
> +
>
> @@ Diff output truncated at 10240 characters. @@
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
More information about the Bf-committers
mailing list