예제 #1
0
        ////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>   Gets the model data from the tag. </summary>
        ///
        /// <param name="tagIndex">     The parent tag index. </param>
        /// <param name="tagManager">   The tags' manager. </param>
        ///
        /// <returns>   The model data. </returns>
        private ModelData GetModelData(TagIndexBase tagIndex, BlamLib.Managers.TagManager tagManager)
        {
            var data = new ModelData();

            data.CollectData(tagIndex, tagManager);

            return(data);
        }
		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>   Gets the model data from the tag. </summary>
		///
		/// <param name="tagIndex">     The parent tag index. </param>
		/// <param name="tagManager">   The tags' manager. </param>
		///
		/// <returns>   The model data. </returns>
		private ModelData GetModelData(TagIndexBase tagIndex, BlamLib.Managers.TagManager tagManager)
		{
			var data = new ModelData();

			data.CollectData(tagIndex, tagManager);

			return data;
		}
        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);
        }
예제 #4
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;
		}