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>();
 | 
							var lightmapUvs = new List<Vector2>();
 | 
				
			||||||
		GenerateMeshContent(cell, maxPolyIdx, packingRects, rectIdToUvIdxMap, vertices, normals, indices, lightmapUvs);
 | 
							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);
 | 
							RectanglePacker.Pack(packingRects, out var bounds);
 | 
				
			||||||
		var image = Image.Create((int)bounds.Width, (int)bounds.Height, false, Image.Format.Rgba8);
 | 
							var image = Image.Create((int)bounds.Width, (int)bounds.Height, false, Image.Format.Rgba8);
 | 
				
			||||||
		foreach (var rect in packingRects)
 | 
							foreach (var rect in packingRects)
 | 
				
			||||||
| 
						 | 
					@ -131,11 +151,8 @@ public partial class Mission : Node3D
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						rawColour += lightmap.GetPixel(l, x, y);
 | 
											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 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));
 | 
				
			||||||
					// var texIdx = cell.RenderPolys[rect.Id].TextureId;
 | 
					 | 
				
			||||||
					// colour = _textures[texIdx].GetPixel((int)x, (int)y);
 | 
					 | 
				
			||||||
					image.SetPixel((int)(rect.X + x), (int)(rect.Y + y), colour);
 | 
										image.SetPixel((int)(rect.X + x), (int)(rect.Y + y), colour);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -161,20 +178,7 @@ public partial class Mission : Node3D
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var material = new StandardMaterial3D
 | 
							return image;
 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			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);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	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)
 | 
						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