/* * 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 struct ObjHandle { std::shared_ptr ptr; ObjHandle(T* obj):ptr(std::shared_ptr(obj)){} ObjHandle(std::shared_ptr obj):ptr(obj){} std::shared_ptr operator->() const{ return ptr; } }; extern "C" { typedef ObjHandle ConstraintBatchHandle; typedef ObjHandle ColliderHandle; typedef ObjHandle RigidbodyHandle; typedef ObjHandle CollisionMaterialHandle; typedef ObjHandle DistanceFieldHandle; typedef ObjHandle 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