[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15297] branches/soc-2008-nicholasbishop/ source/blender/blenkernel: Displacements over subdivided edges work correctly now ( both for display and updating the highest level.)
Nicholas Bishop
nicholasbishop at gmail.com
Sat Jun 21 20:21:28 CEST 2008
Revision: 15297
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15297
Author: nicholasbishop
Date: 2008-06-21 20:20:32 +0200 (Sat, 21 Jun 2008)
Log Message:
-----------
Displacements over subdivided edges work correctly now (both for display and updating the highest level.)
Modified Paths:
--------------
branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/subsurf_ccg.c
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h 2008-06-21 14:31:38 UTC (rev 15296)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h 2008-06-21 18:20:32 UTC (rev 15297)
@@ -29,7 +29,9 @@
struct CustomData;
struct EditMesh;
+struct MCol;
struct Multires;
+struct MultiresColFace;
struct MultiresLevel;
struct Mesh;
struct Object;
@@ -53,7 +55,7 @@
void multires_delete_layer(struct Mesh *me, struct CustomData *cd, const int type, int n);
void multires_add_layer(struct Mesh *me, struct CustomData *cd, const int type, const int n);
void multires_del_lower_customdata(struct Multires *mr, struct MultiresLevel *cr_lvl);
-void multires_to_mcol(struct MultiresColFace *f, MCol mcol[4]);
+void multires_to_mcol(struct MultiresColFace *f, struct MCol *mcol);
/* After adding or removing vcolor layers, run this */
void multires_load_cols(struct Mesh *me);
@@ -69,24 +71,37 @@
struct DerivedMesh;
struct MFace;
+struct MEdge;
+typedef struct IndexNode {
+ struct IndexNode *next, *prev;
+ int index;
+} IndexNode;
+
+void create_vert_face_map(ListBase **map, IndexNode **mem, const struct MFace *mface,
+ const int totvert, const int totface);
+
/* 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 *);
+struct MEdge *MultiresDM_get_ored(struct DerivedMesh *);
+struct ListBase *MultiresDM_get_vert_face_map(struct DerivedMesh *);
int MultiresDM_get_totlvl(struct DerivedMesh *);
int MultiresDM_get_lvl(struct DerivedMesh *);
int MultiresDM_get_totorfa(struct DerivedMesh *);
+int MultiresDM_get_totored(struct DerivedMesh *);
void MultiresDM_set_update(struct DerivedMesh *, void (*)(struct DerivedMesh*));
/* Modifier */
struct MDisps;
+struct MFace;
struct MultiresModifierData;
typedef struct MultiresDisplacer {
struct MDisps *grid;
+ struct MFace *face;
float mat[3][3];
- int sides;
int spacing;
int sidetot;
int sidendx;
@@ -94,6 +109,7 @@
int invert;
float (*orco)[3];
float (*subco)[3];
+ float weight;
int x, y, ax, ay;
} MultiresDisplacer;
@@ -104,7 +120,9 @@
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);
+ const int face_index, const int invert);
+void multires_displacer_weight(MultiresDisplacer *d, const float w);
void multires_displacer_anchor(MultiresDisplacer *d, const int type, const int side_index);
+void multires_displacer_anchor_edge(MultiresDisplacer *d, const int, const int, const int);
void multires_displacer_jump(MultiresDisplacer *d);
void multires_displace(MultiresDisplacer *d, float out[3]);
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c 2008-06-21 14:31:38 UTC (rev 15296)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c 2008-06-21 18:20:32 UTC (rev 15297)
@@ -42,6 +42,7 @@
#include "BKE_displist.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
+#include "BKE_multires.h"
#include "BKE_utildefines.h"
#include "BLI_arithb.h"
@@ -1148,9 +1149,15 @@
int lvl, totlvl;
float (*orco)[3];
float (*subco)[3];
+ MEdge *ored;
MFace *orfa;
+ int totorco;
+ int totored;
int totorfa;
+ ListBase *vert_face_map;
+ IndexNode *vert_face_map_mem;
+
void (*update)(DerivedMesh*);
} MultiresDM;
@@ -1163,9 +1170,14 @@
mrdm->update(dm);
if(DM_release(dm)) {
+ MEM_freeN(mrdm->ored);
MEM_freeN(mrdm->orfa);
MEM_freeN(mrdm->subco);
MEM_freeN(mrdm->orco);
+ if(mrdm->vert_face_map)
+ MEM_freeN(mrdm->vert_face_map);
+ if(mrdm->vert_face_map_mem)
+ MEM_freeN(mrdm->vert_face_map_mem);
MEM_freeN(mrdm);
}
}
@@ -1197,8 +1209,11 @@
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->totorco = orig->getNumVerts(orig);
mrdm->orfa = MEM_dupallocN(CustomData_get_layer(&orig->faceData, CD_MFACE));
mrdm->totorfa = orig->getNumFaces(orig);
+ mrdm->ored = MEM_dupallocN(CustomData_get_layer(&orig->edgeData, CD_MEDGE));
+ mrdm->totored = orig->getNumEdges(orig);
}
else
DM_init(dm, numVerts, numEdges, numFaces);
@@ -1241,6 +1256,16 @@
return ((MultiresDM*)dm)->totorfa;
}
+MEdge *MultiresDM_get_ored(DerivedMesh *dm)
+{
+ return ((MultiresDM*)dm)->ored;
+}
+
+int MultiresDM_get_totored(struct DerivedMesh *dm)
+{
+ return ((MultiresDM*)dm)->totored;
+}
+
int MultiresDM_get_totlvl(DerivedMesh *dm)
{
return ((MultiresDM*)dm)->totlvl;
@@ -1260,3 +1285,14 @@
{
((MultiresDM*)dm)->update = update;
}
+
+ListBase *MultiresDM_get_vert_face_map(DerivedMesh *dm)
+{
+ MultiresDM *mrdm = (MultiresDM*)dm;
+
+ if(!mrdm->vert_face_map)
+ create_vert_face_map(&mrdm->vert_face_map, &mrdm->vert_face_map_mem, mrdm->orfa,
+ mrdm->totorco, mrdm->totorfa);
+
+ return mrdm->vert_face_map;
+}
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c 2008-06-21 14:31:38 UTC (rev 15296)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c 2008-06-21 18:20:32 UTC (rev 15297)
@@ -1309,6 +1309,24 @@
}
}
+void create_vert_face_map(ListBase **map, IndexNode **mem, const MFace *mface, const int totvert, const int totface)
+{
+ int i,j;
+ IndexNode *node = NULL;
+
+ (*map) = MEM_callocN(sizeof(ListBase) * totvert, "vert face map");
+ (*mem) = MEM_callocN(sizeof(IndexNode) * totface*4, "vert face map mem");
+ node = *mem;
+
+ /* Find the users */
+ for(i = 0; i < totface; ++i){
+ for(j = 0; j < (mface[i].v4?4:3); ++j, ++node) {
+ node->index = i;
+ BLI_addtail(&(*map)[((unsigned int*)(&mface[i]))[j]], node);
+ }
+ }
+}
+
/* MULTIRES MODIFIER */
static const int multires_max_levels = 13;
static const int multires_quad_tot[] = {4, 9, 25, 81, 289, 1089, 4225, 16641, 66049, 263169, 1050625, 4198401, 16785409};
@@ -1414,29 +1432,31 @@
}
void multires_displacer_init(MultiresDisplacer *d, DerivedMesh *dm,
- const int face_index, const int sides, const int invert)
+ const int face_index, const int invert)
{
- MFace *face;
float inv[3][3];
- face = MultiresDM_get_orfa(dm) + face_index;
+ d->face = MultiresDM_get_orfa(dm) + face_index;
/* Get the multires grid from customdata and calculate the TS matrix */
d->grid = (MDisps*)dm->getFaceDataArray(dm, CD_MDISPS);
if(d->grid)
d->grid += face_index;
- d->subco = MultiresDM_get_subco(dm);
- calc_face_ts_mat_dm(d->mat, MultiresDM_get_orco(dm), face);
+ calc_face_ts_mat_dm(d->mat, MultiresDM_get_orco(dm), d->face);
if(invert) {
Mat3Inv(inv, d->mat);
Mat3CpyMat3(d->mat, inv);
}
- d->sides = sides;
d->spacing = pow(2, MultiresDM_get_totlvl(dm) - MultiresDM_get_lvl(dm));
d->sidetot = multires_side_tot[MultiresDM_get_totlvl(dm) - 1];
d->invert = invert;
}
+void multires_displacer_weight(MultiresDisplacer *d, const float w)
+{
+ d->weight = w;
+}
+
void multires_displacer_anchor(MultiresDisplacer *d, const int type, const int side_index)
{
d->sidendx = side_index;
@@ -1476,6 +1496,46 @@
d->ay = d->y;
}
+void multires_displacer_anchor_edge(MultiresDisplacer *d, int v1, int v2, int x)
+{
+ const int mov = d->spacing * x;
+
+ d->type = 4;
+
+ if(v1 == d->face->v1) {
+ d->x = 0;
+ d->y = 0;
+ if(v2 == d->face->v2)
+ d->x += mov;
+ else
+ d->y += mov;
+ }
+ else if(v1 == d->face->v2) {
+ d->x = d->sidetot - 1;
+ d->y = 0;
+ if(v2 == d->face->v1)
+ d->x -= mov;
+ else
+ d->y += mov;
+ }
+ else if(v1 == d->face->v3) {
+ d->x = d->sidetot - 1;
+ d->y = d->sidetot - 1;
+ if(v2 == d->face->v2)
+ d->y -= mov;
+ else
+ d->x -= mov;
+ }
+ else if(v1 == d->face->v4) {
+ d->x = 0;
+ d->y = d->sidetot - 1;
+ if(v2 == d->face->v3)
+ d->x += mov;
+ else
+ d->y -= mov;
+ }
+}
+
void multires_displacer_jump(MultiresDisplacer *d)
{
if(d->sidendx == 0) {
@@ -1505,10 +1565,8 @@
data = d->grid->disps[d->y * d->sidetot + d->x];
- if(d->invert) {
+ if(d->invert)
VecSubf(disp, co, *d->subco);
- ++d->subco;
- }
else
VecCopyf(disp, data);
@@ -1518,8 +1576,11 @@
VecCopyf(data, disp);
}
- else
+ else {
+ if(d->type == 4)
+ VecMulf(disp, d->weight);
VecAddf(co, co, disp);
+ }
if(d->type == 2) {
if(d->sidendx == 0)
@@ -1547,6 +1608,7 @@
{
MDisps *mdisps;
MVert *mvert;
+ MEdge *medge;
MFace *mface;
int i;
@@ -1557,29 +1619,34 @@
if(mdisps) {
MultiresDisplacer d;
- float (*subco)[3] = MultiresDM_get_subco(dm);
+ const int gridFaces = multires_side_tot[MultiresDM_get_totlvl(dm) - 2] - 1;
+ const int edgeSize = multires_side_tot[MultiresDM_get_totlvl(dm) - 1] - 1;
+ ListBase *map = MultiresDM_get_vert_face_map(dm);
+ int S, x, y;
mvert = CDDM_get_verts(dm);
+ medge = MultiresDM_get_ored(dm);
mface = MultiresDM_get_orfa(dm);
+ d.subco = MultiresDM_get_subco(dm);
+
/* For now just handle top-level sculpts */
for(i = 0; i < MultiresDM_get_totorfa(dm); ++i) {
- int gridFaces = multires_side_tot[MultiresDM_get_totlvl(dm) - 2] - 1;
const int numVerts = mface[i].v4 ? 4 : 3;
- int S, x, y;
// convert from mvert->co to disps
- multires_displacer_init(&d, dm, i, numVerts, 1);
- d.subco = subco;
+ multires_displacer_init(&d, dm, i, 1);
multires_displacer_anchor(&d, 1, 0);
multires_displace(&d, mvert->co);
++mvert;
+ ++d.subco;
for(S = 0; S < numVerts; ++S) {
multires_displacer_anchor(&d, 2, S);
for(x = 1; x < gridFaces; ++x) {
multires_displace(&d, mvert->co);
++mvert;
+ ++d.subco;
}
}
@@ -1589,12 +1656,30 @@
for(x = 1; x < gridFaces; x++) {
multires_displace(&d, mvert->co);
++mvert;
+ ++d.subco;
}
multires_displacer_jump(&d);
}
}
+ }
- subco = d.subco;
+ for(i = 0; i < MultiresDM_get_totored(dm); ++i) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list