diff options
author | Daniel Dunbar <daniel@zuster.org> | 2005-08-20 13:16:09 +0400 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2005-08-20 13:16:09 +0400 |
commit | 752dbf1e9adea57820c4d7435215a211b9266710 (patch) | |
tree | 8ddb56a66beac9008e4e4a4cac7a9262dba4be2e | |
parent | 1ac10f50f483c2c365fa015c8c045c8f7344ad02 (diff) |
- made make_edge mark edges with LOOSEEDGE appropriately
- added user settable defaultEdgeData (for auto edge creation
in CCGSubSurf)
- bug fix, possible crash on meshes with loose edges but
in mface not in medge
- missed file in last commit, for proper updating in image
window
-rw-r--r-- | source/blender/blenkernel/intern/CCGSubSurf.c | 26 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/CCGSubSurf.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 19 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 15 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 2 |
5 files changed, 48 insertions, 18 deletions
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c index 75099157fd7..dc6543858c1 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf.c +++ b/source/blender/blenkernel/intern/CCGSubSurf.c @@ -297,6 +297,7 @@ struct _CCGSubSurf { int numGrids; int allowEdgeCreation; float defaultCreaseValue; + void *defaultEdgeUserData; void *q, *r; @@ -637,6 +638,7 @@ CCGSubSurf *ccgSubSurf_new(CCGMeshIFC *ifc, int subdivLevels, CCGAllocatorIFC *a ss->numGrids = 0; ss->allowEdgeCreation = 0; ss->defaultCreaseValue = 0; + ss->defaultEdgeUserData = NULL; ss->useAgeCounts = 0; ss->vertUserAgeOffset = ss->edgeUserAgeOffset = ss->faceUserAgeOffset = 0; @@ -675,6 +677,7 @@ void ccgSubSurf_free(CCGSubSurf *ss) { CCGSUBSURF_free(ss, ss->r); CCGSUBSURF_free(ss, ss->q); + if (ss->defaultEdgeUserData) CCGSUBSURF_free(ss, ss->defaultEdgeUserData); _ehash_free(ss->fMap, (EHEntryFreeFP) _face_free, ss); _ehash_free(ss->eMap, (EHEntryFreeFP) _edge_free, ss); @@ -687,15 +690,29 @@ void ccgSubSurf_free(CCGSubSurf *ss) { } } -CCGError ccgSubSurf_setAllowEdgeCreation(CCGSubSurf *ss, int allowEdgeCreation, float defaultCreaseValue) { +CCGError ccgSubSurf_setAllowEdgeCreation(CCGSubSurf *ss, int allowEdgeCreation, float defaultCreaseValue, void *defaultUserData) { + if (ss->defaultEdgeUserData) { + CCGSUBSURF_free(ss, ss->defaultEdgeUserData); + } + ss->allowEdgeCreation = !!allowEdgeCreation; ss->defaultCreaseValue = defaultCreaseValue; + ss->defaultEdgeUserData = CCGSUBSURF_alloc(ss, ss->meshIFC.edgeUserSize); + + if (defaultUserData) { + memcpy(ss->defaultEdgeUserData, defaultUserData, ss->meshIFC.edgeUserSize); + } else { + memset(ss->defaultEdgeUserData, 0, ss->meshIFC.edgeUserSize); + } return eCCGError_None; } -void ccgSubSurf_getAllowEdgeCreation(CCGSubSurf *ss, int *allowEdgeCreation_r, float *defaultCreaseValue_r) { +void ccgSubSurf_getAllowEdgeCreation(CCGSubSurf *ss, int *allowEdgeCreation_r, float *defaultCreaseValue_r, void *defaultUserData_r) { if (allowEdgeCreation_r) *allowEdgeCreation_r = ss->allowEdgeCreation; - if (defaultCreaseValue_r) *defaultCreaseValue_r = ss->defaultCreaseValue; + if (ss->allowEdgeCreation) { + if (defaultCreaseValue_r) *defaultCreaseValue_r = ss->defaultCreaseValue; + if (defaultUserData_r) memcpy(defaultUserData_r, ss->defaultEdgeUserData, ss->meshIFC.edgeUserSize); + } } CCGError ccgSubSurf_setSubdivisionLevels(CCGSubSurf *ss, int subdivisionLevels) { @@ -1035,6 +1052,9 @@ CCGError ccgSubSurf_syncFace(CCGSubSurf *ss, CCGFaceHDL fHDL, int numVerts, CCGV _ehash_insert(ss->eMap, (EHEntry*) e); e->v0->flags |= Vert_eEffected; e->v1->flags |= Vert_eEffected; + if (ss->meshIFC.edgeUserSize) { + memcpy(ccgSubSurf_getEdgeUserData(ss, e), ss->defaultEdgeUserData, ss->meshIFC.edgeUserSize); + } } else { return eCCGError_InvalidValue; } diff --git a/source/blender/blenkernel/intern/CCGSubSurf.h b/source/blender/blenkernel/intern/CCGSubSurf.h index f6469866d32..9f276989bc5 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf.h +++ b/source/blender/blenkernel/intern/CCGSubSurf.h @@ -61,8 +61,8 @@ CCGError ccgSubSurf_processSync (CCGSubSurf *ss); CCGError ccgSubSurf_setSubdivisionLevels (CCGSubSurf *ss, int subdivisionLevels); -CCGError ccgSubSurf_setAllowEdgeCreation (CCGSubSurf *ss, int allowEdgeCreation, float defaultCreaseValue); -void ccgSubSurf_getAllowEdgeCreation (CCGSubSurf *ss, int *allowEdgeCreation_r, float *defaultCreaseValue_r); +CCGError ccgSubSurf_setAllowEdgeCreation (CCGSubSurf *ss, int allowEdgeCreation, float defaultCreaseValue, void *defaultUserData); +void ccgSubSurf_getAllowEdgeCreation (CCGSubSurf *ss, int *allowEdgeCreation_r, float *defaultCreaseValue_r, void *defaultUserData_r); void ccgSubSurf_getUseAgeCounts (CCGSubSurf *ss, int *useAgeCounts_r, int *vertUserOffset_r, int *edgeUserOffset_r, int *faceUserOffset_r); CCGError ccgSubSurf_setUseAgeCounts (CCGSubSurf *ss, int useAgeCounts, int vertUserOffset, int edgeUserOffset, int faceUserOffset); diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index e1c1f337bb6..b91b2356cc3 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -597,10 +597,11 @@ void set_mesh(Object *ob, Mesh *me) struct edgesort { int v1, v2; int flag; + int is_loose; }; /* edges have to be added with lowest index first for sorting */ -static void to_edgesort(struct edgesort *ed, int v1, int v2, int flag) +static void to_edgesort(struct edgesort *ed, int v1, int v2, int flag, int is_loose) { if(v1<v2) { ed->v1= v1; ed->v2= v2; @@ -609,6 +610,7 @@ static void to_edgesort(struct edgesort *ed, int v1, int v2, int flag) ed->v1= v2; ed->v2= v1; } ed->flag= flag; + ed->is_loose= is_loose; } static int vergedgesort(const void *v1, const void *v2) @@ -649,21 +651,20 @@ void make_edges(Mesh *me) ed= edsort= MEM_mallocN(totedge*sizeof(struct edgesort), "edgesort"); for(a= me->totface, mface= me->mface; a>0; a--, mface++) { - - to_edgesort(ed, mface->v1, mface->v2, mface->edcode & ME_V1V2); + to_edgesort(ed, mface->v1, mface->v2, mface->edcode & ME_V1V2, !mface->v3); ed++; if(mface->v4) { - to_edgesort(ed, mface->v2, mface->v3, mface->edcode & ME_V2V3); + to_edgesort(ed, mface->v2, mface->v3, mface->edcode & ME_V2V3, 0); ed++; - to_edgesort(ed, mface->v3, mface->v4, mface->edcode & ME_V3V4); + to_edgesort(ed, mface->v3, mface->v4, mface->edcode & ME_V3V4, 0); ed++; - to_edgesort(ed, mface->v4, mface->v1, mface->edcode & ME_V4V1); + to_edgesort(ed, mface->v4, mface->v1, mface->edcode & ME_V4V1, 0); ed++; } else if(mface->v3) { - to_edgesort(ed, mface->v2, mface->v3, mface->edcode & ME_V2V3); + to_edgesort(ed, mface->v2, mface->v3, mface->edcode & ME_V2V3, 0); ed++; - to_edgesort(ed, mface->v3, mface->v1, mface->edcode & ME_V3V1); + to_edgesort(ed, mface->v3, mface->v1, mface->edcode & ME_V3V1, 0); ed++; } } @@ -691,6 +692,7 @@ void make_edges(Mesh *me) medge->v1= ed->v1; medge->v2= ed->v2; if(ed->flag) medge->flag= ME_EDGEDRAW; + if(ed->is_loose) medge->flag|= ME_LOOSEEDGE; medge->flag |= ME_EDGERENDER; medge++; } @@ -699,6 +701,7 @@ void make_edges(Mesh *me) medge->v1= ed->v1; medge->v2= ed->v2; if(ed->flag) medge->flag= ME_EDGEDRAW; + if(ed->is_loose) medge->flag|= ME_LOOSEEDGE; medge->flag |= ME_EDGERENDER; MEM_freeN(edsort); diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index f324a046c5f..dab0ddd5d8b 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -137,7 +137,9 @@ static CCGSubSurf *_getSubSurf(CCGSubSurf *prevSS, int subdivLevels, int useAgin ccgSubSurf_setUseAgeCounts(ccgSS, 1, 8, 8, 8); } if (useEdgeCreation) { - ccgSubSurf_setAllowEdgeCreation(ccgSS, 1, useFlatSubdiv?subdivLevels:0.0f); + int defaultUserData[3] = {0, -1, 0}; + + ccgSubSurf_setAllowEdgeCreation(ccgSS, 1, useFlatSubdiv?subdivLevels:0.0f, defaultUserData); } ccgSubSurf_setCalcVertexNormals(ccgSS, 1, BLI_STRUCT_OFFSET(VertData, no)); @@ -218,7 +220,7 @@ static unsigned int ss_getEdgeFlags(CCGSubSurf *ss, CCGEdge *e, int ssFromEditme if (!medge) { makeFlags = 1; } - } else { + } else if (medge) { // can happen for loose edges on mesh with no medge MEdge *origMed = &medge[edgeIdx]; if (dlm) { @@ -227,6 +229,8 @@ static unsigned int ss_getEdgeFlags(CCGSubSurf *ss, CCGEdge *e, int ssFromEditme flags |= (origMed->flag&ME_SEAM); makeFlags = 1; } + } else { + makeFlags = 1; } if (makeFlags) { @@ -281,7 +285,7 @@ static DispListMesh *ss_to_displistmesh(CCGSubSurf *ss, CCGDerivedMesh *ccgdm, i CCGVert **vertMap2; int totvert, totedge, totface, useEdgeCreation; - ccgSubSurf_getAllowEdgeCreation(ss, &useEdgeCreation, NULL); + ccgSubSurf_getAllowEdgeCreation(ss, &useEdgeCreation, NULL, NULL); totvert = ccgSubSurf_getNumVerts(ss); vertMap2 = MEM_mallocN(totvert*sizeof(*vertMap2), "vertmap"); @@ -652,10 +656,13 @@ static void ss_sync_from_mesh(CCGSubSurf *ss, Mesh *me, DispListMesh *dlm, float } } else { for (i=0; i<totface; i++) { + CCGEdge *e; MFace *mf = &((MFace*) mface)[i]; if (!mf->v3) { - ccgSubSurf_syncEdge(ss, (CCGEdgeHDL) i, (CCGVertHDL) mf->v1, (CCGVertHDL) mf->v2, useFlatSubdiv?creaseFactor:0.0f, NULL); + ccgSubSurf_syncEdge(ss, (CCGEdgeHDL) i, (CCGVertHDL) mf->v1, (CCGVertHDL) mf->v2, useFlatSubdiv?creaseFactor:0.0f, &e); + + ((int*) ccgSubSurf_getEdgeUserData(ss, e))[1] = -1; } } } diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index 7e72f6f737f..90898e96f25 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -1790,7 +1790,7 @@ static void draw_mesh_fancy(Object *ob, DerivedMesh *baseDM, DerivedMesh *dm, in if (G.f & (G_VERTEXPAINT|G_WEIGHTPAINT|G_TEXTUREPAINT)) { baseDM->drawEdges(baseDM, dt==OB_WIRE); } else { - dm->drawEdges(dm, dt==OB_WIRE); + dm->drawEdges(dm, (dt==OB_WIRE || me->totface==0)); } if (dt!=OB_WIRE) { |