6 C3D_Material* mtl = &light->parent->material;
7 C3D_LightMatConf* conf = &light->conf.material;
8 memset(conf, 0,
sizeof(*conf));
10 for (i = 0; i < 3; i ++)
12 conf->specular0 |= ((u32)(255*(mtl->specular0[i]*light->specular0[i]))) << (i*10);
13 conf->specular1 |= ((u32)(255*(mtl->specular1[i]*light->specular1[i]))) << (i*10);
14 conf->diffuse |= ((u32)(255*(mtl->diffuse[i] *light->diffuse[i]))) << (i*10);
15 conf->ambient |= ((u32)(255*(mtl->ambient[i] *light->ambient[i]))) << (i*10);
22 memset(light, 0,
sizeof(*light));
24 for (i = 0; i < 8; i ++)
27 if (i == 8)
return -1;
29 env->lights[i] = light;
30 light->flags = C3DF_Light_Enabled | C3DF_Light_Dirty | C3DF_Light_MatDirty;
33 light->diffuse[0] = light->diffuse[1] = light->diffuse[2] = 1.0f;
34 light->specular0[0] = light->specular0[1] = light->specular0[2] = 1.0f;
35 light->specular1[0] = light->specular1[1] = light->specular1[2] = 1.0f;
37 env->flags |= C3DF_LightEnv_LCDirty;
43 if ((light->flags & C3DF_Light_Enabled) == (enable?C3DF_Light_Enabled:0))
47 light->flags |= C3DF_Light_Enabled;
49 light->flags &= ~C3DF_Light_Enabled;
51 light->parent->flags |= C3DF_LightEnv_LCDirty;
57 light->conf.config |= BIT(1);
59 light->conf.config &= ~BIT(1);
60 light->flags |= C3DF_Light_Dirty;
67 light->conf.config |= BIT(
id);
69 light->conf.config &= ~BIT(
id);
70 light->flags |= C3DF_Light_Dirty;
75 light->ambient[0] = b;
76 light->ambient[1] = g;
77 light->ambient[2] = r;
78 light->flags |= C3DF_Light_MatDirty;
83 light->diffuse[0] = b;
84 light->diffuse[1] = g;
85 light->diffuse[2] = r;
86 light->flags |= C3DF_Light_MatDirty;
91 light->specular0[0] = b;
92 light->specular0[1] = g;
93 light->specular0[2] = r;
94 light->flags |= C3DF_Light_MatDirty;
99 light->specular1[0] = b;
100 light->specular1[1] = g;
101 light->specular1[2] = r;
102 light->flags |= C3DF_Light_MatDirty;
108 light->conf.config &= ~BIT(0);
109 light->conf.config |= (pos->w == 0.0f);
110 light->conf.position[0] = f32tof16(pos->x);
111 light->conf.position[1] = f32tof16(pos->y);
112 light->conf.position[2] = f32tof16(pos->z);
113 light->flags |= C3DF_Light_Dirty;
116static void C3Di_EnableCommon(C3D_Light* light,
bool enable, u32 bit)
118 C3D_LightEnv* env = light->parent;
119 u32* var = &env->conf.config[1];
121 if (enable == !(*var & bit))
129 env->flags |= C3DF_LightEnv_Dirty;
134 C3Di_EnableCommon(light, enable, GPU_LC1_SHADOWBIT(light->id));
139 C3Di_EnableCommon(light, enable, GPU_LC1_SPOTBIT(light->id));
142static inline u16 floattofix2_11(
float x)
144 return (u16)((s32)(x * (1U<<11)) & 0x1FFF);
149 C3Di_EnableCommon(light,
true, GPU_LC1_SPOTBIT(light->id));
150 C3D_FVec vec = FVec3_New(-x, -y, -z);
151 vec = FVec3_Normalize(vec);
152 light->conf.spotDir[0] = floattofix2_11(vec.x);
153 light->conf.spotDir[1] = floattofix2_11(vec.y);
154 light->conf.spotDir[2] = floattofix2_11(vec.z);
155 light->flags |= C3DF_Light_Dirty;
160 bool hasLut = lut != NULL;
161 C3Di_EnableCommon(light, hasLut, GPU_LC1_SPOTBIT(light->id));
164 light->flags |= C3DF_Light_SPDirty;
169 C3Di_EnableCommon(light, enable, GPU_LC1_ATTNBIT(light->id));
174 bool hasLut = lut != NULL;
175 C3Di_EnableCommon(light, hasLut, GPU_LC1_ATTNBIT(light->id));
178 light->conf.distAttnBias = f32tof20(lut->bias);
179 light->conf.distAttnScale = f32tof20(lut->scale);
180 light->lut_DA = &lut->lut;
181 light->flags |= C3DF_Light_Dirty | C3DF_Light_DADirty;
void C3D_LightSpecular0(C3D_Light *light, float r, float g, float b)
void C3D_LightAmbient(C3D_Light *light, float r, float g, float b)
void C3D_LightEnable(C3D_Light *light, bool enable)
void C3D_LightShadowEnable(C3D_Light *light, bool enable)
void C3D_LightSpecular1(C3D_Light *light, float r, float g, float b)
void C3Di_LightMtlBlend(C3D_Light *light)
void C3D_LightPosition(C3D_Light *light, C3D_FVec *pos)
void C3D_LightTwoSideDiffuse(C3D_Light *light, bool enable)
void C3D_LightDistAttnEnable(C3D_Light *light, bool enable)
void C3D_LightSpotEnable(C3D_Light *light, bool enable)
void C3D_LightGeoFactor(C3D_Light *light, int id, bool enable)
void C3D_LightSpotLut(C3D_Light *light, C3D_LightLut *lut)
void C3D_LightDistAttn(C3D_Light *light, C3D_LightLutDA *lut)
void C3D_LightDiffuse(C3D_Light *light, float r, float g, float b)
void C3D_LightSpotDir(C3D_Light *light, float x, float y, float z)
int C3D_LightInit(C3D_Light *light, C3D_LightEnv *env)