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

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Feb 18 11:49:48 CET 2008


Revision: 13742
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13742
Author:   blendix
Date:     2008-02-18 11:49:46 +0100 (Mon, 18 Feb 2008)

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

Fix for bug #8052: particle emit from verts and volume didn't support
subsurf/derivedmesh mapping yet.

Also added int-to-pointer and back conversion function to solve warnings.
Note that it is only allowed to store an int in a pointer and then get
it back, but not a pointer in an int!

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/BKE_utildefines.h
    trunk/blender/source/blender/blenkernel/intern/icons.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/blenkernel/intern/subsurf_ccg.c

Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h	2008-02-17 23:53:48 UTC (rev 13741)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h	2008-02-18 10:49:46 UTC (rev 13742)
@@ -295,7 +295,7 @@
 
 void do_effectors(int pa_no, struct ParticleData *pa, struct ParticleKey *state, struct Object *ob, struct ParticleSystem *psys, float *force_field, float *vel,float framestep, float cfra);
 
-void psys_calc_dmfaces(struct Object *ob, struct DerivedMesh *dm, struct ParticleSystem *psys);
+void psys_calc_dmcache(struct Object *ob, struct DerivedMesh *dm, struct ParticleSystem *psys);
 int psys_particle_dm_face_lookup(struct Object *ob, struct DerivedMesh *dm, int index, float *fw, struct LinkNode *node);
 
 /* ParticleEffectorCache->type */

Modified: trunk/blender/source/blender/blenkernel/BKE_utildefines.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_utildefines.h	2008-02-17 23:53:48 UTC (rev 13741)
+++ trunk/blender/source/blender/blenkernel/BKE_utildefines.h	2008-02-18 10:49:46 UTC (rev 13742)
@@ -197,5 +197,10 @@
 #endif
 #define GS(a)	(*((short *)(a)))
 
+/* Warning-free macros for storing ints in pointers. Use these _only_
+ * for storing an int in a pointer, not a pointer in an int (64bit)! */
+#define SET_INT_IN_POINTER(i) ((void*)(long)(i))
+#define GET_INT_FROM_POINTER(i) ((int)(long)(i))
+
 #endif
 

Modified: trunk/blender/source/blender/blenkernel/intern/icons.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/icons.c	2008-02-17 23:53:48 UTC (rev 13741)
+++ trunk/blender/source/blender/blenkernel/intern/icons.c	2008-02-18 10:49:46 UTC (rev 13742)
@@ -48,6 +48,7 @@
 #include "BLI_ghash.h"
 
 #include "BKE_icons.h"
+#include "BKE_utildefines.h"
 
 #define GS(a)	(*((short *)(a)))
 
@@ -87,7 +88,7 @@
 		return gNextIconId++;
 	
 	/* now we try to find the smallest icon id not stored in the gIcons hash */
-	while (BLI_ghash_lookup(gIcons, (void *)startId) && startId>=gFirstIconId) 
+	while (BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(startId)) && startId>=gFirstIconId) 
 		startId++;
 
 	/* if we found a suitable one that isnt used yet, return it */
@@ -216,7 +217,7 @@
 	
 	if (!id) return;
 
-	icon = BLI_ghash_lookup(gIcons, (void *)id);
+	icon = BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(id));
 	
 	if (icon)
 	{
@@ -258,7 +259,7 @@
 	new_icon->drawinfo = 0;
 	new_icon->drawinfo_free = 0;
 
-	BLI_ghash_insert(gIcons, (void *)id->icon_id, new_icon);
+	BLI_ghash_insert(gIcons, SET_INT_IN_POINTER(id->icon_id), new_icon);
 	
 	return id->icon_id;
 }
@@ -267,7 +268,7 @@
 {
 	Icon* icon = 0;
 
-	icon = BLI_ghash_lookup(gIcons, (void*)icon_id);
+	icon = BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(icon_id));
 	
 	if (!icon) {
 		printf("BKE_icon_get: Internal error, no icon for icon ID: %d\n", icon_id);
@@ -281,7 +282,7 @@
 {
 	Icon* old_icon = 0;
 
-	old_icon = BLI_ghash_lookup(gIcons, (void*)icon_id);
+	old_icon = BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(icon_id));
 
 	if (old_icon)
 	{
@@ -289,7 +290,7 @@
 		return;
 	}
 
-	BLI_ghash_insert(gIcons, (void *)icon_id, icon);
+	BLI_ghash_insert(gIcons, SET_INT_IN_POINTER(icon_id), icon);
 }
 
 void BKE_icon_delete(struct ID* id)
@@ -297,6 +298,6 @@
 
 	if (!id->icon_id) return; /* no icon defined for library object */
 
-	BLI_ghash_remove(gIcons, (void*)id->icon_id, 0, icon_free);
+	BLI_ghash_remove(gIcons, SET_INT_IN_POINTER(id->icon_id), 0, icon_free);
 	id->icon_id = 0;
 }

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c	2008-02-17 23:53:48 UTC (rev 13741)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c	2008-02-18 10:49:46 UTC (rev 13742)
@@ -435,18 +435,18 @@
 			MFace mf;
 			dm->getFace(dm, faceMap[i], &mf);
 
-			if(!BLI_ghash_haskey(vertHash, (void *)mf.v1))
-				BLI_ghash_insert(vertHash, (void *)mf.v1,
-				                 (void *)BLI_ghash_size(vertHash));
-			if(!BLI_ghash_haskey(vertHash, (void *)mf.v2))
-				BLI_ghash_insert(vertHash, (void *)mf.v2,
-				                 (void *)BLI_ghash_size(vertHash));
-			if(!BLI_ghash_haskey(vertHash, (void *)mf.v3))
-				BLI_ghash_insert(vertHash, (void *)mf.v3,
-				                 (void *)BLI_ghash_size(vertHash));
-			if(mf.v4 && !BLI_ghash_haskey(vertHash, (void *)mf.v4))
-				BLI_ghash_insert(vertHash, (void *)mf.v4,
-				                 (void *)BLI_ghash_size(vertHash));
+			if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v1)))
+				BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(mf.v1),
+				                 SET_INT_IN_POINTER(BLI_ghash_size(vertHash)));
+			if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v2)))
+				BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(mf.v2),
+				                 SET_INT_IN_POINTER(BLI_ghash_size(vertHash)));
+			if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v3)))
+				BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(mf.v3),
+				                 SET_INT_IN_POINTER(BLI_ghash_size(vertHash)));
+			if(mf.v4 && !BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(mf.v4)))
+				BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(mf.v4),
+				                 SET_INT_IN_POINTER(BLI_ghash_size(vertHash)));
 		}
 
 		/* get the set of edges that will be in the new mesh (i.e. all edges
@@ -457,10 +457,10 @@
 			MEdge me;
 			dm->getEdge(dm, i, &me);
 
-			if(BLI_ghash_haskey(vertHash, (void *)me.v1)
-			   && BLI_ghash_haskey(vertHash, (void *)me.v2))
+			if(BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v1))
+			   && BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v2)))
 				BLI_ghash_insert(edgeHash,
-				                 (void *)BLI_ghash_size(edgeHash), (void *)i);
+				                 SET_INT_IN_POINTER(BLI_ghash_size(edgeHash)), SET_INT_IN_POINTER(i));
 		}
 	} else if(numEdges) {
 		if(bmd->randomize)
@@ -474,12 +474,12 @@
 			MEdge me;
 			dm->getEdge(dm, edgeMap[i], &me);
 
-			if(!BLI_ghash_haskey(vertHash, (void *)me.v1))
-				BLI_ghash_insert(vertHash, (void *)me.v1,
-				                 (void *)BLI_ghash_size(vertHash));
-			if(!BLI_ghash_haskey(vertHash, (void *)me.v2))
-				BLI_ghash_insert(vertHash, (void *)me.v2,
-				                 (void *)BLI_ghash_size(vertHash));
+			if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v1)))
+				BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(me.v1),
+				                 SET_INT_IN_POINTER(BLI_ghash_size(vertHash)));
+			if(!BLI_ghash_haskey(vertHash, SET_INT_IN_POINTER(me.v2)))
+				BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(me.v2),
+				                 SET_INT_IN_POINTER(BLI_ghash_size(vertHash)));
 		}
 
 		/* get the set of edges that will be in the new mesh
@@ -488,8 +488,8 @@
 			MEdge me;
 			dm->getEdge(dm, edgeMap[i], &me);
 
-			BLI_ghash_insert(edgeHash, (void *)BLI_ghash_size(edgeHash),
-			                 (void *)edgeMap[i]);
+			BLI_ghash_insert(edgeHash, SET_INT_IN_POINTER(BLI_ghash_size(edgeHash)),
+			                 SET_INT_IN_POINTER(edgeMap[i]));
 		}
 	} else {
 		int numVerts = dm->getNumVerts(dm) * frac;
@@ -502,7 +502,7 @@
 		 * mapped to the new indices
 		 */
 		for(i = 0; i < numVerts; ++i)
-			BLI_ghash_insert(vertHash, (void *)vertMap[i], (void *)i);
+			BLI_ghash_insert(vertHash, SET_INT_IN_POINTER(vertMap[i]), SET_INT_IN_POINTER(i));
 	}
 
 	/* now we know the number of verts, edges and faces, we can create
@@ -517,8 +517,8 @@
 		BLI_ghashIterator_step(hashIter)) {
 		MVert source;
 		MVert *dest;
-		int oldIndex = (int)BLI_ghashIterator_getKey(hashIter);
-		int newIndex = (int)BLI_ghashIterator_getValue(hashIter);
+		int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter));
+		int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter));
 
 		dm->getVert(dm, oldIndex, &source);
 		dest = CDDM_get_vert(result, newIndex);
@@ -532,13 +532,13 @@
 	for(i = 0; i < BLI_ghash_size(edgeHash); ++i) {
 		MEdge source;
 		MEdge *dest;
-		int oldIndex = (int)BLI_ghash_lookup(edgeHash, (void *)i);
+		int oldIndex = GET_INT_FROM_POINTER(BLI_ghash_lookup(edgeHash, SET_INT_IN_POINTER(i)));
 
 		dm->getEdge(dm, oldIndex, &source);
 		dest = CDDM_get_edge(result, i);
 
-		source.v1 = (int)BLI_ghash_lookup(vertHash, (void *)source.v1);
-		source.v2 = (int)BLI_ghash_lookup(vertHash, (void *)source.v2);
+		source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1)));
+		source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2)));
 
 		DM_copy_edge_data(dm, result, oldIndex, i, 1);
 		*dest = source;
@@ -555,11 +555,11 @@
 
 		orig_v4 = source.v4;
 
-		source.v1 = (int)BLI_ghash_lookup(vertHash, (void *)source.v1);
-		source.v2 = (int)BLI_ghash_lookup(vertHash, (void *)source.v2);
-		source.v3 = (int)BLI_ghash_lookup(vertHash, (void *)source.v3);
+		source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1)));
+		source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2)));
+		source.v3 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v3)));
 		if(source.v4)
-			source.v4 = (int)BLI_ghash_lookup(vertHash, (void *)source.v4);
+			source.v4 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v4)));
 
 		DM_copy_face_data(dm, result, faceMap[i], i, 1);
 		*dest = source;

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c	2008-02-17 23:53:48 UTC (rev 13741)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c	2008-02-18 10:49:46 UTC (rev 13742)
@@ -539,8 +539,8 @@
 	psmd->totdmface= data->totdmface;
 	psmd->flag &= ~eParticleSystemFlag_psys_updated;
 
-	if(psys->part->from==PART_FROM_FACE && psmd->dm)
-		psys_calc_dmfaces(ob, psmd->dm, psys);
+	if(psmd->dm)
+		psys_calc_dmcache(ob, psmd->dm, psys);
 
 	MEM_freeN(data);
 	psys->renderdata= NULL;
@@ -1086,7 +1086,7 @@
 	
 	if(node) { /* we have a linked list of faces that we use, faster! */
 		for(;node; node=node->next) {
-			findex= (int)node->link;
+			findex= GET_INT_FROM_POINTER(node->link);
 			faceuv= osface[findex].uv;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list