static void R_InitWorldProgram (r_program_t* prog) { R_ProgramParameter1i("SAMPLER_DIFFUSE", 0); R_ProgramParameter1i("SAMPLER_LIGHTMAP", 1); R_ProgramParameter1i("SAMPLER_DELUXEMAP", 2); R_ProgramParameter1i("SAMPLER_NORMALMAP", 3); R_ProgramParameter1i("SAMPLER_GLOWMAP", 4); R_ProgramParameter1i("BUMPMAP", 0); if (r_programs->integer > 1) { R_ProgramParameter3fv("AMBIENT", refdef.ambientColor); R_ProgramParameter1i("SPECULARMAP", 0); R_ProgramParameter1i("SAMPLER_SPECULAR", 5); R_ProgramParameter1f("HARDNESS", defaultMaterial.hardness); R_ProgramParameter1f("SPECULAR", defaultMaterial.specular); R_ProgramParameter1f("PARALLAX", defaultMaterial.parallax); } R_ProgramParameter1f("BUMP", defaultMaterial.bump); R_ProgramParameter1f("GLOWSCALE", defaultMaterial.glowscale); if (r_fog->integer) { if (r_state.fog_enabled) { R_ProgramParameter3fv("FOGCOLOR", refdef.fogColor); R_ProgramParameter1f("FOGDENSITY", refdef.fogColor[3]); R_ProgramParameter2fv("FOGRANGE", fogRange); } else { R_ProgramParameter1f("FOGDENSITY", 0.0f); } } }
static void R_UseWorldProgram (r_program_t* prog) { if (r_programs->integer > 1) { R_ProgramParameter3fv("AMBIENT", refdef.ambientColor); } if (r_fog->integer) { if (r_state.fog_enabled) { R_ProgramParameter3fv("FOGCOLOR", refdef.fogColor); R_ProgramParameter1f("FOGDENSITY", refdef.fogColor[3]); R_ProgramParameter2fv("FOGRANGE", fogRange); } else { R_ProgramParameter1f("FOGDENSITY", 0.0f); } } }
/** * @brief */ void R_UseLight_default(const uint16_t light_index, const r_light_t *light) { r_default_program_t *p = &r_default_program; if (light && light->radius) { vec3_t origin; const matrix4x4_t *modelview = R_GetMatrixPtr(R_MATRIX_MODELVIEW); Matrix4x4_Transform(modelview, light->origin, origin); R_ProgramParameter3fv(&p->lights[light_index].origin, origin); R_ProgramParameter3fv(&p->lights[light_index].color, light->color); R_ProgramParameter1f(&p->lights[light_index].radius, light->radius); } else { R_ProgramParameter1f(&p->lights[light_index].radius, 0.0); } }
static void R_InitModelProgram (r_program_t* prog) { vec4_t sunDirection; R_ProgramParameter1i("SAMPLER_DIFFUSE", 0); R_ProgramParameter1i("SAMPLER_NORMALMAP", 3); R_ProgramParameter1i("SAMPLER_GLOWMAP", 4); R_ProgramParameter1i("BUMPMAP", 0); R_ProgramParameter1i("ANIMATE", 0); R_ProgramParameter1f("BUMP", defaultMaterial.bump); R_ProgramParameter1f("GLOWSCALE", defaultMaterial.glowscale); R_ProgramParameter1f("OFFSET", 0.0); R_ProgramParameter3fv("AMBIENT", refdef.modelAmbientColor); R_ProgramParameter3fv("SUNCOLOR", refdef.sunDiffuseColor); GLVectorTransform(r_locals.world_matrix, refdef.sunVector, sunDirection); R_ProgramParameter3fv("SUNDIRECTION", sunDirection); /* last component is not needed */ if (r_programs->integer > 1) { R_ProgramParameter1i("SAMPLER_SPECULAR", 5); R_ProgramParameter1i("SPECULARMAP", 0); R_ProgramParameter1f("HARDNESS", defaultMaterial.hardness); R_ProgramParameter1f("SPECULAR", defaultMaterial.specular); R_ProgramParameter1f("PARALLAX", defaultMaterial.parallax); if (r_programs->integer > 2) { R_ProgramParameter1i("SAMPLER_ROUGHMAP", 2); R_ProgramParameter1i("ROUGHMAP", 0); } } if (r_fog->integer) { if (r_state.fog_enabled) { R_ProgramParameter3fv("FOGCOLOR", refdef.fogColor); R_ProgramParameter1f("FOGDENSITY", refdef.fogColor[3]); R_ProgramParameter2fv("FOGRANGE", fogRange); } else { R_ProgramParameter1f("FOGDENSITY", 0.0f); } } }
static void R_UseModelProgram (r_program_t* prog) { vec4_t sunDirection; /*R_ProgramParameter1i("LIGHTS", refdef.numLights);*/ R_ProgramParameter1f("OFFSET", 0.0); R_ProgramParameter3fv("AMBIENT", refdef.modelAmbientColor); R_ProgramParameter3fv("SUNCOLOR", refdef.sunDiffuseColor); GLVectorTransform(r_locals.world_matrix, refdef.sunVector, sunDirection); R_ProgramParameter3fv("SUNDIRECTION", sunDirection); /* last component is not needed */ if (r_fog->integer) { if (r_state.fog_enabled) { R_ProgramParameter3fv("FOGCOLOR", refdef.fogColor); R_ProgramParameter1f("FOGDENSITY", refdef.fogColor[3]); R_ProgramParameter2fv("FOGRANGE", fogRange); } else { R_ProgramParameter1f("FOGDENSITY", 0.0f); } } }
/** * @brief */ void R_UseFog_default(const r_fog_parameters_t *fog) { r_default_program_t *p = &r_default_program; if (fog && fog->density) { R_ProgramParameter1f(&p->fog.density, fog->density); R_ProgramParameter1f(&p->fog.start, fog->start); R_ProgramParameter1f(&p->fog.end, fog->end); R_ProgramParameter3fv(&p->fog.color, fog->color); } else { R_ProgramParameter1f(&p->fog.density, 0.0); } }
/** * @brief */ void R_UseCaustic_default(const r_caustic_parameters_t *caustic) { r_default_program_t *p = &r_default_program; if (caustic && caustic->enable) { R_ProgramParameter1i(&p->caustic.enable, caustic->enable); R_ProgramParameter3fv(&p->caustic.color, caustic->color); R_ProgramParameter1f(&p->time, r_view.ticks / 1000.0); } else { R_ProgramParameter1i(&p->caustic.enable, 0); } }
static void R_UseWarpProgram (r_program_t* prog) { static vec4_t offset; offset[0] = offset[1] = refdef.time / 8.0; R_ProgramParameter4fv("OFFSET", offset); if (r_fog->integer) { if (r_state.fog_enabled) { R_ProgramParameter3fv("FOGCOLOR", refdef.fogColor); R_ProgramParameter1f("FOGDENSITY", refdef.fogColor[3]); R_ProgramParameter2fv("FOGRANGE", fogRange); } else { R_ProgramParameter1f("FOGDENSITY", 0.0f); } } }
static void R_InitWarpProgram (r_program_t* prog) { static vec4_t offset; R_ProgramParameter1i("SAMPLER_DIFFUSE", 0); R_ProgramParameter1i("SAMPLER_WARP", 1); R_ProgramParameter1i("SAMPLER_GLOWMAP", 4); R_ProgramParameter1f("GLOWSCALE", 0.0); R_ProgramParameter4fv("OFFSET", offset); if (r_fog->integer) { if (r_state.fog_enabled) { R_ProgramParameter3fv("FOGCOLOR", refdef.fogColor); R_ProgramParameter1f("FOGDENSITY", refdef.fogColor[3]); R_ProgramParameter2fv("FOGRANGE", fogRange); } else { R_ProgramParameter1f("FOGDENSITY", 0.0f); } } }
/** * @brief Enable or disable realtime dynamic lighting for models * @param lights The lights to enable * @param numLights The amount of lights in the given lights list * @param inShadow Whether model is shadowed from the sun * @param enable Whether to turn realtime lighting on or off */ void R_EnableModelLights (const light_t **lights, int numLights, bool inShadow, bool enable) { int i; int maxLights = r_dynamic_lights->integer; vec4_t blackColor = {0.0, 0.0, 0.0, 1.0}; const vec4_t whiteColor = {1.0, 1.0, 1.0, 1.0}; const vec4_t defaultLight0Position = {0.0, 0.0, 1.0, 0.0}; vec3_t lightPositions[MAX_GL_LIGHTS]; vec4_t lightParams[MAX_GL_LIGHTS]; if (r_programs->integer == 0) { /* Fixed function path renderer got only the sunlight */ /* Setup OpenGL light #0 to act as a sun and environment light */ glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL); #ifndef GL_VERSION_ES_CM_1_0 glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); #endif glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0); glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0); glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0); glLightfv(GL_LIGHT0, GL_SPECULAR, blackColor); glLightfv(GL_LIGHT0, GL_AMBIENT, refdef.modelAmbientColor); glLightfv(GL_LIGHT0, GL_POSITION, refdef.sunVector); if (enable) { if (inShadow) { /* ambient only */ glLightfv(GL_LIGHT0, GL_DIFFUSE, blackColor); } else { /* Full sunlight */ glLightfv(GL_LIGHT0, GL_DIFFUSE, refdef.sunDiffuseColor); } } else { /* restore the default OpenGL state */ glDisable(GL_LIGHTING); glDisable(GL_COLOR_MATERIAL); glLightfv(GL_LIGHT0, GL_POSITION, defaultLight0Position); glLightfv(GL_LIGHT0, GL_AMBIENT, blackColor); glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteColor); glLightfv(GL_LIGHT0, GL_SPECULAR, whiteColor); } return; } assert(numLights <= MAX_GL_LIGHTS); if (!enable || !r_state.lighting_enabled) { if (r_state.dynamic_lighting_enabled) { R_DisableAttribute("TANGENTS"); /** @todo is it a good idea? */ if (maxLights) { for (i = 0; i < maxLights; i++) Vector4Set(lightParams[i], 0, 0, 0, 1); /* Send light data to shaders */ R_ProgramParameter3fvs("LIGHTPOSITIONS", maxLights, (GLfloat *)lightPositions); R_ProgramParameter4fvs("LIGHTPARAMS", maxLights, (GLfloat *)lightParams); } } r_state.dynamic_lighting_enabled = false; return; } /** @todo assert? */ if (numLights > maxLights) numLights = maxLights; r_state.dynamic_lighting_enabled = true; R_EnableAttribute("TANGENTS"); R_UseMaterial(&defaultMaterial); R_ProgramParameter3fv("AMBIENT", refdef.modelAmbientColor); if (inShadow) { R_ProgramParameter3fv("SUNCOLOR", blackColor); } else { R_ProgramParameter3fv("SUNCOLOR", refdef.sunDiffuseColor); } if (!maxLights) return; for (i = 0; i < numLights; i++) { const light_t *light = lights[i]; GLPositionTransform(r_locals.world_matrix, light->origin, lightPositions[i]); VectorCopy(light->color, lightParams[i]); lightParams[i][3] = 16.0 / (light->radius * light->radius); } /* if there aren't enough active lights, turn off the rest */ for (; i < maxLights; i++) Vector4Set(lightParams[i], 0, 0, 0, 1); /* Send light data to shaders */ R_ProgramParameter3fvs("LIGHTPOSITIONS", maxLights, (GLfloat *)lightPositions); R_ProgramParameter4fvs("LIGHTPARAMS", maxLights, (GLfloat *)lightParams); }