1// ---------------------------------------------------------------------------
2//  Project:  NintendoWare
3//  File:     CalcVertexLighting.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
19//-----------------------------------------------------------------------------
20// @brief        ���_���C�e�B���O���v�Z�� TEMP_COLO �Ɍ��ʂ������܂��B
21//-----------------------------------------------------------------------------
22l_calc_vertex_lighting:
23    mov      TEMP1,          nw_material_ambient._XYZW
24    mov      TEMP2,          nw_material_diffuse._XYZW
25    mov      TEMP3,          CONST_0
26    loop nw_vertex_light_count // ���[�v���ł�TEMP1,2,3�͎g�p�s��
27    mova     a0.x,           TEMP3
28    mov      TEMP4.x,        VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_POSITION + a0.x)._W
29    mov      TEMP4.y,        VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_DISTANCE_ATTENUATION + a0.x)._W
30    cmp      EQ, EQ,       TEMP4.xy,  CONST_0_1_1_1
31    ifc 1, 0, COND_MODE_STA0 // �f�B���N�V���i�����C�g�̏ꍇ
32        dp3      TEMP6.x,      TEMP_NORM,    VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_POSITION + a0.x)._XYZW
33        mov      TEMP6.y,      CONST_1
34    else // �|�C���g���C�g�E�X�|�b�g���C�g
35        // ���C�g�x�N�g�������߂�
36        sub      TEMP4,          VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_POSITION + a0.x)._XYZW, TEMP_POSI
37        mov      TEMP6.y,        CONST_1
38        ifc 0, 1, COND_MODE_STA1 // �����������s���ꍇ
39            mov      TEMP5.x,        CONST_1
40            dp3      TEMP5.z,        TEMP4,        TEMP4
41            mul      TEMP5.y,        TEMP5.z,      TEMP5.z
42            dp3      TEMP6.y,        TEMP5,        VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_DISTANCE_ATTENUATION + a0.x)._XYZW
43            rcp      TEMP6.y,        TEMP6.y
44        endif
45        mov      TEMP5,      VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_SPOT_DIRECTION + a0.x)._XYZW
46        cmp      EQ, EQ,     TEMP5.ww,     CONST_1
47        // ���C�g�x�N�g�����K��
48        dp3      TEMP4.w,    TEMP4,        TEMP4
49        rsq      TEMP4.w,    TEMP4.w
50        mul      TEMP4,      TEMP4,        TEMP4.w
51        ifc 1, 0, COND_MODE_STA0 // �p�x�������s���ꍇ
52            dp3      TEMP5.x,     -TEMP4,        VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_SPOT_DIRECTION + a0.x)._XYZW
53            slt      TEMP5.y,      TEMP5.x,      VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_SPOT_FACTOR + a0.x)._Y
54            cmp      EQ, EQ,       TEMP5.xy,   CONST_1
55            ifc 0, 1, COND_MODE_STA1
56                mov     TEMP5.x,        CONST_0
57            else
58                log     TEMP5.y,        TEMP5.x
59                mul     TEMP5.y,        TEMP5.y,        VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_SPOT_FACTOR + a0.x)._X
60                exp     TEMP5.x,        TEMP5.y
61            endif
62            mul      TEMP6.y,      TEMP6.y,      TEMP5.x
63        endif
64        dp3      TEMP6.x,    TEMP_NORM,    TEMP4
65    endif
66    // TEMP6.x�ɂ͖@���ƃ��C�g�x�N�g���̓��ρATEMP6.y�ɂ͌����W���������Ă���
67    cmp      EQ, GT,       TEMP6.xy,  CONST_0
68    ifc 0, 1, COND_MODE_STA1 // �����W�����O�ȉ��̏ꍇ�̓��C�g�̉e�����Ȃ�
69        max      TEMP6.x,        TEMP6.x,           CONST_0
70        mad      TEMP_COLO.xyz,  TEMP1.xyz,         VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_AMBIENT + a0.x)._XYZ,  TEMP_COLO.xyz
71        mul      TEMP4,          TEMP2,             VERTEX_LIGHT_UNIFORM(VERTEX_LIGHT_DIFFUSE + a0.x)._XYZW
72        mul      TEMP5.xyz,      TEMP6.xxx,         TEMP4.xyz
73        mul      TEMP5.xyz,      TEMP6.yyy,         TEMP5.xyz
74        add      TEMP_COLO.xyz,  TEMP_COLO.xyz,     TEMP5.xyz
75        add      TEMP_COLO.w,    TEMP_COLO.w,       TEMP4.w
76    endif
77    sub      TEMP3,          TEMP3,             CONST_6
78    endloop
79    mov     TEMP_STUS.x,        CONST_1
80    ret
81