Fix #31556: cycles object info random value was not properly randomized for
dupligroups.
This commit is contained in:
@@ -29,6 +29,7 @@
|
|||||||
#include "blender_util.h"
|
#include "blender_util.h"
|
||||||
|
|
||||||
#include "util_foreach.h"
|
#include "util_foreach.h"
|
||||||
|
#include "util_hash.h"
|
||||||
|
|
||||||
CCL_NAMESPACE_BEGIN
|
CCL_NAMESPACE_BEGIN
|
||||||
|
|
||||||
@@ -245,17 +246,20 @@ void BlenderSync::sync_object(BL::Object b_parent, int b_index, BL::Object b_ob,
|
|||||||
/* object sync */
|
/* object sync */
|
||||||
if(object_updated || (object->mesh && object->mesh->need_update)) {
|
if(object_updated || (object->mesh && object->mesh->need_update)) {
|
||||||
object->name = b_ob.name().c_str();
|
object->name = b_ob.name().c_str();
|
||||||
object->instance_id = b_index;
|
|
||||||
object->pass_id = b_ob.pass_index();
|
object->pass_id = b_ob.pass_index();
|
||||||
object->tfm = tfm;
|
object->tfm = tfm;
|
||||||
object->motion.pre = tfm;
|
object->motion.pre = tfm;
|
||||||
object->motion.post = tfm;
|
object->motion.post = tfm;
|
||||||
object->use_motion = false;
|
object->use_motion = false;
|
||||||
|
|
||||||
|
object->random_id = hash_int_2d(hash_string(object->name.c_str()), b_index);
|
||||||
|
|
||||||
/* visibility flags for both parent */
|
/* visibility flags for both parent */
|
||||||
object->visibility = object_ray_visibility(b_ob) & PATH_RAY_ALL;
|
object->visibility = object_ray_visibility(b_ob) & PATH_RAY_ALL;
|
||||||
if(b_parent.ptr.data != b_ob.ptr.data)
|
if(b_parent.ptr.data != b_ob.ptr.data) {
|
||||||
object->visibility &= object_ray_visibility(b_parent);
|
object->visibility &= object_ray_visibility(b_parent);
|
||||||
|
object->random_id ^= hash_int(hash_string(b_parent.name().c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
/* camera flag is not actually used, instead is tested
|
/* camera flag is not actually used, instead is tested
|
||||||
against render layer flags */
|
against render layer flags */
|
||||||
|
@@ -23,7 +23,6 @@
|
|||||||
#include "scene.h"
|
#include "scene.h"
|
||||||
|
|
||||||
#include "util_foreach.h"
|
#include "util_foreach.h"
|
||||||
#include "util_hash.h"
|
|
||||||
#include "util_map.h"
|
#include "util_map.h"
|
||||||
#include "util_progress.h"
|
#include "util_progress.h"
|
||||||
|
|
||||||
@@ -37,7 +36,7 @@ Object::Object()
|
|||||||
mesh = NULL;
|
mesh = NULL;
|
||||||
tfm = transform_identity();
|
tfm = transform_identity();
|
||||||
visibility = ~0;
|
visibility = ~0;
|
||||||
instance_id = 0;
|
random_id = 0;
|
||||||
pass_id = 0;
|
pass_id = 0;
|
||||||
bounds = BoundBox::empty;
|
bounds = BoundBox::empty;
|
||||||
motion.pre = transform_identity();
|
motion.pre = transform_identity();
|
||||||
@@ -165,9 +164,7 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene
|
|||||||
float uniform_scale;
|
float uniform_scale;
|
||||||
float surface_area = 0.0f;
|
float surface_area = 0.0f;
|
||||||
float pass_id = ob->pass_id;
|
float pass_id = ob->pass_id;
|
||||||
|
float random_number = (float)ob->random_id * (1.0f/(float)0xFFFFFFFF);
|
||||||
uint ob_hash = hash_int_2d(hash_string(ob->name.c_str()), ob->instance_id);
|
|
||||||
float random_number = (float)ob_hash * (1.0f/(float)0xFFFFFFFF);
|
|
||||||
|
|
||||||
if(transform_uniform_scale(tfm, uniform_scale)) {
|
if(transform_uniform_scale(tfm, uniform_scale)) {
|
||||||
map<Mesh*, float>::iterator it = surface_area_map.find(mesh);
|
map<Mesh*, float>::iterator it = surface_area_map.find(mesh);
|
||||||
|
@@ -41,7 +41,7 @@ public:
|
|||||||
Transform tfm;
|
Transform tfm;
|
||||||
BoundBox bounds;
|
BoundBox bounds;
|
||||||
ustring name;
|
ustring name;
|
||||||
int instance_id;
|
int random_id;
|
||||||
int pass_id;
|
int pass_id;
|
||||||
vector<ParamValue> attributes;
|
vector<ParamValue> attributes;
|
||||||
uint visibility;
|
uint visibility;
|
||||||
|
Reference in New Issue
Block a user