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