// --------------------------------------------------------------------------- // Project: NintendoWare // File: Common.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:$ // --------------------------------------------------------------------------- #include "ShaderConfig.h" #include "VertexShader.h" defb b0, true //============================================================================= //------------------------------------------------------------ // Copyright(c) 2009-2010 by Digital Media Professionals Inc. // All rights reserved. //------------------------------------------------------------ // This source code is the confidential and proprietary // of Digital Media Professionals Inc. //------------------------------------------------------------ //----------------------------------------------------------------------------- // @brief 内部用:法線からクォータニオンを求めます。 //----------------------------------------------------------------------------- l_internal_calc_quaternion_from_normal: // 法線正規化 dp3 TEMP6.x, TEMP_NORM, TEMP_NORM dp3 TEMP7.x, WRLD_NORM, WRLD_NORM rsq TEMP6.x, TEMP6.x rsq TEMP7.x, TEMP7.x mul TEMP_NORM.xyz, TEMP_NORM.xyz, TEMP6.x mul WRLD_NORM.xyz, WRLD_NORM.xyz, TEMP7.x mov TEMP_QUAT, CONST_1_0_0_0 jpb nw_is_quaternion_enabled, false, l_internal_calc_quaternion_from_normal_end add r4, TEMP_NORM.z, CONST_1 // n.z + 1.0 is in r4 mul r4, r4, CONST_HALF // 0.5*(n.z + 1.0) is in r4 cmp LEQ, LEQ, r4.x, CONST_0 // compare 0.5*(n.z + 1.0) with 0.0 rsq r4, r4.x // 1/sqrt(0.5*(n.z + 1.0)) is in r4 mul r5, TEMP_NORM, CONST_HALF // 0.5*n is in r5 jpc 1, 1, COND_MODE_STA0, l_internal_calc_quaternion_from_normal_end rcp TEMP_QUAT.z, r4.x // sqrt(0.5*(n.z + 1.0)) is in quat.z component mul TEMP_QUAT.xy, r5, r4 // 0.5*n*quat.z is in quat.xy l_internal_calc_quaternion_from_normal_end: mov o_Quaternion, TEMP_QUAT ret //----------------------------------------------------------------------------- // @brief 内部用:タンジェントからクォータニオンを求めます。 //----------------------------------------------------------------------------- l_internal_calc_quaternion_from_tangent: // 法線・接線正規化 dp3 TEMP6.x, TEMP_NORM, TEMP_NORM dp3 TEMP7.x, WRLD_NORM, WRLD_NORM rsq TEMP6.x, TEMP6.x rsq TEMP7.x, TEMP7.x mul TEMP_NORM.xyz, TEMP_NORM.xyz, TEMP6.x mul WRLD_NORM.xyz, WRLD_NORM.xyz, TEMP7.x mul TEMP_TANG.xyz, TEMP_TANG.xyz, TEMP6.x mul WRLD_TANG.xyz, WRLD_TANG.xyz, TEMP7.x mov TEMP_QUAT, CONST_1_0_0_0 jpb nw_is_quaternion_enabled, false, l_full_quaternion_calc_end mul TEMP_TANG.xyz, TEMP_TANG.xyz, TEMP6.x mul WRLD_TANG.xyz, WRLD_TANG.xyz, TEMP7.x mul r5, TEMP_NORM.yzx, TEMP_TANG.zxy mad r5, -TEMP_TANG.yzx, TEMP_NORM.zxy, r5 // b*|n|^2 is in r5 dp3 r5.w, r5, r5 rsq r5.w, r5.w mul r5, r5, r5.w add r6.w, TEMP_NORM.z, r5.y mul TEMP_TANG, r5.yzx, TEMP_NORM.zxy mad TEMP_TANG, -TEMP_NORM.yzx, r5.zxy, TEMP_TANG add r6.w, TEMP_TANG.x, r6 mov TEMP_TANG.w, r5.z mov r5.z, TEMP_TANG.x add r6.w, CONST_1, r6 mov TEMP_NORM.w, r5.x mov r5.x, TEMP_NORM.z cmp GT, GT, r6.w, CONST_1__256 mov r6.x, CONST_1 mov r6.y, -CONST_1 jpc 0, 0, COND_MODE_STA0, l_full_quaternion_calc_fallback add r7.xz, TEMP_TANG.wwyy, -TEMP_NORM.yyww add r7.y, TEMP_NORM.x, -TEMP_TANG.z mov r7.w, r6 dp4 r6, r7, r7 rsq r6, r6.x mul TEMP_QUAT, r7, r6 jpb b0, true, l_full_quaternion_calc_end l_full_quaternion_calc_fallback: cmp GT, GT, r5.zy, r5.yx ifc 1, 1, COND_MODE_STA0 ifc 1, 1, COND_MODE_STA1 mul r8, TEMP_TANG.yyzw, r6.xxxy add r8.x, CONST_1, -r5.y add r9, r5.z, -r5.x add r8.yzw, r8, TEMP_NORM.wwxy add r8.x, r9, r8 else cmp GT, GT, r5.z, r5.x mul r8, TEMP_TANG.yyzw, r6.xxxy add r8.x, CONST_1, -r5.y ifc 1, 1, COND_MODE_STA0 add r9, r5.z, -r5.x add r8.yzw, r8, TEMP_NORM.wwxy add r8.x, r9, r8 else mul r8, TEMP_TANG.zwwy, r6.xxxy add r8.z, CONST_1, -r5.z add r9, r5.x, -r5.y add r8.xyw, r8, TEMP_NORM.xyyw add r8.z, r9, r8 endif nop endif mov r8.w, -r8 else ifc 1, 1, COND_MODE_STA1 mul r8, TEMP_TANG.yywz, r6.xxxy add r8.y, CONST_1, -r5.z add r9, r5.y, -r5.x add r8.xzw, r8, TEMP_NORM.wwyx add r8.y, r9, r8 else mul r8, TEMP_TANG.zwwy, r6.xxxy add r8.z, CONST_1, -r5.z add r9, r5.x, -r5.y add r8.xyw, r8, TEMP_NORM.xyyw add r8.z, r9, r8 mov r8.w, -r8 endif nop endif dp4 r6, r8, r8 rsq r6, r6.x mul TEMP_QUAT, r8, r6 l_full_quaternion_calc_end: mov o_Quaternion, TEMP_QUAT ret