Example #1
0
    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);
        }
    }
Example #2
0
        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);
        }