citro3d  1.2.0
light.h
Go to the documentation of this file.
1 #pragma once
2 #include "lightlut.h"
3 #include "maths.h"
4 
5 //-----------------------------------------------------------------------------
6 // Material
7 //-----------------------------------------------------------------------------
8 
9 typedef struct
10 {
11  float ambient[3];
12  float diffuse[3];
13  float specular0[3];
14  float specular1[3];
15  float emission[3];
16 } C3D_Material;
17 
18 //-----------------------------------------------------------------------------
19 // Light environment
20 //-----------------------------------------------------------------------------
21 
22 // Forward declarations
23 typedef struct C3D_Light_t C3D_Light;
24 typedef struct C3D_LightEnv_t C3D_LightEnv;
25 
26 typedef struct
27 {
28  u32 abs, select, scale;
30 
31 typedef struct
32 {
33  u32 ambient;
34  u32 numLights;
35  u32 config[2];
39 
40 enum
41 {
45 
46 #define C3DF_LightEnv_IsCP(n) BIT(18+(n))
47 #define C3DF_LightEnv_IsCP_Any (0xFF<<18)
48 #define C3DF_LightEnv_LutDirty(n) BIT(26+(n))
49 #define C3DF_LightEnv_LutDirtyAll (0x3F<<26)
50 };
51 
53 {
54  u32 flags;
56  float ambient[3];
57  C3D_Light* lights[8];
60 };
61 
62 void C3D_LightEnvInit(C3D_LightEnv* env);
63 void C3D_LightEnvBind(C3D_LightEnv* env);
64 
65 void C3D_LightEnvMaterial(C3D_LightEnv* env, const C3D_Material* mtl);
66 void C3D_LightEnvAmbient(C3D_LightEnv* env, float r, float g, float b);
67 void C3D_LightEnvLut(C3D_LightEnv* env, GPU_LIGHTLUTID lutId, GPU_LIGHTLUTINPUT input, bool negative, C3D_LightLut* lut);
68 
69 enum
70 {
71  GPU_SHADOW_PRIMARY = BIT(16),
73  GPU_INVERT_SHADOW = BIT(18),
74  GPU_SHADOW_ALPHA = BIT(19),
75 };
76 
77 void C3D_LightEnvFresnel(C3D_LightEnv* env, GPU_FRESNELSEL selector);
78 void C3D_LightEnvBumpMode(C3D_LightEnv* env, GPU_BUMPMODE mode);
79 void C3D_LightEnvBumpSel(C3D_LightEnv* env, int texUnit);
80 void C3D_LightEnvShadowMode(C3D_LightEnv* env, u32 mode);
81 void C3D_LightEnvShadowSel(C3D_LightEnv* env, int texUnit);
82 void C3D_LightEnvClampHighlights(C3D_LightEnv* env, bool clamp);
83 
84 //-----------------------------------------------------------------------------
85 // Light
86 //-----------------------------------------------------------------------------
87 
88 typedef struct
89 {
90  u32 specular0, specular1, diffuse, ambient;
92 
93 typedef struct
94 {
96  u16 position[3]; u16 padding0;
97  u16 spotDir[3]; u16 padding1;
98  u32 padding2;
99  u32 config;
100  u32 distAttnBias, distAttnScale;
101 } C3D_LightConf;
102 
103 enum
104 {
108  //C3DF_Light_Shadow = BIT(3),
109  //C3DF_Light_Spot = BIT(4),
110  //C3DF_Light_DistAttn = BIT(5),
111 
114 };
115 
117 {
118  u16 flags, id;
119  C3D_LightEnv* parent;
121  float ambient[3];
122  float diffuse[3];
123  float specular0[3];
124  float specular1[3];
126 };
127 
128 int C3D_LightInit(C3D_Light* light, C3D_LightEnv* env);
129 void C3D_LightEnable(C3D_Light* light, bool enable);
130 void C3D_LightTwoSideDiffuse(C3D_Light* light, bool enable);
131 void C3D_LightGeoFactor(C3D_Light* light, int id, bool enable);
132 void C3D_LightAmbient(C3D_Light* light, float r, float g, float b);
133 void C3D_LightDiffuse(C3D_Light* light, float r, float g, float b);
134 void C3D_LightSpecular0(C3D_Light* light, float r, float g, float b);
135 void C3D_LightSpecular1(C3D_Light* light, float r, float g, float b);
136 void C3D_LightPosition(C3D_Light* light, C3D_FVec* pos);
137 void C3D_LightShadowEnable(C3D_Light* light, bool enable);
138 void C3D_LightSpotEnable(C3D_Light* light, bool enable);
139 void C3D_LightSpotDir(C3D_Light* light, float x, float y, float z);
140 void C3D_LightSpotLut(C3D_Light* light, C3D_LightLut* lut);
141 void C3D_LightDistAttnEnable(C3D_Light* light, bool enable);
142 void C3D_LightDistAttn(C3D_Light* light, C3D_LightLutDA* lut);
143 
144 static inline void C3D_LightColor(C3D_Light* light, float r, float g, float b)
145 {
146  C3D_LightDiffuse(light, r, g, b);
147  C3D_LightSpecular0(light, r, g, b);
148  C3D_LightSpecular1(light, r, g, b);
149 }
void C3D_LightEnvMaterial(C3D_LightEnv *env, const C3D_Material *mtl)
Definition: lightenv.c:179
void C3D_LightSpecular0(C3D_Light *light, float r, float g, float b)
Definition: light.c:89
void C3D_LightAmbient(C3D_Light *light, float r, float g, float b)
Definition: light.c:73
void C3D_LightEnable(C3D_Light *light, bool enable)
Definition: light.c:41
void C3D_LightEnvLut(C3D_LightEnv *env, GPU_LIGHTLUTID lutId, GPU_LIGHTLUTINPUT input, bool negative, C3D_LightLut *lut)
Definition: lightenv.c:199
void C3D_LightEnvBumpSel(C3D_LightEnv *env, int texUnit)
Definition: lightenv.c:246
void C3D_LightEnvBumpMode(C3D_LightEnv *env, GPU_BUMPMODE mode)
Definition: lightenv.c:239
void C3D_LightEnvAmbient(C3D_LightEnv *env, float r, float g, float b)
Definition: lightenv.c:191
void C3D_LightEnvBind(C3D_LightEnv *env)
Definition: lightenv.c:165
void C3D_LightShadowEnable(C3D_Light *light, bool enable)
Definition: light.c:132
void C3D_LightSpecular1(C3D_Light *light, float r, float g, float b)
Definition: light.c:97
void C3D_LightEnvFresnel(C3D_LightEnv *env, GPU_FRESNELSEL selector)
Definition: lightenv.c:232
void C3D_LightEnvShadowMode(C3D_LightEnv *env, u32 mode)
Definition: lightenv.c:253
void C3D_LightPosition(C3D_Light *light, C3D_FVec *pos)
Definition: light.c:105
void C3D_LightTwoSideDiffuse(C3D_Light *light, bool enable)
Definition: light.c:54
void C3D_LightDistAttnEnable(C3D_Light *light, bool enable)
Definition: light.c:167
void C3D_LightSpotEnable(C3D_Light *light, bool enable)
Definition: light.c:137
void C3D_LightGeoFactor(C3D_Light *light, int id, bool enable)
Definition: light.c:63
void C3D_LightSpotLut(C3D_Light *light, C3D_LightLut *lut)
Definition: light.c:158
void C3D_LightDistAttn(C3D_Light *light, C3D_LightLutDA *lut)
Definition: light.c:172
void C3D_LightDiffuse(C3D_Light *light, float r, float g, float b)
Definition: light.c:81
@ GPU_SHADOW_ALPHA
Definition: light.h:74
@ GPU_SHADOW_PRIMARY
Definition: light.h:71
@ GPU_SHADOW_SECONDARY
Definition: light.h:72
@ GPU_INVERT_SHADOW
Definition: light.h:73
void C3D_LightSpotDir(C3D_Light *light, float x, float y, float z)
Definition: light.c:147
void C3D_LightEnvShadowSel(C3D_LightEnv *env, int texUnit)
Definition: lightenv.c:263
int C3D_LightInit(C3D_Light *light, C3D_LightEnv *env)
Definition: light.c:19
@ C3DF_Light_SPDirty
Definition: light.h:112
@ C3DF_Light_Dirty
Definition: light.h:106
@ C3DF_Light_DADirty
Definition: light.h:113
@ C3DF_Light_MatDirty
Definition: light.h:107
@ C3DF_Light_Enabled
Definition: light.h:105
void C3D_LightEnvInit(C3D_LightEnv *env)
Definition: lightenv.c:154
@ C3DF_LightEnv_MtlDirty
Definition: light.h:43
@ C3DF_LightEnv_LCDirty
Definition: light.h:44
@ C3DF_LightEnv_Dirty
Definition: light.h:42
void C3D_LightEnvClampHighlights(C3D_LightEnv *env, bool clamp)
Definition: lightenv.c:270
static void C3D_LightColor(C3D_Light *light, float r, float g, float b)
Definition: light.h:144
Definition: light.h:94
C3D_LightMatConf material
Definition: light.h:95
u32 config
Definition: light.h:99
u16 padding1
Definition: light.h:97
u16 padding0
Definition: light.h:96
u32 padding2
Definition: light.h:98
u32 distAttnBias
Definition: light.h:100
Definition: light.h:32
u32 numLights
Definition: light.h:34
u32 ambient
Definition: light.h:33
u32 permutation
Definition: light.h:37
C3D_LightLutInputConf lutInput
Definition: light.h:36
Definition: light.h:53
float ambient[3]
Definition: light.h:56
u32 flags
Definition: light.h:54
C3D_LightLut * luts[6]
Definition: light.h:55
C3D_Material material
Definition: light.h:59
C3D_Light * lights[8]
Definition: light.h:57
C3D_LightEnvConf conf
Definition: light.h:58
Definition: lightlut.h:11
Definition: light.h:27
u32 abs
Definition: light.h:28
Definition: lightlut.h:6
Definition: light.h:89
u32 ambient
Definition: light.h:90
Definition: light.h:117
float specular0[3]
Definition: light.h:123
float ambient[3]
Definition: light.h:121
u16 id
Definition: light.h:118
C3D_LightLut * lut_DA
Definition: light.h:120
C3D_LightConf conf
Definition: light.h:125
float specular1[3]
Definition: light.h:124
u16 flags
Definition: light.h:118
float diffuse[3]
Definition: light.h:122
C3D_LightEnv * parent
Definition: light.h:119
C3D_LightLut * lut_SP
Definition: light.h:120
Definition: light.h:10
Float vector.
Definition: types.h:37