forked from bartvdbraak/blender
165 lines
6.1 KiB
C
165 lines
6.1 KiB
C
|
/*
|
||
|
* ***** 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__
|