Example #1
0
        public static Mesh Parse(GeometryCommand[] commands, GeometricObject go, bool backfaceCulling, Material mat)
        {
            List <Vertex>   verts     = new List <Vertex>();
            Vertex          wipVertex = new Vertex();
            List <Triangle> triangles = new List <Triangle>();

            GeometryCommand.PrimitiveType primitive = GeometryCommand.PrimitiveType.Triangles;
            int     lastVertexCount = 0;
            Texture tex = mat.GetTexture("_Tex0");
            float   wFactor = 64f, hFactor = 64f;

            if (tex != null)
            {
                wFactor = tex.width;
                hFactor = tex.height;
            }

            Mesh mesh = new Mesh();
            bool parsing = true;

            foreach (GeometryCommand c in commands)
            {
                switch (c.Command)
                {
                case GeometryCommand.Type.TEXCOORD:
                    wipVertex.uv = new Vector2(c.u / c.scale / wFactor, c.v / c.scale / hFactor);
                    break;

                case GeometryCommand.Type.COLOR:
                    wipVertex.color = new Color(c.r / c.scale, c.g / c.scale, c.b / c.scale, 1f);
                    break;

                case GeometryCommand.Type.NORMAL:
                    wipVertex.normal = new Vector3(c.x / c.scale, c.y / c.scale, c.z / c.scale);
                    break;

                case GeometryCommand.Type.VTX_XY:
                    wipVertex.x = c.x / c.scale;
                    wipVertex.y = c.y / c.scale;
                    verts.Add(wipVertex.Clone());
                    break;

                case GeometryCommand.Type.VTX_XZ:
                    wipVertex.x = c.x / c.scale;
                    wipVertex.z = c.z / c.scale;
                    verts.Add(wipVertex.Clone());
                    break;

                case GeometryCommand.Type.VTX_YZ:
                    wipVertex.y = c.y / c.scale;
                    wipVertex.z = c.z / c.scale;
                    verts.Add(wipVertex.Clone());
                    break;

                case GeometryCommand.Type.VTX_16:
                    wipVertex.x = c.x / c.scale;
                    wipVertex.y = c.y / c.scale;
                    wipVertex.z = c.z / c.scale;
                    verts.Add(wipVertex.Clone());
                    break;

                case GeometryCommand.Type.BEGIN_VTXS:
                    AddTriangles(triangles, verts.Count, lastVertexCount, primitive);
                    primitive = c.Primitive;

                    /*if (primitive != GeometryCommand.PrimitiveType.Triangles && primitive != GeometryCommand.PrimitiveType.TriangleStrip) {
                     *      Debug.LogError("QUADS???? FUUUU! " + primitive);
                     * }*/
                    lastVertexCount = verts.Count;
                    break;

                case GeometryCommand.Type.END_VTXS:
                    break;

                default:
                    Debug.LogError("Unparsed command: " + c.Command);
                    break;
                }
                if (!parsing)
                {
                    break;
                }
            }
            AddTriangles(triangles, verts.Count, lastVertexCount, primitive);

            mesh.vertices = verts.Select(v => new Vector3(v.x / go.ScaleFactor, v.z / go.ScaleFactor, v.y / go.ScaleFactor)).ToArray();
            mesh.normals  = verts.Select(v => new Vector3(v.normal.x, v.normal.z, v.normal.y)).ToArray();
            mesh.SetUVs(0, verts.Select(v => new Vector3(v.uv.x, v.uv.y, 1f)).ToList());
            mesh.SetColors(verts.Select(v => new Color(v.color.r, v.color.g, v.color.b, v.color.a)).ToList());
            mesh.triangles = triangles.SelectMany(t => backfaceCulling ? new int[] { t.v1, t.v2, t.v3 } : new int[] { t.v1, t.v2, t.v3, t.v2, t.v1, t.v3 }).ToArray();
            mesh.RecalculateNormals();

            return(mesh);
        }
Example #2
0
        public static Vector3[] ParseVerticesOnly(GeometryCommand[] commands, GeometricObject go)
        {
            List <Vertex>   verts     = new List <Vertex>();
            Vertex          wipVertex = new Vertex();
            List <Triangle> triangles = new List <Triangle>();

            GeometryCommand.PrimitiveType primitive = GeometryCommand.PrimitiveType.Triangles;
            int lastVertexCount = 0;

            Mesh mesh    = new Mesh();
            bool parsing = true;

            foreach (GeometryCommand c in commands)
            {
                switch (c.Command)
                {
                case GeometryCommand.Type.VTX_XY:
                    wipVertex.x = c.x / c.scale;
                    wipVertex.y = c.y / c.scale;
                    verts.Add(wipVertex.Clone());
                    break;

                case GeometryCommand.Type.VTX_XZ:
                    wipVertex.x = c.x / c.scale;
                    wipVertex.z = c.z / c.scale;
                    verts.Add(wipVertex.Clone());
                    break;

                case GeometryCommand.Type.VTX_YZ:
                    wipVertex.y = c.y / c.scale;
                    wipVertex.z = c.z / c.scale;
                    verts.Add(wipVertex.Clone());
                    break;

                case GeometryCommand.Type.VTX_16:
                    wipVertex.x = c.x / c.scale;
                    wipVertex.y = c.y / c.scale;
                    wipVertex.z = c.z / c.scale;
                    verts.Add(wipVertex.Clone());
                    break;

                case GeometryCommand.Type.BEGIN_VTXS:
                    AddTriangles(triangles, verts.Count, lastVertexCount, primitive);
                    primitive = c.Primitive;

                    /*if (primitive != GeometryCommand.PrimitiveType.Triangles && primitive != GeometryCommand.PrimitiveType.TriangleStrip) {
                     *      Debug.LogError("QUADS???? FUUUU! " + primitive);
                     * }*/
                    lastVertexCount = verts.Count;
                    break;

                case GeometryCommand.Type.END_VTXS:
                    break;
                }
                if (!parsing)
                {
                    break;
                }
            }
            return(verts.Select(v => new Vector3(v.x / go.ScaleFactor, v.z / go.ScaleFactor, v.y / go.ScaleFactor)).ToArray());
        }
    /// <summary>
    /// calculates surrounding area of given visible area
    /// starts in center and moves by step = patchSize
    /// </summary>
    /// <param name="extraPatchCount">how many extra patches will be contained</param>
    /// <returns></returns>
    public Area GetSurroundingAreaOf(Vertex centerOnGrid,Area visibleArea,int patchSize, int extraPatchCount)
    {
        Vertex botLeft;
        Vertex topRight;

        if (!visibleArea.Contains(centerOnGrid) || patchSize <= 0)
        {
            Debug.Log("centerOnGrid not in visible area: " + centerOnGrid);
            botLeft = new Vertex(centerOnGrid.x - patchSize,  centerOnGrid.z - patchSize);
            topRight = new Vertex(centerOnGrid.x + patchSize,  centerOnGrid.z + patchSize);
            return new Area(botLeft, topRight);
        }

        //get most left coordinate
        Vertex pointLeft = centerOnGrid.Clone(); ;
        while (visibleArea.Contains(pointLeft)){
            pointLeft.x -= patchSize;
        }
        //get most bot coordinate
        Vertex pointBot = centerOnGrid.Clone(); ;
        while (visibleArea.Contains(pointBot))
        {
            pointBot.z -= patchSize;
        }

        //get most right coordinate
        Vertex pointRight = centerOnGrid.Clone(); ;
        while (visibleArea.Contains(pointRight))
        {
            pointRight.x += patchSize;
        }
        //get most top coordinate
        Vertex pointTop = centerOnGrid.Clone(); ;
        while (visibleArea.Contains(pointTop))
        {
            pointTop.z += patchSize;
        }

        botLeft = new Vertex(pointLeft.x - extraPatchCount * patchSize,
            pointBot.z - extraPatchCount * patchSize);
        topRight = new Vertex(pointRight.x + extraPatchCount * patchSize,
            pointTop.z + extraPatchCount * patchSize);

        return new Area(botLeft, topRight);
    }