Beispiel #1
0
    public void Parse(string path)
    {
        var rootDirectory  = Path.GetDirectoryName(path);
        var rootGameObject = new GameObject(Path.GetFileName(path));
        var lines          = File.ReadAllLines(path);

        rootGameObject.transform.SetParent(transform, false);


        var currentMesh = (Mesh)null;
        var vertexList  = new List <Vector3>();
        var uvList      = new List <Vector2>();
        var indexList   = new List <int>();

        var matrixStack  = new Stack <Transform>();
        var texture      = (Texture2D)null;
        var gameObject   = (GameObject)null;
        var meshRenderer = (MeshRenderer)null;
        var meshFilter   = (MeshFilter)null;
        var currentColor = Color.white;

        var isSplittedNormals   = false;
        var renderingOrderIndex = 0;


        foreach (var line in lines)
        {
            var statement = new BveCsvStatement(line);


            if (statement.Command == BveCsvStatement.CommandType.nop)
            {
                continue;
            }


            switch (statement.Command)
            {
            case BveCsvStatement.CommandType.createmeshbuilder:
            {
                gameObject = new GameObject("MeshBuilder");
                gameObject.transform.SetParent(rootGameObject.transform, false);

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

                currentMesh       = new Mesh();
                vertexList        = new List <Vector3>();
                uvList            = new List <Vector2>();
                indexList         = new List <int>();
                texture           = (Texture2D)null;
                isSplittedNormals = false;
                currentColor      = Color.white;

                meshFilter.mesh       = currentMesh;
                meshRenderer.material = Instantiate(Resources.Load(@"Materials/Standard") as Material);
            }

            break;

            case BveCsvStatement.CommandType.cube:
            {
                currentMesh     = CubeBuilder.Build(statement.ArgumentCube.R1 * 2.0f, statement.ArgumentCube.R2 * 2.0f, statement.ArgumentCube.R3 * 2.0f);
                meshFilter.mesh = currentMesh;
            }
            break;

            case BveCsvStatement.CommandType.cylinder:
            {
                if (statement.ArgumentCylinder.R1 == 0.0f)
                {
                    currentMesh = ConeBuilder.Build(statement.ArgumentCylinder.N, statement.ArgumentCylinder.R2, statement.ArgumentCylinder.H);
                }
                else if (statement.ArgumentCylinder.R2 == 0.0f)
                {
                    currentMesh = ConeBuilder.Build(statement.ArgumentCylinder.N, statement.ArgumentCylinder.R1, statement.ArgumentCylinder.H * -1.0f);
                }
                else
                {
                    var r1       = statement.ArgumentCylinder.R1;
                    var r2       = statement.ArgumentCylinder.R2;
                    var isClosed = true;


                    if (r1 < 0.0f || r2 < 0.0f)
                    {
                        if (r1 < 0.0f)
                        {
                            r1 = r2;
                        }
                        else
                        {
                            r2 = r1;
                        }


                        isClosed = false;
                    }


                    currentMesh     = CylinderBuilder.Build(r1, statement.ArgumentCylinder.H, statement.ArgumentCylinder.N, isClosed);
                    meshFilter.mesh = currentMesh;
                }
            }
            break;

            case BveCsvStatement.CommandType.addvertex:
            {
                vertexList.Add(statement.ArgumentVector3);
                uvList.Add(Vector2.zero);

                currentMesh.SetVertices(vertexList);
            }
            break;

            case BveCsvStatement.CommandType.addface:
            case BveCsvStatement.CommandType.addface2:
            {
                var indices = statement.ArgumentIndices;

                if (statement.Command == BveCsvStatement.CommandType.addface2)
                {
                    var reversedIndices = indices.Clone() as int[];
                    Array.Reverse(reversedIndices);

                    var exntendedArray = new int[indices.Length * 2];
                    Array.Copy(indices, exntendedArray, indices.Length);
                    Array.Copy(reversedIndices, 0, exntendedArray, reversedIndices.Length, reversedIndices.Length);

                    indices = exntendedArray;
                }


                var triangulatedIndices = new List <int>();
                var v0 = indices[0];
                var v1 = indices[1];
                var v2 = indices[2];

                triangulatedIndices.Add(v0);
                triangulatedIndices.Add(v1);
                triangulatedIndices.Add(v2);


                for (var i = 3; i < indices.Length; ++i)
                {
                    triangulatedIndices.Add(v0);
                    triangulatedIndices.Add(v2);
                    triangulatedIndices.Add(indices[i]);

                    v2 = indices[i];
                }


                indexList.AddRange(triangulatedIndices);

                currentMesh.SetIndices(indexList.ToArray(), MeshTopology.Triangles, 0);
            }
            break;

            case BveCsvStatement.CommandType.generatenormals:
            {
                var splittedVetexList = new List <Vector3>();
                var splittedIndexList = new List <int>();
                var SplittedUvList    = new List <Vector2>();

                foreach (var index in indexList)
                {
                    splittedVetexList.Add(vertexList[index]);
                    SplittedUvList.Add(Vector2.zero);
                }

                for (var i = 0; i < indexList.Count; ++i)
                {
                    splittedIndexList.Add(i);
                }

                currentMesh.SetVertices(splittedVetexList);
                currentMesh.SetIndices(splittedIndexList.ToArray(), MeshTopology.Triangles, 0);
                uvList = SplittedUvList;

                currentMesh.RecalculateNormals();
                isSplittedNormals = true;
            }
            break;


            case BveCsvStatement.CommandType.setcolor:
            {
                currentColor = new Color(statement.ArgumentColor4[0] / 255.0f, statement.ArgumentColor4[1] / 255.0f, statement.ArgumentColor4[2] / 255.0f, statement.ArgumentColor4[3] / 255.0f);
                meshRenderer.material.color = currentColor;
            }
            break;

            case BveCsvStatement.CommandType.translate:
            {
                gameObject.transform.localPosition = statement.ArgumentVector3;        //.Translate(statement.ArgumentVector3, Space.Self);
            }
            break;

            case BveCsvStatement.CommandType.rotate:
            {
                //gameObject.transform.Rotate(statement.ArgumentRotation.Axis, statement.ArgumentRotation.Theta, Space.Self);
                gameObject.transform.localRotation = Quaternion.AngleAxis(statement.ArgumentRotation.Theta, statement.ArgumentRotation.Axis);
            }
            break;

            case BveCsvStatement.CommandType.loadtexture:
            {
                var fullPath            = Path.Combine(rootDirectory, statement.ArgumentString);
                var fileBytes           = File.ReadAllBytes(fullPath);
                var imageBytes          = (byte[])null;
                var width               = 0;
                var height              = 0;
                var isAlphaTransparency = false;

                switch (Path.GetExtension(fullPath).ToLower())
                {
                case ".bmp":
                case ".png":
                case ".jpg":
                case ".jpeg":
                    using (var memoryStream = new MemoryStream(fileBytes))
                    {
                        var result = StbImageSharp.ImageResult.FromMemory(fileBytes, StbImageSharp.ColorComponents.RedGreenBlueAlpha);

                        width  = result.Width;
                        height = result.Height;

                        imageBytes = result.Data;
                    }

                    break;

                default:
                    break;
                }


                if (imageBytes == null)
                {
                    continue;
                }

                if (width == 0)
                {
                    texture = new Texture2D(4, 4);
                    texture.LoadImage(imageBytes);
                }
                else
                {
                    texture = new Texture2D(width, height);
                    var colorList = new List <Color32>();


                    for (var i = 0; i < imageBytes.Length; i += 4)
                    {
                        var color = new Color32(imageBytes[i + 0], imageBytes[i + 1], imageBytes[i + 2], imageBytes[i + 3]);


                        if (color.a < 255)
                        {
                            isAlphaTransparency = true;
                        }


                        colorList.Add(color);
                    }

                    texture.SetPixels32(colorList.ToArray());
                    texture.Apply();
                }

                texture.filterMode = FilterMode.Bilinear;


                if (isAlphaTransparency)
                {
                    meshRenderer.material              = Instantiate(Resources.Load(@"Materials/Transparent") as Material);
                    meshRenderer.material.mainTexture  = texture;
                    meshRenderer.material.color        = currentColor;
                    meshRenderer.material.renderQueue += renderingOrderIndex;

                    ++renderingOrderIndex;
                }
                else
                {
                    meshRenderer.material.mainTexture = texture;
                }
            }
            break;

            case BveCsvStatement.CommandType.settexturecoordinates:
            {
                var vertexIndex = statement.ArgumentTextureCoordination.VertexIndex;
                var coord       = statement.ArgumentTextureCoordination.TextureCoordination;

                if (isSplittedNormals)
                {
                    for (var i = 0; i < indexList.Count; ++i)
                    {
                        if (indexList[i] == vertexIndex)
                        {
                            uvList[i] = coord;
                        }
                    }
                }
                else
                {
                    uvList[vertexIndex] = coord;
                }


                currentMesh.SetUVs(0, uvList);
            }
            break;

            case BveCsvStatement.CommandType.setdecaltransparentcolor:
            {
                var pixels = texture.GetPixels32();


                for (var i = 0; i < pixels.Length; ++i)
                {
                    var pixel = pixels[i];


                    if ((statement.ArgumentColor4[0] == pixel.r) && (statement.ArgumentColor4[1] == pixel.g) && (statement.ArgumentColor4[2] == pixel.b))
                    {
                        pixel.a   = 0;
                        pixels[i] = pixel;
                    }
                }


                texture.SetPixels32(pixels);
                texture.Apply();

                meshRenderer.material              = Instantiate(Resources.Load(@"Materials/Transparent") as Material);
                meshRenderer.material.mainTexture  = texture;
                meshRenderer.material.color        = currentColor;
                meshRenderer.material.renderQueue += renderingOrderIndex;

                ++renderingOrderIndex;
            }
            break;
            }
        }
    }
        public CoordinateGlyp Initialize()
        {
            var graphics = Engine.Graphics;

            GlypComponent[] components;
            if (EnablePlanes)
            {
                components = new GlypComponent[6]
                {
                    new GlypComponent {
                        Id = X
                    },
                    new GlypComponent {
                        Id = Y
                    },
                    new GlypComponent {
                        Id = Z
                    },
                    new GlypComponent {
                        Id = XY
                    },
                    new GlypComponent {
                        Id = XZ
                    },
                    new GlypComponent {
                        Id = YZ
                    }
                };
            }
            else
            {
                components = new GlypComponent[3]
                {
                    new GlypComponent {
                        Id = X
                    },
                    new GlypComponent {
                        Id = Y
                    },
                    new GlypComponent {
                        Id = Z
                    }
                };
            }
            Components = components;


            var arrow = new ConeBuilder(16, 16, arrowRadius, arrowHeight);

            //var trunk2 = trunk; // new CylindreBuilder(16, 16, 1, 10, false);
            //cylyndre = new Component { Color = new Color4(1, 1, 1, 1), Axix = AxisName.None };
            //VertexPositionColor[] data2 = new VertexPositionColor[trunk2.Vertices.Length];
            //var transform2 = Matrix.RotationZ(-Numerics.PIover2) * Matrix.Translate(0.5f * trunk2.height, 0, 0);
            //for (int i = 0; i < data2.Length; i++)
            //{
            //    data2[i] = new VertexPositionColor(Vector3.TransformCoordinates(trunk2.Vertices[i].Position, transform2), new Color4(1, 1, 0, 0));
            //}
            //cylyndre.VertexBuffer = graphics.CreateVertexBuffer(data: data2);
            //cylyndre.IndexBufffer = graphics.CreateIndexBuffer(data: trunk2.Indices);

            // X Axis
            var xAxis = components[0];

            VertexPositionColor[] data = new VertexPositionColor[arrow.Vertices.Length];
            Matrix transform           = Matrix.RotationZ(-Numerics.PIover2) * Matrix.Translate(0.5f * arrow.height + trunkHeight, 0, 0);

            for (int i = 0; i < data.Length; i++)
            {
                data[i] = new VertexPositionColor(Vector3.TransformCoordinates(arrow.Vertices[i].Position, transform), new Color4(alpha, 1, 0, 0));
            }
            xAxis.VertexBuffer = graphics.CreateVertexBuffer(data: data);
            xAxis.IndexBufffer = graphics.CreateIndexBuffer(data: arrow.Indices);

            //Y Axis
            var yAxis = components[1];

            transform = Matrix.Translate(0, 0.5f * arrow.height + trunkHeight, 0);
            for (int i = 0; i < data.Length; i++)
            {
                data[i] = new VertexPositionColor(Vector3.TransformCoordinates(arrow.Vertices[i].Position, transform), new Color4(alpha, 0, 1, 0));
            }

            yAxis.VertexBuffer = graphics.CreateVertexBuffer(data: data);
            yAxis.IndexBufffer = graphics.CreateIndexBuffer(data: arrow.Indices);

            // Z axis
            var zAxis = components[2];

            transform = Matrix.RotationX(Numerics.PIover2) * Matrix.Translate(0, 0, 0.5f * arrow.height + trunkHeight);
            for (int i = 0; i < data.Length; i++)
            {
                data[i] = new VertexPositionColor(Vector3.TransformCoordinates(arrow.Vertices[i].Position, transform), new Color4(alpha, 0, 0, 1));
            }

            zAxis.VertexBuffer = graphics.CreateVertexBuffer(data: data);
            zAxis.IndexBufffer = graphics.CreateIndexBuffer(data: arrow.Indices);

            if (EnablePlanes)
            {
                //XY
                BoxBuilder box    = new BoxBuilder(width, width, tick);
                var        xyAxis = components[3];

                data = new VertexPositionColor[box.Vertices.Length];
                for (int i = 0; i < data.Length; i++)
                {
                    data[i] = new VertexPositionColor(box.Vertices[i].Position, new Color4(alpha, 1, 0, 0));
                }
                xyAxis.VertexBuffer = graphics.CreateVertexBuffer(data: data);
                xyAxis.IndexBufffer = graphics.CreateIndexBuffer(data: box.Indices);

                //XZ
                box = new BoxBuilder(width, tick, width);
                var xzAxis = components[4];

                data = new VertexPositionColor[box.Vertices.Length];
                for (int i = 0; i < data.Length; i++)
                {
                    data[i] = new VertexPositionColor(box.Vertices[i].Position, new Color4(alpha, 0, 0, 1));
                }
                xzAxis.VertexBuffer = graphics.CreateVertexBuffer(data: data);
                xzAxis.IndexBufffer = graphics.CreateIndexBuffer(data: box.Indices);

                //YZ
                box = new BoxBuilder(tick, width, width);
                var yzAxis = components[5];

                data = new VertexPositionColor[box.Vertices.Length];
                for (int i = 0; i < data.Length; i++)
                {
                    data[i] = new VertexPositionColor(box.Vertices[i].Position, new Color4(alpha, 0, 1, 0));
                }
                yzAxis.VertexBuffer = graphics.CreateVertexBuffer(data: data);
                yzAxis.IndexBufffer = graphics.CreateIndexBuffer(data: box.Indices);
            }

            return(this);
        }