diff options
author | Pablo Dobarro <pablodp606@gmail.com> | 2019-08-14 18:46:20 +0300 |
---|---|---|
committer | Pablo Dobarro <pablodp606@gmail.com> | 2019-08-14 19:13:56 +0300 |
commit | 9ac3964be198a9bcbbcf2cda2ecd99047eae560f (patch) | |
tree | 714d82a675e228e2da4cafa73956d0da60e5f0ca /intern/openvdb/openvdb_capi.h | |
parent | 5ca5357e08f25b1fcda95c084ac24722c5177b5e (diff) |
OpenVDB: mesh/level set conversion, filters and CSG operations
This code is needed to implement the Voxel Remesher as well as other features like a better remesh modifier with filters and CSG operations.
Done by Martin Felke and Pablo Dobarro
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D5364
Diffstat (limited to 'intern/openvdb/openvdb_capi.h')
-rw-r--r-- | intern/openvdb/openvdb_capi.h | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/intern/openvdb/openvdb_capi.h b/intern/openvdb/openvdb_capi.h index 236bceea3e2..826481bde34 100644 --- a/intern/openvdb/openvdb_capi.h +++ b/intern/openvdb/openvdb_capi.h @@ -24,12 +24,80 @@ extern "C" { #endif +/* Level Set Filters */ +typedef enum OpenVDBLevelSet_FilterType { + OPENVDB_LEVELSET_FILTER_NONE = 0, + OPENVDB_LEVELSET_FILTER_GAUSSIAN = 1, + OPENVDB_LEVELSET_FILTER_MEAN = 2, + OPENVDB_LEVELSET_FILTER_MEDIAN = 3, + OPENVDB_LEVELSET_FILTER_MEAN_CURVATURE = 4, + OPENVDB_LEVELSET_FILTER_LAPLACIAN = 5, + OPENVDB_LEVELSET_FILTER_DILATE = 6, + OPENVDB_LEVELSET_FILTER_ERODE = 7, +} OpenVDBLevelSet_FilterType; + +typedef enum OpenVDBLevelSet_FilterBias { + OPENVDB_LEVELSET_FIRST_BIAS = 0, + OPENVDB_LEVELSET_SECOND_BIAS, + OPENVDB_LEVELSET_THIRD_BIAS, + OPENVDB_LEVELSET_WENO5_BIAS, + OPENVDB_LEVELSET_HJWENO5_BIAS, +} OpenVDBLevelSet_FilterBias; + +/* Level Set CSG Operations */ +typedef enum OpenVDBLevelSet_CSGOperation { + OPENVDB_LEVELSET_CSG_UNION = 0, + OPENVDB_LEVELSET_CSG_DIFFERENCE = 1, + OPENVDB_LEVELSET_CSG_INTERSECTION = 2, +} OpenVDBLevelSet_CSGOperation; + +typedef enum OpenVDBLevelSet_GridSampler { + OPENVDB_LEVELSET_GRIDSAMPLER_NONE = 0, + OPENVDB_LEVELSET_GRIDSAMPLER_POINT = 1, + OPENVDB_LEVELSET_GRIDSAMPLER_BOX = 2, + OPENVDB_LEVELSET_GRIDSAMPLER_QUADRATIC = 3, +} OpenVDBLevelSet_Gridsampler; + struct OpenVDBReader; struct OpenVDBWriter; +struct OpenVDBTransform; +struct OpenVDBLevelSet; struct OpenVDBFloatGrid; struct OpenVDBIntGrid; struct OpenVDBVectorGrid; +struct OpenVDBVolumeToMeshData { + int tottriangles; + int totquads; + int totvertices; + + float *vertices; + unsigned int *quads; + unsigned int *triangles; +}; + +struct OpenVDBRemeshData { + float *verts; + unsigned int *faces; + int totfaces; + int totverts; + + float *out_verts; + unsigned int *out_faces; + unsigned int *out_tris; + int out_totverts; + int out_totfaces; + int out_tottris; + int filter_type; + enum OpenVDBLevelSet_FilterType filter_bias; + enum OpenVDBLevelSet_FilterBias filter_width; /* Parameter for gaussian, median, mean*/ + + float voxel_size; + float isovalue; + float adaptivity; + int relax_disoriented_triangles; +}; + int OpenVDB_getVersionHex(void); enum { @@ -112,6 +180,45 @@ void OpenVDBReader_get_meta_mat4(struct OpenVDBReader *reader, const char *name, float value[4][4]); +struct OpenVDBTransform *OpenVDBTransform_create(void); +void OpenVDBTransform_free(struct OpenVDBTransform *transform); +void OpenVDBTransform_create_linear_transform(struct OpenVDBTransform *transform, + double voxel_size); + +struct OpenVDBLevelSet *OpenVDBLevelSet_create(bool initGrid, struct OpenVDBTransform *xform); +void OpenVDBLevelSet_free(struct OpenVDBLevelSet *level_set); +void OpenVDBLevelSet_mesh_to_level_set(struct OpenVDBLevelSet *level_set, + const float *vertices, + const unsigned int *faces, + const unsigned int totvertices, + const unsigned int totfaces, + struct OpenVDBTransform *xform); +void OpenVDBLevelSet_mesh_to_level_set_transform(struct OpenVDBLevelSet *level_set, + const float *vertices, + const unsigned int *faces, + const unsigned int totvertices, + const unsigned int totfaces, + struct OpenVDBTransform *transform); +void OpenVDBLevelSet_volume_to_mesh(struct OpenVDBLevelSet *level_set, + struct OpenVDBVolumeToMeshData *mesh, + const double isovalue, + const double adaptivity, + const bool relax_disoriented_triangles); +void OpenVDBLevelSet_filter(struct OpenVDBLevelSet *level_set, + OpenVDBLevelSet_FilterType filter_type, + int width, + float distance, + OpenVDBLevelSet_FilterBias bias); +void OpenVDBLevelSet_CSG_operation(struct OpenVDBLevelSet *out, + struct OpenVDBLevelSet *gridA, + struct OpenVDBLevelSet *gridB, + OpenVDBLevelSet_CSGOperation operation); + +struct OpenVDBLevelSet *OpenVDBLevelSet_transform_and_resample(struct OpenVDBLevelSet *level_setA, + struct OpenVDBLevelSet *level_setB, + char sampler, + float isolevel); + #ifdef __cplusplus } #endif |