public void EncodeToTexture( GridValueProvider gridValueProvider, Texture2D texture, int channelOffset, int currentHeight, int currentWidth ) { var i = 0; // There's an implicit flip converting to PNG from texture, so make sure we // counteract that when forming the texture by iterating through h in reverse. for (var h = m_MaxHeight - 1; h >= 0; h--) { for (var w = 0; w < m_MaxWidth; w++) { var colorVal = Color.black; if (h < currentHeight && w < currentWidth) { int oneHotValue = gridValueProvider(h, w); if (oneHotValue >= channelOffset && oneHotValue < channelOffset + 3) { colorVal = s_OneHotColors[oneHotValue - channelOffset]; } } m_Colors[i++] = colorVal; } } texture.SetPixels(m_Colors); }
/// <summary> /// Create a sensor for the GridValueProvider with the specified observation type. /// </summary> /// <remarks> /// Use Match3Sensor.CellTypeSensor() or Match3Sensor.SpecialTypeSensor() instead of calling /// the constructor directly. /// </remarks> /// <param name="board">The abstract board. This is only used to get the size.</param> /// <param name="gvp">The GridValueProvider, should be either board.GetCellType or board.GetSpecialType.</param> /// <param name="oneHotSize">The number of possible values that the GridValueProvider can return.</param> /// <param name="obsType">Whether to produce vector or visual observations</param> /// <param name="name">Name of the sensor.</param> public Match3Sensor(AbstractBoard board, GridValueProvider gvp, int oneHotSize, Match3ObservationType obsType, string name) { m_Name = name; m_Rows = board.Rows; m_Columns = board.Columns; m_GridValues = gvp; m_OneHotSize = oneHotSize; m_ObservationType = obsType; m_ObservationSpec = obsType == Match3ObservationType.Vector ? ObservationSpec.Vector(m_Rows * m_Columns * oneHotSize) : ObservationSpec.Visual(m_Rows, m_Columns, oneHotSize); }
/// <summary> /// Create a sensor for the GridValueProvider with the specified observation type. /// </summary> /// <remarks> /// Use Match3Sensor.CellTypeSensor() or Match3Sensor.SpecialTypeSensor() instead of calling /// the constructor directly. /// </remarks> /// <param name="board">The abstract board.</param> /// <param name="gvp">The GridValueProvider, should be either board.GetCellType or board.GetSpecialType.</param> /// <param name="oneHotSize">The number of possible values that the GridValueProvider can return.</param> /// <param name="obsType">Whether to produce vector or visual observations</param> /// <param name="name">Name of the sensor.</param> public Match3Sensor(AbstractBoard board, GridValueProvider gvp, int oneHotSize, Match3ObservationType obsType, string name) { var maxBoardSize = board.GetMaxBoardSize(); m_Name = name; m_MaxBoardSize = maxBoardSize; m_GridValues = gvp; m_OneHotSize = oneHotSize; m_Board = board; m_ObservationType = obsType; m_ObservationSpec = obsType == Match3ObservationType.Vector ? ObservationSpec.Vector(maxBoardSize.Rows * maxBoardSize.Columns * oneHotSize) : ObservationSpec.Visual(maxBoardSize.Rows, maxBoardSize.Columns, oneHotSize); }