using System; using System.Collections.Generic; using Oni.Imaging; namespace Oni.Akira { internal class PolygonMesh { private readonly MaterialLibrary materialLibrary; private readonly List points = new List(); private readonly List normals = new List(); private readonly List texCoords = new List(); private readonly List polygons = new List(); private readonly List doors = new List(); private readonly List rooms = new List(); private readonly List ghosts = new List(); private readonly List floors = new List(); private bool hasDebugInfo; public PolygonMesh(MaterialLibrary materialLibrary) { this.materialLibrary = materialLibrary; } public MaterialLibrary Materials => materialLibrary; public List Points => points; public List TexCoords => texCoords; public List Normals => normals; public List Polygons => polygons; public List Doors => doors; public List Rooms => rooms; public List Floors => floors; public List Ghosts => ghosts; public bool HasDebugInfo { get { return hasDebugInfo; } set { hasDebugInfo = value; } } public BoundingBox GetBoundingBox() => BoundingBox.CreateFromPoints(points); public void DoLighting() { var ambientColor = new Vector3(0.6f, 0.6f, 0.6f); var lightDir = new[] { new Vector3(-0.526f, -0.573f, -0.627f), new Vector3(0.719f, 0.342f, 0.604f), new Vector3(0.454f, 0.766f, 0.454f) }; var lightColor = new[] { new Vector3(1.0f, 1.0f, 1.0f), new Vector3(1.0f, 1.0f, 1.0f), new Vector3(1.0f, 1.0f, 1.0f) }; //if (importLights) //{ // ambientColor = ambient; //} foreach (var polygon in polygons) { if (polygon.Colors != null) continue; var colors = new Color[polygon.VertexCount]; if (polygon.NormalIndices != null) { for (int i = 0; i < colors.Length; i++) { var color = ambientColor; for (int j = 0; j < lightDir.Length; j++) { float dot = Vector3.Dot(lightDir[j], normals[polygon.NormalIndices[i]]); color += lightColor[j] * dot; } colors[i] = new Color(Vector3.Clamp(color, Vector3.Zero, Vector3.One)); } } else { var color = ambientColor; for (int j = 0; j < lightDir.Length; j++) { float dot = Vector3.Dot(lightDir[j], polygon.Plane.Normal); color += lightColor[j] * dot; } for (int i = 0; i < colors.Length; i++) colors[i] = new Color(Vector3.Clamp(color, Vector3.Zero, Vector3.One)); } polygon.Colors = colors; } } } }