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