[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17540] branches/soc-2008-nicholasbishop/ source/blender/blenkernel: Better support for triangles with the new tangent calculations.
Nicholas Bishop
nicholasbishop at gmail.com
Sun Nov 23 03:42:37 CET 2008
Revision: 17540
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17540
Author: nicholasbishop
Date: 2008-11-23 03:42:32 +0100 (Sun, 23 Nov 2008)
Log Message:
-----------
Better support for triangles with the new tangent calculations.
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
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h 2008-11-23 00:18:58 UTC (rev 17539)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h 2008-11-23 02:42:32 UTC (rev 17540)
@@ -56,6 +56,7 @@
struct MVert *MultiresDM_get_subco(struct DerivedMesh *);
struct ListBase *MultiresDM_get_vert_face_map(struct DerivedMesh *);
struct ListBase *MultiresDM_get_vert_edge_map(struct DerivedMesh *);
+int *MultiresDM_get_face_offsets(struct DerivedMesh *);
int MultiresDM_get_totlvl(struct DerivedMesh *);
int MultiresDM_get_lvl(struct DerivedMesh *);
void MultiresDM_set_update(struct DerivedMesh *, void (*)(struct DerivedMesh*));
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c 2008-11-23 00:18:58 UTC (rev 17539)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/cdderivedmesh.c 2008-11-23 02:42:32 UTC (rev 17540)
@@ -61,6 +61,7 @@
#include <string.h>
#include <limits.h>
+#include <math.h>
typedef struct {
DerivedMesh dm;
@@ -1160,10 +1161,9 @@
float (*orco)[3];
MVert *subco;
- float (*norm)[3];
-
ListBase *vert_face_map, *vert_edge_map;
IndexNode *vert_face_map_mem, *vert_edge_map_mem;
+ int *face_offsets;
Mesh *me;
int flags;
@@ -1182,7 +1182,6 @@
if(DM_release(dm)) {
MEM_freeN(mrdm->subco);
MEM_freeN(mrdm->orco);
- MEM_freeN(mrdm->norm);
if(mrdm->vert_face_map)
MEM_freeN(mrdm->vert_face_map);
if(mrdm->vert_face_map_mem)
@@ -1191,11 +1190,13 @@
MEM_freeN(mrdm->vert_edge_map);
if(mrdm->vert_edge_map_mem)
MEM_freeN(mrdm->vert_edge_map_mem);
+ if(mrdm->face_offsets)
+ MEM_freeN(mrdm->face_offsets);
MEM_freeN(mrdm);
}
}
-static void MultiresDM_calc_norm(MultiresDM *mrdm)
+/*static void MultiresDM_calc_norm(MultiresDM *mrdm)
{
float (*v)[3] = mrdm->orco;
int i;
@@ -1219,7 +1220,7 @@
for(i = 0; i < mrdm->me->totvert; ++i)
Normalize(mrdm->norm[i]);
-}
+}*/
DerivedMesh *MultiresDM_new(MultiresSubsurf *ms, DerivedMesh *orig, int numVerts, int numEdges, int numFaces)
{
@@ -1278,16 +1279,6 @@
return ((MultiresDM*)dm)->me;
}
-void *MultiresDM_get_vertnorm(DerivedMesh *dm)
-{
- MultiresDM *mrdm = (MultiresDM*)dm;
-
- if(!mrdm->norm)
- MultiresDM_calc_norm(mrdm);
-
- return mrdm->norm;
-}
-
void *MultiresDM_get_orco(DerivedMesh *dm)
{
return ((MultiresDM*)dm)->orco;
@@ -1341,6 +1332,28 @@
return mrdm->vert_edge_map;
}
+int *MultiresDM_get_face_offsets(DerivedMesh *dm)
+{
+ MultiresDM *mrdm = (MultiresDM*)dm;
+ int i, totface, accum = 0;
+
+ if(!mrdm->face_offsets) {
+ int len = (int)pow(2, mrdm->lvl - 2) - 1;
+ int area = len * len;
+ int t = 1 + len * 3 + area * 3, q = t + len + area;
+
+ totface = dm->getNumFaces(dm);
+ mrdm->face_offsets = MEM_callocN(sizeof(int) * totface, "mrdm face offsets");
+ for(i = 0; i < totface; ++i) {
+ mrdm->face_offsets[i] = accum;
+
+ accum += (mrdm->me->mface[i].v4 ? q : t);
+ }
+ }
+
+ return mrdm->face_offsets;
+}
+
int *MultiresDM_get_flags(DerivedMesh *dm)
{
return &((MultiresDM*)dm)->flags;
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c 2008-11-23 00:18:58 UTC (rev 17539)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c 2008-11-23 02:42:32 UTC (rev 17540)
@@ -537,16 +537,26 @@
int dir[4];
} DisplacerEdges;
+typedef struct DisplacerSpill {
+ /* Index of face (in base mesh), -1 for none */
+ int face;
+
+ /* Spill flag */
+ /* 1 = Negative variable axis */
+ /* 2 = Near fixed axis */
+ /* 4 = Flip axes */
+ int f;
+
+ /* Neighboring edges */
+ DisplacerEdges edges;
+} DisplacerSpill;
+
typedef struct MultiresDisplacer {
Mesh *me;
MDisps *grid;
/* To be removed */
MFace *face;
- /* For matrix calc */
- float mat_target[3];
- float mat_center[3];
- float (*mat_norms)[3];
int dm_first_base_vert_index;
int spacing;
@@ -554,7 +564,6 @@
int sidendx;
int type;
int invert;
- float (*orco)[3];
MVert *subco;
int subco_index, face_index;
float weight;
@@ -562,15 +571,14 @@
/* Valence for each corner */
int valence[4];
- /* Indices of neighboring faces (or -1 for no neighbor) */
- int face_spill_x, face_spill_y;
- /* 1 = Negative variable axis */
- /* 2 = Near fixed axis */
- /* 4 = Flip axes */
- int spill_x, spill_y;
- /* Neighboring edges for current face and spill faces */
- DisplacerEdges edges_primary, edges_spill_x, edges_spill_y;
+ /* Neighboring edges for current face */
+ DisplacerEdges edges_primary;
+ /* Neighboring faces */
+ DisplacerSpill spill_x, spill_y;
+
+ int *face_offsets;
+
int x, y, ax, ay;
} MultiresDisplacer;
@@ -585,6 +593,7 @@
ListBase *emap = MultiresDM_get_vert_edge_map(dm);
IndexNode *n;
int i, end = f->v4 ? 4 : 3;
+ int offset = dm->getNumVerts(dm) - d->me->totvert - d->me->totedge * d->interior_st;
for(i = 0; i < end; ++i) {
int vcur = mface_v(f, i);
@@ -602,7 +611,7 @@
de->dir[i] = -1;
de->base[i] += d->interior_st - 1;
}
- de->base[i] += d->me->totface * d->interior_st * d->interior_st;
+ de->base[i] += offset;
break;
}
}
@@ -628,9 +637,11 @@
ListBase *map = MultiresDM_get_vert_face_map(dm);
IndexNode *n1, *n2;
int v4 = d->face->v4 ? d->face->v4 : d->face->v1;
- int crn[2];
+ int crn[2], lv;
- d->face_spill_x = d->face_spill_y = -1;
+ memset(&d->spill_x, 0, sizeof(DisplacerSpill));
+ memset(&d->spill_y, 0, sizeof(DisplacerSpill));
+ d->spill_x.face = d->spill_y.face = -1;
for(n1 = map[d->face->v3].first; n1; n1 = n1->next) {
if(n1->index == d->face_index)
@@ -638,60 +649,62 @@
for(n2 = map[d->face->v2].first; n2; n2 = n2->next) {
if(n1->index == n2->index)
- d->face_spill_x = n1->index;
+ d->spill_x.face = n1->index;
}
for(n2 = map[v4].first; n2; n2 = n2->next) {
if(n1->index == n2->index)
- d->face_spill_y = n1->index;
+ d->spill_y.face = n1->index;
}
}
- if(d->face_spill_x != -1) {
+ if(d->spill_x.face != -1) {
/* Neighbor of v2/v3 found, find flip and orientation */
- find_face_corners(&mface[d->face_spill_x], d->face->v2, d->face->v3, crn);
+ find_face_corners(&mface[d->spill_x.face], d->face->v2, d->face->v3, crn);
+ lv = mface[d->spill_x.face].v4 ? 3 : 2;
- if(crn[0] == 0 && crn[1] == 3)
- d->spill_x = 0+2+0;
- else if(crn[0] == 3 && crn[1] == 0)
- d->spill_x = 1+2+0;
+ if(crn[0] == 0 && crn[1] == lv)
+ d->spill_x.f = 0+2+0;
+ else if(crn[0] == lv && crn[1] == 0)
+ d->spill_x.f = 1+2+0;
else if(crn[0] == 1 && crn[1] == 0)
- d->spill_x = 1+2+4;
+ d->spill_x.f = 1+2+4;
else if(crn[0] == 0 && crn[1] == 1)
- d->spill_x = 0+2+4;
+ d->spill_x.f = 0+2+4;
else if(crn[0] == 2 && crn[1] == 1)
- d->spill_x = 1+0+0;
+ d->spill_x.f = 1+0+0;
else if(crn[0] == 1 && crn[1] == 2)
- d->spill_x = 0+0+0;
+ d->spill_x.f = 0+0+0;
else if(crn[0] == 3 && crn[1] == 2)
- d->spill_x = 0+0+4;
+ d->spill_x.f = 0+0+4;
else if(crn[0] == 2 && crn[1] == 3)
- d->spill_x = 1+0+4;
+ d->spill_x.f = 1+0+4;
- find_displacer_edges(d, dm, &d->edges_spill_x, &mface[d->face_spill_x]);
+ find_displacer_edges(d, dm, &d->spill_x.edges, &mface[d->spill_x.face]);
}
- if(d->face_spill_y != -1) {
+ if(d->spill_y.face != -1) {
/* Neighbor of v3/v4 found, find flip and orientation */
- find_face_corners(&mface[d->face_spill_y], d->face->v3, v4, crn);
+ find_face_corners(&mface[d->spill_y.face], d->face->v3, v4, crn);
+ lv = mface[d->spill_y.face].v4 ? 3 : 2;
if(crn[0] == 1 && crn[1] == 0)
- d->spill_y = 1+2+0;
+ d->spill_y.f = 1+2+0;
else if(crn[0] == 0 && crn[1] == 1)
- d->spill_y = 0+2+0;
+ d->spill_y.f = 0+2+0;
else if(crn[0] == 2 && crn[1] == 1)
- d->spill_y = 1+0+4;
+ d->spill_y.f = 1+0+4;
else if(crn[0] == 1 && crn[1] == 2)
- d->spill_y = 0+0+4;
+ d->spill_y.f = 0+0+4;
else if(crn[0] == 3 && crn[1] == 2)
- d->spill_y = 0+0+0;
+ d->spill_y.f = 0+0+0;
else if(crn[0] == 2 && crn[1] == 3)
- d->spill_y = 1+0+0;
- else if(crn[0] == 0 && crn[1] == 3)
- d->spill_y = 0+2+4;
- else if(crn[0] == 3 && crn[1] == 0)
- d->spill_y = 1+2+4;
+ d->spill_y.f = 1+0+0;
+ else if(crn[0] == 0 && crn[1] == lv)
+ d->spill_y.f = 0+2+4;
+ else if(crn[0] == lv && crn[1] == 0)
+ d->spill_y.f = 1+2+4;
- find_displacer_edges(d, dm, &d->edges_spill_y, &mface[d->face_spill_y]);
+ find_displacer_edges(d, dm, &d->spill_y.edges, &mface[d->spill_y.face]);
}
}
@@ -699,9 +712,11 @@
{
int i;
+ d->valence[3] = -1;
+
/* Set the vertex valence for the corners */
for(i = 0; i < (d->face->v4 ? 4 : 3); ++i)
- d->valence[i] = BLI_countlist(&MultiresDM_get_vert_edge_map(dm)[((unsigned*)(&d->face->v1))[i]]);
+ d->valence[i] = BLI_countlist(&MultiresDM_get_vert_edge_map(dm)[mface_v(d->face, i)]);
}
static void multires_displacer_init(MultiresDisplacer *d, DerivedMesh *dm,
@@ -712,13 +727,12 @@
d->me = me;
d->face = me->mface + face_index;
d->face_index = face_index;
+ d->face_offsets = MultiresDM_get_face_offsets(dm);
/* Get the multires grid from customdata */
d->grid = CustomData_get_layer(&me->fdata, CD_MDISPS);
if(d->grid)
d->grid += face_index;
- d->mat_norms = MultiresDM_get_vertnorm(dm);
-
d->spacing = pow(2, MultiresDM_get_totlvl(dm) - MultiresDM_get_lvl(dm));
d->sidetot = multires_side_tot[MultiresDM_get_lvl(dm) - 1];
d->interior_st = d->sidetot - 2;
@@ -778,41 +792,55 @@
static void multires_displacer_anchor_edge(MultiresDisplacer *d, int v1, int v2, int x)
{
- const int mov = x;
-
d->type = 4;
if(v1 == d->face->v1) {
d->x = 0;
d->y = 0;
if(v2 == d->face->v2)
- d->x += mov;
+ d->x += x;
+ else if(v2 == d->face->v3) {
+ if(x < d->sidetot / 2)
+ d->y = x;
+ else {
+ d->x = x;
+ d->y = d->sidetot - 1;
+ }
+ }
else
- d->y += mov;
+ d->y += x;
}
else if(v1 == d->face->v2) {
d->x = d->sidetot - 1;
d->y = 0;
if(v2 == d->face->v1)
- d->x -= mov;
+ d->x -= x;
else
- d->y += mov;
+ d->y += x;
}
else if(v1 == d->face->v3) {
d->x = d->sidetot - 1;
d->y = d->sidetot - 1;
if(v2 == d->face->v2)
- d->y -= mov;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list