Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Eagar <joeedh@gmail.com>2009-08-25 14:21:10 +0400
committerJoseph Eagar <joeedh@gmail.com>2009-08-25 14:21:10 +0400
commit0ea787041d2584b74bee66b854728fa9590bd487 (patch)
tree9889d957794ee1616e7d60f28a29ea19eb090869 /source/blender/blenkernel/intern
parent8151a5168422d6b1f974d238f37707f7bc507db7 (diff)
subsurf works now! YES! take *that* subsurf_ccg.cscons/scons.py BF_QUICK=bf_python,bf_blenkernel,bf_blenlib,bf_blenloader,bf_editors_mesh,bf_bmesh,bf_editors_space_view3d,bf_editors_transform,bf_makesdna,bf_makesrna,bf_dna,bf_rn,bf_bmesh,bf_editors_object,editors_uvedit,editors_space_image,editors_screen,editors_space_screen,editors_space_api,bf_windowmanager,bf_wm still an issue with some modifier combinations though, and I think there's some memory corruption going on, need to valgrind it.
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c21
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c7
-rw-r--r--source/blender/blenkernel/intern/modifiers_bmesh.c5
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c62
4 files changed, 44 insertions, 51 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index f1117a967fd..d32da467845 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -310,6 +310,11 @@ void dm_add_polys_from_iter(CustomData *ldata, CustomData *pdata, DerivedMesh *d
for (i=0; i<opdata->totlayer; i++) {
void *e1, *e2;
+ if (opdata->layers[i].type == lasttype)
+ j++;
+ else
+ j = 0;
+
if (opdata->layers[i].type == CD_MPOLY)
continue;
@@ -321,11 +326,6 @@ void dm_add_polys_from_iter(CustomData *ldata, CustomData *pdata, DerivedMesh *d
CustomData_copy_elements(opdata->layers[i].type, e1, e2, 1);
- if (opdata->layers[i].type == lasttype)
- j++;
- else
- j = 0;
-
lasttype = opdata->layers[i].type;
}
@@ -342,6 +342,11 @@ void dm_add_polys_from_iter(CustomData *ldata, CustomData *pdata, DerivedMesh *d
if (oldata->layers[i].type == CD_MLOOP)
continue;
+ if (oldata->layers[i].type == lasttype)
+ j++;
+ else
+ j = 0;
+
e1 = liter->getLoopCDData(liter, oldata->layers[i].type, j);
e2 = CustomData_get_n(ldata, oldata->layers[i].type, l, j);
@@ -349,12 +354,6 @@ void dm_add_polys_from_iter(CustomData *ldata, CustomData *pdata, DerivedMesh *d
continue;
CustomData_copy_elements(oldata->layers[i].type, e1, e2, 1);
-
- if (oldata->layers[i].type == lasttype)
- j++;
- else
- j = 0;
-
lasttype = oldata->layers[i].type;
}
}
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 0f7ebc05558..b137f6d9963 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -1417,6 +1417,7 @@ DerivedMesh *CDDM_copy(DerivedMesh *source)
CustomData_add_layer(&dm->faceData, CD_MFACE, CD_ASSIGN, cddm->mface, numFaces);
DM_DupPolys(source, dm);
+ //CDDM_tessfaces_to_faces(dm);
cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
@@ -1662,6 +1663,10 @@ void CDDM_tessfaces_to_faces(DerivedMesh *dm)
EdgeHash *eh = BLI_edgehash_new();
int i, l, totloop, *index1, *index2;
+ /*ensure we have all the edges we need*/
+ CDDM_calc_edges(dm);
+
+ /*build edge hash*/
me = cddm->medge;
for (i=0; i<cddm->dm.numEdgeData; i++, me++) {
BLI_edgehash_insert(eh, me->v1, me->v2, SET_INT_IN_POINTER(i));
@@ -1687,7 +1692,7 @@ void CDDM_tessfaces_to_faces(DerivedMesh *dm)
CustomData_add_layer(&cddm->dm.loopData, CD_MLOOP, CD_ASSIGN, cddm->mloop, totloop);
CustomData_add_layer(&cddm->dm.polyData, CD_MPOLY, CD_ASSIGN, cddm->mpoly, cddm->dm.numPolyData);
CustomData_merge(&cddm->dm.faceData, &cddm->dm.polyData,
- CD_MASK_DERIVEDMESH, CD_DUPLICATE, cddm->dm.numFaceData);
+ CD_MASK_ORIGINDEX, CD_DUPLICATE, cddm->dm.numFaceData);
index1 = CustomData_get_layer(&cddm->dm.faceData, CD_ORIGINDEX);
index2 = CustomData_get_layer(&cddm->dm.polyData, CD_ORIGINDEX);
diff --git a/source/blender/blenkernel/intern/modifiers_bmesh.c b/source/blender/blenkernel/intern/modifiers_bmesh.c
index 74a6e920d69..f7d2d91bb77 100644
--- a/source/blender/blenkernel/intern/modifiers_bmesh.c
+++ b/source/blender/blenkernel/intern/modifiers_bmesh.c
@@ -198,12 +198,13 @@ BMEditMesh *CDDM_To_BMesh(DerivedMesh *dm, BMEditMesh *existing)
break;
f = BM_Make_Ngon(bm, verts[0], verts[1], edges, dfiter->len, 0);
- f->head.flag = MEFlags_To_BMFlags(dfiter->flags, BM_FACE);
- f->mat_nr = dfiter->mat_nr;
if (!f)
continue;
+ f->head.flag = MEFlags_To_BMFlags(dfiter->flags, BM_FACE);
+ f->mat_nr = dfiter->mat_nr;
+
dliter = dfiter->getLoopsIter(dfiter);
l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, f);
for (j=0; l; l=BMIter_Step(&liter)) {
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 34e517dcf3c..820aa9e1b21 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -540,28 +540,6 @@ static float *get_ss_weights(WeightTable *wtable, int gridCuts, int faceLen)
}
return wtable->weight_table[faceLen].w;
-#if 0
- /*ensure we have at least the triangle and quad weights*/
- if (wtable->len < 4) {
- wtable->weight_table = MEM_callocN(sizeof(FaceVertWeightEntry)*5, "weight table alloc");
- wtable->len = 5;
-
- calc_ss_weights(gridFaces, &wtable->weight_table[4].weight, &wtable->weight_table[3].weight);
- wtable->weight_table[4].valid = wtable->weight_table[3].valid = 1;
- }
-
- if (wtable->len <= faceLen) {
- void *tmp = MEM_callocN(sizeof(FaceVertWeightEntry)*(faceLen+1), "weight table alloc 2");
-
- memcpy(tmp, wtable->weight_table, sizeof(FaceVertWeightEntry)*wtable->len);
- MEM_freeN(wtable->weight_table);
-
- wtable->weight_table = tmp;
- wtable->len = faceLen+1;
- }
-
- return wtable->weight_table[faceLen].weight;
-#endif
}
void free_ss_weights(WeightTable *wtable)
@@ -2631,7 +2609,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CSubSurf *ss,
int gridSideEdges;
int numTex, numCol;
int gridInternalEdges;
- int index2;
float *w = NULL, one = 1.0f;
WeightTable wtable = {0};
V_DECLARE(w);
@@ -2655,9 +2632,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CSubSurf *ss,
numTex = CustomData_number_of_layers(&cgdm->dm.loopData, CD_MLOOPUV);
numCol = CustomData_number_of_layers(&cgdm->dm.loopData, CD_MLOOPCOL);
- if (numTex && CustomData_number_of_layers(&cgdm->dm.faceData, CD_MTFACE)==0)
+ if (numTex && CustomData_number_of_layers(&cgdm->dm.faceData, CD_MTFACE) != numTex)
CustomData_from_bmeshpoly(&cgdm->dm.faceData, &cgdm->dm.polyData, &cgdm->dm.loopData, CCS_getNumFinalFaces(ss));
- else if (numCol && CustomData_number_of_layers(&cgdm->dm.faceData, CD_MCOL)==0)
+ else if (numCol && CustomData_number_of_layers(&cgdm->dm.faceData, CD_MCOL) != numCol)
CustomData_from_bmeshpoly(&cgdm->dm.faceData, &cgdm->dm.polyData, &cgdm->dm.loopData, CCS_getNumFinalFaces(ss));
CustomData_set_layer_flag(&cgdm->dm.faceData, CD_FLAGS, CD_FLAG_NOCOPY);
@@ -2771,7 +2748,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CSubSurf *ss,
mcol = DM_get_tessface_data_layer(&cgdm->dm, CD_MCOL);
- index2 = 0;
+ faceNum = 0;
loopindex = loopindex2 = 0; //current loop index
for (index = 0; index < totface; index++) {
CCFace *f = cgdm->faceMap[index].face;
@@ -2787,10 +2764,12 @@ static CCGDerivedMesh *getCCGDerivedMesh(CSubSurf *ss,
cgdm->faceMap[index].startVert = vertNum;
cgdm->faceMap[index].startEdge = edgeNum;
- cgdm->faceMap[index].startFace = index2;
-
- V_RESET(loopidx);
+ cgdm->faceMap[index].startFace = faceNum;
+ /* set the face base vert */
+ *((int*)CCS_getFaceUserData(ss, f)) = vertNum;
+
+ V_RESET(loopidx);
for (s=0; s<numVerts; s++) {
V_GROW(loopidx);
loopidx[s] = loopindex++;
@@ -2805,7 +2784,8 @@ static CCGDerivedMesh *getCCGDerivedMesh(CSubSurf *ss,
}
- w2 = w + s*numVerts*g2_wid*g2_wid;
+ /*I think this is for interpolating the center vert?*/
+ w2 = w; // + numVerts*(g2_wid-1)*(g2_wid-1); //numVerts*((g2_wid-1)*g2_wid+g2_wid-1);
DM_interp_vert_data(dm, &cgdm->dm, vertidx, w2,
numVerts, vertNum);
if (vertOrigIndex)
@@ -2827,6 +2807,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CSubSurf *ss,
}
}
+ /*interpolate per-vert data*/
for(s = 0; s < numVerts; s++) {
for(y = 1; y < gridFaces; y++) {
for(x = 1; x < gridFaces; x++) {
@@ -2842,8 +2823,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CSubSurf *ss,
}
}
- /* set the face base vert */
- *((int*)CCS_getFaceUserData(ss, f)) = vertNum;
+ for(i = 0; i < numFinalEdges; ++i)
+ *(int *)DM_get_edge_data(&cgdm->dm, edgeNum + i,
+ CD_ORIGINDEX) = ORIGINDEX_NONE;
for (s=0; s<numVerts; s++) {
/*interpolate per-face data*/
for (y=0; y<gridFaces; y++) {
@@ -2867,16 +2849,16 @@ static CCGDerivedMesh *getCCGDerivedMesh(CSubSurf *ss,
CustomData_interp(&dm->loopData, &cgdm->dm.loopData,
loopidx, w2, NULL, numVerts, loopindex2);
loopindex2++;
-
+
/*copy over poly data, e.g. mtexpoly*/
- CustomData_interp(&dm->polyData, &cgdm->dm.polyData, &origIndex, &one, NULL, 1, index2);
+ CustomData_copy_data(&dm->polyData, &cgdm->dm.polyData, origIndex, faceNum, 1);
+ //CustomData_interp(&dm->polyData, &cgdm->dm.polyData, &origIndex, &one, NULL, 1, faceNum);
/*generate tesselated face data used for drawing*/
ccg_loops_to_corners(&cgdm->dm.faceData, &cgdm->dm.loopData,
- &cgdm->dm.polyData, loopindex2-4, index2, index2, numTex, numCol);
+ &cgdm->dm.polyData, loopindex2-4, faceNum, faceNum, numTex, numCol);
faceNum++;
- index2++;
}
}
}
@@ -2944,6 +2926,12 @@ static CCGDerivedMesh *getCCGDerivedMesh(CSubSurf *ss,
++vertOrigIndex;
++vertNum;
}
+
+ cgdm->dm.numVertData = vertNum;
+ cgdm->dm.numEdgeData = edgeNum;
+ cgdm->dm.numFaceData = faceNum;
+ cgdm->dm.numLoopData = loopindex2;
+ cgdm->dm.numPolyData = faceNum;
#if 0
for(index = 0; index < totface; ++index) {
CCFace *f = cgdm->faceMap[index].face;
@@ -3182,7 +3170,7 @@ struct DerivedMesh *subsurf_make_derived_from_derived_with_multires(
return result;
} else {
- int useIncremental = (smd->flags & eSubsurfModifierFlag_Incremental);
+ int useIncremental = 1; //(smd->flags & eSubsurfModifierFlag_Incremental);
int useAging = smd->flags & eSubsurfModifierFlag_DebugIncr;
CSubSurf *ss;