Changeset View
Changeset View
Standalone View
Standalone View
intern/openvdb/openvdb_capi.cc
| Show All 17 Lines | |||||
| */ | */ | ||||
| #include "openvdb_capi.h" | #include "openvdb_capi.h" | ||||
| #include "openvdb_dense_convert.h" | #include "openvdb_dense_convert.h" | ||||
| #include "openvdb_level_set.h" | #include "openvdb_level_set.h" | ||||
| #include "openvdb_transform.h" | #include "openvdb_transform.h" | ||||
| #include "openvdb_util.h" | #include "openvdb_util.h" | ||||
| #include "intern/particle_tools.h" | |||||
| int OpenVDB_getVersionHex() | int OpenVDB_getVersionHex() | ||||
| { | { | ||||
| return openvdb::OPENVDB_LIBRARY_VERSION; | return openvdb::OPENVDB_LIBRARY_VERSION; | ||||
| } | } | ||||
| OpenVDBFloatGrid *OpenVDB_export_grid_fl(OpenVDBWriter *writer, | OpenVDBFloatGrid *OpenVDB_export_grid_fl(OpenVDBWriter *writer, | ||||
| const char *name, | const char *name, | ||||
| float *data, | float *data, | ||||
| ▲ Show 20 Lines • Show All 191 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| reader->vec3IMeta(name, value); | reader->vec3IMeta(name, value); | ||||
| } | } | ||||
| void OpenVDBReader_get_meta_mat4(OpenVDBReader *reader, const char *name, float value[4][4]) | void OpenVDBReader_get_meta_mat4(OpenVDBReader *reader, const char *name, float value[4][4]) | ||||
| { | { | ||||
| reader->mat4sMeta(name, value); | reader->mat4sMeta(name, value); | ||||
| } | } | ||||
| /* ****************************** Particle List ****************************** */ | |||||
| ParticleList *OpenVDB_create_part_list(size_t totpart, float rad_scale, float vel_scale) | |||||
| { | |||||
| return new ParticleList(totpart, rad_scale, vel_scale); | |||||
| } | |||||
| void OpenVDB_part_list_free(ParticleList *part_list) | |||||
| { | |||||
| delete part_list; | |||||
| part_list = NULL; | |||||
| } | |||||
| void OpenVDB_add_particle(ParticleList *part_list, float pos[3], float rad, float vel[3]) | |||||
| { | |||||
| openvdb::Vec3R nvel(vel); | |||||
| float nrad = rad * part_list->radius_scale(); | |||||
| nvel *= part_list->velocity_scale(); | |||||
| part_list->add(pos, nrad, nvel); | |||||
| } | |||||
| OpenVDBLevelSet *OpenVDBLevelSet_create(bool initGrid, OpenVDBTransform *xform) | OpenVDBLevelSet *OpenVDBLevelSet_create(bool initGrid, float voxel_size, float half_width) | ||||
| { | { | ||||
| OpenVDBLevelSet *level_set = new OpenVDBLevelSet(); | OpenVDBLevelSet *level_set = new OpenVDBLevelSet(); | ||||
| if (initGrid) { | if (initGrid) { | ||||
| openvdb::FloatGrid::Ptr grid = openvdb::FloatGrid::create(); | openvdb::FloatGrid::Ptr grid = openvdb::createLevelSet<openvdb::FloatGrid>(voxel_size, | ||||
| grid->setGridClass(openvdb::GRID_LEVEL_SET); | half_width); | ||||
| if (xform) { | |||||
| grid->setTransform(xform->get_transform()); | |||||
| } | |||||
| level_set->set_grid(grid); | level_set->set_grid(grid); | ||||
| } | } | ||||
| return level_set; | return level_set; | ||||
| } | } | ||||
| OpenVDBTransform *OpenVDBTransform_create() | OpenVDBTransform *OpenVDBTransform_create() | ||||
| { | { | ||||
| return new OpenVDBTransform(); | return new OpenVDBTransform(); | ||||
| Show All 14 Lines | void OpenVDBLevelSet_free(OpenVDBLevelSet *level_set) | ||||
| delete level_set; | delete level_set; | ||||
| } | } | ||||
| void OpenVDBLevelSet_mesh_to_level_set(struct OpenVDBLevelSet *level_set, | void OpenVDBLevelSet_mesh_to_level_set(struct OpenVDBLevelSet *level_set, | ||||
| const float *vertices, | const float *vertices, | ||||
| const unsigned int *faces, | const unsigned int *faces, | ||||
| const unsigned int totvertices, | const unsigned int totvertices, | ||||
| const unsigned int totfaces, | const unsigned int totfaces, | ||||
| OpenVDBTransform *xform) | OpenVDBTransform *xform, | ||||
| { | bool do_convert, | ||||
| level_set->mesh_to_level_set(vertices, faces, totvertices, totfaces, xform->get_transform()); | bool do_add, | ||||
| } | OpenVDBLevelSet_CSGOperation op) | ||||
| { | |||||
| void OpenVDBLevelSet_mesh_to_level_set_transform(struct OpenVDBLevelSet *level_set, | level_set->mesh_to_level_set(vertices, | ||||
| const float *vertices, | faces, | ||||
| const unsigned int *faces, | totvertices, | ||||
| const unsigned int totvertices, | totfaces, | ||||
| const unsigned int totfaces, | xform ? xform->get_transform() : nullptr, | ||||
| OpenVDBTransform *transform) | do_convert, | ||||
| { | do_add, | ||||
| level_set->mesh_to_level_set(vertices, faces, totvertices, totfaces, transform->get_transform()); | op); | ||||
| } | } | ||||
| void OpenVDBLevelSet_volume_to_mesh(struct OpenVDBLevelSet *level_set, | void OpenVDBLevelSet_volume_to_mesh(struct OpenVDBLevelSet *level_set, | ||||
| struct OpenVDBVolumeToMeshData *mesh, | struct OpenVDBVolumeToMeshData *mesh, | ||||
| const double isovalue, | const double isovalue, | ||||
| const double adaptivity, | const double adaptivity, | ||||
| const bool relax_disoriented_triangles) | const bool relax_disoriented_triangles, | ||||
| struct OpenVDBLevelSet *mask) | |||||
| { | { | ||||
| level_set->volume_to_mesh(mesh, isovalue, adaptivity, relax_disoriented_triangles); | level_set->volume_to_mesh(mesh, isovalue, adaptivity, relax_disoriented_triangles, mask); | ||||
| } | } | ||||
| void OpenVDBLevelSet_filter(struct OpenVDBLevelSet *level_set, | void OpenVDBLevelSet_filter(struct OpenVDBLevelSet *level_set, | ||||
| OpenVDBLevelSet_FilterType filter_type, | OpenVDBLevelSet_FilterType filter_type, | ||||
| int width, | int width, | ||||
| int iterations, | |||||
| float sigma, | |||||
| float distance, | float distance, | ||||
| OpenVDBLevelSet_FilterBias bias) | OpenVDBLevelSet_FilterBias bias, | ||||
| const bool sharpen_features, | |||||
| const float edge_tolerance) | |||||
| { | { | ||||
| level_set->filter(filter_type, width, distance, bias); | level_set->filter( | ||||
| filter_type, width, iterations, sigma, distance, bias, sharpen_features, edge_tolerance); | |||||
| } | } | ||||
| void OpenVDBLevelSet_CSG_operation(struct OpenVDBLevelSet *out, | void OpenVDBLevelSet_CSG_operation(struct OpenVDBLevelSet *out, | ||||
| struct OpenVDBLevelSet *gridA, | struct OpenVDBLevelSet *gridA, | ||||
| struct OpenVDBLevelSet *gridB, | struct OpenVDBLevelSet *gridB, | ||||
| OpenVDBLevelSet_CSGOperation operation) | OpenVDBLevelSet_CSGOperation operation) | ||||
| { | { | ||||
| openvdb::FloatGrid::Ptr grid = out->CSG_operation_apply( | openvdb::FloatGrid::Ptr grid = out->CSG_operation_apply( | ||||
| ▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | switch (sampler) { | ||||
| case OPENVDB_LEVELSET_GRIDSAMPLER_NONE: | case OPENVDB_LEVELSET_GRIDSAMPLER_NONE: | ||||
| break; | break; | ||||
| } | } | ||||
| targetGrid = openvdb::tools::levelSetRebuild(*targetGrid, isolevel, 1.0f); | targetGrid = openvdb::tools::levelSetRebuild(*targetGrid, isolevel, 1.0f); | ||||
| openvdb::tools::pruneLevelSet(targetGrid->tree()); | openvdb::tools::pruneLevelSet(targetGrid->tree()); | ||||
| OpenVDBLevelSet *level_set = OpenVDBLevelSet_create(false, NULL); | OpenVDBLevelSet *level_set = OpenVDBLevelSet_create(false, 0.0f, 0.0f); | ||||
| level_set->set_grid(targetGrid); | level_set->set_grid(targetGrid); | ||||
| return level_set; | return level_set; | ||||
| } | } | ||||
| void OpenVDBLevelSet_particles_to_level_set(OpenVDBLevelSet *level_set, | |||||
| struct ParticleList *part_list, | |||||
| float min_radius, | |||||
| bool trail, | |||||
| float trail_size) | |||||
| { | |||||
| level_set->particles_to_level_set(*part_list, min_radius, trail, trail_size); | |||||
| } | |||||
| struct OpenVDBLevelSet *OpenVDBLevelSet_copy(struct OpenVDBLevelSet *level_set) | |||||
| { | |||||
| struct OpenVDBLevelSet *lvl_copy = OpenVDBLevelSet_create(false, 0.0f, 0.0f); | |||||
| openvdb::FloatGrid::Ptr grid_copy = level_set->get_grid()->deepCopy(); | |||||
| lvl_copy->set_grid(grid_copy); | |||||
| return lvl_copy; | |||||
| } | |||||
| /* XXX, remove this function. */ | |||||
| #if 0 | |||||
| static void OpenVDBLevelSet_guidemesh_add(struct OpenVDBLevelSet *level_set, struct Mesh *me) | |||||
| { | |||||
| (void)level_set; | |||||
| (void)me; | |||||
| } | |||||
| #endif | |||||