1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: gr_ProcedureTexture.cpp 4 5 Copyright (C)2010 Nintendo Co., Ltd. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Rev: 33699 $ 14 *---------------------------------------------------------------------------*/ 15 16 #include <nn/gr/CTR/gr_ProcedureTexture.h> 17 18 namespace nn 19 { 20 namespace gr 21 { 22 namespace CTR 23 { 24 SetNoiseLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex,const f32 lastDiffValue)25 void ProcedureTexture::SetNoiseLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 26 const u32 lookUpTableIndex, 27 const f32 lastDiffValue ) 28 { 29 f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ]; 30 GetDiffLookUpTable( lookUpTable, diffLookUpTable, lastDiffValue ); 31 32 SetNoiseLookUpTable( lookUpTable, diffLookUpTable, lookUpTableIndex ); 33 } 34 SetNoiseLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)35 void ProcedureTexture::SetNoiseLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 36 const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 37 const u32 lookUpTableIndex ) 38 { 39 SetLookUpDualTables_( m_NoiseLookUpTableCommand, PICA_DATA_PROCTEX_NOISE_REF_TABLE, 40 lookUpTable, diffLookUpTable, lookUpTableIndex ); 41 } 42 SetRgbMapLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex,const f32 lastDiffValue)43 void ProcedureTexture::SetRgbMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 44 const u32 lookUpTableIndex, 45 const f32 lastDiffValue ) 46 { 47 f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ]; 48 GetDiffLookUpTable( lookUpTable, diffLookUpTable, lastDiffValue ); 49 50 SetRgbMapLookUpTable( lookUpTable, diffLookUpTable, lookUpTableIndex ); 51 } 52 SetRgbMapLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)53 void ProcedureTexture::SetRgbMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 54 const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 55 const u32 lookUpTableIndex ) 56 { 57 SetLookUpDualTables_( m_RgbMapLookUpTableCommand, PICA_DATA_PROCTEX_RGB_MAP_REF_TABLE, 58 lookUpTable, diffLookUpTable, lookUpTableIndex ); 59 } 60 SetAlphaMapLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex,const f32 lastDiffValue)61 void ProcedureTexture::SetAlphaMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 62 const u32 lookUpTableIndex, 63 const f32 lastDiffValue ) 64 { 65 f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ]; 66 GetDiffLookUpTable( lookUpTable, diffLookUpTable, lastDiffValue ); 67 68 SetAlphaMapLookUpTable( lookUpTable, diffLookUpTable, lookUpTableIndex ); 69 } 70 SetAlphaMapLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)71 void ProcedureTexture::SetAlphaMapLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 72 const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 73 const u32 lookUpTableIndex ) 74 { 75 SetLookUpDualTables_( m_AlphaMapLookUpTableCommand, PICA_DATA_PROCTEX_ALPHA_MAP_REF_TABLE, 76 lookUpTable, diffLookUpTable, lookUpTableIndex ); 77 } 78 SetRedLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)79 void ProcedureTexture::SetRedLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 80 const u32 lookUpTableIndex ) 81 { 82 SetColorLookUpDualTables_( PROCTEX_RED_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex ); 83 } 84 SetRedLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex,const u32 diffLookUpTableIndex)85 void ProcedureTexture::SetRedLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 86 const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 87 const u32 lookUpTableIndex, const u32 diffLookUpTableIndex ) 88 { 89 SetColorLookUpTable_( PROCTEX_RED_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex ); 90 SetColorDiffLookUpTable_( PROCTEX_RED_COLOR_SHIFT_NUM, diffLookUpTable, diffLookUpTableIndex ); 91 } 92 SetGreenLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)93 void ProcedureTexture::SetGreenLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 94 const u32 lookUpTableIndex ) 95 { 96 SetColorLookUpDualTables_( PROCTEX_GREEN_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex ); 97 } 98 SetGreenLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex,const u32 diffLookUpTableIndex)99 void ProcedureTexture::SetGreenLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 100 const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 101 const u32 lookUpTableIndex, const u32 diffLookUpTableIndex ) 102 { 103 SetColorLookUpTable_( PROCTEX_GREEN_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex ); 104 SetColorDiffLookUpTable_( PROCTEX_GREEN_COLOR_SHIFT_NUM, diffLookUpTable, diffLookUpTableIndex ); 105 } 106 SetBlueLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)107 void ProcedureTexture::SetBlueLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 108 const u32 lookUpTableIndex ) 109 { 110 SetColorLookUpDualTables_( PROCTEX_BLUE_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex ); 111 } 112 SetBlueLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex,const u32 diffLookUpTableIndex)113 void ProcedureTexture::SetBlueLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 114 const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 115 const u32 lookUpTableIndex, const u32 diffLookUpTableIndex ) 116 { 117 SetColorLookUpTable_( PROCTEX_BLUE_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex ); 118 SetColorDiffLookUpTable_( PROCTEX_BLUE_COLOR_SHIFT_NUM, diffLookUpTable, diffLookUpTableIndex ); 119 } 120 SetAlphaLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)121 void ProcedureTexture::SetAlphaLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 122 const u32 lookUpTableIndex ) 123 { 124 SetColorLookUpDualTables_( PROCTEX_ALPHA_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex ); 125 } 126 SetAlphaLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex,const u32 diffLookUpTableIndex)127 void ProcedureTexture::SetAlphaLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 128 const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 129 const u32 lookUpTableIndex, const u32 diffLookUpTableIndex ) 130 { 131 SetColorLookUpTable_( PROCTEX_ALPHA_COLOR_SHIFT_NUM, lookUpTable, lookUpTableIndex ); 132 SetColorDiffLookUpTable_( PROCTEX_ALPHA_COLOR_SHIFT_NUM, diffLookUpTable, diffLookUpTableIndex ); 133 } 134 MakeTableCommand(bit32 * command) const135 bit32* ProcedureTexture::MakeTableCommand( bit32* command ) const 136 { 137 if ( isEnableNoise ) 138 { 139 std::memcpy( command, m_NoiseLookUpTableCommand, sizeof( m_NoiseLookUpTableCommand ) ); 140 command += PROCTEX_LOOKUP_TABLE_CMD_NUM; 141 } 142 143 std::memcpy( command, m_RgbMapLookUpTableCommand, sizeof( m_RgbMapLookUpTableCommand ) ); 144 command += PROCTEX_LOOKUP_TABLE_CMD_NUM; 145 146 if ( alphaSeparate ) 147 { 148 std::memcpy( command, m_AlphaMapLookUpTableCommand, sizeof( m_AlphaMapLookUpTableCommand ) ); 149 command += PROCTEX_LOOKUP_TABLE_CMD_NUM; 150 } 151 152 std::memcpy( command, m_ColorLookUpTableCommand, sizeof( m_ColorLookUpTableCommand ) ); 153 command += PROCTEX_COLOR_LOOKUP_TABLE_CMD_NUM; 154 155 std::memcpy( command, m_ColorDiffLookUpTableCommand, sizeof( m_ColorDiffLookUpTableCommand ) ); 156 command += PROCTEX_COLOR_LOOKUP_TABLE_CMD_NUM; 157 158 return command; 159 } 160 SetLookUpDualTables_(bit32 * command,PicaDataProcTexRefTable procTexLookUpTable,const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)161 void ProcedureTexture::SetLookUpDualTables_( bit32* command, PicaDataProcTexRefTable procTexLookUpTable, 162 const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 163 const f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 164 const u32 lookUpTableIndex ) 165 { 166 *command++ = PICA_CMD_DATA_PROCTEX_LUT( lookUpTableIndex, procTexLookUpTable ); 167 168 // 0xaf 169 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_PROCTEX_LUT ); 170 171 u32 index = 0; 172 // [11: 0] 12ビット固定小数点数(小数部12ビットの符号なし)に変換します 173 // [23:12] 12ビット固定小数点数(小数部12ビットの符号あり)に変換します 174 *command++ = Float32ToUnsignedFix12( lookUpTable[ index ] ) | 175 ( Float32ToFix12Fraction11( diffLookUpTable[ index ] ) << 12 ); 176 177 *command++ = PICA_CMD_HEADER_BURST( PICA_REG_PROCTEX_LUT_DATA0, 0x80 ); 178 179 for ( index = 1; index < 0x80; index++ ) 180 { 181 // [11: 0] 12ビット固定小数点数(小数部12ビットの符号なし)に変換します 182 // [23:12] 12ビット固定小数点数(小数部12ビットの符号あり)に変換します 183 *command++ = Float32ToUnsignedFix12( lookUpTable[ index ] ) | 184 ( Float32ToFix12Fraction11( diffLookUpTable[ index ] ) << 12 ); 185 } 186 187 // Padding 188 *command++ = 0; 189 } 190 SetColorLookUpDualTables_(const u32 colorShiftNum,const f32 lookUpTable[PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)191 void ProcedureTexture::SetColorLookUpDualTables_( const u32 colorShiftNum, 192 const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 193 const u32 lookUpTableIndex ) 194 { 195 // カラー用の参照テーブルを設定します 196 SetColorLookUpTable_( colorShiftNum, lookUpTable, lookUpTableIndex ); 197 198 // カラー用の参照テーブルの差分値を設定します。 199 f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ]; 200 GetColorDiffLookUpTable( lookUpTable, diffLookUpTable ); 201 SetColorDiffLookUpTable_( colorShiftNum, diffLookUpTable, lookUpTableIndex ); 202 } 203 SetColorLookUpTable_(const u32 colorShiftNum,const f32 lookUpTable[PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM],const u32 lookUpTableIndex)204 void ProcedureTexture::SetColorLookUpTable_( const u32 colorShiftNum, 205 const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 206 const u32 lookUpTableIndex ) 207 { 208 bit32* command = m_ColorLookUpTableCommand; 209 210 *command++ = PICA_CMD_DATA_PROCTEX_LUT( lookUpTableIndex, PICA_DATA_PROCTEX_COLOR_REF_TABLE ); 211 // 0xaf 212 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_PROCTEX_LUT ); 213 214 u32 index = 0; 215 bit32 clearMask = ~(0xff << colorShiftNum); 216 for ( u32 burstIndex = 0; burstIndex < 2; burstIndex++ ) 217 { 218 // float32 から unsigned int8 へ変換します 219 *command &= clearMask; 220 *command++ |= ( FloatToUnsignedByte( lookUpTable[ index ] ) << colorShiftNum ); 221 index++; 222 223 // 0xb0 224 *command++ = PICA_CMD_HEADER_BURST( PICA_REG_PROCTEX_LUT_DATA0, 0x80 ); 225 226 for ( u32 burstDataIndex = 0; burstDataIndex < 0x7F; burstDataIndex++ ) 227 { 228 // float32 から unsigned int8 へ変換します 229 *command &= clearMask; 230 *command++ |= ( FloatToUnsignedByte( lookUpTable[ index ] ) << colorShiftNum ); 231 index++; 232 } 233 234 // Padding 235 *command++ = 0; 236 } 237 } 238 SetColorDiffLookUpTable_(const u32 colorShiftNum,const f32 diffLookUpTable[PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM],const u32 diffLookUpTableIndex)239 void ProcedureTexture::SetColorDiffLookUpTable_( const u32 colorShiftNum, 240 const f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 241 const u32 diffLookUpTableIndex ) 242 { 243 bit32* command = m_ColorDiffLookUpTableCommand; 244 245 *command++ = PICA_CMD_DATA_PROCTEX_LUT( diffLookUpTableIndex, PICA_DATA_PROCTEX_COLOR_DIFF_REF_TABLE ); 246 // 0xaf 247 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_PROCTEX_LUT ); 248 249 u32 index = 0; 250 bit32 clearMask = ~(0xff << colorShiftNum); 251 for ( u32 burstIndex = 0; burstIndex < 2; burstIndex++ ) 252 { 253 // float32 から signed fixed8(7bits fraction) へ変換します 254 *command &= clearMask; 255 *command++ |= ( ( Float32ToFix8Fraction7( diffLookUpTable[ index ] )) << colorShiftNum ); 256 index++; 257 258 // 0xb0 259 *command++ = PICA_CMD_HEADER_BURST( PICA_REG_PROCTEX_LUT_DATA0, 0x80 ); 260 261 for ( u32 burstDataIndex = 0; burstDataIndex < 0x7F; burstDataIndex++ ) 262 { 263 // float32 から signed fixed8(7bits fraction) へ変換します 264 *command &= clearMask; 265 *command++ |= ( Float32ToFix8Fraction7( diffLookUpTable[ index ] ) << colorShiftNum ); 266 267 index++; 268 } 269 270 // Padding 271 *command++ = 0; 272 } 273 } 274 GetColorDiffLookUpTable(const f32 lookUpTable[PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM],f32 diffLookUpTable[PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM])275 void ProcedureTexture::GetColorDiffLookUpTable( const f32 lookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ], 276 f32 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM ] ) 277 { 278 for (u32 index = 0; index < ( PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM - 1); index++) 279 { 280 diffLookUpTable[ index ] = lookUpTable[ index + 1 ] - lookUpTable[ index ]; 281 } 282 283 // プロシージャルテクスチャのカラー参照テーブルの最後の差分値は使用されないので、0.0f にしておきます。 284 diffLookUpTable[ PROCTEX_COLOR_LOOKUP_TABLE_ELEMENT_NUM - 1 ] = 0.0f; 285 } 286 GetDiffLookUpTable(const f32 lookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],f32 diffLookUpTable[PROCTEX_LOOKUP_TABLE_ELEMENT_NUM],const f32 lastDiffValue)287 void ProcedureTexture::GetDiffLookUpTable( const f32 lookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 288 f32 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM ], 289 const f32 lastDiffValue ) 290 { 291 for (u32 index = 0; index < ( PROCTEX_LOOKUP_TABLE_ELEMENT_NUM - 1); index++) 292 { 293 diffLookUpTable[ index ] = lookUpTable[ index + 1 ] - lookUpTable[ index ]; 294 } 295 296 diffLookUpTable[ PROCTEX_LOOKUP_TABLE_ELEMENT_NUM - 1 ] = lastDiffValue; 297 } 298 299 300 } // namespace CTR 301 } // namespace gr 302 } // namespace nn 303