[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12794] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Dec 5 13:40:55 CET 2007


Revision: 12794
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12794
Author:   blendix
Date:     2007-12-05 13:40:54 +0100 (Wed, 05 Dec 2007)

Log Message:
-----------

Particles
=========

- Texture orco coordinates for particles are now actual orcos instead
  of just the vertex positions, which means they are the same under
  deformations and the same as the ones on the mesh.
- Particle distribution now uses these orcos to get consistent
  distributions independent of deformation.
- This required changing the way orco's are computed for meshes. Now
  instead of generating an orco derivedmesh separately, the derivedmesh
  is generated alongside the regular one and stored in an orco custom
  data layer.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/customdata.c
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/makesdna/DNA_customdata_types.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/src/editparticle.c

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2007-12-05 12:04:14 UTC (rev 12793)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2007-12-05 12:40:54 UTC (rev 12794)
@@ -62,8 +62,8 @@
 void make_local_mesh(struct Mesh *me);
 void boundbox_mesh(struct Mesh *me, float *loc, float *size);
 void tex_space_mesh(struct Mesh *me);
-float *mesh_create_orco_render(struct Object *ob);
-float *mesh_create_orco(struct Object *ob);
+float *get_mesh_orco_verts(struct Object *ob);
+void transform_mesh_orco_verts(struct Mesh *me, float (*orco)[3], int totvert);
 void test_index_face(struct MFace *mface, struct CustomData *mfdata, int mfindex, int nr);
 struct Mesh *get_mesh(struct Object *ob);
 void set_mesh(struct Object *ob, struct Mesh *me);

Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h	2007-12-05 12:04:14 UTC (rev 12793)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h	2007-12-05 12:40:54 UTC (rev 12794)
@@ -219,7 +219,7 @@
 
 void copy_particle_key(struct ParticleKey *to, struct ParticleKey *from, int time);
 
-void psys_particle_on_emitter(struct Object *ob, struct ParticleSystemModifierData *psmd, int distr, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan);
+void psys_particle_on_emitter(struct Object *ob, struct ParticleSystemModifierData *psmd, int distr, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
 struct ParticleSystemModifierData *psys_get_modifier(struct Object *ob, struct ParticleSystem *psys);
 
 struct ParticleSettings *psys_new_settings(char *name, struct Main *main);
@@ -268,12 +268,12 @@
 
 float *psys_cache_vgroup(struct DerivedMesh *dm, struct ParticleSystem *psys, int vgroup);
 void psys_get_texture(struct Object *ob, struct Material *ma, struct ParticleSystemModifierData *psmd, struct ParticleSystem *psys, struct ParticleData *pa, struct ParticleTexture *ptex, int event);
-void psys_interpolate_face(struct MVert *mvert, struct MFace *mface, struct MTFace *tface, float *uv, float *vec, float *nor, float *utan, float *vtan);
+void psys_interpolate_face(struct MVert *mvert, struct MFace *mface, struct MTFace *tface, float (*orcodata)[3], float *uv, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
 float psys_interpolate_value_from_verts(struct DerivedMesh *dm, short from, int index, float *fw, float *values);
 void psys_get_from_key(struct ParticleKey *key, float *loc, float *vel, float *rot, float *time);
 
 int psys_intersect_dm(struct Object *ob, struct DerivedMesh *dm, float *vert_cos, float *co1, float* co2, float *min_d, int *min_face, float *min_uv, float *face_minmax, float *pa_minmax, float radius, float *ipoint);
-void psys_particle_on_dm(struct Object *ob, struct DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float foffset, float *vec, float *nor, float *utan, float *vtan);
+void psys_particle_on_dm(struct Object *ob, struct DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
 
 /* particle_system.c */
 void initialize_particle(struct ParticleData *pa, int p, struct Object *ob, struct ParticleSystem *psys, struct ParticleSystemModifierData *psmd);

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2007-12-05 12:04:14 UTC (rev 12793)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2007-12-05 12:40:54 UTC (rev 12794)
@@ -1813,7 +1813,7 @@
 				View3D *view = sa->spacedata.first;
 				if(view->drawtype == OB_SHADED) {
 					/* this includes normals for mesh_create_shadedColors */
-					mask |= CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_NORMAL;
+					mask |= CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_NORMAL | CD_MASK_ORCO;
 				}
 				if((view->drawtype == OB_TEXTURE) || ((view->drawtype == OB_SOLID) && (view->flag2 & V3D_SOLID_TEX))) {
 					mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
@@ -1829,6 +1829,48 @@
 	return mask;
 }
 
+static DerivedMesh *create_orco_dm(Object *ob, Mesh *me)
+{
+	DerivedMesh *dm;
+	float (*orco)[3];
+
+	dm= CDDM_from_mesh(me, ob);
+	orco= (float(*)[3])get_mesh_orco_verts(ob);
+	CDDM_apply_vert_coords(dm, orco);
+	CDDM_calc_normals(dm);
+	MEM_freeN(orco);
+
+	return dm;
+}
+
+static void add_orco_dm(Object *ob, DerivedMesh *dm, DerivedMesh *orcodm)
+{
+	float (*orco)[3], (*layerorco)[3];
+	int totvert;
+
+	totvert= dm->getNumVerts(dm);
+
+	if(orcodm) {
+		orco= MEM_callocN(sizeof(float)*3*totvert, "dm orco");
+
+		if(orcodm->getNumVerts(orcodm) == totvert)
+			orcodm->getVertCos(orcodm, orco);
+		else
+			dm->getVertCos(dm, orco);
+	}
+	else
+		orco= (float(*)[3])get_mesh_orco_verts(ob);
+
+	transform_mesh_orco_verts(ob->data, orco, totvert);
+
+	if((layerorco = DM_get_vert_data_layer(dm, CD_ORCO))) {
+		memcpy(layerorco, orco, sizeof(float)*totvert);
+		MEM_freeN(orco);
+	}
+	else
+		DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, orco);
+}
+
 static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
                                 DerivedMesh **deform_r, DerivedMesh **final_r,
                                 int useRenderParams, int useDeform,
@@ -1837,8 +1879,9 @@
 	Mesh *me = ob->data;
 	ModifierData *md = modifiers_getVirtualModifierList(ob);
 	LinkNode *datamasks, *curr;
+	CustomDataMask mask;
 	float (*deformedVerts)[3] = NULL;
-	DerivedMesh *dm;
+	DerivedMesh *dm, *orcodm, *finaldm;
 	int numVerts = me->totvert;
 	int fluidsimMeshUsed = 0;
 	int required_mode;
@@ -1936,6 +1979,7 @@
 	 * OnlyDeform ones. 
 	 */
 	dm = NULL;
+	orcodm = NULL;
 
 #ifdef WITH_VERSE
 	/* hack to make sure modifiers don't try to use mesh data from a verse
@@ -1957,6 +2001,13 @@
 		if(mti->isDisabled && mti->isDisabled(md)) continue;
 		if(needMapping && !modifier_supportsMapping(md)) continue;
 
+		/* add an orco layer if needed by this modifier */
+		if(dm && mti->requiredDataMask) {
+			mask = mti->requiredDataMask(md);
+			if(mask & CD_MASK_ORCO)
+				add_orco_dm(ob, dm, orcodm);
+		}
+
 		/* How to apply modifier depends on (a) what we already have as
 		 * a result of previous modifiers (could be a DerivedMesh or just
 		 * deformed vertices) and (b) what type the modifier is.
@@ -1980,6 +2031,8 @@
 				}
 			}
 
+			if(md->type == eModifierType_ParticleSystem)
+
 			mti->deformVerts(md, ob, dm, deformedVerts, numVerts);
 		} else {
 			DerivedMesh *ndm;
@@ -2003,13 +2056,31 @@
 				}
 			}
 
+			/* create an orco derivedmesh in parallel */
+			mask= (CustomDataMask)curr->link;
+			if(mask & CD_MASK_ORCO) {
+				if(!orcodm)
+					orcodm= create_orco_dm(ob, me);
+
+				mask &= ~CD_MASK_ORCO;
+				DM_set_only_copy(orcodm, mask);
+				ndm = mti->applyModifier(md, ob, orcodm, useRenderParams, !inputVertexCos);
+
+				if(ndm) {
+					/* if the modifier returned a new dm, release the old one */
+					if(orcodm && orcodm != ndm) orcodm->release(orcodm);
+					orcodm = ndm;
+				}
+			}
+
 			/* set the DerivedMesh to only copy needed data */
-			DM_set_only_copy(dm, (CustomDataMask)curr->link);
+			DM_set_only_copy(dm, mask);
 			
+			/* add an origspace layer if needed */
 			if(((CustomDataMask)curr->link) & CD_MASK_ORIGSPACE)
 				if(!CustomData_has_layer(&dm->faceData, CD_ORIGSPACE))
-					CustomData_add_layer(&dm->faceData, CD_ORIGSPACE, CD_DEFAULT, NULL, dm->getNumFaces(dm));
-			
+					DM_add_face_layer(dm, CD_ORIGSPACE, CD_DEFAULT, NULL);
+
 			ndm = mti->applyModifier(md, ob, dm, useRenderParams, !inputVertexCos);
 
 			if(ndm) {
@@ -2033,34 +2104,43 @@
 	 * DerivedMesh then we need to build one.
 	 */
 	if(dm && deformedVerts) {
-		*final_r = CDDM_copy(dm);
+		finaldm = CDDM_copy(dm);
 
 		dm->release(dm);
 
-		CDDM_apply_vert_coords(*final_r, deformedVerts);
-		CDDM_calc_normals(*final_r);
+		CDDM_apply_vert_coords(finaldm, deformedVerts);
+		CDDM_calc_normals(finaldm);
 	} else if(dm) {
-		*final_r = dm;
+		finaldm = dm;
 	} else {
 #ifdef WITH_VERSE
 		if(me->vnode)
-			*final_r = derivedmesh_from_versemesh(me->vnode, deformedVerts);
+			finaldm = derivedmesh_from_versemesh(me->vnode, deformedVerts);
 		else {
-			*final_r = CDDM_from_mesh(me, ob);
+			finaldm = CDDM_from_mesh(me, ob);
 			if(deformedVerts) {
-				CDDM_apply_vert_coords(*final_r, deformedVerts);
-				CDDM_calc_normals(*final_r);
+				CDDM_apply_vert_coords(finaldm, deformedVerts);
+				CDDM_calc_normals(finaldm);
 			}
 		}
 #else
-		*final_r = CDDM_from_mesh(me, ob);
+		finaldm = CDDM_from_mesh(me, ob);
 		if(deformedVerts) {
-			CDDM_apply_vert_coords(*final_r, deformedVerts);
-			CDDM_calc_normals(*final_r);
+			CDDM_apply_vert_coords(finaldm, deformedVerts);
+			CDDM_calc_normals(finaldm);
 		}
 #endif
 	}
 
+	/* add an orco layer if needed */
+	if(dataMask & CD_MASK_ORCO)
+		add_orco_dm(ob, finaldm, orcodm);
+
+	*final_r = finaldm;
+
+	if(orcodm)
+		orcodm->release(orcodm);
+
 	if(deformedVerts && deformedVerts != inputVertexCos)
 		MEM_freeN(deformedVerts);
 
@@ -2190,7 +2270,7 @@
 
 			if(((CustomDataMask)curr->link) & CD_MASK_ORIGSPACE)
 				if(!CustomData_has_layer(&dm->faceData, CD_ORIGSPACE))
-					CustomData_add_layer(&dm->faceData, CD_ORIGSPACE, CD_DEFAULT, NULL, dm->getNumFaces(dm));
+					DM_add_face_layer(dm, CD_ORIGSPACE, CD_DEFAULT, NULL);
 			
 			ndm = mti->applyModifierEM(md, ob, em, dm);
 

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2007-12-05 12:04:14 UTC (rev 12793)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2007-12-05 12:40:54 UTC (rev 12794)
@@ -449,11 +449,13 @@
 	{sizeof(MStringProperty), "MStringProperty",1,"String",NULL,NULL,NULL,NULL},
 	{sizeof(OrigSpaceFace), "OrigSpaceFace", 1, "UVTex", layerCopy_origspace_face, NULL,
 	 layerInterp_origspace_face, layerSwap_origspace_face, layerDefault_origspace_face},
+	{sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL, NULL}
 };
 
 const char *LAYERTYPENAMES[CD_NUMTYPES] = {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list