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