private IEnumerator DelayedOnHit(Vector3 pointA, Vector3 pointB) { var vector = pointB - pointA; var maxDistance = vector.magnitude; var ray = new Ray(pointA, vector); var hit = default(RaycastHit); if (Physics.Raycast(ray, out hit, maxDistance, layers) == true) { var distance01 = Mathf.InverseLerp(0.0f, radius, hit.distance); // Wait based on hit distance yield return(new WaitForSeconds(distance01 * delayMax)); var finalUp = orientation == OrientationType.CameraUp ? P3dHelper.GetCameraUp(_camera) : Vector3.up; var finalPosition = hit.point + hit.normal * offset; var finalNormal = normal == NormalType.HitNormal ? hit.normal : -ray.direction; var finalRotation = Quaternion.LookRotation(-finalNormal, finalUp); var finalPressure = 1.0f - distance01; hitCache.InvokePoint(gameObject, preview, priority, finalPressure, finalPosition, finalRotation); hitCache.InvokeRaycast(gameObject, preview, priority, finalPressure, hit, finalRotation); } }
public void SubmitLastPoint(GameObject gameObject, bool preview, object owner) { if (owner != null) { var link = default(Link); if (TryGetLink(owner, ref link) == true) { if (link.Preview == preview && preview == false) { if (hitSpacing > 0.0f) { var currentPosition = link.Position; var distance = Vector3.Distance(link.Position, link.LastPosition); var steps = Mathf.FloorToInt(distance / hitSpacing); if (steps > hitLimit) { steps = hitLimit; } for (var i = 0; i < steps; i++) { currentPosition = Vector3.MoveTowards(currentPosition, link.LastPosition, hitSpacing); if (connectHits == true) { hitCache.InvokeLine(gameObject, preview, link.LastPriority, link.LastPressure, link.Position, currentPosition, link.LastRotation); } else { hitCache.InvokePoint(gameObject, preview, link.LastPriority, link.LastPressure, currentPosition, link.LastRotation); } link.Position = currentPosition; } } } } } }
private void CheckCollision(Collision collision) { if (cooldown > 0.0f) { return; } var impulse = collision.impulse.magnitude / Time.fixedDeltaTime; // Only handle the collision if the impact was strong enough if (impulse >= impactMin) { cooldown = delay; // Calculate up vector ahead of time var finalUp = orientation == OrientationType.CameraUp ? P3dHelper.GetCameraUp(_camera) : Vector3.up; var contacts = collision.contacts; var pressure = Mathf.InverseLerp(impactMin, impactPressure, impulse); var finalRoot = root != null ? root : gameObject; for (var i = contacts.Length - 1; i >= 0; i--) { var contact = contacts[i]; if (P3dHelper.IndexInMask(contact.otherCollider.gameObject.layer, layers) == true) { var finalPosition = contact.point + contact.normal * offset; var finalRotation = Quaternion.LookRotation(-contact.normal, finalUp); hitCache.InvokePoint(finalRoot, preview, priority, pressure, finalPosition, finalRotation); if (raycastDistance > 0.0f) { var ray = new Ray(contact.point + contact.normal * raycastDistance, -contact.normal); var hit = default(RaycastHit); if (contact.otherCollider.Raycast(ray, out hit, raycastDistance * 2.0f) == true) { hitCache.InvokeRaycast(finalRoot, preview, priority, pressure, hit, finalRotation); } } if (onlyUseFirstContact == true) { break; } } } } }
protected void PaintAt(P3dPointConnector connector, P3dHitCache hitCache, Vector2 screenPosition, Vector2 screenPositionOld, bool preview, float pressure, object owner) { var camera = P3dHelper.GetCamera(_camera); if (camera != null) { if (touchOffset != 0.0f && P3dInputManager.TouchCount > 0) { screenPosition.y += touchOffset / P3dInputManager.ScaleFactor; } var ray = camera.ScreenPointToRay(screenPosition); var hit2D = Physics2D.GetRayIntersection(ray, float.PositiveInfinity, layers); var hit3D = default(RaycastHit); var finalPosition = default(Vector3); var finalRotation = default(Quaternion); // Hit 3D? if (Physics.Raycast(ray, out hit3D, float.PositiveInfinity, layers) == true && (hit2D.collider == null || hit3D.distance < hit2D.distance)) { CalcHitData(hit3D.point, hit3D.normal, ray, camera, screenPositionOld, out finalPosition, out finalRotation); if (emit == EmitType.PointsIn3D) { if (connector != null) { connector.SubmitPoint(gameObject, preview, priority, pressure, finalPosition, finalRotation, owner); } else { hitCache.InvokePoint(gameObject, preview, priority, pressure, finalPosition, finalRotation); } return; } else if (emit == EmitType.PointsOnUV) { hitCache.InvokeCoord(gameObject, preview, priority, pressure, new P3dHit(hit3D), finalRotation); return; } else if (emit == EmitType.TrianglesIn3D) { hitCache.InvokeTriangle(gameObject, preview, priority, pressure, hit3D, finalRotation); return; } } // Hit 2D? else if (hit2D.collider != null) { CalcHitData(hit2D.point, hit2D.normal, ray, camera, screenPositionOld, out finalPosition, out finalRotation); if (emit == EmitType.PointsIn3D) { if (connector != null) { connector.SubmitPoint(gameObject, preview, priority, pressure, finalPosition, finalRotation, owner); } else { hitCache.InvokePoint(gameObject, preview, priority, pressure, finalPosition, finalRotation); } return; } } } if (connector != null) { connector.BreakHits(owner); } }
private void CheckCollision(Collision collision) { if (cooldown > 0.0f) { return; } var impulse = collision.impulse.magnitude / Time.fixedDeltaTime; // Only handle the collision if the impact was strong enough if (impulse >= pressureMin) { cooldown = delay; // Calculate up vector ahead of time var finalUp = orientation == OrientationType.CameraUp ? P3dHelper.GetCameraUp(_camera) : Vector3.up; var contacts = collision.contacts; var finalPressure = pressureMultiplier; var finalRoot = root != null ? root : gameObject; switch (pressureMode) { case PressureType.Constant: { finalPressure *= pressureConstant; } break; case PressureType.ImpactSpeed: { finalPressure *= Mathf.InverseLerp(pressureMin, pressureMax, impulse); } break; } for (var i = contacts.Length - 1; i >= 0; i--) { var contact = contacts[i]; if (P3dHelper.IndexInMask(contact.otherCollider.gameObject.layer, layers) == true) { var finalPosition = contact.point + contact.normal * offset; var finalRotation = Quaternion.LookRotation(-contact.normal, finalUp); switch (emit) { case EmitType.PointsIn3D: { hitCache.InvokePoint(finalRoot, preview, priority, finalPressure, finalPosition, finalRotation); } break; case EmitType.PointsOnUV: { var hit = default(RaycastHit); if (TryGetRaycastHit(contact, ref hit) == true) { hitCache.InvokeCoord(finalRoot, preview, priority, finalPressure, new P3dHit(hit), finalRotation); } } break; case EmitType.TrianglesIn3D: { var hit = default(RaycastHit); if (TryGetRaycastHit(contact, ref hit) == true) { hitCache.InvokeTriangle(gameObject, preview, priority, finalPressure, hit, finalRotation); } } break; } if (onlyUseFirstContact == true) { break; } } } } }
protected virtual void OnParticleCollision(GameObject hitGameObject) { // Get the collision events array var count = cachedParticleSystem.GetSafeCollisionEventSize(); // Expand collisionEvents list to fit all particles for (var i = particleCollisionEvents.Count; i < count; i++) { particleCollisionEvents.Add(new ParticleCollisionEvent()); } count = cachedParticleSystem.GetCollisionEvents(hitGameObject, particleCollisionEvents); // Calculate up vector ahead of time var finalUp = orientation == OrientationType.CameraUp ? P3dHelper.GetCameraUp(_camera) : Vector3.up; // Paint all locations for (var i = 0; i < count; i++) { if (skip > 0) { if (skipCounter++ > skip) { skipCounter = 0; } else { continue; } } var collisionEvent = particleCollisionEvents[i]; var finalPosition = collisionEvent.intersection + collisionEvent.normal * offset; var finalNormal = normal == NormalType.CollisionNormal ? collisionEvent.normal : -collisionEvent.velocity; var finalRotation = finalNormal != Vector3.zero ? Quaternion.LookRotation(-finalNormal, finalUp) : Quaternion.identity; var finalPressure = pressureMultiplier; switch (pressureMode) { case PressureType.Distance: { var distance = Vector3.Distance(transform.position, collisionEvent.intersection); finalPressure *= Mathf.InverseLerp(pressureMin, pressureMax, distance); } break; case PressureType.Speed: { var speed = Vector3.SqrMagnitude(collisionEvent.velocity); if (speed > 0.0f) { speed = Mathf.Sqrt(speed); } finalPressure *= Mathf.InverseLerp(pressureMin, pressureMax, speed); } break; } if (pressureMin != pressureMax) { } hitCache.InvokePoint(gameObject, preview, priority, finalPressure, finalPosition, finalRotation); } }
protected virtual void OnParticleCollision(GameObject hitGameObject) { if (cachedParticleSystemSet == false) { cachedParticleSystem = GetComponent <ParticleSystem>(); cachedParticleSystemSet = true; } // Get the collision events array var count = cachedParticleSystem.GetSafeCollisionEventSize(); // Expand collisionEvents list to fit all particles for (var i = particleCollisionEvents.Count; i < count; i++) { particleCollisionEvents.Add(new ParticleCollisionEvent()); } count = cachedParticleSystem.GetCollisionEvents(hitGameObject, particleCollisionEvents); // Calculate up vector ahead of time var finalUp = orientation == OrientationType.CameraUp ? P3dHelper.GetCameraUp(_camera) : Vector3.up; var finalRoot = root != null ? root : gameObject; // Paint all locations for (var i = 0; i < count; i++) { var collision = particleCollisionEvents[i]; if (P3dHelper.IndexInMask(collision.colliderComponent.gameObject.layer, layers) == false) { continue; } if (skip > 0) { if (skipCounter++ > skip) { skipCounter = 0; } else { continue; } } var finalPosition = collision.intersection + collision.normal * offset; var finalNormal = normal == NormalType.CollisionNormal ? collision.normal : -collision.velocity; var finalRotation = finalNormal != Vector3.zero ? Quaternion.LookRotation(-finalNormal, finalUp) : Quaternion.identity; var finalPressure = pressureMultiplier; switch (pressureMode) { case PressureType.Constant: { finalPressure *= pressureConstant; } break; case PressureType.Distance: { var distance = Vector3.Distance(transform.position, collision.intersection); finalPressure *= Mathf.InverseLerp(pressureMin, pressureMax, distance); } break; case PressureType.Speed: { var speed = Vector3.SqrMagnitude(collision.velocity); if (speed > 0.0f) { speed = Mathf.Sqrt(speed); } finalPressure *= Mathf.InverseLerp(pressureMin, pressureMax, speed); } break; } switch (emit) { case EmitType.PointsIn3D: { hitCache.InvokePoint(finalRoot, preview, priority, finalPressure, finalPosition, finalRotation); } break; case EmitType.PointsOnUV: { var hit = default(RaycastHit); if (TryGetRaycastHit(collision, ref hit) == true) { hitCache.InvokeCoord(finalRoot, preview, priority, finalPressure, new P3dHit(hit), finalRotation); } } break; case EmitType.TrianglesIn3D: { var hit = default(RaycastHit); if (TryGetRaycastHit(collision, ref hit) == true) { hitCache.InvokeTriangle(gameObject, preview, priority, finalPressure, hit, finalRotation); } } break; } } }