public IGeometryModel ReadGeometry(int lod) { if (lod < 0 || lod >= ((IRenderGeometry)this).LodCount) { throw new ArgumentOutOfRangeException(nameof(lod)); } var model = new GeometryModel(Name) { CoordinateSystem = CoordinateSystem.Default }; model.Nodes.AddRange(Nodes); model.MarkerGroups.AddRange(MarkerGroups); model.Bounds.AddRange(BoundingBoxes); model.Materials.AddRange(Halo3Common.GetMaterials(Shaders)); foreach (var region in Regions) { var gRegion = new GeometryRegion { SourceIndex = Regions.IndexOf(region), Name = region.Name }; gRegion.Permutations.AddRange(region.Permutations.Where(p => p.SectionIndex >= 0).Select(p => new GeometryPermutation { SourceIndex = region.Permutations.IndexOf(p), Name = p.Name, MeshIndex = p.SectionIndex, MeshCount = 1 })); if (gRegion.Permutations.Any()) { model.Regions.Add(gRegion); } } Func <int, int, int> mapNodeFunc = null; if (Flags.HasFlag(ModelFlags.UseLocalNodes)) { mapNodeFunc = (si, i) => NodeMaps[si].Indices[i]; } model.Meshes.AddRange(Halo3Common.GetMeshes(cache, ResourcePointer, Sections, (s, m) => m.BoundsIndex = 0, mapNodeFunc)); CreateInstanceMeshes(model); return(model); }
public IGeometryModel ReadGeometry(int lod) { if (lod < 0 || lod >= ((IRenderGeometry)this).LodCount) { throw new ArgumentOutOfRangeException(nameof(lod)); } var scenario = cache.TagIndex.GetGlobalTag("scnr").ReadMetadata <scenario>(); var model = new GeometryModel(item.FileName()) { CoordinateSystem = CoordinateSystem.Default }; var bspBlock = scenario.StructureBsps.First(s => s.BspReference.TagId == item.Id); var bspIndex = scenario.StructureBsps.IndexOf(bspBlock); var lightmap = scenario.ScenarioLightmapReference.Tag.ReadMetadata <scenario_lightmap>(); var lightmapData = cache.CacheType < CacheType.MccHalo3U4 ? lightmap.LightmapData.First(sldt => sldt.BspIndex == bspIndex) : lightmap.LightmapRefs.Select(sldt => sldt.Tag.ReadMetadata <scenario_lightmap_bsp_data>()).First(sldt => sldt.BspIndex == bspIndex); model.Bounds.AddRange(BoundingBoxes); model.Materials.AddRange(Halo3Common.GetMaterials(Shaders)); var clusterRegion = new GeometryRegion { Name = "Clusters" }; clusterRegion.Permutations.AddRange( Clusters.Select((c, i) => new GeometryPermutation { SourceIndex = i, Name = Clusters.IndexOf(c).ToString("D3", CultureInfo.CurrentCulture), MeshIndex = c.SectionIndex, MeshCount = 1 }) ); model.Regions.Add(clusterRegion); foreach (var instanceGroup in GeometryInstances.GroupBy(i => i.SectionIndex)) { var section = lightmapData.Sections[instanceGroup.Key]; var sectionRegion = new GeometryRegion { Name = Utils.CurrentCulture($"Instances {instanceGroup.Key:D3}") }; sectionRegion.Permutations.AddRange( instanceGroup.Select(i => new GeometryPermutation { SourceIndex = GeometryInstances.IndexOf(i), Name = i.Name, Transform = i.Transform, TransformScale = i.TransformScale, MeshIndex = i.SectionIndex, MeshCount = 1 }) ); model.Regions.Add(sectionRegion); } model.Meshes.AddRange(Halo3Common.GetMeshes(cache, lightmapData.ResourcePointer, lightmapData.Sections, (s, m) => { var index = (short)lightmapData.Sections.IndexOf(s); m.BoundsIndex = index >= BoundingBoxes.Count ? (short?)null : index; m.IsInstancing = index < BoundingBoxes.Count; })); return(model); }