using UnityEngine;
using UnityEngine.Serialization;
namespace MLAgents.Sensors
{
///
/// Component that wraps a .
///
[AddComponentMenu("ML Agents/Render Texture Sensor", (int)MenuGroup.Sensors)]
public class RenderTextureSensorComponent : SensorComponent
{
RenderTextureSensor m_Sensor;
///
/// The instance that the associated
/// wraps.
///
[HideInInspector, SerializeField, FormerlySerializedAs("renderTexture")]
RenderTexture m_RenderTexture;
///
/// Stores the associated with this sensor.
///
public RenderTexture RenderTexture
{
get { return m_RenderTexture; }
set { m_RenderTexture = value; }
}
[HideInInspector, SerializeField, FormerlySerializedAs("sensorName")]
string m_SensorName = "RenderTextureSensor";
///
/// Name of the generated .
/// Note that changing this at runtime does not affect how the Agent sorts the sensors.
///
public string SensorName
{
get { return m_SensorName; }
set { m_SensorName = value; }
}
[HideInInspector, SerializeField, FormerlySerializedAs("grayscale")]
bool m_Grayscale;
///
/// Whether the RenderTexture observation should be converted to grayscale or not.
/// Note that changing this after the sensor is created has no effect.
///
public bool Grayscale
{
get { return m_Grayscale; }
set { m_Grayscale = value; }
}
[HideInInspector, SerializeField, FormerlySerializedAs("compression")]
SensorCompressionType m_Compression = SensorCompressionType.PNG;
///
/// Compression type for the render texture observation.
///
public SensorCompressionType CompressionType
{
get { return m_Compression; }
set { m_Compression = value; UpdateSensor(); }
}
///
public override ISensor CreateSensor()
{
m_Sensor = new RenderTextureSensor(RenderTexture, Grayscale, SensorName, m_Compression);
return m_Sensor;
}
///
public override int[] GetObservationShape()
{
var width = RenderTexture != null ? RenderTexture.width : 0;
var height = RenderTexture != null ? RenderTexture.height : 0;
return new[] { height, width, Grayscale ? 1 : 3 };
}
///
/// Update fields that are safe to change on the Sensor at runtime.
///
internal void UpdateSensor()
{
if (m_Sensor != null)
{
m_Sensor.CompressionType = m_Compression;
}
}
}
}