public Entity3D LightNode(Entity3D node) { Entity3D res = new Entity3D { Name = node.Name + "(Lightmapped)" }; if (node.LightMapInfo.ReceiveLight) { foreach (Data.Mesh3D mesh in node.Meshes) { Data.Mesh3D lit_msh = LightMesh(mesh); res.Meshes.Add(lit_msh); } } else { foreach (Data.Mesh3D mesh in node.Meshes) { res.Meshes.Add(mesh.Clone()); } } foreach (Node3D subnode in node.Sub) { res.Add(LightNode((Entity3D)subnode)); } return(res); }
public Data.Mesh3D LightMesh(Data.Mesh3D mesh) { Data.Mesh3D res_msh = new Data.Mesh3D(mesh.TriData.Length, mesh.VertexData.Length); Data.Vertex[] verts = mesh.VertexData; Data.Tri[] tris = mesh.TriData; System.Collections.Generic.List <MapVertex> lVerts = new System.Collections.Generic.List <MapVertex>(); int vi = 0; foreach (Data.Tri tri in tris) { MapVertex lvert = new MapVertex(); lvert.Verts[0] = verts[tri.V0]; lvert.Verts[1] = verts[tri.V1]; lvert.Verts[2] = verts[tri.v2]; MapVertex dvert = new MapVertex(); dvert.Verts[0] = verts[tri.V0]; dvert.Verts[1] = verts[tri.V1]; dvert.Verts[2] = verts[tri.v2]; OpenTK.Vector3 tri_norm = verts[tri.V0].Norm; tri_norm.Normalize(); OpenTK.Vector3 pointonplane = lvert.Verts[0].Pos; if (Abs(tri_norm.X) > Abs(tri_norm.Y) && Abs(tri_norm.X) > Abs(tri_norm.Z)) { lvert.Plane = 1; } else { if (Abs(tri_norm.Y) > Abs(tri_norm.X) && Abs(tri_norm.Y) > Abs(tri_norm.Z)) { lvert.Plane = 2; } else { lvert.Plane = 3; } } switch (lvert.Plane) { case 1: break; } lvert.VI = vi; lVerts.Add(lvert); } return(res_msh); }
public Entity3D LightNode(Entity3D node) { Entity3D res = new Entity3D { Name = node.Name + "(Lightmapped)" }; foreach (Data.Mesh3D mesh in node.Meshes) { Data.Mesh3D lit_msh = LightMesh(mesh, node.World); res.Meshes.Add(lit_msh); } foreach (Node3D subnode in node.Sub) { res.Add(LightNode((Entity3D)subnode)); } return(res); }
public Data.Mesh3D LightMesh(Data.Mesh3D mesh, OpenTK.Matrix4 world_mat) { Data.Mesh3D res_msh = new Data.Mesh3D(mesh.TriData.Length * 3, mesh.VertexData.Length); Data.Vertex[] verts = mesh.VertexData; Data.Tri[] tris = mesh.TriData; int vi = 0; foreach (Data.Vertex ov in mesh.VertexData) { res_msh.SetVertex(vi, ov.Pos, ov.Tan, ov.BiNorm, ov.Norm, ov.UV); vi++; } res_msh.Transform(world_mat); int ti = 0; foreach (Data.Tri tri in tris) { res_msh.SetTri(ti, tri.V0, tri.V1, tri.v2); ti++; MapVertex lvert = new MapVertex(); lvert.Verts[0] = verts[tri.V0]; lvert.Verts[1] = verts[tri.V1]; lvert.Verts[2] = verts[tri.v2]; MapVertex dvert = new MapVertex(); dvert.Verts[0] = verts[tri.V0]; dvert.Verts[1] = verts[tri.V1]; dvert.Verts[2] = verts[tri.v2]; OpenTK.Vector3 tri_norm = verts[tri.V0].Norm; tri_norm.Normalize(); OpenTK.Vector3 pointonplane = lvert.Verts[0].Pos; int flag = -1; if (Math.Abs(tri_norm.X) > Math.Abs(tri_norm.Y) && Math.Abs(tri_norm.X) > Math.Abs(tri_norm.Z)) { flag = 1; lvert.Verts[0].UV.X = dvert.Verts[0].Pos.Y; lvert.Verts[0].UV.Y = dvert.Verts[0].Pos.Z; lvert.Verts[1].UV.X = dvert.Verts[1].Pos.Y; lvert.Verts[1].UV.Y = dvert.Verts[1].Pos.Z; lvert.Verts[2].UV.X = dvert.Verts[2].Pos.Y; lvert.Verts[2].UV.Y = dvert.Verts[2].Pos.Z; } else if (Math.Abs(tri_norm.Y) > Math.Abs(tri_norm.X) && Math.Abs(tri_norm.Y) > Math.Abs(tri_norm.Z)) { flag = 2; lvert.Verts[0].UV.X = dvert.Verts[0].Pos.X; lvert.Verts[0].UV.Y = dvert.Verts[0].Pos.Z; lvert.Verts[1].UV.X = dvert.Verts[1].Pos.X; lvert.Verts[1].UV.Y = dvert.Verts[1].Pos.Z; lvert.Verts[2].UV.X = dvert.Verts[2].Pos.X; lvert.Verts[2].UV.Y = dvert.Verts[2].Pos.Z; } else { flag = 3; lvert.Verts[0].UV.X = dvert.Verts[0].Pos.X; lvert.Verts[0].UV.Y = dvert.Verts[0].Pos.Y; lvert.Verts[1].UV.X = dvert.Verts[1].Pos.X; lvert.Verts[1].UV.Y = dvert.Verts[1].Pos.Y; lvert.Verts[2].UV.X = dvert.Verts[2].Pos.X; lvert.Verts[2].UV.Y = dvert.Verts[2].Pos.Y; } float min_u = lvert.Verts[0].UV.X; float min_v = lvert.Verts[0].UV.Y; float max_u = lvert.Verts[0].UV.X; float max_v = lvert.Verts[0].UV.Y; for (int i = 0; i < 3; i++) { if (lvert.Verts[i].UV.X < min_u) { min_u = lvert.Verts[i].UV.X; } if (lvert.Verts[i].UV.X < min_v) { min_v = lvert.Verts[i].UV.Y; } if (lvert.Verts[i].UV.X > max_u) { max_u = lvert.Verts[i].UV.X; } if (lvert.Verts[i].UV.Y > max_v) { max_v = lvert.Verts[i].UV.Y; } } float delta_u = max_u - min_u; float delta_v = max_v - min_v; for (int i = 0; i < 3; i++) { lvert.Verts[i].UV.X = lvert.Verts[i].UV.X - min_u; lvert.Verts[i].UV.Y = lvert.Verts[i].UV.Y - min_v; lvert.Verts[i].UV.X = lvert.Verts[i].UV.X / delta_u; lvert.Verts[i].UV.Y = lvert.Verts[i].UV.Y / delta_v; } float dist = (tri_norm.X * pointonplane.X + tri_norm.Y * pointonplane.Y + tri_norm.Z * pointonplane.Z); float X, Y, Z; OpenTK.Vector3 UVVector = OpenTK.Vector3.Zero; OpenTK.Vector3 vec1 = OpenTK.Vector3.Zero, vec2 = OpenTK.Vector3.Zero; switch (flag) { case 1: X = -(tri_norm.Y * min_u + tri_norm.Z * min_v + dist) / tri_norm.X; UVVector.X = X; UVVector.Y = min_u; UVVector.Z = min_v; X = -(tri_norm.Y * max_u + tri_norm.Z * min_v + dist) / tri_norm.X; vec1.X = X; vec1.Y = max_u; vec1.Z = min_v; X = -(tri_norm.Y * min_u + tri_norm.Z * max_v + dist) / tri_norm.X; vec2.X = X; vec2.Y = min_u; vec2.Z = max_v; break; case 2: Y = -(tri_norm.X * min_u + tri_norm.Z * min_v + dist) / tri_norm.Y; UVVector.X = min_u; UVVector.Y = Y; UVVector.Z = min_v; Y = -(tri_norm.X * max_u + tri_norm.Z * min_v + dist) / tri_norm.Y; vec1.X = max_u; vec1.Y = Y; vec1.Z = min_v; Y = -(tri_norm.X * min_u + tri_norm.Z * max_v + dist) / tri_norm.Y; vec2.X = min_u; vec2.Y = Y; vec2.Z = max_v; break; case 3: Z = -(tri_norm.X * min_u + tri_norm.Y * min_v + dist) / tri_norm.Z; UVVector.X = min_u; UVVector.Y = min_v; UVVector.Z = Z; Z = -(tri_norm.X * max_u + tri_norm.Y * min_v + dist) / tri_norm.Z; vec1.X = max_u; vec1.Y = min_v; vec1.Z = Z; Z = -(tri_norm.X * min_u + tri_norm.Y * max_v + dist) / tri_norm.Z; vec2.X = min_u; vec2.Y = max_v; vec2.Z = Z; break; } OpenTK.Vector3 edge1; edge1.X = vec1.X - UVVector.X; edge1.Y = vec1.Y - UVVector.Y; edge1.Z = vec1.Z - UVVector.Z; OpenTK.Vector3 edge2; edge2.X = vec2.X - UVVector.X; edge2.Y = vec2.Y - UVVector.Y; edge2.Z = vec2.Z - UVVector.Z; // Console.WriteLine ( "Grabbing TexLeaf" ); TreeLeaf tex_node = FinalMap.Insert(Tri_W, Tri_H); byte[] rgb = new byte[Tri_W * Tri_H * 3]; OpenTK.Vector3[,] lumels = new OpenTK.Vector3[Tri_W, Tri_H]; for (int iX = 0; iX < Tri_W; iX++) { for (int iY = 0; iY < Tri_H; iY++) { float ufactor = (iX / (float)Tri_W); float vfactor = (iY / (float)Tri_H); OpenTK.Vector3 newedge1; newedge1.X = edge1.X * ufactor; newedge1.Y = edge1.Y * ufactor; newedge1.Z = edge1.Z * ufactor; OpenTK.Vector3 newedge2; newedge2.X = edge2.X * vfactor; newedge2.Y = edge2.Y * vfactor; newedge2.Z = edge2.Z * vfactor; int rloc = (iY * Tri_W * 3) + iX * 3; lumels[iX, iY].X = UVVector.X + newedge2.X + newedge1.X; lumels[iX, iY].Y = UVVector.Y + newedge2.Y + newedge1.Y; lumels[iX, iY].Z = UVVector.Z + newedge2.Z + newedge1.Z; rgb[rloc] = 255; rgb[rloc + 1] = 0; rgb[rloc + 2] = 0; } } for (int cv = 0; cv < 3; cv++) { float lx = ((tex_node.RC.X + 1) + (tex_node.RC.W - 2) * lvert.Verts[cv].UV.X) / tex_node.Root.RC.W; float ly = ((tex_node.RC.Y + 1) + (tex_node.RC.H - 2) * lvert.Verts[cv].UV.Y) / tex_node.Root.RC.H; lvert.Verts[cv].UV.X = lx; lvert.Verts[cv].UV.Y = ly; // Console.WriteLine ( "LX:" + lx + " LY:" + ly ); res_msh.VertexData [ tri.V0 // ].UV = new OpenTK.Vector2 ( lx, ly ); } res_msh.VertexData[tri.V0].UV = lvert.Verts[0].UV; res_msh.VertexData[tri.V1].UV = lvert.Verts[1].UV; res_msh.VertexData[tri.v2].UV = lvert.Verts[2].UV; tex_node.SetRaw(rgb); } res_msh.Material = new Material.Material3D(); res_msh.Final(); return(res_msh); }