Beispiel #1
0
        /// <summary>
        /// Create a DGRPMesh from a .OBJ file.
        /// </summary>
        public DGRP3DMesh(DGRP dgrp, OBJ source, GraphicsDevice gd)
        {
            Bounds = source.Vertices.Count > 0?BoundingBox.CreateFromPoints(source.Vertices):new BoundingBox();
            Geoms  = new List <Dictionary <Texture2D, DGRP3DGeometry> >();
            if (dgrp == null)
            {
                return;
            }
            Name = dgrp.ChunkParent.Filename.Replace('.', '_').Replace("spf", "iff") + "_" + dgrp.ChunkID;

            foreach (var obj in source.FacesByObjgroup.OrderBy(x => x.Key))
            {
                if (obj.Key == "_default")
                {
                    continue;
                }
                var split = obj.Key.Split('_');
                if (split[0] == "DEPTH")
                {
                    DepthMask = new DGRP3DGeometry(split, source, obj.Value, dgrp, gd);
                    if (split.Length > 2 && split[2] == "PORTAL")
                    {
                        MaskType = DGRP3DMaskType.Portal;

                        var verts = new List <Vector3>();
                        var objs  = source.FacesByObjgroup.Where(x => !x.Key.StartsWith("DEPTH_MASK_PORTAL")).Select(x => x.Value);
                        foreach (var obj2 in objs)
                        {
                            foreach (var tri in obj2)
                            {
                                verts.Add(source.Vertices[tri[0] - 1]);
                            }
                        }

                        Bounds = BoundingBox.CreateFromPoints(verts);
                    }
                    else
                    {
                        MaskType = DGRP3DMaskType.Normal;
                    }
                }
                else
                {
                    //0: dynsprite id, 1: SPR or custom, 2: rotation, 3: index
                    var id = int.Parse(split[0]);
                    while (Geoms.Count <= id)
                    {
                        Geoms.Add(new Dictionary <Texture2D, DGRP3DGeometry>());
                    }
                    var dict = Geoms[id];
                    var geom = new DGRP3DGeometry(split, source, obj.Value, dgrp, gd);
                    dict[geom.Pixel] = geom;
                }
            }
        }
Beispiel #2
0
        public DGRP3DMesh(DGRP dgrp, Stream source, GraphicsDevice gd)
        {
            using (var cstream = new GZipStream(source, CompressionMode.Decompress))
            {
                using (var io = IoBuffer.FromStream(cstream, ByteOrder.LITTLE_ENDIAN))
                {
                    var fsom = io.ReadCString(4);
                    Version            = io.ReadInt32();
                    ReconstructVersion = io.ReadInt32();
                    if (ReconstructVersion != 0 && ReconstructVersion < CURRENT_RECONSTRUCT)
                    {
                        throw new Exception("Reconstruction outdated, must be rerun!");
                    }
                    Name = io.ReadPascalString();

                    var geomCount = io.ReadInt32();
                    Geoms = new List <Dictionary <Texture2D, DGRP3DGeometry> >();
                    for (int i = 0; i < geomCount; i++)
                    {
                        var d        = new Dictionary <Texture2D, DGRP3DGeometry>();
                        var subCount = io.ReadInt32();
                        for (int j = 0; j < subCount; j++)
                        {
                            var geom = new DGRP3DGeometry(io, dgrp, gd, Version);
                            if (geom.Pixel == null && geom.PrimCount > 0)
                            {
                                throw new Exception("Invalid Mesh! (old format)");
                            }
                            d.Add(geom.Pixel, geom);
                        }
                        Geoms.Add(d);
                    }

                    if (Version > 2)
                    {
                        MaskType = (DGRP3DMaskType)io.ReadInt32();
                        if (MaskType > DGRP3DMaskType.None)
                        {
                            DepthMask = new DGRP3DGeometry(io, dgrp, gd, Version);
                        }
                    }

                    var x  = io.ReadFloat();
                    var y  = io.ReadFloat();
                    var z  = io.ReadFloat();
                    var x2 = io.ReadFloat();
                    var y2 = io.ReadFloat();
                    var z2 = io.ReadFloat();
                    Bounds = new BoundingBox(new Vector3(x, y, z), new Vector3(x2, y2, z2));
                }
            }
        }