[Bf-blender-cvs] [530ed95] hair_immediate_fixes: Finished the particle-to-edit conversion function.

Lukas Tönne noreply at git.blender.org
Sat Dec 27 11:31:39 CET 2014


Commit: 530ed95d6666ab3ad1979fd181efb30d119ce304
Author: Lukas Tönne
Date:   Mon Nov 24 17:44:59 2014 +0100
Branches: hair_immediate_fixes
https://developer.blender.org/rB530ed95d6666ab3ad1979fd181efb30d119ce304

Finished the particle-to-edit conversion function.

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

M	source/blender/editors/hair/hair_edit.c
M	source/blender/editors/hair/hair_particles.c

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

diff --git a/source/blender/editors/hair/hair_edit.c b/source/blender/editors/hair/hair_edit.c
index b34e6e3..d7491c1 100644
--- a/source/blender/editors/hair/hair_edit.c
+++ b/source/blender/editors/hair/hair_edit.c
@@ -31,6 +31,8 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "BLI_math.h"
+
 #include "hair_intern.h"
 
 HairEditData *ED_hair_edit_create(void)
@@ -86,5 +88,26 @@ void ED_hair_edit_clear(HairEditData *hedit)
 
 void ED_hair_edit_reserve(HairEditData *hedit, int alloc_curves, int alloc_verts, bool shrink)
 {
-	if (hedit)
+	if (!hedit)
+		return;
+	
+	if ((alloc_curves > hedit->alloc_curves) || (alloc_curves < hedit->alloc_curves && shrink)) {
+		size_t size_curves = sizeof(HairEditCurve) * alloc_curves;
+		if (hedit->curves)
+			hedit->curves = MEM_recallocN_id(hedit->curves, size_curves, "hair edit curves");
+		else
+			hedit->curves = MEM_callocN(size_curves, "hair edit curves");
+		hedit->alloc_curves = alloc_curves;
+		CLAMP_MAX(hedit->totcurves, alloc_curves);
+	}
+	
+	if ((alloc_verts > hedit->alloc_verts) || (alloc_verts < hedit->alloc_verts && shrink)) {
+		size_t size_verts = sizeof(HairEditVertex) * alloc_verts;
+		if (hedit->verts)
+			hedit->verts = MEM_recallocN_id(hedit->verts, size_verts, "hair edit verts");
+		else
+			hedit->verts = MEM_callocN(size_verts, "hair edit verts");
+		hedit->alloc_verts = alloc_verts;
+		CLAMP_MAX(hedit->totverts, alloc_verts);
+	}
 }
diff --git a/source/blender/editors/hair/hair_particles.c b/source/blender/editors/hair/hair_particles.c
index ccf0801..fca0325 100644
--- a/source/blender/editors/hair/hair_particles.c
+++ b/source/blender/editors/hair/hair_particles.c
@@ -42,9 +42,73 @@
 
 /* ==== convert particle data to hair edit ==== */
 
+static int particle_totverts(ParticleSystem *psys)
+{
+	ParticleData *pa;
+	int p;
+	int totverts = 0;
+	
+	for (p = 0, pa = psys->particles; p < psys->totpart; ++p, ++pa)
+		totverts += pa->totkey;
+	
+	return totverts;
+}
+
+static void copy_edit_curve(HairEditData *hedit, HairEditCurve *curve, ParticleData *pa, int start)
+{
+	int totverts = pa->totkey;
+	HairKey *hair = pa->hair;
+	HairEditVertex *vert;
+	HairKey *hkey;
+	int k;
+	
+	BLI_assert(start + totverts < hedit->alloc_verts);
+	
+	curve->start = start;
+	curve->numverts = totverts;
+	
+	for (k = 0, vert = hedit->verts + start, hkey = hair;
+	     k < totverts;
+	     ++k, ++vert, ++hkey) {
+		
+		copy_v3_v3(vert->co, hkey->co);
+		// TODO define other key stuff ...
+	}
+}
+
 void hair_edit_from_particles(HairEditData *hedit, Object *UNUSED(ob), ParticleSystem *psys)
 {
+	int totverts = particle_totverts(psys);
+	
+	HairEditCurve *curve;
+	int i;
+	ParticleData *pa;
+	int p;
+	int vert_start;
+	
 	ED_hair_edit_clear(hedit);
+	
+	ED_hair_edit_reserve(hedit, psys->totpart, totverts, true);
+	
+	/* TODO we should have a clean input stream API for hair edit data
+	 * to avoid implicit size and index calculations here and make the code
+	 * as fool proof as possible.
+	 */
+	
+	hedit->totcurves = psys->totpart;
+	hedit->totverts = totverts;
+	
+	vert_start = 0;
+	for (i = 0, curve = hedit->curves, p = 0, pa = psys->particles;
+	     i < hedit->totcurves;
+	     ++i, ++curve, ++p, ++pa) {
+		
+		copy_edit_curve(hedit, curve, pa, vert_start);
+		
+		// TODO copy particle stuff ...
+		
+		vert_start += curve->numverts;
+	}
 }
 
 /* ==== convert hair edit to particle data ==== */
@@ -71,13 +135,12 @@ static void create_particle_curve(ParticleData *pa, HairEditData *hedit, HairEdi
 	int ntotkey = curve->numverts;
 	HairKey *nhair = MEM_callocN(sizeof(HairKey) * ntotkey, "hair keys");
 	HairEditVertex *vert;
-	int k;
 	HairKey *hkey;
-	int j;
+	int k;
 	
-	for (k = 0, vert = hedit->verts + curve->start, j = 0, hkey = nhair;
+	for (k = 0, vert = hedit->verts + curve->start, hkey = nhair;
 	     k < curve->numverts;
-	     ++k, ++vert, ++j, ++hkey) {
+	     ++k, ++vert, ++hkey) {
 		
 		copy_v3_v3(hkey->co, vert->co);
 		// TODO define other key stuff ...




More information about the Bf-blender-cvs mailing list