///------------------------------------------------------------------------------------------------- /// <summary> Creates instances of all the controllers. </summary> ///------------------------------------------------------------------------------------------------- void CreateNodeList() { var materialReferences = new MaterialReferenceList(); if (mShaderDataProvider != null) { // create a list of every shader used foreach (var effect in mShaderDataProvider.GetEffects()) { string effectName = ColladaUtilities.FormatName(Path.GetFileNameWithoutExtension(effect.Name), " ", "_"); materialReferences.Add(new MaterialReference( effectName, ColladaUtilities.BuildUri(ColladaElement.FormatID <Fx.ColladaMaterial>(effectName)), effectName)); } } // create the controller instances var geometrySetList = mModelDataProvider.GetGeometries(); for (int i = 0; i < geometrySetList.Count; i++) { var node = CreateNode(geometrySetList[i].Name, "", geometrySetList[i].Name, Enums.ColladaNodeType.NODE); // If there are no bones instance the static geometry, otherwise create a skinned instance string name = ColladaUtilities.FormatName(geometrySetList[i].Name, " ", "_"); if (mModelDataProvider.GetBones().Count == 0) { node.Add( CreateInstanceGeometry( ColladaUtilities.BuildUri(ColladaElement.FormatID <Core.ColladaGeometry>(name)), name, materialReferences ) ); } else { node.Add( CreateInstanceController( ColladaUtilities.BuildUri(ColladaElement.FormatID <Core.ColladaController>(name)), name, materialReferences ) ); } listNode.Add(node); } }
private List <string> GetNodeReferences(ScenarioData.ScenarioObject objectType, string permutation) { var nodeIds = new List <string>(); // Add geometry instances to the node if (!TagIndex.IsValid(objectType.ObjectTagDatum)) { throw new ColladaException("Failed to load the object type tag {0}", objectType.ObjectTagPath); } var objectName = Path.GetFileNameWithoutExtension(objectType.ObjectTagPath); objectName += "-perm" + permutation; // Collect data about the object var objectData = new ObjectData(); objectData.CollectData(mTagIndex, mTagIndex[objectType.ObjectTagDatum]); if (!TagIndex.IsValid(objectData.Model)) { return(nodeIds); } if (COLLADAFile.LibraryNodes == null) { AddLibraryNodes(); } // Collect data about the model var modelData = new ModelData(); modelData.CollectData(mTagIndex, mTagIndex[objectData.Model]); // Get all of the geometries that make up the permutation at the highest lod var geometryList = modelData.GetGeometries(permutation, Blam.Halo1.TypeEnums.LevelOfDetailEnum.SuperHigh); // Add geometry instances for all geometries foreach (var geometrySet in geometryList) { var name = objectName + "-" + geometrySet.Name; ColladaNCName nodeName = name; ColladaID <ColladaNode> nodeId = name; nodeIds.Add(nodeId); if (COLLADAFile.LibraryNodes.Node.Exists(node => node.ID == nodeId.ToString())) { break; } // Create shader references for all shaders used by the geometry var materialReferences = new MaterialReferenceList(); foreach (var shader in geometrySet.Shaders) { ColladaNCName symbolName = shader.MaterialName; ColladaID <Fx.ColladaMaterial> shaderName = shader.MaterialName; var url = ColladaUtilities.BuildExternalReference(modelData, colladaSettings.RootDirectory, shaderName); materialReferences.Add(new MaterialReference(shaderName, url, symbolName)); } // Build the geometry reference URL and add the geometry instance string geometryURL = ColladaUtilities.BuildExternalReference(modelData, colladaSettings.RootDirectory, new ColladaID <Core.ColladaGeometry>(geometrySet.Name)); var nodeType = CreateNode(nodeName, "", nodeId, Enums.ColladaNodeType.NODE); nodeType.Add(CreateInstanceGeometry(geometryURL, geometrySet.Name, materialReferences)); COLLADAFile.LibraryNodes.Node.Add(nodeType); } return(nodeIds); }
private List<string> GetNodeReferences(ScenarioData.ScenarioObject objectType, string permutation) { var nodeIds = new List<string>(); // Add geometry instances to the node if (!TagIndex.IsValid(objectType.ObjectTagDatum)) { throw new ColladaException("Failed to load the object type tag {0}", objectType.ObjectTagPath); } var objectName = Path.GetFileNameWithoutExtension(objectType.ObjectTagPath); objectName += "-perm" + permutation; // Collect data about the object var objectData = new ObjectData(); objectData.CollectData(mTagIndex, mTagIndex[objectType.ObjectTagDatum]); if (!TagIndex.IsValid(objectData.Model)) { return nodeIds; } if(COLLADAFile.LibraryNodes == null) { AddLibraryNodes(); } // Collect data about the model var modelData = new ModelData(); modelData.CollectData(mTagIndex, mTagIndex[objectData.Model]); // Get all of the geometries that make up the permutation at the highest lod var geometryList = modelData.GetGeometries(permutation, Blam.Halo1.TypeEnums.LevelOfDetailEnum.SuperHigh); // Add geometry instances for all geometries foreach(var geometrySet in geometryList) { var name = objectName + "-" + geometrySet.Name; ColladaNCName nodeName = name; ColladaID<ColladaNode> nodeId = name; nodeIds.Add(nodeId); if (COLLADAFile.LibraryNodes.Node.Exists(node => node.ID == nodeId.ToString())) { break; } // Create shader references for all shaders used by the geometry var materialReferences = new MaterialReferenceList(); foreach (var shader in geometrySet.Shaders) { ColladaNCName symbolName = shader.MaterialName; ColladaID<Fx.ColladaMaterial> shaderName = shader.MaterialName; var url = ColladaUtilities.BuildExternalReference(modelData, colladaSettings.RootDirectory, shaderName); materialReferences.Add(new MaterialReference(shaderName, url, symbolName)); } // Build the geometry reference URL and add the geometry instance string geometryURL = ColladaUtilities.BuildExternalReference(modelData, colladaSettings.RootDirectory, new ColladaID<Core.ColladaGeometry>(geometrySet.Name)); var nodeType = CreateNode(nodeName, "", nodeId, Enums.ColladaNodeType.NODE); nodeType.Add(CreateInstanceGeometry(geometryURL, geometrySet.Name, materialReferences)); COLLADAFile.LibraryNodes.Node.Add(nodeType); } return nodeIds; }
///------------------------------------------------------------------------------------------------- /// <summary> Creates instances of all the controllers. </summary> ///------------------------------------------------------------------------------------------------- void CreateNodeList() { var materialReferences = new MaterialReferenceList(); if (mShaderDataProvider != null) { // create a list of every shader used foreach (var effect in mShaderDataProvider.GetEffects()) { string effectName = ColladaUtilities.FormatName(Path.GetFileNameWithoutExtension(effect.Name), " ", "_"); materialReferences.Add(new MaterialReference( effectName, ColladaUtilities.BuildUri(ColladaElement.FormatID<Fx.ColladaMaterial>(effectName)), effectName)); } } // create the controller instances var geometrySetList = mModelDataProvider.GetGeometries(); for (int i = 0; i < geometrySetList.Count; i++) { var node = CreateNode(geometrySetList[i].Name, "", geometrySetList[i].Name, Enums.ColladaNodeType.NODE); // If there are no bones instance the static geometry, otherwise create a skinned instance string name = ColladaUtilities.FormatName(geometrySetList[i].Name, " ", "_"); if (mModelDataProvider.GetBones().Count == 0) { node.Add( CreateInstanceGeometry( ColladaUtilities.BuildUri(ColladaElement.FormatID<Core.ColladaGeometry>(name)), name, materialReferences ) ); } else { node.Add( CreateInstanceController( ColladaUtilities.BuildUri(ColladaElement.FormatID<Core.ColladaController>(name)), name, materialReferences ) ); } listNode.Add(node); } }
///------------------------------------------------------------------------------------------------- /// <summary> Creates nodes for all the geometry elements in the collada file. </summary> ///------------------------------------------------------------------------------------------------- private void CreateNodeList() { // Create the list of materials for the geometry to use var materialReferences = new MaterialReferenceList(); Action <string> addMaterialRef = effectName => { string name = ColladaUtilities.FormatName(Path.GetFileNameWithoutExtension(effectName), " ", "_"); materialReferences.Add(new MaterialReference( effectName, ColladaUtilities.BuildUri(ColladaElement.FormatID <Fx.ColladaMaterial>(name)), name)); }; if (mShaderDataProvider != null) { // create a list of every shader used if (mBSPDataProvider.IncludeRenderMesh) { foreach (var effect in mShaderDataProvider.GetEffects()) { addMaterialRef(effect.Name); } } // if portals are included add the portals shader to the names if (mBSPDataProvider.IncludePortals) { addMaterialRef("portals"); } // if fogplanes are included add the fogplanes shader to the names if (mBSPDataProvider.IncludeFogPlanes) { addMaterialRef("fogplanes"); } } // Create a node with a geometry instance for all included geometry var definition = mTagManager.TagDefinition as H1.Tags.structure_bsp_group; Func <int, Core.ColladaNode> addGeometryInstance = geometryIndex => { string name = listGeometry[geometryIndex].Name; var node = CreateNode(name, "", name, Enums.ColladaNodeType.NODE); string url = ColladaUtilities.BuildUri(listGeometry[geometryIndex].ID); node.Add(CreateInstanceGeometry(url, name, materialReferences)); return(node); }; int geometry_offset = 0; if (mBSPDataProvider.IncludeRenderMesh) { // create geometry instance for all of the lightmaps for (int i = 0; i < definition.Lightmaps.Count; i++) { listNode.Add(addGeometryInstance(geometry_offset + i)); } geometry_offset += definition.Lightmaps.Count; } if (mBSPDataProvider.IncludePortals) { // create geometry instance for all of the portal meshes for (int i = 0; i < definition.ClusterPortals.Count; i++) { listNode.Add(addGeometryInstance(geometry_offset + i)); } geometry_offset += definition.ClusterPortals.Count; } if (mBSPDataProvider.IncludeFogPlanes) { // create geometry instance for all of the fogplane meshes for (int i = 0; i < definition.FogPlanes.Count; i++) { listNode.Add(addGeometryInstance(geometry_offset + i)); } geometry_offset += definition.FogPlanes.Count; } }
///------------------------------------------------------------------------------------------------- /// <summary> Creates nodes for all the geometry elements in the collada file. </summary> ///------------------------------------------------------------------------------------------------- private void CreateNodeList() { // Create the list of materials for the geometry to use var materialReferences = new MaterialReferenceList(); Action<string> addMaterialRef = effectName => { string name = ColladaUtilities.FormatName(Path.GetFileNameWithoutExtension(effectName), " ", "_"); materialReferences.Add(new MaterialReference( effectName, ColladaUtilities.BuildUri(ColladaElement.FormatID<Fx.ColladaMaterial>(name)), name)); }; if (mShaderDataProvider != null) { // create a list of every shader used if (mBSPDataProvider.IncludeRenderMesh) { foreach (var effect in mShaderDataProvider.GetEffects()) { addMaterialRef(effect.Name); } } // if portals are included add the portals shader to the names if (mBSPDataProvider.IncludePortals) { addMaterialRef("portals"); } // if fogplanes are included add the fogplanes shader to the names if (mBSPDataProvider.IncludeFogPlanes) { addMaterialRef("fogplanes"); } } // Create a node with a geometry instance for all included geometry var definition = mTagManager.TagDefinition as H1.Tags.structure_bsp_group; Func<int, Core.ColladaNode> addGeometryInstance = geometryIndex => { string name = listGeometry[geometryIndex].Name; var node = CreateNode(name, "", name, Enums.ColladaNodeType.NODE); string url = ColladaUtilities.BuildUri(listGeometry[geometryIndex].ID); node.Add(CreateInstanceGeometry(url, name, materialReferences)); return node; }; int geometry_offset = 0; if (mBSPDataProvider.IncludeRenderMesh) { // create geometry instance for all of the lightmaps for (int i = 0; i < definition.Lightmaps.Count; i++) { listNode.Add(addGeometryInstance(geometry_offset + i)); } geometry_offset += definition.Lightmaps.Count; } if (mBSPDataProvider.IncludePortals) { // create geometry instance for all of the portal meshes for (int i = 0; i < definition.ClusterPortals.Count; i++) { listNode.Add(addGeometryInstance(geometry_offset + i)); } geometry_offset += definition.ClusterPortals.Count; } if (mBSPDataProvider.IncludeFogPlanes) { // create geometry instance for all of the fogplane meshes for (int i = 0; i < definition.FogPlanes.Count; i++) { listNode.Add(addGeometryInstance(geometry_offset + i)); } geometry_offset += definition.FogPlanes.Count; } }