// --------------------------------------------------------------------------- // Project: NintendoWare // File: font_RectDrawerShader.vsh // // Copyright (C)2009-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. // // $Revision:$ // --------------------------------------------------------------------------- //---------------------------------------------------------- // Input registers map #pragma bind_symbol( vVtxData, v0, v0 ) #define vVtxData v0 // Input map // { bufferIndex, vtxIndex, X, Y } //---------------------------------------------------------- //---------------------------------------------------------- // Constant values #define cVal c5 def cVal, 0.0, 1.0, 2.0, 3.0 //---------------------------------------------------------- //---------------------------------------------------------- // Uniform #define uProjection c0 #define uStereoCamera c4 #define uUniformAddr c6 #define uUniformMtx c32 #define uUniformData c64 #define uTexCoordMode i0 //---------------------------------------------------------- //---------------------------------------------------------- // Output registers map #pragma output_map(position, o0) #pragma output_map(color, o1) #pragma output_map(texture0, o2.xy) #pragma output_map(texture1, o3.xy) #pragma output_map(texture2, o4.xy) #define oPosition o0 #define oColor o1 #define oTexCoord0 o2 #define oTexCoord1 o3 #define oTexCoord2 o4 //---------------------------------------------------------- //---------------------------------------------------------- // Temporary registers #define rQuad r0 #define rPosition r1 #define rTransform r2 #define rTempView r3 #define rTempPos r4 #define rTexCoord0 r5 #define rTexCoord1 r6 #define rTexCoord2 r7 #define rCounter r8 //---------------------------------------------------------- main: // 何番目の四角形かを取得 mova a0.x, vVtxData // アドレス情報を保存 mov rQuad, uUniformAddr[ a0.x ].wzyx // 基本四角形の座標を設定 mov rPosition.xy, vVtxData.zwzw mov rPosition.zw, cVal.xyxy // 行列データのアドレス、および、矩形情報のアドレスを取得 mova a0.xy, rQuad.xy // 四角形を変形(ローカル座標系) mov rTransform.xw, uUniformData[ a0.y ].wwyy mov rTransform.yz, cVal.xxxx dp4 rTempPos.x, rPosition, rTransform mov rTransform.yw, uUniformData[ a0.y ].zzxx mov rTransform.xz, cVal.xxxx dp4 rTempPos.y, rPosition, rTransform mov rTempPos.zw, rPosition.zwzw // 四角形をスクリーン座標系に変換 dp4 rTempView.x, rTempPos, uUniformMtx[ a0.x + 0 ].wzyx dp4 rTempView.y, rTempPos, uUniformMtx[ a0.x + 1 ].wzyx dp4 rTempView.z, rTempPos, uUniformMtx[ a0.x + 2 ].wzyx mov rTempView.w, rPosition.w mov rTempPos.z, uUniformMtx[ a0.x + 2 ].x // temp z = z abs rTempPos.z, rTempPos.z // temp z = abs(temp z) add rTempPos.z, rTempPos.z, uStereoCamera.y // temp z += add dist // 視差をつけるかどうかの判定 mov rTempPos.x, uStereoCamera.w cmp 1, 1, rTempPos.xz, cVal.xx // 1: != half parallax != 0, z != 0 ? ifc 1, 1, 1 // 1: AND mov rTempPos.x, uStereoCamera.w // temp x = half parallax sub rTempPos.y, rTempPos.z, uStereoCamera.z // temp y = temp z - Dlevel rcp rTempPos.z, rTempPos.z // temp z = 1 / temp z mul rTempPos.z, rTempPos.y, rTempPos.z // temp z *= temp y mad rTempView.x, rTempPos.x, rTempPos.z, rTempView.x // x = temp x * temp z + x endif dp4 oPosition.x, rTempView, uProjection[ 0 ].wzyx dp4 oPosition.y, rTempView, uProjection[ 1 ].wzyx dp4 oPosition.z, rTempView, uProjection[ 2 ].wzyx dp4 oPosition.w, rTempView, uProjection[ 3 ].wzyx // 頂点カラーの情報があるかを取得 cmp 3, 3, rQuad.w, cVal.y ifc 1, 1, 1 // 頂点カラーの設定なし。 // 頂点カラーをデフォルトで設定 mov oColor.xyz, cVal.y // アルファを設定 mov oColor.w, rQuad.w else // 頂点カラーの設定あり。 // 頂点カラー情報のアドレスを取得 mova a0.y, rQuad.w // 現在処理している頂点について、上下左右の判定 cmp 1, 1, cVal.xx, rPosition.xy ifc 0, 0, 1 // 左上 mov oColor, uUniformMtx[ a0.y + 0 ].wzyx endif ifc 1, 0, 1 // 右上 mov oColor, uUniformMtx[ a0.y + 1 ].wzyx endif ifc 0, 1, 1 // 左下 mov oColor, uUniformMtx[ a0.y + 2 ].wzyx endif ifc 1, 1, 1 // 右下 mov oColor, uUniformMtx[ a0.y + 3 ].wzyx endif nop endif // テクスチャ座標の初期化 cmp 1, 1, cVal.xx, rPosition.xy ifc 0, 0, 1 // 左上 mov rTexCoord0, cVal.xyyy mov rTexCoord1, cVal.xyyy mov rTexCoord2, cVal.xyyy endif ifc 1, 0, 1 // 右上 mov rTexCoord0, cVal.yyyy mov rTexCoord1, cVal.yyyy mov rTexCoord2, cVal.yyyy endif ifc 0, 1, 1 // 左下 mov rTexCoord0, cVal.xxyy mov rTexCoord1, cVal.xxyy mov rTexCoord2, cVal.xxyy endif ifc 1, 1, 1 // 右下 mov rTexCoord0, cVal.yxyy mov rTexCoord1, cVal.yxyy mov rTexCoord2, cVal.yxyy endif // テクスチャ座標の設定 mov rCounter, cVal.x loop uTexCoordMode cmp 0, 0, cVal.y, rCounter ifc 1, 1, 1 // テクスチャ座標のアドレスを取得 mova a0.y, rQuad.z cmp 1, 1, cVal.xx, rPosition.xy ifc 0, 0, 1 // 左上 mov rTexCoord0.xy, uUniformData[ a0.y + 0 ].wz mov rTexCoord1.xy, uUniformData[ a0.y + 1 ].wz mov rTexCoord2.xy, uUniformData[ a0.y + 2 ].wz endif ifc 1, 0, 1 // 右上 mov rTexCoord0.xy, uUniformData[ a0.y + 0 ].yz mov rTexCoord1.xy, uUniformData[ a0.y + 1 ].yz mov rTexCoord2.xy, uUniformData[ a0.y + 2 ].yz endif ifc 0, 1, 1 // 左下 mov rTexCoord0.xy, uUniformData[ a0.y + 0 ].wx mov rTexCoord1.xy, uUniformData[ a0.y + 1 ].wx mov rTexCoord2.xy, uUniformData[ a0.y + 2 ].wx endif ifc 1, 1, 1 // 右下 mov rTexCoord0.xy, uUniformData[ a0.y + 0 ].yx mov rTexCoord1.xy, uUniformData[ a0.y + 1 ].yx mov rTexCoord2.xy, uUniformData[ a0.y + 2 ].yx endif nop endif // テクスチャ行列が回転している場合に限り、右上と左下の座標が入ってくる cmp 2, 2, cVal.w, rCounter ifc 1, 1, 1 cmp 1, 1, cVal.xx, rPosition.xy ifc 1, 0, 1 // 右上を上書き mov rTexCoord0.xy, uUniformData[ a0.y + 3 ].yx mov rTexCoord1.xy, uUniformData[ a0.y + 4 ].yx mov rTexCoord2.xy, uUniformData[ a0.y + 5 ].yx endif ifc 0, 1, 1 // 左下を上書き mov rTexCoord0.xy, uUniformData[ a0.y + 3 ].wz mov rTexCoord1.xy, uUniformData[ a0.y + 4 ].wz mov rTexCoord2.xy, uUniformData[ a0.y + 5 ].wz endif nop endif add rCounter, rCounter, cVal.y endloop mov oTexCoord0, rTexCoord0 mov oTexCoord1, rTexCoord1 mov oTexCoord2, rTexCoord2 end endmain: