[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20755] trunk/blender/source/blender: Fix for bug #18881 and #18866: Surface option for Fields crashed

Brecht Van Lommel brecht at blender.org
Tue Jun 9 15:03:00 CEST 2009


Revision: 20755
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20755
Author:   blendix
Date:     2009-06-09 15:03:00 +0200 (Tue, 09 Jun 2009)

Log Message:
-----------
Fix for bug #18881 and #18866: Surface option for Fields crashed
on non-mesh objects, so hide it if not applicable. Also made it
support surf, curve, font objects.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_displist.h
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/src/buttons_object.c

Modified: trunk/blender/source/blender/blenkernel/BKE_displist.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_displist.h	2009-06-09 12:28:49 UTC (rev 20754)
+++ trunk/blender/source/blender/blenkernel/BKE_displist.h	2009-06-09 13:03:00 UTC (rev 20755)
@@ -86,7 +86,7 @@
 extern void freedisplist(struct ListBase *lb);
 extern int displist_has_faces(struct ListBase *lb);
 extern void makeDerivedMesh(struct Object *ob, CustomDataMask dataMask);
-extern void makeDispListSurf(struct Object *ob, struct ListBase *dispbase, int forRender);
+extern void makeDispListSurf(struct Object *ob, struct ListBase *dispbase, int forRender, int forOrco);
 extern void makeDispListCurveTypes(struct Object *ob, int forOrco);
 extern void makeDispListMBall(struct Object *ob);
 extern void shadeDispList(struct Base *base);

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2009-06-09 12:28:49 UTC (rev 20754)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2009-06-09 13:03:00 UTC (rev 20755)
@@ -1356,7 +1356,7 @@
 	
 }
 
-void makeDispListSurf(Object *ob, ListBase *dispbase, int forRender)
+void makeDispListSurf(Object *ob, ListBase *dispbase, int forRender, int forOrco)
 {
 	ListBase *nubase;
 	Nurb *nu;
@@ -1375,7 +1375,8 @@
 		nubase= &cu->nurb;
 	}
 
-	curve_calc_modifiers_pre(ob, nubase, forRender, &originalVerts, &deformedVerts, &numVerts);
+	if(!forOrco)
+		curve_calc_modifiers_pre(ob, nubase, forRender, &originalVerts, &deformedVerts, &numVerts);
 
 	for (nu=nubase->first; nu; nu=nu->next) {
 		if(forRender || nu->hide==0) {
@@ -1429,7 +1430,8 @@
 		tex_space_curve(cu);
 	}
 
-	curve_calc_modifiers_post(ob, nubase, dispbase, forRender, originalVerts, deformedVerts);
+	if(!forOrco)
+		curve_calc_modifiers_post(ob, nubase, dispbase, forRender, originalVerts, deformedVerts);
 }
 
 void makeDispListCurveTypes(Object *ob, int forOrco)
@@ -1445,7 +1447,7 @@
 	freedisplist(dispbase);
 	
 	if(ob->type==OB_SURF) {
-		makeDispListSurf(ob, dispbase, 0);
+		makeDispListSurf(ob, dispbase, 0, forOrco);
 	}
 	else if ELEM(ob->type, OB_CURVE, OB_FONT) {
 		ListBase dlbev;

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c	2009-06-09 12:28:49 UTC (rev 20754)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c	2009-06-09 13:03:00 UTC (rev 20755)
@@ -114,6 +114,72 @@
 
 #include "RE_shader_ext.h"
 
+/* Utility */
+
+static int is_last_displist(Object *ob)
+{
+	Curve *cu = ob->data;
+	static int curvecount=0, totcurve=0;
+
+	if(curvecount == 0){
+		DispList *dl;
+
+		totcurve = 0;
+		for(dl=cu->disp.first; dl; dl=dl->next)
+			totcurve++;
+	}
+
+	curvecount++;
+
+	if(curvecount == totcurve){
+		curvecount = 0;
+		return 1;
+	}
+
+	return 0;
+}
+
+static DerivedMesh *get_original_dm(Object *ob, float (*vertexCos)[3], int orco)
+{
+	DerivedMesh *dm= NULL;
+
+	if(ob->type==OB_MESH) {
+		dm = CDDM_from_mesh((Mesh*)(ob->data), ob);
+
+		if(vertexCos) {
+			CDDM_apply_vert_coords(dm, vertexCos);
+			//CDDM_calc_normals(dm);
+		}
+		
+		if(orco)
+			DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob));
+	}
+	else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)) {
+		Object *tmpobj;
+		Curve *tmpcu;
+
+		if(is_last_displist(ob)) {
+			/* copies object and modifiers (but not the data) */
+			tmpobj= copy_object(ob);
+			tmpcu = (Curve *)tmpobj->data;
+			tmpcu->id.us--;
+
+			/* copies the data */
+			tmpobj->data = copy_curve((Curve *) ob->data);
+
+			makeDispListCurveTypes(tmpobj, 1);
+			nurbs_to_mesh(tmpobj);
+
+			dm = CDDM_from_mesh((Mesh*)(tmpobj->data), tmpobj);
+			//CDDM_calc_normals(dm);
+
+			free_libblock_us(&G.main->object, tmpobj);
+		}
+	}
+
+	return dm;
+}
+
 /***/
 
 static int noneModifier_isDisabled(ModifierData *md)
@@ -6037,7 +6103,8 @@
 			MEM_freeN(surmd->bvhtree);
 		}
 
-		surmd->dm->release(surmd->dm);
+		if(surmd->dm)
+			surmd->dm->release(surmd->dm);
 		
 		surmd->bvhtree = NULL;
 		surmd->dm = NULL;
@@ -6061,7 +6128,7 @@
 
 	/* if possible use/create DerivedMesh */
 	if(derivedData) surmd->dm = CDDM_copy(derivedData);
-	else if(ob->type==OB_MESH) surmd->dm = CDDM_from_mesh(ob->data, ob);
+	else surmd->dm = get_original_dm(ob, NULL, 0);
 	
 	if(!ob->pd)
 	{
@@ -6233,71 +6300,7 @@
 	
 	return dataMask;
 }
-static int is_last_displist(Object *ob)
-{
-	Curve *cu = ob->data;
-	static int curvecount=0, totcurve=0;
 
-	if(curvecount==0){
-		DispList *dl;
-
-		totcurve=0;
-		for(dl=cu->disp.first; dl; dl=dl->next){
-			totcurve++;
-		}
-	}
-
-	curvecount++;
-
-	if(curvecount==totcurve){
-		curvecount=0;
-		return 1;
-	}
-
-	return 0;
-}
-
-static DerivedMesh *get_original_dm(Object *ob, float (*vertexCos)[3], int orco)
-{
-	DerivedMesh *dm= NULL;
-
-	if(ob->type==OB_MESH) {
-		dm = CDDM_from_mesh((Mesh*)(ob->data), ob);
-
-		if(vertexCos) {
-			CDDM_apply_vert_coords(dm, vertexCos);
-			//CDDM_calc_normals(dm);
-		}
-		
-		if(orco)
-			DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob));
-	}
-	else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)) {
-		Object *tmpobj;
-		Curve *tmpcu;
-
-		if(is_last_displist(ob)) {
-			/* copies object and modifiers (but not the data) */
-			tmpobj= copy_object(ob);
-			tmpcu = (Curve *)tmpobj->data;
-			tmpcu->id.us--;
-
-			/* copies the data */
-			tmpobj->data = copy_curve((Curve *) ob->data);
-
-			makeDispListCurveTypes(tmpobj, 1);
-			nurbs_to_mesh(tmpobj);
-
-			dm = CDDM_from_mesh((Mesh*)(tmpobj->data), tmpobj);
-			//CDDM_calc_normals(dm);
-
-			free_libblock_us(&G.main->object, tmpobj);
-		}
-	}
-
-	return dm;
-}
-
 /* saves the current emitter state for a particle system and calculates particles */
 static void particleSystemModifier_deformVerts(
 					       ModifierData *md, Object *ob, DerivedMesh *derivedData,

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2009-06-09 12:28:49 UTC (rev 20754)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2009-06-09 13:03:00 UTC (rev 20755)
@@ -2562,7 +2562,7 @@
 	if(need_orco) orcobase= orco= get_object_orco(re, ob);
 
 	displist.first= displist.last= 0;
-	makeDispListSurf(ob, &displist, 1);
+	makeDispListSurf(ob, &displist, 1, 0);
 
 	dl= displist.first;
 	/* walk along displaylist and create rendervertices/-faces */

Modified: trunk/blender/source/blender/src/buttons_object.c
===================================================================
--- trunk/blender/source/blender/src/buttons_object.c	2009-06-09 12:28:49 UTC (rev 20754)
+++ trunk/blender/source/blender/src/buttons_object.c	2009-06-09 13:03:00 UTC (rev 20755)
@@ -3395,12 +3395,14 @@
 		if(pd && (pd->flag & PFIELD_SURFACE)
 			&& ELEM5(pd->forcefield,PFIELD_HARMONIC,PFIELD_FORCE,PFIELD_HARMONIC,PFIELD_CHARGE,PFIELD_LENNARDJ))
 		{
-			md = modifier_new ( eModifierType_Surface );
-			BLI_addtail ( &ob->modifiers, md );
-			DAG_scene_sort(G.scene);
-			DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
-			allqueue(REDRAWBUTSEDIT, 0);
-			allqueue(REDRAWVIEW3D, 0);
+			if(ELEM4(ob->type, OB_MESH, OB_SURF, OB_FONT, OB_CURVE)) {
+				md = modifier_new ( eModifierType_Surface );
+				BLI_addtail ( &ob->modifiers, md );
+				DAG_scene_sort(G.scene);
+				DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+				allqueue(REDRAWBUTSEDIT, 0);
+				allqueue(REDRAWVIEW3D, 0);
+			}
 		}
 	}
 	else if(!pd || !(pd->flag & PFIELD_SURFACE)
@@ -3556,8 +3558,10 @@
 			}
 			
 			if(particles==0 && ELEM5(pd->forcefield,PFIELD_HARMONIC,PFIELD_FORCE,PFIELD_HARMONIC,PFIELD_CHARGE,PFIELD_LENNARDJ)) {
-				but = uiDefButBitS(block, TOG, PFIELD_SURFACE, B_FIELD_CHANGE, "Surface",	10,15,140,20, &pd->flag, 0.0, 0, 0, 0, "Use closest point on surface");
-				uiButSetFunc(but, object_surface__enabletoggle, ob, NULL);
+				if(ELEM4(ob->type, OB_MESH, OB_SURF, OB_FONT, OB_CURVE)) {
+					but = uiDefButBitS(block, TOG, PFIELD_SURFACE, B_FIELD_CHANGE, "Surface",	10,15,140,20, &pd->flag, 0.0, 0, 0, 0, "Use closest point on surface");
+					uiButSetFunc(but, object_surface__enabletoggle, ob, NULL);
+				}
 			}
 			uiBlockEndAlign(block);
 			





More information about the Bf-blender-cvs mailing list