예제 #1
0
    private static BigCombineInstance MakeInstance(CapsuleCollider c, Bounds bounds)
    {
        BigCombineInstance ci = new BigCombineInstance();

        ci.transform = c.gameObject.transform.localToWorldMatrix;
        ci.bigMesh   = new BigMesh(PrimitiveType.Capsule);

        Vector3 dir = Vector3.forward;

        if (c.direction == 0)
        {
            dir = Vector3.right;
        }
        else if (c.direction == 1)
        {
            dir = Vector3.up;
        }

        ci.transform = ci.transform * Matrix4x4.TRS(
            c.center,
            Quaternion.FromToRotation(Vector3.up, dir),
            new Vector3(
                c.radius / 0.5f,
                (c.height + 2 * c.radius) / 3,
                c.radius / 0.5f));
        return(ci);
    }
예제 #2
0
    private static BigCombineInstance MakeInstance(MeshCollider c, Bounds bounds)
    {
        Mesh m = c.sharedMesh;
        BigCombineInstance ci = new BigCombineInstance();

        ci.bigMesh   = new BigMesh(m);
        ci.transform = c.gameObject.transform.localToWorldMatrix;
        return(ci);
    }
예제 #3
0
    private static BigCombineInstance MakeInstance(SphereCollider c, Bounds bounds)
    {
        BigCombineInstance ci = new BigCombineInstance();

        ci.transform = c.gameObject.transform.localToWorldMatrix;
        ci.bigMesh   = new BigMesh(PrimitiveType.Sphere);
        ci.transform = ci.transform * Matrix4x4.TRS(
            c.center,
            Quaternion.identity,
            Vector3.one * c.radius / 0.5f);
        return(ci);
    }
예제 #4
0
    private static BigCombineInstance MakeInstance(BoxCollider c, Bounds bounds)
    {
        BigCombineInstance ci = new BigCombineInstance();

        ci.transform = c.gameObject.transform.localToWorldMatrix;
        ci.bigMesh   = new BigMesh(PrimitiveType.Cube);
        ci.transform = ci.transform * Matrix4x4.TRS(
            c.center,
            Quaternion.identity,
            c.extents * 2);
        return(ci);
    }
예제 #5
0
    private static BigCombineInstance MakeInstance(TerrainCollider c, Bounds bounds)
    {
        Bounds localBounds = new Bounds(
            bounds.center - c.transform.position,
            bounds.size);
        BigCombineInstance ci = new BigCombineInstance();

        ci.bigMesh   = new BigMesh(((TerrainCollider)c).terrainData, localBounds);
        ci.transform = Matrix4x4.TRS(
            c.transform.position,
            Quaternion.identity,
            Vector3.one);
        return(ci);
    }
예제 #6
0
        public BigMesh(BigCombineInstance[] instances)
        {
            int numVerts = 0;
            int numIndices = 0;

            foreach(BigCombineInstance bci in instances)
            {
                numVerts += bci.bigMesh.vertices.Length;
                numIndices += bci.bigMesh.triangles.Length;
            }

            this.vertices = new Vector3[numVerts];
            this.triangles = new int[numIndices];

            int vertBase = 0;
            int indexBase = 0;
            foreach (BigCombineInstance bci in instances)
            {
                Vector3[] vertIn = bci.bigMesh.vertices;
                for (int iv = 0; iv < vertIn.Length; iv++)
                    vertices[vertBase + iv] =
                        bci.transform.MultiplyPoint3x4(vertIn[iv]);

                int[] triIn = bci.bigMesh.triangles;
                for (int ii=0; ii<triIn.Length; ii++)
                    triangles[indexBase + ii] = triIn[ii] + vertBase;

                vertBase += bci.bigMesh.vertices.Length;
                indexBase += bci.bigMesh.triangles.Length;
            }
        }
예제 #7
0
 private static BigCombineInstance MakeInstance(SphereCollider c, Bounds bounds)
 {
     BigCombineInstance ci = new BigCombineInstance();
     ci.transform = c.gameObject.transform.localToWorldMatrix;
     ci.bigMesh = new BigMesh(PrimitiveType.Sphere);
     ci.transform = ci.transform * Matrix4x4.TRS(
         c.center,
         Quaternion.identity,
         Vector3.one * c.radius / 0.5f);
     return ci;
 }
예제 #8
0
    private static BigCombineInstance MakeInstance(CapsuleCollider c, Bounds bounds)
    {
        BigCombineInstance ci = new BigCombineInstance();
        ci.transform = c.gameObject.transform.localToWorldMatrix;
        ci.bigMesh = new BigMesh(PrimitiveType.Capsule);

        Vector3 dir = Vector3.forward;
        if (c.direction == 0)
            dir = Vector3.right;
        else if (c.direction == 1)
            dir = Vector3.up;

        ci.transform = ci.transform * Matrix4x4.TRS(
            c.center,
            Quaternion.FromToRotation(Vector3.up, dir),
            new Vector3(
                c.radius / 0.5f,
                (c.height + 2 * c.radius) / 3,
                c.radius / 0.5f));
        return ci;
    }
예제 #9
0
 private static BigCombineInstance MakeInstance(BoxCollider c, Bounds bounds)
 {
     BigCombineInstance ci = new BigCombineInstance();
     ci.transform = c.gameObject.transform.localToWorldMatrix;
     ci.bigMesh = new BigMesh(PrimitiveType.Cube);
     ci.transform = ci.transform * Matrix4x4.TRS(
         c.center,
         Quaternion.identity,
         c.extents * 2);
     return ci;
 }
예제 #10
0
 private static BigCombineInstance MakeInstance(TerrainCollider c, Bounds bounds)
 {
     Bounds localBounds = new Bounds(
         bounds.center - c.transform.position,
         bounds.size);
     BigCombineInstance ci = new BigCombineInstance();
     ci.bigMesh = new BigMesh(((TerrainCollider)c).terrainData, localBounds);
     ci.transform = Matrix4x4.TRS(
         c.transform.position,
         Quaternion.identity,
         Vector3.one);
     return ci;
 }
예제 #11
0
 private static BigCombineInstance MakeInstance(MeshCollider c, Bounds bounds)
 {
     Mesh m = c.sharedMesh;
     BigCombineInstance ci = new BigCombineInstance();
     ci.bigMesh = new BigMesh(m);
     ci.transform = c.gameObject.transform.localToWorldMatrix;
     return ci;
 }