Exemplo n.º 1
0
        ///-------------------------------------------------------------------------------------------------
        /// <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);
        }
Exemplo n.º 3
0
		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;
		}
Exemplo n.º 4
0
		///-------------------------------------------------------------------------------------------------
		/// <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);
			}
		}
Exemplo n.º 5
0
        ///-------------------------------------------------------------------------------------------------
        /// <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;
            }
        }
Exemplo n.º 6
0
		///-------------------------------------------------------------------------------------------------
		/// <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;
			}
		}