Esempio n. 1
0
        private Mesh CreateEastMesh(UnitMeshModificationModel model)
        {
            var m = model;

            var mesh = new Mesh();

            var vertices = new List <Vector3>()
            {
                V(0, m.meshOrigin.y, m.DepthEndPoint),
                V(0, m.HeightEndPoint, m.meshOrigin.z),
                V(0, m.meshOrigin.y, m.meshOrigin.z),
                V(0, m.HeightEndPoint, m.DepthEndPoint)
            };

            mesh.SetVertices(vertices);

            var triangles = new List <int>()
            {
                0, 1, 2,
                0, 3, 1
            };

            mesh.SetTriangles(triangles, 0);

            var normals = new List <Vector3>()
            {
                Vector3.left,
                Vector3.left,
                Vector3.left,
                Vector3.left
            };

            mesh.SetNormals(normals);

            var uvs = new List <Vector2>()
            {
                V(0, 0),
                V(1, 1),
                V(1, 0),
                V(0, 1)
            };


            mesh.SetUVs(0, uvs);

            mesh.RecalculateBounds();
            ;


            return(mesh);
        }
Esempio n. 2
0
        private Mesh CreateSouthMesh(UnitMeshModificationModel model)
        {
            var m = model;

            var mesh = new Mesh();

            var vertices = new List <Vector3>()
            {
                V(m.WidthEndPoint, m.meshOrigin.y, 0),
                V(m.WidthEndPoint, m.HeightEndPoint, 0),
                V(m.meshOrigin.x, m.HeightEndPoint, 0),
                V(m.meshOrigin.x, m.meshOrigin.y, 0)
            };

            mesh.SetVertices(vertices);

            var triangles = new List <int>()
            {
                0, 1, 2, 0, 2, 3
            };

            mesh.SetTriangles(triangles, 0);

            var normals = new List <Vector3>()
            {
                Vector3.forward,
                Vector3.forward,
                Vector3.forward,
                Vector3.forward
            };

            mesh.SetNormals(normals);

            // var uvs = MeshUtilities.GetInvertPlaneUVs();

            var uvs = new List <Vector2>()
            {
                V(0, 0),
                V(0, 1),
                V(1, 1),
                V(1, 0)
            };

            mesh.SetUVs(0, uvs);

            mesh.RecalculateBounds();
            ;

            return(mesh);
        }
Esempio n. 3
0
        public override Rect OnGUI()
        {
            var rect = EditorGUILayout.BeginVertical();

            roomDimension = EditorGUILayout.Vector3Field("Room roomDimension", roomDimension);
            pivotOrigin   = EditorGUILayout.Vector3Field("Origin", pivotOrigin);

            useCenterAsOrigin = EditorGUILayout.ToggleLeft("Use the Center as origin!", useCenterAsOrigin);

            addBoxCollider = EditorGUILayout.ToggleLeft("Add Box Collider", addBoxCollider);

            doNotCreateVisualStructure = EditorGUILayout.ToggleLeft("Don't create visual structure", doNotCreateVisualStructure);

            if (!doNotCreateVisualStructure)
            {
                createFromPrimitivePlanes = EditorGUILayout.ToggleLeft("Create from primitives", createFromPrimitivePlanes);

                createAsWholeMesh = EditorGUILayout.ToggleLeft("Create as whole Mesh", createAsWholeMesh);

                useUVTestMaterial = EditorGUILayout.ToggleLeft("Use UV Test material", useUVTestMaterial);
            }

            if (GUILayout.Button("Create new Maze Unit (Room)", GUILayout.Height(35f)))
            {
                if (expectedChildComponents == null)
                {
                    Initialize();
                }

                var resizeModel = new UnitMeshModificationModel(roomDimension, pivotOrigin, useCenterAsOrigin);
                constructedUnit = ConstructUnit(resizeModel);
            }

            if (GUILayout.Button("Resize Unit (Room)"))
            {
                var resizeModel = new UnitMeshModificationModel(roomDimension, pivotOrigin, useCenterAsOrigin);

                MazeEditorUtil.ResizeUnitByMeshModification(constructedUnit.gameObject, resizeModel);
            }
            constructedUnit = EditorGUILayout.ObjectField("Created Unit", constructedUnit, typeof(GameObject), true) as MazeUnit;

            EditorGUILayout.Space();

            Render_SaveAsPrefab_Option <MazeUnit>(constructedUnit);

            EditorGUILayout.EndVertical();

            return(rect);
        }
Esempio n. 4
0
        private Mesh CreateNorthMesh(UnitMeshModificationModel model)
        {
            var m = model;

            var mesh = new Mesh();

            var vertices = new List <Vector3>()
            {
                V(m.WidthEndPoint, m.meshOrigin.y, 0),
                V(m.meshOrigin.x, m.HeightEndPoint, 0),
                V(m.meshOrigin.x, m.meshOrigin.y, 0),
                V(m.WidthEndPoint, m.HeightEndPoint, 0)
            };



            mesh.SetVertices(vertices);

            var triangles = new List <int>()
            {
                0,                    // First triangle - count the
                2,
                1,
                0,                    // Second triangle
                1,
                3
            };

            mesh.SetTriangles(triangles, 0);

            var normals = new List <Vector3>()
            {
                Vector3.back,
                Vector3.back,
                Vector3.back,
                Vector3.back
            };

            mesh.SetNormals(normals);

            var uvs = MeshUtilities.GetPlaneUVs();

            mesh.SetUVs(0, uvs);

            mesh.RecalculateBounds();
            ;

            return(mesh);
        }
Esempio n. 5
0
        private Mesh CreateFloorMesh(UnitMeshModificationModel model)
        {
            var m = model;

            var mesh = new Mesh();

            var vertices = new List <Vector3>()
            {
                V(m.WidthEndPoint, 0, m.meshOrigin.z),
                V(m.meshOrigin.x, 0, m.DepthEndPoint),
                V(m.meshOrigin.x, 0, m.meshOrigin.z),
                V(m.WidthEndPoint, 0, m.DepthEndPoint)
            };

            mesh.SetVertices(vertices);

            var triangles = new List <int>()
            {
                // original 0 1 2 1 0 3

                2,                 // First triangle - count the
                1,
                0,
                3,                 // Second triangle
                0,
                1
            };

            mesh.SetTriangles(triangles, 0);

            var normals = new List <Vector3>()
            {
                Vector3.up,
                Vector3.up,
                Vector3.up,
                Vector3.up
            };

            mesh.SetNormals(normals);

            var uvs = MeshUtilities.GetPlaneUVs();

            mesh.SetUVs(0, uvs);

            mesh.RecalculateBounds();
            ;

            return(mesh);
        }
Esempio n. 6
0
        private MazeUnit ConstructUnit(UnitMeshModificationModel creationModel)
        {
            var newUnit = new GameObject("MazeUnit");

            var mazeUnit = newUnit.AddComponent <MazeUnit>();

            mazeUnit.Initialize(RoomDimension);

            var boxCollider = newUnit.AddComponent <BoxCollider>();

            boxCollider.center = new Vector3(0, roomDimension.y / 2, 0);

            boxCollider.size = roomDimension;

            if (!doNotCreateVisualStructure)
            {
                Material material;

                if (useUVTestMaterial)
                {
                    material = GetUVTestMaterial();
                }
                else
                {
                    material = GetPrototypeMaterial();
                }

                if (createFromPrimitivePlanes)
                {
                    CreateFromQuadPrimitives(newUnit, creationModel, material);
                }
                else
                {
                    if (!createAsWholeMesh)
                    {
                        CreateAsSeparatedMeshes(newUnit, creationModel, material);
                    }

                    if (createAsWholeMesh)
                    {
                        CreateAsAWhole(newUnit, creationModel, material);
                    }
                }
            }

            return(mazeUnit);
        }
Esempio n. 7
0
        private void CreateAsAWhole(GameObject newUnit, UnitMeshModificationModel creationModel, Material material)
        {
            var m = creationModel;

            var mesh = new Mesh();

            float length = m.RoomDimensions.z;
            float width  = m.RoomDimensions.x;
            float height = m.RoomDimensions.y;

            #region Vertices

            var p0 = V(-m.WidthStartPoint, -m.HeightStartPoint, -m.DepthStartPoint);
            var p1 = V(length * .5f, -width * .5f, height * .5f);
            var p2 = V(length * .5f, -width * .5f, -height * .5f);
            var p3 = V(-length * .5f, -width * .5f, -height * .5f);

            var p4 = V(-length * .5f, width * .5f, height * .5f);
            var p5 = V(length * .5f, width * .5f, height * .5f);
            var p6 = V(length * .5f, width * .5f, -height * .5f);
            var p7 = V(-length * .5f, width * .5f, -height * .5f);

            var vertices = new Vector3[]
            {
                // Bottom
                p0, p1, p2, p3,

                // Left
                p7, p4, p0, p3,

                // Front
                p4, p5, p1, p0,

                // Back
                p6, p7, p3, p2,

                // Right
                p5, p6, p2, p1,

                // Top
                p7, p6, p5, p4
            };

            #endregion

            #region Normales
            var up    = Vector3.up;
            var down  = Vector3.down;
            var front = Vector3.forward;
            var back  = Vector3.back;
            var left  = Vector3.left;
            var right = Vector3.right;

            //    Vector3[] normales = new Vector3[]
            //{
            //    // Bottom
            //    down, down, down, down,

            //    // Left
            //    left, left, left, left,

            //    // Front
            //    front, front, front, front,

            //    // Back
            //    back, back, back, back,

            //    // Right
            //    right, right, right, right,

            //    // Top
            //    up, up, up, up
            //};

            var flipedNormals = new Vector3[] {
                // Bottom
                up, up, up, up,

                // Left
                right, right, right, right,

                // Front
                back, back, back, back,

                // back
                front, front, front, front,

                // Right
                left, left, left, left,

                // Top
                down, down, down, down
            };

            #endregion

            #region UVs
            var _00 = new Vector2(0f, 0f);
            var _10 = new Vector2(1f, 0f);
            var _01 = new Vector2(0f, 1f);
            var _11 = new Vector2(1f, 1f);

            Vector2[] uvs = new Vector2[]
            {
                // Bottom
                _11, _01, _00, _10,

                // Left
                _11, _01, _00, _10,

                // Front
                _11, _01, _00, _10,

                // Back
                _11, _01, _00, _10,

                // Right
                _11, _01, _00, _10,

                // Top
                _11, _01, _00, _10,
            };
            #endregion

            #region Triangles
            int[] triangles = new int[]
            {
                // Bottom
                0, 1, 3,
                1, 2, 3,

                // Left
                0 + 4 * 1, 1 + 4 * 1, 3 + 4 * 1,
                1 + 4 * 1, 2 + 4 * 1, 3 + 4 * 1,

                // Front
                0 + 4 * 2, 1 + 4 * 2, 3 + 4 * 2,
                1 + 4 * 2, 2 + 4 * 2, 3 + 4 * 2,

                // Back
                0 + 4 * 3, 1 + 4 * 3, 3 + 4 * 3,
                1 + 4 * 3, 2 + 4 * 3, 3 + 4 * 3,

                // Right
                0 + 4 * 4, 1 + 4 * 4, 3 + 4 * 4,
                1 + 4 * 4, 2 + 4 * 4, 3 + 4 * 4,

                // Top
                0 + 4 * 5, 1 + 4 * 5, 3 + 4 * 5,
                1 + 4 * 5, 2 + 4 * 5, 3 + 4 * 5,
            };
            #endregion

            mesh.vertices = vertices;
            //mesh.normals = normales;
            mesh.normals   = flipedNormals;
            mesh.uv        = uvs;
            mesh.triangles = triangles;

            mesh.RecalculateBounds();
            ;

            var meshFilter   = newUnit.AddComponent <MeshFilter>();
            var meshRenderer = newUnit.AddComponent <MeshRenderer>();

            meshFilter.mesh = mesh;

            meshRenderer.material = material;
        }
Esempio n. 8
0
        private void CreateAsSeparatedMeshes(GameObject newUnit, UnitMeshModificationModel creationModel, Material material)
        {
            foreach (var item in expectedChildComponents)
            {
                var wall = new GameObject(item);

                wall.transform.parent = newUnit.transform;

                var meshFilter = wall.AddComponent <MeshFilter>();

                var meshRenderer = wall.AddComponent <MeshRenderer>();

                meshRenderer.material = material;


                if (item.Equals(MazeUnit.TOP))
                {
                    meshFilter.mesh              = CreateTopMesh(creationModel);
                    meshFilter.sharedMesh.name   = MazeUnit.TOP;
                    wall.transform.localPosition = V(0, roomDimension.y, 0);
                }

                if (item.Equals(MazeUnit.FLOOR))
                {
                    meshFilter.mesh            = CreateFloorMesh(creationModel);
                    meshFilter.sharedMesh.name = MazeUnit.FLOOR;
                }

                if (item.Equals(MazeUnit.NORTH))
                {
                    wall.transform.localPosition = V(0, roomDimension.y / 2, roomDimension.z / 2);
                    meshFilter.mesh            = CreateNorthMesh(creationModel);
                    meshFilter.sharedMesh.name = MazeUnit.NORTH;
                }

                if (item.Equals(MazeUnit.SOUTH))
                {
                    meshFilter.mesh            = CreateSouthMesh(creationModel);
                    meshFilter.sharedMesh.name = MazeUnit.SOUTH; wall.transform.localPosition = V(0, roomDimension.y / 2, -roomDimension.z / 2);
                }

                if (item.Equals(MazeUnit.WEST))
                {
                    meshFilter.mesh              = CreateWestMesh(creationModel);
                    meshFilter.sharedMesh.name   = MazeUnit.WEST;
                    wall.transform.localPosition = V(-roomDimension.x / 2, roomDimension.y / 2, 0);
                }

                if (item.Equals(MazeUnit.EAST))
                {
                    meshFilter.mesh              = CreateEastMesh(creationModel);
                    meshFilter.sharedMesh.name   = MazeUnit.EAST;
                    wall.transform.localPosition = V(roomDimension.x / 2, roomDimension.y / 2, 0);
                }

                wall.AddComponent <MeshCollider>();

                var result = string.Format("{0}{1}{2}_Mesh_{3}.asset", AssetModelsPath, Path.AltDirectorySeparatorChar, item, creationModel.RoomDimensions.AsPartFileName());

                SaveAsAsset(meshFilter.sharedMesh, result);
            }

            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
Esempio n. 9
0
        private void CreateFromQuadPrimitives(GameObject newUnit, UnitMeshModificationModel creationModel, Material material)
        {
            foreach (var item in expectedChildComponents)
            {
                var wall = new GameObject(item);

                wall.transform.parent = newUnit.transform;

                if (item.Equals(MazeUnit.TOP))
                {
                    wall.transform.localPosition = V(0, roomDimension.y, 0);

                    var quad = GameObject.CreatePrimitive(PrimitiveType.Quad);

                    var meshFilter = quad.GetComponent <MeshFilter>();

                    var mesh = meshFilter.sharedMesh;

                    foreach (var vtx in mesh.vertices)
                    {
                        Debug.Log(vtx);
                    }

                    foreach (var uv in mesh.uv)
                    {
                        Debug.Log(uv);
                    }

                    var renderer = quad.GetComponent <MeshRenderer>();

                    renderer.material = material;

                    quad.transform.SetParent(wall.transform, false);

                    quad.transform.localScale = new Vector3(roomDimension.x, roomDimension.z, 1);

                    quad.transform.localRotation = Quaternion.Euler(-90, 0, 0);
                }

                if (item.Equals(MazeUnit.FLOOR))
                {
                    var quad = GameObject.CreatePrimitive(PrimitiveType.Quad);

                    var renderer = quad.GetComponent <MeshRenderer>();

                    renderer.material = material;

                    quad.transform.SetParent(wall.transform, false);

                    quad.transform.localScale = new Vector3(roomDimension.x, roomDimension.z, 1);

                    quad.transform.localRotation = Quaternion.Euler(90, 0, 0);
                }

                if (item.Equals(MazeUnit.NORTH))
                {
                    wall.transform.localPosition = V(0, roomDimension.y / 2, roomDimension.z / 2);

                    var quad = GameObject.CreatePrimitive(PrimitiveType.Quad);

                    var renderer = quad.GetComponent <MeshRenderer>();

                    renderer.material = material;

                    quad.transform.SetParent(wall.transform, false);

                    quad.transform.localScale = new Vector3(roomDimension.x, roomDimension.y, 1);
                }

                if (item.Equals(MazeUnit.SOUTH))
                {
                    wall.transform.localPosition = V(0, roomDimension.y / 2, -roomDimension.z / 2);

                    var quad = GameObject.CreatePrimitive(PrimitiveType.Quad);

                    var renderer = quad.GetComponent <MeshRenderer>();

                    renderer.material = material;

                    quad.transform.SetParent(wall.transform, false);

                    quad.transform.localScale = new Vector3(roomDimension.x, roomDimension.y, 1);

                    quad.transform.localRotation = Quaternion.Euler(0, -180, 0);
                }

                if (item.Equals(MazeUnit.WEST))
                {
                    wall.transform.localPosition = V(-roomDimension.x / 2, roomDimension.y / 2, 0);

                    var quad = GameObject.CreatePrimitive(PrimitiveType.Quad);

                    var renderer = quad.GetComponent <MeshRenderer>();

                    renderer.material = material;

                    quad.transform.SetParent(wall.transform, false);

                    quad.transform.localScale = new Vector3(roomDimension.x, roomDimension.y, 1);

                    quad.transform.localRotation = Quaternion.Euler(0, -90, 0);
                }

                if (item.Equals(MazeUnit.EAST))
                {
                    wall.transform.localPosition = V(roomDimension.x / 2, roomDimension.y / 2, 0);

                    var quad = GameObject.CreatePrimitive(PrimitiveType.Quad);

                    var renderer = quad.GetComponent <MeshRenderer>();

                    renderer.material = material;

                    quad.transform.SetParent(wall.transform, false);

                    quad.transform.localScale = new Vector3(roomDimension.x, roomDimension.y, 1);

                    quad.transform.localRotation = Quaternion.Euler(0, 90, 0);
                }
            }
        }