#ifndef INTEGRATION_INCLUDE #define INTEGRATION_INCLUDE #include "Quaternion.cginc" float4 IntegrateLinear(float4 position, float4 velocity, float dt) { return position + velocity * dt; } float4 DifferentiateLinear(float4 position, float4 prevPosition, float dt) { return (position - prevPosition) / dt; } quaternion AngularVelocityToSpinQuaternion(quaternion rotation, float4 angularVelocity, float dt) { quaternion delta = quaternion(angularVelocity.x, angularVelocity.y, angularVelocity.z, 0); return quaternion(0.5f * qmul(delta,rotation) * dt); } quaternion IntegrateAngular(quaternion rotation, float4 angularVelocity, float dt) { rotation += AngularVelocityToSpinQuaternion(rotation,angularVelocity, dt); return normalize(rotation); } float4 DifferentiateAngular(quaternion rotation, quaternion prevRotation, float dt) { quaternion deltaq = qmul(rotation, q_conj(prevRotation)); float s = deltaq.w >= 0 ? 1 : -1; return float4(s * deltaq.xyz * 2.0f / dt, 0); } #endif