Oni.cs 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058
  1. using UnityEngine;
  2. using System;
  3. using System.Collections;
  4. using System.Runtime.InteropServices;
  5. using Obi;
  6. /**
  7. * Interface for the Oni particle physics library.
  8. */
  9. public static class Oni {
  10. public const int ConstraintTypeCount = 14;
  11. public enum ConstraintType
  12. {
  13. Tether = 0,
  14. Volume = 1,
  15. Chain = 2,
  16. Bending = 3,
  17. Distance = 4,
  18. ShapeMatching = 5,
  19. BendTwist = 6,
  20. StretchShear = 7,
  21. Pin = 8,
  22. ParticleCollision = 9,
  23. Density = 10,
  24. Collision = 11,
  25. Skin = 12,
  26. Aerodynamics = 13,
  27. Stitch = 14
  28. };
  29. public enum ParticlePhase{
  30. SelfCollide = 1 << 24,
  31. Fluid = 1 << 25,
  32. OneSided = 1 << 26
  33. }
  34. public enum ShapeType{
  35. Sphere = 0,
  36. Box = 1,
  37. Capsule = 2,
  38. Heightmap = 3,
  39. TriangleMesh = 4,
  40. EdgeMesh = 5,
  41. SignedDistanceField = 6
  42. }
  43. public enum MaterialCombineMode{
  44. Average = 0,
  45. Minimium = 1,
  46. Multiply = 2,
  47. Maximum = 3
  48. }
  49. public enum NormalsUpdate{
  50. Recalculate = 0,
  51. Skin = 1
  52. }
  53. public enum ProfileMask : uint{
  54. ThreadIdMask = 0xffff0000,
  55. TypeMask = 0x000000ff,
  56. StackLevelMask = 0x0000ff00
  57. }
  58. public struct ProfileInfo
  59. {
  60. public double start;
  61. public double end;
  62. public uint info;
  63. public int pad;
  64. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
  65. public string name;
  66. }
  67. public struct GridCell
  68. {
  69. public Vector3 center;
  70. public Vector3 size;
  71. public int count;
  72. }
  73. [Serializable]
  74. public struct SolverParameters{
  75. public enum Interpolation
  76. {
  77. None,
  78. Interpolate,
  79. };
  80. public enum Mode
  81. {
  82. Mode3D,
  83. Mode2D,
  84. };
  85. [Tooltip("In 2D mode, particles are simulated on the XY plane only. For use in conjunction with Unity's 2D mode.")]
  86. public Mode mode;
  87. [Tooltip("Same as Rigidbody.interpolation. Set to INTERPOLATE for cloth that is applied on a main character or closely followed by a camera. NONE for everything else.")]
  88. public Interpolation interpolation;
  89. public Vector3 gravity;
  90. [Tooltip("Percentage of velocity lost per second, between 0% (0) and 100% (1).")]
  91. [Range(0,1)]
  92. public float damping;
  93. [Tooltip("Max ratio between a particle's longest and shortest axis. Use 1 for isotropic (completely round) particles.")]
  94. [Range(1,5)]
  95. public float maxAnisotropy;
  96. [Tooltip("Kinetic energy below which particle positions arent updated. Energy values are mass-normalized, so all particles in the solver have the same threshold.")]
  97. public float sleepThreshold;
  98. public SolverParameters(Interpolation interpolation, Vector4 gravity){
  99. this.mode = Mode.Mode3D;
  100. this.gravity = gravity;
  101. this.interpolation = interpolation;
  102. damping = 0;
  103. maxAnisotropy = 3;
  104. sleepThreshold = 0.001f;
  105. }
  106. }
  107. [Serializable]
  108. public struct ConstraintParameters{
  109. public enum EvaluationOrder
  110. {
  111. Sequential,
  112. Parallel
  113. };
  114. [Tooltip("Order in which constraints are evaluated. SEQUENTIAL converges faster but is not very stable. PARALLEL is very stable but converges slowly, requiring more iterations to achieve the same result.")]
  115. public EvaluationOrder evaluationOrder; /**< Constraint evaluation order.*/
  116. [Tooltip("Number of relaxation iterations performed by the constraint solver. A low number of iterations will perform better, but be less accurate.")]
  117. public int iterations; /**< Amount of solver iterations per step for this constraint group.*/
  118. [Tooltip("Over (or under if < 1) relaxation factor used. At 1, no overrelaxation is performed. At 2, constraints double their relaxation rate. High values reduce stability but improve convergence.")]
  119. [Range(0.1f,2)]
  120. public float SORFactor; /**< Sucessive over-relaxation factor for parallel evaluation order.*/
  121. [Tooltip("Whether this constraint group is solved or not.")]
  122. [MarshalAs(UnmanagedType.I1)]
  123. public bool enabled;
  124. public ConstraintParameters(bool enabled, EvaluationOrder order, int iterations){
  125. this.enabled = enabled;
  126. this.iterations = iterations;
  127. this.evaluationOrder = order;
  128. this.SORFactor = 1;
  129. }
  130. }
  131. // In this particular case, size is forced to 112 bytes to ensure 16 byte memory alignment needed by Oni.
  132. [StructLayout(LayoutKind.Sequential, Size = 112)]
  133. public struct Contact{
  134. public Vector4 point; /**< Speculative point of contact. */
  135. public Vector4 normal; /**< Normal direction. */
  136. public Vector4 tangent; /**< Tangent direction. */
  137. public Vector4 bitangent; /**< Bitangent direction. */
  138. public float distance; /** distance between both colliding entities at the beginning of the timestep.*/
  139. public float normalImpulse;
  140. public float tangentImpulse;
  141. public float bitangentImpulse;
  142. public float stickImpulse;
  143. public int particle; /** particle index*/
  144. public int other; /** particle or rigidbody index*/
  145. }
  146. public struct BoneWeights
  147. {
  148. public int bone0;
  149. public int bone1;
  150. public int bone2;
  151. public int bone3;
  152. public float weight0;
  153. public float weight1;
  154. public float weight2;
  155. public float weight3;
  156. public BoneWeights(BoneWeight weight){
  157. bone0 = weight.boneIndex0;
  158. bone1 = weight.boneIndex1;
  159. bone2 = weight.boneIndex2;
  160. bone3 = weight.boneIndex3;
  161. weight0 = weight.weight0;
  162. weight1 = weight.weight1;
  163. weight2 = weight.weight2;
  164. weight3 = weight.weight3;
  165. }
  166. }
  167. [Serializable]
  168. public struct Rigidbody{
  169. public Quaternion rotation;
  170. public Vector3 linearVelocity;
  171. public Vector3 angularVelocity;
  172. public Vector3 centerOfMass;
  173. public Vector3 inertiaTensor;
  174. public float inverseMass;
  175. public void Set(UnityEngine.Rigidbody source, bool kinematicForParticles){
  176. bool kinematic = !Application.isPlaying || source.isKinematic || kinematicForParticles;
  177. rotation = source.rotation;
  178. linearVelocity = kinematicForParticles ? Vector3.zero : source.velocity;
  179. angularVelocity = kinematicForParticles ? Vector3.zero : source.angularVelocity;
  180. // center of mass in unity is affected by local rotation and position, but not scale. We need it expressed in world space:
  181. centerOfMass = source.transform.position + source.transform.rotation * source.centerOfMass;
  182. Vector3 invTensor = new Vector3((source.constraints & RigidbodyConstraints.FreezeRotationX) != 0?0:1/source.inertiaTensor.x,
  183. (source.constraints & RigidbodyConstraints.FreezeRotationY) != 0?0:1/source.inertiaTensor.y,
  184. (source.constraints & RigidbodyConstraints.FreezeRotationZ) != 0?0:1/source.inertiaTensor.z);
  185. // the inertia tensor is a diagonal matrix (Vector3) because it is expressed in the space generated by the principal axes of rotation (inertiaTensorRotation).
  186. inertiaTensor = kinematic ? Vector3.zero : source.inertiaTensorRotation * invTensor;
  187. inverseMass = kinematic ? 0 : 1/source.mass;
  188. }
  189. public void Set(UnityEngine.Rigidbody2D source, bool kinematicForParticles){
  190. bool kinematic = !Application.isPlaying || source.isKinematic || kinematicForParticles;
  191. rotation = Quaternion.AngleAxis(source.rotation,Vector3.forward);
  192. linearVelocity = source.velocity;
  193. // For some weird reason, in 2D angular velocity is measured in *degrees* per second,
  194. // instead of radians. Seriously Unity, WTF??
  195. angularVelocity = new Vector4(0,0,source.angularVelocity * Mathf.Deg2Rad,0);
  196. // center of mass in unity is affected by local rotation and poistion, but not scale. We need it expressed in world space:
  197. centerOfMass = source.transform.position + source.transform.rotation * source.centerOfMass;
  198. inertiaTensor = kinematic ? Vector3.zero : new Vector3(0,0,(source.constraints & RigidbodyConstraints2D.FreezeRotation) != 0?0:1/source.inertia);
  199. inverseMass = kinematic ? 0 : 1/source.mass;
  200. }
  201. }
  202. [Serializable]
  203. public struct RigidbodyVelocities{
  204. public Vector3 linearVelocity;
  205. public Vector3 angularVelocity;
  206. }
  207. [Serializable]
  208. public struct Collider{
  209. public Quaternion rotation;
  210. public Vector3 translation;
  211. public Vector3 scale;
  212. public Vector3 boundsMin;
  213. public Vector3 boundsMax;
  214. public int id;
  215. public float contactOffset;
  216. public int collisionGroup;
  217. [MarshalAs(UnmanagedType.I1)]
  218. public bool trigger;
  219. public void Set(UnityEngine.Collider source, int phase, float thickness){
  220. boundsMin = source.bounds.min - Vector3.one*(thickness + source.contactOffset);
  221. boundsMax = source.bounds.max + Vector3.one*(thickness + source.contactOffset);
  222. translation = source.transform.position;
  223. rotation = source.transform.rotation;
  224. scale = source.transform.lossyScale;
  225. contactOffset = thickness;
  226. this.collisionGroup = phase;
  227. this.trigger = source.isTrigger;
  228. this.id = source.GetInstanceID();
  229. }
  230. public void Set(UnityEngine.Collider2D source, int phase, float thickness){
  231. boundsMin = source.bounds.min - Vector3.one * (thickness + 0.01f); //allow some room for contacts to be generated before penetration.
  232. boundsMax = source.bounds.max + Vector3.one * (thickness + 0.01f);
  233. translation = source.transform.position;
  234. rotation = source.transform.rotation;
  235. scale = source.transform.lossyScale;
  236. contactOffset = thickness;
  237. this.collisionGroup = phase;
  238. this.trigger = source.isTrigger;
  239. this.id = source.GetInstanceID();
  240. }
  241. }
  242. [Serializable]
  243. public struct Shape{
  244. public Vector3 center;
  245. public Vector3 size;
  246. public IntPtr data;
  247. public IntPtr indices;
  248. public int dataCount;
  249. public int indexCount;
  250. public int resolutionU;
  251. public int resolutionV;
  252. [MarshalAs(UnmanagedType.I1)]
  253. public bool is2D;
  254. public void Set(Vector3 center, float radius){ // sphere
  255. this.center = center;
  256. this.size = Vector3.one * radius;
  257. }
  258. public void Set(Vector3 center, Vector3 size){ // box
  259. this.center = center;
  260. this.size = size;
  261. }
  262. public void Set(Vector3 center, float radius, float height, int direction){ // capsule
  263. this.center = center;
  264. this.size = new Vector3(radius,height,direction);
  265. }
  266. public void Set(Vector3 size, int resolutionU, int resolutionV, IntPtr data){ // terrain
  267. this.size = size;
  268. this.resolutionU = resolutionU;
  269. this.resolutionV = resolutionV;
  270. this.data = data;
  271. this.dataCount = resolutionU * resolutionV;
  272. }
  273. public void Set(IntPtr data, IntPtr indices, int dataCount, int indicesCount){ // mesh
  274. this.data = data;
  275. this.indices = indices;
  276. this.dataCount = dataCount;
  277. this.indexCount = indicesCount;
  278. }
  279. }
  280. [Serializable]
  281. public struct CollisionMaterial{
  282. public float friction;
  283. public float stickiness;
  284. public float stickDistance;
  285. public MaterialCombineMode frictionCombine;
  286. public MaterialCombineMode stickinessCombine;
  287. }
  288. [Serializable]
  289. public struct ElastoplasticMaterial{
  290. public float stiffness;
  291. public float plasticYield;
  292. public float plasticCreep;
  293. public float plasticRecovery;
  294. public float maxDeformation;
  295. public ElastoplasticMaterial(float stiffness, float plasticYield, float plasticCreep, float plasticRecovery, float maxDeformation){
  296. this.stiffness = stiffness;
  297. this.plasticYield = plasticYield;
  298. this.plasticCreep = plasticCreep;
  299. this.plasticRecovery = plasticRecovery;
  300. this.maxDeformation = maxDeformation;
  301. }
  302. }
  303. [Serializable]
  304. [StructLayout(LayoutKind.Sequential, Size = 64)] // The last member is an int, so there are 12 bytes left at the end. We must ensure 64 bytes for correct array alignment. Check on everyone!!!
  305. public struct DFNode{
  306. public Vector4 distancesA;
  307. public Vector4 distancesB;
  308. public Vector4 center;
  309. public int firstChild;
  310. }
  311. [Serializable]
  312. public struct HalfEdge{
  313. public int index;
  314. public int indexInFace;
  315. public int face;
  316. public int nextHalfEdge;
  317. public int pair;
  318. public int endVertex;
  319. public HalfEdge(int index){
  320. this.index = index;
  321. indexInFace = -1;
  322. face = -1;
  323. nextHalfEdge = -1;
  324. pair = -1;
  325. endVertex = -1;
  326. }
  327. }
  328. [Serializable]
  329. public struct Vertex{
  330. public int index;
  331. public int halfEdge;
  332. public Vector3 position;
  333. public Vertex(Vector3 position, int index, int halfEdge){
  334. this.index = index;
  335. this.halfEdge = halfEdge;
  336. this.position = position;
  337. }
  338. }
  339. [Serializable]
  340. public struct Face{
  341. public int index;
  342. public int halfEdge;
  343. public Face(int index){
  344. this.index = index;
  345. halfEdge = -1;
  346. }
  347. }
  348. [Serializable]
  349. public struct MeshInformation{
  350. public float volume;
  351. public float area;
  352. public int borderEdgeCount;
  353. [MarshalAs(UnmanagedType.I1)]
  354. public bool closed;
  355. [MarshalAs(UnmanagedType.I1)]
  356. public bool nonManifold;
  357. }
  358. public static GCHandle PinMemory(object data){
  359. return GCHandle.Alloc(data, GCHandleType.Pinned);
  360. }
  361. public static void UnpinMemory(GCHandle handle){
  362. if (handle.IsAllocated)
  363. handle.Free();
  364. }
  365. #if (UNITY_IOS && !UNITY_EDITOR)
  366. const string LIBNAME = "__Internal";
  367. #elif ((UNITY_ANDROID || UNITY_STANDALONE_LINUX) && !UNITY_EDITOR)
  368. const string LIBNAME = "Oni";
  369. #else
  370. const string LIBNAME = "libOni";
  371. #endif
  372. [DllImport (LIBNAME)]
  373. public static extern IntPtr CreateCollider();
  374. [DllImport (LIBNAME)]
  375. public static extern void DestroyCollider(IntPtr collider);
  376. [DllImport (LIBNAME)]
  377. public static extern IntPtr CreateShape(ShapeType shapeType);
  378. [DllImport (LIBNAME)]
  379. public static extern void DestroyShape(IntPtr shape);
  380. [DllImport (LIBNAME)]
  381. public static extern IntPtr CreateRigidbody();
  382. [DllImport (LIBNAME)]
  383. public static extern void DestroyRigidbody(IntPtr rigidbody);
  384. [DllImport (LIBNAME)]
  385. public static extern void UpdateCollider(IntPtr collider, ref Oni.Collider adaptor);
  386. [DllImport (LIBNAME)]
  387. public static extern void UpdateShape(IntPtr shape, ref Oni.Shape adaptor);
  388. [DllImport (LIBNAME)]
  389. public static extern void UpdateRigidbody(IntPtr rigidbody, ref Oni.Rigidbody adaptor);
  390. [DllImport (LIBNAME)]
  391. public static extern void GetRigidbodyVelocity(IntPtr rigidbody, ref RigidbodyVelocities velocities);
  392. [DllImport (LIBNAME)]
  393. public static extern IntPtr CreateDistanceField();
  394. [DllImport (LIBNAME)]
  395. public static extern void DestroyDistanceField(IntPtr df);
  396. [DllImport (LIBNAME)]
  397. public static extern void StartBuildingDistanceField(IntPtr df, float maxError, int maxDepth, Vector3[] vertexPos, int[] triIndices, int numVertices, int numTriangles);
  398. [DllImport (LIBNAME)]
  399. public static extern bool ContinueBuildingDistanceField(IntPtr df);
  400. [DllImport (LIBNAME)]
  401. public static extern float SampleDistanceField(IntPtr df, float x, float y, float z);
  402. [DllImport (LIBNAME)]
  403. public static extern int GetDistanceFieldNodeCount(IntPtr df);
  404. [DllImport (LIBNAME)]
  405. public static extern void GetDistanceFieldNodes(IntPtr df, DFNode[] nodes);
  406. [DllImport (LIBNAME)]
  407. public static extern void SetDistanceFieldNodes(IntPtr df, DFNode[] nodes, int num);
  408. [DllImport (LIBNAME)]
  409. public static extern void SetShapeDistanceField(IntPtr shape, IntPtr distanceField);
  410. [DllImport (LIBNAME)]
  411. public static extern void SetColliderShape(IntPtr collider, IntPtr shape);
  412. [DllImport (LIBNAME)]
  413. public static extern void SetColliderRigidbody(IntPtr collider, IntPtr rigidbody);
  414. [DllImport (LIBNAME)]
  415. public static extern void SetColliderMaterial(IntPtr collider, IntPtr material);
  416. [DllImport (LIBNAME)]
  417. public static extern IntPtr CreateCollisionMaterial();
  418. [DllImport (LIBNAME)]
  419. public static extern void DestroyCollisionMaterial(IntPtr material);
  420. [DllImport (LIBNAME)]
  421. public static extern void UpdateCollisionMaterial(IntPtr material, ref CollisionMaterial adaptor);
  422. [DllImport (LIBNAME)]
  423. public static extern IntPtr CreateSolver(int maxParticles);
  424. [DllImport (LIBNAME)]
  425. public static extern void DestroySolver(IntPtr solver);
  426. [DllImport (LIBNAME)]
  427. public static extern void InitializeFrame(IntPtr solver,ref Vector4 translation, ref Vector4 scale, ref Quaternion rotation);
  428. [DllImport (LIBNAME)]
  429. public static extern void UpdateFrame(IntPtr solver,ref Vector4 translation, ref Vector4 scale, ref Quaternion rotation, float dt);
  430. [DllImport (LIBNAME)]
  431. public static extern void ApplyFrame(IntPtr solver,float linearVelocityScale, float angularVelocityScale, float linearInertiaScale, float angularInertiaScale, float dt);
  432. [DllImport (LIBNAME)]
  433. public static extern void AddCollider(IntPtr collider);
  434. [DllImport (LIBNAME)]
  435. public static extern void RemoveCollider(IntPtr collider);
  436. [DllImport (LIBNAME)]
  437. public static extern void RecalculateInertiaTensors(IntPtr collider);
  438. [DllImport (LIBNAME)]
  439. public static extern void GetBounds(IntPtr solver, ref Vector3 min, ref Vector3 max);
  440. [DllImport (LIBNAME)]
  441. public static extern int GetParticleGridSize(IntPtr solver);
  442. [DllImport (LIBNAME)]
  443. public static extern void GetParticleGrid(IntPtr solver, GridCell[] cells);
  444. [DllImport (LIBNAME)]
  445. public static extern void SetSolverParameters(IntPtr solver, ref SolverParameters parameters);
  446. [DllImport (LIBNAME)]
  447. public static extern void GetSolverParameters(IntPtr solver, ref SolverParameters parameters);
  448. [DllImport (LIBNAME)]
  449. public static extern int SetActiveParticles(IntPtr solver, int[] active, int num);
  450. [DllImport (LIBNAME)]
  451. public static extern void AddSimulationTime(IntPtr solver, float time);
  452. [DllImport (LIBNAME)]
  453. public static extern void ResetSimulationTime(IntPtr solver);
  454. [DllImport (LIBNAME)]
  455. public static extern void UpdateSolver(IntPtr solver, uint substeps, float substep_dt);
  456. [DllImport (LIBNAME)]
  457. public static extern void ApplyPositionInterpolation(IntPtr solver, uint substeps, float substep_dt);
  458. [DllImport (LIBNAME)]
  459. public static extern void UpdateSkeletalAnimation(IntPtr solver);
  460. [DllImport (LIBNAME)]
  461. public static extern int GetConstraintCount(IntPtr solver, int type);
  462. [DllImport (LIBNAME)]
  463. public static extern void GetActiveConstraintIndices(IntPtr solver, int[] indices, int num , int type);
  464. [DllImport (LIBNAME)]
  465. public static extern void SetRenderableParticlePositions(IntPtr solver, IntPtr positions);
  466. [DllImport (LIBNAME)]
  467. public static extern void SetParticlePhases(IntPtr solver, IntPtr phases);
  468. [DllImport (LIBNAME)]
  469. public static extern void SetParticlePositions(IntPtr solver, IntPtr positions);
  470. [DllImport (LIBNAME)]
  471. public static extern void SetParticlePreviousPositions(IntPtr solver, IntPtr prevPositions);
  472. [DllImport (LIBNAME)]
  473. public static extern void SetParticleStartPositions(IntPtr solver, IntPtr prevPositions);
  474. [DllImport (LIBNAME)]
  475. public static extern void SetParticleOrientations(IntPtr solver, IntPtr orientations);
  476. [DllImport (LIBNAME)]
  477. public static extern void SetParticlePreviousOrientations(IntPtr solver, IntPtr prevOrientations);
  478. [DllImport (LIBNAME)]
  479. public static extern void SetParticleStartOrientations(IntPtr solver, IntPtr prevOrientations);
  480. [DllImport (LIBNAME)]
  481. public static extern void SetRenderableParticleOrientations(IntPtr solver, IntPtr orientations);
  482. [DllImport (LIBNAME)]
  483. public static extern void SetParticleInverseMasses(IntPtr solver, IntPtr invMasses);
  484. [DllImport (LIBNAME)]
  485. public static extern void SetParticleInverseRotationalMasses(IntPtr solver, IntPtr invRotMasses);
  486. [DllImport (LIBNAME)]
  487. public static extern void SetParticlePrincipalRadii(IntPtr solver, IntPtr principalRadii);
  488. [DllImport (LIBNAME)]
  489. public static extern void SetParticleVelocities(IntPtr solver, IntPtr velocities);
  490. [DllImport (LIBNAME)]
  491. public static extern void SetParticleAngularVelocities(IntPtr solver, IntPtr angularVelocities);
  492. [DllImport (LIBNAME)]
  493. public static extern void SetParticleExternalForces(IntPtr solver, IntPtr forces);
  494. [DllImport (LIBNAME)]
  495. public static extern void SetParticleExternalTorques(IntPtr solver, IntPtr torques);
  496. [DllImport (LIBNAME)]
  497. public static extern void SetParticleWinds(IntPtr solver, IntPtr winds);
  498. [DllImport (LIBNAME)]
  499. public static extern void SetParticlePositionDeltas(IntPtr solver, IntPtr deltas);
  500. [DllImport (LIBNAME)]
  501. public static extern void SetParticleOrientationDeltas(IntPtr solver, IntPtr deltas);
  502. [DllImport (LIBNAME)]
  503. public static extern void SetParticlePositionConstraintCounts(IntPtr solver, IntPtr counts);
  504. [DllImport (LIBNAME)]
  505. public static extern void SetParticleOrientationConstraintCounts(IntPtr solver, IntPtr counts);
  506. [DllImport (LIBNAME)]
  507. public static extern void SetParticleNormals(IntPtr solver, IntPtr normals);
  508. [DllImport (LIBNAME)]
  509. public static extern void SetParticleInverseInertiaTensors(IntPtr solver, IntPtr tensors);
  510. [DllImport (LIBNAME)]
  511. public static extern void SetParticleSmoothingRadii(IntPtr solver, IntPtr radii);
  512. [DllImport (LIBNAME)]
  513. public static extern void SetParticleBuoyancy(IntPtr solver, IntPtr buoyancy);
  514. [DllImport (LIBNAME)]
  515. public static extern void SetParticleRestDensities(IntPtr solver, IntPtr rest_densities);
  516. [DllImport (LIBNAME)]
  517. public static extern void SetParticleViscosities(IntPtr solver, IntPtr viscosities);
  518. [DllImport (LIBNAME)]
  519. public static extern void SetParticleSurfaceTension(IntPtr solver, IntPtr surface_tension);
  520. [DllImport (LIBNAME)]
  521. public static extern void SetParticleVorticityConfinement(IntPtr solver, IntPtr vort_confinement);
  522. [DllImport (LIBNAME)]
  523. public static extern void SetParticleAtmosphericDragPressure(IntPtr solver, IntPtr atmospheric_drag, IntPtr atmospheric_pressure);
  524. [DllImport (LIBNAME)]
  525. public static extern void SetParticleDiffusion(IntPtr solver, IntPtr diffusion);
  526. [DllImport (LIBNAME)]
  527. public static extern void SetParticleVorticities(IntPtr solver, IntPtr vorticities);
  528. [DllImport (LIBNAME)]
  529. public static extern void SetParticleFluidData(IntPtr solver, IntPtr fluidData);
  530. [DllImport (LIBNAME)]
  531. public static extern void SetParticleUserData(IntPtr solver, IntPtr userData);
  532. [DllImport (LIBNAME)]
  533. public static extern void SetParticleAnisotropies(IntPtr solver, IntPtr anisotropies);
  534. [DllImport (LIBNAME)]
  535. public static extern int GetDeformableTriangleCount(IntPtr solver);
  536. [DllImport (LIBNAME)]
  537. public static extern void SetDeformableTriangles(IntPtr solver, int[] indices, int num, int destOffset);
  538. [DllImport (LIBNAME)]
  539. public static extern int RemoveDeformableTriangles(IntPtr solver, int num, int sourceOffset);
  540. [DllImport (LIBNAME)]
  541. public static extern void SetConstraintGroupParameters(IntPtr solver, int type, ref ConstraintParameters parameters);
  542. [DllImport (LIBNAME)]
  543. public static extern void GetConstraintGroupParameters(IntPtr solver, int type, ref ConstraintParameters parameters);
  544. [DllImport (LIBNAME)]
  545. public static extern void SetCollisionMaterials(IntPtr solver, IntPtr[] materials, int[] indices, int num);
  546. [DllImport (LIBNAME)]
  547. public static extern void SetRestPositions(IntPtr solver, IntPtr restPositions);
  548. [DllImport (LIBNAME)]
  549. public static extern void SetRestOrientations(IntPtr solver, IntPtr restOrientations);
  550. [DllImport (LIBNAME)]
  551. public static extern IntPtr CreateDeformableMesh(IntPtr solver,
  552. IntPtr halfEdge,
  553. IntPtr skinConstraintBatch,
  554. [MarshalAs(UnmanagedType.LPArray, SizeConst=16)] float[] worldToLocal,
  555. IntPtr particleIndices,
  556. int vertexCapacity,
  557. int vertexCount);
  558. [DllImport (LIBNAME)]
  559. public static extern void DestroyDeformableMesh(IntPtr solver, IntPtr mesh);
  560. [DllImport (LIBNAME)]
  561. public static extern bool TearDeformableMeshAtVertex(IntPtr mesh,int vertexIndex,
  562. ref Vector3 planePoint,
  563. ref Vector3 planeNormal,
  564. int[] updated_edges,
  565. ref int num_edges);
  566. [DllImport (LIBNAME)]
  567. public static extern void SetDeformableMeshTBNUpdate(IntPtr mesh,NormalsUpdate normalsUpdate, [MarshalAs(UnmanagedType.I1)]bool skinTangents);
  568. [DllImport (LIBNAME)]
  569. public static extern void SetDeformableMeshTransform(IntPtr mesh,[MarshalAs(UnmanagedType.LPArray, SizeConst=16)] float[] worldToLocal);
  570. [DllImport (LIBNAME)]
  571. public static extern void SetDeformableMeshSkinMap(IntPtr mesh, IntPtr sourceMesh, IntPtr triangleSkinMap);
  572. [DllImport (LIBNAME)]
  573. public static extern void SetDeformableMeshParticleIndices(IntPtr mesh, IntPtr particleIndices);
  574. [DllImport (LIBNAME)]
  575. public static extern void SetDeformableMeshData(IntPtr mesh,IntPtr triangles,
  576. IntPtr vertices,
  577. IntPtr normals,
  578. IntPtr tangents,
  579. IntPtr colors,
  580. IntPtr uv1,
  581. IntPtr uv2,
  582. IntPtr uv3,
  583. IntPtr uv4);
  584. [DllImport (LIBNAME)]
  585. public static extern void SetDeformableMeshAnimationData(IntPtr mesh,float[] bindPoses,BoneWeights[] weights, int numBones);
  586. [DllImport (LIBNAME)]
  587. public static extern void SetDeformableMeshBoneTransforms(IntPtr mesh,float[] boneTransforms);
  588. [DllImport (LIBNAME)]
  589. public static extern void ForceDeformableMeshSkeletalSkinning(IntPtr mesh);
  590. [DllImport (LIBNAME)]
  591. public static extern IntPtr CreateBatch(int type, [MarshalAs(UnmanagedType.I1)]bool cooked);
  592. [DllImport (LIBNAME)]
  593. public static extern void DestroyBatch(IntPtr batch);
  594. [DllImport (LIBNAME)]
  595. public static extern IntPtr AddBatch(IntPtr solver, IntPtr batch, [MarshalAs(UnmanagedType.I1)]bool sharesParticles);
  596. [DllImport (LIBNAME)]
  597. public static extern void RemoveBatch(IntPtr solver, IntPtr batch);
  598. [DllImport (LIBNAME)]
  599. public static extern bool EnableBatch(IntPtr batch, [MarshalAs(UnmanagedType.I1)]bool enabled);
  600. [DllImport (LIBNAME)]
  601. public static extern int GetBatchConstraintCount(IntPtr batch);
  602. [DllImport (LIBNAME)]
  603. public static extern int GetBatchConstraintForces(IntPtr batch, float[] forces, int num, int destOffset);
  604. [DllImport (LIBNAME)]
  605. public static extern int GetBatchPhaseCount(IntPtr batch);
  606. [DllImport (LIBNAME)]
  607. public static extern void GetBatchPhaseSizes(IntPtr batch, int[] phaseSizes);
  608. [DllImport (LIBNAME)]
  609. public static extern void SetBatchPhaseSizes(IntPtr batch, int[] phaseSizes, int num);
  610. [DllImport (LIBNAME)]
  611. public static extern bool CookBatch(IntPtr batch);
  612. [DllImport (LIBNAME)]
  613. public static extern int SetActiveConstraints(IntPtr batch, int[] active, int num);
  614. [DllImport (LIBNAME)]
  615. public static extern void SetDistanceConstraints(IntPtr batch, int[] indices,
  616. float[] restLengths,
  617. Vector2[] stiffnesses,
  618. int num);
  619. [DllImport (LIBNAME)]
  620. public static extern void GetDistanceConstraints(IntPtr batch, int[] indices,
  621. float[] restLengths,
  622. Vector2[] stiffnesses);
  623. [DllImport (LIBNAME)]
  624. public static extern void SetBendingConstraints(IntPtr batch, int[] indices,
  625. float[] restBends,
  626. Vector2[] bendingStiffnesses,
  627. int num);
  628. [DllImport (LIBNAME)]
  629. public static extern void GetBendingConstraints(IntPtr batch, int[] indices,
  630. float[] restBends,
  631. Vector2[] bendingStiffnesses);
  632. [DllImport (LIBNAME)]
  633. public static extern void SetSkinConstraints(IntPtr batch,
  634. int[] indices,
  635. Vector4[] points,
  636. Vector4[] normals,
  637. float[] radiiBackstops,
  638. float[] stiffnesses,
  639. int num);
  640. [DllImport (LIBNAME)]
  641. public static extern void GetSkinConstraints(IntPtr batch,
  642. int[] indices,
  643. Vector4[] points,
  644. Vector4[] normals,
  645. float[] radiiBackstops,
  646. float[] stiffnesses);
  647. [DllImport (LIBNAME)]
  648. public static extern void SetAerodynamicConstraints(IntPtr batch,
  649. int[] particleIndices,
  650. float[] aerodynamicCoeffs,
  651. int num);
  652. [DllImport (LIBNAME)]
  653. public static extern void SetVolumeConstraints(IntPtr batch,
  654. int[] triangleIndices,
  655. int[] firstTriangle,
  656. int[] numTriangles,
  657. float[] restVolumes,
  658. Vector2[] pressureStiffnesses,
  659. int num);
  660. [DllImport (LIBNAME)]
  661. public static extern void SetShapeMatchingConstraints(IntPtr batch,
  662. int[] shapeIndices,
  663. int[] firstIndex,
  664. int[] numIndices,
  665. int[] explicitGroup,
  666. ElastoplasticMaterial[] shapeMaterialParameters,
  667. IntPtr restComs,
  668. IntPtr coms,
  669. IntPtr orientations,
  670. int num);
  671. [DllImport (LIBNAME)]
  672. public static extern void CalculateRestShapeMatching(IntPtr solver, IntPtr batch);
  673. [DllImport (LIBNAME)]
  674. public static extern void SetStretchShearConstraints(IntPtr batch,
  675. int[] particleIndices,
  676. int[] orientationIndices,
  677. float[] restLengths,
  678. Vector3[] stiffnesses,
  679. int num);
  680. [DllImport (LIBNAME)]
  681. public static extern void SetBendTwistConstraints(IntPtr batch,
  682. int[] orientationIndices,
  683. Quaternion[] restDarboux,
  684. Vector3[] stiffnesses,
  685. int num);
  686. [DllImport (LIBNAME)]
  687. public static extern void SetTetherConstraints(IntPtr batch,
  688. int[] indices,
  689. Vector2[] maxLenghtsScales,
  690. float[] stiffnesses,
  691. int num);
  692. [DllImport (LIBNAME)]
  693. public static extern void GetTetherConstraints(IntPtr batch, int[] indices,
  694. Vector2[] maxLenghtsScales,
  695. float[] stiffnesses);
  696. [DllImport (LIBNAME)]
  697. public static extern void SetPinConstraints(IntPtr batch,
  698. int[] indices,
  699. Vector4[] pinOffsets,
  700. Quaternion[] restDarboux,
  701. IntPtr[] colliders,
  702. float[] stiffnesses,
  703. int num);
  704. [DllImport (LIBNAME)]
  705. public static extern void SetStitchConstraints(IntPtr batch,
  706. int[] indices,
  707. float[] stiffnesses,
  708. int num);
  709. [DllImport (LIBNAME)]
  710. public static extern void SetChainConstraints(IntPtr batch,
  711. int[] indices,
  712. Vector2[] lengths,
  713. int[] firstIndex,
  714. int[] numIndex,
  715. int num);
  716. [DllImport (LIBNAME)]
  717. public static extern void GetCollisionContacts(IntPtr solver, Contact[] contacts, int n);
  718. [DllImport (LIBNAME)]
  719. public static extern void ClearDiffuseParticles(IntPtr solver);
  720. [DllImport (LIBNAME)]
  721. public static extern int SetDiffuseParticles(IntPtr solver, Vector4[] positions, int num);
  722. [DllImport (LIBNAME)]
  723. public static extern int GetDiffuseParticleVelocities(IntPtr solver, Vector4[] velocities, int num, int sourceOffset);
  724. [DllImport (LIBNAME)]
  725. public static extern IntPtr CreateHalfEdgeMesh();
  726. [DllImport (LIBNAME)]
  727. public static extern void DestroyHalfEdgeMesh(IntPtr mesh);
  728. [DllImport (LIBNAME)]
  729. public static extern void SetVertices(IntPtr mesh, IntPtr vertices, int n);
  730. [DllImport (LIBNAME)]
  731. public static extern void SetHalfEdges(IntPtr mesh, IntPtr halfedges, int n);
  732. [DllImport (LIBNAME)]
  733. public static extern void SetFaces(IntPtr mesh, IntPtr faces, int n);
  734. [DllImport (LIBNAME)]
  735. public static extern void SetNormals(IntPtr mesh, IntPtr normals);
  736. [DllImport (LIBNAME)]
  737. public static extern void SetTangents(IntPtr mesh, IntPtr tangents);
  738. [DllImport (LIBNAME)]
  739. public static extern void SetInverseOrientations(IntPtr mesh, IntPtr orientations);
  740. [DllImport (LIBNAME)]
  741. public static extern void SetVisualMap(IntPtr mesh, IntPtr map);
  742. [DllImport (LIBNAME)]
  743. public static extern int GetVertexCount(IntPtr mesh);
  744. [DllImport (LIBNAME)]
  745. public static extern int GetHalfEdgeCount(IntPtr mesh);
  746. [DllImport (LIBNAME)]
  747. public static extern int GetFaceCount(IntPtr mesh);
  748. [DllImport (LIBNAME)]
  749. public static extern int GetHalfEdgeMeshInfo(IntPtr mesh, ref MeshInformation meshInfo);
  750. [DllImport (LIBNAME)]
  751. public static extern void CalculatePrimitiveCounts(IntPtr mesh, Vector3[] vertices, int[] triangles, int vertexCount, int triangleCount);
  752. [DllImport (LIBNAME)]
  753. public static extern void Generate(IntPtr mesh, Vector3[] vertices, int[] triangles, int vertexCount, int triangleCount, ref Vector3 scale);
  754. [DllImport (LIBNAME)]
  755. public static extern void GetPointCloudAnisotropy(Vector3[] points, int count, float maxAnisotropy, float radius, ref Vector3 hintNormal, ref Vector3 centroid, ref Quaternion orientation, ref Vector3 principalValues);
  756. [DllImport (LIBNAME)]
  757. public static extern int MakePhase(int group, ParticlePhase flags);
  758. [DllImport (LIBNAME)]
  759. public static extern int GetGroupFromPhase(int phase);
  760. [DllImport (LIBNAME)]
  761. public static extern float BendingConstraintRest(float[] constraintCoordinates);
  762. [DllImport (LIBNAME)]
  763. public static extern IntPtr CreateTriangleSkinMap();
  764. [DllImport (LIBNAME)]
  765. public static extern void DestroyTriangleSkinMap(IntPtr skinmap);
  766. [DllImport (LIBNAME)]
  767. public static extern void Bind(IntPtr skinmap, IntPtr sourcemesh, IntPtr targetmesh, uint[] sourceMasterFlags, uint[] targetSlaveFlags);
  768. [DllImport (LIBNAME)]
  769. public static extern int GetSkinnedVertexCount(IntPtr skinmap);
  770. [DllImport (LIBNAME)]
  771. public static extern void GetSkinInfo(IntPtr skinmap,
  772. int[] skinIndices,
  773. int[] sourceTriIndices,
  774. Vector3[] baryPositions,
  775. Vector3[] baryNormals,
  776. Vector3[] baryTangents);
  777. [DllImport (LIBNAME)]
  778. public static extern void SetSkinInfo(IntPtr skinmap,
  779. int[] skinIndices,
  780. int[] sourceTriIndices,
  781. Vector3[] baryPositions,
  782. Vector3[] baryNormals,
  783. Vector3[] baryTangents,
  784. int num);
  785. [DllImport (LIBNAME)]
  786. public static extern void WaitForAllTasks();
  787. [DllImport (LIBNAME)]
  788. public static extern void ClearTasks();
  789. [DllImport (LIBNAME)]
  790. public static extern int GetMaxSystemConcurrency();
  791. [DllImport (LIBNAME)]
  792. public static extern void SignalFrameStart();
  793. [DllImport (LIBNAME)]
  794. public static extern double SignalFrameEnd();
  795. [DllImport (LIBNAME)]
  796. public static extern void EnableProfiler([MarshalAs(UnmanagedType.I1)]bool cooked);
  797. [DllImport (LIBNAME)]
  798. public static extern int GetProfilingInfoCount();
  799. [DllImport (LIBNAME)]
  800. public static extern void GetProfilingInfo([Out] ProfileInfo[] info, int num);
  801. }