1// --------------------------------------------------------------------------- 2// Project: NintendoWare 3// File: Common.vsh 4// 5// Copyright (C)2009-2010 Nintendo Co., Ltd. All rights reserved. 6// 7// These coded instructions, statements, and computer programs contain 8// proprietary information of Nintendo of America Inc. and/or Nintendo 9// Company Ltd., and are protected by Federal copyright law. They may 10// not be disclosed to third parties or copied or duplicated in any form, 11// in whole or in part, without the prior written consent of Nintendo. 12// 13// $Revision:$ 14// --------------------------------------------------------------------------- 15 16#include "ShaderConfig.h" 17#include "VertexShader.h" 18 19defb b0, true 20 21//============================================================================= 22//------------------------------------------------------------ 23// Copyright(c) 2009-2010 by Digital Media Professionals Inc. 24// All rights reserved. 25//------------------------------------------------------------ 26// This source code is the confidential and proprietary 27// of Digital Media Professionals Inc. 28//------------------------------------------------------------ 29 30//----------------------------------------------------------------------------- 31// @brief �����p�F�@������N�H�[�^�j�I�������߂܂��B 32//----------------------------------------------------------------------------- 33l_internal_calc_quaternion_from_normal: 34 // �@�����K�� 35 dp3 TEMP6.x, TEMP_NORM, TEMP_NORM 36 dp3 TEMP7.x, WRLD_NORM, WRLD_NORM 37 rsq TEMP6.x, TEMP6.x 38 rsq TEMP7.x, TEMP7.x 39 mul TEMP_NORM.xyz, TEMP_NORM.xyz, TEMP6.x 40 mul WRLD_NORM.xyz, WRLD_NORM.xyz, TEMP7.x 41 mov TEMP_QUAT, CONST_1_0_0_0 42 jpb nw_is_quaternion_enabled, false, l_internal_calc_quaternion_from_normal_end 43 add r4, TEMP_NORM.z, CONST_1 // n.z + 1.0 is in r4 44 mul r4, r4, CONST_HALF // 0.5*(n.z + 1.0) is in r4 45 cmp LEQ, LEQ, r4.x, CONST_0 // compare 0.5*(n.z + 1.0) with 0.0 46 rsq r4, r4.x // 1/sqrt(0.5*(n.z + 1.0)) is in r4 47 mul r5, TEMP_NORM, CONST_HALF // 0.5*n is in r5 48 jpc 1, 1, COND_MODE_STA0, l_internal_calc_quaternion_from_normal_end 49 rcp TEMP_QUAT.z, r4.x // sqrt(0.5*(n.z + 1.0)) is in quat.z component 50 mul TEMP_QUAT.xy, r5, r4 // 0.5*n*quat.z is in quat.xy 51l_internal_calc_quaternion_from_normal_end: 52 mov o_Quaternion, TEMP_QUAT 53 ret 54 55//----------------------------------------------------------------------------- 56// @brief �����p�F�^���W�F���g����N�H�[�^�j�I�������߂܂��B 57//----------------------------------------------------------------------------- 58l_internal_calc_quaternion_from_tangent: 59 // �@���E�ڐ����K�� 60 dp3 TEMP6.x, TEMP_NORM, TEMP_NORM 61 dp3 TEMP7.x, WRLD_NORM, WRLD_NORM 62 rsq TEMP6.x, TEMP6.x 63 rsq TEMP7.x, TEMP7.x 64 mul TEMP_NORM.xyz, TEMP_NORM.xyz, TEMP6.x 65 mul WRLD_NORM.xyz, WRLD_NORM.xyz, TEMP7.x 66 mul TEMP_TANG.xyz, TEMP_TANG.xyz, TEMP6.x 67 mul WRLD_TANG.xyz, WRLD_TANG.xyz, TEMP7.x 68 mov TEMP_QUAT, CONST_1_0_0_0 69 jpb nw_is_quaternion_enabled, false, l_full_quaternion_calc_end 70 mul TEMP_TANG.xyz, TEMP_TANG.xyz, TEMP6.x 71 mul WRLD_TANG.xyz, WRLD_TANG.xyz, TEMP7.x 72 mul r5, TEMP_NORM.yzx, TEMP_TANG.zxy 73 mad r5, -TEMP_TANG.yzx, TEMP_NORM.zxy, r5 // b*|n|^2 is in r5 74 dp3 r5.w, r5, r5 75 rsq r5.w, r5.w 76 mul r5, r5, r5.w 77 add r6.w, TEMP_NORM.z, r5.y 78 mul TEMP_TANG, r5.yzx, TEMP_NORM.zxy 79 mad TEMP_TANG, -TEMP_NORM.yzx, r5.zxy, TEMP_TANG 80 add r6.w, TEMP_TANG.x, r6 81 mov TEMP_TANG.w, r5.z 82 mov r5.z, TEMP_TANG.x 83 add r6.w, CONST_1, r6 84 mov TEMP_NORM.w, r5.x 85 mov r5.x, TEMP_NORM.z 86 cmp GT, GT, r6.w, CONST_1__256 87 mov r6.x, CONST_1 88 mov r6.y, -CONST_1 89 jpc 0, 0, COND_MODE_STA0, l_full_quaternion_calc_fallback 90 add r7.xz, TEMP_TANG.wwyy, -TEMP_NORM.yyww 91 add r7.y, TEMP_NORM.x, -TEMP_TANG.z 92 mov r7.w, r6 93 dp4 r6, r7, r7 94 rsq r6, r6.x 95 mul TEMP_QUAT, r7, r6 96 jpb b0, true, l_full_quaternion_calc_end 97l_full_quaternion_calc_fallback: 98 cmp GT, GT, r5.zy, r5.yx 99 ifc 1, 1, COND_MODE_STA0 100 ifc 1, 1, COND_MODE_STA1 101 mul r8, TEMP_TANG.yyzw, r6.xxxy 102 add r8.x, CONST_1, -r5.y 103 add r9, r5.z, -r5.x 104 add r8.yzw, r8, TEMP_NORM.wwxy 105 add r8.x, r9, r8 106 else 107 cmp GT, GT, r5.z, r5.x 108 mul r8, TEMP_TANG.yyzw, r6.xxxy 109 add r8.x, CONST_1, -r5.y 110 ifc 1, 1, COND_MODE_STA0 111 add r9, r5.z, -r5.x 112 add r8.yzw, r8, TEMP_NORM.wwxy 113 add r8.x, r9, r8 114 else 115 mul r8, TEMP_TANG.zwwy, r6.xxxy 116 add r8.z, CONST_1, -r5.z 117 add r9, r5.x, -r5.y 118 add r8.xyw, r8, TEMP_NORM.xyyw 119 add r8.z, r9, r8 120 endif 121 nop 122 endif 123 mov r8.w, -r8 124 else 125 ifc 1, 1, COND_MODE_STA1 126 mul r8, TEMP_TANG.yywz, r6.xxxy 127 add r8.y, CONST_1, -r5.z 128 add r9, r5.y, -r5.x 129 add r8.xzw, r8, TEMP_NORM.wwyx 130 add r8.y, r9, r8 131 else 132 mul r8, TEMP_TANG.zwwy, r6.xxxy 133 add r8.z, CONST_1, -r5.z 134 add r9, r5.x, -r5.y 135 add r8.xyw, r8, TEMP_NORM.xyyw 136 add r8.z, r9, r8 137 mov r8.w, -r8 138 endif 139 nop 140 endif 141 dp4 r6, r8, r8 142 rsq r6, r6.x 143 mul TEMP_QUAT, r8, r6 144l_full_quaternion_calc_end: 145 mov o_Quaternion, TEMP_QUAT 146 ret 147