blender/extern/carve/carve-capi.h

165 lines
6.1 KiB
C
Raw Normal View History

/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2014 Blender Foundation.
* All rights reserved.
*
* Contributor(s): Blender Foundation,
* Sergey Sharybin
*
* ***** END GPL LICENSE BLOCK *****
*/
#ifndef __CARVE_CAPI_H__
#define __CARVE_CAPI_H__
#ifdef __cplusplus
extern "C" {
#endif
struct CarveMeshDescr;
//
// Importer from external storage to Carve module
//
struct ImportMeshData;
// Get number of vertices.
typedef int (*CarveImporter_GetNumVerts) (struct ImportMeshData *import_data);
// Get number of edges.
typedef int (*CarveImporter_GetNumEdges) (struct ImportMeshData *import_data);
// Get number of loops.
typedef int (*CarveImporter_GetNumLoops) (struct ImportMeshData *import_data);
// Get number of polys.
typedef int (*CarveImporter_GetNumPolys) (struct ImportMeshData *import_data);
// Get 3D coordinate of vertex with given index.
typedef void (*CarveImporter_GetVertCoord) (struct ImportMeshData *import_data, int vert_index, float coord[3]);
// Get index of vertices which are adjucent to edge specified by it's index.
typedef void (*CarveImporter_GetEdgeVerts) (struct ImportMeshData *import_data, int edge_index, int *v1, int *v2);
// Get number of adjucent vertices to the poly specified by it's index.
typedef int (*CarveImporter_GetPolyNumVerts) (struct ImportMeshData *import_data, int poly_index);
// Get list of adjucent vertices to the poly specified by it's index.
typedef void (*CarveImporter_GetPolyVerts) (struct ImportMeshData *import_data, int poly_index, int *verts);
// Triangulate 2D polygon.
typedef int (*CarveImporter_Triangulate2DPoly) (struct ImportMeshData *import_data,
const float (*vertices)[2], int num_vertices,
unsigned int (*triangles)[3]);
typedef struct CarveMeshImporter {
CarveImporter_GetNumVerts getNumVerts;
CarveImporter_GetNumEdges getNumEdges;
CarveImporter_GetNumLoops getNumLoops;
CarveImporter_GetNumPolys getNumPolys;
CarveImporter_GetVertCoord getVertCoord;
CarveImporter_GetEdgeVerts getEdgeVerts;
CarveImporter_GetPolyNumVerts getNumPolyVerts;
CarveImporter_GetPolyVerts getPolyVerts;
CarveImporter_Triangulate2DPoly triangulate2DPoly;
} CarveMeshImporter;
//
// Exporter from Carve module to external storage
//
struct ExportMeshData;
// Initialize arrays for geometry.
typedef void (*CarveExporter_InitGeomArrays) (struct ExportMeshData *export_data,
int num_verts, int num_edges,
int num_polys, int num_loops);
// Set coordinate of vertex with given index.
typedef void (*CarveExporter_SetVert) (struct ExportMeshData *export_data,
int vert_index, float coord[3],
int which_orig_mesh, int orig_edge_index);
// Set vertices which are adjucent to the edge specified by it's index.
typedef void (*CarveExporter_SetEdge) (struct ExportMeshData *export_data,
int edge_index, int v1, int v2,
int which_orig_mesh, int orig_edge_index);
// Set adjucent loops to the poly specified by it's index.
typedef void (*CarveExporter_SetPoly) (struct ExportMeshData *export_data,
int poly_index, int start_loop, int num_loops,
int which_orig_mesh, int orig_poly_index);
// Set list vertex and edge which are adjucent to loop with given index.
typedef void (*CarveExporter_SetLoop) (struct ExportMeshData *export_data,
int loop_index, int vertex, int edge,
int which_orig_mesh, int orig_loop_index);
// Get edge index from a loop index for a given original mesh.
//
// A bit of a bummer to access original operands data on export stage,
// but Blender side still does have this information in derived meshes
// and we use API to get this data instead of duplicating it in Carve
// API side. This is because of optimizations reasons.
typedef int (*CarveExporter_MapLoopToEdge) (struct ExportMeshData *export_data,
int which_mesh, int loop_index);
typedef struct CarveMeshExporter {
CarveExporter_InitGeomArrays initGeomArrays;
CarveExporter_SetVert setVert;
CarveExporter_SetEdge setEdge;
CarveExporter_SetPoly setPoly;
CarveExporter_SetLoop setLoop;
CarveExporter_MapLoopToEdge mapLoopToEdge;
} CarveMeshExporter;
enum {
CARVE_OP_UNION,
CARVE_OP_INTERSECTION,
CARVE_OP_A_MINUS_B,
};
enum {
CARVE_MESH_NONE,
CARVE_MESH_LEFT,
CARVE_MESH_RIGHT
};
struct CarveMeshDescr *carve_addMesh(struct ImportMeshData *import_data,
CarveMeshImporter *mesh_importer);
void carve_deleteMesh(struct CarveMeshDescr *mesh_descr);
bool carve_performBooleanOperation(struct CarveMeshDescr *left_mesh,
struct CarveMeshDescr *right_mesh,
int operation,
struct CarveMeshDescr **output_mesh);
void carve_exportMesh(struct CarveMeshDescr *mesh_descr,
CarveMeshExporter *mesh_exporter,
struct ExportMeshData *export_data);
void carve_unionIntersections(struct CarveMeshDescr **left_mesh_r, struct CarveMeshDescr **right_mesh_r);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // __CARVE_CAPI_H__