using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; public class BrushModel { private readonly string name; private readonly List meshes = new List(); public BrushModel(string name) { this.name = name; } public void ImportMeshData(QModel model, QSurface[] surfaces) { List vertices = new List(); List textureUVs = new List(); List lightmapUVs = new List(); List indices = new List(); for (int surfIdx = 0; surfIdx < surfaces.Length; ++surfIdx) { foreach (var polyVerts in surfaces[surfIdx].GetPolygons()) { vertices.Clear(); textureUVs.Clear(); lightmapUVs.Clear(); indices.Clear(); for (int vertIdx = 0; vertIdx < polyVerts.Length; ++vertIdx) { vertices.Add(polyVerts[vertIdx].position.ToVector3()); textureUVs.Add(polyVerts[vertIdx].textureUV.ToVector2()); lightmapUVs.Add(polyVerts[vertIdx].lightmapUV.ToVector2()); } // Reconstruct triangle fan (in reverse order) for (ushort index = 2; index < polyVerts.Length; ++index) { indices.Add(index); indices.Add((ushort)(index - 1)); indices.Add(0); } Mesh mesh = new Mesh(); mesh.SetVertices(vertices); mesh.SetUVs(0, textureUVs); mesh.SetUVs(1, lightmapUVs); mesh.SetIndices(indices, MeshTopology.Triangles, 0); mesh.RecalculateNormals(); mesh.UploadMeshData(true); meshes.Add(mesh); } var texNum = surfaces[surfIdx].TextureInfo.Texture.TextureNum; } // DEBUG var go = new GameObject(name); var mat = new Material(Shader.Find("Universal Render Pipeline/Simple Lit")); for (int i = 0; i < meshes.Count; ++i) { var mesh = meshes[i]; var meshGO = new GameObject($"Surface_{i}"); meshGO.transform.SetParent(go.transform); var mf = meshGO.AddComponent(); mf.sharedMesh = mesh; var mr = meshGO.AddComponent(); mr.sharedMaterial = mat; mr.shadowCastingMode = ShadowCastingMode.Off; mr.receiveShadows = false; mr.lightProbeUsage = LightProbeUsage.Off; mr.reflectionProbeUsage = ReflectionProbeUsage.Off; } go.transform.SetPositionAndRotation(Vector3.zero, Quaternion.Euler(-90, 90, 0)); } }