void Start()
 {
     floor    = transform.GetComponentInChildren <FloorMesh>();
     floor.gd = this;
     walls    = transform.GetComponentInChildren <WallMesh>();
     walls.gd = this;
 }
Пример #2
0
    public List <Mesh> GenerateWalls()  //finds individual wall 'chains' then generates all of the meshes
    {
        List <Mesh> meshes = new List <Mesh>();

        FindWallVerticies();

        while (wall_chain.Count > 0)
        {
            List <Vector3> verticies = CollectWallChain();
            meshes.Add(WallMesh.GenerateWallMesh(verticies, 2));
        }

        return(meshes);
    }
Пример #3
0
        public static Mesh[] MeshesForWall(this Wall wall)
        {
            sortTo = wall.Start.Point;

            float   angle      = GeometryExtensions.GetAngleRadian(wall.Start.Point.ToVector2(), wall.End.Point.ToVector2());
            Vector3 frontStart = wall.Start.Point;
            Vector3 frontEnd   = wall.End.Point;

            Vector2 outerStart = GeometryExtensions.Polar2Cartesian(wall.Start.Point.ToVector2(), angle - Mathf.PI / 2, wall.Thickness);
            Vector2 outerEnd   = GeometryExtensions.Polar2Cartesian(wall.End.Point.ToVector2(), angle - Mathf.PI / 2, wall.Thickness);
            Vector3 backStart  = new Vector3(outerStart.x, wall.Start.Point.y, outerStart.y);
            Vector3 backEnd    = new Vector3(outerEnd.x, wall.End.Point.y, outerEnd.y);

            if (wall.Openings.Count == 0)
            {
                return(new Mesh[] { WallMesh.GenerateWallMesh(frontStart, frontEnd, backStart, backEnd, wall.Height) });
            }
            else
            {
                int      openingsLength = wall.Openings.Count;
                string[] tagsForMeshes  = new string[1 + openingsLength * 3];

                Mesh[] meshes   = new Mesh[1 + openingsLength * 3];
                var    openings = wall.Openings.ToArray();
                Array.Sort(openings, new OpeningComparer());

                //miért az elsõ opening méreteit vesszük alapul és nem ciklusban mindig a sajátját

                float length = Vector3.Distance(openings[0].Start.Point, openings[0].End.Point);
                float ll     = Mathf.Sqrt(wall.Thickness * wall.Thickness + length * length);

                Vector2 openingStart = new Vector2(openings[0].Start.Point.x, openings[0].Start.Point.z);
                Vector2 openingEnd   = new Vector2(openings[0].End.Point.x, openings[0].End.Point.z);

                Vector2 outerOpeningStart = GeometryExtensions.GetPointFrom2Points2Distances(openingStart, wall.Thickness, openingEnd, ll, false);
                Vector2 outerOpeningEnd   = GeometryExtensions.GetPointFrom2Points2Distances(openingEnd, wall.Thickness, openingStart, ll, false);

                meshes[0] = WallMesh.GenerateWallMesh(
                    frontStart,
                    new Vector3(openingStart.x, frontStart.y, openingStart.y),
                    backStart,
                    new Vector3(outerOpeningStart.x, frontStart.y, outerOpeningStart.y),
                    wall.Height
                    );
                tagsForMeshes[0] = "fullWallSegment";

                for (int i = 0; i < openingsLength; i++)
                {
                    length = Vector3.Distance(openings[i].Start.Point, openings[i].End.Point);
                    ll     = Mathf.Sqrt(wall.Thickness * wall.Thickness + length * length);

                    openingStart = new Vector2(openings[i].Start.Point.x, openings[i].Start.Point.z);
                    openingEnd   = new Vector2(openings[i].End.Point.x, openings[i].End.Point.z);

                    outerOpeningStart = GeometryExtensions.GetPointFrom2Points2Distances(openingStart, wall.Thickness, openingEnd, ll, false);
                    outerOpeningEnd   = GeometryExtensions.GetPointFrom2Points2Distances(openingEnd, wall.Thickness, openingStart, ll, true);

                    //Debug.Log(i + ". opening start:  " + openings[i].Start.Position.x + ", " + openings[i].Start.Position.y + ", " + openings[i].Start.Position.z);
                    meshes[1 + i * 3] = WallMesh.GenerateWallMesh(
                        new Vector3(openingStart.x, frontStart.y, openingStart.y),
                        new Vector3(openingEnd.x, frontStart.y, openingEnd.y),
                        new Vector3(outerOpeningStart.x, frontStart.y, outerOpeningStart.y),
                        new Vector3(outerOpeningEnd.x, frontStart.y, outerOpeningEnd.y),
                        openings[i].Sill
                        );
                    tagsForMeshes[1 + i * 3] = "partialWallSegment";

                    meshes[2 + i * 3] = WallMesh.GenerateWallMesh(
                        new Vector3(openingStart.x, frontStart.y + openings[i].Height + openings[i].Sill, openingStart.y),
                        new Vector3(openingEnd.x, frontStart.y + openings[i].Height + openings[i].Sill, openingEnd.y),
                        new Vector3(outerOpeningStart.x, frontStart.y + openings[i].Height + openings[i].Sill, outerOpeningStart.y),
                        new Vector3(outerOpeningEnd.x, frontStart.y + openings[i].Height + openings[i].Sill, outerOpeningEnd.y),
                        wall.Height - (openings[i].Sill + openings[i].Height)
                        );
                    tagsForMeshes[2 + i * 3] = "partialWallSegment";

                    if (i < openingsLength - 1)
                    {
                        float lengthn = Vector3.Distance(openings[i + 1].Start.Point, openings[i + 1].End.Point);
                        float lln     = Mathf.Sqrt(wall.Thickness * wall.Thickness + lengthn * lengthn);

                        Vector2 openingStartn = new Vector2(openings[i + 1].Start.Point.x, openings[i + 1].Start.Point.z);
                        Vector2 openingEndn   = new Vector2(openings[i + 1].End.Point.x, openings[i + 1].End.Point.z);

                        Vector2 outerOpeningStartn = GeometryExtensions.GetPointFrom2Points2Distances(openingStartn, wall.Thickness, openingEndn, lln, true);

                        meshes[3 + i * 3] = WallMesh.GenerateWallMesh(
                            new Vector3(openingEnd.x, frontStart.y, openingEnd.y),
                            new Vector3(openingStartn.x, frontStart.y, openingStartn.y),
                            new Vector3(outerOpeningEnd.x, frontStart.y, outerOpeningEnd.y),
                            new Vector3(outerOpeningStartn.x, frontStart.y, outerOpeningStartn.y),
                            wall.Height
                            );
                        tagsForMeshes[3 + i * 3] = "fullWallSegment";
                    }
                }

                float lengthlast = Vector3.Distance(openings[openingsLength - 1].Start.Point, openings[openingsLength - 1].End.Point);
                float lllast     = Mathf.Sqrt(wall.Thickness * wall.Thickness + lengthlast * lengthlast);

                Vector2 openingStartLast = new Vector2(openings[openingsLength - 1].Start.Point.x, openings[openingsLength - 1].Start.Point.z);
                Vector2 openingEndLast   = new Vector2(openings[openingsLength - 1].End.Point.x, openings[openingsLength - 1].End.Point.z);

                Vector2 outerOpeningEndLast = GeometryExtensions.GetPointFrom2Points2Distances(openingEndLast, wall.Thickness, openingStartLast, lllast, true);

                meshes[openingsLength * 3] = WallMesh.GenerateWallMesh(
                    new Vector3(openingEndLast.x, frontStart.y, openingEndLast.y),
                    frontEnd,
                    new Vector3(outerOpeningEndLast.x, frontStart.y, outerOpeningEndLast.y),
                    backEnd,
                    wall.Height
                    );
                tagsForMeshes[openingsLength * 3] = "fullWallSegment";
                return(meshes);
            }
        }