_xiaofang/xiaofang/Assets/Obi/Scripts/Oni.cs
杨号敬 bcc74f0465 add
2024-12-18 02:18:45 +08:00

249 lines
8.1 KiB
C#

using UnityEngine;
using System;
using System.Collections;
using System.Runtime.InteropServices;
using Obi;
public static class Oni
{
public const int ConstraintTypeCount = 17;
public const int ColliderShapeTypeCount = 7;
public const int QueryTypeCount = 3;
public enum ConstraintType
{
Tether = 0,
Volume = 1,
Chain = 2,
Bending = 3,
Distance = 4,
ShapeMatching = 5,
BendTwist = 6,
StretchShear = 7,
Pin = 8,
ParticleCollision = 9,
Density = 10,
Collision = 11,
Skin = 12,
Aerodynamics = 13,
Stitch = 14,
ParticleFriction = 15,
Friction = 16
};
[Flags]
public enum RenderingSystemType
{
None = 0,
PathSmoother = 1 << 0,
ExtrudedRope = 1 << 1,
ChainRope = 1 << 2,
LineRope = 1 << 3,
MeshRope = 1 << 4,
Cloth = 1 << 5,
SkinnedCloth = 1 << 6,
TearableCloth = 1 << 7,
Softbody = 1 << 8,
Fluid = 1 << 9,
Particles = 1 << 10,
InstancedParticles = 1 << 11,
FoamParticles = 1 << 12,
AllSmoothedRopes = PathSmoother | ExtrudedRope | LineRope | MeshRope,
AllRopes = PathSmoother | ExtrudedRope | ChainRope | LineRope | MeshRope | Particles | InstancedParticles,
AllClothes = Cloth | SkinnedCloth | TearableCloth | Particles | InstancedParticles,
AllParticles = Fluid | Particles | InstancedParticles | FoamParticles
};
[Flags]
public enum SimplexType
{
None = 0,
Point = 1 << 0,
Edge = 1 << 1,
Triangle = 1 << 2,
All = ~0
};
public enum ShapeType
{
Sphere = 0,
Box = 1,
Capsule = 2,
Heightmap = 3,
TriangleMesh = 4,
EdgeMesh = 5,
SignedDistanceField = 6
}
public enum MaterialCombineMode
{
Average = 0,
Minimum = 1,
Multiply = 2,
Maximum = 3
}
[Serializable]
[StructLayout(LayoutKind.Sequential)]
public struct SolverParameters
{
public enum Interpolation
{
None,
Interpolate,
Extrapolate
};
public enum Mode
{
Mode3D,
Mode2D,
};
[Tooltip("In 2D mode, particles are simulated on the XY plane only. For use in conjunction with Unity's 2D mode.")]
public Mode mode;
[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.")]
public Interpolation interpolation;
[Tooltip("Simulation gravity expressed in local space.")]
public Vector3 gravity;
[Tooltip("Simulation wind expressed in local space.")]
public Vector3 ambientWind;
[Tooltip("Foam gravity scale.")]
[Range(-1, 3)]
public float foamGravityScale;
[Tooltip("Percentage of velocity lost per second, between 0% (0) and 100% (1).")]
[Range(0, 1)]
public float damping;
[Tooltip("Max ratio between a particle's longest and shortest axis. Use 1 for isotropic (completely round) particles.")]
[Range(1, 5)]
public float maxAnisotropy;
[Tooltip("Mass-normalized kinetic energy threshold below which particle positions aren't updated.")]
public float sleepThreshold;
[Tooltip("Maximum particle linear velocity.")]
public float maxVelocity;
[Tooltip("Maximum particle angular velocity.")]
public float maxAngularVelocity;
[Tooltip("Maximum distance between elements (simplices/colliders) for a contact to be generated.")]
public float collisionMargin;
[Tooltip("Maximum depenetration velocity applied to particles that start a frame inside an object. Low values ensure no 'explosive' collision resolution. Should be > 0 unless looking for non-physical effects.")]
public float maxDepenetration;
[Tooltip("Percentage of collider velocities used for continuous collision detection. Set to 0 for purely static collisions, set to 1 for pure continuous collisions.")]
[Range(0, 1)]
public float colliderCCD;
[Tooltip("Percentage of particle velocities used for continuous collision detection. Set to 0 for purely static collisions, set to 1 for pure continuous collisions.")]
[Range(0, 1)]
public float particleCCD;
[Tooltip("Percentage of shock propagation applied to particle-particle collisions. Useful for particle stacking.")]
[Range(0, 1)]
public float shockPropagation;
[Tooltip("Amount of iterations spent on convex optimization for surface collisions.")]
[Range(1, 32)]
public int surfaceCollisionIterations;
[Tooltip("Error threshold at which to stop convex optimization for surface collisions.")]
public float surfaceCollisionTolerance;
public SolverParameters(Interpolation interpolation, Vector4 gravity)
{
this.mode = Mode.Mode3D;
this.gravity = gravity;
this.ambientWind = Vector3.zero;
this.interpolation = interpolation;
foamGravityScale = 1;
damping = 0;
shockPropagation = 0;
surfaceCollisionIterations = 8;
surfaceCollisionTolerance = 0.005f;
maxAnisotropy = 3;
maxDepenetration = 10;
sleepThreshold = 0.0005f;
maxVelocity = 50.0f;
maxAngularVelocity = 20.0f;
collisionMargin = 0.02f;
colliderCCD = 1;
particleCCD = 0;
}
}
[Serializable]
public struct ConstraintParameters
{
public enum EvaluationOrder
{
Sequential,
Parallel
};
[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.")]
public EvaluationOrder evaluationOrder; /**< Constraint evaluation order.*/
[Tooltip("Number of relaxation iterations performed by the constraint solver. A low number of iterations will perform better, but be less accurate.")]
public int iterations; /**< Amount of solver iterations per step for this constraint group.*/
[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.")]
[Range(0.1f, 2)]
public float SORFactor; /**< Sucessive over-relaxation factor for parallel evaluation order.*/
[Tooltip("Whether this constraint group is solved or not.")]
[MarshalAs(UnmanagedType.I1)]
public bool enabled;
public ConstraintParameters(bool enabled, EvaluationOrder order, int iterations)
{
this.enabled = enabled;
this.iterations = iterations;
this.evaluationOrder = order;
this.SORFactor = 1;
}
}
[StructLayout(LayoutKind.Sequential)]
public struct ContactPair
{
public int bodyA; /** simplex index*/
public int bodyB; /** simplex or rigidbody index*/
}
[StructLayout(LayoutKind.Sequential)]
public struct Contact
{
public Vector4 pointA;
public Vector4 pointB; /**< Speculative point of contact. */
public Vector4 normal; /**< Normal direction. */
public Vector4 tangent; /**< Tangent direction. */
public float distance; /** distance between both colliding entities at the beginning of the timestep.*/
public float normalImpulse;
public float tangentImpulse;
public float bitangentImpulse;
public float stickImpulse;
public float rollingFrictionImpulse;
public int bodyA; /** simplex index*/
public int bodyB; /** simplex or rigidbody index*/
}
}