1 /*---------------------------------------------------------------------------*
2   Project:  Dolphin GX library
3   File:     GXLighting.h
4 
5   Copyright 1998- 2002 Nintendo. 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   $Log: GXLighting.h,v $
14   Revision 1.2  2006/02/04 11:56:46  hashida
15   (none)
16 
17   Revision 1.1.1.1  2005/12/29 06:53:28  hiratsu
18   Initial import.
19 
20   Revision 1.1.1.1  2005/05/12 02:41:07  yasuh-to
21   Ported from dolphin source tree.
22 
23 
24     10    2002/07/24 9:07 Hirose
25     Resolved version conflicts.
26 
27     10    2002/04/09 15:15 Hirose
28     const type specifier support. (worked by hiratsu@IRD)
29 
30     9     2001/10/03 9:33a Hirose
31     Fixed GXInitSpecularDirHAv macro again.
32 
33     8     2000/08/21 4:44p Hirose
34     Fixed GXInitSpecularDirHAv macro
35 
36     7     2000/08/21 11:36a Hirose
37     Deleted GXInitSpecularHA / added GXInitSpecluarDirHA instead
38 
39     6     2000/05/12 6:04p Hirose
40     Changed definition of GXInit*v macros
41 
42     5     2000/04/10 3:09p Alligator
43     Removed GXInitSpecularHAv macro
44 
45     4     2000/02/12 5:16p Alligator
46     Integrated ArtX source tree changes
47 
48     3     2000/02/01 7:22p Alligator
49     Second GX update from ArtX
50 
51     2     1999/12/13 4:54p Hirose
52     Added GXInitLightShininess macro
53 
54     9     1999/11/17 4:14p Hirose
55     Added macros for vector type
56 
57     8     1999/10/29 3:35p Hirose
58     Replaced GXSetChannels(GXChannelID) to GXSetNumChans(u8)
59 
60     7     1999/10/28 4:20p Hirose
61     Added GXSetChannels
62 
63     6     1999/10/18 3:49p Hirose
64     Changed the type of light_mask on GXSetChanCtrl to u32
65 
66     5     1999/09/30 10:40p Yasu
67     Renamed some GX functions and enums
68 
69     4     1999/09/09 1:22p Hirose
70     Added GXInitLightSpot() and GXInitLightDistAttn()
71 
72     3     1998/01/05 3:02p Ryan
73     Routine update of header file to match man pages
74 
75     2     1999/07/28 4:07p Alligator
76     Updated header files and emulator for hw changes
77 
78     1     1999/07/14 4:20p Alligator
79     Split gx.h into individual header files for each major section of API
80   $NoKeywords: $
81  *---------------------------------------------------------------------------*/
82 
83 #ifndef __GXLIGHTING_H__
84 #define __GXLIGHTING_H__
85 
86 #ifdef __cplusplus
87 extern "C" {
88 #endif
89 
90 /*---------------------------------------------------------------------------*/
91 #include <revolution/types.h>
92 #include <revolution/gx/GXEnum.h>
93 #include <revolution/gx/GXStruct.h>
94 
95 /*---------------------------------------------------------------------------*/
96 void GXInitLightAttn(
97          GXLightObj*   lt_obj,
98          f32           a0,
99          f32           a1,
100          f32           a2,
101          f32           k0,
102          f32           k1,
103          f32           k2 );
104 
105 void GXInitLightAttnA ( GXLightObj *lt_obj, f32 a0, f32 a1, f32 a2);
106 void GXInitLightAttnK ( GXLightObj *lt_obj, f32 k0, f32 k1, f32 k2 );
107 
108 void GXInitLightSpot(
109          GXLightObj*   lt_obj,
110          f32           cutoff,
111          GXSpotFn      spot_func );
112 
113 void GXInitLightDistAttn(
114          GXLightObj*   lt_obj,
115          f32           ref_distance,
116          f32           ref_brightness,
117          GXDistAttnFn  dist_func );
118 
119 
120 void GXInitLightPos 	( GXLightObj* lt_obj, f32 x, f32 y, f32 z );
121 void GXInitLightColor 	( GXLightObj* lt_obj, GXColor color );
122 void GXLoadLightObjImm 	( const GXLightObj* lt_obj, GXLightID light );
123 void GXLoadLightObjIndx	( u32 lt_obj_indx, GXLightID light );
124 void GXSetChanAmbColor 	( GXChannelID chan, GXColor amb_color );
125 void GXSetChanMatColor	( GXChannelID chan, GXColor mat_color );
126 void GXSetNumChans      ( u8 nChans );
127 
128 void GXInitLightDir 	( GXLightObj* lt_obj, f32 nx, f32 ny, f32 nz );
129 
130 // New functions to set light direction and half-angle.
131 void GXInitSpecularDir 	( GXLightObj* lt_obj, f32 nx, f32 ny, f32 nz );
132 void GXInitSpecularDirHA(
133         GXLightObj* lt_obj,
134         f32         nx,
135         f32         ny,
136         f32         nz,
137         f32         hx,
138         f32         hy,
139         f32         hz );
140 
141 void GXSetChanCtrl(
142         GXChannelID   chan,
143         GXBool        enable,
144         GXColorSrc    amb_src,
145         GXColorSrc    mat_src,
146         u32           light_mask,
147         GXDiffuseFn   diff_fn,
148         GXAttnFn      attn_fn );
149 
150 /*---------------------------------------------------------------------------*/
151 // Convenient Macros
152 
153 #define GXInitLightPosv(lo,vec) \
154     (GXInitLightPos((lo), *(f32*)(vec), *((f32*)(vec)+1), *((f32*)(vec)+2)))
155 
156 #define GXInitLightDirv(lo,vec) \
157     (GXInitLightDir((lo), *(f32*)(vec), *((f32*)(vec)+1), *((f32*)(vec)+2)))
158 
159 #define GXInitSpecularDirv(lo,vec) \
160     (GXInitSpecularDir((lo), *(f32*)(vec), *((f32*)(vec)+1), *((f32*)(vec)+2)))
161 
162 #define GXInitSpecularDirHAv(lo,vec0,vec1) \
163     (GXInitSpecularDirHA((lo), \
164     *(f32*)(vec0), *((f32*)(vec0)+1), *((f32*)(vec0)+2), \
165     *(f32*)(vec1), *((f32*)(vec1)+1), *((f32*)(vec1)+2)))
166 
167 #define GXInitLightShininess(lobj, shininess) \
168     (GXInitLightAttn(lobj, 0.0F, 0.0F, 1.0F,  \
169                     (shininess)/2.0F, 0.0F,   \
170                     1.0F-(shininess)/2.0F ))
171 
172 
173 /*---------------------------------------------------------------------------*/
174 #ifdef __cplusplus
175 }
176 #endif
177 
178 #endif // __GXLIGHTING_H__
179