[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42806] trunk/blender/intern/cycles: Cycles: code refactoring, to do render layer visibility test a bit different,
Brecht Van Lommel
brechtvanlommel at pandora.be
Wed Dec 21 21:51:49 CET 2011
Revision: 42806
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42806
Author: blendix
Date: 2011-12-21 20:51:43 +0000 (Wed, 21 Dec 2011)
Log Message:
-----------
Cycles: code refactoring, to do render layer visibility test a bit different,
replacing the camera visibility flag with object layer flags.
Modified Paths:
--------------
trunk/blender/intern/cycles/app/cycles_test.cpp
trunk/blender/intern/cycles/app/cycles_xml.cpp
trunk/blender/intern/cycles/blender/blender_object.cpp
trunk/blender/intern/cycles/blender/blender_sync.cpp
trunk/blender/intern/cycles/blender/blender_sync.h
trunk/blender/intern/cycles/kernel/kernel_path.h
trunk/blender/intern/cycles/kernel/kernel_types.h
trunk/blender/intern/cycles/render/integrator.cpp
trunk/blender/intern/cycles/render/integrator.h
Modified: trunk/blender/intern/cycles/app/cycles_test.cpp
===================================================================
--- trunk/blender/intern/cycles/app/cycles_test.cpp 2011-12-21 20:32:29 UTC (rev 42805)
+++ trunk/blender/intern/cycles/app/cycles_test.cpp 2011-12-21 20:51:43 UTC (rev 42806)
@@ -82,9 +82,9 @@
session_print(status);
}
-static BufferParams session_buffer_params()
+static BufferParams& session_buffer_params()
{
- BufferParams buffer_params;
+ static BufferParams buffer_params;
buffer_params.width = options.width;
buffer_params.height = options.height;
buffer_params.full_width = options.width;
Modified: trunk/blender/intern/cycles/app/cycles_xml.cpp
===================================================================
--- trunk/blender/intern/cycles/app/cycles_xml.cpp 2011-12-21 20:32:29 UTC (rev 42805)
+++ trunk/blender/intern/cycles/app/cycles_xml.cpp 2011-12-21 20:51:43 UTC (rev 42806)
@@ -258,7 +258,6 @@
xml_read_int(&integrator->min_bounce, node, "min_bounce");
xml_read_int(&integrator->max_bounce, node, "max_bounce");
xml_read_bool(&integrator->no_caustics, node, "no_caustics");
- xml_read_float(&integrator->blur_caustics, node, "blur_caustics");
}
/* Camera */
Modified: trunk/blender/intern/cycles/blender/blender_object.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_object.cpp 2011-12-21 20:32:29 UTC (rev 42805)
+++ trunk/blender/intern/cycles/blender/blender_object.cpp 2011-12-21 20:51:43 UTC (rev 42806)
@@ -154,7 +154,7 @@
/* Object */
-void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm, uint visibility)
+void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm, uint layer_flag)
{
/* light is handled separately */
if(object_is_light(b_ob)) {
@@ -181,11 +181,19 @@
if(object_updated || (object->mesh && object->mesh->need_update)) {
object->name = b_ob.name().c_str();
object->tfm = tfm;
-
- object->visibility = object_ray_visibility(b_ob) & visibility;
+
+ /* visibility flags for both parent */
+ object->visibility = object_ray_visibility(b_ob) & PATH_RAY_ALL;
if(b_parent.ptr.data != b_ob.ptr.data)
object->visibility &= object_ray_visibility(b_parent);
+ /* camera flag is not actually used, instead is tested
+ against render layer flags */
+ if(object->visibility & PATH_RAY_CAMERA) {
+ object->visibility |= layer_flag << PATH_RAY_LAYER_SHIFT;
+ object->visibility &= ~PATH_RAY_CAMERA;
+ }
+
object->tag_update(scene);
}
}
@@ -196,7 +204,6 @@
{
/* layer data */
uint scene_layer = render_layer.scene_layer;
- uint layer = render_layer.layer;
/* prepare for sync */
light_map.pre_sync();
@@ -212,11 +219,6 @@
uint ob_layer = get_layer(b_ob->layers());
if(!hide && (ob_layer & scene_layer)) {
- uint visibility = PATH_RAY_ALL;
-
- if(!(ob_layer & layer))
- visibility &= ~PATH_RAY_CAMERA;
-
if(b_ob->is_duplicator()) {
/* dupli objects */
object_create_duplilist(*b_ob, b_scene);
@@ -226,7 +228,7 @@
for(b_ob->dupli_list.begin(b_dup); b_dup != b_ob->dupli_list.end(); ++b_dup) {
Transform tfm = get_transform(b_dup->matrix());
- sync_object(*b_ob, b_index, b_dup->object(), tfm, visibility);
+ sync_object(*b_ob, b_index, b_dup->object(), tfm, ob_layer);
b_index++;
}
@@ -244,7 +246,7 @@
if(!hide) {
/* object itself */
Transform tfm = get_transform(b_ob->matrix_world());
- sync_object(*b_ob, 0, *b_ob, tfm, visibility);
+ sync_object(*b_ob, 0, *b_ob, tfm, ob_layer);
}
}
}
Modified: trunk/blender/intern/cycles/blender/blender_sync.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_sync.cpp 2011-12-21 20:32:29 UTC (rev 42805)
+++ trunk/blender/intern/cycles/blender/blender_sync.cpp 2011-12-21 20:51:43 UTC (rev 42806)
@@ -122,9 +122,9 @@
void BlenderSync::sync_data(BL::SpaceView3D b_v3d)
{
+ sync_render_layer(b_v3d);
sync_integrator();
sync_film();
- sync_render_layer(b_v3d);
sync_shaders();
sync_objects(b_v3d);
}
@@ -152,9 +152,8 @@
integrator->transparent_shadows = get_boolean(cscene, "use_transparent_shadows");
integrator->no_caustics = get_boolean(cscene, "no_caustics");
- integrator->blur_caustics = get_float(cscene, "blur_caustics");
-
integrator->seed = get_int(cscene, "seed");
+ integrator->layer_flag = render_layer.layer;
if(integrator->modified(previntegrator))
integrator->tag_update(scene);
Modified: trunk/blender/intern/cycles/blender/blender_sync.h
===================================================================
--- trunk/blender/intern/cycles/blender/blender_sync.h 2011-12-21 20:32:29 UTC (rev 42805)
+++ trunk/blender/intern/cycles/blender/blender_sync.h 2011-12-21 20:51:43 UTC (rev 42806)
@@ -78,7 +78,7 @@
void sync_nodes(Shader *shader, BL::ShaderNodeTree b_ntree);
Mesh *sync_mesh(BL::Object b_ob, bool object_updated);
- void sync_object(BL::Object b_parent, int b_index, BL::Object b_object, Transform& tfm, uint visibility);
+ void sync_object(BL::Object b_parent, int b_index, BL::Object b_object, Transform& tfm, uint layer_flag);
void sync_light(BL::Object b_parent, int b_index, BL::Object b_ob, Transform& tfm);
/* util */
Modified: trunk/blender/intern/cycles/kernel/kernel_path.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_path.h 2011-12-21 20:32:29 UTC (rev 42805)
+++ trunk/blender/intern/cycles/kernel/kernel_path.h 2011-12-21 20:51:43 UTC (rev 42806)
@@ -130,13 +130,16 @@
}
}
-__device_inline uint path_state_ray_visibility(PathState *state)
+__device_inline uint path_state_ray_visibility(KernelGlobals *kg, PathState *state)
{
uint flag = state->flag;
/* for visibility, diffuse/glossy are for reflection only */
if(flag & PATH_RAY_TRANSMIT)
flag &= ~(PATH_RAY_DIFFUSE|PATH_RAY_GLOSSY);
+ /* for camera visibility, use render layer flags */
+ if(flag & PATH_RAY_CAMERA)
+ flag |= kernel_data.integrator.layer_flag;
return flag;
}
@@ -249,7 +252,7 @@
for(;; rng_offset += PRNG_BOUNCE_NUM) {
/* intersect scene */
Intersection isect;
- uint visibility = path_state_ray_visibility(&state);
+ uint visibility = path_state_ray_visibility(kg, &state);
if(!scene_intersect(kg, &ray, visibility, &isect)) {
/* eval background shader if nothing hit */
Modified: trunk/blender/intern/cycles/kernel/kernel_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_types.h 2011-12-21 20:32:29 UTC (rev 42805)
+++ trunk/blender/intern/cycles/kernel/kernel_types.h 2011-12-21 20:51:43 UTC (rev 42806)
@@ -100,7 +100,10 @@
/* these flag values correspond exactly to OSL defaults, so be careful not to
* change this, or if you do, set the "raytypes" shading system attribute with
- * your own new ray types and bitflag values */
+ * your own new ray types and bitflag values.
+ *
+ * for ray visibility tests in BVH traversal, the upper 20 bits are used for
+ * layer visibility tests. */
enum PathRayFlag {
PATH_RAY_CAMERA = 1,
@@ -117,7 +120,9 @@
PATH_RAY_MIS_SKIP = 512,
- PATH_RAY_ALL = (1|2|4|8|16|32|64|128|256|512)
+ PATH_RAY_ALL = (1|2|4|8|16|32|64|128|256|512),
+
+ PATH_RAY_LAYER_SHIFT = (32-20)
};
/* Closure Label */
@@ -383,10 +388,12 @@
/* caustics */
int no_caustics;
- float blur_caustics;
/* seed */
int seed;
+
+ /* render layer */
+ int layer_flag;
} KernelIntegrator;
typedef struct KernelBVH {
Modified: trunk/blender/intern/cycles/render/integrator.cpp
===================================================================
--- trunk/blender/intern/cycles/render/integrator.cpp 2011-12-21 20:32:29 UTC (rev 42805)
+++ trunk/blender/intern/cycles/render/integrator.cpp 2011-12-21 20:51:43 UTC (rev 42806)
@@ -41,9 +41,8 @@
transparent_shadows = false;
no_caustics = false;
- blur_caustics = 0.0f;
-
seed = 0;
+ layer_flag = ~0;
need_update = true;
}
@@ -81,9 +80,8 @@
kintegrator->transparent_shadows = transparent_shadows;
kintegrator->no_caustics = no_caustics;
- kintegrator->blur_caustics = blur_caustics;
-
kintegrator->seed = hash_int(seed);
+ kintegrator->layer_flag = layer_flag << PATH_RAY_LAYER_SHIFT;
/* sobol directions table */
int dimensions = PRNG_BASE_NUM + (max_bounce + transparent_max_bounce + 2)*PRNG_BOUNCE_NUM;
@@ -115,7 +113,7 @@
transparent_probalistic == integrator.transparent_probalistic &&
transparent_shadows == integrator.transparent_shadows &&
no_caustics == integrator.no_caustics &&
- blur_caustics == integrator.blur_caustics &&
+ layer_flag == integrator.layer_flag &&
seed == integrator.seed);
}
Modified: trunk/blender/intern/cycles/render/integrator.h
===================================================================
--- trunk/blender/intern/cycles/render/integrator.h 2011-12-21 20:32:29 UTC (rev 42805)
+++ trunk/blender/intern/cycles/render/integrator.h 2011-12-21 20:51:43 UTC (rev 42806)
@@ -41,9 +41,9 @@
bool transparent_shadows;
bool no_caustics;
- float blur_caustics;
int seed;
+ int layer_flag;
bool need_update;
More information about the Bf-blender-cvs
mailing list