示例#1
0
    // we only need to build the savevertex and uvs if mesh def changes, else we can keep the uvs
    void BuildMesh()
    {
        if (!mesh)
        {
            mesh = GetComponent <MeshFilter>().sharedMesh;
            if (mesh == null)
            {
                updatemesh = true;
                return;
            }
        }

        if (hosespline.knots.Count == 0)
        {
            hosespline.AddKnot(Vector3.zero, Vector3.zero, Vector3.zero);
            hosespline.AddKnot(Vector3.zero, Vector3.zero, Vector3.zero);
        }

        FixHoseFillet();

        bool createfree = freecreate;

        if ((!createfree) && ((!custnode) || (!custnode2)))
        {
            createfree = true;
        }

        if (custnode && custnode2)
        {
            createfree = false;
        }

        Matrix4x4 mat1, mat2;
        float     Lf = 0.0f;

        Tlocal = Matrix4x4.identity;

        Vector3 startvec, endvec, startpoint, endpoint, endy;

        starty = Vector3.zero;
        roty   = Vector3.zero;
        yangle = 0.0f;

        Vector3 RV = Vector3.zero;

        if (createfree)
        {
            Lf = noreflength;
        }
        else
        {
            RV = up;                    //new Vector3(xtmp, ytmp, ztmp);

            mat1 = custnode.transform.localToWorldMatrix;
            mat2 = custnode2.transform.localToWorldMatrix;

            Matrix4x4 mato1 = Matrix4x4.identity;
            Matrix4x4 mato2 = Matrix4x4.identity;
            mato1 = Matrix4x4.TRS(offset, Quaternion.Euler(rotate), scale);
            mato1 = mato1.inverse;

            mato2 = Matrix4x4.TRS(offset1, Quaternion.Euler(rotate1), scale1);
            mato2 = mato2.inverse;
            S     = transform.localToWorldMatrix;

            Matrix4x4 mat1NT, mat2NT;

            mat1NT = mat1;
            mat2NT = mat2;
            MegaMatrix.NoTrans(ref mat1NT);
            MegaMatrix.NoTrans(ref mat2NT);
            Vector3 P1 = mat1.MultiplyPoint(mato1.GetColumn(3));
            Vector3 P2 = mat2.MultiplyPoint(mato2.GetColumn(3));

            startvec = mat1NT.MultiplyPoint(mato1.GetColumn(2));
            endvec   = mat2NT.MultiplyPoint(mato2.GetColumn(2));
            starty   = mat1NT.MultiplyPoint(mato1.GetColumn(1));
            endy     = mat2NT.MultiplyPoint(mato2.GetColumn(1));

            Matrix4x4 SI = S.inverse;

            Vector3   P0 = SI.MultiplyPoint(P1);
            Matrix4x4 T1 = mat1;
            MegaMatrix.NoTrans(ref T1);

            Vector3 RVw = T1.MultiplyPoint(RV);
            Lf = (P2 - P1).magnitude;
            Vector3 Zw;
            if (Lf < 0.01f)
            {
                Zw = P1.normalized;
            }
            else
            {
                Zw = (P2 - P1).normalized;
            }
            Vector3 Xw = Vector3.Cross(RVw, Zw).normalized;
            Vector3 Yw = Vector3.Cross(Zw, Xw).normalized;

            MegaMatrix.NoTrans(ref SI);

            Vector3 Xs = SI.MultiplyPoint(Xw);
            Vector3 Ys = SI.MultiplyPoint(Yw);
            Vector3 Zs = SI.MultiplyPoint(Zw);
            Tlocal.SetColumn(0, Xs);
            Tlocal.SetColumn(1, Ys);
            Tlocal.SetColumn(2, Zs);
            MegaMatrix.SetTrans(ref Tlocal, P0);

            // move z-axes of end transforms into local frame
            Matrix4x4 TlocalInvNT = Tlocal;
            MegaMatrix.NoTrans(ref TlocalInvNT);

            TlocalInvNT = TlocalInvNT.inverse;

            float tenstop = tension1;                   // * 0.01f;
            float tensbot = tension2;                   // * 0.01f;

            startvec = tensbot * (TlocalInvNT.MultiplyPoint(startvec));
            endvec   = tenstop * (TlocalInvNT.MultiplyPoint(endvec));

            starty = TlocalInvNT.MultiplyPoint(starty);
            endy   = TlocalInvNT.MultiplyPoint(endy);

            yangle = Mathf.Acos(Vector3.Dot(starty, endy));

            if (yangle > EPSILON)
            {
                roty = Vector3.Cross(starty, endy).normalized;
            }
            else
            {
                roty = Vector3.zero;
            }

            startpoint = Vector3.zero;
            endpoint   = new Vector3(0.0f, 0.0f, Lf);

            hosespline.knots[0].p      = startpoint;
            hosespline.knots[0].invec  = startpoint - startvec;
            hosespline.knots[0].outvec = startpoint + startvec;

            hosespline.knots[1].p      = endpoint;
            hosespline.knots[1].invec  = endpoint + endvec;
            hosespline.knots[1].outvec = endpoint - endvec;

            hosespline.CalcLength();                    //10);
        }

        MegaHoseType wtype = wiretype;

        int Segs = segments;

        if (Segs < 3)
        {
            Segs = 3;
        }

        if (rebuildcross)
        {
            rebuildcross = false;
            int nfillets = 0;
            int nsides   = 0;

            if (wtype == MegaHoseType.Round)
            {
                NvertsPerRing = rndsides;
                if (NvertsPerRing < 3)
                {
                    NvertsPerRing = 3;
                }
            }
            else
            {
                if (wtype == MegaHoseType.Rectangle)
                {
                    nfillets = rectfilletsides;
                    if (nfillets < 0)
                    {
                        nfillets = 0;
                    }

                    if (smooth == MegaHoseSmooth.SMOOTHNONE)
                    {
                        NvertsPerRing = (nfillets > 0 ? 8 + 4 * (nfillets - 1) : 8);
                    }
                    else
                    {
                        NvertsPerRing = (nfillets > 0 ? 8 + 4 * (nfillets - 1) : 4);                            //4);
                    }
                }
                else
                {
                    nfillets = dsecfilletsides;
                    if (nfillets < 0)
                    {
                        nfillets = 0;
                    }
                    nsides = dsecrndsides;
                    if (nsides < 2)
                    {
                        nsides = 2;
                    }
                    int nsm1 = nsides - 1;
                    NvertsPerRing = (nfillets > 0 ? 6 + nsm1 + 2 * (nfillets - 1): 4 + nsm1);
                }
            }

            NvertsPerRing++;

            int NfacesPerEnd, NfacesPerRing, Nfaces = 0;
            //MegaHoseSmooth SMOOTH = smooth;

            Nverts = (Segs + 1) * (NvertsPerRing + 1);                  // + 2;
            if (capends)
            {
                Nverts += 2;
            }

            NfacesPerEnd  = NvertsPerRing;
            NfacesPerRing = 6 * NvertsPerRing;
            Nfaces        = Segs * NfacesPerRing;       // + 2 * NfacesPerEnd;

            if (capends)
            {
                Nfaces += 2 * NfacesPerEnd;
            }

            if (SaveVertex == null || SaveVertex.Length != NvertsPerRing)
            {
                SaveVertex = new Vector3[NvertsPerRing];
                SaveUV     = new Vector2[NvertsPerRing];
            }

            if (calcnormals)
            {
                if (SaveNormals == null || SaveNormals.Length != NvertsPerRing)
                {
                    SaveNormals = new Vector3[NvertsPerRing];
                }
            }

            MakeSaveVertex(NvertsPerRing, nfillets, nsides, wtype);

            if (verts == null || verts.Length != Nverts)
            {
                verts = new Vector3[Nverts];
                uvs   = new Vector2[Nverts];
                faces = new int[Nfaces * 3];
            }

            if (calcnormals && (normals == null || normals.Length != Nverts))
            {
                normals = new Vector3[Nverts];
            }
        }

        if (Nverts == 0)
        {
            return;
        }

        bool mapmenow = mapmemapme;

        int thisvert = 0;
        int last     = Nverts - 1;
        int last2    = last - 1;
        int lastvpr  = NvertsPerRing;           // - 1;
        int maxseg   = Segs + 1;

        float flexhere;
        float dadjust;
        float flexlen;
        float flex1 = flexstart;
        float flex2 = flexstop;
        int   flexn = flexcycles;
        float flexd = flexdiameter;

        Vector3 ThisPosition;
        Vector3 ThisXAxis, ThisYAxis, ThisZAxis;
        Vector2 uv = Vector2.zero;

        Matrix4x4 RingTM    = Matrix4x4.identity;
        Matrix4x4 invRingTM = Matrix4x4.identity;

        for (int i = 0; i < maxseg; i++)
        {
            float incr = (float)i / (float)Segs;

            if (createfree)
            {
                ThisPosition = new Vector3(0.0f, 0.0f, Lf * incr);
                ThisXAxis    = new Vector3(1.0f, 0.0f, 0.0f);
                ThisYAxis    = new Vector3(0.0f, 1.0f, 0.0f);
                ThisZAxis    = new Vector3(0.0f, 0.0f, 1.0f);
            }
            else
            {
                int k = 0;
                ThisPosition = hosespline.InterpCurve3D(incr, true, ref k);
                ThisZAxis    = (hosespline.InterpCurve3D(incr + 0.001f, true, ref k) - ThisPosition).normalized;

                ThisYAxis = starty;
                if (yangle > EPSILON)
                {
                    RotateOnePoint(ref ThisYAxis, Vector3.zero, roty, incr * yangle);
                }

                ThisXAxis = Vector3.Cross(ThisYAxis, ThisZAxis).normalized;

                ThisYAxis = Vector3.Cross(ThisZAxis, ThisXAxis);
            }

            RingTM.SetColumn(0, ThisXAxis);
            RingTM.SetColumn(1, ThisYAxis);
            RingTM.SetColumn(2, ThisZAxis);
            MegaMatrix.SetTrans(ref RingTM, ThisPosition);

            if (!createfree)
            {
                RingTM = Tlocal * RingTM;
            }

            if (calcnormals)
            {
                invRingTM = RingTM;
                MegaMatrix.NoTrans(ref invRingTM);
                //invRingTM = invRingTM.inverse.transpose;
            }

            if ((incr > flex1) && (incr < flex2) && flexon)
            {
                flexlen = flex2 - flex1;
                if (flexlen < 0.01f)
                {
                    flexlen = 0.01f;
                }
                flexhere = (incr - flex1) / flexlen;

                float ang = (float)flexn * flexhere * (Mathf.PI * 2.0f) + PIover2;
                dadjust = 1.0f + flexd * (1.0f - Mathf.Sin(ang));                       //(float)flexn * flexhere * (Mathf.PI * 2.0f) + PIover2));
            }
            else
            {
                dadjust = 0.0f;
            }

            if (usebulgecurve)
            {
                if (dadjust == 0.0f)
                {
                    dadjust = 1.0f + (bulge.Evaluate(incr + bulgeoffset) * bulgeamount);
                }
                else
                {
                    dadjust += bulge.Evaluate(incr + bulgeoffset) * bulgeamount;
                }
            }

            uv.x = 0.999999f * incr * uvscale.x;

            for (int j = 0; j < NvertsPerRing; j++)
            {
                int jj = j;                     // % NvertsPerRing;

                if (mapmenow)
                {
                    uv.y          = SaveUV[jj].y;
                    uvs[thisvert] = uv;                         //new Vector2(0.999999f * incr * uvscale.x, SaveUV[jj].y);
                }

                if (dadjust != 0.0f)
                {
                    verts[thisvert] = RingTM.MultiplyPoint(dadjust * SaveVertex[jj]);
                }
                else
                {
                    verts[thisvert] = RingTM.MultiplyPoint(SaveVertex[jj]);
                }

                if (calcnormals)
                {
                    normals[thisvert] = invRingTM.MultiplyPoint(SaveNormals[jj]).normalized;                            //.MultiplyPoint(-SaveNormals[jj]);
                }
                //if ( j == 0 )
                //{
                //	Debug.Log("norm " + normals[thisvert].ToString("0.000") + " save " + SaveNormals[jj].ToString("0.000"));
                //}

                thisvert++;
            }

            if (mapmenow)
            {
                //uvs[Nverts + i] = new Vector2(0.999999f * incr, 0.999f);
            }

            if (capends)
            {
                if (i == 0)
                {
                    verts[last2] = (createfree ? ThisPosition : Tlocal.MultiplyPoint(ThisPosition));
                    if (mapmenow)
                    {
                        uvs[last2] = Vector3.zero;
                    }
                }
                else
                {
                    if (i == Segs)
                    {
                        verts[last] = createfree ? ThisPosition : Tlocal.MultiplyPoint(ThisPosition);
                        if (mapmenow)
                        {
                            uvs[last] = Vector3.zero;
                        }
                    }
                }
            }
        }

        //	Now, set up the faces
        int thisface = 0, v1, v2, v3, v4;

        v3 = last2;
        if (capends)
        {
            for (int i = 0; i < NvertsPerRing - 1; i++)
            {
                v1 = i;
                v2 = (i < lastvpr ? v1 + 1 : v1 - lastvpr);
                //v5 = (i < lastvpr ? v2 : Nverts);

                faces[thisface++] = v2;
                faces[thisface++] = v1;
                faces[thisface++] = v3;
            }
        }

        int ringnum = NvertsPerRing;            // + 1;

        for (int i = 0; i < Segs; i++)
        {
            for (int j = 0; j < NvertsPerRing - 1; j++)
            {
                v1 = i * ringnum + j;
                v2 = v1 + 1;                    //(j < lastvpr? v1 + 1 : v1 - lastvpr);
                v4 = v1 + ringnum;
                v3 = v2 + ringnum;
                faces[thisface++] = v1;
                faces[thisface++] = v2;
                faces[thisface++] = v3;
                faces[thisface++] = v1;
                faces[thisface++] = v3;
                faces[thisface++] = v4;
            }
        }

        int basevert = Segs * ringnum;          //NvertsPerRing;

        v3 = Nverts - 1;
        if (capends)
        {
            for (int i = 0; i < NvertsPerRing - 1; i++)
            {
                v1 = i + basevert;
                v2 = (i < lastvpr? v1 + 1 : v1 - lastvpr);
                //v5 = (i < lastvpr? v2 : Nverts + Segs);
                faces[thisface++] = v1;
                faces[thisface++] = v2;
                faces[thisface++] = v3;
            }
        }

        mesh.Clear();

        mesh.subMeshCount = 1;

        mesh.vertices  = verts;
        mesh.uv        = uvs;
        mesh.triangles = faces;

        if (calcnormals)
        {
            mesh.normals = normals;
        }
        else
        {
            mesh.RecalculateNormals();
        }
        mesh.RecalculateBounds();

#if UNITY_5_5 || UNITY_5_6 || UNITY_2017
#else
        if (optimize)
        {
            ;
        }
#endif

        if (calctangents)
        {
            MegaUtils.BuildTangents(mesh);
        }

        if (recalcCollider)
        {
            if (meshCol == null)
            {
                meshCol = GetComponent <MeshCollider>();
            }

            if (meshCol != null)
            {
                meshCol.sharedMesh = null;
                meshCol.sharedMesh = mesh;
                //bool con = meshCol.convex;
                //meshCol.convex = con;
            }
        }
    }
示例#2
0
    // we only need to build the savevertex and uvs if mesh def changes, else we can keep the uvs
    void BuildMesh()
    {
        if (!mesh)
        {
            mesh = GetComponent <MeshFilter>().sharedMesh;
            if (mesh == null)
            {
                updatemesh = true;
                return;
            }
        }

        if (hosespline.knots.Count == 0)
        {
            hosespline.AddKnot(Vector3.zero, Vector3.zero, Vector3.zero);
            hosespline.AddKnot(Vector3.zero, Vector3.zero, Vector3.zero);
        }

        FixHoseFillet();

        bool createfree = freecreate;

        if ((!createfree) && ((!custnode) || (!custnode2)))
        {
            createfree = true;
        }

        if (custnode && custnode2)
        {
            createfree = false;
        }

        float Lf = 0.0f;

        Tlocal = Matrix4x4.identity;

        starty = Vector3.zero;

        if (createfree)
        {
            Lf = noreflength;
        }
        else
        {
            starty = custnode.transform.up;             //Vector3.up;
            CalcSpline();
            Lf = Vector3.Distance(custnode.transform.position, custnode2.transform.position);
        }

        MegaHoseType wtype = wiretype;

        int Segs = segments;

        if (Segs < 3)
        {
            Segs = 3;
        }

        if (rebuildcross)
        {
            rebuildcross = false;
            int nfillets = 0;
            int nsides   = 0;

            if (wtype == MegaHoseType.Round)
            {
                NvertsPerRing = rndsides;
                if (NvertsPerRing < 3)
                {
                    NvertsPerRing = 3;
                }
            }
            else
            {
                if (wtype == MegaHoseType.Rectangle)
                {
                    nfillets = rectfilletsides;
                    if (nfillets < 0)
                    {
                        nfillets = 0;
                    }

                    if (smooth == MegaHoseSmooth.SMOOTHNONE)
                    {
                        NvertsPerRing = (nfillets > 0 ? 8 + 4 * (nfillets - 1) : 8);
                    }
                    else
                    {
                        NvertsPerRing = (nfillets > 0 ? 8 + 4 * (nfillets - 1) : 4);                            //4);
                    }
                }
                else
                {
                    nfillets = dsecfilletsides;
                    if (nfillets < 0)
                    {
                        nfillets = 0;
                    }
                    nsides = dsecrndsides;
                    if (nsides < 2)
                    {
                        nsides = 2;
                    }
                    int nsm1 = nsides - 1;
                    NvertsPerRing = (nfillets > 0 ? 6 + nsm1 + 2 * (nfillets - 1): 4 + nsm1);
                }
            }

            NvertsPerRing++;

            int NfacesPerEnd, NfacesPerRing, Nfaces = 0;
            //MegaHoseSmooth SMOOTH = smooth;

            Nverts = (Segs + 1) * (NvertsPerRing + 1);                  // + 2;
            if (capends)
            {
                Nverts += 2;
            }

            NfacesPerEnd  = NvertsPerRing;
            NfacesPerRing = 6 * NvertsPerRing;
            Nfaces        = Segs * NfacesPerRing;       // + 2 * NfacesPerEnd;

            if (capends)
            {
                Nfaces += 2 * NfacesPerEnd;
            }

            if (SaveVertex == null || SaveVertex.Length != NvertsPerRing)
            {
                SaveVertex = new Vector3[NvertsPerRing];
                SaveUV     = new Vector2[NvertsPerRing];
            }

            if (calcnormals)
            {
                if (SaveNormals == null || SaveNormals.Length != NvertsPerRing)
                {
                    SaveNormals = new Vector3[NvertsPerRing];
                }
            }

            MakeSaveVertex(NvertsPerRing, nfillets, nsides, wtype);

            if (verts == null || verts.Length != Nverts)
            {
                verts = new Vector3[Nverts];
                uvs   = new Vector2[Nverts];
                faces = new int[Nfaces * 3];
            }

            if (calcnormals && (normals == null || normals.Length != Nverts))
            {
                normals = new Vector3[Nverts];
            }
        }

        if (Nverts == 0)
        {
            return;
        }

        bool mapmenow = mapmemapme;

        int thisvert = 0;
        int last     = Nverts - 1;
        int last2    = last - 1;
        int lastvpr  = NvertsPerRing;           // - 1;
        int maxseg   = Segs + 1;

        float flexhere;
        float dadjust;
        float flexlen;
        float flex1 = flexstart;
        float flex2 = flexstop;
        int   flexn = flexcycles;
        float flexd = flexdiameter;

        Vector3 ThisPosition;
        Vector2 uv = Vector2.zero;

        Matrix4x4 RingTM    = Matrix4x4.identity;
        Matrix4x4 invRingTM = Matrix4x4.identity;

        Vector3 lastup = starty;

        float sizeadj = 1.0f;

        for (int i = 0; i < maxseg; i++)
        {
            float incr = (float)i / (float)Segs;

            if (createfree)
            {
                ThisPosition = new Vector3(0.0f, 0.0f, Lf * incr);
            }
            else
            {
                int k = 0;
                ThisPosition = hosespline.InterpCurve3D(incr, true, ref k);
            }

            RingTM = GetSplineMat(hosespline, incr, true, ref lastup);

            if (!createfree)
            {
                RingTM = Tlocal * RingTM;
            }

            if (calcnormals)
            {
                invRingTM = RingTM;
                MegaMatrix.NoTrans(ref invRingTM);
            }

            if ((incr > flex1) && (incr < flex2) && flexon)
            {
                flexlen = flex2 - flex1;
                if (flexlen < 0.01f)
                {
                    flexlen = 0.01f;
                }
                flexhere = (incr - flex1) / flexlen;

                float ang = (float)flexn * flexhere * (Mathf.PI * 2.0f) + PIover2;
                dadjust = 1.0f + flexd * (1.0f - Mathf.Sin(ang));                       //(float)flexn * flexhere * (Mathf.PI * 2.0f) + PIover2));
            }
            else
            {
                dadjust = 0.0f;
            }

            if (usebulgecurve)
            {
                if (dadjust == 0.0f)
                {
                    dadjust = 1.0f + (bulge.Evaluate(incr + bulgeoffset) * bulgeamount);
                }
                else
                {
                    dadjust += bulge.Evaluate(incr + bulgeoffset) * bulgeamount;
                }
            }

            if (usesizecurve)
            {
                sizeadj = size.Evaluate(incr);
            }

            uv.x = 0.999999f * incr * uvscale.x;

            for (int j = 0; j < NvertsPerRing; j++)
            {
                int jj = j;                     // % NvertsPerRing;

                if (mapmenow)
                {
                    uv.y          = SaveUV[jj].y;
                    uvs[thisvert] = uv;                         //new Vector2(0.999999f * incr * uvscale.x, SaveUV[jj].y);
                }

                if (dadjust != 0.0f)
                {
                    verts[thisvert] = RingTM.MultiplyPoint(sizeadj * dadjust * SaveVertex[jj]);
                }
                else
                {
                    verts[thisvert] = RingTM.MultiplyPoint(sizeadj * SaveVertex[jj]);
                }


                if (calcnormals)
                {
                    normals[thisvert] = invRingTM.MultiplyPoint(SaveNormals[jj]).normalized;                            //.MultiplyPoint(-SaveNormals[jj]);
                }
                thisvert++;
            }

            if (mapmenow)
            {
                //uvs[Nverts + i] = new Vector2(0.999999f * incr, 0.999f);
            }

            if (capends)
            {
                if (i == 0)
                {
                    verts[last2] = (createfree ? ThisPosition : Tlocal.MultiplyPoint(ThisPosition));
                    if (mapmenow)
                    {
                        uvs[last2] = Vector3.zero;
                    }
                }
                else
                {
                    if (i == Segs)
                    {
                        verts[last] = createfree ? ThisPosition : Tlocal.MultiplyPoint(ThisPosition);
                        if (mapmenow)
                        {
                            uvs[last] = Vector3.zero;
                        }
                    }
                }
            }
        }

        //	Now, set up the faces
        int thisface = 0, v1, v2, v3, v4;

        v3 = last2;
        if (capends)
        {
            for (int i = 0; i < NvertsPerRing - 1; i++)
            {
                v1 = i;
                v2 = (i < lastvpr ? v1 + 1 : v1 - lastvpr);
                //v5 = (i < lastvpr ? v2 : Nverts);

                faces[thisface++] = v2;
                faces[thisface++] = v1;
                faces[thisface++] = v3;
            }
        }

        int ringnum = NvertsPerRing;            // + 1;

        for (int i = 0; i < Segs; i++)
        {
            for (int j = 0; j < NvertsPerRing - 1; j++)
            {
                v1 = i * ringnum + j;
                v2 = v1 + 1;                    //(j < lastvpr? v1 + 1 : v1 - lastvpr);
                v4 = v1 + ringnum;
                v3 = v2 + ringnum;
                faces[thisface++] = v1;
                faces[thisface++] = v2;
                faces[thisface++] = v3;
                faces[thisface++] = v1;
                faces[thisface++] = v3;
                faces[thisface++] = v4;
            }
        }

        int basevert = Segs * ringnum;          //NvertsPerRing;

        v3 = Nverts - 1;
        if (capends)
        {
            for (int i = 0; i < NvertsPerRing - 1; i++)
            {
                v1 = i + basevert;
                v2 = (i < lastvpr? v1 + 1 : v1 - lastvpr);
                //v5 = (i < lastvpr? v2 : Nverts + Segs);
                faces[thisface++] = v1;
                faces[thisface++] = v2;
                faces[thisface++] = v3;
            }
        }

        mesh.Clear();

        mesh.subMeshCount = 1;

        mesh.vertices  = verts;
        mesh.uv        = uvs;
        mesh.triangles = faces;

        if (calcnormals)
        {
            mesh.normals = normals;
        }
        else
        {
            mesh.RecalculateNormals();
        }
        mesh.RecalculateBounds();

#if UNITY_5_5 || UNITY_5_6 || UNITY_2017
#else
        if (optimize)
        {
            ;
        }
#endif

        if (calctangents)
        {
            MegaUtils.BuildTangents(mesh);
        }

        if (recalcCollider)
        {
            if (meshCol == null)
            {
                meshCol = GetComponent <MeshCollider>();
            }

            if (meshCol != null)
            {
                meshCol.sharedMesh = null;
                meshCol.sharedMesh = mesh;
                //bool con = meshCol.convex;
                //meshCol.convex = con;
            }
        }
    }
示例#3
0
    void MakeSaveVertex(int NvertsPerRing, int nfillets, int nsides, MegaHoseType wtype)
    {
        if (wtype == MegaHoseType.Round)
        {
            //Debug.Log("Verts " + NvertsPerRing);
            float ang  = (Mathf.PI * 2.0f) / (float)(NvertsPerRing - 1);
            float diar = rnddia;
            diar *= 0.5f;
            for (int i = 0; i < NvertsPerRing; i++)
            {
                float u = (float)(i + 1) * ang;
                SaveVertex[i] = new Vector3(diar * (float)Mathf.Cos(u), diar * (float)Mathf.Sin(u), 0.0f);
            }
        }
        else
        {
            if (wtype == MegaHoseType.Rectangle)
            {
                int   savevertcnt = 0;
                int   qtrverts    = 1 + nfillets;
                int   hlfverts    = 2 * qtrverts;
                int   thrverts    = qtrverts + hlfverts;
                float Wr          = rectwidth * 0.5f;
                float Dr          = rectdepth * 0.5f;
                float Zfr         = rectfillet;

                if (Zfr < 0.0f)
                {
                    Zfr = 0.0f;
                }

                if (nfillets > 0)
                {
                    float WmZ = Wr - Zfr, DmZ = Dr - Zfr;
                    float ZmW = -WmZ, ZmD = -DmZ;
                    SaveVertex[0]                   = new Vector3(Wr, DmZ, 0.0f);
                    SaveVertex[nfillets]            = new Vector3(WmZ, Dr, 0.0f);
                    SaveVertex[qtrverts]            = new Vector3(ZmW, Dr, 0.0f);
                    SaveVertex[qtrverts + nfillets] = new Vector3(-Wr, DmZ, 0.0f);
                    SaveVertex[hlfverts]            = new Vector3(-Wr, ZmD, 0.0f);
                    SaveVertex[hlfverts + nfillets] = new Vector3(ZmW, -Dr, 0.0f);
                    SaveVertex[thrverts]            = new Vector3(WmZ, -Dr, 0.0f);
                    SaveVertex[thrverts + nfillets] = new Vector3(Wr, ZmD, 0.0f);

                    if (nfillets > 1)
                    {
                        float ang = PIover2 / (float)nfillets;
                        savevertcnt = 1;
                        for (int i = 0; i < nfillets - 1; i++)
                        {
                            float u = (float)(i + 1) * ang;
                            float cu = Zfr * Mathf.Cos(u), su = Zfr * Mathf.Sin(u);
                            SaveVertex[savevertcnt]            = new Vector3(WmZ + cu, DmZ + su, 0.0f);
                            SaveVertex[savevertcnt + qtrverts] = new Vector3(ZmW - su, DmZ + cu, 0.0f);
                            SaveVertex[savevertcnt + hlfverts] = new Vector3(ZmW - cu, ZmD - su, 0.0f);
                            SaveVertex[savevertcnt + thrverts] = new Vector3(WmZ + su, ZmD - cu, 0.0f);
                            savevertcnt++;
                        }
                    }

                    SaveVertex[SaveVertex.Length - 1] = SaveVertex[0];
                }
                else
                {
                    if (smooth == MegaHoseSmooth.SMOOTHNONE)
                    {
                        SaveVertex[savevertcnt++] = new Vector3(Wr, Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(-Wr, Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(-Wr, Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(-Wr, -Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(-Wr, -Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(Wr, -Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(Wr, -Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(Wr, Dr, 0.0f);
                    }
                    else
                    {
                        SaveVertex[savevertcnt++] = new Vector3(Wr, Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(-Wr, Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(-Wr, -Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(Wr, -Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(Wr, Dr, 0.0f);
                    }
                }
            }
            else
            {
                int   savevertcnt = 0;
                float sang        = Mathf.PI / (float)nsides;

                float Wr  = dsecwidth * 0.5f;
                float Dr  = dsecdepth * 0.5f;
                float Zfr = dsecfillet;
                if (Zfr < 0.0f)
                {
                    Zfr = 0.0f;
                }

                float LeftCenter = Dr - Wr;

                if (nfillets > 0)
                {
                    float DmZ         = Dr - Zfr,
                          ZmD         = -DmZ,
                          WmZ         = Wr - Zfr;
                    int oneqtrverts   = 1 + nfillets;
                    int threeqtrverts = oneqtrverts + 1 + nsides;

                    SaveVertex[0]                        = new Vector3(Wr, DmZ, 0.0f);
                    SaveVertex[nfillets]                 = new Vector3(WmZ, Dr, 0.0f);
                    SaveVertex[oneqtrverts]              = new Vector3(LeftCenter, Dr, 0.0f);
                    SaveVertex[oneqtrverts + nsides]     = new Vector3(LeftCenter, -Dr, 0.0f);
                    SaveVertex[threeqtrverts]            = new Vector3(WmZ, -Dr, 0.0f);
                    SaveVertex[threeqtrverts + nfillets] = new Vector3(Wr, ZmD, 0.0f);

                    if (nfillets > 1)
                    {
                        float ang = PIover2 / (float)nfillets;
                        savevertcnt = 1;
                        for (int i = 0; i < nfillets - 1; i++)
                        {
                            float u  = (float)(i + 1) * ang;
                            float cu = Zfr * Mathf.Cos(u);
                            float su = Zfr * Mathf.Sin(u);
                            SaveVertex[savevertcnt] = new Vector3(WmZ + cu, DmZ + su, 0.0f);
                            SaveVertex[savevertcnt + threeqtrverts] = new Vector3(WmZ + su, ZmD - cu, 0.0f);
                            savevertcnt++;
                        }
                    }
                    savevertcnt = 1 + oneqtrverts;
                    for (int i = 0; i < nsides - 1; i++)
                    {
                        float u  = (float)(i + 1) * sang;
                        float cu = Dr * Mathf.Cos(u);
                        float su = Dr * Mathf.Sin(u);
                        SaveVertex[savevertcnt] = new Vector3(LeftCenter - su, cu, 0.0f);
                        savevertcnt++;
                    }
                }
                else
                {
                    SaveVertex[savevertcnt] = new Vector3(Wr, Dr, 0.0f);
                    savevertcnt++;
                    SaveVertex[savevertcnt] = new Vector3(LeftCenter, Dr, 0.0f);
                    savevertcnt++;
                    for (int i = 0; i < nsides - 1; i++)
                    {
                        float u  = (float)(i + 1) * sang;
                        float cu = Dr * Mathf.Cos(u);
                        float su = Dr * Mathf.Sin(u);
                        SaveVertex[savevertcnt] = new Vector3(LeftCenter - su, cu, 0.0f);
                        savevertcnt++;
                    }
                    SaveVertex[savevertcnt] = new Vector3(LeftCenter, -Dr, 0.0f);
                    savevertcnt++;
                    SaveVertex[savevertcnt] = new Vector3(Wr, -Dr, 0.0f);
                    savevertcnt++;
                }

                SaveVertex[SaveVertex.Length - 1] = SaveVertex[0];
            }
        }

        // UVs
        float   dist = 0.0f;
        Vector3 last = Vector3.zero;

        for (int i = 0; i < NvertsPerRing; i++)
        {
            if (i > 0)
            {
                dist += (SaveVertex[i] - last).magnitude;
            }

            SaveUV[i] = new Vector2(0.0f, dist * uvscale.y);

            last = SaveVertex[i];
        }

        for (int i = 0; i < NvertsPerRing; i++)
        {
            SaveUV[i].y /= dist;
        }

        float rotangle = 0.0f;

        switch (wtype)
        {
        case MegaHoseType.Round:                rotangle = rndrot;                      break;

        case MegaHoseType.Rectangle:    rotangle = rectrotangle;        break;

        case MegaHoseType.DSection:             rotangle = dsecrotangle;        break;
        }

        if (rotangle != 0.0f)
        {
            rotangle *= Mathf.Deg2Rad;
            float cosu = Mathf.Cos(rotangle);
            float sinu = Mathf.Sin(rotangle);
            for (int m = 0; m < NvertsPerRing; m++)
            {
                float tempx = SaveVertex[m].x * cosu - SaveVertex[m].y * sinu;
                float tempy = SaveVertex[m].x * sinu + SaveVertex[m].y * cosu;
                SaveVertex[m].x = tempx;
                SaveVertex[m].y = tempy;
            }
        }

        // Normals
        if (calcnormals)
        {
            for (int i = 0; i < NvertsPerRing; i++)
            {
                int     ii    = (i + 1) % NvertsPerRing;
                Vector3 delta = (SaveVertex[ii] - SaveVertex[i]).normalized;

                //SaveNormals[i] = new Vector3(-delta.y, delta.x, 0.0f);
                //SaveNormals[i] = new Vector3(-delta.x, delta.y, 0.0f);
                //SaveNormals[i] = new Vector3(delta.y, delta.x, 0.0f);
                SaveNormals[i] = new Vector3(delta.y, -delta.x, 0.0f);
            }
        }
    }
示例#4
0
文件: MegaHose.cs 项目: Morac/Orca6
    void MakeSaveVertex(int NvertsPerRing, int nfillets, int nsides, MegaHoseType wtype)
    {
        if ( wtype == MegaHoseType.Round )
        {
            //Debug.Log("Verts " + NvertsPerRing);
            float ang = (Mathf.PI * 2.0f) / (float)(NvertsPerRing - 1);
            float diar = rnddia;
            diar *= 0.5f;
            for ( int i = 0; i < NvertsPerRing; i++ )
            {
                float u = (float)(i + 1) * ang;
                SaveVertex[i] = new Vector3(diar * (float)Mathf.Cos(u), diar * (float)Mathf.Sin(u), 0.0f);
            }
        }
        else
        {
            if ( wtype == MegaHoseType.Rectangle )
            {
                int savevertcnt = 0;
                int qtrverts = 1 + nfillets;
                int hlfverts = 2 * qtrverts;
                int thrverts = qtrverts + hlfverts;
                float Wr = rectwidth * 0.5f;
                float Dr = rectdepth * 0.5f;
                float Zfr = rectfillet;

                if ( Zfr < 0.0f )
                    Zfr = 0.0f;

                if ( nfillets > 0 )
                {
                    float WmZ = Wr - Zfr, DmZ = Dr - Zfr;
                    float ZmW = -WmZ, ZmD = -DmZ;
                    SaveVertex[0]					= new Vector3(Wr , DmZ, 0.0f);
                    SaveVertex[nfillets]			= new Vector3(WmZ, Dr , 0.0f);
                    SaveVertex[qtrverts]			= new Vector3(ZmW, Dr , 0.0f);
                    SaveVertex[qtrverts + nfillets]	= new Vector3(-Wr, DmZ, 0.0f);
                    SaveVertex[hlfverts]			= new Vector3(-Wr, ZmD, 0.0f);
                    SaveVertex[hlfverts + nfillets]	= new Vector3(ZmW, -Dr, 0.0f);
                    SaveVertex[thrverts]			= new Vector3(WmZ, -Dr, 0.0f);
                    SaveVertex[thrverts + nfillets]	= new Vector3(Wr , ZmD, 0.0f);

                    if ( nfillets > 1 )
                    {
                        float ang = PIover2 / (float)nfillets;
                        savevertcnt = 1;
                        for ( int i = 0; i < nfillets - 1; i++ )
                        {
                            float u = (float)(i + 1) * ang;
                            float cu = Zfr * Mathf.Cos(u), su = Zfr * Mathf.Sin(u);
                            SaveVertex[savevertcnt]				= new Vector3(WmZ + cu, DmZ + su, 0.0f);
                            SaveVertex[savevertcnt + qtrverts]	= new Vector3(ZmW - su, DmZ + cu, 0.0f);
                            SaveVertex[savevertcnt + hlfverts]	= new Vector3(ZmW - cu, ZmD - su, 0.0f);
                            SaveVertex[savevertcnt + thrverts]	= new Vector3(WmZ + su, ZmD - cu, 0.0f);
                            savevertcnt++;
                        }
                    }

                    SaveVertex[SaveVertex.Length - 1] = SaveVertex[0];
                }
                else
                {
                    if ( smooth == MegaHoseSmooth.SMOOTHNONE )
                    {
                        SaveVertex[savevertcnt++] = new Vector3(Wr, Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(-Wr, Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(-Wr, Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(-Wr, -Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(-Wr, -Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(Wr, -Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(Wr, -Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(Wr, Dr, 0.0f);
                    }
                    else
                    {
                        SaveVertex[savevertcnt++] = new Vector3(Wr, Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(-Wr, Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(-Wr, -Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(Wr, -Dr, 0.0f);
                        SaveVertex[savevertcnt++] = new Vector3(Wr, Dr, 0.0f);
                    }
                }
            }
            else
            {
                int savevertcnt = 0;
                float sang = Mathf.PI / (float)nsides;

                float Wr = dsecwidth * 0.5f;
                float Dr = dsecdepth * 0.5f;
                float Zfr = dsecfillet;
                if ( Zfr < 0.0f )
                    Zfr = 0.0f;

                float LeftCenter = Dr-Wr;

                if ( nfillets > 0 )
                {
                    float DmZ = Dr-Zfr,
                      ZmD = -DmZ,
                      WmZ = Wr-Zfr;
                    int oneqtrverts = 1 + nfillets;
                    int threeqtrverts = oneqtrverts + 1 + nsides;

                    SaveVertex[0]							= new Vector3(Wr , DmZ, 0.0f);
                    SaveVertex[nfillets]					= new Vector3(WmZ, Dr , 0.0f);
                    SaveVertex[oneqtrverts]					= new Vector3(LeftCenter, Dr, 0.0f);
                    SaveVertex[oneqtrverts + nsides]		= new Vector3(LeftCenter, -Dr, 0.0f);
                    SaveVertex[threeqtrverts]				= new Vector3(WmZ, -Dr , 0.0f);
                    SaveVertex[threeqtrverts + nfillets]	= new Vector3(Wr, ZmD, 0.0f);

                    if ( nfillets > 1 )
                    {
                        float ang = PIover2 / (float)nfillets;
                        savevertcnt = 1;
                        for ( int i = 0; i < nfillets - 1; i++ )
                        {
                            float u = (float)(i + 1) * ang;
                            float cu = Zfr * Mathf.Cos(u);
                            float su = Zfr * Mathf.Sin(u);
                            SaveVertex[savevertcnt]					= new Vector3(WmZ + cu, DmZ + su, 0.0f);
                            SaveVertex[savevertcnt+threeqtrverts]	= new Vector3(WmZ + su, ZmD - cu, 0.0f);
                            savevertcnt++;
                        }
                    }
                    savevertcnt = 1 + oneqtrverts;
                    for ( int i = 0; i < nsides - 1; i++ )
                    {
                        float u = (float)(i + 1) * sang;
                        float cu = Dr * Mathf.Cos(u);
                        float su = Dr * Mathf.Sin(u);
                        SaveVertex[savevertcnt] = new Vector3(LeftCenter - su, cu, 0.0f);
                        savevertcnt++;
                    }
                }
                else
                {
                    SaveVertex[savevertcnt] = new Vector3(Wr, Dr, 0.0f);
                    savevertcnt++;
                    SaveVertex[savevertcnt] = new Vector3(LeftCenter, Dr, 0.0f);
                    savevertcnt++;
                    for ( int i = 0; i < nsides - 1; i++ )
                    {
                        float u = (float)(i + 1) * sang;
                        float cu = Dr * Mathf.Cos(u);
                        float su = Dr * Mathf.Sin(u);
                        SaveVertex[savevertcnt] = new Vector3(LeftCenter - su, cu, 0.0f);
                        savevertcnt++;
                    }
                    SaveVertex[savevertcnt] = new Vector3(LeftCenter, -Dr, 0.0f);
                    savevertcnt++;
                    SaveVertex[savevertcnt] = new Vector3(Wr, -Dr, 0.0f);
                    savevertcnt++;
                }

                SaveVertex[SaveVertex.Length - 1] = SaveVertex[0];
            }
        }

        // UVs
        float dist = 0.0f;
        Vector3 last = Vector3.zero;

        for ( int i = 0; i < NvertsPerRing; i++ )
        {
            if ( i > 0 )
                dist += (SaveVertex[i] - last).magnitude;

            SaveUV[i] = new Vector2(0.0f, dist * uvscale.y);

            last = SaveVertex[i];
        }

        for ( int i = 0; i < NvertsPerRing; i++ )
            SaveUV[i].y /= dist;

        float rotangle = 0.0f;
        switch ( wtype )
        {
            case MegaHoseType.Round:		rotangle = rndrot;			break;
            case MegaHoseType.Rectangle:	rotangle = rectrotangle;	break;
            case MegaHoseType.DSection:		rotangle = dsecrotangle;	break;
        }

        if ( rotangle != 0.0f )
        {
            rotangle *= Mathf.Deg2Rad;
            float cosu = Mathf.Cos(rotangle);
            float sinu = Mathf.Sin(rotangle);
            for ( int m = 0; m < NvertsPerRing; m++ )
            {
                float tempx = SaveVertex[m].x * cosu - SaveVertex[m].y * sinu;
                float tempy = SaveVertex[m].x * sinu + SaveVertex[m].y * cosu;
                SaveVertex[m].x = tempx;
                SaveVertex[m].y = tempy;
            }
        }

        // Normals
        if ( calcnormals )
        {
            for ( int i = 0; i < NvertsPerRing; i++ )
            {
                int ii = (i + 1) % NvertsPerRing;
                Vector3 delta = (SaveVertex[ii] - SaveVertex[i]).normalized;

                //SaveNormals[i] = new Vector3(-delta.y, delta.x, 0.0f);
                //SaveNormals[i] = new Vector3(-delta.x, delta.y, 0.0f);
                //SaveNormals[i] = new Vector3(delta.y, delta.x, 0.0f);
                SaveNormals[i] = new Vector3(delta.y, -delta.x, 0.0f);
            }
        }
    }