Esempio n. 1
0
        /// <summary>
        /// Called when Gizmo is drawn.
        /// </summary>
        private void OnDrawGizmos()
        {
            if (drawGizmo)
            {
                if (rootDatas == null)
                {
                    return;
                }

                for (int rootIndex = 0; rootIndex < rootDatas.Length; rootIndex++)
                {
                    List <SpringBoneData> roodData = rootDatas[rootIndex];

                    if (roodData == null)
                    {
                        continue;
                    }

                    // @notice Count - 1
                    for (int boneIndex = 0; boneIndex < roodData.Count - 1; boneIndex++)
                    {
                        SpringBoneData boneData = roodData[boneIndex];

                        if (boneData == null)
                        {
                            continue;
                        }

                        boneData.verlet.DrawGizmo(gizmoColor);
                    }
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        ///
        /// </summary>
        private void FixedUpdate()
        {
            if (rootBones == null)
            {
                return;
            }

            if (rootDatas == null)
            {
                return;
            }

            CollectColliders();

            float deltaTime = Time.deltaTime;

            float   deltaStiffnessForce = stiffnessForce * deltaTime;
            Vector3 deltaGravityForce   = gravityDirection * (gravityPower * deltaTime);

            for (int rootIndex = 0; rootIndex < rootDatas.Length; rootIndex++)
            {
                List <SpringBoneData> roodData = rootDatas[rootIndex];

                if (roodData == null)
                {
                    continue;
                }

                // @notice Count - 1
                for (int boneIndex = 0; boneIndex < roodData.Count - 1; boneIndex++)
                {
                    SpringBoneData boneData = roodData[boneIndex];

                    if (boneData == null)
                    {
                        continue;
                    }

                    var verlet = boneData.verlet;

                    verlet.headTransform        = new SpringBoneTransformAccess(boneData.headTransform);
                    verlet.parentRotation       = boneData.parentTransform == null ? Quaternion.identity : boneData.parentTransform.rotation;
                    verlet.currentTailPosition  = boneData.currentTailPosition;
                    verlet.previousTailPosition = boneData.previousTailPosition;
                    verlet.stiffnessForce       = deltaStiffnessForce;
                    verlet.dragForce            = dragForce;
                    verlet.externalForce        = deltaGravityForce;
                    //verlet.colliderGroups = colliderGroups;
                    verlet.colliders = colliders;
                    verlet.hitRadius = hitRadius;

                    verlet.Calculate();

                    boneData.headTransform.rotation = verlet.headTransformRotation;

                    boneData.previousTailPosition = verlet.currentTailPosition;
                    boneData.currentTailPosition  = verlet.nextTailPosition;
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Set up the root bone and its child bones data.
        /// </summary>
        private void Setup()
        {
            rootDatas = new List <SpringBoneData> [rootBones.Length];

            for (int rootIndex = 0; rootIndex < rootBones.Length; rootIndex++)
            {
                if (rootBones[rootIndex] == null)
                {
                    continue;
                }

                rootDatas[rootIndex] = new List <SpringBoneData>();

                SetupRecursive(rootIndex, rootBones[rootIndex]);
            }

            for (int rootIndex = 0; rootIndex < rootDatas.Length; rootIndex++)
            {
                List <SpringBoneData> roodData = rootDatas[rootIndex];

                if (roodData == null)
                {
                    continue;
                }

                // @notice Count - 1
                for (int boneIndex = 0; boneIndex < roodData.Count - 1; boneIndex++)
                {
                    SpringBoneData boneData = roodData[boneIndex];

                    if (boneData == null)
                    {
                        continue;
                    }

                    boneData.parentTransform      = boneData.headTransform.parent;
                    boneData.tailTransform        = rootDatas[rootIndex][boneIndex + 1].headTransform;
                    boneData.boneAxis             = boneData.tailTransform.localPosition.normalized;
                    boneData.boneLength           = boneData.tailTransform.localPosition.magnitude;
                    boneData.currentTailPosition  = boneData.tailTransform.position;
                    boneData.previousTailPosition = boneData.currentTailPosition;
                    boneData.verlet = new SpringBoneVerlet(boneData.boneAxis, boneData.boneLength, hitRadius);
                }
            }
        }