protected override void OnUpdate() { var output = World.GetOrCreateSystem <ConstraintGatherSystem>().GetOneWayOneDOFConstraintsInput(); var masses = GetComponentDataFromEntity <Mass>(); var positions = GetComponentDataFromEntity <Position>(); float dt = Time.DeltaTime; Entities .WithReadOnly(masses) .WithReadOnly(positions) .ForEach((Entity e, in LightTrackingJoint joint, in Position lightPos) => { float targetAngle = Ang.SignedAngleOf(positions[joint.toTrack].pos - lightPos.pos); float targetOffset = Ang.SignedDistance(angleFrom: lightPos.rot, angleTo: targetAngle); var manifold = new TargetAngularVelocityManifold { e = e, id = e.GetHashCode() ^ 291019149, softness = joint.trackSoftness, targetAngVel = TargetAngularVelocityManifold.AngVelForTargetOffset( offset: targetOffset, maxSpeed: joint.trackSpeed, dt: dt ) }; output.Add(new OneWayOneDOFConstraint(manifold, masses, dt)); }).Schedule();
public OneWayOneDOFConstraint(TargetAngularVelocityManifold m, Float3 M_inv, float dt) { e = m.e; id = m.id; this.M_inv = M_inv; constraint = new OneDOFConstraint <Float3>( J: new float3(0, 0, math.sign(m.targetAngVel)), M_inv: M_inv, bias: -math.abs(m.targetAngVel), softness: m.softness ); lambdaAccum = 0; }
public OneWayOneDOFConstraint(TargetAngularVelocityManifold m, ComponentDataFromEntity <Mass> masses, float dt) : this(m, masses[m.e].M_inv, dt) { }