1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: font_RectDrawerCommand.h 4 5 Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain proprietary 8 information of Nintendo and/or its licensed developers and are protected by 9 national and international copyright laws. They may not be disclosed to third 10 parties or copied or duplicated in any form, in whole or in part, without the 11 prior written consent of Nintendo. 12 13 The content herein is highly confidential and should be handled accordingly. 14 15 $Revision: 31311 $ 16 *---------------------------------------------------------------------------*/ 17 18 #ifndef NW_FONT_RECTDRAWERCOMMAND_H_ 19 #define NW_FONT_RECTDRAWERCOMMAND_H_ 20 21 #if defined(_MSC_VER) && _MSC_VER >= 1500 22 #pragma once 23 #endif 24 25 26 // コマンドリストに積む 27 #define NW_FONT_ADD_COMMANDS_PTR( ptr, command, size ) \ 28 std::memcpy( ptr, command, size ); \ 29 (ptr) += (size) >> 2 30 31 #define NW_FONT_ADD_SINGLE_COMMAND_PTR( ptr, header, data ) \ 32 *(ptr)++ = (data); \ 33 *(ptr)++ = (header) 34 35 #define NW_FONT_RECTDRAWER_ADD_COMMAND( command, size ) \ 36 std::memcpy( __cb_current_command_buffer, command, size ); \ 37 __cb_current_command_buffer += (size) >> 2 38 39 #define NW_FONT_RECTDRAWER_ADD_SINGLE_COMMAND( header, data ) \ 40 *__cb_current_command_buffer++ = (data); \ 41 *__cb_current_command_buffer++ = (header) 42 43 44 //--------------------------------------------------------------------------- 45 //! @brief カリングのモードです。 46 //--------------------------------------------------------------------------- 47 enum 48 { 49 NW_FONT_CMD_CULL_FACE_DISABLE, 50 NW_FONT_CMD_CULL_FACE_FRONT, 51 NW_FONT_CMD_CULL_FACE_BACK, 52 53 NW_FONT_CMD_CULL_FACE_MASK = 0x3 54 }; 55 56 57 namespace nw { 58 namespace font { 59 60 //--------------------------------------------------------------------------- 61 //! @brief カラーバッファの情報を保持する構造体です。 62 //--------------------------------------------------------------------------- 63 struct ColorBufferInfo 64 { 65 u16 width; //!< 幅 66 u16 height; //!< 高さ 67 u8 depth; //!< デプスバッファのフォーマット(PICA_DATA_DEPTH*) 68 }; 69 70 } // namespace font 71 } // namespace nw 72 73 //--------------------------------------------------------------------------- 74 //! @brief コマンド定義開始マクロです。 75 //--------------------------------------------------------------------------- 76 #define NW_FONT_CMD_BEGIN_COMMAND_BLOCK \ 77 { \ 78 const u32 commands[] = { 79 80 //--------------------------------------------------------------------------- 81 //! @brief コマンド定義終了マクロです。 82 //--------------------------------------------------------------------------- 83 #define NW_FONT_CMD_END_COMMAND_BLOCK \ 84 }; \ 85 NW_FONT_RECTDRAWER_ADD_COMMAND( commands, sizeof(commands) ); \ 86 } 87 88 //--------------------------------------------------------------------------- 89 //! @brief ビューポートを設定します。 90 //! 以下のDMPGL呼び出しと同等です。 91 //! 92 //! glViewport(x, y, width, height); 93 //! 94 //! @param[in] x ビューポートの左の位置 95 //! @param[in] y ビューポートの上の位置 96 //! @param[in] width ビューポートの幅 97 //! @param[in] height ビューポートの高さ 98 //--------------------------------------------------------------------------- 99 #define NW_FONT_CMD_SET_VIEWPORT( x, y, width, height ) \ 100 nw::ut::Float24::Float32ToBits24( (width) / 2.0f ), \ 101 PICA_CMD_HEADER_BURSTSEQ( PICA_REG_VIEWPORT_WIDTH1, 4 ), \ 102 nw::ut::Float31::Float32ToBits31( 2.0f / (width) ) << 1, \ 103 nw::ut::Float24::Float32ToBits24( (height) / 2.0f ), \ 104 nw::ut::Float31::Float32ToBits31( 2.0f / (height) ) << 1, \ 105 0, /* アライメント調整 */ \ 106 PICA_CMD_DATA_VIEWPORT_XY( static_cast<u16>(x), static_cast<u16>(y) ), \ 107 PICA_CMD_HEADER_SINGLE( PICA_REG_VIEWPORT_XY ) 108 109 //--------------------------------------------------------------------------- 110 //! @brief カリングを設定します。 111 //! 112 //! @param[in] mode カリングのモード(NW_FONT_DEMO_CULL_FACE_*) 113 //--------------------------------------------------------------------------- 114 #define NW_FONT_CMD_SET_CULL_FACE( mode ) PICA_CMD_SET_CULL_FACE( mode ) 115 116 117 #define NW_FONT_CMD_SCISSOR_VAL( s, c ) \ 118 static_cast<u16>( (s) >= (c) ? (c) - 1: ((s) < 0 ? 0: (s)) ) 119 120 //--------------------------------------------------------------------------- 121 //! @brief シザーボックスを設定します。 122 //! また、同時にシザーテストを有効にします。 123 //! 以下のDMPGL呼び出しと同等です。 124 //! 125 //! glEnable(GL_SCISSOR_TEST); 126 //! glScissor(x, y, w, h); 127 //! 128 //! @param[in] x シザーボックスの左の位置 129 //! @param[in] y シザーボックスの上の位置 130 //! @param[in] w シザーボックスの幅 131 //! @param[in] h シザーボックスの高さ 132 //! @param[in] cbSz カラーバッファ情報構造体 133 //--------------------------------------------------------------------------- 134 #define NW_FONT_CMD_SET_SCISSOR( x, y, w, h, cbSz ) \ 135 PICA_CMD_DATA_SCISSOR( true ), \ 136 PICA_CMD_HEADER_BURSTSEQ( PICA_REG_SCISSOR, 3 ), \ 137 NW_FONT_CMD_SCISSOR_VAL( x, (cbSz).width ) \ 138 | NW_FONT_CMD_SCISSOR_VAL( y, (cbSz).height ) << 16, \ 139 NW_FONT_CMD_SCISSOR_VAL( (x) + (w) - 1, (cbSz).width ) \ 140 | NW_FONT_CMD_SCISSOR_VAL( (y) + (h) - 1, (cbSz).height ) << 16 141 142 //--------------------------------------------------------------------------- 143 //! @brief シザーテストを無効にします。 144 //! 以下のDMPGL呼び出しと同等です。 145 //! 146 //! glDisable(GL_SCISSOR_TEST); 147 //! 148 //! @param[in] cbSz カラーバッファ情報構造体 149 //--------------------------------------------------------------------------- 150 #define NW_FONT_CMD_SET_DISABLE_SCISSOR( cbSz ) \ 151 PICA_CMD_DATA_SCISSOR( false ), \ 152 PICA_CMD_HEADER_BURSTSEQ( PICA_REG_SCISSOR, 3 ), \ 153 0 | 0 << 16, \ 154 ((cbSz).width - 1) | ((cbSz).height - 1) << 16 155 156 //--------------------------------------------------------------------------- 157 //! @brief wバッファ、デプスの範囲、ポリゴンオフセットを設定します。 158 //! 以下のDMPGL呼び出しと同等です。 159 //! 160 //! glUniform1f(予約ユニフォーム "dmp_FragOperation.wScale", wScale); 161 //! glDepthRangef(near, far); 162 //! glPolygonOffset(factor, units); ※ factorは設定不可 163 //! 164 //! @param[in] wScale wバッファを有効にする値 165 //! @param[in] near デプスの範囲のnear値 166 //! @param[in] far デプスの範囲のfar値 167 //! @param[in] units ポリゴンオフセットのunits値。0 にするとポリゴンオフセットが無効になります。 168 //! @param[in] cbSz カラーバッファ情報構造体 169 //--------------------------------------------------------------------------- 170 #define NW_FONT_CMD_SET_WBUFFER_DEPTHRANGE_POLYGONOFFSET( \ 171 wScale, near, far, units, cbSz ) \ 172 ((wScale) == 0.0f ? 1: 0) << 0, \ 173 PICA_CMD_HEADER_SINGLE( PICA_REG_FRAG_OP_WSCALE ), \ 174 nw::ut::Float24::Float32ToBits24( \ 175 (wScale) != 0.0f ? -(wScale): (near) - (far) ), \ 176 PICA_CMD_HEADER_SINGLE( PICA_REG_FRAG_OP_WSCALE_DATA1 ), \ 177 nw::ut::Float24::Float32ToBits24( \ 178 (near) \ 179 - ((near) - (far)) * static_cast<f32>(units) \ 180 / ((1 << ((cbSz).depth == PICA_DATA_DEPTH_COMPONENT16 ? 16: 24)) - 1) ), \ 181 PICA_CMD_HEADER_SINGLE( PICA_REG_FRAG_OP_WSCALE_DATA2 ) 182 183 //--------------------------------------------------------------------------- 184 //! @brief アーリーデプステストの有効/無効を設定します。 185 //! 以下のDMPGL呼び出しと同等です。 186 //! 187 //! glEnable/glDisable(GL_EARLY_DEPTH_TEST_DMP) 188 //! 189 //! @param[in] isEnabled 有効にする場合は真 190 //--------------------------------------------------------------------------- 191 #define NW_FONT_CMD_SET_ENABLE_EARLY_DEPTH_TEST( isEnabled ) \ 192 PICA_CMD_DATA_EARLY_DEPTH_TEST( isEnabled ), \ 193 PICA_CMD_HEADER_SINGLE_BE( PICA_REG_EARLY_DEPTH_TEST1, 0x1 ), \ 194 PICA_CMD_DATA_EARLY_DEPTH_TEST( isEnabled ), \ 195 PICA_CMD_HEADER_SINGLE( PICA_REG_EARLY_DEPTH_TEST2 ) 196 197 //--------------------------------------------------------------------------- 198 //! @brief ステンシルテストの関数とビットマスク値を設定します。 199 //! また、同時にステンシルテストを有効にします。 200 //! 以下のDMPGL呼び出しと同等です。 201 //! 202 //! glEnable(GL_STENCIL_TEST); 203 //! glStencilFunc(func, ref, andBits); 204 //! glStencilMask(writableBits); 205 //! 206 //! @param[in] func 比較関数(PICA_DATA_STENCIL_TEST_*) 207 //! @param[in] ref 参照値 208 //! @param[in] andBits 論理積をとるビット 209 //! @param[in] writableBits 書き込み可能ビット 210 //--------------------------------------------------------------------------- 211 #define NW_FONT_CMD_SET_STENCIL_FUNC_MASK( func, ref, andBits, writableBits ) \ 212 PICA_CMD_DATA_STENCIL_TEST( true/*isEnabled*/, func, writableBits, ref, andBits ), \ 213 PICA_CMD_HEADER_SINGLE( PICA_REG_STENCIL_TEST ) 214 215 //--------------------------------------------------------------------------- 216 //! @brief ステンシルテストの操作を設定します。 217 //! 以下のDMPGL呼び出しと同等です。 218 //! 219 //! glStencilOp(sfail, zfail, zpass) 220 //! 221 //! @param[in] sfail ステンシルテストに失敗する場合の演算(PICA_DATA_STENCIL_OP_*) 222 //! @param[in] zfail デプステストに失敗する場合の演算(PICA_DATA_STENCIL_OP_*) 223 //! @param[in] zpass パスする場合の演算(PICA_DATA_STENCIL_OP_*) 224 //--------------------------------------------------------------------------- 225 #define NW_FONT_CMD_SET_STENCIL_OP( sfail, zfail, zpass ) \ 226 PICA_CMD_DATA_STENCIL_OP( sfail, zfail, zpass ), \ 227 PICA_CMD_HEADER_SINGLE( PICA_REG_STENCIL_OP ) 228 229 //--------------------------------------------------------------------------- 230 //! @brief ステンシルテストを無効にします。 231 //! 以下のDMPGL呼び出しと同等です。 232 //! 233 //! glDisable(GL_STENCIL_TEST); 234 //--------------------------------------------------------------------------- 235 #define NW_FONT_CMD_SET_DISABLE_STENCIL_TEST() \ 236 PICA_CMD_DATA_STENCIL_TEST( false/*isEnabled*/, 0, 0, 0, 0 ), \ 237 PICA_CMD_HEADER_SINGLE( PICA_REG_STENCIL_TEST ) 238 239 //--------------------------------------------------------------------------- 240 //! @brief デプステストの関数とマスクおよびカラーマスクを設定します。 241 //! デプステストの関数は NW_FONT_CMD_SET_DEPTH_FUNC2 と合わせて 242 //! 使用します。 243 //! 以下のDMPGL呼び出しと同等です。 244 //! 245 //! glEnable/glDisable(GL_DEPTH_TEST) 246 //! glDepthFunc(depthFunc) ※一部の設定 247 //! glDepthMask(depthMask) 248 //! glColorMask(red, green, blue, alpha) 249 //! 250 //! @param[in] isDepthTestEnabled デプステストを有効にする場合は真 251 //! @param[in] depthFunc デプス値の比較関数(PICA_DATA_DEPTH_TEST_*) 252 //! @param[in] depthMask デプスバッファへの書き込みが可能なら真 253 //! @param[in] red カラーバッファへの赤色成分が書き込み可能なら真 254 //! @param[in] green カラーバッファへの緑色成分が書き込み可能なら真 255 //! @param[in] blue カラーバッファへの青色成分が書き込み可能なら真 256 //! @param[in] alpha カラーバッファへのアルファ成分が書き込み可能なら真 257 //--------------------------------------------------------------------------- 258 #define NW_FONT_CMD_SET_DEPTH_FUNC_COLOR_MASK( \ 259 isDepthTestEnabled, depthFunc, depthMask, red, green, blue, alpha ) \ 260 PICA_CMD_DATA_DEPTH_COLOR_MASK( isDepthTestEnabled, depthFunc, \ 261 red, green, blue, alpha, depthMask ), \ 262 PICA_CMD_HEADER_SINGLE( PICA_REG_DEPTH_COLOR_MASK ) 263 264 //--------------------------------------------------------------------------- 265 //! @brief デプステストの関数を設定します。 266 //! NW_FONT_CMD_SET_DEPTH_FUNC_COLOR_MASK と合わせて使用します。 267 //! 以下のDMPGL呼び出しと同等です。 268 //! 269 //! glDepthFunc(func) ※一部の設定 270 //! 271 //! @param[in] func デプス値の比較関数(PICA_DATA_DEPTH_TEST_*) 272 //--------------------------------------------------------------------------- 273 #define NW_FONT_CMD_SET_DEPTH_FUNC2( func ) \ 274 PICA_CMD_DATA_GAS_DELTAZ_DEPTH( 0 /*deltaZ*/, \ 275 (func) >= PICA_DATA_DEPTH_TEST_GREATER ? PICA_DATA_DEPTH_TEST2_GREATER: \ 276 ( (func) >= PICA_DATA_DEPTH_TEST_EQUAL ? PICA_DATA_DEPTH_TEST2_OTHER: (func) ) ), \ 277 PICA_CMD_HEADER_SINGLE_BE( PICA_REG_GAS_DELTAZ_DEPTH, 0x4 ) 278 279 //--------------------------------------------------------------------------- 280 //! @brief フレームバッファアクセス制御を設定します。 281 //! 282 //! @param[in] colorRead カラーバッファのリードが必要な場合は真 283 //! @param[in] colorWrite カラーバッファのライトが必要な場合は真 284 //! @param[in] depthRead デプスバッファのリードが必要な場合は真 285 //! @param[in] depthWrite デプスバッファのライトが必要な場合は真 286 //! @param[in] stencilRead ステンシルバッファのリードが必要な場合は真 287 //! @param[in] stencilWrite ステンシルバッファのライトが必要な場合は真 288 //--------------------------------------------------------------------------- 289 #define NW_FONT_CMD_SET_FBACCESS( \ 290 colorRead, colorWrite, depthRead, depthWrite, stencilRead, stencilWrite) \ 291 (colorRead ) ? 0xF: 0, \ 292 PICA_CMD_HEADER_BURSTSEQ( PICA_REG_COLOR_BUFFER_READ, 4 ), \ 293 (colorWrite) ? 0xF: 0, \ 294 ((depthRead ) ? 1: 0) << 1 | ((stencilRead ) ? 1: 0) << 0, \ 295 ((depthWrite) ? 1: 0) << 1 | ((stencilWrite) ? 1: 0) << 0, \ 296 0 // アライメント調整 297 298 299 #endif // NW_FONT_RECTDRAWERCOMMAND_H_ 300