Calculate texture UVs and move lightmap UVs to UV2
This commit is contained in:
		
							parent
							
								
									da3f9b9203
								
							
						
					
					
						commit
						74f4d0e7c6
					
				|  | @ -164,7 +164,7 @@ public partial class Mission : Node3D | |||
| 			} | ||||
| 
 | ||||
| 			// Transform UVs | ||||
| 			var lightmapUvs = surfaceArrays[rect.Id][(int)Mesh.ArrayType.TexUV].As<Vector2[]>(); | ||||
| 			var lightmapUvs = surfaceArrays[rect.Id][(int)Mesh.ArrayType.TexUV2].As<Vector2[]>(); | ||||
| 			for (var i = 0; i < lightmapUvs.Length; i++) | ||||
| 			{ | ||||
| 				var uv = lightmapUvs[i]; | ||||
|  | @ -182,13 +182,13 @@ public partial class Mission : Node3D | |||
| 				v = (rect.Y + rect.Height * v) / (int)bounds.Height; | ||||
| 				lightmapUvs[i] = new Vector2(u, v); | ||||
| 			} | ||||
| 			surfaceArrays[rect.Id][(int)Mesh.ArrayType.TexUV] = lightmapUvs; | ||||
| 			surfaceArrays[rect.Id][(int)Mesh.ArrayType.TexUV2] = lightmapUvs; | ||||
| 		} | ||||
| 
 | ||||
| 		return image; | ||||
| 	} | ||||
| 
 | ||||
| 	private static List<Godot.Collections.Array> BuildSurfaceArrays( | ||||
| 	private List<Godot.Collections.Array> BuildSurfaceArrays( | ||||
| 		WorldRep.Cell cell, | ||||
| 		int maxPolyIdx, | ||||
| 		out PackingRectangle[] packingRects) | ||||
|  | @ -202,7 +202,8 @@ public partial class Mission : Node3D | |||
| 			var vertices = new List<Vector3>(); | ||||
| 			var normals = new List<Vector3>(); | ||||
| 			var indices = new List<int>(); | ||||
| 			var uvs = new List<Vector2>(); | ||||
| 			var textureUvs = new List<Vector2>(); | ||||
| 			var lightmapUvs = new List<Vector2>(); | ||||
| 
 | ||||
| 			var poly = cell.Polys[i]; | ||||
| 			var normal = cell.Planes[poly.PlaneId].Normal.ToGodotVec3(); | ||||
|  | @ -226,7 +227,7 @@ public partial class Mission : Node3D | |||
| 			var renderPoly = cell.RenderPolys[i]; | ||||
| 			var light = cell.LightList[i]; | ||||
| 			packingRects[i] = new PackingRectangle(0, 0, light.Width, light.Height, i); | ||||
| 			CalcBaseUV(cell, poly, renderPoly, light, uvs, cellIdxOffset); | ||||
| 			CalcBaseUV(cell, poly, renderPoly, light, textureUvs, lightmapUvs, cellIdxOffset); | ||||
| 
 | ||||
| 			cellIdxOffset += poly.VertexCount; | ||||
| 
 | ||||
|  | @ -235,7 +236,8 @@ public partial class Mission : Node3D | |||
| 			array[(int)Mesh.ArrayType.Vertex] = vertices.ToArray(); | ||||
| 			array[(int)Mesh.ArrayType.Normal] = normals.ToArray(); | ||||
| 			array[(int)Mesh.ArrayType.Index] = indices.ToArray(); | ||||
| 			array[(int)Mesh.ArrayType.TexUV] = uvs.ToArray(); | ||||
| 			array[(int)Mesh.ArrayType.TexUV] = textureUvs.ToArray(); | ||||
| 			array[(int)Mesh.ArrayType.TexUV2] = lightmapUvs.ToArray(); | ||||
| 			surfacesArrays.Add(array); | ||||
| 		} | ||||
| 
 | ||||
|  | @ -284,46 +286,68 @@ public partial class Mission : Node3D | |||
| 		return meshInstance; | ||||
| 	} | ||||
| 
 | ||||
| 	private static void CalcBaseUV( | ||||
| 	private void CalcBaseUV( | ||||
| 		WorldRep.Cell cell, | ||||
| 		WorldRep.Cell.Poly poly, | ||||
| 		WorldRep.Cell.RenderPoly renderPoly, | ||||
| 		WorldRep.Cell.LightmapInfo light, | ||||
| 		List<Vector2> textureUvs, | ||||
| 		List<Vector2> lightmapUvs, | ||||
| 		int cellIdxOffset) | ||||
| 	{ | ||||
| 		// TODO: This is slightly hardcoded for ND. Check other stuff at some point. Should be handled in LG side imo | ||||
| 		// TODO: This is a mess lol | ||||
| 		var textureId = renderPoly.TextureId; | ||||
| 		// !HACK: Sky textures :) | ||||
| 		if (textureId >= _textures.Count) | ||||
| 		{ | ||||
| 			textureId = 0; | ||||
| 		} | ||||
| 
 | ||||
| 		var texture = _textures[textureId]; | ||||
| 		var texU = renderPoly.TextureVectors.Item1.ToGodotVec3(); | ||||
| 		var texV = renderPoly.TextureVectors.Item2.ToGodotVec3(); | ||||
| 		var baseU = renderPoly.TextureBases.Item1; | ||||
| 		var baseV = renderPoly.TextureBases.Item2; | ||||
| 
 | ||||
| 		var txUScale = 64.0f / texture.GetWidth(); | ||||
| 		var txVScale = 64.0f / texture.GetHeight(); | ||||
| 		var lmUScale = 4.0f / light.Width; | ||||
| 		var lmVScale = 4.0f / light.Height; | ||||
| 
 | ||||
| 		var txUBase = baseU * txUScale; | ||||
| 		var txVBase = baseV * txVScale; | ||||
| 		var lmUBase = lmUScale * (baseU + (0.5f - light.Bases.Item1) / 4.0f); | ||||
| 		var lmVBase = lmVScale * (baseV + (0.5f - light.Bases.Item2) / 4.0f); | ||||
| 
 | ||||
| 		var uu = texU.Dot(texU); | ||||
| 		var vv = texV.Dot(texV); | ||||
| 		var uv = texU.Dot(texV); | ||||
| 		var lmUScale = 4.0f / light.Width; | ||||
| 		var lmVScale = 4.0f / light.Height; | ||||
| 
 | ||||
| 		var baseU = renderPoly.TextureBases.Item1; | ||||
| 		var baseV = renderPoly.TextureBases.Item2; | ||||
| 		var lmUBase = lmUScale * (baseU + (0.5f - light.Bases.Item1) / 4.0f); | ||||
| 		var lmVBase = lmVScale * (baseV + (0.5f - light.Bases.Item2) / 4.0f); | ||||
| 		var anchor = cell.Vertices[cell.Indices[cellIdxOffset + 0]].ToGodotVec3(); // TODO: This probably shouldn't be hardcoded idx 0 | ||||
| 
 | ||||
| 		if (uv == 0.0) | ||||
| 		{ | ||||
| 			var txUVec = texU * txUScale / uu; | ||||
| 			var txVVec = texV * txVScale / vv; | ||||
| 			var lmUVec = texU * lmUScale / uu; | ||||
| 			var lmVVec = texV * lmVScale / vv; | ||||
| 			for (var i = 0; i < poly.VertexCount; i++) | ||||
| 			{ | ||||
| 				var v = cell.Vertices[cell.Indices[cellIdxOffset + i]].ToGodotVec3(); | ||||
| 				var delta = new Vector3(v.X - anchor.X, v.Y - anchor.Y, v.Z - anchor.Z); | ||||
| 				var txUV = new Vector2(delta.Dot(txUVec) + txUBase, delta.Dot(txVVec) + txVBase); | ||||
| 				var lmUV = new Vector2(delta.Dot(lmUVec) + lmUBase, delta.Dot(lmVVec) + lmVBase); | ||||
| 				textureUvs.Add(txUV); | ||||
| 				lightmapUvs.Add(lmUV); | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			var denom = 1.0f / (uu * vv - uv * uv); | ||||
| 
 | ||||
| 			var txUu = uu * txVScale * denom; | ||||
| 			var txVv = vv * txUScale * denom; | ||||
| 			var txUvu = txUScale * denom * uv; | ||||
| 			var txUvv = txVScale * denom * uv; | ||||
| 			var lmUu = uu * lmVScale * denom; | ||||
| 			var lmVv = vv * lmUScale * denom; | ||||
| 			var lmUvu = lmUScale * denom * uv; | ||||
|  | @ -334,7 +358,10 @@ public partial class Mission : Node3D | |||
| 				var delta = new Vector3(v.X - anchor.X, v.Y - anchor.Y, v.Z - anchor.Z); | ||||
| 				var du = delta.Dot(texU); | ||||
| 				var dv = delta.Dot(texV); | ||||
| 
 | ||||
| 				var txUV = new Vector2(txUBase + txVv * du - txUvu * dv, txVBase + txUu * dv - txUvv * du); | ||||
| 				var lmUV = new Vector2(lmUBase + lmVv * du - lmUvu * dv, lmVBase + lmUu * dv - lmUvv * du); | ||||
| 				textureUvs.Add(txUV); | ||||
| 				lightmapUvs.Add(lmUV); | ||||
| 			} | ||||
| 		} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue