[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35761] branches/bmesh/blender: =bmesh=
Joseph Eagar
joeedh at gmail.com
Fri Mar 25 01:32:38 CET 2011
Revision: 35761
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35761
Author: joeedh
Date: 2011-03-25 00:32:38 +0000 (Fri, 25 Mar 2011)
Log Message:
-----------
=bmesh=
Coded a new modifier, "Precision UV Interpolation",
that triangulates, subdivides, then uses brecht's mean
value interpolation to interpolate face data.
Textures on ngon faces get interpolated a bit nicer, in
other words (though concave cases, e.g. 'N', don't work very well).
Modified Paths:
--------------
branches/bmesh/blender/release/scripts/ui/properties_data_modifier.py
branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h
branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c
branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
branches/bmesh/blender/source/blender/editors/mesh/editbmesh_add.c
branches/bmesh/blender/source/blender/editors/sculpt_paint/paint_image.c
branches/bmesh/blender/source/blender/editors/transform/transform_conversions.c
branches/bmesh/blender/source/blender/makesdna/DNA_modifier_types.h
branches/bmesh/blender/source/blender/makesrna/intern/rna_modifier.c
branches/bmesh/blender/source/blender/modifiers/CMakeLists.txt
branches/bmesh/blender/source/blender/modifiers/MOD_modifiertypes.h
branches/bmesh/blender/source/blender/modifiers/intern/MOD_mirror.c
branches/bmesh/blender/source/blender/modifiers/intern/MOD_util.c
Added Paths:
-----------
branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c
Modified: branches/bmesh/blender/release/scripts/ui/properties_data_modifier.py
===================================================================
--- branches/bmesh/blender/release/scripts/ui/properties_data_modifier.py 2011-03-25 00:23:02 UTC (rev 35760)
+++ branches/bmesh/blender/release/scripts/ui/properties_data_modifier.py 2011-03-25 00:32:38 UTC (rev 35761)
@@ -69,7 +69,13 @@
col = layout.column()
col.prop(md, "use_multi_modifier")
-
+
+ def NGONINTERP(self, layout, ob, md):
+ split = layout.split()
+
+ col = split.column()
+ col.prop(md, "resolution", text="Res")
+
def ARRAY(self, layout, ob, md):
layout.prop(md, "fit_type")
Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h 2011-03-25 00:23:02 UTC (rev 35760)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h 2011-03-25 00:32:38 UTC (rev 35761)
@@ -116,8 +116,11 @@
faces*/
void CDDM_calc_edges_poly(struct DerivedMesh *dm);
-/*reconstitute face triangulation*/
-void CDDM_recalc_tesselation(struct DerivedMesh *dm);
+/*reconstitute face triangulation. if orig_use_polyorig is nonzero, sets
+ the mface origindex layer to copy to the origindex values of the
+ parent mpolys; otherwise the mface origindex will point to the index of
+ the parent mpoly*/
+void CDDM_recalc_tesselation(struct DerivedMesh *dm, int orig_use_polyorig);
/* lowers the number of vertices/edges/faces in a CDDerivedMesh
* the layer data stays the same size
Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h 2011-03-25 00:23:02 UTC (rev 35760)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h 2011-03-25 00:32:38 UTC (rev 35761)
@@ -198,6 +198,11 @@
void BKE_mesh_calc_edges(struct Mesh *mesh, int update);
+/*convert a triangle of loop facedata to mface facedata*/
+void mesh_loops_to_tri_corners(struct CustomData *fdata, struct CustomData *ldata,
+ struct CustomData *pdata, int lindex[3], int findex,
+ int polyindex);
+
#ifdef __cplusplus
}
#endif
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2011-03-25 00:23:02 UTC (rev 35760)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2011-03-25 00:32:38 UTC (rev 35761)
@@ -1465,11 +1465,6 @@
cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
}
-void CDDM_recalc_tesselation(DerivedMesh *dm)
-{
- cdDM_recalcTesselation(dm);
-}
-
/*ignores original poly origindex layer*/
static void cdDM_recalcTesselation2(DerivedMesh *dm)
{
@@ -1482,6 +1477,14 @@
cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
}
+void CDDM_recalc_tesselation(DerivedMesh *dm, int orig_use_polyorig)
+{
+ if (orig_use_polyorig)
+ cdDM_recalcTesselation(dm);
+ else
+ cdDM_recalcTesselation2(dm);
+}
+
static void cdDM_free_internal(CDDerivedMesh *cddm)
{
if(cddm->fmap) MEM_freeN(cddm->fmap);
@@ -2458,7 +2461,7 @@
memcpy(cddm2->mpoly, mpoly, sizeof(MPoly)*BLI_array_count(mpoly));
BLI_array_free(mvert); BLI_array_free(medge); BLI_array_free(mloop); BLI_array_free(mpoly);
- CDDM_recalc_tesselation(cddm2);
+ CDDM_recalc_tesselation(cddm2, 1);
if (newv)
MEM_freeN(newv);
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c 2011-03-25 00:23:02 UTC (rev 35760)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c 2011-03-25 00:32:38 UTC (rev 35761)
@@ -1890,9 +1890,9 @@
}
}
-static void mesh_loops_to_corners(CustomData *fdata, CustomData *ldata,
- CustomData *pdata, int lindex[4], int findex,
- int polyindex, int numTex, int numCol, int tot)
+void mesh_loops_to_tri_corners(CustomData *fdata, CustomData *ldata,
+ CustomData *pdata, int lindex[3], int findex,
+ int polyindex)
{
MTFace *texface;
MTexPoly *texpoly;
@@ -1900,7 +1900,9 @@
MLoopCol *mloopcol;
MLoopUV *mloopuv;
int i, j, hasWCol = CustomData_has_layer(ldata, CD_WEIGHT_MLOOPCOL);
-
+ int numTex = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
+ int numCol = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
+
for(i=0; i < numTex; i++){
texface = CustomData_get_n(fdata, CD_MTFACE, findex, i);
texpoly = CustomData_get_n(pdata, CD_MTEXPOLY, polyindex, i);
@@ -1912,7 +1914,7 @@
texface->tile = texpoly->tile;
texface->unwrap = texpoly->unwrap;
- for (j=0; j<tot; j++) {
+ for (j=0; j<3; j++) {
mloopuv = CustomData_get_n(ldata, CD_MLOOPUV, lindex[j], i);
texface->uv[j][0] = mloopuv->uv[0];
texface->uv[j][1] = mloopuv->uv[1];
@@ -1922,7 +1924,7 @@
for(i=0; i < numCol; i++){
mcol = CustomData_get_n(fdata, CD_MCOL, findex, i);
- for (j=0; j<tot; j++) {
+ for (j=0; j<3; j++) {
mloopcol = CustomData_get_n(ldata, CD_MLOOPCOL, lindex[j], i);
mcol[j].r = mloopcol->r;
mcol[j].g = mloopcol->g;
@@ -1934,7 +1936,7 @@
if (hasWCol) {
mcol = CustomData_get(fdata, findex, CD_WEIGHT_MCOL);
- for (j=0; j<tot; j++) {
+ for (j=0; j<3; j++) {
mloopcol = CustomData_get(ldata, lindex[j], CD_WEIGHT_MLOOPCOL);
mcol[j].r = mloopcol->r;
mcol[j].g = mloopcol->g;
@@ -2059,8 +2061,8 @@
mf->v2 = mloop[mf->v2].v;
mf->v3 = mloop[mf->v3].v;
- mesh_loops_to_corners(fdata, ldata, pdata,
- lindex, i, mf->v4, numTex, numCol, 3);
+ mesh_loops_to_tri_corners(fdata, ldata, pdata,
+ lindex, i, mf->v4);
mf->v4 = 0;
}
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c 2011-03-25 00:23:02 UTC (rev 35760)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c 2011-03-25 00:32:38 UTC (rev 35761)
@@ -517,383 +517,6 @@
CDDM_calc_normals(result);
return result;
-#if 0
- DerivedMesh *result;
- int edgeSize = ccgSubSurf_getEdgeSize(ss);
- int gridSize = ccgSubSurf_getGridSize(ss);
- int gridFaces = gridSize - 1;
- int edgeBase, faceBase;
- int i, j, k, S, x, y, index;
- int *vertIdx = NULL;
- BLI_array_declare(vertIdx);
- CCGVertIterator *vi;
- CCGEdgeIterator *ei;
- CCGFaceIterator *fi;
- CCGFace **faceMap2;
- CCGEdge **edgeMap2;
- CCGVert **vertMap2;
- int totvert, totedge, totface;
- MVert *mvert;
- MEdge *med;
- float *w = NULL;
- WeightTable wtable;
- BLI_array_declare(w);
- MFace *mf;
- int *origIndex;
-
- memset(&wtable, 0, sizeof(wtable));
-
- /* vert map */
- totvert = ccgSubSurf_getNumVerts(ss);
- vertMap2 = MEM_mallocN(totvert*sizeof(*vertMap2), "vertmap");
- vi = ccgSubSurf_getVertIterator(ss);
- for(; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
- CCGVert *v = ccgVertIterator_getCurrent(vi);
-
- vertMap2[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v))] = v;
- }
- ccgVertIterator_free(vi);
-
- totedge = ccgSubSurf_getNumEdges(ss);
- edgeMap2 = MEM_mallocN(totedge*sizeof(*edgeMap2), "edgemap");
- ei = ccgSubSurf_getEdgeIterator(ss);
- for(; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
- CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
-
- edgeMap2[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e))] = e;
- }
-
- totface = ccgSubSurf_getNumFaces(ss);
- faceMap2 = MEM_mallocN(totface*sizeof(*faceMap2), "facemap");
- fi = ccgSubSurf_getFaceIterator(ss);
- for(; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
- CCGFace *f = ccgFaceIterator_getCurrent(fi);
-
- faceMap2[GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f))] = f;
- }
- ccgFaceIterator_free(fi);
-
- if(ms) {
- result = MultiresDM_new(ms, dm, ccgSubSurf_getNumFinalVerts(ss),
- ccgSubSurf_getNumFinalEdges(ss),
- ccgSubSurf_getNumFinalFaces(ss), 0, 0);
- }
- else {
- if(dm) {
- result = CDDM_from_template(dm, ccgSubSurf_getNumFinalVerts(ss),
- ccgSubSurf_getNumFinalEdges(ss),
- ccgSubSurf_getNumFinalFaces(ss), 0, 0);
- } else {
- result = CDDM_new(ccgSubSurf_getNumFinalVerts(ss),
- ccgSubSurf_getNumFinalEdges(ss),
- ccgSubSurf_getNumFinalFaces(ss), 0, 0);
- }
- }
-
- // load verts
- faceBase = i = 0;
- mvert = CDDM_get_verts(result);
- origIndex = result->getVertData(result, 0, CD_ORIGINDEX);
-
- for(index = 0; index < totface; index++) {
- CCGFace *f = faceMap2[index];
- int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f);
- FaceVertWeight *weight = 0;//get_ss_weights(&wtable, gridFaces-1, numVerts);
-
- BLI_array_empty(vertIdx);
-
- for(S = 0; S < numVerts; S++) {
- CCGVert *v = ccgSubSurf_getFaceVert(ss, f, S);
- BLI_array_growone(vertIdx);
-
- vertIdx[S] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
- }
-
-#if 0
- DM_interp_vert_data(dm, result, vertIdx, weight[0][0], numVerts, i);
-#endif
- copy_v3_v3(mvert->co, ccgSubSurf_getFaceCenterData(f));
- *origIndex = ORIGINDEX_NONE;
- ++mvert;
- ++origIndex;
- i++;
-
- BLI_array_empty(w);
- for (x=0; x<numVerts; x++) {
- BLI_array_growone(w);
- }
-
- for(S = 0; S < numVerts; S++) {
- int prevS = (S - 1 + numVerts) % numVerts;
- int nextS = (S + 1) % numVerts;
- int otherS = (numVerts >= 4) ? (S + 2) % numVerts : 3;
-
- for(x = 1; x < gridFaces; x++) {
-#if 0
- w[prevS] = weight[x][0][0];
- w[S] = weight[x][0][1];
- w[nextS] = weight[x][0][2];
- w[otherS] = weight[x][0][3];
-
- DM_interp_vert_data(dm, result, vertIdx, w, numVerts, i);
-#endif
- copy_v3_v3(mvert->co,
- ccgSubSurf_getFaceGridEdgeData(ss, f, S, x));
-
- *origIndex = ORIGINDEX_NONE;
- ++mvert;
- ++origIndex;
- i++;
- }
- }
-
- BLI_array_empty(w);
- for (x=0; x<numVerts; x++) {
- BLI_array_growone(w);
- }
-
- for(S = 0; S < numVerts; S++) {
- int prevS = (S - 1 + numVerts) % numVerts;
- int nextS = (S + 1) % numVerts;
- int otherS = (numVerts == 4) ? (S + 2) % numVerts : 3;
-
- for(y = 1; y < gridFaces; y++) {
- for(x = 1; x < gridFaces; x++) {
-#if 0
- w[prevS] = weight[y * gridFaces + x][0][0];
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list