You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.8 KiB
83 lines
2.8 KiB
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
|
|
public class BrushModel
|
|
{
|
|
private readonly string name;
|
|
private readonly List<Mesh> meshes = new List<Mesh>();
|
|
|
|
public BrushModel(string name)
|
|
{
|
|
this.name = name;
|
|
}
|
|
|
|
public void ImportMeshData(QModel model, QSurface[] surfaces)
|
|
{
|
|
List<Vector3> vertices = new List<Vector3>();
|
|
List<Vector2> textureUVs = new List<Vector2>();
|
|
List<Vector2> lightmapUVs = new List<Vector2>();
|
|
List<ushort> indices = new List<ushort>();
|
|
|
|
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().ToUnity());
|
|
textureUVs.Add(polyVerts[vertIdx].textureUV.ToVector2());
|
|
lightmapUVs.Add(polyVerts[vertIdx].lightmapUV.ToVector2());
|
|
}
|
|
|
|
// Reconstruct triangle fan
|
|
for (ushort index = 2; index < polyVerts.Length; ++index)
|
|
{
|
|
indices.Add(0);
|
|
indices.Add((ushort)(index - 1));
|
|
indices.Add(index);
|
|
}
|
|
|
|
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<MeshFilter>();
|
|
mf.sharedMesh = mesh;
|
|
|
|
var mr = meshGO.AddComponent<MeshRenderer>();
|
|
mr.sharedMaterial = mat;
|
|
mr.shadowCastingMode = ShadowCastingMode.Off;
|
|
mr.receiveShadows = false;
|
|
mr.lightProbeUsage = LightProbeUsage.Off;
|
|
mr.reflectionProbeUsage = ReflectionProbeUsage.Off;
|
|
}
|
|
|
|
go.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity);
|
|
}
|
|
}
|