コード例 #1
0
    public void Deform(int meshIndex)
    {
        if (meshIndex > bMeshes.Length - 1)
        {
            return;
        }

        thread_pts = new Vector3[bMeshes[meshIndex].origVerts.Length];

        BendParameters bp = new BendParameters();

        bp.N       = ts_transform.TransformDirection(1, 0, 0);
        bp.BiN     = ts_transform.TransformDirection(0, 0, -1);
        bp.T       = ts_transform.TransformDirection(0, 1, 0);
        bp.bendEnd = ts_targetTransform.TransformPoint(0, length, 0);

        int start = (direction) ? 0 : bMeshes[meshIndex].seperatingIndex;
        int end   = (direction) ? bMeshes[meshIndex].seperatingIndex : bMeshes[meshIndex].origVerts.Length;

        for (int i = start; i < end; i += maxWorkGroupSize)
        {
            int workgroupSize = (i + maxWorkGroupSize < bMeshes[meshIndex].origVerts.Length) ? maxWorkGroupSize : bMeshes[meshIndex].origVerts.Length - i;
            threads.Add(StartThread(i, i + workgroupSize, ts_transform, ts_targetTransform, bp, meshIndex));
        }

        start = (direction) ? bMeshes[meshIndex].seperatingIndex : 0;
        end   = (direction) ? bMeshes[meshIndex].origVerts.Length : bMeshes[meshIndex].seperatingIndex;

        for (int i = start; i < end; i++)
        {
            thread_pts[i] = bMeshes[meshIndex].origVerts[i];
        }

        ThreadTools.WaitForThreads(ref threads);
        bMeshes[meshIndex].mesh.vertices = thread_pts;
    }
コード例 #2
0
    private Thread StartThread(int iStart, int iEnd, ts_Transform thisT, ts_Transform otherT, BendParameters bp, int meshIndex)
    {
        Thread t = new Thread(() => DeformThread(iStart, iEnd, thisT, otherT, bp, meshIndex));

        t.Start();
        return(t);
    }
コード例 #3
0
    private void DeformThread(int iStart, int iEnd, ts_Transform thisT, ts_Transform otherT, BendParameters bp, int meshIndex)
    {
        Vector3 v;
        Vector3 P2, N2, T2;

        for (int i = iStart; i < iEnd; i++)
        {
            Vector3 wsPt = otherT.TransformPoint(bMeshes[meshIndex].origVerts[i]);

            float u = PtLineProject(wsPt, thisT.TransformPoint(Vector3.zero), thisT.TransformPoint(0, 1 * length, 0));
            u = Mathf.Min(1.0F, Mathf.Max(u, 0.0F));

            float tmp = Vector3.Dot(wsPt, bp.bendEnd);
            tmp = Mathf.Min(Mathf.Max(tmp, 0), bp.bendEnd.magnitude);

            bp.P = thisT.TransformPoint(u * new Vector3(0, 1 * length, 0));

            float dN, dBiN, dT;
            dN   = PtLineProject(wsPt, bp.P, bp.P + bp.N);
            dBiN = PtLineProject(wsPt, bp.P, bp.P + bp.BiN);
            dT   = PtLineProject(wsPt, bp.P, bp.P + bp.T);

            if (curvature != 0)
            {
                v.x = (Mathf.Cos(u * curvature / Mathf.PI) * Mathf.PI / curvature - Mathf.PI / curvature) * length;
                v.y = (Mathf.Sin(u * curvature / Mathf.PI) * Mathf.PI / curvature) * length;
                v.z = 0;

                P2 = thisT.TransformPoint(v);
                N2 = thisT.TransformDirection(Vector3.Normalize(v - new Vector3(-Mathf.PI / curvature * length, 0, 0)));

                if (curvature < 0)
                {
                    N2 *= -1;
                }

                T2 = Vector3.Cross(N2, bp.BiN);
            }
            else
            {
                P2 = bp.P;
                N2 = bp.N;
                T2 = bp.T;
            }

            thread_pts[i] = Vector3.Lerp(bMeshes[meshIndex].origVerts[i], otherT.InverseTransformPoint(P2 + dN * N2 + dBiN * bp.BiN + dT * T2), amount);
        }
    }