[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53527] trunk/blender/intern/cycles: Cycles Hair: refactoring to support generic attributes for hair curves.

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Jan 3 13:08:59 CET 2013


Revision: 53527
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53527
Author:   blendix
Date:     2013-01-03 12:08:54 +0000 (Thu, 03 Jan 2013)
Log Message:
-----------
Cycles Hair: refactoring to support generic attributes for hair curves. There
should be no functional changes yet. UV, tangent and intercept are now stored
as attributes, with the intention to add more like multiple uv's, vertex
colors, generated coordinates and motion vectors later.

Things got a bit messy due to having both triangle and curve data in the same
mesh data structure, which also gives us two sets of attributes. This will get
cleaned up when we split the mesh class.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_curves.cpp
    trunk/blender/intern/cycles/blender/blender_mesh.cpp
    trunk/blender/intern/cycles/bvh/bvh.cpp
    trunk/blender/intern/cycles/bvh/bvh_build.cpp
    trunk/blender/intern/cycles/bvh/bvh_split.cpp
    trunk/blender/intern/cycles/kernel/CMakeLists.txt
    trunk/blender/intern/cycles/kernel/kernel_bvh.h
    trunk/blender/intern/cycles/kernel/kernel_light.h
    trunk/blender/intern/cycles/kernel/kernel_object.h
    trunk/blender/intern/cycles/kernel/kernel_passes.h
    trunk/blender/intern/cycles/kernel/kernel_path.h
    trunk/blender/intern/cycles/kernel/kernel_shader.h
    trunk/blender/intern/cycles/kernel/kernel_textures.h
    trunk/blender/intern/cycles/kernel/kernel_triangle.h
    trunk/blender/intern/cycles/kernel/kernel_types.h
    trunk/blender/intern/cycles/kernel/osl/osl_services.cpp
    trunk/blender/intern/cycles/kernel/osl/osl_services.h
    trunk/blender/intern/cycles/kernel/osl/osl_shader.cpp
    trunk/blender/intern/cycles/kernel/osl/osl_shader.h
    trunk/blender/intern/cycles/kernel/shaders/node_hair_info.osl
    trunk/blender/intern/cycles/kernel/svm/svm_attribute.h
    trunk/blender/intern/cycles/kernel/svm/svm_geometry.h
    trunk/blender/intern/cycles/kernel/svm/svm_tex_coord.h
    trunk/blender/intern/cycles/render/attribute.cpp
    trunk/blender/intern/cycles/render/attribute.h
    trunk/blender/intern/cycles/render/curves.h
    trunk/blender/intern/cycles/render/light.cpp
    trunk/blender/intern/cycles/render/mesh.cpp
    trunk/blender/intern/cycles/render/mesh.h
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/intern/cycles/render/nodes.h
    trunk/blender/intern/cycles/render/object.cpp
    trunk/blender/intern/cycles/render/scene.h
    trunk/blender/intern/cycles/subd/subd_dice.cpp
    trunk/blender/intern/cycles/util/CMakeLists.txt
    trunk/blender/intern/cycles/util/util_types.h

Added Paths:
-----------
    trunk/blender/intern/cycles/kernel/kernel_curve.h
    trunk/blender/intern/cycles/kernel/kernel_primitive.h

Removed Paths:
-------------
    trunk/blender/intern/cycles/kernel/kernel_attribute.h
    trunk/blender/intern/cycles/util/util_attribute.cpp
    trunk/blender/intern/cycles/util/util_attribute.h

Modified: trunk/blender/intern/cycles/blender/blender_curves.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_curves.cpp	2013-01-03 09:18:34 UTC (rev 53526)
+++ trunk/blender/intern/cycles/blender/blender_curves.cpp	2013-01-03 12:08:54 UTC (rev 53527)
@@ -67,8 +67,7 @@
 	curve_firstkey.clear();
 	curve_keynum.clear();
 	curve_length.clear();
-	curve_u.clear();
-	curve_v.clear();
+	curve_uv.clear();
 
 	curvekey_co.clear();
 	curvekey_time.clear();
@@ -78,13 +77,13 @@
 {
 	float t2, t3, fc;
 
-	if (type == CURVE_LINEAR) {
+	if(type == CURVE_LINEAR) {
 		data[0] =          0.0f;
 		data[1] = -t     + 1.0f;
 		data[2] =  t;
 		data[3] =          0.0f;
 	}
-	else if (type == CURVE_CARDINAL) {
+	else if(type == CURVE_CARDINAL) {
 		t2 = t * t;
 		t3 = t2 * t;
 		fc = 0.71f;
@@ -94,7 +93,7 @@
 		data[2] =  (fc - 2.0f) * t3  + (3.0f - 2.0f * fc) * t2 + fc * t;
 		data[3] =  fc          * t3  - fc * t2;
 	}
-	else if (type == CURVE_BSPLINE) {
+	else if(type == CURVE_BSPLINE) {
 		t2 = t * t;
 		t3 = t2 * t;
 
@@ -115,8 +114,8 @@
 float shaperadius(float shape, float root, float tip, float time)
 {
 	float radius = 1.0f - time;
-	if (shape != 0.0f) {
-		if (shape < 0.0f)
+	if(shape != 0.0f) {
+		if(shape < 0.0f)
 			radius = (float)pow(1.0f - time, 1.f + shape);
 		else
 			radius = (float)pow(1.0f - time, 1.f / (1.f - shape));
@@ -133,10 +132,10 @@
 	float3 ckey_loc3 = CData->curvekey_co[key+1];
 	float3 ckey_loc4 = ckey_loc3;
 
-	if (key > CData->curve_firstkey[curve])
+	if(key > CData->curve_firstkey[curve])
 		ckey_loc1 = CData->curvekey_co[key - 1];
 
-	if (key < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2)
+	if(key < CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2)
 		ckey_loc4 = CData->curvekey_co[key + 2];
 
 
@@ -167,7 +166,7 @@
 
 	BL::Object::modifiers_iterator b_mod;
 	for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) {
-		if ((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (b_mod->show_viewport()) && (b_mod->show_render())) {
+		if((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (b_mod->show_viewport()) && (b_mod->show_render())) {
 
 			BL::ParticleSystemModifier psmd(b_mod->ptr);
 
@@ -213,7 +212,7 @@
 						float nco[3];
 						b_cKey->co_object( *b_ob, psmd, *b_pa, nco);
 						float3 cKey = make_float3(nco[0],nco[1],nco[2]);
-						if (step_no > 0)
+						if(step_no > 0)
 							curve_length += len(cKey - pcKey);
 						CData->curvekey_co.push_back(cKey);
 						CData->curvekey_time.push_back(curve_length);
@@ -227,11 +226,10 @@
 					BL::Mesh::tessface_uv_textures_iterator l;
 					b_mesh->tessface_uv_textures.begin(l);
 
-					float uvs[3] = {0,0};
+					float3 uv = make_float3(0.0f, 0.0f, 0.0f);
 					if(b_mesh->tessface_uv_textures.length())
-						b_pa->uv_on_emitter(psmd,uvs);
-					CData->curve_u.push_back(uvs[0]);
-					CData->curve_v.push_back(uvs[1]);
+						b_pa->uv_on_emitter(psmd,&uv.x);
+					CData->curve_uv.push_back(uv);
 
 					curvenum++;
 
@@ -258,7 +256,7 @@
 
 	BL::Object::modifiers_iterator b_mod;
 	for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) {
-		if ((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (b_mod->show_viewport()) && (b_mod->show_render())) {
+		if((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (b_mod->show_viewport()) && (b_mod->show_render())) {
 			BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr);
 
 			BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr);
@@ -277,10 +275,10 @@
 				int totchild = b_psys.child_particles.length() * b_psys.settings().draw_percentage() / 100;
 				int totcurves = totchild;
 				
-				if (use_parents || b_psys.settings().child_type() == 0)
+				if(use_parents || b_psys.settings().child_type() == 0)
 					totcurves += totparts;
 
-				if (totcurves == 0)
+				if(totcurves == 0)
 					continue;
 
 				PointerRNA cpsys = RNA_pointer_get(&b_part.ptr, "cycles");
@@ -314,7 +312,7 @@
 						b_psys.co_hair(*b_ob, psmd, pa_no, step_no, nco);
 						float3 cKey = make_float3(nco[0],nco[1],nco[2]);
 						cKey = transform_point(&itfm, cKey);
-						if (step_no > 0)
+						if(step_no > 0)
 							curve_length += len(cKey - pcKey);
 						CData->curvekey_co.push_back(cKey);
 						CData->curvekey_time.push_back(curve_length);
@@ -327,17 +325,14 @@
 					BL::Mesh::tessface_uv_textures_iterator l;
 					b_mesh->tessface_uv_textures.begin(l);
 
-					float uvs[2] = {0,0};
+					float3 uv = make_float3(0.0f, 0.0f, 0.0f);
 					if(b_mesh->tessface_uv_textures.length())
-						b_psys.uv_on_emitter(psmd, *b_pa, pa_no, uvs);
-						
+						b_psys.uv_on_emitter(psmd, *b_pa, pa_no, &uv.x);
+					CData->curve_uv.push_back(uv);
 
 					if(pa_no < totparts && b_pa != b_psys.particles.end())
 						++b_pa;
 
-					CData->curve_u.push_back(uvs[0]);
-					CData->curve_v.push_back(uvs[1]);
-
 					curvenum++;
 
 				}
@@ -365,11 +360,11 @@
 
 				float3 v1;
 
-				if (curvekey == CData->curve_firstkey[curve]) {
+				if(curvekey == CData->curve_firstkey[curve]) {
 					subv = 0;
 					v1 = CData->curvekey_co[curvekey+2] - CData->curvekey_co[curvekey];
 				}
-				else if (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2)
+				else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2)
 					v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey - 2];
 				else 
 					v1 = CData->curvekey_co[curvekey + 1] - CData->curvekey_co[curvekey - 1];
@@ -387,10 +382,10 @@
 
 					float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time);
 
-					if (CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
+					if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
 						radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f);
 
-					if ((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments))
+					if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments))
 						radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.95f);
 
 					xbasis = normalize(cross(v1,RotCam - ickey_loc));
@@ -408,7 +403,7 @@
 		}
 	}
 
-	mesh->reserve(mesh->verts.size(), mesh->triangles.size());
+	mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0);
 	mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
 	mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
 	mesh->add_face_normals();
@@ -439,11 +434,11 @@
 				float3 v1;
 				float3 v2;
 
-				if (curvekey == CData->curve_firstkey[curve]) {
+				if(curvekey == CData->curve_firstkey[curve]) {
 					v1 = CData->curvekey_co[curvekey+2] - CData->curvekey_co[curvekey+1];
 					v2 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
 				}
-				else if (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
+				else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
 					v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey-1];
 					v2 = CData->curvekey_co[curvekey-1] - CData->curvekey_co[curvekey-2];
 				}
@@ -467,12 +462,12 @@
 				float3 v2;
 				float3 xbasis;
 
-				if (curvekey == CData->curve_firstkey[curve]) {
+				if(curvekey == CData->curve_firstkey[curve]) {
 					subv = 0;
 					v1 = CData->curvekey_co[curvekey+2] - CData->curvekey_co[curvekey+1];
 					v2 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
 				}
-				else if (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
+				else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
 					v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey-1];
 					v2 = CData->curvekey_co[curvekey-1] - CData->curvekey_co[curvekey-2];
 				}
@@ -502,10 +497,10 @@
 
 					float radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], time);
 
-					if (CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
+					if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
 						radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f);
 
-					if ((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments))
+					if((curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) && (subv == segments))
 						radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], CData->psys_tipradius[sys], 0.95f);
 
 					float3 ickey_loc_shfl = ickey_loc - radius * xbasis;
@@ -522,7 +517,7 @@
 		}
 	}
 
-	mesh->reserve(mesh->verts.size(), mesh->triangles.size());
+	mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0);
 	mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
 	mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
 	mesh->add_face_normals();
@@ -553,11 +548,11 @@
 				float3 v1;
 				float3 v2;
 
-				if (curvekey == CData->curve_firstkey[curve]) {
+				if(curvekey == CData->curve_firstkey[curve]) {
 					v1 = CData->curvekey_co[curvekey+2] - CData->curvekey_co[curvekey+1];
 					v2 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
 				}
-				else if (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
+				else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
 					v1 = CData->curvekey_co[curvekey] - CData->curvekey_co[curvekey-1];
 					v2 = CData->curvekey_co[curvekey-1] - CData->curvekey_co[curvekey-2];
 				}
@@ -582,12 +577,12 @@
 				float3 v1;
 				float3 v2;
 
-				if (curvekey == CData->curve_firstkey[curve]) {
+				if(curvekey == CData->curve_firstkey[curve]) {
 					subv = 0;
 					v1 = CData->curvekey_co[curvekey+2] - CData->curvekey_co[curvekey+1];
 					v2 = CData->curvekey_co[curvekey+1] - CData->curvekey_co[curvekey];
 				}
-				else if (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {
+				else if(curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list