// --------------------------------------------------------------------------- // Project: NintendoWare // File: gfx_ParticleVShader.vsh // // Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. // // These coded instructions, statements, and computer programs contain proprietary // information of Nintendo and/or its licensed developers and are protected by // national and international copyright laws. 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. // // The content herein is highly confidential and should be handled accordingly. // // $Revision: $ // --------------------------------------------------------------------------- #include "VertexShader.h" // Input registers map // パーティクル用の設定です #define aTranslate v0 #define aScale v1 #define aRotate v2 #define aColor v3 #define aAlpha v4 #define aTextureTranslate v5 #define aTextureScale v6 #define aTextureRotate v7 #define aScaleExt v8 // 名前は使わないので、間違えが起こらないように単純な規則にしています。 #pragma bind_symbol(aInput0.xyz, v0, v0) // translate #pragma bind_symbol(aInput1.xyz, v1, v1) // rotate #pragma bind_symbol(aInput2.xyz, v2, v2) // scale #pragma bind_symbol(aInput3.xyz, v3, v3) // color #pragma bind_symbol(aInput4.x, v4, v4) // alpha #pragma bind_symbol(aInput5.xy, v5, v5) // textureTranslate #pragma bind_symbol(aInput6.xy, v6, v6) // textureScale #pragma bind_symbol(aInput7.x, v7, v7) // textureRotate #pragma bind_symbol(aInput8.xyz, v8, v8) // scaleExt #pragma output_map(position, o0) #pragma output_map(quaternion, o1) #pragma output_map(view, o2) #pragma output_map(color, o3) #pragma output_map (generic, o4) #pragma output_map (generic, o5) #pragma output_map (generic, o6) #pragma output_map (generic, o7) #pragma bind_symbol(WrldMtx, c0, c2) #pragma bind_symbol(NormMtx, c3, c5) #pragma bind_symbol(PosOffs.xyz, c6, c6) #pragma bind_symbol(IrScale, c7, c8) #pragma bind_symbol(TexcMap.xyz, c10, c10) #pragma bind_symbol(TexMtx0, c11, c13) #pragma bind_symbol(TexMtx1, c14, c16) #pragma bind_symbol(TexMtx2, c17, c18) #pragma bind_symbol(TexTran, c19, c19) #pragma bind_symbol(MatAmbi, c20, c20) #pragma bind_symbol(MatDiff, c21, c21) #pragma bind_symbol(HslGCol, c22, c22) #pragma bind_symbol(HslSCol, c23, c23) #pragma bind_symbol(HslSDir, c24, c24) #pragma bind_symbol(UnivReg, c25, c80) #pragma bind_symbol(ProjMtx, c86, c89) #pragma bind_symbol(ViewMtx, c90, c92) #define uModelView c25 // view . model #define uInvModelView c28 // Inv(view . model) #define uInvModel c31 // Inv(model) #define uModel c34 // model #define uOffset c37 #define uScaleOffset c38 #define uRotateOffset c39 #pragma bind_symbol(IsSmoSk, b1, b1) #pragma bind_symbol(IsRgdSk, b2, b2) #pragma bind_symbol(IsUniSc, b3, b3) #pragma bind_symbol(UseNorM, b4, b4) #pragma bind_symbol(IsHemiL, b5, b5) #pragma bind_symbol(IsHemiO, b6, b6) #pragma bind_symbol(IsVertA, b7, b7) #pragma bind_symbol(IsBoneW, b8, b8) #pragma bind_symbol(UvMap0, b9, b9) #pragma bind_symbol(UvMap1, b10, b10) #pragma bind_symbol(UvMap2, b11, b11) #pragma bind_symbol(IsVertL, b12, b12) #pragma bind_symbol(IsText1, b13, b13) #pragma bind_symbol(IsText2, b14, b14) #pragma bind_symbol(IsQuate, b15, b15) #define shapeType0 b1 // 粒子のXYZの回転行列の生成 #define shapeType1 b2 #define shapeType2 b3 #define shapeType3 b4 #define CONST_1__2PI c84.x #define sincos_table c81 def c81, 64.81226000634280664816344, -41.1989059448242187500, -19.733086445622068119813801, 6.27851724624633789062 def c82, 57.38797321366921352108833, -72.0021514892578125000, -84.572341395128292218841051, 80.3578109741210937500 def c83, 3.765142073243151942892024, -6.68470811843872070312, -21.659571217007130946603447, 33.2480163574218750000 def c84, 0.1591549430918, 6.747892669487678532020627, 0, 0 main: // ここからしばらくポリゴンの基底ベクトルの計算 #define xvector r6 #define yvector r7 #define zvector r8 #define mat0 r9 #define mat1 r10 #define mat2 r11 #define in_rotate r12 #define in_scale r13 mov TEMP0, aRotate add TEMP0, TEMP0, uRotateOffset mul TEMP0, TEMP0, CONST_1__2PI flr TEMP1, TEMP0 add in_rotate, TEMP0, -TEMP1 mov TEMP0, aScale mul TEMP0, TEMP0, aScaleExt mul in_scale, TEMP0, uScaleOffset ifb shapeType0 // 回転行列 mov mat0, CONST_0 mov mat1, CONST_0 mov mat2, CONST_0 mul TEMP3, in_rotate, in_rotate mov TEMP1, sincos_table[2] mov TEMP2, sincos_table[1] mov TEMP5, sincos_table[0] // sincos x mad TEMP0.xy, TEMP3.x, TEMP1.xy, TEMP1.zw mad TEMP0.xy, TEMP3.x, TEMP0.xy, TEMP2.xy mad TEMP0.xy, TEMP3.x, TEMP0.xy, TEMP2.zw mad TEMP0.xy, TEMP3.x, TEMP0.xy, TEMP5.xy mad TEMP0.xy, TEMP3.x, TEMP0.xy, TEMP5.zw mul TEMP0.y, TEMP0.y, in_rotate.x mad TEMP0.x, TEMP3.x, TEMP0.x, CONST_1 mov TEMP4.xy, TEMP0 // TEMP4 = cos x, sin x, -, - // sincos y mad TEMP0.xy, TEMP3.y, TEMP1.xy, TEMP1.zw mad TEMP0.xy, TEMP3.y, TEMP0.xy, TEMP2.xy mad TEMP0.xy, TEMP3.y, TEMP0.xy, TEMP2.zw mad TEMP0.xy, TEMP3.y, TEMP0.xy, TEMP5.xy mad TEMP0.xy, TEMP3.y, TEMP0.xy, TEMP5.zw mul TEMP0.y, TEMP0.y, in_rotate.y mad TEMP0.x, TEMP3.y, TEMP0.x, CONST_1 mov TEMP4.zw, TEMP0.xxxy // TEMP4 = cos x, sin x, cos y, sin y // sincos z mad TEMP0.xy, TEMP3.z, TEMP1.xy, TEMP1.zw mad TEMP0.xy, TEMP3.z, TEMP0.xy, TEMP2.xy mad TEMP0.xy, TEMP3.z, TEMP0.xy, TEMP2.zw mad TEMP0.xy, TEMP3.z, TEMP0.xy, TEMP5.xy mad TEMP0.xy, TEMP3.z, TEMP0.xy, TEMP5.zw mul TEMP0.y, TEMP0.y, in_rotate.z mad TEMP0.x, TEMP3.z, TEMP0.x, CONST_1 #define cosx TEMP4.x #define sinx TEMP4.y #define cosy TEMP4.z #define siny TEMP4.w #define cosz TEMP0.x #define sinz TEMP0.y #define cossinx TEMP4.xy #define sincosz TEMP0.yx #define sincosx TEMP4.yx mov mat2.x, -siny mul mat0.x, cosz, cosy mul mat1.x, sinz, cosy mul mat2.y, sinx, cosy mul mat2.z, cosx, cosy mul TEMP1.xy, cossinx, sincosz mad mat0.y, TEMP1.y, siny, -TEMP1.x mad mat1.z, TEMP1.x, siny, -TEMP1.y mul TEMP1.xy, sincosx, sincosz mad mat0.z, TEMP1.y, siny, TEMP1.x mad mat1.y, TEMP1.x, siny, TEMP1.y #undef cosx #undef sinx #undef cosy #undef siny #undef cosz #undef sinz endif ifb shapeType2 // ポリゴン板 mov xvector.yz, CONST_0 mov yvector.xz, CONST_0 mov xvector.xw, CONST_1 mov yvector.yw, CONST_1 mul xvector.xyz, xvector, in_scale.x mul yvector.xyz, yvector, in_scale.y dp3 TEMP0.x, xvector, mat0 dp3 TEMP0.y, xvector, mat1 dp3 TEMP0.z, xvector, mat2 mov xvector, TEMP0 dp3 TEMP1.x, yvector, mat0 dp3 TEMP1.y, yvector, mat1 dp3 TEMP1.z, yvector, mat2 mov yvector, TEMP1 mov TEMP0, xvector dp3 xvector.x, TEMP0.xyz, uModelView[0]._XYZ dp3 xvector.y, TEMP0.xyz, uModelView[1]._XYZ dp3 xvector.z, TEMP0.xyz, uModelView[2]._XYZ mov TEMP0, yvector dp3 yvector.x, TEMP0.xyz, uModelView[0]._XYZ dp3 yvector.y, TEMP0.xyz, uModelView[1]._XYZ dp3 yvector.z, TEMP0.xyz, uModelView[2]._XYZ else ifb shapeType1 // Y軸ビルボード mov zvector.x, uInvModelView[0]._Z mov zvector.y, uInvModelView[1]._Z mov zvector.z, uInvModelView[2]._Z dp3 TEMP0, zvector, zvector rsq TEMP1, TEMP0.x mul zvector, zvector, TEMP1.x mov xvector, CONST_0 mov yvector, CONST_0 mov xvector.x, CONST_1 mov yvector.y, CONST_1 dp3 TEMP0.x, xvector, mat0 dp3 TEMP0.y, xvector, mat1 dp3 TEMP0.z, xvector, mat2 mov xvector, TEMP0 dp3 TEMP1.x, yvector, mat0 dp3 TEMP1.y, yvector, mat1 dp3 TEMP1.z, yvector, mat2 mov yvector, TEMP1 crs TEMP0.xyz, yvector, zvector crs zvector.xyz, TEMP0, yvector dp3 TEMP1, xvector, xvector rsq TEMP3, TEMP1.x crs xvector.xyz, yvector, zvector dp3 TEMP0, xvector, xvector rsq TEMP1, TEMP0.x mul xvector, xvector, TEMP1.x mul xvector, xvector, TEMP3.x // ここまでlocal座標系 mov TEMP0, xvector dp3 xvector.x, TEMP0.xyz, uModelView[0]._XYZ dp3 xvector.y, TEMP0.xyz, uModelView[1]._XYZ dp3 xvector.z, TEMP0.xyz, uModelView[2]._XYZ mov TEMP0, yvector dp3 yvector.x, TEMP0.xyz, uModelView[0]._XYZ dp3 yvector.y, TEMP0.xyz, uModelView[1]._XYZ dp3 yvector.z, TEMP0.xyz, uModelView[2]._XYZ // スケーリング mul xvector, xvector, in_scale.x mul yvector, yvector, in_scale.y else ifb shapeType3 // ワールド指向 mov zvector.x, uInvModelView[0]._Z mov zvector.y, uInvModelView[1]._Z mov zvector.z, uInvModelView[2]._Z dp3 TEMP0, zvector, zvector rsq TEMP1, TEMP0.x mul zvector, zvector, TEMP1.x mov yvector.xz, CONST_0 mov yvector.yw, CONST_1 crs TEMP0.xyz, yvector, zvector crs yvector.xyz, zvector, TEMP0 crs xvector.xyz, yvector, zvector else // スクリーン平行 mov zvector.x, uInvModelView[0]._Z mov zvector.y, uInvModelView[1]._Z mov zvector.z, uInvModelView[2]._Z dp3 TEMP0, zvector, zvector rsq TEMP1, TEMP0.x mul zvector, zvector, TEMP1.x mov yvector.x, uInvModelView[0]._Y mov yvector.y, uInvModelView[1]._Y mov yvector.z, uInvModelView[2]._Y dp3 TEMP0, yvector, yvector rsq TEMP1, TEMP0.x mul yvector, yvector, TEMP1.x crs TEMP0.xyz, yvector, zvector crs yvector.xyz, zvector, TEMP0 crs xvector.xyz, yvector, zvector endif dp3 TEMP0, xvector, xvector rsq TEMP1, TEMP0.x mul xvector, xvector, TEMP1.x dp3 TEMP0, yvector, yvector rsq TEMP1, TEMP0.x mul yvector, yvector, TEMP1.x // ここまでlocal座標系 mov TEMP0, xvector dp3 xvector.x, TEMP0.xyz, uModelView[0]._XYZ dp3 xvector.y, TEMP0.xyz, uModelView[1]._XYZ dp3 xvector.z, TEMP0.xyz, uModelView[2]._XYZ mov TEMP0, yvector dp3 yvector.x, TEMP0.xyz, uModelView[0]._XYZ dp3 yvector.y, TEMP0.xyz, uModelView[1]._XYZ dp3 yvector.z, TEMP0.xyz, uModelView[2]._XYZ // スケーリング mul xvector, xvector, in_scale.x mul yvector, yvector, in_scale.y // 回転 // sincos TEMP0.xy, in_rotate.z, TEMP1, TEMP2 // cos, sin mov TEMP1, sincos_table[2] mov TEMP2, sincos_table[1] mul TEMP0.z, in_rotate.z, in_rotate.z mad TEMP0.xy, TEMP0.z, TEMP1.xy, TEMP1.zw mad TEMP0.xy, TEMP0.z, TEMP0.xy, TEMP2.xy mad TEMP0.xy, TEMP0.z, TEMP0.xy, TEMP2.zw mov TEMP1, sincos_table[0] mad TEMP0.xy, TEMP0.z, TEMP0.xy, TEMP1.xy mad TEMP0.xy, TEMP0.z, TEMP0.xy, TEMP1.zw mul TEMP0.y, TEMP0.y, in_rotate.z mad TEMP0.x, TEMP0.z, TEMP0.x, CONST_1 mov TEMP0.z, -TEMP0.y mul TEMP1.xyzw, TEMP0.xzyx, xvector.xyxy add xvector.xy, TEMP1.xz, TEMP1.yw mov xvector.zw, CONST_0 mul TEMP1.xyzw, TEMP0.xzyx, yvector.xyxy add yvector.xy, TEMP1.xz, TEMP1.yw mov yvector.zw, CONST_0 endif nop endif // ここまでで、xvector, yvectorにはビュー座標系でポリゴンの基底ベクトルが入っています。 // 方形なので、中心点+基底ベクトルで実際の形状が表され、ジオメトリシェーダで計算されます。 // 中心位置をView座標に mov TEMP_POSI.w, CONST_1 add TEMP_POSI.xyz, nw_position, nw_position_offset._XYZW dp4 WRLD_POSI.x, TEMP_POSI, uModel[0]._XYZW dp4 WRLD_POSI.y, TEMP_POSI, uModel[1]._XYZW dp4 WRLD_POSI.z, TEMP_POSI, uModel[2]._XYZW mov WRLD_POSI.w, CONST_1 dp4 TEMP_VIEW.x, WRLD_POSI, nw_world_to_view_matrix[0]._XYZW dp4 TEMP_VIEW.y, WRLD_POSI, nw_world_to_view_matrix[1]._XYZW dp4 TEMP_VIEW.z, WRLD_POSI, nw_world_to_view_matrix[2]._XYZW mov TEMP_VIEW.w, CONST_1 // 基底ベクトルのオフセットによる移動を加算 mul TEMP0, xvector, uOffset.x mul TEMP1, yvector, uOffset.y add TEMP_VIEW.xyz, TEMP_VIEW, -TEMP0 add TEMP_VIEW.xyz, TEMP_VIEW, -TEMP1 // Quaternion mov o_Quaternion.xyzw, CONST_0 // View mov o_View, -TEMP_VIEW // 位置(中心) dp4 o_Position.x, TEMP_VIEW, nw_projection_matrix[0]._XYZW dp4 o_Position.y, TEMP_VIEW, nw_projection_matrix[1]._XYZW dp4 o_Position.z, TEMP_VIEW, nw_projection_matrix[2]._XYZW dp4 o_Position.w, TEMP_VIEW, nw_projection_matrix[3]._XYZW // カラー・アルファ mov o_Color.xyz, aColor.xyz mov o_Color.w, aAlpha.x // テクスチャ座標 mul TEMP0, aTextureRotate, CONST_1__2PI flr TEMP1, TEMP0 add TEMP3, TEMP0, -TEMP1 // TEMP3.xのsinがTEMP0.yに、cosがTEMP0.xに入ります。 mov TEMP1, sincos_table[2] mov TEMP2, sincos_table[1] mul TEMP0.z, TEMP3.x, TEMP3.x mad TEMP0.xy, TEMP0.z, TEMP1.xy, TEMP1.zw mad TEMP0.xy, TEMP0.z, TEMP0.xy, TEMP2.xy mad TEMP0.xy, TEMP0.z, TEMP0.xy, TEMP2.zw mov TEMP1, sincos_table[0] mad TEMP0.xy, TEMP0.z, TEMP0.xy, TEMP1.xy mad TEMP0.xy, TEMP0.z, TEMP0.xy, TEMP1.zw mul TEMP0.y, TEMP0.y, TEMP3.x mad TEMP0.x, TEMP0.z, TEMP0.x, CONST_1 mul TEMP1.xyzw, aTextureScale.xyxy, TEMP0.yxxy // TEMP1.xyzw = scaleXsin,scaleYcos, scaleXcos, scaleYsin mov TEMP1.x, -TEMP1.x add TEMP2.x, -aTextureTranslate.x, -CONST_HALF add TEMP2.y, aTextureTranslate.y, -CONST_HALF mul TEMP0.xyzw, TEMP1.xyzw, TEMP2.yyxx add TEMP2.xy, TEMP0.xy, CONST_HALF add TEMP0.xy, TEMP0.zw, TEMP2.xy // テクスチャ座標の基準点 mov TEMP2.xy, TEMP0 mov TEMP2.zw, CONST_0_0_0_1 dp4 TEMP0.x, TEMP2, nw_texture_matrix0[0]._XYZW dp4 TEMP0.y, TEMP2, nw_texture_matrix0[1]._XYZW dp4 TEMP0.z, TEMP2, nw_texture_matrix0[2]._XYZW mov o4, TEMP0 // テクスチャ座標の基底ベクトル1 mov TEMP2.xy, TEMP1.xy dp3 TEMP0.x, TEMP2, nw_texture_matrix0[0]._XYZ dp3 TEMP0.y, TEMP2, nw_texture_matrix0[1]._XYZ mov o5.xy, TEMP0.xy // テクスチャ座標の基底ベクトル2 mov TEMP2.xy, TEMP1.zw dp3 TEMP0.x, TEMP2, nw_texture_matrix0[0]._XYZ dp3 TEMP0.y, TEMP2, nw_texture_matrix0[1]._XYZ mov o5.zw, TEMP0.xxxy // ポリゴンの基底ベクトル1 add TEMP0.xyz, xvector.xyz, yvector.xyz dp3 o6.x, TEMP0, nw_projection_matrix[0]._XYZ dp3 o6.y, TEMP0, nw_projection_matrix[1]._XYZ dp3 o6.z, TEMP0, nw_projection_matrix[2]._XYZ dp3 o6.w, TEMP0, nw_projection_matrix[3]._XYZ // ポリゴンの基底ベクトル2 add TEMP0.xyz, xvector.xyz, -yvector.xyz dp3 o7.x, TEMP0, nw_projection_matrix[0]._XYZ dp3 o7.y, TEMP0, nw_projection_matrix[1]._XYZ dp3 o7.z, TEMP0, nw_projection_matrix[2]._XYZ dp3 o7.w, TEMP0, nw_projection_matrix[3]._XYZ end endmain: