1 /*---------------------------------------------------------------------------*
2   Project:  Dolphin GD library
3   File:     GDLIGHT.h
4 
5   Copyright 2001 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: GDLight.h,v $
14   Revision 1.2  2006/02/04 11:56:46  hashida
15   (none)
16 
17   Revision 1.1.1.1  2005/05/12 02:41:07  yasuh-to
18   Ported from dolphin source tree.
19 
20 
21     3     2002/04/30 4:17p Dante
22     Added "extern int __cntlzw (int) ;" for SN support
23 
24     2     2001/09/17 9:33p Hirose
25     Changes regarding specular light APIs.
26 
27     1     2001/09/12 1:55p Carl
28     Initial revision of GD: Graphics Display List Library.
29 
30   $NoKeywords: $
31  *---------------------------------------------------------------------------*/
32 
33 #ifndef __GDLIGHT_H__
34 #define __GDLIGHT_H__
35 
36 /*---------------------------------------------------------------------------*/
37 #include <revolution/types.h>
38 #include <revolution/gx/GXEnum.h>
39 #include <revolution/gx/GXStruct.h>
40 /*---------------------------------------------------------------------------*/
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 #ifdef __SN__
47 extern int __cntlzw (int) ;
48 #endif
49 
50 /*---------------------------------------------------------------------------*/
51 
52 // GD does not support manipulation of light objects
53 // (the only exception is for loading indexed light objects).
54 // GX can be used to manipulate light objects.
55 // If you wish to create light objects manually, here is the format:
56 //
57 // typedef struct __GXLightObj {
58 //     u32     reserved[3];
59 //     u32     Color;       // light color
60 //     f32     a[3];        // angle-attenuation coefficients
61 //     f32     k[3];        // distance-attenuation coefficients
62 //     f32     lpos[3];     // diffuse: position;  specular: direction
63 //     f32     ldir[3];     // diffuse: direction; specular: half-angle
64 // } GXLightObj;
65 //
66 // If you plan to create light objects on the PC, be sure to do the
67 // necessary byte-swapping for the EPPC environment.
68 
69 /*---------------------------------------------------------------------------*/
70 
71 // This first group of APIs lets you set light values directly.
72 
73 void GDSetLightAttn     ( GXLightID light,
74                           f32 a0, f32 a1, f32 a2,
75                           f32 k0, f32 k1, f32 k2 );
76 
77 void GDSetLightSpot     ( GXLightID     light,
78                           f32           cutoff,
79                           GXSpotFn      spot_func );
80 
81 void GDSetLightDistAttn ( GXLightID     light,
82                           f32           ref_distance,
83                           f32           ref_brightness,
84                           GXDistAttnFn  dist_func );
85 
86 void GDSetLightColor 	( GXLightID light, GXColor color );
87 
88 void GDSetLightPos      ( GXLightID light, f32 x, f32 y, f32 z );
89 
90 void GDSetLightDir 	    ( GXLightID light, f32 nx, f32 ny, f32 nz );
91 
92 void GDSetSpecularDir   ( GXLightID light, f32 nx, f32 ny, f32 nz );
93 
94 void GDSetSpecularDirHA ( GXLightID light, f32 nx, f32 ny, f32 nz, f32 hx, f32 hy, f32 hz );
95 
96 
97 // This function lets you load an indexed light object.
98 // Note that GD doesn't provide a way to load an immediate light object.
99 void GDLoadLightObjIndx	( u32 lt_obj_indx, GXLightID light );
100 
101 // Other lighting control and data registers:
102 
103 void GDSetChanAmbColor 	( GXChannelID chan, GXColor amb_color );
104 
105 void GDSetChanMatColor	( GXChannelID chan, GXColor mat_color );
106 
107 void GDSetChanCtrl      ( GXChannelID   chan,
108                           GXBool        enable,
109                           GXColorSrc    amb_src,
110                           GXColorSrc    mat_src,
111                           u32           light_mask,
112                           GXDiffuseFn   diff_fn,
113                           GXAttnFn      attn_fn );
114 
115 /*---------------------------------------------------------------------------*/
116 
GDSetLightShininess(GXLightID light,f32 shininess)117 static inline void GDSetLightShininess( GXLightID light, f32 shininess )
118 {
119     GDSetLightAttn( light, 0.0F, 0.0F, 1.0F,
120                     shininess/2.0F, 0.0F, 1.0F-shininess/2.0F );
121 }
122 
123 /*---------------------------------------------------------------------------*/
124 
125 // Convert a GXLightID into a light number.  Note: little error checking.
126 
__GDLightID2Index(GXLightID id)127 static inline u16 __GDLightID2Index( GXLightID id )
128 {
129     u16 idx;
130 #ifdef EPPC
131     idx = (u16) (31 - __cntlzw((u32)id));
132     if (idx > 7)
133     {
134         idx = 0;
135     }
136 #else
137     switch (id) {
138         case GX_LIGHT0: idx = 0;    break;
139         case GX_LIGHT1: idx = 1;    break;
140         case GX_LIGHT2: idx = 2;    break;
141         case GX_LIGHT3: idx = 3;    break;
142         case GX_LIGHT4: idx = 4;    break;
143         case GX_LIGHT5: idx = 5;    break;
144         case GX_LIGHT6: idx = 6;    break;
145         case GX_LIGHT7: idx = 7;    break;
146         default:
147             idx = 0;
148             break;
149     }
150 #endif
151     return idx;
152 }
153 
__GDLightID2Offset(GXLightID id)154 static inline u16 __GDLightID2Offset( GXLightID id )
155 {
156     // 0x10 is XF_LIGHT_SIZE, defined below
157     return (u16) (__GDLightID2Index(id) * 0x10);
158 }
159 
160 /*---------------------------------------------------------------------------*/
161 
162 // Defines for setting XF registers...
163 
164 /*
165  *  xf_ambient0_f struct
166  */
167 #define XF_AMBIENT0_ALPHA_SHIFT	0
168 #define XF_AMBIENT0_BLUE_SHIFT	8
169 #define XF_AMBIENT0_GREEN_SHIFT	16
170 #define XF_AMBIENT0_RED_SHIFT	24
171 #define XF_AMBIENT0_F(alpha, blue, green, red) \
172 	((((unsigned long)(alpha)) << XF_AMBIENT0_ALPHA_SHIFT) | \
173 	 (((unsigned long)(blue)) << XF_AMBIENT0_BLUE_SHIFT) | \
174 	 (((unsigned long)(green)) << XF_AMBIENT0_GREEN_SHIFT) | \
175 	 (((unsigned long)(red)) << XF_AMBIENT0_RED_SHIFT))
176 
177 /*
178  *  xf_material0_f struct
179  */
180 #define XF_MATERIAL0_ALPHA_SHIFT	0
181 #define XF_MATERIAL0_BLUE_SHIFT	8
182 #define XF_MATERIAL0_GREEN_SHIFT	16
183 #define XF_MATERIAL0_RED_SHIFT	24
184 #define XF_MATERIAL0_F(alpha, blue, green, red) \
185 	((((unsigned long)(alpha)) << XF_MATERIAL0_ALPHA_SHIFT) | \
186 	 (((unsigned long)(blue)) << XF_MATERIAL0_BLUE_SHIFT) | \
187 	 (((unsigned long)(green)) << XF_MATERIAL0_GREEN_SHIFT) | \
188 	 (((unsigned long)(red)) << XF_MATERIAL0_RED_SHIFT))
189 
190 /*
191  *  xf_color0cntrl_f struct
192  */
193 #define XF_COLOR0CNTRL_MATERIAL_SRC_SHIFT	0
194 #define XF_COLOR0CNTRL_LIGHTFUNC_SHIFT	1
195 #define XF_COLOR0CNTRL_LIGHT0_SHIFT	2
196 #define XF_COLOR0CNTRL_LIGHT1_SHIFT	3
197 #define XF_COLOR0CNTRL_LIGHT2_SHIFT	4
198 #define XF_COLOR0CNTRL_LIGHT3_SHIFT	5
199 #define XF_COLOR0CNTRL_AMBIENT_SRC_SHIFT	6
200 #define XF_COLOR0CNTRL_DIFFUSEATTEN_SHIFT	7
201 #define XF_COLOR0CNTRL_ATTENENABLE_SHIFT	9
202 #define XF_COLOR0CNTRL_ATTENSELECT_SHIFT	10
203 #define XF_COLOR0CNTRL_LIGHT4_SHIFT	11
204 #define XF_COLOR0CNTRL_LIGHT5_SHIFT	12
205 #define XF_COLOR0CNTRL_LIGHT6_SHIFT	13
206 #define XF_COLOR0CNTRL_LIGHT7_SHIFT	14
207 #define XF_COLOR0CNTRL_F(material_src, lightfunc, light0, light1, light2, light3, ambient_src, diffuseatten, attenenable, attenselect, light4, light5, light6, light7) \
208 	((((unsigned long)(material_src)) << XF_COLOR0CNTRL_MATERIAL_SRC_SHIFT) | \
209 	 (((unsigned long)(lightfunc)) << XF_COLOR0CNTRL_LIGHTFUNC_SHIFT) | \
210 	 (((unsigned long)(light0)) << XF_COLOR0CNTRL_LIGHT0_SHIFT) | \
211 	 (((unsigned long)(light1)) << XF_COLOR0CNTRL_LIGHT1_SHIFT) | \
212 	 (((unsigned long)(light2)) << XF_COLOR0CNTRL_LIGHT2_SHIFT) | \
213 	 (((unsigned long)(light3)) << XF_COLOR0CNTRL_LIGHT3_SHIFT) | \
214 	 (((unsigned long)(ambient_src)) << XF_COLOR0CNTRL_AMBIENT_SRC_SHIFT) | \
215 	 (((unsigned long)(diffuseatten)) << XF_COLOR0CNTRL_DIFFUSEATTEN_SHIFT) | \
216 	 (((unsigned long)(attenenable)) << XF_COLOR0CNTRL_ATTENENABLE_SHIFT) | \
217 	 (((unsigned long)(attenselect)) << XF_COLOR0CNTRL_ATTENSELECT_SHIFT) | \
218 	 (((unsigned long)(light4)) << XF_COLOR0CNTRL_LIGHT4_SHIFT) | \
219 	 (((unsigned long)(light5)) << XF_COLOR0CNTRL_LIGHT5_SHIFT) | \
220 	 (((unsigned long)(light6)) << XF_COLOR0CNTRL_LIGHT6_SHIFT) | \
221 	 (((unsigned long)(light7)) << XF_COLOR0CNTRL_LIGHT7_SHIFT))
222 
223 #define XF_COLOR0CNTRL_F_PS(material_src, lightfunc, light3210, ambient_src, diffuseatten, attenenable, attenselect, light7654) \
224 	((((unsigned long)(material_src)) << XF_COLOR0CNTRL_MATERIAL_SRC_SHIFT) | \
225 	 (((unsigned long)(lightfunc)) << XF_COLOR0CNTRL_LIGHTFUNC_SHIFT) | \
226 	 (((unsigned long)(light3210)) << XF_COLOR0CNTRL_LIGHT0_SHIFT) | \
227 	 (((unsigned long)(ambient_src)) << XF_COLOR0CNTRL_AMBIENT_SRC_SHIFT) | \
228 	 (((unsigned long)(diffuseatten)) << XF_COLOR0CNTRL_DIFFUSEATTEN_SHIFT) | \
229 	 (((unsigned long)(attenenable)) << XF_COLOR0CNTRL_ATTENENABLE_SHIFT) | \
230 	 (((unsigned long)(attenselect)) << XF_COLOR0CNTRL_ATTENSELECT_SHIFT) | \
231 	 (((unsigned long)(light7654)) << XF_COLOR0CNTRL_LIGHT4_SHIFT))
232 
233 /*
234  *  XF register addresses (XF address space)
235  */
236 #define XF_LIGHT_BASE_ID	0x0600
237 #define XF_LIGHT_SIZE	0x0010
238 
239 #define XF_LIGHT0COLOR_ID	0x0603
240 #define XF_LIGHT0A0_ID	0x0604
241 #define XF_LIGHT0A1_ID	0x0605
242 #define XF_LIGHT0A2_ID	0x0606
243 #define XF_LIGHT0K0_ID	0x0607
244 #define XF_LIGHT0K1_ID	0x0608
245 #define XF_LIGHT0K2_ID	0x0609
246 #define XF_LIGHT0PX_ID	0x060a
247 #define XF_LIGHT0PY_ID	0x060b
248 #define XF_LIGHT0PZ_ID	0x060c
249 #define XF_LIGHT0DX_ID	0x060d
250 #define XF_LIGHT0DY_ID	0x060e
251 #define XF_LIGHT0DZ_ID	0x060f
252 
253 #define XF_LIGHT0SDX_ID	0x060a
254 #define XF_LIGHT0SDY_ID	0x060b
255 #define XF_LIGHT0SDZ_ID	0x060c
256 #define XF_LIGHT0HX_ID	0x060d
257 #define XF_LIGHT0HY_ID	0x060e
258 #define XF_LIGHT0HZ_ID	0x060f
259 
260 #define XF_AMBIENT0_ID	0x100a
261 #define XF_AMBIENT1_ID	0x100b
262 #define XF_MATERIAL0_ID	0x100c
263 #define XF_MATERIAL1_ID	0x100d
264 #define XF_COLOR0CNTRL_ID	0x100e
265 #define XF_COLOR1CNTRL_ID	0x100f
266 #define XF_ALPHA0CNTRL_ID	0x1010
267 #define XF_ALPHA1CNTRL_ID	0x1011
268 
269 /*---------------------------------------------------------------------------*/
270 #ifdef __cplusplus
271 }
272 #endif
273 
274 #endif // __GDLIGHT_H__
275