[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27281] trunk/blender/source/blender: Constructive modifiers for curves and surfaces

Sergey Sharybin g.ulairi at gmail.com
Fri Mar 5 17:47:52 CET 2010


Revision: 27281
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27281
Author:   nazgul
Date:     2010-03-05 17:47:52 +0100 (Fri, 05 Mar 2010)

Log Message:
-----------
Constructive modifiers for curves and surfaces

Used approach with creating DerivedMesh for curves whet they've got such modifiers.

Available modifiers are: array, edge split, mirror, solidify, subsurf.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    trunk/blender/source/blender/blenkernel/BKE_cdderivedmesh.h
    trunk/blender/source/blender/blenkernel/BKE_displist.h
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.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/object.c
    trunk/blender/source/blender/editors/object/object_modifier.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/render/intern/source/convertblender.c

Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2010-03-05 15:36:05 UTC (rev 27280)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2010-03-05 16:47:52 UTC (rev 27281)
@@ -538,5 +538,8 @@
 
 void DM_add_tangent_layer(DerivedMesh *dm);
 
+/* Set object's bounding box based on DerivedMesh min/max data */
+void DM_set_object_boundbox(struct Object *ob, DerivedMesh *dm);
+
 #endif
 

Modified: trunk/blender/source/blender/blenkernel/BKE_cdderivedmesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_cdderivedmesh.h	2010-03-05 15:36:05 UTC (rev 27280)
+++ trunk/blender/source/blender/blenkernel/BKE_cdderivedmesh.h	2010-03-05 16:47:52 UTC (rev 27281)
@@ -54,6 +54,9 @@
 /* creates a CDDerivedMesh from the given EditMesh */
 struct DerivedMesh *CDDM_from_editmesh(struct EditMesh *em, struct Mesh *me);
 
+/* creates a CDDerivedMesh from the given curve object */
+struct DerivedMesh *CDDM_from_curve(struct Object *ob);
+
 /* Copies the given DerivedMesh with verts, faces & edges stored as
  * custom element data.
  */

Modified: trunk/blender/source/blender/blenkernel/BKE_displist.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_displist.h	2010-03-05 15:36:05 UTC (rev 27280)
+++ trunk/blender/source/blender/blenkernel/BKE_displist.h	2010-03-05 16:47:52 UTC (rev 27281)
@@ -102,5 +102,8 @@
 
 float calc_taper(struct Scene *scene, struct Object *taperobj, int cur, int tot);
 
+/* add Orco layer to the displist object which has got derived mesh and return orco */
+float *makeOrcoDispList(struct Scene *scene, struct Object *ob, int forRender);
+
 #endif
 

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2010-03-05 15:36:05 UTC (rev 27280)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2010-03-05 16:47:52 UTC (rev 27281)
@@ -70,6 +70,8 @@
 struct Mesh *get_mesh(struct Object *ob);
 void set_mesh(struct Object *ob, struct Mesh *me);
 void mball_to_mesh(struct ListBase *lb, struct Mesh *me);
+int nurbs_to_mdata(struct Object *ob, struct MVert **allvert, int *_totvert,
+	struct MEdge **alledge, int *_totedge, struct MFace **allface, int *_totface);
 void nurbs_to_mesh(struct Object *ob);
 void mesh_to_curve(struct Scene *scene, struct Object *ob);
 void free_dverts(struct MDeformVert *dvert, int totvert);

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2010-03-05 15:36:05 UTC (rev 27280)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2010-03-05 16:47:52 UTC (rev 27281)
@@ -2126,7 +2126,6 @@
 	int editing = paint_facesel_test(ob);
 	/* weight paint and face select need original indicies because of selection buffer drawing */
 	int needMapping = (ob==obact) && (editing || (ob->mode & OB_MODE_WEIGHT_PAINT) || editing);
-	float min[3], max[3];
 
 	clear_mesh_caches(ob);
 
@@ -2134,14 +2133,8 @@
 						&ob->derivedFinal, 0, 1,
 						needMapping, dataMask, -1, 1);
 
-	INIT_MINMAX(min, max);
+	DM_set_object_boundbox (ob, ob->derivedFinal);
 
-	ob->derivedFinal->getMinMax(ob->derivedFinal, min, max);
-
-	if(!ob->bb)
-		ob->bb= MEM_callocN(sizeof(BoundBox), "bb");
-	boundbox_set_from_min_max(ob->bb, min, max);
-
 	ob->derivedFinal->needsFree = 0;
 	ob->derivedDeform->needsFree = 0;
 	ob->lastDataMask = dataMask;
@@ -2149,8 +2142,6 @@
 
 static void editmesh_build_data(Scene *scene, Object *obedit, EditMesh *em, CustomDataMask dataMask)
 {
-	float min[3], max[3];
-
 	clear_mesh_caches(obedit);
 
 	if (em->derivedFinal) {
@@ -2167,16 +2158,9 @@
 	}
 
 	editmesh_calc_modifiers(scene, obedit, em, &em->derivedCage, &em->derivedFinal, dataMask);
-	em->lastDataMask = dataMask;
+	DM_set_object_boundbox (obedit, em->derivedFinal);
 
-	INIT_MINMAX(min, max);
-
-	em->derivedFinal->getMinMax(em->derivedFinal, min, max);
-
-	if(!obedit->bb)
-		obedit->bb= MEM_callocN(sizeof(BoundBox), "bb");
-	boundbox_set_from_min_max(obedit->bb, min, max);
-
+	em->lastDataMask = dataMask;
 	em->derivedFinal->needsFree = 0;
 	em->derivedCage->needsFree = 0;
 }
@@ -2624,3 +2608,17 @@
 	}
 }
 
+/* Set object's bounding box based on DerivedMesh min/max data */
+void DM_set_object_boundbox(Object *ob, DerivedMesh *dm)
+{
+	float min[3], max[3];
+
+	INIT_MINMAX(min, max);
+
+	dm->getMinMax(dm, min, max);
+
+	if(!ob->bb)
+		ob->bb= MEM_callocN(sizeof(BoundBox), "bb");
+
+	boundbox_set_from_min_max(ob->bb, min, max);
+}

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2010-03-05 15:36:05 UTC (rev 27280)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2010-03-05 16:47:52 UTC (rev 27281)
@@ -1585,6 +1585,36 @@
 	return dm;
 }
 
+DerivedMesh *CDDM_from_curve(Object *ob)
+{
+	DerivedMesh *dm;
+	CDDerivedMesh *cddm;
+	MVert *allvert;
+	MEdge *alledge;
+	MFace *allface;
+	int totvert, totedge, totface;
+
+	if (nurbs_to_mdata (ob, &allvert, &totvert, &alledge, &totedge, &allface, &totface) != 0) {
+		/* Error initializing mdata. This often happens when curve is empty */
+		return CDDM_new(0, 0, 0);
+	}
+
+	dm = CDDM_new(totvert, totedge, totface);
+	dm->deformedOnly = 1;
+
+	cddm = (CDDerivedMesh*)dm;
+
+	memcpy(cddm->mvert, allvert, totvert*sizeof(MVert));
+	memcpy(cddm->medge, alledge, totedge*sizeof(MEdge));
+	memcpy(cddm->mface, allface, totface*sizeof(MFace));
+
+	MEM_freeN(allvert);
+	MEM_freeN(alledge);
+	MEM_freeN(allface);
+
+	return dm;
+}
+
 DerivedMesh *CDDM_copy(DerivedMesh *source)
 {
 	CDDerivedMesh *cddm = cdDM_create("CDDM_copy cddm");

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2010-03-05 15:36:05 UTC (rev 27280)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2010-03-05 16:47:52 UTC (rev 27281)
@@ -65,6 +65,7 @@
 #include "BKE_displist.h"
 #include "BKE_deform.h"
 #include "BKE_DerivedMesh.h"
+#include "BKE_cdderivedmesh.h"
 #include "BKE_object.h"
 #include "BKE_world.h"
 #include "BKE_mesh.h"
@@ -1209,7 +1210,7 @@
 	boundbox_displist(ob);
 }
 
-static ModifierData *curve_get_tesselate_point(Object *ob, int forRender, int editmode)
+static ModifierData *curve_get_tesselate_point(Scene *scene, Object *ob, int forRender, int editmode)
 {
 	ModifierData *md = modifiers_getVirtualModifierList(ob);
 	ModifierData *preTesselatePoint;
@@ -1222,11 +1223,8 @@
 
 	preTesselatePoint = NULL;
 	for (; md; md=md->next) {
-		ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+		if (!modifier_isEnabled(scene, md, required_mode)) continue;
 
-		if ((md->mode & required_mode) != required_mode) continue;
-		if (mti->isDisabled && mti->isDisabled(md, forRender)) continue;
-
 		if (ELEM3(md->type, eModifierType_Hook, eModifierType_Softbody, eModifierType_MeshDeform)) {
 			preTesselatePoint  = md;
 		}
@@ -1251,7 +1249,7 @@
 	if(forRender) required_mode = eModifierMode_Render;
 	else required_mode = eModifierMode_Realtime;
 
-	preTesselatePoint = curve_get_tesselate_point(ob, forRender, editmode);
+	preTesselatePoint = curve_get_tesselate_point(scene, ob, forRender, editmode);
 	
 	if(editmode) required_mode |= eModifierMode_Editmode;
 
@@ -1312,11 +1310,12 @@
 	DispList *dl;
 	int required_mode;
 	int editmode = (!forRender && cu->editnurb);
+	DerivedMesh *dm= NULL, *ndm;
 
 	if(forRender) required_mode = eModifierMode_Render;
 	else required_mode = eModifierMode_Realtime;
 
-	preTesselatePoint = curve_get_tesselate_point(ob, forRender, editmode);
+	preTesselatePoint = curve_get_tesselate_point(scene, ob, forRender, editmode);
 	
 	if(editmode) required_mode |= eModifierMode_Editmode;
 
@@ -1324,6 +1323,10 @@
 		md = preTesselatePoint->next;
 	}
 
+	if (ob->derivedFinal) {
+		ob->derivedFinal->release (ob->derivedFinal);
+	}
+
 	for (; md; md=md->next) {
 		ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 		
@@ -1331,40 +1334,84 @@
 		
 		if ((md->mode & required_mode) != required_mode) continue;
 		if (mti->isDisabled && mti->isDisabled(md, forRender)) continue;
-		if (mti->type!=eModifierTypeType_OnlyDeform && mti->type!=eModifierTypeType_DeformOrConstruct) continue;
+		if (mti->type!=eModifierTypeType_OnlyDeform &&
+			mti->type!=eModifierTypeType_DeformOrConstruct &&
+			mti->type!=eModifierTypeType_Constructive) continue;
 
 		/* need to put all verts in 1 block for curve deform */
-		if(md->type==eModifierType_Curve) {
-			float *allverts, *fp;
+		/* we also need all verts in 1 block for derived mesh creation when handling constructive modifiers */
+		if(md->type==eModifierType_Curve || mti->type==eModifierTypeType_Constructive) {
+			float *allverts = NULL, *fp;
 			int totvert= 0;
-			
-			for (dl=dispbase->first; dl; dl=dl->next)
-				totvert+= (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr;
-			
-			fp= allverts= MEM_mallocN(totvert*sizeof(float)*3, "temp vert");
-			for (dl=dispbase->first; dl; dl=dl->next) {
-				int offs= 3 * ((dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr);
-				memcpy(fp, dl->verts, sizeof(float) * offs);
-				fp+= offs;
+
+			if (md->type==eModifierType_Curve ||
+				(mti->type==eModifierTypeType_Constructive && !dm)) {
+				for (dl=dispbase->first; dl; dl=dl->next)
+					totvert+= (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr;
+
+				fp= allverts= MEM_mallocN(totvert*sizeof(float)*3, "temp vert");
+				for (dl=dispbase->first; dl; dl=dl->next) {
+					int offs= 3 * ((dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr);
+					memcpy(fp, dl->verts, sizeof(float) * offs);
+					fp+= offs;
+				}
 			}
-			
-			mti->deformVerts(md, ob, NULL, (float(*)[3]) allverts, totvert, forRender, editmode);
-			
-			fp= allverts;
-			for (dl=dispbase->first; dl; dl=dl->next) {
-				int offs= 3 * ((dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr);
-				memcpy(dl->verts, fp, sizeof(float) * offs);
-				fp+= offs;
+
+			if (mti->type==eModifierTypeType_Constructive) {
+				if (!dm) {
+					dm= CDDM_from_curve(ob);
+					/*

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list