Example #1
0
    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)
 {
 }