/* * LWSDK Header File * Copyright 1999, NewTek, Inc. * * LWMESHES.H -- LightWave Geometry Services * * This header contains the declarations for globals for accessing * common geometric information. */ #ifndef LWSDK_MESHES_H #define LWSDK_MESHES_H #include /* * Meshes are composed of points and polygons given by their internal * ID reference. */ typedef struct st_GCoreVertex * LWPntID; typedef struct st_GCorePolygon * LWPolID; /* * Polygon types are an extensible set of ID codes. Some common ones * are included here. */ #define LWPOLTYPE_FACE LWID_('F','A','C','E') #define LWPOLTYPE_CURV LWID_('C','U','R','V') #define LWPOLTYPE_PTCH LWID_('P','T','C','H') #define LWPOLTYPE_MBAL LWID_('M','B','A','L') #define LWPOLTYPE_BONE LWID_('B','O','N','E') /* * Polygon tags are indexed by an extensible set of ID codes. Some * common ones are included here. */ #define LWPTAG_SURF LWID_('S','U','R','F') #define LWPTAG_PART LWID_('P','A','R','T') #define LWPTAG_TXUV LWID_('T','X','U','V') /* * VMAPs are identifed by an extensible set of ID codes. Some common * ones are included here. */ #define LWVMAP_PICK LWID_('P','I','C','K') #define LWVMAP_WGHT LWID_('W','G','H','T') #define LWVMAP_MNVW LWID_('M','N','V','W') #define LWVMAP_TXUV LWID_('T','X','U','V') #define LWVMAP_MORF LWID_('M','O','R','F') #define LWVMAP_SPOT LWID_('S','P','O','T') #define LWVMAP_RGB LWID_('R','G','B',' ') #define LWVMAP_RGBA LWID_('R','G','B','A') /* * Scan callbacks allow the client to traverse the elements of the * mesh and get information about each one. */ typedef int LWPntScanFunc (void *, LWPntID); typedef int LWPolScanFunc (void *, LWPolID); /* * A LWMeshInfo is an allocated object that allows a mesh to be examined * through a set of query callbacks. * * priv private data for the mesh info implementation. Hands off! * * destroy destroy the mesh when done. A mesh should only be freed * by the client that created it. * * numPoints these functions return the size of the mesh as a count of * numPolygons its points and polygons. * * scanPoints iterate through elements in the mesh. The scan function * scanPolygons callback is called for each element in the mesh. If the * callback returns non-zero, the iteration stops and the * value is returned. * * pntBasePos return the base position of a point. This is the position * of the point at rest in the basic object coordinate system. * * pntOtherPos return an alternate position for the point. This many be * the same as the base position or it may be the position of * the point after some transformation. The nature of the * alternate position depends on how the mesh info was created. * * pntVLookup selects a vmap for reading vectors. The vmap is given by * an ID code for the type and a name string. The function * returns a pointer that may be used to select this same vmap * again quickly, or null for none. * * pntVSelect selects a vmap for reading vectors. The vmap is given by * the pointer returned from pntVLookup above. The function * returns the dimension of the vmap. * * pntVGet reads the vector value of the selected vmap for the given * point. The vmap can be set using either of the two * functions above. The vector must at least be as large as * the dimension of the vmap. The function returns true if * the point is mapped. * * pntVPGet just like the above, but reads the vector value of the * selected vmap for the given point and polygon. * * polType returns the type of a polygon as an LWPOLTYPE_* code. * * polSize returns the number of vertices that the polygon has. * * polVertex returns the point ID for the given vertex of the polygon. * Vertices are indexed starting from zero. * * polTag returns the tag string of the given type associated with the * polygon. A null string pointer means that the polygon does * not have a tag of that type. * * polFlags returns the polygon flags, matching those used by the MeshEdit * polygin info structure in modeler. */ typedef struct st_LWMeshInfo * LWMeshInfoID; typedef struct st_LWMeshInfo { void *priv; void (*destroy) (LWMeshInfoID); int (*numPoints) (LWMeshInfoID); int (*numPolygons) (LWMeshInfoID); int (*scanPoints) (LWMeshInfoID, LWPntScanFunc *, void *); int (*scanPolys) (LWMeshInfoID, LWPolScanFunc *, void *); void (*pntBasePos) (LWMeshInfoID, LWPntID, LWFVector pos); void (*pntOtherPos) (LWMeshInfoID, LWPntID, LWFVector pos); void * (*pntVLookup) (LWMeshInfoID, LWID, const char *); int (*pntVSelect) (LWMeshInfoID, void *); int (*pntVGet) (LWMeshInfoID, LWPntID, float *vector); LWID (*polType) (LWMeshInfoID, LWPolID); int (*polSize) (LWMeshInfoID, LWPolID); LWPntID (*polVertex) (LWMeshInfoID, LWPolID, int); const char * (*polTag) (LWMeshInfoID, LWPolID, LWID); int (*pntVPGet) (LWMeshInfoID, LWPntID, LWPolID, float *vector); unsigned int (*polFlags) (LWMeshInfoID, LWPolID); int (*pntVIDGet) (LWMeshInfoID, LWPntID, float *vector, void *); int (*pntVPIDGet) (LWMeshInfoID, LWPntID, LWPolID, float *vector, void *); } LWMeshInfo; /* * LightWave maintains a database which is essentially an image of * all the LWO2 object files loaded into the application. Each object * contains some number of layers which can be scanned. The functions * for accessing this information is the "Scene Objects" global. * * numObjects returns the total number of objects in the scene. * These are the unique object files which are loaded, * which may have nothing to do with the animatable * items in the scene. * * filename returns the name of the source object file. Objects * are indexed from 0 to numObjects - 1. * * userName returns the name of the object as seen by the user. * This is typically the base filename without path or * extension, or "Unnamed N" for unsaved objects. These * are not guaranteed to be unique. * * refName returns an internal reference name for this object. * The reference name is guaranteed to be unique and * unchanging for the lifetime of the object. This * string contains control characters so it cannot be * confused with a filename. * * maxLayers returns a value one greater than the largest index of * any existing layer. * * layerExists returns true if the layer with the given index exists. * Layers are indexed from 0 to maxLayers - 1. * * pivotPoint fills in the postion vector with the pivot point for * the given layer. * * layerMesh returns a mesh info structure for the given layer. The * mesh will reference vertices in their rest positions. * * layerName returns the name string assigned to the layer, or null * if none. * * layerVis returns true if the layer is marked as visible. * * numVMaps returns the total number of vmaps in the scene with the * given type code. A code of zero selects all vmaps of * every type. * * vmapName returns the name of the vmap with the given index, from * 0 to numVMaps - 1. * * vmapDim returns the dimension of the vmap vector. * * vmapType returns the type code of the vmap. The index is into the * list of all vmaps given by numVMap with type code zero. */ #define LWOBJECTFUNCS_GLOBAL "Scene Objects 4" typedef struct st_LWObjectFuncs { int (*numObjects) (void); const char * (*filename) (int obj); int (*maxLayers) (int obj); int (*layerExists) (int obj, int lnum); void (*pivotPoint) (int obj, int lnum, LWFVector pos); LWMeshInfo * (*layerMesh) (int obj, int lnum); int (*numVMaps) (LWID); const char * (*vmapName) (LWID, int index); int (*vmapDim) (LWID, int index); LWID (*vmapType) (int index); const char * (*layerName) (int obj, int lnum); int (*layerVis) (int obj, int lnum); const char * (*userName) (int obj); const char * (*refName) (int obj); } LWObjectFuncs; #endif