[Bf-blender-cvs] [7698c81a31e] cycles_refactor: Merge branch 'master' of git.blender.org:blender into cycles_refactor

Stefan Werner noreply at git.blender.org
Thu Feb 1 13:59:31 CET 2018


Commit: 7698c81a31e8aa22651d74c5c11809e35b08ea94
Author: Stefan Werner
Date:   Thu Feb 1 13:37:12 2018 +0100
Branches: cycles_refactor
https://developer.blender.org/rB7698c81a31e8aa22651d74c5c11809e35b08ea94

Merge branch 'master' of git.blender.org:blender into cycles_refactor

===================================================================



===================================================================

diff --cc intern/cycles/kernel/geom/geom_object.h
index edf2ee81d37,fa0dff4bd57..cdbed52cdf6
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@@ -44,20 -45,15 +45,12 @@@ enum ObjectVectorTransform 
  
  ccl_device_inline Transform object_fetch_transform(KernelGlobals *kg, int object, enum ObjectTransform type)
  {
 -	int offset = object*OBJECT_SIZE + (int)type;
 -
--	Transform tfm;
 -	tfm.x = kernel_tex_fetch(__objects, offset + 0);
 -	tfm.y = kernel_tex_fetch(__objects, offset + 1);
 -	tfm.z = kernel_tex_fetch(__objects, offset + 2);
 -	tfm.w = make_float4(0.0f, 0.0f, 0.0f, 1.0f);
 -
 -	return tfm;
 +	if(type == OBJECT_INVERSE_TRANSFORM) {
- 		tfm.x = kernel_tex_fetch(__objects, object).itfm[0];
- 		tfm.y = kernel_tex_fetch(__objects, object).itfm[1];
- 		tfm.z = kernel_tex_fetch(__objects, object).itfm[2];
++		return kernel_tex_fetch(__objects, object).itfm;
 +	}
 +	else {
- 		tfm.x = kernel_tex_fetch(__objects, object).tfm[0];
- 		tfm.y = kernel_tex_fetch(__objects, object).tfm[1];
- 		tfm.z = kernel_tex_fetch(__objects, object).tfm[2];
++		return kernel_tex_fetch(__objects, object).tfm;
 +	}
- 	tfm.w = make_float4(0.0f, 0.0f, 0.0f, 1.0f);
- 
- 	return tfm;
  }
  
  /* Lamp to world space transformation */
@@@ -101,20 -91,27 +94,8 @@@ ccl_device_inline Transform object_fetc
  #ifdef __OBJECT_MOTION__
  ccl_device_inline Transform object_fetch_transform_motion(KernelGlobals *kg, int object, float time)
  {
- 	DecompMotionTransform motion;
 -	MotionTransform motion;
--
- 	motion.mid.x = kernel_tex_fetch(__objects, object).tfm[0];
- 	motion.mid.y = kernel_tex_fetch(__objects, object).tfm[1];
- 	motion.mid.z = kernel_tex_fetch(__objects, object).tfm[2];
- 	motion.mid.w = kernel_tex_fetch(__objects, object).tfm[3];
 -	int offset = object*OBJECT_SIZE + (int)OBJECT_TRANSFORM_MOTION_PRE;
--
- 	motion.pre_x = kernel_tex_fetch(__objects, object).itfm[0];
- 	motion.pre_y = kernel_tex_fetch(__objects, object).itfm[1];
- 	motion.post_x = kernel_tex_fetch(__objects, object).itfm[2];
- 	motion.post_y = kernel_tex_fetch(__objects, object).itfm[3];
 -	motion.pre.x = kernel_tex_fetch(__objects, offset + 0);
 -	motion.pre.y = kernel_tex_fetch(__objects, offset + 1);
 -	motion.pre.z = kernel_tex_fetch(__objects, offset + 2);
 -	motion.pre.w = kernel_tex_fetch(__objects, offset + 3);
 -
 -	motion.mid.x = kernel_tex_fetch(__objects, offset + 4);
 -	motion.mid.y = kernel_tex_fetch(__objects, offset + 5);
 -	motion.mid.z = kernel_tex_fetch(__objects, offset + 6);
 -	motion.mid.w = kernel_tex_fetch(__objects, offset + 7);
 -
 -	motion.post.x = kernel_tex_fetch(__objects, offset + 8);
 -	motion.post.y = kernel_tex_fetch(__objects, offset + 9);
 -	motion.post.z = kernel_tex_fetch(__objects, offset + 10);
 -	motion.post.w = kernel_tex_fetch(__objects, offset + 11);
--
  	Transform tfm;
--	transform_motion_interpolate(&tfm, &motion, time);
++	transform_motion_interpolate(&tfm, &kernel_tex_fetch(__objects, object).motion_tfm, time);
  
  	return tfm;
  }
diff --cc intern/cycles/kernel/kernel_types.h
index 84ee58c986b,1e1a4f34650..de0c335c6c2
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@@ -1508,106 -1524,6 +1520,108 @@@ typedef struct WorkTile 
  	ccl_global float *buffer;
  } WorkTile;
  
 +typedef struct KernelObject
 +{
- 	float4 tfm[4];
- 	float4 itfm[4];
++	union {
++		Transform tfm, itfm;
++		MotionTransform motion_tfm;
++	};
 +	float surface_area;
 +	float pass_id;
 +	float random_number;
 +	float particle_index;
 +	float dupli_generated[3];
 +	int numkeys;
 +	float ob_dupli_uv[2];
 +	int numsteps;
 +	int numverts;
 +	uint patch_map_offset;
 +	uint attribute_map_offset;
 +	float pad2, pad3;
 +} KernelObject;
 +
 +typedef struct KernelSpotLight
 +{
 +	float radius;
 +	float invarea;
 +	float spot_angle;
 +	float spot_smooth;
 +	float dir[3];
 +} KernelSpotLight;
 +
 +/* PointLight is SpotLight with only radius and invarea being used. */
 +
 +typedef struct KernelAreaLight
 +{
 +	float axisu[3];
 +	float invarea;
 +	float axisv[3];
 +	float dir[3];
 +} KernelAreaLight;
 +
 +
 +typedef struct KernelDistantLight
 +{
 +	float radius;
 +	float cosangle;
 +	float invarea;
 +} KernelDistantLight;
 +
 +typedef struct KernelLight
 +{
 +	int type;
 +	float co[3];
 +	int shader_id;
 +	int samples;
 +	float max_bounces;
 +	float random;
 +	float4 tfm[3];
 +	float4 itfm[3];
 +	union {
 +		KernelSpotLight spot;
 +		KernelAreaLight area;
 +		KernelDistantLight distant;
 +	};
 +} KernelLight;
 +
 +
 +typedef struct KernelLightDistribution
 +{
 +	float totarea;
 +	int prim;
 +	union {
 +		struct {
 +			int shader_flag;
 +			int object_id;
 +		} mesh_light;
 +		struct {
 +			float pad;
 +			float size;
 +		} lamp;
 +	};
 +} KernelLightDistribution;
 +
 +typedef struct KernelParticle
 +{
 +	int index;
 +	float age;
 +	float lifetime;
 +	float size;
 +	float4 rotation;
 +	/* Only xyz are used of the following. 
 +	 * float4 instead of float3 are used to ensure consistent padding/alignment across devices. */
 +	float4 location;
 +	float4 velocity;
 +	float4 angular_velocity;
 +} KernelParticle;
 +
 +typedef struct KernelShaderFlags
 +{
 +	int flags;
 +	int pass_id;
 +	float constant_emission[3];
 +} KernelShaderFlags;
 +
  CCL_NAMESPACE_END
  
  #endif /*  __KERNEL_TYPES_H__ */
diff --cc intern/cycles/render/object.cpp
index 0b9eba65249,4c06654d756..96b708d6fe8
--- a/intern/cycles/render/object.cpp
+++ b/intern/cycles/render/object.cpp
@@@ -357,15 -357,15 +357,15 @@@ void ObjectManager::device_update_objec
  		}
  	}
  
 -	/* Pack in texture. */
 -	int offset = object_index*OBJECT_SIZE;
 -
  	/* OBJECT_TRANSFORM */
- 	memcpy(&object.tfm, &tfm, sizeof(float4)*3);
 -	memcpy(&objects[offset], &tfm, sizeof(float4)*3);
++	object.tfm = tfm;
  	/* OBJECT_INVERSE_TRANSFORM */
- 	memcpy(&object.itfm, &itfm, sizeof(float4)*3);
 -	memcpy(&objects[offset+4], &itfm, sizeof(float4)*3);
++	object.itfm = itfm;
  	/* OBJECT_PROPERTIES */
 -	objects[offset+12] = make_float4(surface_area, pass_id, random_number, __int_as_float(particle_index));
 +	object.surface_area = surface_area;
 +	object.pass_id = pass_id;
 +	object.random_number = random_number;
 +	object.particle_index = particle_index;
  
  	if(mesh->use_motion_blur) {
  		state->have_motion = true;
@@@ -401,29 -401,24 +401,25 @@@
  	else if(state->need_motion == Scene::MOTION_BLUR) {
  		if(ob->use_motion) {
  			/* decompose transformations for interpolation. */
- 			DecompMotionTransform decomp;
 -			MotionTransform decomp;
--
--			transform_motion_decompose(&decomp, &ob->motion, &ob->tfm);
- 			memcpy(&object.tfm, &decomp, sizeof(float4)*8);
 -			memcpy(&objects[offset], &decomp, sizeof(float4)*12);
++			transform_motion_decompose(&object.motion_tfm, &ob->motion, &ob->tfm);
++			
  			flag |= SD_OBJECT_MOTION;
  			state->have_motion = true;
  		}
  	}
- #endif
  
  	/* Dupli object coords and motion info. */
 +	object.dupli_generated[0] = ob->dupli_generated[0];
 +	object.dupli_generated[1] = ob->dupli_generated[1];
 +	object.dupli_generated[2] = ob->dupli_generated[2];
 +	object.numkeys = mesh->curve_keys.size();
 +	object.ob_dupli_uv[0] = ob->dupli_uv[0];
 +	object.ob_dupli_uv[1] = ob->dupli_uv[1];
  	int totalsteps = mesh->motion_steps;
 -	int numsteps = (totalsteps - 1)/2;
 -	int numverts = mesh->verts.size();
 -	int numkeys = mesh->curve_keys.size();
 -
 -	objects[offset+13] = make_float4(ob->dupli_generated[0], ob->dupli_generated[1], ob->dupli_generated[2], __int_as_float(numkeys));
 -	objects[offset+14] = make_float4(ob->dupli_uv[0], ob->dupli_uv[1], __int_as_float(numsteps), __int_as_float(numverts));
 -	objects[offset+15] = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
 +	object.numsteps = (totalsteps - 1)/2;
- 	object.numverts = mesh->verts.size();;
++	object.numverts = mesh->verts.size();
 +	object.patch_map_offset = 0;
 +	object.attribute_map_offset = 0;
  
  	/* Object flag. */
  	if(ob->use_holdout) {
diff --cc intern/cycles/util/util_transform.h
index aef168ca64d,ac0804a7227..7a08370c8f9
--- a/intern/cycles/util/util_transform.h
+++ b/intern/cycles/util/util_transform.h
@@@ -466,11 -458,11 +458,8 @@@ ccl_device_inline void transform_compos
  /* Disabled for now, need arc-length parametrization for constant speed motion.
   * #define CURVED_MOTION_INTERPOLATE */
  
- ccl_device void transform_motion_interpolate(Transform *tfm, const DecompMotionTransform *motion, float t)
+ ccl_device void transform_motion_interpolate(Transform *tfm, const MotionTransform *motion, float t)
  {
--	/* possible optimization: is it worth it adding a check to skip scaling?
--	 * it's probably quite uncommon to have scaling objects. or can we skip
--	 * just shearing perhaps? */
  	Transform decomp;
  
  #ifdef CURVED_MOTION_INTERPOLATE



More information about the Bf-blender-cvs mailing list