- Initial integration of CCGSubSurf library into blender. The lib is

only in one C file and not worth dropping in extern but presumably
   will be synced with public CCGSubSurf release I hope to be making
   soon.
 - Currently the implementation must be enabled by defining
   USE_CCGSUBSURFLIB somewhere with your build system. The code should
   be considered highly experimental.
This commit is contained in:
Daniel Dunbar 2005-03-21 01:34:27 +00:00
parent 6e41cb0a97
commit 887b598d71
5 changed files with 2005 additions and 5 deletions

File diff suppressed because it is too large Load Diff

@ -0,0 +1,163 @@
/* $Id$ */
typedef void* CCGMeshHDL;
typedef void* CCGVertHDL;
typedef void* CCGEdgeHDL;
typedef void* CCGFaceHDL;
typedef struct _CCGMeshIFC CCGMeshIFC;
struct _CCGMeshIFC {
int vertUserSize, edgeUserSize, faceUserSize;
int vertDataSize;
void (*vertDataZero) (CCGMeshHDL m, void *t);
int (*vertDataEqual) (CCGMeshHDL m, void *a, void *b);
void (*vertDataCopy) (CCGMeshHDL m, void *t, void *a);
void (*vertDataAdd) (CCGMeshHDL m, void *ta, void *b);
void (*vertDataSub) (CCGMeshHDL m, void *ta, void *b);
void (*vertDataMulN) (CCGMeshHDL m, void *ta, double n);
void (*vertDataAvg4) (CCGMeshHDL m, void *t, void *a, void *b, void *c, void *d);
int (*getNumVerts) (CCGMeshHDL m);
int (*getNumEdges) (CCGMeshHDL m);
int (*getNumFaces) (CCGMeshHDL m);
CCGVertHDL (*getVert) (CCGMeshHDL m, int idx);
CCGEdgeHDL (*getEdge) (CCGMeshHDL m, int idx);
CCGFaceHDL (*getFace) (CCGMeshHDL m, int idx);
void (*getVertData) (CCGMeshHDL m, CCGVertHDL v, void *data_r);
CCGVertHDL (*getEdgeVert0) (CCGMeshHDL m, CCGEdgeHDL e);
CCGVertHDL (*getEdgeVert1) (CCGMeshHDL m, CCGEdgeHDL e);
int (*getFaceNumVerts) (CCGMeshHDL m, CCGFaceHDL f);
CCGVertHDL (*getFaceVert) (CCGMeshHDL m, CCGFaceHDL f, int idx);
};
/***/
typedef void* CCGAllocatorHDL;
typedef struct _CCGAllocatorIFC CCGAllocatorIFC;
struct _CCGAllocatorIFC {
void* (*alloc) (CCGAllocatorHDL a, int numBytes);
void* (*realloc) (CCGAllocatorHDL a, void *ptr, int newSize, int oldSize);
void (*free) (CCGAllocatorHDL a, void *ptr);
void (*release) (CCGAllocatorHDL a);
};
/***/
typedef enum {
eCCGError_None = 0,
eCCGError_InvalidSyncState,
eCCGError_InvalidValue,
} CCGError;
/***/
typedef struct _CCGSubSurf CCGSubSurf;
CCGSubSurf* ccgSubSurf_new (CCGMeshIFC *ifc, CCGMeshHDL meshData, int subdivisionLevels, CCGAllocatorIFC *allocatorIFC, CCGAllocatorHDL allocator);
void ccgSubSurf_free (CCGSubSurf *ss);
CCGError ccgSubSurf_sync (CCGSubSurf *ss);
CCGError ccgSubSurf_initFullSync (CCGSubSurf *ss);
CCGError ccgSubSurf_initPartialSync (CCGSubSurf *ss);
CCGError ccgSubSurf_syncVert (CCGSubSurf *ss, CCGVertHDL vHDL, void *vertData);
CCGError ccgSubSurf_syncEdge (CCGSubSurf *ss, CCGEdgeHDL eHDL, CCGVertHDL e_vHDL0, CCGVertHDL e_vHDL1);
CCGError ccgSubSurf_syncFace (CCGSubSurf *ss, CCGFaceHDL fHDL, int numVerts, CCGVertHDL *vHDLs);
CCGError ccgSubSurf_syncVertDel (CCGSubSurf *ss, CCGVertHDL vHDL);
CCGError ccgSubSurf_syncEdgeDel (CCGSubSurf *ss, CCGEdgeHDL eHDL);
CCGError ccgSubSurf_syncFaceDel (CCGSubSurf *ss, CCGFaceHDL fHDL);
CCGError ccgSubSurf_processSync (CCGSubSurf *ss);
CCGError ccgSubSurf_setSubdivisionLevels (CCGSubSurf *ss, int subdivisionLevels);
CCGError ccgSubSurf_setAllowEdgeCreation (CCGSubSurf *ss, int allowEdgeCreation);
CCGError ccgSubSurf_setUseAgeCounts (CCGSubSurf *ss, int useAgeCounts, int vertUserOffset, int edgeUserOffset, int faceUserOffset);
/***/
typedef struct _CCGVert CCGVert;
typedef struct _CCGEdge CCGEdge;
typedef struct _CCGFace CCGFace;
int ccgSubSurf_getNumVerts (CCGSubSurf *ss);
int ccgSubSurf_getNumEdges (CCGSubSurf *ss);
int ccgSubSurf_getNumFaces (CCGSubSurf *ss);
int ccgSubSurf_getSubdivisionLevels (CCGSubSurf *ss);
int ccgSubSurf_getEdgeSize (CCGSubSurf *ss);
int ccgSubSurf_getEdgeLevelSize (CCGSubSurf *ss, int level);
int ccgSubSurf_getGridSize (CCGSubSurf *ss);
int ccgSubSurf_getGridLevelSize (CCGSubSurf *ss, int level);
CCGVertHDL ccgSubSurf_getVertVertHandle (CCGSubSurf *ss, CCGVert *v);
int ccgSubSurf_getVertNumFaces (CCGSubSurf *ss, CCGVert *v);
CCGFace* ccgSubSurf_getVertFace (CCGSubSurf *ss, CCGVert *v, int index);
int ccgSubSurf_getVertNumEdges (CCGSubSurf *ss, CCGVert *v);
CCGEdge* ccgSubSurf_getVertEdge (CCGSubSurf *ss, CCGVert *v, int index);
int ccgSubSurf_getVertAge (CCGSubSurf *ss, CCGVert *v);
void* ccgSubSurf_getVertUserData (CCGSubSurf *ss, CCGVert *v);
void* ccgSubSurf_getVertData (CCGSubSurf *ss, CCGVert *v);
void* ccgSubSurf_getVertLevelData (CCGSubSurf *ss, CCGVert *v, int level);
CCGEdgeHDL ccgSubSurf_getEdgeEdgeHandle (CCGSubSurf *ss, CCGEdge *e);
int ccgSubSurf_getEdgeNumFaces (CCGSubSurf *ss, CCGEdge *e);
CCGFace* ccgSubSurf_getEdgeFace (CCGSubSurf *ss, CCGEdge *e, int index);
CCGVert* ccgSubSurf_getEdgeVert0 (CCGSubSurf *ss, CCGEdge *e);
CCGVert* ccgSubSurf_getEdgeVert1 (CCGSubSurf *ss, CCGEdge *e);
int ccgSubSurf_getEdgeAge (CCGSubSurf *ss, CCGEdge *e);
void* ccgSubSurf_getEdgeUserData (CCGSubSurf *ss, CCGEdge *e);
void* ccgSubSurf_getEdgeDataArray (CCGSubSurf *ss, CCGEdge *e);
void* ccgSubSurf_getEdgeData (CCGSubSurf *ss, CCGEdge *e, int x);
void* ccgSubSurf_getEdgeLevelData (CCGSubSurf *ss, CCGEdge *e, int x, int level);
CCGFaceHDL ccgSubSurf_getFaceFaceHandle (CCGSubSurf *ss, CCGFace *f);
int ccgSubSurf_getFaceNumVerts (CCGSubSurf *ss, CCGFace *f);
CCGVert* ccgSubSurf_getFaceVert (CCGSubSurf *ss, CCGFace *f, int index);
CCGEdge* ccgSubSurf_getFaceEdge (CCGSubSurf *ss, CCGFace *f, int index);
int ccgSubSurf_getFaceAge (CCGSubSurf *ss, CCGFace *f);
void* ccgSubSurf_getFaceUserData (CCGSubSurf *ss, CCGFace *f);
void* ccgSubSurf_getFaceCenterData (CCGSubSurf *ss, CCGFace *f);
void* ccgSubSurf_getFaceGridEdgeDataArray (CCGSubSurf *ss, CCGFace *f, int gridIndex);
void* ccgSubSurf_getFaceGridEdgeData (CCGSubSurf *ss, CCGFace *f, int gridIndex, int x);
void* ccgSubSurf_getFaceGridDataArray (CCGSubSurf *ss, CCGFace *f, int gridIndex);
void* ccgSubSurf_getFaceGridData (CCGSubSurf *ss, CCGFace *f, int gridIndex, int x, int y);
int ccgSubSurf_getNumFinalVerts (CCGSubSurf *ss);
int ccgSubSurf_getNumFinalEdges (CCGSubSurf *ss);
int ccgSubSurf_getNumFinalFaces (CCGSubSurf *ss);
/***/
typedef struct _CCGVertIterator CCGVertIterator;
typedef struct _CCGEdgeIterator CCGEdgeIterator;
typedef struct _CCGFaceIterator CCGFaceIterator;
CCGVertIterator* ccgSubSurf_getVertIterator (CCGSubSurf *ss);
CCGEdgeIterator* ccgSubSurf_getEdgeIterator (CCGSubSurf *ss);
CCGFaceIterator* ccgSubSurf_getFaceIterator (CCGSubSurf *ss);
CCGVert* ccgVertIterator_getCurrent (CCGVertIterator *vi);
int ccgVertIterator_isStopped (CCGVertIterator *vi);
void ccgVertIterator_next (CCGVertIterator *vi);
void ccgVertIterator_free (CCGVertIterator *vi);
CCGEdge* ccgEdgeIterator_getCurrent (CCGEdgeIterator *ei);
int ccgEdgeIterator_isStopped (CCGEdgeIterator *ei);
void ccgEdgeIterator_next (CCGEdgeIterator *ei);
void ccgEdgeIterator_free (CCGEdgeIterator *ei);
CCGFace* ccgFaceIterator_getCurrent (CCGFaceIterator *fi);
int ccgFaceIterator_isStopped (CCGFaceIterator *fi);
void ccgFaceIterator_next (CCGFaceIterator *fi);
void ccgFaceIterator_free (CCGFaceIterator *fi);

@ -39,10 +39,6 @@
#include <config.h>
#endif
#ifdef WIN32
#include "BLI_winstuff.h"
#endif
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
@ -1096,6 +1092,11 @@ static DispListMesh *subsurf_subdivide_to_displistmesh(HyperMesh *hme, short sub
DispListMesh *subsurf_make_dispListMesh_from_editmesh(EditMesh *em, int subdivLevels, int flags, short type) {
if (subdivLevels<1) {
return displistmesh_from_editmesh(em);
#ifdef USE_CCGSUBSURFLIB
} else if (type==ME_CCG_SUBSURF) {
extern DispListMesh *subsurf_ccg_make_dispListMesh_from_editmesh(EditMesh *em, int subdivLevels, int flags);
return subsurf_ccg_make_dispListMesh_from_editmesh(em, subdivLevels, flags);
#endif
} else {
HyperMesh *hme= hypermesh_from_editmesh(em, subdivLevels);
@ -1106,6 +1107,11 @@ DispListMesh *subsurf_make_dispListMesh_from_editmesh(EditMesh *em, int subdivLe
DispListMesh *subsurf_make_dispListMesh_from_mesh(Mesh *me, float *extverts, int subdivLevels, int flags) {
if (subdivLevels<1) {
return displistmesh_from_mesh(me, extverts);
#ifdef USE_CCGSUBSURFLIB
} else if (me->subsurftype==ME_CCG_SUBSURF) {
extern DispListMesh *subsurf_ccg_make_dispListMesh_from_mesh(Mesh *me, float *extverts, int subdivLevels, int flags);
return subsurf_ccg_make_dispListMesh_from_mesh(me, extverts, subdivLevels, flags);
#endif
} else {
HyperMesh *hme= hypermesh_from_mesh(me, extverts, subdivLevels);

@ -120,6 +120,9 @@ typedef struct Mesh {
#define ME_CC_SUBSURF 0
#define ME_SIMPLE_SUBSURF 1
#ifdef USE_CCGSUBSURFLIB
#define ME_CCG_SUBSURF 2
#endif
#define TF_DYNAMIC 1
/* #define TF_INVISIBLE 2 */

@ -40,7 +40,6 @@
#endif
#ifdef WIN32
#include "BLI_winstuff.h"
#ifndef snprintf
#define snprintf _snprintf
#endif
@ -653,7 +652,11 @@ static void editing_panel_mesh_type(Object *ob, Mesh *me)
uiBlock *block;
float val;
/* Hope to support more than two subsurf algorithms */
#ifdef USE_CCGSUBSURFLIB
char subsurfmenu[]="Subsurf Type%t|Catmull-Clark%x0|CCGSubSurf%x2|Simple Subdiv.%x1";
#else
char subsurfmenu[]="Subsurf Type%t|Catmull-Clark%x0|Simple Subdiv.%x1";
#endif
block= uiNewBlock(&curarea->uiblocks, "editing_panel_mesh_type", UI_EMBOSS, UI_HELV, curarea->win);
if( uiNewPanel(curarea, block, "Mesh", "Editing", 320, 0, 318, 204)==0) return;