- 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:
parent
6e41cb0a97
commit
887b598d71
1825
source/blender/blenkernel/intern/CCGSubSurf.c
Normal file
1825
source/blender/blenkernel/intern/CCGSubSurf.c
Normal file
File diff suppressed because it is too large
Load Diff
163
source/blender/blenkernel/intern/CCGSubSurf.h
Normal file
163
source/blender/blenkernel/intern/CCGSubSurf.h
Normal file
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user