/// <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; } } }
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)); } } }