using UltimateWater; using UnityEngine; namespace PhysicsTools { public class Segment { public GameObject seg; public Rigidbody body; public Joint prev; public Joint next; public CapsuleCollider capsuleCollider; public MeshFilter meshFilter; public MeshRenderer meshRenderer; public WaterInteractive waterInteractive; public Segment(string name, float len, Vector3 pos, Quaternion q, SegmentPropertiesBase segProperties, Rope r) { SegmentPropertiesCylinder segmentPropertiesCylinder = (SegmentPropertiesCylinder)segProperties; float radius = segmentPropertiesCylinder.radius; seg = GameObject.CreatePrimitive(PrimitiveType.Cylinder); capsuleCollider = seg.GetComponent(); meshFilter = seg.GetComponent(); meshRenderer = seg.GetComponent(); body = seg.AddComponent(); capsuleCollider.sharedMaterial = r.ropeMaterial; capsuleCollider.enabled = r.useColliders; r.lstComponentsCreated.Add(seg); seg.hideFlags = (r.HideChildren ? HideFlags.HideInHierarchy : HideFlags.None); meshRenderer.enabled = true; r.linkMesh.defaultMesh = meshFilter.sharedMesh; r.linkMesh.defaultMeshMaterial = meshRenderer.sharedMaterial; r.linkMesh.defaultTransform = Matrix4x4.identity; if (r.linkMesh.getMesh() != null) { meshFilter.sharedMesh = r.linkMesh.getMesh(); meshRenderer.sharedMaterial = r.linkMesh.meshMaterial; } seg.name = name; seg.transform.localScale = new Vector3(radius * 2f, len / 2f, radius * 2f); seg.transform.localPosition = pos; seg.transform.localRotation = q; body.maxAngularVelocity = 1f; body.angularDrag = segmentPropertiesCylinder.angularDamping; body.drag = segmentPropertiesCylinder.linearDamping; body.mass = segmentPropertiesCylinder.massPerUnitLength * segmentPropertiesCylinder.length; body.solverIterations = segmentPropertiesCylinder.solverCount; body.isKinematic = r.kinematic; } } }