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