public TreeNode BuildTree(FrameNameTable.FrameNameTable table) { TreeNode root = new TreeNode("FrameResource Contents"); root.Tag = header; int numBlocks = header.NumFolderNames + header.NumGeometries + header.NumMaterialResources + header.NumBlendInfos + header.NumSkeletons + header.NumSkelHierachies; Dictionary <int, TreeNode> parsedNodes = new Dictionary <int, TreeNode>(); Dictionary <int, TreeNode> notAddedNodes = new Dictionary <int, TreeNode>(); //Add scene groups into the scene viewer. for (int i = 0; i != frameScenes.Count; i++) { FrameHeaderScene scene = frameScenes.Values.ElementAt(i); TreeNode node = new TreeNode(scene.ToString()); node.Tag = scene; node.Name = scene.RefID.ToString(); parsedNodes.Add(scene.RefID, node); root.Nodes.Add(node); AddChildren(parsedNodes, scene.Children, node); } foreach (var pair in frameObjects) { FrameObjectBase frame = (pair.Value as FrameObjectBase); TreeNode node; if (parsedNodes.ContainsKey(pair.Key)) { continue; } if (frame.ParentIndex1.Index == -1 && frame.ParentIndex2.Index == -1) { node = new TreeNode(frame.ToString()); node.Tag = frame; node.Name = frame.RefID.ToString(); root.Nodes.Add(node); parsedNodes.Add(frame.RefID, node); AddChildren(parsedNodes, frame.Children, node); } } foreach (var pair in frameObjects) { if (!parsedNodes.ContainsKey(pair.Key)) { FrameObjectBase frame = (pair.Value as FrameObjectBase); Debug.WriteLine("Failed " + frame.ToString()); TreeNode node = new TreeNode(frame.ToString()); node.Tag = frame; node.Name = frame.RefID.ToString(); root.Nodes.Add(node); //throw new FormatException("Unhandled frame! Name is: " + pair.Value.ToString()); } } return(root); }
private TreeNode BuildFromFrames(TreeNode parent, FrameObjectBase frame) { // Create our new node for the frame. TreeNode node = new TreeNode(frame.ToString()); node.Tag = frame; node.Name = frame.RefID.ToString(); // If our parent exists, add it into the node. if (parent != null) { parent.Nodes.Add(node); } // Iterate and create the frames from our parent frame. foreach (var child in frame.Children) { BuildFromFrames(node, child); } return(node); }
public TreeNode BuildTree(FrameNameTable.FrameNameTable table) { TreeNode root = new TreeNode("FrameResource Contents"); root.Tag = header; int numBlocks = header.NumFolderNames + header.NumGeometries + header.NumMaterialResources + header.NumBlendInfos + header.NumSkeletons + header.NumSkelHierachies; Dictionary <int, TreeNode> parsedNodes = new Dictionary <int, TreeNode>(); Dictionary <int, TreeNode> notAddedNodes = new Dictionary <int, TreeNode>(); //Add scene groups into the scene viewer. for (int i = 0; i != frameScenes.Count; i++) { FrameHeaderScene scene = frameScenes.Values.ElementAt(i); TreeNode node = new TreeNode(scene.ToString()); node.Tag = scene; node.Name = scene.RefID.ToString(); parsedNodes.Add(i, node); root.Nodes.Add(node); } ////add entries from the table, add table data and then add to scene viewer. for (int i = 0; i != table.FrameData.Length; i++) { if (table.FrameData[i].FrameIndex == -1) { continue; } var frameData = table.FrameData[i]; FrameObjectBase fObject = (GetEntryFromIdx(numBlocks + frameData.FrameIndex).Data as FrameObjectBase); fObject.IsOnFrameTable = true; fObject.FrameNameTableFlags = table.FrameData[i].Flags; int p1idx = numBlocks + fObject.ParentIndex1.Index; int p2idx = numBlocks + fObject.ParentIndex2.Index; int thisKey = numBlocks + table.FrameData[i].FrameIndex; TreeNode node = (!parsedNodes.ContainsKey(thisKey)) ? new TreeNode(fObject.ToString()) : parsedNodes[thisKey]; node.Tag = fObject; node.Name = fObject.RefID.ToString(); if (p1idx == -1 && p2idx == -1) { //might be temp? it fixes cars loading in or non binded entries. root.Nodes.Add(node); continue; } else { FrameEntry pBase = (GetEntryFromIdx(p2idx).Data as FrameEntry); TreeNode[] nodes = root.Nodes.Find(pBase.RefID.ToString(), true); if (nodes.Length > 0) { nodes[0].Nodes.Add(node); } } if (!parsedNodes.ContainsKey(thisKey)) { parsedNodes.Add(thisKey, node); } } foreach (FrameHolder holder in NewFrames) { FrameObjectBase fObject = holder.Data as FrameObjectBase; if (fObject == null) { continue; } TreeNode node = (!parsedNodes.ContainsKey(holder.Idx)) ? new TreeNode(fObject.ToString()) : parsedNodes[holder.Idx]; node.Tag = fObject; node.Name = fObject.RefID.ToString(); if (!parsedNodes.ContainsKey(holder.Idx)) { parsedNodes.Add(holder.Idx, node); } } foreach (FrameHolder holder in NewFrames) { FrameObjectBase fObject = holder.Data as FrameObjectBase; if (fObject == null) { continue; } if (fObject.ParentIndex1.Index != -1) { parsedNodes[fObject.ParentIndex1.Index].Nodes.Add(parsedNodes[holder.Idx]); } else if (fObject.ParentIndex2.Index != -1) { parsedNodes[fObject.ParentIndex2.Index].Nodes.Add(parsedNodes[holder.Idx]); } else if (fObject.ParentIndex1.Index == -1 && fObject.ParentIndex2.Index == -1) { root.Nodes.Add(parsedNodes[holder.Idx]); } else { Debug.WriteLine("Not added {0}", holder.Data); } } return(root); }
private void SaveFrame(FrameObjectBase frame, BinaryWriter writer) { //is this even needed? hmm. writer.Write(frame.RefID); // Save old RefID Debug.WriteLine(frame.ToString()); if (frame.GetType() == typeof(FrameObjectArea)) { writer.Write((ushort)ObjectType.Area); (frame as FrameObjectArea).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectCamera)) { writer.Write((ushort)ObjectType.Camera); (frame as FrameObjectCamera).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectCollision)) { writer.Write((ushort)ObjectType.Collision); (frame as FrameObjectCollision).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectComponent_U005)) { writer.Write((ushort)ObjectType.Component_U00000005); (frame as FrameObjectComponent_U005).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectDummy)) { writer.Write((ushort)ObjectType.Dummy); (frame as FrameObjectDummy).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectDeflector)) { writer.Write((ushort)ObjectType.ParticleDeflector); (frame as FrameObjectDeflector).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectFrame)) { writer.Write((ushort)ObjectType.Frame); (frame as FrameObjectFrame).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectJoint)) { writer.Write((ushort)ObjectType.Joint); (frame as FrameObjectJoint).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectLight)) { writer.Write((ushort)ObjectType.Light); (frame as FrameObjectLight).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectModel)) { var mesh = (frame as FrameObjectModel); writer.Write((ushort)ObjectType.Model); mesh.WriteToFilePart1(writer); mesh.Geometry.WriteToFile(writer); mesh.Material.WriteToFile(writer); mesh.BlendInfo.WriteToFile(writer); mesh.Skeleton.WriteToFile(writer); mesh.SkeletonHierarchy.WriteToFile(writer); mesh.WriteToFilePart2(writer); // Write Attachment hashes to the dictionary List <int> AttachmentHashes = new List <int>(); foreach (FrameObjectModel.AttachmentReference Attachment in mesh.AttachmentReferences) { AttachmentHashes.Add(Attachment.Attachment.RefID); } ModelAttachments.Add(mesh.Name.Hash, AttachmentHashes); foreach (var lod in mesh.Geometry.LOD) { using (var stream = new MemoryStream()) { SceneData.IndexBufferPool.GetBuffer(lod.IndexBufferRef.Hash).WriteToFile(stream, false); SceneData.VertexBufferPool.GetBuffer(lod.VertexBufferRef.Hash).WriteToFile(stream, false); writer.Write(stream.ToArray()); } } } else if (frame.GetType() == typeof(FrameObjectSector)) { writer.Write((ushort)ObjectType.Sector); (frame as FrameObjectSector).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectSingleMesh)) { var mesh = (frame as FrameObjectSingleMesh); writer.Write((ushort)ObjectType.SingleMesh); mesh.WriteToFile(writer); mesh.Geometry.WriteToFile(writer); mesh.Material.WriteToFile(writer); foreach (var lod in mesh.Geometry.LOD) { using (var stream = new MemoryStream()) { SceneData.IndexBufferPool.GetBuffer(lod.IndexBufferRef.Hash).WriteToFile(stream, false); SceneData.VertexBufferPool.GetBuffer(lod.VertexBufferRef.Hash).WriteToFile(stream, false); writer.Write(stream.ToArray()); } } } else if (frame.GetType() == typeof(FrameObjectTarget)) { writer.Write((ushort)ObjectType.Target); (frame as FrameObjectTarget).WriteToFile(writer); } else { writer.Write(frame.Type); frame.WriteToFile(writer); } // write FrameNameTable info writer.Write(frame.IsOnFrameTable); writer.Write((uint)frame.FrameNameTableFlags); // Write ParentIndex1 and ParentIndex2 info writer.Write(frame.ParentIndex1.RefID); writer.Write(frame.ParentIndex2.RefID); writer.Write(frame.Children.Count); for (int i = 0; i < frame.Children.Count; i++) { SaveFrame(frame.Children[i], writer); } }
private FrameObjectBase ReadFrame(MemoryStream stream) { int OldRefID = stream.ReadInt32(false); // read old RefID so we can make lookup dictionary ObjectType frameType = (ObjectType)stream.ReadInt16(false); FrameObjectBase parent = FrameFactory.ReadFrameByObjectID(stream, frameType, false); Debug.WriteLine(parent.ToString()); if (parent is FrameObjectSingleMesh || parent is FrameObjectModel) { // Read the required blocks; FrameGeometry geometry = new FrameGeometry(); geometry.ReadFromFile(stream, false); FrameMaterial material = new FrameMaterial(); material.ReadFromFile(stream, false); // Add them into our pool of blocks FrameGeometries.Add(geometry.RefID, geometry); FrameMaterials.Add(material.RefID, material); // Add our references onto our mesh FrameObjectSingleMesh mesh = (parent as FrameObjectSingleMesh); mesh.AddRef(FrameEntryRefTypes.Geometry, geometry.RefID); mesh.Geometry = FrameGeometries[geometry.RefID]; mesh.AddRef(FrameEntryRefTypes.Material, material.RefID); mesh.Material = FrameMaterials[material.RefID]; if (parent is FrameObjectModel) { // Read the rigged specific blocks FrameBlendInfo blendInfo = new FrameBlendInfo(); blendInfo.ReadFromFile(stream, false); FrameSkeleton skeleton = new FrameSkeleton(); skeleton.ReadFromFile(stream, false); FrameSkeletonHierachy hierarchy = new FrameSkeletonHierachy(); hierarchy.ReadFromFile(stream, false); // Add our new rigged specific blocks into our pools FrameBlendInfos.Add(blendInfo.RefID, blendInfo); FrameSkeletons.Add(skeleton.RefID, skeleton); FrameSkeletonHierarchy.Add(hierarchy.RefID, hierarchy); // Finally, add our references to the model. FrameObjectModel model = (parent as FrameObjectModel); model.AddRef(FrameEntryRefTypes.BlendInfo, blendInfo.RefID); model.BlendInfo = FrameBlendInfos[blendInfo.RefID]; model.AddRef(FrameEntryRefTypes.Skeleton, skeleton.RefID); model.Skeleton = FrameSkeletons[skeleton.RefID]; model.AddRef(FrameEntryRefTypes.SkeletonHierachy, hierarchy.RefID); model.SkeletonHierarchy = FrameSkeletonHierarchy[hierarchy.RefID]; model.ReadFromFilePart2(stream, false); } // We have to make sure we have index and buffer pools available // We have to do it for all LODs too; if any more than 1. foreach (var lod in geometry.LOD) { IndexBuffer indexBuffer = new IndexBuffer(stream, false); VertexBuffer vertexBuffer = new VertexBuffer(stream, false); SceneData.IndexBufferPool.TryAddBuffer(indexBuffer); SceneData.VertexBufferPool.TryAddBuffer(vertexBuffer); } } // Read FrameNameTable data parent.IsOnFrameTable = stream.ReadBoolean(); parent.FrameNameTableFlags = (FrameNameTable.NameTableFlags)stream.ReadUInt32(false); // Read ParentIndex from previous SDS int OldParentIndex1RefId = stream.ReadInt32(false); int OldParentIndex2RefId = stream.ReadInt32(false); // Temporarily store it as a reference. parent.AddRef(FrameEntryRefTypes.Parent1, OldParentIndex1RefId); parent.AddRef(FrameEntryRefTypes.Parent2, OldParentIndex2RefId); // We can finally add our new frame object FrameObjects.Add(parent.RefID, parent); // Push new FrameObject int OldRefLookupTable OldRefIDLookupTable.Add(OldRefID, parent); // Read how many children this frame has, and proceed to read them too. int count = stream.ReadInt32(false); for (int i = 0; i < count; i++) { FrameObjectBase child = ReadFrame(stream); } return(parent); }
private void SaveFrame(FrameObjectBase frame, BinaryWriter writer) { //is this even needed? hmm. Debug.WriteLine(frame.ToString()); if (frame.GetType() == typeof(FrameObjectArea)) { writer.Write((ushort)ObjectType.Area); (frame as FrameObjectArea).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectCamera)) { writer.Write((ushort)ObjectType.Camera); (frame as FrameObjectCamera).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectCollision)) { writer.Write((ushort)ObjectType.Collision); (frame as FrameObjectCollision).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectComponent_U005)) { writer.Write((ushort)ObjectType.Component_U00000005); (frame as FrameObjectComponent_U005).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectDummy)) { writer.Write((ushort)ObjectType.Dummy); (frame as FrameObjectDummy).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectDeflector)) { writer.Write((ushort)ObjectType.ParticleDeflector); (frame as FrameObjectDeflector).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectFrame)) { writer.Write((ushort)ObjectType.Frame); (frame as FrameObjectFrame).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectJoint)) { writer.Write((ushort)ObjectType.Joint); (frame as FrameObjectJoint).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectLight)) { writer.Write((ushort)ObjectType.Light); (frame as FrameObjectLight).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectModel)) { var mesh = (frame as FrameObjectModel); writer.Write((ushort)ObjectType.Model); mesh.WriteToFile(writer); mesh.Geometry.WriteToFile(writer); mesh.Material.WriteToFile(writer); mesh.BlendInfo.WriteToFile(writer); mesh.Skeleton.WriteToFile(writer); mesh.SkeletonHierarchy.WriteToFile(writer); foreach (var lod in mesh.Geometry.LOD) { using (var stream = new MemoryStream()) { SceneData.IndexBufferPool.GetBuffer(lod.IndexBufferRef.Hash).WriteToFile(stream, false); SceneData.VertexBufferPool.GetBuffer(lod.VertexBufferRef.Hash).WriteToFile(stream, false); writer.Write(stream.ToArray()); } } } else if (frame.GetType() == typeof(FrameObjectSector)) { writer.Write((ushort)ObjectType.Sector); (frame as FrameObjectSector).WriteToFile(writer); } else if (frame.GetType() == typeof(FrameObjectSingleMesh)) { var mesh = (frame as FrameObjectSingleMesh); writer.Write((ushort)ObjectType.SingleMesh); mesh.WriteToFile(writer); mesh.Geometry.WriteToFile(writer); mesh.Material.WriteToFile(writer); foreach (var lod in mesh.Geometry.LOD) { using (var stream = new MemoryStream()) { SceneData.IndexBufferPool.GetBuffer(lod.IndexBufferRef.Hash).WriteToFile(stream, false); SceneData.VertexBufferPool.GetBuffer(lod.VertexBufferRef.Hash).WriteToFile(stream, false); writer.Write(stream.ToArray()); } } } else if (frame.GetType() == typeof(FrameObjectTarget)) { writer.Write((ushort)ObjectType.Target); (frame as FrameObjectTarget).WriteToFile(writer); } else { writer.Write(frame.Type); frame.WriteToFile(writer); } writer.Write(frame.Children.Count); for (int i = 0; i < frame.Children.Count; i++) { SaveFrame(frame.Children[i], writer); } }
private FrameObjectBase ReadFrame(MemoryStream stream) { ObjectType frameType = (ObjectType)stream.ReadInt16(false); FrameObjectBase parent = FrameFactory.ReadFrameByObjectID(stream, frameType, false); Debug.WriteLine(parent.ToString()); if (parent is FrameObjectSingleMesh || parent is FrameObjectModel) { // Read the required blocks; FrameGeometry geometry = new FrameGeometry(); geometry.ReadFromFile(stream, false); FrameMaterial material = new FrameMaterial(); material.ReadFromFile(stream, false); // Add them into our pool of blocks frameGeometries.Add(geometry.RefID, geometry); frameMaterials.Add(material.RefID, material); // Add our references onto our mesh FrameObjectSingleMesh mesh = (parent as FrameObjectSingleMesh); mesh.AddRef(FrameEntryRefTypes.Geometry, geometry.RefID); mesh.Geometry = frameGeometries[geometry.RefID]; mesh.AddRef(FrameEntryRefTypes.Material, material.RefID); mesh.Material = frameMaterials[material.RefID]; //mesh.Parent.ParentIndex1 if (parent is FrameObjectModel) { // Read the rigged specific blocks FrameBlendInfo blendInfo = new FrameBlendInfo(); blendInfo.ReadFromFile(stream, false); FrameSkeleton skeleton = new FrameSkeleton(); skeleton.ReadFromFile(stream, false); FrameSkeletonHierachy hierarchy = new FrameSkeletonHierachy(); hierarchy.ReadFromFile(stream, false); // Add our new rigged specific blocks into our pools frameBlendInfos.Add(blendInfo.RefID, blendInfo); frameSkeletons.Add(skeleton.RefID, skeleton); frameSkeletonHierachies.Add(hierarchy.RefID, hierarchy); // Finally, add our references to the model. FrameObjectModel model = (parent as FrameObjectModel); model.AddRef(FrameEntryRefTypes.BlendInfo, blendInfo.RefID); model.BlendInfo = frameBlendInfos[blendInfo.RefID]; model.AddRef(FrameEntryRefTypes.Skeleton, skeleton.RefID); model.Skeleton = frameSkeletons[skeleton.RefID]; model.AddRef(FrameEntryRefTypes.SkeletonHierachy, hierarchy.RefID); model.SkeletonHierarchy = frameSkeletonHierachies[hierarchy.RefID]; } // Read the buffers; IndexBuffer indexBuffer = new IndexBuffer(stream, false); VertexBuffer vertexBuffer = new VertexBuffer(stream, false); // We have to make sure we have index and buffer pools available // We have to do it for all LODs too; if any more than 1. foreach (var lod in geometry.LOD) { SceneData.IndexBufferPool.TryAddBuffer(indexBuffer); SceneData.VertexBufferPool.TryAddBuffer(vertexBuffer); } } // We can finally add our new frame object frameObjects.Add(parent.RefID, parent); // Read how many children this frame has, and proceed to read them too. int count = stream.ReadInt32(false); for (int i = 0; i < count; i++) { FrameObjectBase child = ReadFrame(stream); // Add References early.. child.AddRef(FrameEntryRefTypes.Parent1, parent.RefID); child.AddRef(FrameEntryRefTypes.Parent2, parent.RefID); SetParentOfObject(0, child, parent); SetParentOfObject(1, child, parent); } return(parent); }