private void reloadMesh(BXDAEditorNode meshNode) { foreach (BXDAEditorNode visualSubMeshNode in meshNode.Nodes[0].Nodes) //Visual Sub-meshes { reloadSubMesh(visualSubMeshNode); } foreach (BXDAEditorNode collisionSubMeshNode in meshNode.Nodes[1].Nodes) //Collision Sub-meshes { reloadSubMesh(collisionSubMeshNode); } BXDAMesh mesh = (BXDAMesh)meshNode.data[0]; //Physical properties float mass = (float)((BXDAEditorNode)meshNode.Nodes[2].Nodes[0]).data[0]; if (_units.Equals("lb")) { mesh.physics.mass = mass / 2.205f; } else { mesh.physics.mass = mass; } mesh.physics.centerOfMass.x = (float)((BXDAEditorNode)meshNode.Nodes[2].Nodes[1]).data[0]; mesh.physics.centerOfMass.y = (float)((BXDAEditorNode)meshNode.Nodes[2].Nodes[1]).data[1]; mesh.physics.centerOfMass.z = (float)((BXDAEditorNode)meshNode.Nodes[2].Nodes[1]).data[2]; }
/// <summary> /// Generates a tree from a bxda file /// </summary> /// <param name="meshPath">The path to the .bxda file</param> /// <returns>The root node of the mesh tree</returns> private BXDAEditorNode GenerateTree(BXDAMesh mesh) { BXDAEditorNode meshNode = new BXDAEditorNode(BXDAEditorNode.NodeType.MESH, false, mesh); BXDAEditorNode visualSectionHeader = new BXDAEditorNode("Visual Sub-meshes", BXDAEditorNode.NodeType.INTEGER, false, mesh.meshes.Count); meshNode.Nodes.Add(visualSectionHeader); generateSubMeshTree(visualSectionHeader, mesh.meshes); BXDAEditorNode collisionSectionHeader = new BXDAEditorNode("Collision Sub-meshes", BXDAEditorNode.NodeType.INTEGER, false, mesh.colliders.Count); meshNode.Nodes.Add(collisionSectionHeader); generateSubMeshTree(collisionSectionHeader, mesh.colliders); BXDAEditorNode physicsSectionHeader = new BXDAEditorNode(String.Format("Physical Properties ({0}, cm)", _units), BXDAEditorNode.NodeType.SECTION_HEADER, false); meshNode.Nodes.Add(physicsSectionHeader); physicsSectionHeader.Nodes.Add(new BXDAEditorNode("Total Mass", BXDAEditorNode.NodeType.FLOAT, true, _units.Equals("lb") ? mesh.physics.mass * 2.205f : mesh.physics.mass)); physicsSectionHeader.Nodes.Add(new BXDAEditorNode("Center of Mass", BXDAEditorNode.NodeType.VECTOR3, true, mesh.physics.centerOfMass.x, mesh.physics.centerOfMass.y, mesh.physics.centerOfMass.z)); return(meshNode); }
/// <summary> /// Generate a tree of Sub-meshes from a list (Mostly for code niceness) /// </summary> /// <param name="subMeshes">A list of submeshes (Either visual or collision)</param> /// <returns>A blank node with the generated tree of Sub-meshes under it</returns> private void generateSubMeshTree(BXDAEditorNode root, List <BXDAMesh.BXDASubMesh> subMeshes) { //Sub-meshes foreach (BXDAMesh.BXDASubMesh subMesh in subMeshes) { BXDAEditorNode subMeshNode = new BXDAEditorNode(BXDAEditorNode.NodeType.SUBMESH, false, subMesh); root.Nodes.Add(subMeshNode); //Vertices BXDAEditorNode verticesSectionHeader = new BXDAEditorNode("Vertices", BXDAEditorNode.NodeType.INTEGER, false, subMesh.verts.Length); subMeshNode.Nodes.Add(verticesSectionHeader); //Vertex Normals if (subMesh.norms != null) { BXDAEditorNode normalsSectionHeader = new BXDAEditorNode("Surface Normals", BXDAEditorNode.NodeType.INTEGER, false, subMesh.norms.Length); subMeshNode.Nodes.Add(normalsSectionHeader); } //Surfaces BXDAEditorNode surfacesSectionHeader = new BXDAEditorNode("Surfaces", BXDAEditorNode.NodeType.INTEGER, false, subMesh.surfaces.Count); subMeshNode.Nodes.Add(surfacesSectionHeader); foreach (BXDAMesh.BXDASurface surface in subMesh.surfaces) { BXDAEditorNode surfaceNode = new BXDAEditorNode(BXDAEditorNode.NodeType.SURFACE, false, surface); surfacesSectionHeader.Nodes.Add(surfaceNode); //Material Properties BXDAEditorNode materialSectionHeader = new BXDAEditorNode("Material Properties", BXDAEditorNode.NodeType.SECTION_HEADER, false); surfaceNode.Nodes.Add(materialSectionHeader); materialSectionHeader.Nodes.Add(new BXDAEditorNode("Color", BXDAEditorNode.NodeType.COLOR, true, surface.color, surface.hasColor)); materialSectionHeader.Nodes.Add(new BXDAEditorNode("Transparency", BXDAEditorNode.NodeType.FLOAT, true, surface.transparency)); materialSectionHeader.Nodes.Add(new BXDAEditorNode("Translucency", BXDAEditorNode.NodeType.FLOAT, true, surface.translucency)); materialSectionHeader.Nodes.Add(new BXDAEditorNode("Specular Intensity", BXDAEditorNode.NodeType.FLOAT, true, surface.specular)); //Indices BXDAEditorNode indicesSectionHeader = new BXDAEditorNode("Indices", BXDAEditorNode.NodeType.INTEGER, false, surface.indicies.Length); surfaceNode.Nodes.Add(indicesSectionHeader); } } }
/// <summary> /// Occurs after a node is double clicked /// </summary> /// <param name="sender">Not used</param> /// <param name="e">Not used</param> private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { BXDAEditorNode selectedNode = (BXDAEditorNode)treeView1.SelectedNode; if (selectedNode != null && selectedNode.isEditable) { BXDAEditorForm editForm = new BXDAEditorForm(selectedNode); if (editForm.ShowDialog(this) == DialogResult.OK) { reloadModel(); } } }
private void reloadSubMesh(BXDAEditorNode subMeshNode) { foreach (BXDAEditorNode surfaceNode in subMeshNode.LastNode.Nodes) { BXDAMesh.BXDASurface surface = (BXDAMesh.BXDASurface)surfaceNode.data[0]; BXDAEditorNode materialNode = (BXDAEditorNode)surfaceNode.Nodes[0]; surface.hasColor = (bool)((BXDAEditorNode)materialNode.Nodes[0]).data[1]; surface.color = (uint)((BXDAEditorNode)materialNode.Nodes[0]).data[0]; surface.transparency = (float)((BXDAEditorNode)materialNode.Nodes[1]).data[0]; surface.translucency = (float)((BXDAEditorNode)materialNode.Nodes[2]).data[0]; surface.specular = (float)((BXDAEditorNode)materialNode.Nodes[3]).data[0]; } }
public void loadModel(List <BXDAMesh> meshes) { treeView1.Nodes.Clear(); if (meshes == null) { return; } rootNode = new BXDAEditorNode("Model", BXDAEditorNode.NodeType.SECTION_HEADER, false); rootNode.Nodes.Add(new BXDAEditorNode("Exported with version", BXDAEditorNode.NodeType.STRING, false, BXDIO.ASSEMBLY_VERSION)); foreach (BXDAMesh mesh in meshes) { rootNode.Nodes.Add(GenerateTree(mesh)); } treeView1.Nodes.Add(rootNode); }