[Bf-blender-cvs] [c155f3bc950] hair_guides: Cycles: split off particle data gathering into separate function.

Lukas Tönne noreply at git.blender.org
Sat May 12 10:44:30 CEST 2018


Commit: c155f3bc950be8e0a232d42f2eea96b33a52ba8c
Author: Lukas Tönne
Date:   Mon May 7 10:59:11 2018 +0100
Branches: hair_guides
https://developer.blender.org/rBc155f3bc950be8e0a232d42f2eea96b33a52ba8c

Cycles: split off particle data gathering into separate function.

The general particle caching "Obtain" functions can be used for any
curve-type data in objects, including the new hair system data.

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

M	intern/cycles/blender/blender_curves.cpp

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

diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp
index f2bb1b0158c..62226f8c802 100644
--- a/intern/cycles/blender/blender_curves.cpp
+++ b/intern/cycles/blender/blender_curves.cpp
@@ -110,156 +110,219 @@ static void InterpolateKeySegments(int seg,
 		curveinterp_v3_v3v3v3v3(keyloc, &ckey_loc1, &ckey_loc2, &ckey_loc3, &ckey_loc4, t);
 }
 
-static bool ObtainCacheParticleData(Mesh *mesh,
-                                    BL::Mesh *b_mesh,
-                                    BL::Object *b_ob,
-                                    ParticleCurveData *CData,
-                                    bool background)
+static void ObtainCacheDataFromParticleSystem(Mesh *mesh,
+                                              BL::Object *b_ob,
+                                              BL::ParticleSystemModifier *b_psmd,
+                                              ParticleCurveData *CData,
+                                              bool background,
+                                              int *curvenum,
+                                              int *keyno)
 {
-	int curvenum = 0;
-	int keyno = 0;
-
-	if(!(mesh && b_mesh && b_ob && CData))
-		return false;
+	BL::ParticleSystem b_psys((const PointerRNA)b_psmd->particle_system().ptr);
+	BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr);
 
 	Transform tfm = get_transform(b_ob->matrix_world());
 	Transform itfm = transform_quick_inverse(tfm);
 
-	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) && (background ? b_mod->show_render() : b_mod->show_viewport())) {
-			BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr);
-			BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr);
-			BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr);
-
-			if((b_part.render_type() == BL::ParticleSettings::render_type_PATH) && (b_part.type() == BL::ParticleSettings::type_HAIR)) {
-				int shader = clamp(b_part.material()-1, 0, mesh->used_shaders.size()-1);
-				int draw_step = background ? b_part.render_step() : b_part.draw_step();
-				int totparts = b_psys.particles.length();
-				int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f);
-				int totcurves = totchild;
-
-				if(b_part.child_type() == 0 || totchild == 0)
-					totcurves += totparts;
-
-				if(totcurves == 0)
+	if((b_part.type() != BL::ParticleSettings::type_HAIR) ||
+	   (b_part.render_type() != BL::ParticleSettings::render_type_PATH))
+	{
+		return;
+	}
+	
+	int shader = clamp(b_part.material()-1, 0, mesh->used_shaders.size()-1);
+	int draw_step = background ? b_part.render_step() : b_part.draw_step();
+	int totparts = b_psys.particles.length();
+	int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f);
+	int totcurves = totchild;
+	
+	if(b_part.child_type() == 0 || totchild == 0)
+		totcurves += totparts;
+	
+	if(totcurves == 0)
+		return;
+	
+	int ren_step = (1 << draw_step) + 1;
+	if(b_part.kink() == BL::ParticleSettings::kink_SPIRAL)
+		ren_step += b_part.kink_extra_steps();
+	
+	PointerRNA cpsys = RNA_pointer_get(&b_part.ptr, "cycles");
+	
+	CData->psys_firstcurve.push_back_slow(*curvenum);
+	CData->psys_curvenum.push_back_slow(totcurves);
+	CData->psys_shader.push_back_slow(shader);
+	
+	float radius = get_float(cpsys, "radius_scale") * 0.5f;
+	
+	CData->psys_rootradius.push_back_slow(radius * get_float(cpsys, "root_width"));
+	CData->psys_tipradius.push_back_slow(radius * get_float(cpsys, "tip_width"));
+	CData->psys_shape.push_back_slow(get_float(cpsys, "shape"));
+	CData->psys_closetip.push_back_slow(get_boolean(cpsys, "use_closetip"));
+	
+	int pa_no = 0;
+	if(!(b_part.child_type() == 0) && totchild != 0)
+		pa_no = totparts;
+	
+	int num_add = (totparts+totchild - pa_no);
+	CData->curve_firstkey.reserve(CData->curve_firstkey.size() + num_add);
+	CData->curve_keynum.reserve(CData->curve_keynum.size() + num_add);
+	CData->curve_length.reserve(CData->curve_length.size() + num_add);
+	CData->curvekey_co.reserve(CData->curvekey_co.size() + num_add*ren_step);
+	CData->curvekey_time.reserve(CData->curvekey_time.size() + num_add*ren_step);
+	
+	for(; pa_no < totparts+totchild; pa_no++) {
+		int keynum = 0;
+		CData->curve_firstkey.push_back_slow(*keyno);
+		
+		float curve_length = 0.0f;
+		float3 pcKey;
+		for(int step_no = 0; step_no < ren_step; step_no++) {
+			float nco[3];
+			b_psys.co_hair(*b_ob, pa_no, step_no, nco);
+			float3 cKey = make_float3(nco[0], nco[1], nco[2]);
+			cKey = transform_point(&itfm, cKey);
+			if(step_no > 0) {
+				float step_length = len(cKey - pcKey);
+				if(step_length == 0.0f)
 					continue;
-
-				int ren_step = (1 << draw_step) + 1;
-				if(b_part.kink() == BL::ParticleSettings::kink_SPIRAL)
-					ren_step += b_part.kink_extra_steps();
-
-				PointerRNA cpsys = RNA_pointer_get(&b_part.ptr, "cycles");
-
-				CData->psys_firstcurve.push_back_slow(curvenum);
-				CData->psys_curvenum.push_back_slow(totcurves);
-				CData->psys_shader.push_back_slow(shader);
-
-				float radius = get_float(cpsys, "radius_scale") * 0.5f;
-
-				CData->psys_rootradius.push_back_slow(radius * get_float(cpsys, "root_width"));
-				CData->psys_tipradius.push_back_slow(radius * get_float(cpsys, "tip_width"));
-				CData->psys_shape.push_back_slow(get_float(cpsys, "shape"));
-				CData->psys_closetip.push_back_slow(get_boolean(cpsys, "use_closetip"));
-
-				int pa_no = 0;
-				if(!(b_part.child_type() == 0) && totchild != 0)
-					pa_no = totparts;
-
-				int num_add = (totparts+totchild - pa_no);
-				CData->curve_firstkey.reserve(CData->curve_firstkey.size() + num_add);
-				CData->curve_keynum.reserve(CData->curve_keynum.size() + num_add);
-				CData->curve_length.reserve(CData->curve_length.size() + num_add);
-				CData->curvekey_co.reserve(CData->curvekey_co.size() + num_add*ren_step);
-				CData->curvekey_time.reserve(CData->curvekey_time.size() + num_add*ren_step);
-
-				for(; pa_no < totparts+totchild; pa_no++) {
-					int keynum = 0;
-					CData->curve_firstkey.push_back_slow(keyno);
-
-					float curve_length = 0.0f;
-					float3 pcKey;
-					for(int step_no = 0; step_no < ren_step; step_no++) {
-						float nco[3];
-						b_psys.co_hair(*b_ob, pa_no, step_no, nco);
-						float3 cKey = make_float3(nco[0], nco[1], nco[2]);
-						cKey = transform_point(&itfm, cKey);
-						if(step_no > 0) {
-							float step_length = len(cKey - pcKey);
-							if(step_length == 0.0f)
-								continue;
-							curve_length += step_length;
-						}
-						CData->curvekey_co.push_back_slow(cKey);
-						CData->curvekey_time.push_back_slow(curve_length);
-						pcKey = cKey;
-						keynum++;
-					}
-					keyno += keynum;
-
-					CData->curve_keynum.push_back_slow(keynum);
-					CData->curve_length.push_back_slow(curve_length);
-					curvenum++;
-				}
+				curve_length += step_length;
 			}
+			CData->curvekey_co.push_back_slow(cKey);
+			CData->curvekey_time.push_back_slow(curve_length);
+			pcKey = cKey;
+			keynum++;
 		}
+		*keyno += keynum;
+		
+		CData->curve_keynum.push_back_slow(keynum);
+		CData->curve_length.push_back_slow(curve_length);
+		(*curvenum)++;
 	}
-
-	return true;
 }
 
-static bool ObtainCacheParticleUV(Mesh *mesh,
-                                  BL::Mesh *b_mesh,
-                                  BL::Object *b_ob,
-                                  ParticleCurveData *CData,
-                                  bool background,
-                                  int uv_num)
+static void ObtainCacheUVFromParticleSystem(BL::Mesh *b_mesh,
+                                            BL::ParticleSystemModifier *b_psmd,
+                                            ParticleCurveData *CData,
+                                            bool background,
+                                            int uv_num)
 {
-	if(!(mesh && b_mesh && b_ob && CData))
-		return false;
+	BL::ParticleSystem b_psys((const PointerRNA)b_psmd->particle_system().ptr);
+	BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr);
 
-	CData->curve_uv.clear();
-
-	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) && (background ? b_mod->show_render() : b_mod->show_viewport())) {
-			BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr);
-			BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr);
-			BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr);
-
-			if((b_part.render_type() == BL::ParticleSettings::render_type_PATH) && (b_part.type() == BL::ParticleSettings::type_HAIR)) {
-				int totparts = b_psys.particles.length();
-				int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f);
-				int totcurves = totchild;
+	if((b_part.type() != BL::ParticleSettings::type_HAIR) ||
+	   (b_part.render_type() != BL::ParticleSettings::render_type_PATH))
+	{
+		return;
+	}
 
-				if(b_part.child_type() == 0 || totchild == 0)
-					totcurves += totparts;
+	int totparts = b_psys.particles.length();
+	int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f);
+	int totcurves = totchild;
+	
+	if(b_part.child_type() == 0 || totchild == 0)
+		totcurves += totparts;
+	
+	if(totcurves == 0)
+		return;
+	
+	int pa_no = 0;
+	if(!(b_part.child_type() == 0) && totchild != 0)
+		pa_no = totparts;
+	
+	int num_add = (totparts+totchild - pa_no);
+	CData->curve_uv.reserve(CData->curve_uv.size() + num_add);
+	
+	BL::ParticleSystem::particles_iterator b_pa;
+	b_psys.particles.begin(b_pa);
+	for(; pa_no < totparts+totchild; pa_no++) {
+		/* Add UVs */
+		BL::Mesh::tessface_uv_textures_iterator l;
+		b_mesh->tessface_uv_textures.begin(l);
+		
+		float3 uv = make_float3(0.0f, 0.0f, 0.0f);
+		if(b_mesh->tessfac

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list