Extract lightmap generation
This commit is contained in:
		
							parent
							
								
									114997f720
								
							
						
					
					
						commit
						714c9804d8
					
				|  | @ -112,6 +112,26 @@ public partial class Mission : Node3D | |||
| 		var lightmapUvs = new List<Vector2>(); | ||||
| 		GenerateMeshContent(cell, maxPolyIdx, packingRects, rectIdToUvIdxMap, vertices, normals, indices, lightmapUvs); | ||||
| 
 | ||||
| 		Image lightmap = BuildLightmap(cell, packingRects, rectIdToUvIdxMap, lightmapUvs); | ||||
| 
 | ||||
| 		var material = new StandardMaterial3D | ||||
| 		{ | ||||
| 			AlbedoTexture = ImageTexture.CreateFromImage(lightmap), | ||||
| 			TextureFilter = BaseMaterial3D.TextureFilterEnum.Nearest, | ||||
| 		}; | ||||
| 
 | ||||
| 		MeshInstance3D mesh = GenerateMesh(vertices, normals, indices, lightmapUvs, material); | ||||
| 		OccluderInstance3D occluderInstance = GenerateOccluder(vertices, indices); | ||||
| 
 | ||||
| 		var cellNode = new Node3D(); | ||||
| 		cellNode.AddChild(mesh); | ||||
| 		cellNode.AddChild(occluderInstance); | ||||
| 
 | ||||
| 		AddChild(cellNode); | ||||
| 	} | ||||
| 
 | ||||
| 	private static Image BuildLightmap(WorldRep.Cell cell, PackingRectangle[] packingRects, List<int[]> rectIdToUvIdxMap, List<Vector2> lightmapUvs) | ||||
| 	{ | ||||
| 		RectanglePacker.Pack(packingRects, out var bounds); | ||||
| 		var image = Image.Create((int)bounds.Width, (int)bounds.Height, false, Image.Format.Rgba8); | ||||
| 		foreach (var rect in packingRects) | ||||
|  | @ -131,11 +151,8 @@ public partial class Mission : Node3D | |||
| 					{ | ||||
| 						rawColour += lightmap.GetPixel(l, x, y); | ||||
| 					} | ||||
| 					var colour = new Color(MathF.Min(rawColour.X, 1.0f), MathF.Min(rawColour.Y, 1.0f), MathF.Min(rawColour.Z, 1.0f), MathF.Min(rawColour.W, 1.0f)); | ||||
| 
 | ||||
| 					// !HACK: lol just overwriting the lightmap :xdd: | ||||
| 					// var texIdx = cell.RenderPolys[rect.Id].TextureId; | ||||
| 					// colour = _textures[texIdx].GetPixel((int)x, (int)y); | ||||
| 					var colour = new Color(MathF.Min(rawColour.X, 1.0f), MathF.Min(rawColour.Y, 1.0f), MathF.Min(rawColour.Z, 1.0f), MathF.Min(rawColour.W, 1.0f)); | ||||
| 					image.SetPixel((int)(rect.X + x), (int)(rect.Y + y), colour); | ||||
| 				} | ||||
| 			} | ||||
|  | @ -161,20 +178,7 @@ public partial class Mission : Node3D | |||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		var material = new StandardMaterial3D | ||||
| 		{ | ||||
| 			AlbedoTexture = ImageTexture.CreateFromImage(image), | ||||
| 			TextureFilter = BaseMaterial3D.TextureFilterEnum.Nearest, | ||||
| 		}; | ||||
| 
 | ||||
| 		MeshInstance3D mesh = GenerateMesh(vertices, normals, indices, lightmapUvs, material); | ||||
| 		OccluderInstance3D occluderInstance = GenerateOccluder(vertices, indices); | ||||
| 
 | ||||
| 		var cellNode = new Node3D(); | ||||
| 		cellNode.AddChild(mesh); | ||||
| 		cellNode.AddChild(occluderInstance); | ||||
| 
 | ||||
| 		AddChild(cellNode); | ||||
| 		return image; | ||||
| 	} | ||||
| 
 | ||||
| 	private static void GenerateMeshContent(WorldRep.Cell cell, int maxPolyIdx, PackingRectangle[] packingRects, List<int[]> rectIdToUvIdxMap, List<Vector3> vertices, List<Vector3> normals, List<int> indices, List<Vector2> lightmapUvs) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue