public static void Draw <C>(MeshMsg message, Drawing3d drawing, Color color, GameObject origin = null) where C : ICoordinateSpace, new() { Mesh mesh = new Mesh(); mesh.vertices = message.vertices.Select(v => v.From <C>()).ToArray(); mesh.triangles = message.triangles.SelectMany(tri => tri.vertex_indices.Select(i => (int)i)).ToArray(); if (origin != null) { drawing.DrawMesh(mesh, origin.transform, color); } else { drawing.DrawMesh(mesh, Vector3.zero, Quaternion.identity, Vector3.one, color); } }
public void Redraw() { if (m_Mesh == null) { m_Mesh = new Mesh(); m_Mesh.vertices = new[] { Vector3.zero, new Vector3(0, 0, 1), new Vector3(1, 0, 1), new Vector3(1, 0, 0) }; m_Mesh.uv = new[] { Vector2.zero, Vector2.up, Vector2.one, Vector2.right }; m_Mesh.triangles = new[] { 0, 1, 2, 2, 3, 0 }; } if (m_Material == null) { m_Material = (m_Settings.m_Material != null) ? new Material(m_Settings.m_Material) : new Material(Shader.Find("Unlit/OccupancyGrid")); } m_Material.mainTexture = GetTexture(); m_Material.SetColor(k_Color0, m_Settings.m_Unoccupied); m_Material.SetColor(k_Color100, m_Settings.m_Occupied); m_Material.SetColor(k_ColorUnknown, m_Settings.m_Unknown); var origin = m_Message.info.origin.position.From <FLU>(); var rotation = m_Message.info.origin.orientation.From <FLU>(); rotation.eulerAngles += new Vector3(0, -90, 0); // TODO: Account for differing texture origin var scale = m_Message.info.resolution; if (m_Drawing == null) { m_Drawing = Drawing3dManager.CreateDrawing(); } else { m_Drawing.Clear(); } m_Drawing.SetTFTrackingSettings(m_Settings.m_TFTrackingSettings, m_Message.header); // offset the mesh by half a grid square, because the message's position defines the CENTER of grid square 0,0 Vector3 drawOrigin = origin - rotation * new Vector3(scale * 0.5f, 0, scale * 0.5f) + m_Settings.m_Offset; m_Drawing.DrawMesh(m_Mesh, drawOrigin, rotation, new Vector3(m_Message.info.width * scale, 1, m_Message.info.height * scale), m_Material); }