Beispiel #1
0
        public void UpdateVertices()
        {
            float uvSegment = 0f;
            float uvLen     = 0f;

            //NOTE: ONLY USE THE DUMMY NODE'S UV CHANGE
            Vector2 LowerLeftUV  = dummyNode.LowerLeftUV;
            Vector2 UVDimensions = dummyNode.UVDimensions;

            // change to lower left coord?
            UVDimensions.y = -UVDimensions.y;
            LowerLeftUV.y  = 1f - LowerLeftUV.y;


            float totalUVLen = Owner.RopeUVLen;

            if (Owner.RopeFixUVLen)
            {
                float t = 0;
                for (int i = 0; i < NodeList.Count - 1; i++)
                {
                    t += (NodeList[i + 1].GetWorldPos() - NodeList[i].GetWorldPos()).magnitude;
                }
                totalUVLen = t;
            }


            for (int i = NodeList.Count - 1; i >= 0; i--)
            {
                EffectNode node = NodeList[i];

                EffectNode prevNode = i + 1 < NodeList.Count ? NodeList[i + 1] : null;

                EffectNode nextNode = i - 1 >= 0 ? NodeList[i - 1] : null;

                Vector3 chainTangent;

                if (nextNode == null)
                {
                    //tail node
                    chainTangent = node.GetWorldPos() - prevNode.GetWorldPos();
                }
                else if (prevNode == null)
                {
                    //head node
                    chainTangent = nextNode.GetWorldPos() - node.GetWorldPos();
                }
                else
                {
                    chainTangent = nextNode.GetWorldPos() - prevNode.GetWorldPos();
                }



                Vector3 eyePos   = Owner.MyCamera.transform.position;
                Vector3 vP1ToEye = eyePos - node.GetWorldPos();

                Vector3 vPerpendicular = Vector3.Cross(chainTangent, vP1ToEye);
                vPerpendicular.Normalize();
                vPerpendicular *= (Owner.RopeWidth * 0.5f * node.Scale.x);

                //Debug.DrawRay(node.GetWorldPos(), vPerpendicular, Color.red, 1f);

                Vector3 pos0 = node.GetWorldPos() - vPerpendicular;
                Vector3 pos1 = node.GetWorldPos() + vPerpendicular;

                VertexPool pool = Vertexsegment.Pool;
                //if (Owner.StretchType == 0)
                uvSegment = (uvLen / totalUVLen) * Mathf.Abs(UVDimensions.y);
                // else
                // uvSegment = (uvLen / totalUVLen) * Mathf.Abs(UVDimensions.x);
                Vector2 uvCoord = Vector2.zero;
                int     baseIdx = Vertexsegment.VertStart + node.Index * 2;

                pool.Vertices[baseIdx] = pos0;
                pool.Colors[baseIdx]   = node.Color;
                //if (Owner.StretchType == 0)
                // {
                uvCoord.x = LowerLeftUV.x + UVDimensions.x;
                uvCoord.y = LowerLeftUV.y - uvSegment;
                // }
                // else
                // {
                // uvCoord.x = LowerLeftUV.x + uvSegment;
                // uvCoord.y = LowerLeftUV.y;
                // }
                pool.UVs[baseIdx] = uvCoord;


                //pos1
                pool.Vertices[baseIdx + 1] = pos1;
                pool.Colors[baseIdx + 1]   = node.Color;
                //if (Owner.StretchType == 0)
                // {
                uvCoord.x = LowerLeftUV.x;
                uvCoord.y = LowerLeftUV.y - uvSegment;
                // }
                //else
                //{
                //  uvCoord.x = LowerLeftUV.x + uvSegment;
                // uvCoord.y = LowerLeftUV.y - Mathf.Abs(UVDimensions.y);
                // }
                pool.UVs[baseIdx + 1] = uvCoord;

                if (nextNode != null)
                {
                    uvLen += (nextNode.GetWorldPos() - node.GetWorldPos()).magnitude;
                }
                else
                {
                    uvLen += (node.GetWorldPos() - prevNode.GetWorldPos()).magnitude;
                }
            }

            Vertexsegment.Pool.UVChanged    = true;
            Vertexsegment.Pool.VertChanged  = true;
            Vertexsegment.Pool.ColorChanged = true;
        }