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