[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15277] branches/soc-2008-nicholasbishop/ source/blender: Big commit with initial support for sculpting of meshes with the multires modifier .
Nicholas Bishop
nicholasbishop at gmail.com
Thu Jun 19 05:13:53 CEST 2008
Revision: 15277
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15277
Author: nicholasbishop
Date: 2008-06-19 05:13:00 +0200 (Thu, 19 Jun 2008)
Log Message:
-----------
Big commit with initial support for sculpting of meshes with the multires modifier.
With this commit, the displacement custom data is being applied to a subdivided version of the base mesh using a modification of CCGSubsurf.
Sculpting on the highest level of the multires mesh now works, with (at least) these caveats:
* Only the plain 'Draw' brush works for now
* Normals aren't being updated during sculpting, so it doesn't actually look right yet
* When displacements are applied or calculated, only interior face points are handled, so original vertices and edge vertices will look wrong after switching levels.
Modified Paths:
--------------
branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_subsurf.h
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/DerivedMesh.c
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/customdata.c
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/subsurf_ccg.c
branches/soc-2008-nicholasbishop/source/blender/makesdna/DNA_modifier_types.h
branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c
branches/soc-2008-nicholasbishop/source/blender/src/sculptmode.c
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h 2008-06-18 21:22:17 UTC (rev 15276)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h 2008-06-19 03:13:00 UTC (rev 15277)
@@ -66,3 +66,45 @@
void multires_customdata_to_mesh(struct Mesh *me, struct EditMesh *em,
struct MultiresLevel *lvl, struct CustomData *src,
struct CustomData *dst, const int type);
+
+struct DerivedMesh;
+struct MFace;
+
+/* MultiresDM */
+struct DerivedMesh *MultiresDM_new(struct DerivedMesh*, int, int, int, int, int);
+void *MultiresDM_get_orco(struct DerivedMesh *);
+void *MultiresDM_get_subco(struct DerivedMesh *);
+struct MFace *MultiresDM_get_orfa(struct DerivedMesh *);
+int MultiresDM_get_totlvl(struct DerivedMesh *);
+int MultiresDM_get_lvl(struct DerivedMesh *);
+int MultiresDM_get_totorfa(struct DerivedMesh *);
+void MultiresDM_set_update(struct DerivedMesh *, void (*)(struct DerivedMesh*));
+
+/* Modifier */
+struct MDisps;
+struct MultiresModifierData;
+typedef struct MultiresDisplacer {
+ struct MDisps *grid;
+ float mat[3][3];
+ int sides;
+ int spacing;
+ int sidetot;
+ int sidendx;
+ int type;
+ int invert;
+ float (*orco)[3];
+ float (*subco)[3];
+
+ int x, y, ax, ay;
+} MultiresDisplacer;
+
+struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*, struct DerivedMesh*, int, int);
+
+void multiresModifier_subdivide(void *mmd_v, void *ob_v);
+void multiresModifier_setLevel(void *mmd_v, void *ob_v);
+
+void multires_displacer_init(MultiresDisplacer *d, struct DerivedMesh *dm,
+ const int face_index, const int sides, const int invert);
+void multires_displacer_anchor(MultiresDisplacer *d, const int type, const int side_index);
+void multires_displacer_jump(MultiresDisplacer *d);
+void multires_displace(MultiresDisplacer *d, float out[3]);
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_subsurf.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_subsurf.h 2008-06-18 21:22:17 UTC (rev 15276)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_subsurf.h 2008-06-19 03:13:00 UTC (rev 15277)
@@ -32,6 +32,7 @@
struct Object;
struct DerivedMesh;
struct EditMesh;
+struct MultiresModifierData;
struct SubsurfModifierData;
struct DerivedMesh *subsurf_make_derived_from_derived(
@@ -40,6 +41,13 @@
int useRenderParams, float (*vertCos)[3],
int isFinalCalc, int editMode);
+struct DerivedMesh *subsurf_make_derived_from_derived_with_multires(
+ struct DerivedMesh *dm,
+ struct SubsurfModifierData *smd,
+ struct MultiresModifierData *mmd,
+ int useRenderParams, float (*vertCos)[3],
+ int isFinalCalc, int editMode);
+
void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3]);
#endif
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/DerivedMesh.c 2008-06-18 21:22:17 UTC (rev 15276)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/DerivedMesh.c 2008-06-19 03:13:00 UTC (rev 15277)
@@ -1838,6 +1838,9 @@
if(G.f & G_VERTEXPAINT || G.f & G_WEIGHTPAINT)
mask |= CD_MASK_MCOL;
+ if(G.f & G_SCULPTMODE)
+ mask |= CD_MASK_MDISPS;
+
return mask;
}
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c 2008-06-18 21:22:17 UTC (rev 15276)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c 2008-06-19 03:13:00 UTC (rev 15277)
@@ -1141,3 +1141,122 @@
return ((CDDerivedMesh*)dm)->mface;
}
+/* Multires DerivedMesh, extends CDDM */
+typedef struct MultiresDM {
+ CDDerivedMesh cddm;
+
+ int lvl, totlvl;
+ float (*orco)[3];
+ float (*subco)[3];
+ MFace *orfa;
+ int totorfa;
+
+ void (*update)(DerivedMesh*);
+} MultiresDM;
+
+static void MultiresDM_release(DerivedMesh *dm)
+{
+ MultiresDM *mrdm = (MultiresDM*)dm;
+
+ /* Before freeing, need to update the displacement map */
+ if(dm->needsFree)
+ mrdm->update(dm);
+
+ if(DM_release(dm)) {
+ MEM_freeN(mrdm->orfa);
+ MEM_freeN(mrdm->subco);
+ MEM_freeN(mrdm->orco);
+ MEM_freeN(mrdm);
+ }
+}
+
+DerivedMesh *MultiresDM_new(DerivedMesh *orig, int numVerts, int numEdges, int numFaces, int lvl, int totlvl)
+{
+ MultiresDM *mrdm = MEM_callocN(sizeof(MultiresDM), "MultiresDM");
+ CDDerivedMesh *cddm = cdDM_create("MultiresDM CDDM");
+ DerivedMesh *dm = NULL;
+
+ mrdm->cddm = *cddm;
+ MEM_freeN(cddm);
+ dm = &mrdm->cddm.dm;
+
+ if(dm) {
+ MDisps *disps;
+ MVert *mvert;
+ int i;
+
+ DM_from_template(dm, orig, numVerts, numEdges, numFaces);
+ CustomData_free_layers(&dm->faceData, CD_MDISPS, numFaces);
+
+ disps = CustomData_get_layer(&orig->faceData, CD_MDISPS);
+ if(disps)
+ CustomData_add_layer(&dm->faceData, CD_MDISPS, CD_REFERENCE, disps, numFaces);
+
+
+ mvert = CustomData_get_layer(&orig->vertData, CD_MVERT);
+ mrdm->orco = MEM_callocN(sizeof(float) * 3 * orig->getNumVerts(orig), "multires orco");
+ for(i = 0; i < orig->getNumVerts(orig); ++i)
+ VecCopyf(mrdm->orco[i], mvert[i].co);
+ mrdm->orfa = MEM_dupallocN(CustomData_get_layer(&orig->faceData, CD_MFACE));
+ mrdm->totorfa = orig->getNumFaces(orig);
+ }
+ else
+ DM_init(dm, numVerts, numEdges, numFaces);
+
+ CustomData_add_layer(&dm->vertData, CD_MVERT, CD_CALLOC, NULL, numVerts);
+ CustomData_add_layer(&dm->edgeData, CD_MEDGE, CD_CALLOC, NULL, numEdges);
+ CustomData_add_layer(&dm->faceData, CD_MFACE, CD_CALLOC, NULL, numFaces);
+
+ mrdm->cddm.mvert = CustomData_get_layer(&dm->vertData, CD_MVERT);
+ mrdm->cddm.medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
+ mrdm->cddm.mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
+
+ mrdm->lvl = lvl;
+ mrdm->totlvl = totlvl;
+ mrdm->subco = MEM_callocN(sizeof(float)*3*numVerts, "multires subdivided coords");
+
+ dm->release = MultiresDM_release;
+
+ return dm;
+}
+
+void *MultiresDM_get_orco(DerivedMesh *dm)
+{
+ return ((MultiresDM*)dm)->orco;
+
+}
+
+void *MultiresDM_get_subco(DerivedMesh *dm)
+{
+ return ((MultiresDM*)dm)->subco;
+}
+
+MFace *MultiresDM_get_orfa(DerivedMesh *dm)
+{
+ return ((MultiresDM*)dm)->orfa;
+}
+
+int MultiresDM_get_totorfa(struct DerivedMesh *dm)
+{
+ return ((MultiresDM*)dm)->totorfa;
+}
+
+int MultiresDM_get_totlvl(DerivedMesh *dm)
+{
+ return ((MultiresDM*)dm)->totlvl;
+}
+
+int MultiresDM_get_lvl(DerivedMesh *dm)
+{
+ return ((MultiresDM*)dm)->lvl;
+}
+
+void MultiresDM_set_orco(DerivedMesh *dm, float (*orco)[3])
+{
+ ((MultiresDM*)dm)->orco = orco;
+}
+
+void MultiresDM_set_update(DerivedMesh *dm, void (*update)(DerivedMesh*))
+{
+ ((MultiresDM*)dm)->update = update;
+}
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/customdata.c 2008-06-18 21:22:17 UTC (rev 15276)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/customdata.c 2008-06-19 03:13:00 UTC (rev 15277)
@@ -361,7 +361,8 @@
void layerCopy_mdisps(const void *source, void *dest, int count)
{
int i;
- MDisps *s = source, *d = dest;
+ const MDisps *s = source;
+ MDisps *d = dest;
for(i = 0; i < count; ++i) {
if(s[i].disps)
@@ -375,8 +376,9 @@
MDisps *d = data;
for(i = 0; i < count; ++i) {
- if(d->disps)
- MEM_freeN(d->disps);
+ if(d[i].disps)
+ MEM_freeN(d[i].disps);
+ d[i].disps = NULL;
}
}
@@ -492,14 +494,14 @@
const CustomDataMask CD_MASK_MESH =
CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE |
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL |
- CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR;
+ CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS;
const CustomDataMask CD_MASK_EDITMESH =
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
- CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR;
+ CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS;
const CustomDataMask CD_MASK_DERIVEDMESH =
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT |
- CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO;
+ CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_MDISPS;
static const LayerTypeInfo *layerType_getInfo(int type)
{
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c 2008-06-18 21:22:17 UTC (rev 15276)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/modifier.c 2008-06-19 03:13:00 UTC (rev 15277)
@@ -86,6 +86,7 @@
#include "BKE_booleanops.h"
#include "BKE_displist.h"
#include "BKE_modifier.h"
+#include "BKE_multires.h"
#include "BKE_lattice.h"
#include "BKE_library.h"
#include "BKE_subsurf.h"
@@ -7022,7 +7023,13 @@
static DerivedMesh *multiresModifier_applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm,
int useRenderParams, int isFinalCalc)
{
- return dm;
+ MultiresModifierData *mmd = (MultiresModifierData*)md;
+
+ /* TODO: for now just skip a level1 mesh */
+ if(mmd->lvl == 1)
+ return dm;
+
+ return multires_dm_create_from_derived(mmd, dm, useRenderParams, isFinalCalc);
}
/***/
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c 2008-06-18 21:22:17 UTC (rev 15276)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c 2008-06-19 03:13:00 UTC (rev 15277)
@@ -32,6 +32,7 @@
#include "DNA_key_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list