/*---------------------------------------------------------------------------* Project: Horizon File: gr_Shadow.h Copyright (C)2010 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 29329 $ *---------------------------------------------------------------------------*/ #ifndef NN_GR_SHADOW_H_ #define NN_GR_SHADOW_H_ #include namespace nn { namespace gr { namespace CTR { /*! @brief シャドウの設定のためのクラスです。 */ class Shadow { public : /*! @brief 各設定の初期値を設定します。 */ Shadow( void ) : isPerspective( true ), zBias( 0.0f ), zScale( 1.0f ), penumbraScale( 0.0f ), penumbraBias( 1.0f ) { } /*! @brief 設定された情報をもとに、シャドウの設定コマンドを生成します。 @param[in] command 描画コマンドの書き込み先の先頭アドレスです。 @param[in] isAddDummyCommand 0x80 へのダミー書き込みコマンドを 3回 生成します。 @param[in] isAddCacheClearCommand レジスタの変更前に、フレームバッファのキャッシュフラッシュをします。 @return 書き込まれた描画コマンドの終端の次のアドレスを返します。 */ bit32* MakeCommand( bit32* command, bool isAddDummyCommand = true, bool isAddCacheClearCommand = true ) { command = MakeTextureCommand( command, isAddDummyCommand ); command = MakeAttenuationCommand( command, isAddCacheClearCommand ); return command; } /*! @brief 設定された情報をもとに、シャドウのテクスチャの設定コマンドを生成します。 @param[in] command 描画コマンドの書き込み先の先頭アドレスです。 @param[in] isAddDummyCommand レジスタの変更前に、0x80 へのダミーコマンドを 3 回生成します。 @return 書き込まれた描画コマンドの終端の次のアドレスを返します。 */ bit32* MakeTextureCommand( bit32* command, bool isAddDummyCommand = true ) { // 0x080 へのダミーコマンド を 3 回送ります if ( isAddDummyCommand ) { *command++ = 0x0; *command++ = PICA_CMD_HEADER_BURST_BE( PICA_REG_TEXTURE_FUNC, 0x3, 0x0 ); *command++ = 0x0; *command++ = 0x0; } // 下位 1 bit をクリアします。 bit32 clearMask = ~( 0xfffffe ); u32 zBiasFix24 = Float32ToUnsignedFix24( zBias ); zBiasFix24 &= clearMask; // 0x8b *command++ = PICA_CMD_DATA_TEXTURE_SHADOW( isPerspective, // f32 -> 24bit 符号なし固定小数点数 の上位 23 bit zBiasFix24, // f32の(指数部-127)を符号無し8ビット整数に変換 FloatToUnsignedByte( zScale ) ); *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE0_SHADOW ); return command; } /*! @brief 設定された情報をもとに、シャドウの減衰の設定コマンドを生成します。 @param[in] command 描画コマンドの書き込み先の先頭アドレスです。 @param[in] isAddCacheClearCommand レジスタの変更前に、フレームバッファのキャッシュフラッシュをします。 @return 書き込まれた描画コマンドの終端の次のアドレスを返します。 */ bit32* MakeAttenuationCommand( bit32* command, bool isAddCacheClearCommand = true ) { // フレームバッファのキャッシュクリアをします。 if ( isAddCacheClearCommand ) { // 0x111 *command++ = 0x1; *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_COLOR_DEPTH_BUFFER_CLEAR1 ); // 0x110 *command++ = 0x1; *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_COLOR_DEPTH_BUFFER_CLEAR0 ); } // 0x130 *command++ = ( Float32ToFloat16( - penumbraScale ) ) << 16 | Float32ToFloat16( penumbraScale + penumbraBias ); *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_FRAGOP_SHADOW ); return command; } /*! @brief シャドウテクスチャへの参照に対するテクスチャ座標生成の透視投影適用の有効/無効にします。 型は bool です。デフォルトは true です。 dmp_Texture[0].isPerspective ユニフォームに相当します。 */ bool isPerspective; NN_PADDING3; /*! @brief 光源座標系のスクリーン空間におけるデプス値導関数の評価値に対するスケールです。 型は f32 です。0.0 より大きな値を設定します。 デフォルトは本来未定義ですが、1.0f に初期化しておきます。 dmp_Texture[0].shadowZBias ユニフォームに相当します。 */ f32 zBias; /*! @breif 光源までの距離から減算されるバイアス値です。 型は f32 です。デフォルトは 0.0f です。 dmp_Texture[0].shadowZScale ユニフォームに相当します。 */ f32 zScale; /*! @brief 半影のハード化計算時に適用されるスケールです。 型は f32 です。デフォルトは 0.0f です。 dmp_FragOperation.penumbraScale ユニフォームに相当します。 */ f32 penumbraScale; /*! @brief 半影のハード化計算時に適用されるバイアスです。 型は f32 です。デフォルトは 1.0f です。 dmp_FragOperation.penumbraBias ユニフォームに相当します。 */ f32 penumbraBias; }; } // namespace CTR } // namespace gr } // namespace nn #endif // NN_GR_SHADOW_H_