public void CollisionEnter(PhysXCollision col)  //Dies if collision of great enough velocity occurs
 {
     if (col.rigidBody != null && col.rigidBody.velocity.magnitude > 3)
     {
         Die();
     }
 }
Esempio n. 2
0
    public static void AddCollision(IntPtr pairHeader, IntPtr pairs, int pairCount, IntPtr self, bool isEnter, bool isStay, bool isExit)
    {
        PhysXCollision collision = PhysXCollision.GetCollision();

        collision.FromPhysXInternalCollision(pairHeader, pairs, pairCount, self, isEnter, isStay, isExit);
        ongoingCollisions.Add(collision);
    }
 public void CollisionEnter(PhysXCollision col)  //When hit at a certain velocity, the object will call Die()
 {
     if (col.rigidBody != null && col.rigidBody.velocity.magnitude > 3)
     {
         Die();
     }
 }
Esempio n. 4
0
    public void CollisionStay(PhysXCollision collision)
    {
        // float penCoefficientA = (penForMaxImpulseScale - penForUnitImpulseScale * maxImpulseScale) / (penForUnitImpulseScale * penForUnitImpulseScale * penForMaxImpulseScale - penForUnitImpulseScale * penForMaxImpulseScale * penForMaxImpulseScale);
        // float penCoefficientB = maxImpulseScale / penForMaxImpulseScale - penCoefficientA * penForMaxImpulseScale;
        if (collision.rigidBody != null)
        {
            velocity = (rigidBody.velocity - collision.rigidBody.velocity).magnitude;
        }
        else
        {
            velocity = rigidBody.velocity.magnitude;
        }
        velocity -= velocityOffset;
        if (velocity < 0)
        {
            velocity = 0;
        }


        float penExp = velocityScale / velocity;

        if (penExp > maxPenExp)
        {
            penExp = maxPenExp;
        }

        float penCoefficient = 1 / Mathf.Pow(penForUnitImpulseScale, penExp);

        for (int i = 0; i < collision.contactCount; i++)
        {
            PhysXContactPoint contactPoint = collision.GetContact(i);

            if (contactPoint.ownShape == collider.shape)
            {
                float penetration = -contactPoint.separation;
                if (penetration < 0)
                {
                    penetration = 0;
                }

                //Debug.Log("penetration: " + penetration);

                Vector3 impulse = contactPoint.impulse;
                // float impulseScale = penCoefficientA * penetration * penetration + penCoefficientB * penetration;
                float impulseScale = penCoefficient * Mathf.Pow(penetration, penExp);
                if (impulseScale > maxImpulseScale)
                {
                    impulseScale = maxImpulseScale;
                }
                impulse *= impulseScale;

                rigidBody.AddGhostImpulse(impulse, contactPoint.point);
            }
        }
    }
 public void CollisionEnter(PhysXCollision collision)
 {
     if (collision.gameObject.GetComponent <VehicleHealthManager>() != null)
     {
         abilityPrimary.JustCollided();
     }
     else if (collision.gameObject.layer == 6)
     {
         abilityPrimary.JustCollided();
     }
 }
Esempio n. 6
0
 public void CollisionEnter(PhysXCollision other)
 {
     if (other.gameObject.CompareTag("DustGround"))
     {
         myRb.ghostEnabled = false;
     }
     else
     {
         myRb.ghostEnabled = true;
     }
 }
Esempio n. 7
0
    public void Simulate()
    {
        if (doPhysics)
        {
            PhysXLib.StepPhysics(scene, Time.fixedDeltaTime, scratchMem, scratchKilobytes * 1024);

            foreach (PhysXBody body in bodies.Values)
            {
                body.UpdatePositionAndVelocity();
            }

            collisionCallbackMarker.Begin();
            foreach (PhysXCollision collision in PhysXSceneManager.ongoingCollisions)
            {
                collision.PopulateWithUnityObjects(bodies);
                PhysXBody body = null;
                if (bodies.TryGetValue(collision.self.ToInt64(), out body))
                {
                    try {
                        body.FireCollisionEvents(collision);
                    }
                    catch (Exception e) {
                        Debug.LogError("Exception: " + e.Message + "\n" + e.StackTrace);
                    }
                }
                PhysXCollision.ReleaseCollision(collision);
            }
            PhysXSceneManager.ongoingCollisions.Clear();

            foreach (PhysXTrigger trigger in PhysXSceneManager.ongoingTriggers)
            {
                trigger.PopulateWithUnityObjects(bodies);
                PhysXBody body = null;
                if (bodies.TryGetValue(trigger.self.ToInt64(), out body))
                {
                    try {
                        body.FireTriggerEvents(trigger);
                    }
                    catch (Exception e) {
                        Debug.LogError("Exception: " + e.Message + "\n" + e.StackTrace);
                    }
                }
                PhysXTrigger.ReleaseTrigger(trigger);
            }
            PhysXSceneManager.ongoingTriggers.Clear();
            collisionCallbackMarker.End();

            PhysXLib.StepGhostPhysics(scene, Time.fixedDeltaTime, scratchMem, scratchKilobytes * 1024);
        }
    }
    public void CollisionStay(PhysXCollision col)
    {
        //   Debug.LogError("resetting pos up " + col.gameObject + " transform is: " + col.transform.root);
        timer += Time.unscaledDeltaTime;


        if (col.gameObject.CompareTag("Player") && timer > 0.8f)
        {
            timer = 0f;
            Transform car = col.transform.root;
            car.transform.position = car.transform.position + Vector3.up * 3;
            car.GetComponent <PhysXBody>().position      = car.transform.position + Vector3.up * 3;
            car.GetComponent <PhysXRigidBody>().velocity = Vector3.zero;
        }
    }
Esempio n. 9
0
 public void FireCollisionEvents(PhysXCollision collision)
 {
     if (collision.isEnter)
     {
         foreach (ICollisionEnterEvent collisionEnterEvent in collisionEnterEvents)
         {
             if (collisionEnterEvent.requiresData)
             {
                 collisionEnterEvent.CollisionEnter(collision);
             }
             else
             {
                 collisionEnterEvent.CollisionEnter();
             }
         }
     }
     if (collision.isStay)
     {
         foreach (ICollisionStayEvent collisionStayEvent in collisionStayEvents)
         {
             if (collisionStayEvent.requiresData)
             {
                 collisionStayEvent.CollisionStay(collision);
             }
             else
             {
                 collisionStayEvent.CollisionStay();
             }
         }
     }
     if (collision.isExit)
     {
         foreach (ICollisionExitEvent collisionExitEvent in collisionExitEvents)
         {
             if (collisionExitEvent.requiresData)
             {
                 collisionExitEvent.OnCollisionExit(collision);
             }
             else
             {
                 collisionExitEvent.CollisionExit();
             }
         }
     }
 }
Esempio n. 10
0
    public void  CollisionEnter(PhysXCollision collision)
    {
        // Debug.LogError(collision.gameObject);

        Vector3 impactNormal = collision.GetContact(0).normal;

        // if we are the true projectile, then deal with game altering stuff like damage n that
        if (explosionForce > 0)
        {
            Squishing hitMeshSquisher = collision.gameObject.GetComponentInParent <Squishing>();
            if (hitMeshSquisher != null)
            {
                Vector3 explosionPoint = collision.GetContact(0).point + impactNormal * explosionOffset;
                hitMeshSquisher.ExplodeMeshAt(explosionPoint, explosionForce);
            }
        }

        Vector3 hitPoint           = collision.GetContact(0).point;
        VehicleHealthManager hitVm = collision.gameObject.GetComponentInParent <VehicleHealthManager>();

        if (hitVm != null)
        {
            if (hitVm.teamId == weaponDamageDetails.sourceTeamId)
            {
                Destroy(gameObject);
            }
        }
        if (isTrueProjectile)
        {
            DamageCollisionHandler(hitVm, hitPoint);
        }
        VisualCollisionHandler(impactNormal, hitVm != null);

        //   pooledObject.Finish();
        Destroy(gameObject);
    }
    public void CrashCollisionCamera(PhysXCollision other, bool small)
    {
        if (other.transform.root.CompareTag("Player"))
        {
            currentSensorReport.crashed = true;
            // get left/right
            PhysXContactPoint[] contactPoints = other.GetContacts();
            Vector3             cpSum         = Vector3.zero;
            foreach (PhysXContactPoint c in contactPoints)
            {
                cpSum += c.point;
            }

            cpSum /= contactPoints.Length;

            // get dir
            float signedDir = Vector3.SignedAngle(transform.forward, cpSum - transform.position, Vector3.up);
            if (signedDir < 0)
            {
                currentSensorReport.leftRightCoefficient = -1;
            }
            else
            {
                currentSensorReport.leftRightCoefficient = 1;
            }

            float forwardBackValue = 0;
            if (Mathf.Abs(signedDir) < 90)
            {
                forwardBackValue = 1;
            }
            else
            {
                forwardBackValue = -1;
            }

            currentSensorReport.forwardBackValue = forwardBackValue;



            currentSensorReport.lastCrashedPlayer = other.transform.root;


            if (npv.GetDriverID() == PhotonNetwork.LocalPlayer.ActorNumber && !small)
            {
                GetComponentInChildren <DriverCinematicCam>().SetCam(DriverCinematicCam.Cams.carCrashFrontLeftEnum);
            }
            if (npv.GetDriverID() == PhotonNetwork.LocalPlayer.ActorNumber && small)
            {
                GetComponentInChildren <DriverCinematicCam>().SetCam(DriverCinematicCam.Cams.carCrashFrontRightEnum);
            }
            //   if(lastTargetPoint!=null) Destroy(lastTargetPoint);
            //  Vector3 point = contactPoints[0].point;
            //   lastTargetPoint = Instantiate(new GameObject(), point, Quaternion.identity);
            //   lastTargetPoint.transform.parent = transform.root;
            //  currentSensorReport.lastCrashedPlayer = lastTargetPoint.transform;

            // StartCoroutine(SetCrashedFalse());
            crashTimer = 0f;
        }
    }
 public void CollisionEnter(PhysXCollision other)
 {
 }
Esempio n. 13
0
 public void CollisionEnter(PhysXCollision collision)
 {
     Debug.LogError("ohno");
 }
    public void CollisionEnter(PhysXCollision collision)
    {
        // Debug.Log("crashed into: " + collision.gameObject);
        float dSpeed = myRb.velocity.magnitude;

        float impulse = collision.impulse.magnitude;

        if (collision.rigidBody != null)
        {
            dSpeed = (myRb.velocity - collision.rigidBody.velocity).magnitude;
        }
        if (myPhotonView.IsMine && collision.contactCount > 0 && dSpeed > 1.5 && collisionTimer < 0)
        {
            collisionTimer = maxCollisionRate;
            Vector3 collisionNormal = collision.GetContact(0).normal;
            Vector3 collisionForce  = collision.impulse;
            if (Vector3.Dot(collisionForce, collisionNormal) < 0)
            {
                collisionForce = -collisionForce;
            }
            collisionForce /= Time.fixedDeltaTime;
            collisionForce  = transform.InverseTransformDirection(collisionForce);

            VehicleHealthManager otherVehicleManager = collision.gameObject.GetComponent <VehicleHealthManager>();

            Vector3 collisionPoint = Vector3.zero;
            for (int i = 0; i < collision.contactCount; i++)
            {
                collisionPoint += collision.GetContact(i).point;
            }
            collisionPoint /= collision.contactCount;

            Vector3 contactDirection = transform.InverseTransformPoint(collisionPoint);
            float   damage           = CalculateCollisionDamage(collisionForce, contactDirection, otherVehicleManager != null);

            // instantiate damage sound over network
            if ((damage > crashSoundsSmallDamageThreshold || (otherVehicleManager != null)) && timeSinceLastRam > 0.25f)
            {
                PlayDamageSoundNetwork(damage);
            }

            damage = damage / rammingDamageResistance;

            if (myPhotonView.IsMine && hasHotPotatoManager && otherVehicleManager != null && timeSinceLastRam > 0.25f)
            {
                if (collisionNpv.GetDriverID() == PhotonNetwork.LocalPlayer.ActorNumber || collisionNpv.GetGunnerID() == PhotonNetwork.LocalPlayer.ActorNumber)
                {
                    // Debug.LogError("Slow down should happen");
                    hotPotatoManager.SlowedCollision();
                }
                if (collisionSparks != null)
                {
                    GameObject a = Instantiate(collisionSparks, collisionPoint, Quaternion.identity);
                    a.transform.parent = transform;
                }

                if (collisionNpv != null && !collisionNpv.botDriver)
                {
                    if (damage > 4)
                    {
                        driverCrashDetector.CrashCollisionCamera(collision, false);
                    }
                    else
                    {
                        driverCrashDetector.CrashCollisionCamera(collision, true);
                    }
                }
            }

            if (damage > 5)
            {
                if (otherVehicleManager != null)
                {
                    if (otherVehicleManager != null)
                    {
                        damage *= otherVehicleManager.rammingDamageMultiplier;
                    }
                    Weapon.WeaponDamageDetails rammingDetails = otherVehicleManager.rammingDetails;

                    rammingDetails.damage = damage;
                    if (markedByTeams.Contains(rammingDetails.sourceTeamId))
                    {
                        rammingDetails.damage *= markedTeamDamageIncrease;
                    }

                    TakeDamage(rammingDetails);
                }
                else
                {
                    TakeDamage(damage);
                }
            }
        }
        if (collision.rigidBody != null)
        {
            timeSinceLastRam = 0f;
        }
    }
Esempio n. 15
0
    public void CollisionStay(PhysXCollision collision)
    {
        if (collision.contactCount > 0 && collision.GetContact(0).separation < -minPenetration)
        {
            if ((collision.rigidBody == null || collision.rigidBody.mass >= minDeformationMass) &&
                !collision.collider.gameObject.CompareTag("DustGround"))
            {
                meshDeformationMarker.Begin();

                bool isInconvenient = collision.collider is PhysXMeshCollider && !((PhysXMeshCollider)collision.collider).convex;

                Vector3 collisionSurfaceNormal = Vector3.zero;
                Vector3 collisionSurfacePoint  = Vector3.zero;

                for (int i = 0; i < collision.contactCount; i++)
                {
                    PhysXContactPoint contactPoint     = collision.GetContact(i);
                    float             impulseMagnitude = contactPoint.impulse.magnitude;

                    collisionSurfaceNormal += contactPoint.normal;
                    collisionSurfacePoint  += contactPoint.point;
                }



                collisionSurfaceNormal /= collision.contactCount;
                collisionSurfacePoint  /= collision.contactCount;

                collisionSurfaceNormal = transform.InverseTransformDirection(collisionSurfaceNormal);
                collisionSurfacePoint  = transform.InverseTransformPoint(collisionSurfacePoint);

                gizmoSurfaceNormal = collisionSurfaceNormal;
                gizmoSurfacePoint  = collisionSurfacePoint;

                Vector3    oldPosition = collision.body.position;
                Quaternion oldRotation = collision.body.rotation;
                collision.body.position = transform.InverseTransformPoint(collision.body.position);
                collision.body.rotation = Quaternion.Inverse(transform.rotation) * collision.body.rotation;

                VertexGroup[] groups = meshGraph.groups;
                for (int i = 0; i < groups.Length; i++)
                {
                    VertexGroup current = groups[i];
                    Vector3     vertex  = current.pos;

                    if (IsBeyondCollisionSurface(collisionSurfaceNormal, collisionSurfacePoint, vertex))
                    {
                        if (isInconvenient || collision.collider.ClosestPoint(vertex) == vertex)
                        {
                            Vector3 deformation = DeformationFromCollisionSurface(collisionSurfaceNormal, collisionSurfacePoint, vertex);

                            // if (addNoise) deformation *= Random.value * multiplier + addition;

                            current.MoveBy(vertices, deformation, false);
                            current.SetWasMoved(teamId, true);

                            if (!current.GetEnqueued(teamId))
                            {
                                vertexQueue.Enqueue(current);
                                current.SetEnqueued(teamId, true);
                                // Debug.Log("Vertex group " + current.vertexIndices[0] + " enqueued due to collision");
                            }
                        }
                    }
                }

                collision.body.position = oldPosition;
                collision.body.rotation = oldRotation;

                dissipationNeeded = true;

                meshDeformationMarker.End();
            }
        }
    }