Extract anim mapping update to method
This commit is contained in:
		
							parent
							
								
									55c9c2cd31
								
							
						
					
					
						commit
						5d72ba546e
					
				|  | @ -74,57 +74,7 @@ class Program | ||||||
|         var ambient = rendParams.ambientLight * 255; |         var ambient = rendParams.ambientLight * 255; | ||||||
|         var lights = Timing.TimeStage("Gather Lights", () => BuildLightList(mis, hierarchy, campaign)); |         var lights = Timing.TimeStage("Gather Lights", () => BuildLightList(mis, hierarchy, campaign)); | ||||||
|         Timing.TimeStage("Light", () => CastSceneParallel(scene, worldRep, [.. lights], ambient)); |         Timing.TimeStage("Light", () => CastSceneParallel(scene, worldRep, [.. lights], ambient)); | ||||||
| 
 |         Timing.TimeStage("Update Anim Mapping", () => SetAnimLightCellMaps(mis, worldRep, lights)); | ||||||
|         // TODO: Move this to a function |  | ||||||
|         // Now that we've set all the per-cell stuff we need to aggregate the cell mappings |  | ||||||
|         // We can't do this in parallel which is why it's being done afterwards rather than |  | ||||||
|         // as we go |  | ||||||
|         var map = new Dictionary<ushort, List<WorldRep.LightTable.AnimCellMap>>(); |  | ||||||
|         for (var i = 0; i < worldRep.Cells.Length; i++) |  | ||||||
|         { |  | ||||||
|             var cell = worldRep.Cells[i]; |  | ||||||
|             for (var j = 0; j < cell.AnimLightCount; j++) |  | ||||||
|             { |  | ||||||
|                 var animLightIdx = cell.AnimLights[j]; |  | ||||||
|                 if (!map.TryGetValue(animLightIdx, out var value)) |  | ||||||
|                 { |  | ||||||
|                     value = []; |  | ||||||
|                     map[animLightIdx] = value; |  | ||||||
|                 } |  | ||||||
|                 value.Add(new WorldRep.LightTable.AnimCellMap |  | ||||||
|                 { |  | ||||||
|                     CellIndex = (ushort)i, |  | ||||||
|                     LightIndex = (ushort)j, |  | ||||||
|                 }); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if (!mis.TryGetChunk<PropertyChunk<PropAnimLight>>("P$AnimLight", out var animLightChunk)) |  | ||||||
|         { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         foreach (var (lightIdx, animCellMaps) in map) |  | ||||||
|         { |  | ||||||
|             // TODO: Set the range on the property |  | ||||||
|             // Get the appropriate property!! |  | ||||||
|             var light = lights.Find((l) => l.anim && l.animLightTableIndex == lightIdx); |  | ||||||
|             foreach (var prop in animLightChunk.properties) |  | ||||||
|             { |  | ||||||
|                 if (prop.objectId == light.animObjId) |  | ||||||
|                 { |  | ||||||
|                     prop.LightTableLightIndex = lightIdx; |  | ||||||
|                     prop.LightTableMapIndex = (ushort)worldRep.LightingTable.AnimMapCount; |  | ||||||
|                     prop.CellsReached = (ushort)animCellMaps.Count; |  | ||||||
|                     break; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             foreach (var animCellMap in animCellMaps) |  | ||||||
|             { |  | ||||||
|                 worldRep.LightingTable.AnimCellMaps.Add(animCellMap); |  | ||||||
|                 worldRep.LightingTable.AnimMapCount++; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         var dir = Path.GetDirectoryName(misPath); |         var dir = Path.GetDirectoryName(misPath); | ||||||
|         var filename = Path.GetFileNameWithoutExtension(misPath); |         var filename = Path.GetFileNameWithoutExtension(misPath); | ||||||
|  | @ -158,6 +108,61 @@ class Program | ||||||
|         }; |         }; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     private static void SetAnimLightCellMaps( | ||||||
|  |         DbFile mis, | ||||||
|  |         WorldRep worldRep, | ||||||
|  |         List<Light> lights) | ||||||
|  |     { | ||||||
|  |         // Now that we've set all the per-cell stuff we need to aggregate the cell mappings | ||||||
|  |         // We can't do this in parallel which is why it's being done afterwards rather than | ||||||
|  |         // as we go | ||||||
|  |         var map = new Dictionary<ushort, List<WorldRep.LightTable.AnimCellMap>>(); | ||||||
|  |         for (var i = 0; i < worldRep.Cells.Length; i++) | ||||||
|  |         { | ||||||
|  |             var cell = worldRep.Cells[i]; | ||||||
|  |             for (var j = 0; j < cell.AnimLightCount; j++) | ||||||
|  |             { | ||||||
|  |                 var animLightIdx = cell.AnimLights[j]; | ||||||
|  |                 if (!map.TryGetValue(animLightIdx, out var value)) | ||||||
|  |                 { | ||||||
|  |                     value = []; | ||||||
|  |                     map[animLightIdx] = value; | ||||||
|  |                 } | ||||||
|  |                 value.Add(new WorldRep.LightTable.AnimCellMap | ||||||
|  |                 { | ||||||
|  |                     CellIndex = (ushort)i, | ||||||
|  |                     LightIndex = (ushort)j, | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!mis.TryGetChunk<PropertyChunk<PropAnimLight>>("P$AnimLight", out var animLightChunk)) | ||||||
|  |         { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         foreach (var (lightIdx, animCellMaps) in map) | ||||||
|  |         { | ||||||
|  |             // Get the appropriate property!! | ||||||
|  |             var light = lights.Find((l) => l.anim && l.animLightTableIndex == lightIdx); | ||||||
|  |             foreach (var prop in animLightChunk.properties) | ||||||
|  |             { | ||||||
|  |                 if (prop.objectId == light.animObjId) | ||||||
|  |                 { | ||||||
|  |                     prop.LightTableLightIndex = lightIdx; | ||||||
|  |                     prop.LightTableMapIndex = (ushort)worldRep.LightingTable.AnimMapCount; | ||||||
|  |                     prop.CellsReached = (ushort)animCellMaps.Count; | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             foreach (var animCellMap in animCellMaps) | ||||||
|  |             { | ||||||
|  |                 worldRep.LightingTable.AnimCellMaps.Add(animCellMap); | ||||||
|  |                 worldRep.LightingTable.AnimMapCount++; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     // Gather all the brush, object, and anim ligths. Resets the lighting table |     // Gather all the brush, object, and anim ligths. Resets the lighting table | ||||||
|     // TODO: Handle dynamic lights |     // TODO: Handle dynamic lights | ||||||
|     private static List<Light> BuildLightList( |     private static List<Light> BuildLightList( | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue