[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12430] branches/particles/source/blender: first step to map particles from original mesh to derived mesh and removed some warnings .

Campbell Barton cbarton at metavr.com
Mon Oct 29 17:00:47 CET 2007


Revision: 12430
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12430
Author:   campbellbarton
Date:     2007-10-29 17:00:47 +0100 (Mon, 29 Oct 2007)

Log Message:
-----------
first step to map particles from original mesh to derived mesh and removed some warnings.

At the moment painting particles are painted onto the derived mesh, which means changing the subsurf level will mess up particle painting (when the particles are after the subsurf in the modifier 
stack)

Particles should be painted onto the original mesh.
This commit does nothing from the users perspective (other then making particles,subsurf not work anymore)
only adds functions and make some info available that is needed for particles to be mapped onto the derived mesh from the original mesh's faces that the particles will reference.

Modified Paths:
--------------
    branches/particles/source/blender/blenkernel/BKE_modifier.h
    branches/particles/source/blender/blenkernel/BKE_particle.h
    branches/particles/source/blender/blenkernel/intern/modifier.c
    branches/particles/source/blender/blenkernel/intern/particle.c
    branches/particles/source/blender/blenkernel/intern/particle_system.c
    branches/particles/source/blender/blenkernel/intern/pointcache.c
    branches/particles/source/blender/include/butspace.h
    branches/particles/source/blender/render/intern/source/convertblender.c
    branches/particles/source/blender/src/editparticle.c

Modified: branches/particles/source/blender/blenkernel/BKE_modifier.h
===================================================================
--- branches/particles/source/blender/blenkernel/BKE_modifier.h	2007-10-29 14:37:19 UTC (rev 12429)
+++ branches/particles/source/blender/blenkernel/BKE_modifier.h	2007-10-29 16:00:47 UTC (rev 12430)
@@ -87,8 +87,8 @@
 	eModifierTypeFlag_RequiresOriginalData = (1<<5),
 } ModifierTypeFlag;
 
-typedef void (*ObjectWalkFunc)(void *userData, Object *ob, Object **obpoin);
-typedef void (*IDWalkFunc)(void *userData, Object *ob, ID **idpoin);
+typedef void (*ObjectWalkFunc)(void *userData, struct Object *ob, struct Object **obpoin);
+typedef void (*IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin);
 
 typedef struct ModifierTypeInfo {
 	/* The user visible name for this modifier */
@@ -287,6 +287,7 @@
 struct Object *modifiers_isDeformedByLattice(struct Object *ob);
 int           modifiers_usesArmature(struct Object *ob, struct bArmature *arm);
 int           modifiers_isDeformed(struct Object *ob);
+int           modifiers_isDeformedOnly(struct Object *ob);
 
 int           modifiers_indexInObject(struct Object *ob, struct ModifierData *md);
 

Modified: branches/particles/source/blender/blenkernel/BKE_particle.h
===================================================================
--- branches/particles/source/blender/blenkernel/BKE_particle.h	2007-10-29 14:37:19 UTC (rev 12429)
+++ branches/particles/source/blender/blenkernel/BKE_particle.h	2007-10-29 16:00:47 UTC (rev 12430)
@@ -196,19 +196,19 @@
 
 void copy_particle_key(struct ParticleKey *to, struct ParticleKey *from, int time);
 
-void psys_particle_on_emitter(struct ParticleSystemModifierData *psmd, int distr, int index, float *fuv, float *vec, float *nor, float *utan, float *vtan);
+void psys_particle_on_emitter(int deform_only, struct ParticleSystemModifierData *psmd, int distr, int index, float *fuv, float *vec, float *nor, float *utan, float *vtan);
 struct ParticleSystemModifierData *psys_get_modifier(struct Object *ob, struct ParticleSystem *psys);
 
 struct ParticleSettings *psys_new_settings(char *name);
 struct ParticleSettings *psys_copy_settings(struct ParticleSettings *part);
 void psys_flush_settings(struct ParticleSettings *part, int event, int hair_recalc);
 
-void psys_find_parents(struct ParticleSystemModifierData *psmd, struct ParticleSystem *psys);
+void psys_find_parents(struct Object *ob, struct ParticleSystemModifierData *psmd, struct ParticleSystem *psys);
 
 void psys_cache_paths(struct Object *ob, struct ParticleSystem *psys, float cfra);
 void cache_psys_child_paths(struct Object *ob, struct ParticleSystem *psys, float cfra);
 int do_guide(struct ParticleKey *state, int pa_num, float time, struct ListBase *lb);
-float psys_get_size(struct Material *ma, struct ParticleSystemModifierData *psmd, struct IpoCurve *icu_size, struct ParticleSystem *psys, struct ParticleSettings *part, struct ParticleData *pa, float *vg_size);
+float psys_get_size(struct Object *ob, struct Material *ma, struct ParticleSystemModifierData *psmd, struct IpoCurve *icu_size, struct ParticleSystem *psys, struct ParticleSettings *part, struct ParticleData *pa, float *vg_size);
 float psys_get_timestep(struct ParticleSettings *part);
 float psys_get_child_time(struct ParticleSystem *psys, int child_nbr, float cfra);
 float psys_get_child_size(struct ParticleSystem *psys, int child_nbr, float cfra, float *pa_time);
@@ -241,13 +241,13 @@
 int find_n_nearest_in_kdtree(struct KDTreeNode *root, float *co, int n, struct KDTreeNearest *ptn);
 
 float *psys_cache_vgroup(struct DerivedMesh *dm, struct ParticleSystem *psys, int vgroup);
-void psys_get_texture(struct Material *ma, struct ParticleSystemModifierData *psmd, struct ParticleSystem *psys, struct ParticleData *pa, struct ParticleTexture *ptex, int event);
+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);
 float psys_interpolate_value_from_verts(struct DerivedMesh *dm, short from, int index, float *fuv, 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 DerivedMesh *dm, int from, int index, float *fuv, float *vec, float *nor, float *utan, float *vtan);
+void psys_particle_on_dm(struct DerivedMesh *dm, int deform_only, int from, int index, float *fuv, float *vec, float *nor, float *utan, float *vtan);
 
 /* particle_system.c */
 void initialize_particle(struct ParticleData *pa, int p, Object *ob, struct ParticleSystem *psys, struct ParticleSystemModifierData *psmd);

Modified: branches/particles/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/particles/source/blender/blenkernel/intern/modifier.c	2007-10-29 14:37:19 UTC (rev 12429)
+++ branches/particles/source/blender/blenkernel/intern/modifier.c	2007-10-29 16:00:47 UTC (rev 12430)
@@ -5374,7 +5374,7 @@
 	}
 	return 0.0;
 }
-static void explodeModifier_createFacepa(ExplodeModifierData *emd,
+static void explodeModifier_createFacepa(int deform_only, ExplodeModifierData *emd,
 										 ParticleSystemModifierData *psmd, DerivedMesh *dm)
 {
 	ParticleSystem *psys=psmd->psys;
@@ -5425,7 +5425,7 @@
 	/* make tree of emitter locations */
 	tree=alloc_kdtree(totpart);
 	for(p=0,pa=psys->particles,cur=tree; p<totpart; p++,pa++,cur++){
-		psys_particle_on_dm(dm,psys->part->from,pa->num,pa->fuv,cur->co,0,0,0);
+		psys_particle_on_dm(dm,deform_only,psys->part->from,pa->num,pa->fuv,cur->co,0,0,0);
 		cur->nbr=p;
 		if(p) insert_into_kdtree(tree,cur);
 	}
@@ -5997,7 +5997,7 @@
 	for(i=0, pa=pars; i<=totpart; i++, pa++){
 
 		if(i!=totpart){
-			psys_particle_on_emitter(psmd,part->from,pa->num,pa->fuv,loc0,nor,0,0);
+			psys_particle_on_emitter(modifiers_isDeformedOnly(ob), psmd,part->from,pa->num,pa->fuv,loc0,nor,0,0);
 			Mat4MulVecfl(ob->obmat,loc0);
 
 			state.time=cfra;
@@ -6096,7 +6096,7 @@
 }
 static void pointCacheModifier_freeData(ModifierData *md)
 {
-	PointCacheModifierData *pcm = (PointCacheModifierData*) md;
+	//PointCacheModifierData *pcm = (PointCacheModifierData*) md;
 }
 static void pointCacheModifier_copyData(ModifierData *md, ModifierData *target)
 {
@@ -6111,7 +6111,7 @@
 }
 CustomDataMask pointCacheModifier_requiredDataMask(ModifierData *md)
 {
-	PointCacheModifierData *emd= (PointCacheModifierData*) md;
+	//PointCacheModifierData *pcm= (PointCacheModifierData*) md;
 	CustomDataMask dataMask = 0;
 	return dataMask;
 }
@@ -6137,7 +6137,7 @@
 		}
 		fclose(fp);
 	} else if (pcm->mode == ePointCache_Write) {
-		float pt[3];
+		
 		fp = PTCache_id_fopen((ID *)ob, 'r', G.scene->r.cfra, stack_index);
 		if (!fp) return dm;
 		for (mv=mvert, i=0; i<totvert; mv++, i++) {
@@ -6184,7 +6184,7 @@
 			if(emd->flag & eExplodeFlag_CalcFaces)
 				emd->flag &= ~eExplodeFlag_CalcFaces;
 
-			explodeModifier_createFacepa(emd,psmd,derivedData);
+			explodeModifier_createFacepa(modifiers_isDeformedOnly(ob),emd,psmd,derivedData);
 		}
 
 		/* 2. create new mesh */
@@ -6856,6 +6856,21 @@
 	return 0;
 }
 
+/* checks we only have deform modifiers */
+int modifiers_isDeformedOnly(Object *ob)
+{
+	ModifierData *md = modifiers_getVirtualModifierList(ob);
+	ModifierTypeInfo *mti;
+	for (; md; md=md->next) {
+		mti = modifierType_getInfo(md->type);
+		/* TODO - check the modifier is being used! */
+		if (mti->type != eModifierTypeType_OnlyDeform) {
+			return 0;
+		}
+	}
+	return 1;
+}
+
 int modifiers_indexInObject(Object *ob, ModifierData *md_seek)
 {
 	int i= 0;
@@ -6865,4 +6880,3 @@
 	if (!md) return -1; /* modifier isnt in the object */
 	return i;
 }
-

Modified: branches/particles/source/blender/blenkernel/intern/particle.c
===================================================================
--- branches/particles/source/blender/blenkernel/intern/particle.c	2007-10-29 14:37:19 UTC (rev 12429)
+++ branches/particles/source/blender/blenkernel/intern/particle.c	2007-10-29 16:00:47 UTC (rev 12430)
@@ -40,6 +40,7 @@
 
 #include "DNA_scene_types.h"
 #include "DNA_particle_types.h"
+#include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_modifier_types.h"
 #include "DNA_object_force.h"
@@ -72,6 +73,7 @@
 #include "BKE_library.h"
 #include "BKE_depsgraph.h"
 #include "BKE_bad_level_calls.h"
+#include "BKE_modifier.h"
 
 #include "blendef.h"
 #include "RE_render_ext.h"
@@ -778,76 +780,113 @@
 	return 0.0;
 }
 /* interprets particle data to get a point on a mesh in object space */
-void psys_particle_on_dm(DerivedMesh *dm, int from, int index, float *fuv, float *vec, float *nor, float *utan, float *vtan)
-{
-	float temp1[3], temp2[3];
-
+#define PARTICLE_ERROR(_nor, _vec) _vec[0]=_vec[1]=_vec[2]=0.0; if(_nor){ _nor[0]=_nor[1]=0.0; _nor[2]=1.0; }
+void psys_particle_on_dm(DerivedMesh *dm, int deform_only, int from, int index, float *fuv, float *vec, float *nor, float *utan, float *vtan)
+{	
 	if(index < 0){ /* 'no dm' error has happened! */
-		vec[0]=vec[1]=vec[2]=0.0;
-		if(nor){
-			nor[0]=vec[1]=0.0;
-			nor[2]=1.0;
-		}
+		PARTICLE_ERROR(nor, vec);
 		return;
 	}
-
-	switch(from){
-		case PART_FROM_VERT:
-			dm->getVertCo(dm,index,vec);
-			if(nor){
-				dm->getVertNo(dm,index,nor);
-				Normalize(nor);
+	
+	if (deform_only) {
+		/* this works for meshes with deform verts only - constructive modifiers wont work properly*/
+		float temp1[3], temp2[3];
+		switch(from){
+			case PART_FROM_VERT:
+				dm->getVertCo(dm,index,vec);
+				if(nor){
+					dm->getVertNo(dm,index,nor);
+					Normalize(nor);
+				}
+				break;
+			case PART_FROM_EDGE:
+			{
+				MEdge *me=dm->getEdgeData(dm,index,CD_MEDGE);
+				MVert *mv1=dm->getVertData(dm,me->v1,CD_MVERT);
+				MVert *mv2=dm->getVertData(dm,me->v2,CD_MVERT);
+	
+				VecSubf(temp1,mv2->co,mv1->co);
+				VECADDFAC(vec,mv1->co,temp1,fuv[0]);
+	
+				/*make float normals*/
+				if(nor){
+					VECCOPY(temp1,mv1->no);
+					VECCOPY(temp2,mv2->no);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list