/*---------------------------------------------------------------------------* Project: NintendoWare File: lyt_DrawerGraphics.cpp Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. 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. $Revision: 27654 $ *---------------------------------------------------------------------------*/ #include "precompiled.h" #include #include #include #include #include #include #include #include #ifdef NW_LYT_DRAWER_ENABLE #define TEX_ENV_COLOR_OFFS 3 extern unsigned* __cb_current_command_buffer; namespace nw { namespace lyt { void Drawer::SetUpTexEnv( const Material* __restrict pMaterial ) { #if ! defined(NW_RELEASE) m_PreviousTexEnvType = m_CurrentTexEnvType; #endif if ( pMaterial->GetTextureOnly() ) { switch ( m_CurrentTexEnvType ) { case TEX_ENV_TYPE_0_TEX: case TEX_ENV_TYPE_1_TEX: break; default: FlushBuffer(); break; } return; } #ifdef NW_LYT_DRAWER_ENABLE_ALPHA_TEST // アルファテストの設定 if ( pMaterial->IsAlphaCompareCap() ) { FlushBuffer(); m_AlphaTestEnable = true; SetUpAlphaTest( pMaterial ); } else if ( m_AlphaTestEnable ) { // デフォルト(アルファテストなし)に戻す設定 FlushBuffer(); m_AlphaTestEnable = false; // 0x104 NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_REG_FRAGOP_ALPHA_TEST, PICA_CMD_DATA_FRAGOP_ALPHA_TEST_DISABLE() ); } #endif #ifdef NW_LYT_DRAWER_ENABLE_BLEND_FUNC // ブレンドモードの設定 if ( pMaterial->IsBlendModeCap() ) { FlushBuffer(); m_IsBlendDefault = false; // ブレンドの設定 SetUpBlendMode( pMaterial ); } else if ( m_IsBlendDefault == false ) { // デフォルト(アルファブレンド)に戻す設定 FlushBuffer(); m_IsBlendDefault = true; const u32 command[] = { NW_FONT_COMMAND_SET_BLEND_DEFAULT }; NW_FONT_RECTDRAWER_ADD_COMMAND( command, sizeof( command ) ); } #endif #ifdef NW_LYT_DRAWER_ENABLE_USER_TEX_ENV //---------------------------------------------------------- // ユーザー定義のテクスチャコンバイナの設定 if ( pMaterial->GetTevStageNum() > 0 ) { FlushBuffer(); SetUpGLTexEnvUser( pMaterial ); m_CurrentTexEnvType = TEX_ENV_TYPE_USER; return; } #endif //---------------------------------------------------------- // プリセットのテクスチャコンバイナの設定 switch ( pMaterial->GetTexMapNum() ) { case 0: { nw::ut::Color8 white = pMaterial->GetColor( INTERPOLATECOLOR_WHITE ); static u32 command[] NW_LYT_DRAWER_ALIGN_32 = { PICA_CMD_DATA_TEX_ENV_SRC( PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT ), PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEX_ENV5, 5 ), PICA_CMD_DATA_TEX_ENV_OPERAND( PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA ), PICA_CMD_DATA_TEX_ENV_COMBINE( PICA_DATA_TEX_ENV_COMBINE_MODULATE, PICA_DATA_TEX_ENV_COMBINE_MODULATE ), PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_WHITE, PICA_CMD_DATA_TEX_ENV_SCALE( PICA_DATA_TEX_ENV_SCALE_1, PICA_DATA_TEX_ENV_SCALE_1 ), }; if ( m_CurrentTexEnvType != TEX_ENV_TYPE_0_TEX ) { FlushBuffer(); *reinterpret_cast< nw::ut::Color8* >( &command[ 4 ] ) = white; NW_FONT_RECTDRAWER_ADD_COMMAND( command, sizeof( command ) ); m_CurrentTexEnvType = TEX_ENV_TYPE_0_TEX; } else if ( *reinterpret_cast< nw::ut::Color8* >( &command[ 4 ] ) != white ) { FlushBuffer(); *reinterpret_cast< nw::ut::Color8* >( &command[ 4 ] ) = white; NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV5 + TEX_ENV_COLOR_OFFS), command[ 4 ] ); } return; } case 1 : { nw::ut::Color8 white = pMaterial->GetColor( INTERPOLATECOLOR_WHITE ); nw::ut::Color8 black = pMaterial->GetColor( INTERPOLATECOLOR_BLACK ); static u32 command[] NW_LYT_DRAWER_ALIGN_32 = { PICA_CMD_DATA_TEX_ENV_SRC( PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT ), PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEX_ENV3, 5 ), PICA_CMD_DATA_TEX_ENV_OPERAND( PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_ONE_MINUS_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_ONE_MINUS_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA ), PICA_CMD_DATA_TEX_ENV_COMBINE( PICA_DATA_TEX_ENV_COMBINE_MODULATE, PICA_DATA_TEX_ENV_COMBINE_MODULATE ), PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_BLACK, PICA_CMD_DATA_TEX_ENV_SCALE( PICA_DATA_TEX_ENV_SCALE_1, PICA_DATA_TEX_ENV_SCALE_1 ), PICA_CMD_DATA_TEX_ENV_SRC( PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS ), PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEX_ENV4, 5 ), PICA_CMD_DATA_TEX_ENV_OPERAND( PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA ), PICA_CMD_DATA_TEX_ENV_COMBINE( PICA_DATA_TEX_ENV_COMBINE_MULT_ADD_DMP, PICA_DATA_TEX_ENV_COMBINE_MULT_ADD_DMP ), PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_WHITE, PICA_CMD_DATA_TEX_ENV_SCALE( PICA_DATA_TEX_ENV_SCALE_1, PICA_DATA_TEX_ENV_SCALE_1 ), PICA_CMD_DATA_TEX_ENV_SRC( PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS ), PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEX_ENV5, 5 ), PICA_CMD_DATA_TEX_ENV_OPERAND( PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA ), PICA_CMD_DATA_TEX_ENV_COMBINE( PICA_DATA_TEX_ENV_COMBINE_MODULATE, PICA_DATA_TEX_ENV_COMBINE_MODULATE ), PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_BLACK, PICA_CMD_DATA_TEX_ENV_SCALE( PICA_DATA_TEX_ENV_SCALE_1, PICA_DATA_TEX_ENV_SCALE_1 ), }; if ( m_CurrentTexEnvType != TEX_ENV_TYPE_1_TEX ) { FlushBuffer(); *reinterpret_cast< nw::ut::Color8* >( &command[ 4 ] ) = black; *reinterpret_cast< nw::ut::Color8* >( &command[ 10 ] ) = white; NW_FONT_RECTDRAWER_ADD_COMMAND( command, sizeof( command ) ); m_CurrentTexEnvType = TEX_ENV_TYPE_1_TEX; } else if ( *reinterpret_cast< nw::ut::Color8* >( &command[ 4 ] ) != black || *reinterpret_cast< nw::ut::Color8* >( &command[ 10 ] ) != white ) { FlushBuffer(); *reinterpret_cast< nw::ut::Color8* >( &command[ 4 ] ) = black; *reinterpret_cast< nw::ut::Color8* >( &command[ 10 ] ) = white; NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV3 + TEX_ENV_COLOR_OFFS ), command[ 4 ] ); NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV4 + TEX_ENV_COLOR_OFFS ), command[ 10 ] ); } return; } case 2 : { FlushBuffer(); SetUpTexEnvType2( pMaterial ); m_CurrentTexEnvType = TEX_ENV_TYPE_2_TEX; return; } case 3 : { FlushBuffer(); SetUpTexEnvType3( pMaterial ); m_CurrentTexEnvType = TEX_ENV_TYPE_3_TEX; return; } } } void Drawer::SetUpTexEnvType2( const Material* __restrict pMaterial ) { static u32 command[] NW_LYT_DRAWER_ALIGN_32 = { // Texture0 と Texture1 をブレンド PICA_CMD_DATA_TEX_ENV_SRC( PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0, PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE1, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0, PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE1, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT ), PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEX_ENV3, 5 ), PICA_CMD_DATA_TEX_ENV_OPERAND( PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA ), PICA_CMD_DATA_TEX_ENV_COMBINE( PICA_DATA_TEX_ENV_COMBINE_INTERPOLATE, PICA_DATA_TEX_ENV_COMBINE_INTERPOLATE ), // cmdPosBlend PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_BLACK, PICA_CMD_DATA_TEX_ENV_SCALE( PICA_DATA_TEX_ENV_SCALE_1, PICA_DATA_TEX_ENV_SCALE_1 ), // 白黒カラーをテクスチャでカラー補間 PICA_CMD_DATA_TEX_ENV_SRC( PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS_BUFFER_DMP, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS_BUFFER_DMP, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS ), PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEX_ENV4, 5 ), PICA_CMD_DATA_TEX_ENV_OPERAND( PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA ), PICA_CMD_DATA_TEX_ENV_COMBINE( PICA_DATA_TEX_ENV_COMBINE_INTERPOLATE, PICA_DATA_TEX_ENV_COMBINE_INTERPOLATE ), // cmdPosWhite PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_WHITE, PICA_CMD_DATA_TEX_ENV_SCALE( PICA_DATA_TEX_ENV_SCALE_1, PICA_DATA_TEX_ENV_SCALE_1 ), // cmdPosBlack PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_BLACK, PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV_BUFFER_COLOR ), // 0x0fd // 頂点カラーと掛け算 PICA_CMD_DATA_TEX_ENV_SRC( PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS ), PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEX_ENV5, 5 ), PICA_CMD_DATA_TEX_ENV_OPERAND( PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA ), PICA_CMD_DATA_TEX_ENV_COMBINE( PICA_DATA_TEX_ENV_COMBINE_MODULATE, PICA_DATA_TEX_ENV_COMBINE_MODULATE ), PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_BLACK, PICA_CMD_DATA_TEX_ENV_SCALE( PICA_DATA_TEX_ENV_SCALE_1, PICA_DATA_TEX_ENV_SCALE_1 ), NW_LYT_CMD_DATA_TEX_ENV_BUF_INPUT_THROUGH, PICA_CMD_HEADER_SINGLE_BE( PICA_REG_TEX_ENV_BUFFER_INPUT, 0x2 ) // 0x0e0 }; nw::ut::Color8 blend = pMaterial->GetColor( TEVKONSTSEL_K5 ); nw::ut::Color8 white = pMaterial->GetColor( INTERPOLATECOLOR_WHITE ); nw::ut::Color8 black = pMaterial->GetColor( INTERPOLATECOLOR_BLACK ); const int cmdPosBlend = 4; const int cmdPosWhite = 10; const int cmdPosBlack = 12; if ( m_CurrentTexEnvType != TEX_ENV_TYPE_2_TEX ) { *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlend ] ) = blend; *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosWhite ] ) = white; *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlack ] ) = black; NW_FONT_RECTDRAWER_ADD_COMMAND( command, sizeof( command ) ); } else if ( *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlend ] ) != blend || *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosWhite ] ) != white || *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlack ] ) != black ) { *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlend ] ) = blend; *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosWhite ] ) = white; *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlack ] ) = black; NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV3 + TEX_ENV_COLOR_OFFS ), command[ cmdPosBlend ] ); NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV4 + TEX_ENV_COLOR_OFFS ), command[ cmdPosWhite ] ); // 0x0fd NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV_BUFFER_COLOR ), command[ cmdPosBlack ] ); } } void Drawer::SetUpTexEnvType3( const Material* __restrict pMaterial ) { static u32 command[] NW_LYT_DRAWER_ALIGN_32 = { // Texture0 にブレンド率を乗算 PICA_CMD_DATA_TEX_ENV_SRC( PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT ), PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEX_ENV1, 5 ), PICA_CMD_DATA_TEX_ENV_OPERAND( PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_ALPHA, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA ), PICA_CMD_DATA_TEX_ENV_COMBINE( PICA_DATA_TEX_ENV_COMBINE_MODULATE, PICA_DATA_TEX_ENV_COMBINE_MODULATE ), // cmdPosBlend0 PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_BLACK, PICA_CMD_DATA_TEX_ENV_SCALE( PICA_DATA_TEX_ENV_SCALE_1, PICA_DATA_TEX_ENV_SCALE_1 ), // Texture1 にブレンド率を乗算 PICA_CMD_DATA_TEX_ENV_SRC( PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE1, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE1, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS ), PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEX_ENV2, 5 ), PICA_CMD_DATA_TEX_ENV_OPERAND( PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_B_DMP, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_B_DMP, PICA_DATA_OPE_ALPHA_SRC_ALPHA ), PICA_CMD_DATA_TEX_ENV_COMBINE( PICA_DATA_TEX_ENV_COMBINE_MULT_ADD_DMP, PICA_DATA_TEX_ENV_COMBINE_MULT_ADD_DMP ), // cmdPosBlend1 PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_BLACK, PICA_CMD_DATA_TEX_ENV_SCALE( PICA_DATA_TEX_ENV_SCALE_1, PICA_DATA_TEX_ENV_SCALE_1 ), // Texture2 にブレンド率を乗算 PICA_CMD_DATA_TEX_ENV_SRC( PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE2, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE2, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS ), PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEX_ENV3, 5 ), PICA_CMD_DATA_TEX_ENV_OPERAND( PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_G_DMP, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_G_DMP, PICA_DATA_OPE_ALPHA_SRC_ALPHA ), PICA_CMD_DATA_TEX_ENV_COMBINE( PICA_DATA_TEX_ENV_COMBINE_MULT_ADD_DMP, PICA_DATA_TEX_ENV_COMBINE_MULT_ADD_DMP ), // cmdPosBlend2 PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_BLACK, PICA_CMD_DATA_TEX_ENV_SCALE( PICA_DATA_TEX_ENV_SCALE_1, PICA_DATA_TEX_ENV_SCALE_1 ), // 白黒カラーをテクスチャでカラー補間 PICA_CMD_DATA_TEX_ENV_SRC( PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS_BUFFER_DMP, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS_BUFFER_DMP, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS ), PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEX_ENV4, 5 ), PICA_CMD_DATA_TEX_ENV_OPERAND( PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA ), PICA_CMD_DATA_TEX_ENV_COMBINE( PICA_DATA_TEX_ENV_COMBINE_INTERPOLATE, PICA_DATA_TEX_ENV_COMBINE_INTERPOLATE ), // cmdPosWhite PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_WHITE, PICA_CMD_DATA_TEX_ENV_SCALE( PICA_DATA_TEX_ENV_SCALE_1, PICA_DATA_TEX_ENV_SCALE_1 ), // cmdPosBlack PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_BLACK, PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV_BUFFER_COLOR ), // 0x0fd // 頂点カラーと掛け算 PICA_CMD_DATA_TEX_ENV_SRC( PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS ), PICA_CMD_HEADER_BURSTSEQ( PICA_REG_TEX_ENV5, 5 ), PICA_CMD_DATA_TEX_ENV_OPERAND( PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA ), PICA_CMD_DATA_TEX_ENV_COMBINE( PICA_DATA_TEX_ENV_COMBINE_MODULATE, PICA_DATA_TEX_ENV_COMBINE_MODULATE ), PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_BLACK, PICA_CMD_DATA_TEX_ENV_SCALE( PICA_DATA_TEX_ENV_SCALE_1, PICA_DATA_TEX_ENV_SCALE_1 ), NW_LYT_CMD_DATA_TEX_ENV_BUF_INPUT_THROUGH, PICA_CMD_HEADER_SINGLE_BE( PICA_REG_TEX_ENV_BUFFER_INPUT, 0x2 ) // 0x0e0 }; nw::ut::Color8 blend = pMaterial->GetColor( TEVKONSTSEL_K5 ); nw::ut::Color8 white = pMaterial->GetColor( INTERPOLATECOLOR_WHITE ); nw::ut::Color8 black = pMaterial->GetColor( INTERPOLATECOLOR_BLACK ); const int cmdPosBlend0 = 4; const int cmdPosBlend1 = 10; const int cmdPosBlend2 = 16; const int cmdPosWhite = 22; const int cmdPosBlack = 24; if ( m_CurrentTexEnvType != TEX_ENV_TYPE_3_TEX ) { *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlend0 ] ) = blend; *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlend1 ] ) = blend; *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlend2 ] ) = blend; *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosWhite ] ) = white; *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlack ] ) = black; NW_FONT_RECTDRAWER_ADD_COMMAND( command, sizeof( command ) ); } else if ( *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlend0 ] ) != blend || *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosWhite ] ) != white || *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlack ] ) != black ) { *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlend0 ] ) = blend; *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlend1 ] ) = blend; *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlend2 ] ) = blend; *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosWhite ] ) = white; *reinterpret_cast< nw::ut::Color8* >( &command[ cmdPosBlack ] ) = black; NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV1 + TEX_ENV_COLOR_OFFS ), command[ cmdPosBlend0 ] ); NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV2 + TEX_ENV_COLOR_OFFS ), command[ cmdPosBlend1 ] ); NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV3 + TEX_ENV_COLOR_OFFS ), command[ cmdPosBlend2 ] ); NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV4 + TEX_ENV_COLOR_OFFS ), command[ cmdPosWhite ] ); // 0x0fd NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV_BUFFER_COLOR ), command[ cmdPosBlack ] ); } } void Drawer::SetUpTextures( const Material* __restrict pMaterial, bool addDisableCommand ) { static u32 command[] NW_LYT_DRAWER_ALIGN_32 = { // 0x082 PICA_CMD_DATA_ZERO(), PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE0_SIZE ), // 0x085 PICA_CMD_DATA_ZERO(), PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE0_ADDR1 ), // 0x08e PICA_CMD_DATA_ZERO(), PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE0_FORMAT ), // 0x083 PICA_CMD_DATA_ZERO(), PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE0_WRAP_FILTER ), // 0x092 PICA_CMD_DATA_ZERO(), PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE1_SIZE ), // 0x095 PICA_CMD_DATA_ZERO(), PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE1_ADDR ), // 0x096 PICA_CMD_DATA_ZERO(), PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE1_FORMAT ), // 0x093 PICA_CMD_DATA_ZERO(), PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE1_WRAP_FILTER ), // 0x09a PICA_CMD_DATA_ZERO(), PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE2_SIZE ), // 0x09d PICA_CMD_DATA_ZERO(), PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE2_ADDR ), // 0x09e PICA_CMD_DATA_ZERO(), PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE2_FORMAT ), // 0x09b PICA_CMD_DATA_ZERO(), PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE2_WRAP_FILTER ), }; enum { idxWidthHeight = 0, idxTextureAddr = 2, idxFormat = 4, idxWrapFilter = 6, settingSize = 8, commandSize = sizeof( u32 ) * settingSize }; if ( pMaterial == NULL ) { command[ idxTextureAddr ] = PICA_CMD_DATA_ZERO(); #if defined(NW_FONT_RECTDRAWER_USE_DRAW_BUFFER) NW_ASSERT(m_UniformAddrIndex == 0); #endif if (addDisableCommand) { DisableTextures(); } return; } bool isTexCoordModified = true; #if defined(NW_FONT_RECTDRAWER_USE_DRAW_BUFFER) if (m_UniformAddrIndex > 0) // フラッシュされていない { NW_ASSERT( m_PreviousTexEnvType == m_CurrentTexEnvType && (m_CurrentTexEnvType == TEX_ENV_TYPE_0_TEX || m_CurrentTexEnvType == TEX_ENV_TYPE_1_TEX)); isTexCoordModified = false; } #endif const u32 num = ut::Min( (u32)pMaterial->GetTexMapNum(), (u32)TexMapMax ); bool isTexturesModified = false; int texbit = 0; for ( int i = 0; i < num; ++i ) { texbit |= 1 << i; const TexMap& __restrict texMap = pMaterial->GetTexMap( i ); u32* __restrict c = &command[ i * settingSize ]; if ( c[ idxTextureAddr ] != texMap.GetPhysicalAddress() / 8 || c[ idxWrapFilter ] != texMap.GetU32WrapFilter() ) { c[ idxWidthHeight ] = texMap.GetU32WidthHeight(); c[ idxTextureAddr ] = texMap.GetPhysicalAddress() / 8; c[ idxFormat ] = texMap.GetU32Format(); c[ idxWrapFilter ] = texMap.GetU32WrapFilter(); isTexturesModified = true; } } if (isTexCoordModified || isTexturesModified) { // バッファを書き出しておく FlushBuffer(); } // 0x080 const u32 texFuncData = PICA_CMD_DATA_TEXTURE_FUNC( PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_FALSE /* texture0SamplerType: texbit */, 0 /* texture1SamplerType: texbit */, 0 /* texture2SamplerType: texbit */, 0 /* texture3Texcoord */, 0 /* texture3SamplerType */, 0 /* texture2Texcoord */, 1 /* clearTextureCache */) | texbit; if (isTexCoordModified) { // テクスチャ座標有効化 // 0x06f NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE_BE( PICA_REG_VS_OUT_ATTR_CLK, 0x2 ), PICA_CMD_DATA_VS_GS_OUT_ATTR_CLK( 0 /* verZ */, 0 /* col */, 0 /* tex0 : texbit */, 0 /* tex1 : texbit */, 0 /* tex2 : texbit */, 0 /* tex0_w */, 0 /* view_quat */ ) | texbit << 8 ); // サンプラータイプ、座標選択 NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE_BE( PICA_REG_TEXTURE_FUNC, 0xB ), texFuncData ); } if (isTexCoordModified || isTexturesModified) { // テクスチャキャッシュをクリア NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE_BE( PICA_REG_TEXTURE_FUNC, 0x4 ), texFuncData ); } if (isTexturesModified) { // コマンドリストに積む NW_FONT_RECTDRAWER_ADD_COMMAND( command, commandSize * num ); } } void Drawer::UniformAndDraw() { NW_LYT_DRAWER_ASSERT(m_UniformAddrIndex > 0); { // uUniformAddr へのUniform const u32 size = SetUniformCommand(m_UniformAddrBuffer, m_UniformAddrIndex); NW_FONT_RECTDRAWER_ADD_COMMAND(m_UniformAddrBuffer, size); } if ( m_UniformMtxIndex > 0 ) { // uUniformMtx へのUniform Base::AddUniformMtx(); } if ( m_UniformDataIndex > 0 ) { // uUniformData へのUniform const u32 size = SetUniformCommand(m_UniformDataBuffer, m_UniformDataIndex); NW_FONT_RECTDRAWER_ADD_COMMAND(m_UniformDataBuffer, size); m_UniformDataIndex = 0; } const int vtxNum = DRAW_VTX_NUM * m_UniformAddrIndex; // 描画頂点数 #if defined(NW_FONT_RECTDRAWER_USE_DRAW_ARRAYS) const u32 vtxIdxAddrOffset = GetVertexIndexAddressOffset(vtxNum); #else const u32 vtxIdxAddrOffset = 0; // dummy #endif // 頂点シェーダーへ、テクスチャ座標の数の設定 // 0x2b1 NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE( PICA_REG_VS_INT0 ), PICA_CMD_DATA_VS_INT( m_TexCoordNum /* x */ , 0 /* y */, 0 /* z */ )); font::internal::SetVertexNumCmd(&__cb_current_command_buffer, vtxIdxAddrOffset, vtxNum); // コマンドリストに積む NW_FONT_RECTDRAWER_ADD_COMMAND( GetDrawCommands(), GetDrawCommandSize() ); // インデックスの初期化 m_UniformAddrIndex = 0; } void Drawer::SetUpTextBox( const TextBox* __restrict pTextBox, const Material* __restrict pMaterial, const DrawInfo& drawInfo ) { font::DispStringBuffer* __restrict pStringBuffer = pTextBox->GetDispStringBuffer(); // 文字がなければ終了 if (pStringBuffer->IsCommandEmpty()) { return; } // テキスト描画を設定 m_CurrentTexEnvType = TEX_ENV_TYPE_TEXT; // ブレンドはデフォルト m_IsBlendDefault = true; // アルファテストなし m_AlphaTestEnable = false; // 行列情報の設定 pTextBox->GetTextGlobalMtx( (nw::math::MTX34*)m_UniformMtx ); m_UniformMtxIndex = 3; Base::AddUniformMtx(); // uUniformMtx へのUniform font::WideTextWriter& writer = drawInfo.GetGraphicsResource()->GetTextWriter(); writer.SetDispStringBuffer(pStringBuffer); // テキストカラー ut::Color8 topCol = pTextBox->GetTextColor(TEXTCOLOR_TOP); ut::Color8 btmCol = pTextBox->GetTextColor(TEXTCOLOR_BOTTOM); writer.SetGradationMode( topCol != btmCol ? font::CharWriter::GRADMODE_V: font::CharWriter::GRADMODE_NONE); writer.SetTextColor(topCol, btmCol); // 2色補間+アルファ writer.SetColorMapping( pMaterial->GetColor( INTERPOLATECOLOR_BLACK ), pMaterial->GetColor( INTERPOLATECOLOR_WHITE )); writer.SetAlpha(pTextBox->GetGlobalAlpha()); // キャッシュからコマンドを追加 writer.UseCommandBuffer(); writer.SetDispStringBuffer(NULL); // テクスチャの初期化 SetUpTextures( NULL ); } #ifdef NW_LYT_DRAWER_ENABLE_USER_TEX_ENV void Drawer::SetUpGLTexEnvUser( const Material* __restrict pMaterial ) { // TODO: マテリアルクラスのメンバの時点でコマンド形式で保持するようにする // TODO: ステージ0を使用する必要があるかの判断を事前に行っておく const int tevSrc[] = { PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE0, PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE1, PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE2, PICA_DATA_TEX_ENV_SRC_RGBA_TEXTURE3, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_PRIMARY_COLOR, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS_BUFFER_DMP, }; const int tevMode[] = { PICA_DATA_TEX_ENV_COMBINE_REPLACE, PICA_DATA_TEX_ENV_COMBINE_MODULATE, PICA_DATA_TEX_ENV_COMBINE_ADD, PICA_DATA_TEX_ENV_COMBINE_ADD_SIGNED, PICA_DATA_TEX_ENV_COMBINE_INTERPOLATE, PICA_DATA_TEX_ENV_COMBINE_SUBTRACT, PICA_DATA_TEX_ENV_COMBINE_ADD_MULT_DMP, PICA_DATA_TEX_ENV_COMBINE_MULT_ADD_DMP, }; const int tevOpRgb[] = { PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_ONE_MINUS_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_ALPHA, PICA_DATA_OPE_RGB_ONE_MINUS_SRC_ALPHA, PICA_DATA_OPE_RGB_SRC_R_DMP, PICA_DATA_OPE_RGB_ONE_MINUS_SRC_R_DMP, PICA_DATA_OPE_RGB_SRC_G_DMP, PICA_DATA_OPE_RGB_ONE_MINUS_SRC_G_DMP, PICA_DATA_OPE_RGB_SRC_B_DMP, PICA_DATA_OPE_RGB_ONE_MINUS_SRC_B_DMP, }; const int tevOpAlp[] = { PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_ONE_MINUS_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_R_DMP, PICA_DATA_OPE_ALPHA_ONE_MINUS_SRC_R_DMP, PICA_DATA_OPE_ALPHA_SRC_G_DMP, PICA_DATA_OPE_ALPHA_ONE_MINUS_SRC_G_DMP, PICA_DATA_OPE_ALPHA_SRC_B_DMP, PICA_DATA_OPE_ALPHA_ONE_MINUS_SRC_B_DMP, }; const u32 scale[] = { PICA_DATA_TEX_ENV_SCALE_1, PICA_DATA_TEX_ENV_SCALE_2, PICA_DATA_TEX_ENV_SCALE_4, }; const u32 reg[] = { PICA_REG_TEX_ENV0, PICA_REG_TEX_ENV1, PICA_REG_TEX_ENV2, PICA_REG_TEX_ENV3, PICA_REG_TEX_ENV4, PICA_REG_TEX_ENV5, }; u32 bufferInput = NW_LYT_CMD_DATA_TEX_ENV_BUF_INPUT_THROUGH; u32 stageNum = nw::ut::Min( (u32)TEX_ENV_STAGE_NUM, (u32)pMaterial->GetTevStageNum() ); for ( int i = 0; i < stageNum; ++i ) { const TevStage& tevStage = pMaterial->GetTevStage( i ); nw::ut::Color8 rgb = pMaterial->GetColor( tevStage.GetKonstSelRgb() ); nw::ut::Color8 alpha = pMaterial->GetColor( tevStage.GetKonstSelAlpha() ); int stageNo = i + ( TEX_ENV_STAGE_NUM - stageNum ); if (i == 0) { // ステージ0を使わなければならないかチェック if ( ( tevStage.GetSrcRgb0() != TEVSRC_CONSTANT && tevStage.GetSrcRgb1() != TEVSRC_CONSTANT && tevStage.GetSrcRgb2() != TEVSRC_CONSTANT ) || ( tevStage.GetSrcAlpha0() != TEVSRC_CONSTANT && tevStage.GetSrcAlpha1() != TEVSRC_CONSTANT && tevStage.GetSrcAlpha2() != TEVSRC_CONSTANT ) ) { // スルー設定 for ( int j = 1; j <= stageNo; ++j) { // ヘッダ NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_BURSTSEQ( reg[ j ], 5 ), PICA_CMD_DATA_TEX_ENV_SRC( PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_PREVIOUS, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT, PICA_DATA_TEX_ENV_SRC_RGBA_CONSTANT ) ); // 続き static const u32 command[] = { PICA_CMD_DATA_TEX_ENV_OPERAND( PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_RGB_SRC_COLOR, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA, PICA_DATA_OPE_ALPHA_SRC_ALPHA ), PICA_CMD_DATA_TEX_ENV_COMBINE( PICA_DATA_TEX_ENV_COMBINE_REPLACE, PICA_DATA_TEX_ENV_COMBINE_REPLACE ), PICA_CMD_DATA_TEX_ENV_BUFFER_COLOR_WHITE, PICA_CMD_DATA_TEX_ENV_SCALE( PICA_DATA_TEX_ENV_SCALE_1, PICA_DATA_TEX_ENV_SCALE_1 ), }; NW_FONT_RECTDRAWER_ADD_COMMAND( command, sizeof( command ) ); } // ステージ0を使用 stageNo = 0; } } if ( 1 <= i && i <= 4 ) { bufferInput |= PICA_CMD_DATA_TEX_ENV_BUFFER_INPUT( stageNo, ( tevStage.GetSavePrevRgb() ) ? PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS : PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP, ( tevStage.GetSavePrevAlpha() ) ? PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS : PICA_DATA_TEX_ENV_BUFFER_INPUT_PREVIOUS_BUFFER_DMP ); } const u32 command[] = { PICA_CMD_DATA_TEX_ENV_SRC( tevSrc[ tevStage.GetSrcRgb0() ], tevSrc[ tevStage.GetSrcRgb1() ], tevSrc[ tevStage.GetSrcRgb2() ], tevSrc[ tevStage.GetSrcAlpha0() ], tevSrc[ tevStage.GetSrcAlpha1()], tevSrc[ tevStage.GetSrcAlpha2() ] ), PICA_CMD_HEADER_BURSTSEQ( reg[ stageNo ], 5 ), PICA_CMD_DATA_TEX_ENV_OPERAND( tevOpRgb[ tevStage.GetOperandRgb0() ], tevOpRgb[ tevStage.GetOperandRgb1() ], tevOpRgb[ tevStage.GetOperandRgb2() ], tevOpAlp[ tevStage.GetOperandAlpha0() ], tevOpAlp[ tevStage.GetOperandAlpha1() ], tevOpAlp[ tevStage.GetOperandAlpha2() ] ), PICA_CMD_DATA_TEX_ENV_COMBINE( tevMode[ tevStage.GetCombineRgb() ], tevMode[ tevStage.GetCombineAlpha() ] ), NW_LYT_CMD_DATA_COLOR_ALPHA( rgb, alpha ), PICA_CMD_DATA_TEX_ENV_SCALE( scale[ tevStage.GetScaleRgb() ], scale[ tevStage.GetScaleAlpha() ] ), }; // コマンドリストに積む NW_FONT_RECTDRAWER_ADD_COMMAND( command, sizeof( command ) ); } // バッファカラーおよびバッファ入力の設定 { nw::ut::Color8 black = pMaterial->GetColor( TEVKONSTSEL_BUFFER ); // 0x0fd NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE( PICA_REG_TEX_ENV_BUFFER_COLOR ), NW_LYT_CMD_DATA_COLOR(black) ); // 0x0e0 NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE_BE( PICA_REG_TEX_ENV_BUFFER_INPUT, 0x2 ), bufferInput ); } } #endif #ifdef NW_LYT_DRAWER_ENABLE_ALPHA_TEST void Drawer::SetUpAlphaTest( const Material* __restrict pMaterial ) { const AlphaCompare& __restrict alphaCompare = pMaterial->GetAlphaCompare(); register f32 refValue = alphaCompare.GetRef() * 255.f + 0.5f; const u32 alphaTest[] = { PICA_DATA_ALPHA_TEST_NEVER, PICA_DATA_ALPHA_TEST_LESS, PICA_DATA_ALPHA_TEST_LEQUAL, PICA_DATA_ALPHA_TEST_EQUAL, PICA_DATA_ALPHA_TEST_NOTEQUAL, PICA_DATA_ALPHA_TEST_GEQUAL, PICA_DATA_ALPHA_TEST_GREATER, PICA_DATA_ALPHA_TEST_ALWAYS, }; // 0x104 NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( PICA_CMD_HEADER_SINGLE( PICA_REG_FRAGOP_ALPHA_TEST ), PICA_CMD_DATA_FRAGOP_ALPHA_TEST( true, alphaTest[ alphaCompare.GetFunc() ], (u8)refValue ) ); } #endif #ifdef NW_LYT_DRAWER_ENABLE_BLEND_FUNC void Drawer::SetUpBlendMode( const Material* __restrict pMaterial ) { const BlendMode& blendMode = pMaterial->GetBlendMode(); if ( blendMode.GetBlendOp() == BLENDOP_DISABLE && blendMode.GetLogicOp() == LOGICOP_DISABLE ) { // ブレンドなしのコマンド u32 command[] = { NW_FONT_COMMAND_SET_BLEND_FUNC( PICA_DATA_BLEND_EQUATION_ADD, PICA_DATA_BLEND_FUNC_ONE, PICA_DATA_BLEND_FUNC_ZERO ) }; NW_FONT_RECTDRAWER_ADD_COMMAND( command, sizeof( command ) ); } else if ( blendMode.GetBlendOp() != BLENDOP_DISABLE ) { // ブレンド設定 const u32 blendOp[] = { 0, // DISABLE PICA_DATA_BLEND_EQUATION_ADD, PICA_DATA_BLEND_EQUATION_SUBTRACT, PICA_DATA_BLEND_EQUATION_REVERSE_SUBTRACT, }; const u32 srcFactor[] = { PICA_DATA_BLEND_FUNC_ZERO, PICA_DATA_BLEND_FUNC_ONE, PICA_DATA_BLEND_FUNC_DST_COLOR, PICA_DATA_BLEND_FUNC_ONE_MINUS_DST_COLOR, PICA_DATA_BLEND_FUNC_SRC_ALPHA, PICA_DATA_BLEND_FUNC_ONE_MINUS_SRC_ALPHA, PICA_DATA_BLEND_FUNC_DST_ALPHA, PICA_DATA_BLEND_FUNC_ONE_MINUS_DST_ALPHA, }; const u32 dstFactor[] = { PICA_DATA_BLEND_FUNC_ZERO, PICA_DATA_BLEND_FUNC_ONE, PICA_DATA_BLEND_FUNC_SRC_COLOR, PICA_DATA_BLEND_FUNC_ONE_MINUS_SRC_COLOR, PICA_DATA_BLEND_FUNC_SRC_ALPHA, PICA_DATA_BLEND_FUNC_ONE_MINUS_SRC_ALPHA, PICA_DATA_BLEND_FUNC_DST_ALPHA, PICA_DATA_BLEND_FUNC_ONE_MINUS_DST_ALPHA, }; const u32 command[] = { NW_FONT_COMMAND_SET_BLEND_FUNC( blendOp[ blendMode.GetBlendOp() ], srcFactor[ blendMode.GetSrcFactor() ], dstFactor[ blendMode.GetDstFactor() ] ), }; NW_FONT_RECTDRAWER_ADD_COMMAND( command, sizeof( command ) ); } else if ( blendMode.GetLogicOp() != LOGICOP_DISABLE ) { // 論理演算の設定 const u32 logicOp[] = { 0 , // DISABLE PICA_DATA_LOGIC_NOOP, PICA_DATA_LOGIC_CLEAR, PICA_DATA_LOGIC_SET, PICA_DATA_LOGIC_COPY, PICA_DATA_LOGIC_COPY_INVERTED, PICA_DATA_LOGIC_INVERT, PICA_DATA_LOGIC_AND, PICA_DATA_LOGIC_NAND, PICA_DATA_LOGIC_OR, PICA_DATA_LOGIC_NOR, PICA_DATA_LOGIC_XOR, PICA_DATA_LOGIC_EQUIV, PICA_DATA_LOGIC_AND_REVERSE, PICA_DATA_LOGIC_AND_INVERTED, PICA_DATA_LOGIC_OR_REVERSE, PICA_DATA_LOGIC_OR_INVERTED, }; const u32 command[] = { NW_LYT_COMMAND_SET_LOGIC_OP( logicOp[ blendMode.GetLogicOp() ] ), }; NW_FONT_RECTDRAWER_ADD_COMMAND( command, sizeof( command ) ); } } #endif } // namespace lyt } // namespace nw #endif // NW_LYT_DRAWER_ENABLE