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