Files
2025-05-29 22:31:40 +03:00

436 lines
20 KiB
C++

/*
* Oni.h
* Oni
*
* Created by José María Méndez González on 21/9/15.
* Copyright (c) 2015 ArK. All rights reserved.
*
*/
#ifndef Oni_
#define Oni_
#include "Solver.h"
#include "HalfEdgeMesh.h"
#include "ParticleGrid.h"
#include "ColliderGrid.h"
#if defined(__APPLE__) || defined(ANDROID) || defined(__linux__)
#define EXPORT __attribute__((visibility("default")))
#else
#define EXPORT __declspec(dllexport)
#endif
namespace Oni
{
struct ConstraintGroupParameters;
class ConstraintBatchBase;
struct Collider;
struct Rigidbody;
class TriangleSkinMap;
class DistanceField;
struct CollisionMaterial;
struct ProfileInfo;
struct DFNode;
struct TriangleMeshHeader;
struct EdgeMeshHeader;
struct BIHNode;
struct Triangle;
struct Edge;
template<class T>
struct ObjHandle
{
std::shared_ptr<T> ptr;
ObjHandle(T* obj):ptr(std::shared_ptr<T>(obj)){}
ObjHandle(std::shared_ptr<T> obj):ptr(obj){}
std::shared_ptr<T> operator->() const{
return ptr;
}
};
extern "C"
{
typedef ObjHandle<ConstraintBatchBase> ConstraintBatchHandle;
typedef ObjHandle<Collider> ColliderHandle;
typedef ObjHandle<Rigidbody> RigidbodyHandle;
typedef ObjHandle<CollisionMaterial> CollisionMaterialHandle;
typedef ObjHandle<DistanceField> DistanceFieldHandle;
typedef ObjHandle<Task> TaskHandle;
// Colliders ********************:
EXPORT void UpdateColliderGrid(float dt);
EXPORT void SetColliders(Collider* shapes, Bounds* bounds, Transform* transforms, int count);
EXPORT void SetRigidbodies(Rigidbody* rigidbodies);
EXPORT void SetCollisionMaterials(CollisionMaterial* materials);
EXPORT void SetTriangleMeshData(TriangleMeshHeader* headers, BIHNode* nodes, Triangle* triangles, Eigen::Vector3f* vertices);
EXPORT void SetEdgeMeshData(EdgeMeshHeader* headers, BIHNode* nodes, Edge* edges, Eigen::Vector2f* vertices);
EXPORT void SetDistanceFieldData(DistanceFieldHeader* headers, DFNode* nodes);
EXPORT void SetHeightFieldData(HeightFieldHeader* hf_headers, float* hf_samples);
// Distance fields ********************:
EXPORT DistanceFieldHandle* CreateDistanceField();
EXPORT void DestroyDistanceField(DistanceFieldHandle* df);
EXPORT void StartBuildingDistanceField(DistanceFieldHandle* df,float max_error,
int max_depth,
Eigen::Vector3f* vertex_positions,
int* triangle_indices_,
int num_vertices,
int num_triangles);
EXPORT bool ContinueBuildingDistanceField(DistanceFieldHandle* df);
EXPORT float SampleDistanceField(DistanceFieldHandle* df, float x, float y, float z);
EXPORT int GetDistanceFieldNodeCount(DistanceFieldHandle* df);
EXPORT void GetDistanceFieldNodes(DistanceFieldHandle* df, DFNode* nodes);
EXPORT void SetDistanceFieldNodes(DistanceFieldHandle* df, const DFNode* nodes, int num);
// Collision materials *****************:
EXPORT CollisionMaterialHandle* CreateCollisionMaterial();
EXPORT void UpdateCollisionMaterial(CollisionMaterialHandle* material, const CollisionMaterial& adaptor);
EXPORT void DestroyCollisionMaterial(CollisionMaterialHandle* collider);
// Solver ********************:
EXPORT Solver* CreateSolver(int capacity);
EXPORT void DestroySolver(Solver* solver);
EXPORT void SetCapacity(Solver* solver,int capacity);
EXPORT void InitializeFrame(Solver* solver,const Vector4fUnaligned& position, const Vector4fUnaligned& scale, const QuaternionfUnaligned& rotation);
EXPORT void UpdateFrame(Solver* solver,const Vector4fUnaligned& position, const Vector4fUnaligned& scale, const QuaternionfUnaligned& rotation, float dt);
EXPORT void ApplyFrame(Solver* solver, float linear_velocity_scale, float angular_velocity_scale, float linear_inertia_scale,float angular_inertia_scale, float dt);
EXPORT void GetBounds(Solver* solver, Eigen::Vector3f& min, Eigen::Vector3f& max);
EXPORT int GetParticleGridSize(Solver* solver);
EXPORT void GetParticleGrid(Solver* solver, Bounds* cells);
EXPORT void SetSolverParameters(Solver* solver, const SolverParameters* parameters);
EXPORT void GetSolverParameters(Solver* solver, SolverParameters* parameters);
EXPORT TaskHandle* CollisionDetection(Solver* solver, float step_time);
EXPORT TaskHandle* Step(Solver* solver, float step_time, float substep_time, int substeps);
EXPORT int SpatialQuery(Solver* solver, QueryShape* shapes, Transform* transforms, int shape_count);
EXPORT void GetQueryResults(Solver* solver, QueryResult* results, int num);
EXPORT void ApplyPositionInterpolation(Solver* solver,
Eigen::Vector4f* start_positions,
Eigen::Quaternionf* start_orientations,
float step_time,
float unsimulated_time);
EXPORT void UpdateSkeletalAnimation(Solver* solver);
EXPORT void RecalculateInertiaTensors(Solver* solver);
EXPORT void ResetForces(Solver* solver);
EXPORT void SetRigidbodyLinearDeltas(Solver* solver, Eigen::Vector4f* linear_deltas);
EXPORT void SetRigidbodyAngularDeltas(Solver* solver, Eigen::Vector4f* angular_deltas);
EXPORT int GetConstraintCount(Solver* solver, const Solver::ConstraintType type);
EXPORT int SetActiveParticles(Solver* solver, const int* active, int num);
EXPORT void SetParticleCollisionMaterials(Solver* solver, int* material_indices);
EXPORT void SetParticlePhases(Solver* solver, int* phases);
EXPORT void SetParticleFilters(Solver* solver, int* filters);
EXPORT void SetParticlePositions(Solver* solver, Eigen::Vector4f* positions);
EXPORT void SetParticlePreviousPositions(Solver* solver, Eigen::Vector4f* prev_positions);
EXPORT void SetParticleOrientations(Solver* solver,Eigen::Quaternionf* orientations);
EXPORT void SetParticlePreviousOrientations(Solver* solver, Eigen::Quaternionf* prev_orientations);
EXPORT void SetRenderableParticleOrientations(Solver* solver, Eigen::Quaternionf* orientations);
EXPORT void SetRenderableParticlePositions(Solver* solver, Eigen::Vector4f* positions);
EXPORT void SetParticleInverseMasses(Solver* solver, float* inv_masses);
EXPORT void SetParticleInverseRotationalMasses(Solver* solver, float* inv_rot_masses);
EXPORT void SetParticlePrincipalRadii(Solver* solver, Eigen::Vector4f* radii);
EXPORT void SetParticleVelocities(Solver* solver, Eigen::Vector4f* velocities);
EXPORT void SetParticleAngularVelocities(Solver* solver, Eigen::Vector4f* velocities);
EXPORT void SetParticleExternalForces(Solver* solver, Eigen::Vector4f* forces);
EXPORT void SetParticleExternalTorques(Solver* solver, Eigen::Vector4f* torques);
EXPORT void SetParticleWinds(Solver* solver, Eigen::Vector4f* wind);
EXPORT void SetParticlePositionDeltas(Solver* solver, Eigen::Vector4f* deltas);
EXPORT void SetParticleOrientationDeltas(Solver* solver, Eigen::Quaternionf* deltas);
EXPORT void SetParticlePositionConstraintCounts(Solver* solver, int* counts);
EXPORT void SetParticleOrientationConstraintCounts(Solver* solver, int* counts);
EXPORT void SetParticleNormals(Solver* solver, Eigen::Vector4f* normals);
EXPORT void SetParticleInverseInertiaTensors(Solver* solver, Eigen::Vector4f* tensors);
EXPORT int SetSimplices(Solver* solver, const int* simplices, int point_count, int edge_count, int triangle_count);
EXPORT int GetDeformableTriangleCount(Solver* solver);
EXPORT void SetDeformableTriangles(Solver* solver, const int* indices, int num, int dest_offset);
EXPORT int RemoveDeformableTriangles(Solver* solver, int num, int source_offset);
// Fluid ********************:
EXPORT void SetParticleSmoothingRadii(Solver* solver,float* radii);
EXPORT void SetParticleBuoyancy(Solver* solver,float* buoyancy);
EXPORT void SetParticleRestDensities(Solver* solver,float* rest_densities);
EXPORT void SetParticleViscosities(Solver* solver,float* viscosities);
EXPORT void SetParticleSurfaceTension(Solver* solver,float* surf_tension);
EXPORT void SetParticleVorticityConfinement(Solver* solver,float* vort_confinement);
EXPORT void SetParticleAtmosphericDragPressure(Solver* solver,float* atmospheric_drag, float* atmospheric_pressure);
EXPORT void SetParticleDiffusion(Solver* solver,float* diffusion);
EXPORT void SetParticleVorticities(Solver* solver, Eigen::Vector4f* vorticities);
EXPORT void SetParticleFluidData(Solver* solver, Eigen::Vector4f* fluid_data);
EXPORT void SetParticleUserData(Solver* solver, Eigen::Vector4f* user_data);
EXPORT void SetParticleAnisotropies(Solver* solver, Eigen::Vector4f* anisotropies);
EXPORT void SetConstraintGroupParameters(Solver* solver, const Solver::ConstraintType type, const ConstraintGroupParameters* parameters);
EXPORT void GetConstraintGroupParameters(Solver* solver, const Solver::ConstraintType type, ConstraintGroupParameters* parameters);
EXPORT void SetRestPositions(Solver* solver, Eigen::Vector4f* rest_positions);
EXPORT void SetRestOrientations(Solver* solver, Eigen::Quaternionf* rest_orientations);
// Batches ********************:
EXPORT ConstraintBatchHandle* CreateBatch(const Solver::ConstraintType type);
EXPORT void DestroyBatch(ConstraintBatchHandle* batch);
EXPORT void AddBatch(Solver* solver, ConstraintBatchHandle* batch);
EXPORT void RemoveBatch(Solver* solver, ConstraintBatchHandle* batch);
EXPORT void EnableBatch(ConstraintBatchHandle* batch, bool enabled);
EXPORT int GetBatchConstraintForces(ConstraintBatchHandle* batch, float* forces, int num, int source_offset);
// Constraints ********************:
EXPORT void SetBatchConstraintCount(ConstraintBatchHandle* batch, int num);
EXPORT int GetBatchConstraintCount(ConstraintBatchHandle* batch);
EXPORT void SetDistanceConstraints(ConstraintBatchHandle* batch,
int* indices,
float* restLengths,
float* stiffnesses,
float* lambdas,
int num);
EXPORT void SetBendingConstraints(ConstraintBatchHandle* batch,
int* indices,
float* rest_bends,
float* bending_stiffnesses,
float* plasticity,
float* lambdas,
int num);
EXPORT void SetSkinConstraints(ConstraintBatchHandle* batch,
int* indices,
Eigen::Vector4f* skin_points,
Eigen::Vector4f* skin_normals,
float* radii_backstops,
float* stiffnesses,
float* lambdas,
int num);
EXPORT void SetAerodynamicConstraints(ConstraintBatchHandle* batch,
int* triangle_indices,
float* aerodynamic_coeffs,
int num);
EXPORT void SetVolumeConstraints(ConstraintBatchHandle* batch,
int* triangle_indices,
int* first_triangle,
int* num_triangles,
float* rest_volumes,
float* pressure_stiffnesses,
float* lambdas,
int num);
EXPORT void SetShapeMatchingConstraints(ConstraintBatchHandle* batch,
int* shape_indices,
int* first_index,
int* num_indices,
int* explicit_group,
float* shape_material_parameters,
Eigen::Vector4f* rest_coms,
Eigen::Vector4f* coms,
Eigen::Quaternionf* orientations,
Eigen::Matrix4f* linear_transforms,
Eigen::Matrix4f* plastic_deformations,
int num);
EXPORT void CalculateRestShapeMatching(Solver* solver, ConstraintBatchHandle* batch);
EXPORT void SetStretchShearConstraints(ConstraintBatchHandle* batch,
int* particle_indices,
int* orientation_indices,
float* rest_lengths,
Eigen::Quaternionf* rest_orientations,
Eigen::Vector3f* stiffnesses,
Eigen::Vector3f* lambdas,
int num);
EXPORT void SetBendTwistConstraints(ConstraintBatchHandle* batch,
int* orientation_indices,
Eigen::Quaternionf* rest_darboux,
Eigen::Vector3f* stiffnesses,
float* plasticity,
Eigen::Vector3f* lambdas,
int num);
EXPORT void SetTetherConstraints(ConstraintBatchHandle* batch,
int* indices,
float* max_lenght_scales,
float* stiffnesses,
float* lambdas,
int num);
EXPORT void SetPinConstraints(ConstraintBatchHandle* batch,
int* indices,
Vector4f* pin_offsets,
Quaternionf* rest_darboux,
int* colliders,
float* stiffnesses,
Eigen::Vector4f* lambdas,
int num);
EXPORT void SetStitchConstraints(ConstraintBatchHandle* batch,
int* indices,
float* stiffnesses,
float* lambdas,
int num);
EXPORT void SetChainConstraints(ConstraintBatchHandle* batch,
int* indices,
float* rest_lengths,
int* first_index,
int* num_indices,
int num);
// Collision data ********************:
EXPORT void GetCollisionContacts(Solver* solver,Contact* contacts, int num);
EXPORT void GetParticleCollisionContacts(Solver* solver,Contact* contacts, int num);
// Diffuse particles ********************:
EXPORT void InterpolateDiffuseParticles(Solver* solver,
const Eigen::Vector4f* properties,
const Eigen::Vector4f* diffuse_positions,
Eigen::Vector4f* diffuse_properties,
int* neighbour_count,
int count);
// Skin maps ********************:
EXPORT TriangleSkinMap* CreateTriangleSkinMap();
EXPORT void DestroyTriangleSkinMap(TriangleSkinMap* map);
EXPORT void Bind(TriangleSkinMap* map, Mesh* source, Mesh* target,
const unsigned int* source_master_flags,
const unsigned int* target_slave_flags);
EXPORT int GetSkinnedVertexCount(TriangleSkinMap* map);
EXPORT void GetSkinInfo(TriangleSkinMap* map,
int* skin_indices,
int* source_tri_indices,
Eigen::Vector3f* bary_pos,
Eigen::Vector3f* bary_nrm,
Eigen::Vector3f* bary_tan);
EXPORT void SetSkinInfo(TriangleSkinMap* map,
const int* skin_indices,
const int* source_tri_indices,
const Eigen::Vector3f* bary_pos,
const Eigen::Vector3f* bary_nrm,
const Eigen::Vector3f* bary_tan,
int num);
// Tasks ********************:
EXPORT void CompleteAll();
EXPORT void Complete(TaskHandle* task);
EXPORT TaskHandle* CreateEmpty();
EXPORT void Schedule(TaskHandle* task);
EXPORT void AddChild(TaskHandle* task, TaskHandle* child);
// Profiling ****************:
EXPORT int GetMaxSystemConcurrency();
EXPORT void ClearProfiler();
EXPORT void EnableProfiler(bool enabled);
EXPORT void BeginSample(const char* name, unsigned char type);
EXPORT void EndSample();
EXPORT int GetProfilingInfoCount();
EXPORT void GetProfilingInfo(ProfileInfo* info, int count);
}
}
#endif