private TreeNode CreateTreeNode(FrameObjectBase fObject) { TreeNode[] nodes2 = treeView1.Nodes.Find(fObject.RefID.ToString(), true); if (nodes2.Length > 0) { return(null); } TreeNode node = ConvertNode(fObject.NodeData); if (fObject.GetType() == typeof(FrameObjectSingleMesh)) { if (fObject.Refs.Count != 0) { node.Nodes.Add(CreateTreeNode("Material", SceneData.FrameResource.FrameMaterials[fObject.Refs["Material"]])); node.Nodes.Add(CreateTreeNode("Geometry", SceneData.FrameResource.FrameGeometries[fObject.Refs["Mesh"]])); } node.ContextMenuStrip = contextMenu; } else if (fObject.GetType() == typeof(FrameObjectModel)) { node.Nodes.Add(CreateTreeNode("Material", SceneData.FrameResource.FrameMaterials[fObject.Refs["Material"]])); node.Nodes.Add(CreateTreeNode("Geometry", SceneData.FrameResource.FrameGeometries[fObject.Refs["Mesh"]])); node.Nodes.Add(CreateTreeNode("BlendInfo", SceneData.FrameResource.FrameBlendInfos[fObject.Refs["BlendInfo"]])); node.Nodes.Add(CreateTreeNode("Skeleton", SceneData.FrameResource.FrameSkeletons[fObject.Refs["Skeleton"]])); node.Nodes.Add(CreateTreeNode("SkeletonHierachy", SceneData.FrameResource.FrameSkeletonHierachies[fObject.Refs["SkeletonHierachy"]])); node.ContextMenuStrip = contextMenu; } node = AddChildren(node, fObject); return(node); }
private void SetTransformEdit() { IsEntryReady = false; if (FrameResource.IsFrameType(currentObject)) { FrameObjectBase fObject = (currentObject as FrameObjectBase); CurrentEntry.Text = fObject.Name.String; PositionXNumeric.Value = Convert.ToDecimal(fObject.Matrix.Position.X); PositionYNumeric.Value = Convert.ToDecimal(fObject.Matrix.Position.Y); PositionZNumeric.Value = Convert.ToDecimal(fObject.Matrix.Position.Z); RotationXNumeric.Value = Convert.ToDecimal(fObject.Matrix.Rotation.X); RotationYNumeric.Value = Convert.ToDecimal(fObject.Matrix.Rotation.Y); RotationZNumeric.Value = Convert.ToDecimal(fObject.Matrix.Rotation.Z); ScaleXNumeric.Enabled = ScaleYNumeric.Enabled = ScaleZNumeric.Enabled = true; ScaleXNumeric.Value = Convert.ToDecimal(fObject.Matrix.Scale.X); ScaleYNumeric.Value = Convert.ToDecimal(fObject.Matrix.Scale.Y); ScaleZNumeric.Value = Convert.ToDecimal(fObject.Matrix.Scale.Z); } else if (currentObject is ResourceTypes.Collisions.Collision.Placement) { ResourceTypes.Collisions.Collision.Placement placement = (currentObject as ResourceTypes.Collisions.Collision.Placement); CurrentEntry.Text = placement.Hash.ToString(); PositionXNumeric.Value = Convert.ToDecimal(placement.Position.X); PositionYNumeric.Value = Convert.ToDecimal(placement.Position.Y); PositionZNumeric.Value = Convert.ToDecimal(placement.Position.Z); RotationXNumeric.Value = Convert.ToDecimal(placement.Rotation.X); RotationYNumeric.Value = Convert.ToDecimal(placement.Rotation.Y); RotationZNumeric.Value = Convert.ToDecimal(placement.Rotation.Z); ScaleXNumeric.Value = ScaleYNumeric.Value = ScaleZNumeric.Value = 0.0M; ScaleXNumeric.Enabled = ScaleYNumeric.Enabled = ScaleZNumeric.Enabled = false; } IsEntryReady = true; }
private void ModifyParents(int parent) { FrameObjectBase obj = treeView1.SelectedNode.Tag as FrameObjectBase; ListWindow window = new ListWindow(); window.PopulateForm(parent); if (window.ShowDialog() == DialogResult.OK) { int refID = (window.chosenObject as FrameEntry).RefID; obj.IsOnFrameTable = true; if (parent == 0) { obj.ParentIndex1.Name = window.chosenObject.ToString(); obj.ParentIndex1.Index = SceneData.FrameResource.GetIndexOfObject(refID); obj.ParentIndex1.RefID = refID; obj.SubRef(FrameEntryRefTypes.Parent1); obj.AddRef(FrameEntryRefTypes.Parent1, refID); } else if (parent == 1) { obj.ParentIndex2.Name = window.chosenObject.ToString(); obj.ParentIndex2.Index = SceneData.FrameResource.GetIndexOfObject(refID) + SceneData.FrameResource.FrameScenes.Count; obj.ParentIndex2.RefID = refID; obj.SubRef(FrameEntryRefTypes.Parent2); obj.AddRef(FrameEntryRefTypes.Parent2, refID); } treeView1.Nodes.Remove(treeView1.SelectedNode); TreeNode newNode = new TreeNode(); newNode.Tag = obj; newNode.Name = obj.RefID.ToString(); newNode.Text = obj.ToString(); if (obj.ParentIndex1.Index != -1) { TreeNode[] nodes = treeView1.Nodes.Find(obj.ParentIndex1.RefID.ToString(), true); if (nodes.Length > 0) { AddToTree(newNode, nodes[0]); } } else if (obj.ParentIndex2.Index != -1) { TreeNode[] nodes = treeView1.Nodes.Find(obj.ParentIndex2.RefID.ToString(), true); if (nodes.Length > 0) { AddToTree(newNode, nodes[0]); } } else { } } }
private void SearchForms() { listBox1.Items.Clear(); foreach (KeyValuePair <int, object> entry in SceneData.FrameResource.FrameObjects) { FrameObjectBase obj = entry.Value as FrameObjectBase; if (obj.Name.String.Contains(SearchBox.Text)) { listBox1.Items.Add(entry.Value); } } }
private void RecurseChildren(TreeNode node) { foreach (TreeNode child in node.Nodes) { child.Checked = true; ApplyImageIndex(child); RecurseChildren(child); if (child.Text.Contains("proxy") || (child.Text.Contains("translocator") && child.Text.Contains("00"))) { FrameObjectBase fObject = (child.Tag as FrameObjectBase); ProxyPos = fObject.WorldTransform.TranslationVector; } } }
public void UpdateObject() { if (IsEntryReady && currentObject != null) { if (FrameResource.IsFrameType(currentObject)) { FrameObjectBase fObject = (currentObject as FrameObjectBase); fObject.Matrix.Position = new Vector3(Convert.ToSingle(PositionXNumeric.Value), Convert.ToSingle(PositionYNumeric.Value), Convert.ToSingle(PositionZNumeric.Value)); fObject.Matrix.SetRotationMatrix(new Vector3(Convert.ToSingle(RotationXNumeric.Value), Convert.ToSingle(RotationYNumeric.Value), Convert.ToSingle(RotationZNumeric.Value))); fObject.Matrix.SetScaleMatrix(new Vector3(Convert.ToSingle(ScaleXNumeric.Value), Convert.ToSingle(ScaleYNumeric.Value), Convert.ToSingle(ScaleZNumeric.Value))); } else if (currentObject is ResourceTypes.Collisions.Collision.Placement) { ResourceTypes.Collisions.Collision.Placement placement = (currentObject as ResourceTypes.Collisions.Collision.Placement); placement.Position = new Vector3(Convert.ToSingle(PositionXNumeric.Value), Convert.ToSingle(PositionYNumeric.Value), Convert.ToSingle(PositionZNumeric.Value)); placement.Rotation = new Vector3(Convert.ToSingle(RotationXNumeric.Value), Convert.ToSingle(RotationYNumeric.Value), Convert.ToSingle(RotationZNumeric.Value)); } } }
private void OnPropertyChanged(object s, PropertyValueChangedEventArgs e) { if (e.ChangedItem.Label == "RefID") { TreeNode[] nodes = treeView1.Nodes.Find(e.ChangedItem.Value.ToString(), true); if (nodes.Length > 0) { int newValue = (int)e.ChangedItem.Value; FrameObjectBase obj = (treeView1.SelectedNode.Tag as FrameObjectBase); int newIndex = SceneData.FrameResource.FrameObjects.IndexOfValue(newValue); if (newIndex == -1) { //check if user didn't try setting it as a scene: newIndex = SceneData.FrameResource.FrameScenes.IndexOfValue(newValue); } string name = (SceneData.FrameResource.FrameObjects.ElementAt(newIndex).Value as FrameObjectBase).Name.String; //because C# doesn't allow me to get this data for some odd reason, im going to check for it in obj. Why does C# not allow me to see FullLabel in the e var? if (obj.ParentIndex1.RefID == newValue) { obj.ParentIndex1.Index = newIndex; obj.ParentIndex1.Name = name; obj.SubRef(FrameEntryRefTypes.Parent1); obj.AddRef(FrameEntryRefTypes.Parent1, newValue); } else if (obj.ParentIndex2.RefID == newValue) { obj.ParentIndex2.Index = newIndex; obj.ParentIndex2.Name = name; obj.SubRef(FrameEntryRefTypes.Parent2); obj.AddRef(FrameEntryRefTypes.Parent2, newValue); } obj.UpdateNode(); treeView1.Nodes.Remove(treeView1.SelectedNode); TreeNode newNode = CreateTreeNode(obj); nodes[0].Nodes.Add(newNode); } } }
private void SetTransformEdit() { IsEntryReady = false; if (FrameResource.IsFrameType(currentObject)) { FrameObjectBase fObject = (currentObject as FrameObjectBase); Vector3 position = Vector3.Zero; Quaternion rotation2 = Quaternion.Identity; Vector3 scale = Vector3.Zero; Matrix4x4.Decompose(fObject.LocalTransform, out scale, out rotation2, out position); CurrentEntry.Text = fObject.Name.ToString(); PositionXNumeric.Value = Convert.ToDecimal(position.X); PositionYNumeric.Value = Convert.ToDecimal(position.Y); PositionZNumeric.Value = Convert.ToDecimal(position.Z); Vector3 rotation = rotation2.ToEuler(); RotationXNumeric.Value = Convert.ToDecimal(rotation.X); RotationYNumeric.Value = Convert.ToDecimal(rotation.Y); RotationZNumeric.Value = Convert.ToDecimal(rotation.Z); ScaleXNumeric.Enabled = ScaleYNumeric.Enabled = ScaleZNumeric.Enabled = true; ScaleXNumeric.Value = Convert.ToDecimal(scale.X); ScaleYNumeric.Value = Convert.ToDecimal(scale.Y); ScaleZNumeric.Value = Convert.ToDecimal(scale.Z); } else if (currentObject is ResourceTypes.Collisions.Collision.Placement) { ResourceTypes.Collisions.Collision.Placement placement = (currentObject as ResourceTypes.Collisions.Collision.Placement); CurrentEntry.Text = placement.Hash.ToString(); PositionXNumeric.Value = Convert.ToDecimal(placement.Position.X); PositionYNumeric.Value = Convert.ToDecimal(placement.Position.Y); PositionZNumeric.Value = Convert.ToDecimal(placement.Position.Z); Vector3 placementRotation = placement.RotationDegrees; RotationXNumeric.Value = Convert.ToDecimal(placementRotation.X); RotationYNumeric.Value = Convert.ToDecimal(placementRotation.Y); RotationZNumeric.Value = Convert.ToDecimal(placementRotation.Z); ScaleXNumeric.Value = ScaleYNumeric.Value = ScaleZNumeric.Value = 0.0M; ScaleXNumeric.Enabled = ScaleYNumeric.Enabled = ScaleZNumeric.Enabled = false; } IsEntryReady = true; }
public void UpdateObject() { if (IsEntryReady && currentObject != null) { Vector3 position = new Vector3(Convert.ToSingle(PositionXNumeric.Value), Convert.ToSingle(PositionYNumeric.Value), Convert.ToSingle(PositionZNumeric.Value)); Vector3 rotation = new Vector3(Convert.ToSingle(RotationXNumeric.Value), Convert.ToSingle(RotationYNumeric.Value), Convert.ToSingle(RotationZNumeric.Value)); Vector3 scale = new Vector3(Convert.ToSingle(ScaleXNumeric.Value), Convert.ToSingle(ScaleYNumeric.Value), Convert.ToSingle(ScaleZNumeric.Value)); if (FrameResource.IsFrameType(currentObject)) { FrameObjectBase fObject = (currentObject as FrameObjectBase); fObject.LocalTransform = MatrixUtils.SetMatrix(rotation, scale, position); } else if (currentObject is ResourceTypes.Collisions.Collision.Placement) { ResourceTypes.Collisions.Collision.Placement placement = (currentObject as ResourceTypes.Collisions.Collision.Placement); placement.Position = position; placement.RotationDegrees = rotation; } } }
public Vector3 JumpToHelper() { object data = treeView1.SelectedNode.Tag; if (FrameResource.IsFrameType(data)) { bool fin = false; TransformMatrix matrix = (data as FrameObjectBase).Matrix; TreeNode curNode = treeView1.SelectedNode; while (!fin) { if (curNode.Parent == null) { fin = true; } else { FrameObjectBase parent = (curNode.Parent.Tag as FrameObjectBase); curNode = curNode.Parent; if (parent != null) { matrix += parent.Matrix; } } } return(matrix.Position); } if (data.GetType() == typeof(ResourceTypes.Collisions.Collision.Placement)) { return((data as ResourceTypes.Collisions.Collision.Placement).Position); } if (data.GetType() == typeof(Rendering.Graphics.RenderJunction)) { return((data as Rendering.Graphics.RenderJunction).Data.Position); } return(new Vector3(0, 0, 0)); }
private TreeNode AddChildren(TreeNode node, FrameObjectBase fObject) { while (fObject.ParentIndex1.Index != -1) { fObject = (SceneData.FrameResource.FrameObjects[fObject.ParentIndex1.RefID] as FrameObjectBase); if (fObject.ParentIndex1.Index == fObject.ParentIndex2.Index) { return(node); } TreeNode child = CreateTreeNode(fObject); if (child == null) { return(node); } node.Nodes.Add(child); } return(node); }
private void ItemClicked(object sender, ToolStripItemClickedEventArgs e) { if (treeView1.SelectedNode == null) { return; } if (e.ClickedItem.Name == "contextExtract3D") { FrameObjectSingleMesh mesh = treeView1.SelectedNode.Tag as FrameObjectSingleMesh; FrameGeometry geom = SceneData.FrameResource.FrameGeometries[mesh.Refs["Mesh"]]; FrameMaterial mat = SceneData.FrameResource.FrameMaterials[mesh.Refs["Material"]]; IndexBuffer[] indexBuffers = new IndexBuffer[geom.LOD.Length]; VertexBuffer[] vertexBuffers = new VertexBuffer[geom.LOD.Length]; //we need to retrieve buffers first. for (int c = 0; c != geom.LOD.Length; c++) { indexBuffers[c] = SceneData.IndexBufferPool.GetBuffer(geom.LOD[c].IndexBufferRef.uHash); vertexBuffers[c] = SceneData.VertexBufferPool.GetBuffer(geom.LOD[c].VertexBufferRef.uHash); } Model newModel = new Model(mesh, indexBuffers, vertexBuffers, geom, mat); newModel.ModelStructure.ExportToM2T(ToolkitSettings.ExportPath + "\\"); switch (ToolkitSettings.Format) { case 0: newModel.ModelStructure.ExportToFbx(ToolkitSettings.ExportPath + "\\", false); break; case 1: newModel.ModelStructure.ExportToFbx(ToolkitSettings.ExportPath + "\\", true); break; case 2: newModel.ModelStructure.ExportToM2T(ToolkitSettings.ExportPath + "\\"); break; default: Log.WriteLine("Error! Unknown value set for ToolkitSettings.Format!", LoggingTypes.ERROR); break; } } else if (e.ClickedItem.Name == "contextUpdateParents") { FrameObjectBase obj = treeView1.SelectedNode.Tag as FrameObjectBase; ListWindow window = new ListWindow(); window.PopulateForm(true); window.ShowDialog(); if (window.type == -1) { return; } int refID = (window.chosenObject as FrameEntry).RefID; obj.IsOnFrameTable = true; obj.ParentIndex2.Index = window.chosenObjectIndex; obj.ParentIndex2.RefID = refID; obj.SubRef(FrameEntryRefTypes.Parent2); obj.AddRef(FrameEntryRefTypes.Parent2, refID); obj.UpdateNode(); treeView1.Nodes.Remove(treeView1.SelectedNode); TreeNode newNode = CreateTreeNode(obj); treeView1.Nodes[window.chosenObjectIndex].Nodes.Add(newNode); } }
public void PopulateForm() { //TODO: IMPROVE GRIDVIEW POPULATION: treeView1.Nodes.Clear(); dataGridView1.Rows.Clear(); foreach (KeyValuePair <int, FrameHeaderScene> entry in SceneData.FrameResource.FrameScenes) { dataGridView1.Rows.Add(ConvertEntryToDataGridView(entry.Value)); TreeNode node = new TreeNode { Text = entry.Value.Name.String, Name = entry.Value.RefID.ToString(), Tag = entry.Value }; treeView1.Nodes.Add(node); } foreach (KeyValuePair <int, FrameGeometry> entry in SceneData.FrameResource.FrameGeometries) { dataGridView1.Rows.Add(ConvertEntryToDataGridView(entry.Value)); } foreach (KeyValuePair <int, FrameMaterial> entry in SceneData.FrameResource.FrameMaterials) { dataGridView1.Rows.Add(ConvertEntryToDataGridView(entry.Value)); } foreach (KeyValuePair <int, FrameBlendInfo> entry in SceneData.FrameResource.FrameBlendInfos) { dataGridView1.Rows.Add(ConvertEntryToDataGridView(entry.Value)); } foreach (KeyValuePair <int, FrameSkeleton> entry in SceneData.FrameResource.FrameSkeletons) { dataGridView1.Rows.Add(ConvertEntryToDataGridView(entry.Value)); } foreach (KeyValuePair <int, FrameSkeletonHierachy> entry in SceneData.FrameResource.FrameSkeletonHierachies) { dataGridView1.Rows.Add(ConvertEntryToDataGridView(entry.Value)); } foreach (KeyValuePair <int, object> entry in SceneData.FrameResource.FrameObjects) { dataGridView1.Rows.Add(ConvertEntryToDataGridView(entry.Value)); } if (SceneData.FrameNameTable != null) { TreeNode looseSceneNode = null; looseSceneNode = new TreeNode("<scene>"); looseSceneNode.Name = "<scene>"; foreach (FrameNameTable.Data data in SceneData.FrameNameTable.FrameData) { if (data.ParentName == null) { data.ParentName = "<scene>"; } TreeNode root = null; if (!data.ParentName.Equals("<scene>")) { //this is more spaghetti code. but right now, this codebase is like Fallout 76. int sceneKey = -1; foreach (KeyValuePair <int, FrameHeaderScene> entry in SceneData.FrameResource.FrameScenes) { if (entry.Value.Name.String == data.ParentName) { sceneKey = entry.Key; } } int index = treeView1.Nodes.IndexOfKey(sceneKey.ToString()); if (index == -1) { treeView1.Nodes.Add(data.ParentName, data.ParentName); } index = treeView1.Nodes.IndexOfKey(sceneKey.ToString()); root = treeView1.Nodes[index]; } else { root = looseSceneNode; } if (data.FrameIndex != -1) { int total = SceneData.FrameResource.Header.SceneFolders.Length + SceneData.FrameResource.Header.NumGeometries + SceneData.FrameResource.Header.NumMaterialResources + SceneData.FrameResource.Header.NumBlendInfos + SceneData.FrameResource.Header.NumSkeletons + SceneData.FrameResource.Header.NumSkelHierachies; FrameObjectBase block = (SceneData.FrameResource.FrameObjects.ElementAt(data.FrameIndex).Value as FrameObjectBase); block.FrameNameTableFlags = data.Flags; block.IsOnFrameTable = true; TreeNode node = CreateTreeNode(block); if (node == null) { continue; } root.Nodes.Add(node); } } if (looseSceneNode.Nodes.Count > 0) { treeView1.Nodes.Add(looseSceneNode); } } dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); foreach (KeyValuePair <int, object> entry in SceneData.FrameResource.FrameObjects) { FrameObjectBase fObject = (FrameObjectBase)entry.Value; TreeNode node = CreateTreeNode(fObject); if (node == null) { continue; } //if ParentIndex1 && ParentIndex2 equals then its kind of like the root of the object. //All subobjects of this 'root' should have ParentIndex2 set to the 'roots' parent. //ParentIndex1 is the unique one. //Looks to me that the objects which have ParentIndex1 && ParentIndex2 having the same value is usually on the 'FrameNameTable'. //all nodes found are dumped here. TreeNode[] nodes = null; //so first we check for 'root' objects. if (fObject.ParentIndex1.Index == fObject.ParentIndex2.Index) { nodes = treeView1.Nodes.Find(fObject.ParentIndex1.RefID.ToString(), true); } else if (fObject.ParentIndex1.Index != fObject.ParentIndex2.Index) { //test, still trying to nail this f****r down. nodes = treeView1.Nodes.Find(fObject.ParentIndex2.RefID.ToString(), true); } if (nodes.Length > 0) { nodes[0].Nodes.Add(node); } else if (fObject.ParentIndex1.Index == -1 && fObject.ParentIndex2.Index == -1) { treeView1.Nodes.Add(node); } else { unadded.Add(node); } } foreach (TreeNode obj in unadded) { TreeNode[] nodes = treeView1.Nodes.Find((obj.Tag as FrameObjectBase).ParentIndex1.RefID.ToString(), true); if (nodes.Length > 0) { nodes[0].Nodes.Add(obj); Debug.WriteLine("Added: " + obj.Text); } else if ((treeView1.Nodes.Find((obj.Tag as FrameObjectBase).RefID.ToString(), true).Length != 0)) { Debug.WriteLine("Unadded node was found"); } else { //buggy backup: nodes = treeView1.Nodes.Find((obj.Tag as FrameObjectBase).ParentIndex2.RefID.ToString(), true); if (nodes.Length > 0) { nodes[0].Nodes.Add(obj); Debug.WriteLine("Added: " + obj.Text); } else { Debug.WriteLine(string.Format("WARNING: node: {0} was not added properly", obj.Text)); treeView1.Nodes.Add(obj); } } } ToolkitSettings.UpdateRichPresence("Using the Frame Resource editor"); }
public void BuildDataFromResource(FrameResource.FrameResource resource) { List <Data> tableData = new List <Data>(); int[] scenePos; string[] sceneNames; if (resource.Header.IsScene) { scenePos = new int[resource.Header.NumFolderNames + 1]; sceneNames = new string[resource.Header.NumFolderNames + 1]; //add the actual scenes from the header, and then the <scenes> one. for (int i = 0; i != resource.Header.NumFolderNames; i++) { m_buffer += resource.Header.SceneFolders[i].Name.String; m_buffer += "\0"; scenePos[i] = m_buffer.Length - resource.Header.SceneFolders[i].Name.String.Length - 1; sceneNames[i] = resource.Header.SceneFolders[i].Name.String; } string scene = "<scene>\0"; m_buffer += scene; scenePos[scenePos.Length - 1] = m_buffer.Length - scene.Length; sceneNames[sceneNames.Length - 1] = scene; } else { scenePos = new int[1]; sceneNames = new string[1]; m_buffer += "<scene>\0"; scenePos[0] = 0; sceneNames[0] = "<scene>\0"; } for (int i = 0; i != resource.FrameObjects.Count; i++) { bool addToTable = false; object block = resource.FrameObjects.ElementAt(i).Value; //possible types to save? might change in the future however. if (block.GetType().BaseType == typeof(FrameObjectBase) || block.GetType().BaseType == typeof(FrameObjectJoint) || block.GetType().BaseType == typeof(FrameObjectSingleMesh)) { if ((block as FrameObjectBase).IsOnFrameTable) { addToTable = true; } } if (addToTable) { FrameObjectBase fBase = (block as FrameObjectBase); if (fBase.ParentIndex1.Index == -1) { Data data = new Data(); data.Flags = fBase.FrameNameTableFlags; //auto <scene> int sceneIndex = scenePos.Length - 1; //check if this is a scene. If it is, then we get the index for the scene names and pos. if (resource.Header.IsScene && fBase.ParentIndex2.Index != -1) { sceneIndex = fBase.ParentIndex2.Index; } //set parent index. data.Parent = (short)scenePos[sceneIndex]; //add name to string and set namepos1 For namepos2, check if this is a scene. If so, then use 0xFFFF. data.NamePos1 = (ushort)m_buffer.Length; m_buffer += fBase.Name.String; m_buffer += "\0"; data.NamePos2 = (resource.Header.IsScene) ? (ushort)0xFFFF : data.NamePos1; //set frameIndex. minus the blockID and then subtract it from the total number of blocks. data.FrameIndex = (short)i; tableData.Add(data); } } } frameData = tableData.ToArray(); dataSize = tableData.Count; bufferSize = m_buffer.Length; }