Example #1
0
    public List <Vector3[]>[] trigsInCells; // v1, v2, v3, normal

    public void RecalculateMesh(HoloAd config)
    {
        trigsInCells = new List <Vector3[]> [config.maxX * config.maxY * config.maxZ];


        for (int i = 0; i < config.maxX * config.maxY * config.maxZ; i++)
        {
            trigsInCells[i] = new List <Vector3[]>();
        }

        int childCount = config.spatialMapping.transform.childCount;

        for (int i = 0; i < childCount; i++)
        {
            GameObject child      = config.spatialMapping.transform.GetChild(i).gameObject;
            Mesh       mesh       = child.GetComponent <MeshFilter>().mesh;
            Vector3[]  meshVerts  = mesh.vertices;
            int[]      meshTrigs  = mesh.triangles;
            int        trigsCount = meshTrigs.Length;

            for (int trigIndex = 0; trigIndex < trigsCount; trigIndex += 3)
            {
                int[] verts = { meshTrigs[trigIndex], meshTrigs[trigIndex + 1], meshTrigs[trigIndex + 2] };
                foreach (int v in verts)
                {
                    Vector3 vec = config.room.transform.InverseTransformPoint(child.transform.TransformPoint(meshVerts[v]));

                    float cubeSide = config.matrixScale;
                    int[] matCords =
                    {
                        (int)System.Math.Round(config.room.transform.localScale.x * (vec.x + .5f) / cubeSide),
                        (int)System.Math.Round(config.room.transform.localScale.y * (vec.y + .5f) / cubeSide),
                        (int)System.Math.Round(config.room.transform.localScale.z * (vec.z + .5f) / cubeSide)
                    };


                    if (config.IsCellInMatrix(matCords[0], matCords[1], matCords[2]))
                    {
                        Vector3[] trig = new Vector3[] {
                            config.room.transform.InverseTransformPoint(child.transform.TransformPoint(meshVerts[verts[0]])),
                            config.room.transform.InverseTransformPoint(child.transform.TransformPoint(meshVerts[verts[1]])),
                            config.room.transform.InverseTransformPoint(child.transform.TransformPoint(meshVerts[verts[2]])),
                            Vector3.Cross(meshVerts[verts[0]] - meshVerts[verts[2]], meshVerts[verts[0]] - meshVerts[verts[1]]).normalized
                        };

                        trigsInCells[matCords[0] + config.maxX * matCords[1] + config.maxX * config.maxY * matCords[2]].Add(trig);
                        break;
                    }
                }
            }
        }
    }