Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/render/scene.cpp')
-rw-r--r--intern/cycles/render/scene.cpp513
1 files changed, 260 insertions, 253 deletions
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index 1f551f206ef..1e75fa0f99b 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -41,352 +41,359 @@
CCL_NAMESPACE_BEGIN
DeviceScene::DeviceScene(Device *device)
-: bvh_nodes(device, "__bvh_nodes", MEM_TEXTURE),
- bvh_leaf_nodes(device, "__bvh_leaf_nodes", MEM_TEXTURE),
- object_node(device, "__object_node", MEM_TEXTURE),
- prim_tri_index(device, "__prim_tri_index", MEM_TEXTURE),
- prim_tri_verts(device, "__prim_tri_verts", MEM_TEXTURE),
- prim_type(device, "__prim_type", MEM_TEXTURE),
- prim_visibility(device, "__prim_visibility", MEM_TEXTURE),
- prim_index(device, "__prim_index", MEM_TEXTURE),
- prim_object(device, "__prim_object", MEM_TEXTURE),
- prim_time(device, "__prim_time", MEM_TEXTURE),
- tri_shader(device, "__tri_shader", MEM_TEXTURE),
- tri_vnormal(device, "__tri_vnormal", MEM_TEXTURE),
- tri_vindex(device, "__tri_vindex", MEM_TEXTURE),
- tri_patch(device, "__tri_patch", MEM_TEXTURE),
- tri_patch_uv(device, "__tri_patch_uv", MEM_TEXTURE),
- curves(device, "__curves", MEM_TEXTURE),
- curve_keys(device, "__curve_keys", MEM_TEXTURE),
- patches(device, "__patches", MEM_TEXTURE),
- objects(device, "__objects", MEM_TEXTURE),
- object_motion_pass(device, "__object_motion_pass", MEM_TEXTURE),
- object_motion(device, "__object_motion", MEM_TEXTURE),
- object_flag(device, "__object_flag", MEM_TEXTURE),
- camera_motion(device, "__camera_motion", MEM_TEXTURE),
- attributes_map(device, "__attributes_map", MEM_TEXTURE),
- attributes_float(device, "__attributes_float", MEM_TEXTURE),
- attributes_float2(device, "__attributes_float2", MEM_TEXTURE),
- attributes_float3(device, "__attributes_float3", MEM_TEXTURE),
- attributes_uchar4(device, "__attributes_uchar4", MEM_TEXTURE),
- light_distribution(device, "__light_distribution", MEM_TEXTURE),
- lights(device, "__lights", MEM_TEXTURE),
- light_background_marginal_cdf(device, "__light_background_marginal_cdf", MEM_TEXTURE),
- light_background_conditional_cdf(device, "__light_background_conditional_cdf", MEM_TEXTURE),
- particles(device, "__particles", MEM_TEXTURE),
- svm_nodes(device, "__svm_nodes", MEM_TEXTURE),
- shaders(device, "__shaders", MEM_TEXTURE),
- lookup_table(device, "__lookup_table", MEM_TEXTURE),
- sobol_directions(device, "__sobol_directions", MEM_TEXTURE),
- ies_lights(device, "__ies", MEM_TEXTURE)
+ : bvh_nodes(device, "__bvh_nodes", MEM_TEXTURE),
+ bvh_leaf_nodes(device, "__bvh_leaf_nodes", MEM_TEXTURE),
+ object_node(device, "__object_node", MEM_TEXTURE),
+ prim_tri_index(device, "__prim_tri_index", MEM_TEXTURE),
+ prim_tri_verts(device, "__prim_tri_verts", MEM_TEXTURE),
+ prim_type(device, "__prim_type", MEM_TEXTURE),
+ prim_visibility(device, "__prim_visibility", MEM_TEXTURE),
+ prim_index(device, "__prim_index", MEM_TEXTURE),
+ prim_object(device, "__prim_object", MEM_TEXTURE),
+ prim_time(device, "__prim_time", MEM_TEXTURE),
+ tri_shader(device, "__tri_shader", MEM_TEXTURE),
+ tri_vnormal(device, "__tri_vnormal", MEM_TEXTURE),
+ tri_vindex(device, "__tri_vindex", MEM_TEXTURE),
+ tri_patch(device, "__tri_patch", MEM_TEXTURE),
+ tri_patch_uv(device, "__tri_patch_uv", MEM_TEXTURE),
+ curves(device, "__curves", MEM_TEXTURE),
+ curve_keys(device, "__curve_keys", MEM_TEXTURE),
+ patches(device, "__patches", MEM_TEXTURE),
+ objects(device, "__objects", MEM_TEXTURE),
+ object_motion_pass(device, "__object_motion_pass", MEM_TEXTURE),
+ object_motion(device, "__object_motion", MEM_TEXTURE),
+ object_flag(device, "__object_flag", MEM_TEXTURE),
+ camera_motion(device, "__camera_motion", MEM_TEXTURE),
+ attributes_map(device, "__attributes_map", MEM_TEXTURE),
+ attributes_float(device, "__attributes_float", MEM_TEXTURE),
+ attributes_float2(device, "__attributes_float2", MEM_TEXTURE),
+ attributes_float3(device, "__attributes_float3", MEM_TEXTURE),
+ attributes_uchar4(device, "__attributes_uchar4", MEM_TEXTURE),
+ light_distribution(device, "__light_distribution", MEM_TEXTURE),
+ lights(device, "__lights", MEM_TEXTURE),
+ light_background_marginal_cdf(device, "__light_background_marginal_cdf", MEM_TEXTURE),
+ light_background_conditional_cdf(device, "__light_background_conditional_cdf", MEM_TEXTURE),
+ particles(device, "__particles", MEM_TEXTURE),
+ svm_nodes(device, "__svm_nodes", MEM_TEXTURE),
+ shaders(device, "__shaders", MEM_TEXTURE),
+ lookup_table(device, "__lookup_table", MEM_TEXTURE),
+ sobol_directions(device, "__sobol_directions", MEM_TEXTURE),
+ ies_lights(device, "__ies", MEM_TEXTURE)
{
- memset((void*)&data, 0, sizeof(data));
+ memset((void *)&data, 0, sizeof(data));
}
-Scene::Scene(const SceneParams& params_, Device *device)
- : name("Scene"),
- device(device),
- dscene(device),
- params(params_)
+Scene::Scene(const SceneParams &params_, Device *device)
+ : name("Scene"), device(device), dscene(device), params(params_)
{
- memset((void *)&dscene.data, 0, sizeof(dscene.data));
-
- camera = new Camera();
- dicing_camera = new Camera();
- lookup_tables = new LookupTables();
- film = new Film();
- background = new Background();
- light_manager = new LightManager();
- mesh_manager = new MeshManager();
- object_manager = new ObjectManager();
- integrator = new Integrator();
- image_manager = new ImageManager(device->info);
- particle_system_manager = new ParticleSystemManager();
- curve_system_manager = new CurveSystemManager();
- bake_manager = new BakeManager();
-
- /* OSL only works on the CPU */
- if(device->info.has_osl)
- shader_manager = ShaderManager::create(this, params.shadingsystem);
- else
- shader_manager = ShaderManager::create(this, SHADINGSYSTEM_SVM);
+ memset((void *)&dscene.data, 0, sizeof(dscene.data));
+
+ camera = new Camera();
+ dicing_camera = new Camera();
+ lookup_tables = new LookupTables();
+ film = new Film();
+ background = new Background();
+ light_manager = new LightManager();
+ mesh_manager = new MeshManager();
+ object_manager = new ObjectManager();
+ integrator = new Integrator();
+ image_manager = new ImageManager(device->info);
+ particle_system_manager = new ParticleSystemManager();
+ curve_system_manager = new CurveSystemManager();
+ bake_manager = new BakeManager();
+
+ /* OSL only works on the CPU */
+ if (device->info.has_osl)
+ shader_manager = ShaderManager::create(this, params.shadingsystem);
+ else
+ shader_manager = ShaderManager::create(this, SHADINGSYSTEM_SVM);
}
Scene::~Scene()
{
- free_memory(true);
+ free_memory(true);
}
void Scene::free_memory(bool final)
{
- foreach(Shader *s, shaders)
- delete s;
- foreach(Mesh *m, meshes)
- delete m;
- foreach(Object *o, objects)
- delete o;
- foreach(Light *l, lights)
- delete l;
- foreach(ParticleSystem *p, particle_systems)
- delete p;
-
- shaders.clear();
- meshes.clear();
- objects.clear();
- lights.clear();
- particle_systems.clear();
-
- if(device) {
- camera->device_free(device, &dscene, this);
- film->device_free(device, &dscene, this);
- background->device_free(device, &dscene);
- integrator->device_free(device, &dscene);
-
- object_manager->device_free(device, &dscene);
- mesh_manager->device_free(device, &dscene);
- shader_manager->device_free(device, &dscene, this);
- light_manager->device_free(device, &dscene);
-
- particle_system_manager->device_free(device, &dscene);
- curve_system_manager->device_free(device, &dscene);
-
- bake_manager->device_free(device, &dscene);
-
- if(!params.persistent_data || final)
- image_manager->device_free(device);
- else
- image_manager->device_free_builtin(device);
-
- lookup_tables->device_free(device, &dscene);
- }
-
- if(final) {
- delete lookup_tables;
- delete camera;
- delete dicing_camera;
- delete film;
- delete background;
- delete integrator;
- delete object_manager;
- delete mesh_manager;
- delete shader_manager;
- delete light_manager;
- delete particle_system_manager;
- delete curve_system_manager;
- delete image_manager;
- delete bake_manager;
- }
+ foreach (Shader *s, shaders)
+ delete s;
+ foreach (Mesh *m, meshes)
+ delete m;
+ foreach (Object *o, objects)
+ delete o;
+ foreach (Light *l, lights)
+ delete l;
+ foreach (ParticleSystem *p, particle_systems)
+ delete p;
+
+ shaders.clear();
+ meshes.clear();
+ objects.clear();
+ lights.clear();
+ particle_systems.clear();
+
+ if (device) {
+ camera->device_free(device, &dscene, this);
+ film->device_free(device, &dscene, this);
+ background->device_free(device, &dscene);
+ integrator->device_free(device, &dscene);
+
+ object_manager->device_free(device, &dscene);
+ mesh_manager->device_free(device, &dscene);
+ shader_manager->device_free(device, &dscene, this);
+ light_manager->device_free(device, &dscene);
+
+ particle_system_manager->device_free(device, &dscene);
+ curve_system_manager->device_free(device, &dscene);
+
+ bake_manager->device_free(device, &dscene);
+
+ if (!params.persistent_data || final)
+ image_manager->device_free(device);
+ else
+ image_manager->device_free_builtin(device);
+
+ lookup_tables->device_free(device, &dscene);
+ }
+
+ if (final) {
+ delete lookup_tables;
+ delete camera;
+ delete dicing_camera;
+ delete film;
+ delete background;
+ delete integrator;
+ delete object_manager;
+ delete mesh_manager;
+ delete shader_manager;
+ delete light_manager;
+ delete particle_system_manager;
+ delete curve_system_manager;
+ delete image_manager;
+ delete bake_manager;
+ }
}
-void Scene::device_update(Device *device_, Progress& progress)
+void Scene::device_update(Device *device_, Progress &progress)
{
- if(!device)
- device = device_;
+ if (!device)
+ device = device_;
- bool print_stats = need_data_update();
+ bool print_stats = need_data_update();
- /* The order of updates is important, because there's dependencies between
- * the different managers, using data computed by previous managers.
- *
- * - Image manager uploads images used by shaders.
- * - Camera may be used for adaptive subdivision.
- * - Displacement shader must have all shader data available.
- * - Light manager needs lookup tables and final mesh data to compute emission CDF.
- * - Film needs light manager to run for use_light_visibility
- * - Lookup tables are done a second time to handle film tables
- */
+ /* The order of updates is important, because there's dependencies between
+ * the different managers, using data computed by previous managers.
+ *
+ * - Image manager uploads images used by shaders.
+ * - Camera may be used for adaptive subdivision.
+ * - Displacement shader must have all shader data available.
+ * - Light manager needs lookup tables and final mesh data to compute emission CDF.
+ * - Film needs light manager to run for use_light_visibility
+ * - Lookup tables are done a second time to handle film tables
+ */
- progress.set_status("Updating Shaders");
- shader_manager->device_update(device, &dscene, this, progress);
+ progress.set_status("Updating Shaders");
+ shader_manager->device_update(device, &dscene, this, progress);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Background");
- background->device_update(device, &dscene, this);
+ progress.set_status("Updating Background");
+ background->device_update(device, &dscene, this);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Camera");
- camera->device_update(device, &dscene, this);
+ progress.set_status("Updating Camera");
+ camera->device_update(device, &dscene, this);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- mesh_manager->device_update_preprocess(device, this, progress);
+ mesh_manager->device_update_preprocess(device, this, progress);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Objects");
- object_manager->device_update(device, &dscene, this, progress);
+ progress.set_status("Updating Objects");
+ object_manager->device_update(device, &dscene, this, progress);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Hair Systems");
- curve_system_manager->device_update(device, &dscene, this, progress);
+ progress.set_status("Updating Hair Systems");
+ curve_system_manager->device_update(device, &dscene, this, progress);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Particle Systems");
- particle_system_manager->device_update(device, &dscene, this, progress);
+ progress.set_status("Updating Particle Systems");
+ particle_system_manager->device_update(device, &dscene, this, progress);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Meshes");
- mesh_manager->device_update(device, &dscene, this, progress);
+ progress.set_status("Updating Meshes");
+ mesh_manager->device_update(device, &dscene, this, progress);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Objects Flags");
- object_manager->device_update_flags(device, &dscene, this, progress);
+ progress.set_status("Updating Objects Flags");
+ object_manager->device_update_flags(device, &dscene, this, progress);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Images");
- image_manager->device_update(device, this, progress);
+ progress.set_status("Updating Images");
+ image_manager->device_update(device, this, progress);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Camera Volume");
- camera->device_update_volume(device, &dscene, this);
+ progress.set_status("Updating Camera Volume");
+ camera->device_update_volume(device, &dscene, this);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Lookup Tables");
- lookup_tables->device_update(device, &dscene);
+ progress.set_status("Updating Lookup Tables");
+ lookup_tables->device_update(device, &dscene);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Lights");
- light_manager->device_update(device, &dscene, this, progress);
+ progress.set_status("Updating Lights");
+ light_manager->device_update(device, &dscene, this, progress);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Integrator");
- integrator->device_update(device, &dscene, this);
+ progress.set_status("Updating Integrator");
+ integrator->device_update(device, &dscene, this);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Film");
- film->device_update(device, &dscene, this);
+ progress.set_status("Updating Film");
+ film->device_update(device, &dscene, this);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Lookup Tables");
- lookup_tables->device_update(device, &dscene);
+ progress.set_status("Updating Lookup Tables");
+ lookup_tables->device_update(device, &dscene);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- progress.set_status("Updating Baking");
- bake_manager->device_update(device, &dscene, this, progress);
+ progress.set_status("Updating Baking");
+ bake_manager->device_update(device, &dscene, this, progress);
- if(progress.get_cancel() || device->have_error()) return;
+ if (progress.get_cancel() || device->have_error())
+ return;
- if(device->have_error() == false) {
- progress.set_status("Updating Device", "Writing constant memory");
- device->const_copy_to("__data", &dscene.data, sizeof(dscene.data));
- }
+ if (device->have_error() == false) {
+ progress.set_status("Updating Device", "Writing constant memory");
+ device->const_copy_to("__data", &dscene.data, sizeof(dscene.data));
+ }
- if(print_stats) {
- size_t mem_used = util_guarded_get_mem_used();
- size_t mem_peak = util_guarded_get_mem_peak();
+ if (print_stats) {
+ size_t mem_used = util_guarded_get_mem_used();
+ size_t mem_peak = util_guarded_get_mem_peak();
- VLOG(1) << "System memory statistics after full device sync:\n"
- << " Usage: " << string_human_readable_number(mem_used)
- << " (" << string_human_readable_size(mem_used) << ")\n"
- << " Peak: " << string_human_readable_number(mem_peak)
- << " (" << string_human_readable_size(mem_peak) << ")";
- }
+ VLOG(1) << "System memory statistics after full device sync:\n"
+ << " Usage: " << string_human_readable_number(mem_used) << " ("
+ << string_human_readable_size(mem_used) << ")\n"
+ << " Peak: " << string_human_readable_number(mem_peak) << " ("
+ << string_human_readable_size(mem_peak) << ")";
+ }
}
Scene::MotionType Scene::need_motion()
{
- if(integrator->motion_blur)
- return MOTION_BLUR;
- else if(Pass::contains(film->passes, PASS_MOTION))
- return MOTION_PASS;
- else
- return MOTION_NONE;
+ if (integrator->motion_blur)
+ return MOTION_BLUR;
+ else if (Pass::contains(film->passes, PASS_MOTION))
+ return MOTION_PASS;
+ else
+ return MOTION_NONE;
}
float Scene::motion_shutter_time()
{
- if(need_motion() == Scene::MOTION_PASS)
- return 2.0f;
- else
- return camera->shuttertime;
+ if (need_motion() == Scene::MOTION_PASS)
+ return 2.0f;
+ else
+ return camera->shuttertime;
}
bool Scene::need_global_attribute(AttributeStandard std)
{
- if(std == ATTR_STD_UV)
- return Pass::contains(film->passes, PASS_UV);
- else if(std == ATTR_STD_MOTION_VERTEX_POSITION)
- return need_motion() != MOTION_NONE;
- else if(std == ATTR_STD_MOTION_VERTEX_NORMAL)
- return need_motion() == MOTION_BLUR;
-
- return false;
+ if (std == ATTR_STD_UV)
+ return Pass::contains(film->passes, PASS_UV);
+ else if (std == ATTR_STD_MOTION_VERTEX_POSITION)
+ return need_motion() != MOTION_NONE;
+ else if (std == ATTR_STD_MOTION_VERTEX_NORMAL)
+ return need_motion() == MOTION_BLUR;
+
+ return false;
}
-void Scene::need_global_attributes(AttributeRequestSet& attributes)
+void Scene::need_global_attributes(AttributeRequestSet &attributes)
{
- for(int std = ATTR_STD_NONE; std < ATTR_STD_NUM; std++)
- if(need_global_attribute((AttributeStandard)std))
- attributes.add((AttributeStandard)std);
+ for (int std = ATTR_STD_NONE; std < ATTR_STD_NUM; std++)
+ if (need_global_attribute((AttributeStandard)std))
+ attributes.add((AttributeStandard)std);
}
bool Scene::need_update()
{
- return (need_reset() || film->need_update);
+ return (need_reset() || film->need_update);
}
bool Scene::need_data_update()
{
- return (background->need_update
- || image_manager->need_update
- || object_manager->need_update
- || mesh_manager->need_update
- || light_manager->need_update
- || lookup_tables->need_update
- || integrator->need_update
- || shader_manager->need_update
- || particle_system_manager->need_update
- || curve_system_manager->need_update
- || bake_manager->need_update
- || film->need_update);
+ return (background->need_update || image_manager->need_update || object_manager->need_update ||
+ mesh_manager->need_update || light_manager->need_update || lookup_tables->need_update ||
+ integrator->need_update || shader_manager->need_update ||
+ particle_system_manager->need_update || curve_system_manager->need_update ||
+ bake_manager->need_update || film->need_update);
}
bool Scene::need_reset()
{
- return need_data_update() || camera->need_update;
+ return need_data_update() || camera->need_update;
}
void Scene::reset()
{
- shader_manager->reset(this);
- shader_manager->add_default(this);
-
- /* ensure all objects are updated */
- camera->tag_update();
- dicing_camera->tag_update();
- film->tag_update(this);
- background->tag_update(this);
- integrator->tag_update(this);
- object_manager->tag_update(this);
- mesh_manager->tag_update(this);
- light_manager->tag_update(this);
- particle_system_manager->tag_update(this);
- curve_system_manager->tag_update(this);
+ shader_manager->reset(this);
+ shader_manager->add_default(this);
+
+ /* ensure all objects are updated */
+ camera->tag_update();
+ dicing_camera->tag_update();
+ film->tag_update(this);
+ background->tag_update(this);
+ integrator->tag_update(this);
+ object_manager->tag_update(this);
+ mesh_manager->tag_update(this);
+ light_manager->tag_update(this);
+ particle_system_manager->tag_update(this);
+ curve_system_manager->tag_update(this);
}
void Scene::device_free()
{
- free_memory(false);
+ free_memory(false);
}
void Scene::collect_statistics(RenderStats *stats)
{
- mesh_manager->collect_statistics(this, stats);
- image_manager->collect_statistics(stats);
+ mesh_manager->collect_statistics(this, stats);
+ image_manager->collect_statistics(stats);
}
CCL_NAMESPACE_END