[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