/** * @brief */ void R_UseMaterial_default(const r_material_t *material) { r_default_program_t *p = &r_default_program; if (!material || !material->normalmap || !r_bumpmap->value || r_draw_bsp_lightmaps->value) { R_DisableAttribute(R_ARRAY_TANGENT); R_ProgramParameter1i(&p->normalmap, 0); return; } R_EnableAttribute(R_ARRAY_TANGENT); R_BindNormalmapTexture(material->normalmap->texnum); R_ProgramParameter1i(&p->normalmap, 1); if (material->specularmap) { R_BindSpecularmapTexture(material->specularmap->texnum); R_ProgramParameter1i(&p->glossmap, 1); } else { R_ProgramParameter1i(&p->glossmap, 0); } R_ProgramParameter1f(&p->bump, material->cm->bump * r_bumpmap->value); R_ProgramParameter1f(&p->parallax, material->cm->parallax * r_parallax->value); R_ProgramParameter1f(&p->hardness, material->cm->hardness * r_hardness->value); R_ProgramParameter1f(&p->specular, material->cm->specular * r_specular->value); }
/** * @brief */ void R_UseProgram_default(void) { r_default_program_t *p = &r_default_program; R_ProgramParameter1i(&p->diffuse, texunit_diffuse->enabled); R_ProgramParameter1i(&p->lightmap, texunit_lightmap->enabled); }
/* * R_EnableBumpmap * * Enables bumpmapping while updating program parameters to reflect the * specified material. */ void R_EnableBumpmap(r_material_t *material, boolean_t enable) { if (!r_state.lighting_enabled) return; if (!r_bumpmap->value) return; R_UseMaterial(material); if (r_state.bumpmap_enabled == enable) return; r_state.bumpmap_enabled = enable; if (enable) { // toggle state R_EnableAttribute("TANGENT"); R_ProgramParameter1i("BUMPMAP", 1); } else { R_DisableAttribute("TANGENT"); R_ProgramParameter1i("BUMPMAP", 0); } }
static void R_InitCombine2Program (r_program_t* prog) { GLfloat defaultColor[4] = {0.0, 0.0, 0.0, 0.0}; R_ProgramParameter1i("SAMPLER0", 0); R_ProgramParameter1i("SAMPLER1", 1); R_ProgramParameter4fv("DEFAULTCOLOR", defaultColor); }
/** * @brief */ void R_UseMaterial_null(const r_material_t *material) { r_null_program_t *p = &r_null_program; if (material && material->tintmap) { R_BindTintTexture(material->tintmap->texnum); R_ProgramParameter1i(&p->tintmap, 1); } else { R_ProgramParameter1i(&p->tintmap, 0); } }
static void R_InitAtmosphereProgram (r_program_t* prog) { static vec4_t defaultColor = {0.0, 0.0, 0.0, 1.0}; static vec2_t uvScale = {2.0, 1.0}; R_ProgramParameter1i("SAMPLER_DIFFUSE", 0); R_ProgramParameter1i("SAMPLER_NORMALMAP", 2); R_ProgramParameter4fv("DEFAULTCOLOR", defaultColor); R_ProgramParameter2fv("UVSCALE", uvScale); }
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_InitGeoscapeProgram (r_program_t* prog) { static vec4_t defaultColor = {0.0, 0.0, 0.0, 1.0}; static vec4_t cityLightColor = {1.0, 1.0, 0.8, 1.0}; static vec2_t uvScale = {2.0, 1.0}; R_ProgramParameter1i("SAMPLER_DIFFUSE", 0); R_ProgramParameter1i("SAMPLER_BLEND", 1); R_ProgramParameter1i("SAMPLER_NORMALMAP", 2); R_ProgramParameter4fv("DEFAULTCOLOR", defaultColor); R_ProgramParameter4fv("CITYLIGHTCOLOR", cityLightColor); R_ProgramParameter2fv("UVSCALE", uvScale); }
/** * @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); } }
/** * @brief */ void R_InitProgram_null(r_program_t *program) { r_null_program_t *p = &r_null_program; R_ProgramVariable(&program->attributes[R_ARRAY_POSITION], R_ATTRIBUTE, "POSITION", true); R_ProgramVariable(&program->attributes[R_ARRAY_COLOR], R_ATTRIBUTE, "COLOR", true); R_ProgramVariable(&program->attributes[R_ARRAY_DIFFUSE], R_ATTRIBUTE, "TEXCOORD", true); R_ProgramVariable(&program->attributes[R_ARRAY_NEXT_POSITION], R_ATTRIBUTE, "NEXT_POSITION", true); R_ProgramVariable(&p->sampler0, R_SAMPLER_2D, "SAMPLER0", true); R_ProgramVariable(&p->fog.start, R_UNIFORM_FLOAT, "FOG.START", true); R_ProgramVariable(&p->fog.end, R_UNIFORM_FLOAT, "FOG.END", true); R_ProgramVariable(&p->fog.color, R_UNIFORM_VEC3, "FOG.COLOR", true); R_ProgramVariable(&p->fog.density, R_UNIFORM_FLOAT, "FOG.DENSITY", true); R_ProgramVariable(&p->current_color, R_UNIFORM_VEC4, "GLOBAL_COLOR", true); R_ProgramVariable(&p->time_fraction, R_UNIFORM_FLOAT, "TIME_FRACTION", true); R_ProgramParameter1i(&p->sampler0, R_TEXUNIT_DIFFUSE); R_ProgramParameter1f(&p->fog.density, 0.0); const vec4_t white = { 1.0, 1.0, 1.0, 1.0 }; R_ProgramParameter4fv(&p->current_color, white); R_ProgramParameter1f(&p->time_fraction, 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); } } }
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); } } }
/** * @brief */ void R_InitProgram_null(r_program_t *program) { r_null_program_t *p = &r_null_program; R_ProgramVariable(&program->attributes[R_ATTRIB_POSITION], R_ATTRIBUTE, "POSITION", true); R_ProgramVariable(&program->attributes[R_ATTRIB_COLOR], R_ATTRIBUTE, "COLOR", true); R_ProgramVariable(&program->attributes[R_ATTRIB_DIFFUSE], R_ATTRIBUTE, "TEXCOORD", true); R_ProgramVariable(&program->attributes[R_ATTRIB_NEXT_POSITION], R_ATTRIBUTE, "NEXT_POSITION", true); R_ProgramVariable(&p->tintmap, R_UNIFORM_INT, "TINTMAP", true); R_ProgramVariable(&p->sampler0, R_SAMPLER_2D, "SAMPLER0", true); R_ProgramVariable(&p->sampler6, R_SAMPLER_2D, "SAMPLER6", true); R_ProgramVariable(&p->fog.start, R_UNIFORM_FLOAT, "FOG.START", true); R_ProgramVariable(&p->fog.end, R_UNIFORM_FLOAT, "FOG.END", true); R_ProgramVariable(&p->fog.color, R_UNIFORM_VEC3, "FOG.COLOR", true); R_ProgramVariable(&p->fog.density, R_UNIFORM_FLOAT, "FOG.DENSITY", true); for (int32_t i = 0; i < TINT_TOTAL; i++) { R_ProgramVariable(&p->tints[i], R_UNIFORM_VEC4, va("TINTS[%i]", i), true); } R_ProgramVariable(&p->time_fraction, R_UNIFORM_FLOAT, "TIME_FRACTION", true); R_ProgramParameter1i(&p->tintmap, 0); R_ProgramParameter1i(&p->sampler0, R_TEXUNIT_DIFFUSE); R_ProgramParameter1i(&p->sampler6, R_TEXUNIT_TINTMAP); R_ProgramParameter1f(&p->fog.density, 0.0); R_ProgramParameter1f(&p->time_fraction, 0.0f); }
static void R_InitConvolveProgram (r_program_t* prog) { float filter[FILTER_SIZE]; float sum = 0; int i; const size_t size = lengthof(filter); /* approximate a Gaussian by normalizing the Nth row of Pascale's Triangle */ for (i = 0; i < size; i++) { filter[i] = (float)R_PascalTriangle(size, i + 1); sum += filter[i]; } for (i = 0; i < size; i++) filter[i] = (filter[i] / sum); R_ProgramParameter1i("SAMPLER0", 0); R_ProgramParameter1fvs("COEFFICIENTS", size, filter); }
/** * @brief */ void R_InitProgram_shell(r_program_t *program) { r_shell_program_t *p = &r_shell_program; R_ProgramVariable(&program->attributes[R_ATTRIB_POSITION], R_ATTRIBUTE, "POSITION", true); R_ProgramVariable(&program->attributes[R_ATTRIB_NORMAL], R_ATTRIBUTE, "NORMAL", true); R_ProgramVariable(&program->attributes[R_ATTRIB_DIFFUSE], R_ATTRIBUTE, "TEXCOORD", true); R_ProgramVariable(&program->attributes[R_ATTRIB_NEXT_POSITION], R_ATTRIBUTE, "NEXT_POSITION", true); R_ProgramVariable(&program->attributes[R_ATTRIB_NEXT_NORMAL], R_ATTRIBUTE, "NEXT_NORMAL", true); R_ProgramVariable(&p->offset, R_UNIFORM_FLOAT, "OFFSET", true); R_ProgramParameter1f(&p->offset, 0.0); R_ProgramVariable(&p->shell_offset, R_UNIFORM_FLOAT, "SHELL_OFFSET", true); R_ProgramParameter1f(&p->shell_offset, 0.0); R_ProgramVariable(&p->sampler0, R_SAMPLER_2D, "SAMPLER0", true); R_ProgramParameter1i(&p->sampler0, R_TEXUNIT_DIFFUSE); R_ProgramVariable(&p->time_fraction, R_UNIFORM_FLOAT, "TIME_FRACTION", true); R_ProgramParameter1f(&p->time_fraction, 0.0f); }
static void R_InitSimpleGlowProgram (r_program_t* prog) { R_ProgramParameter1i("SAMPLER_DIFFUSE", 0); R_ProgramParameter1i("SAMPLER_GLOWMAP", 4); R_ProgramParameter1f("GLOWSCALE", 1.0); }
/** * @brief */ void R_InitProgram_default(r_program_t *program) { r_default_program_t *p = &r_default_program; p->program = program; R_ProgramVariable(&program->attributes[R_ARRAY_POSITION], R_ATTRIBUTE, "POSITION", true); R_ProgramVariable(&program->attributes[R_ARRAY_COLOR], R_ATTRIBUTE, "COLOR", true); R_ProgramVariable(&program->attributes[R_ARRAY_DIFFUSE], R_ATTRIBUTE, "TEXCOORD0", true); R_ProgramVariable(&program->attributes[R_ARRAY_LIGHTMAP], R_ATTRIBUTE, "TEXCOORD1", true); R_ProgramVariable(&program->attributes[R_ARRAY_NORMAL], R_ATTRIBUTE, "NORMAL", true); R_ProgramVariable(&program->attributes[R_ARRAY_TANGENT], R_ATTRIBUTE, "TANGENT", true); R_ProgramVariable(&program->attributes[R_ARRAY_NEXT_POSITION], R_ATTRIBUTE, "NEXT_POSITION", true); R_ProgramVariable(&program->attributes[R_ARRAY_NEXT_NORMAL], R_ATTRIBUTE, "NEXT_NORMAL", true); R_ProgramVariable(&program->attributes[R_ARRAY_NEXT_TANGENT], R_ATTRIBUTE, "NEXT_TANGENT", true); R_ProgramVariable(&p->diffuse, R_UNIFORM_INT, "DIFFUSE", true); R_ProgramVariable(&p->lightmap, R_UNIFORM_INT, "LIGHTMAP", true); R_ProgramVariable(&p->normalmap, R_UNIFORM_INT, "NORMALMAP", true); R_ProgramVariable(&p->glossmap, R_UNIFORM_INT, "GLOSSMAP", true); R_ProgramVariable(&p->bump, R_UNIFORM_FLOAT, "BUMP", true); R_ProgramVariable(&p->parallax, R_UNIFORM_FLOAT, "PARALLAX", true); R_ProgramVariable(&p->hardness, R_UNIFORM_FLOAT, "HARDNESS", true); R_ProgramVariable(&p->specular, R_UNIFORM_FLOAT, "SPECULAR", true); R_ProgramVariable(&p->sampler0, R_SAMPLER_2D, "SAMPLER0", true); R_ProgramVariable(&p->sampler1, R_SAMPLER_2D, "SAMPLER1", true); R_ProgramVariable(&p->sampler2, R_SAMPLER_2D, "SAMPLER2", true); R_ProgramVariable(&p->sampler3, R_SAMPLER_2D, "SAMPLER3", true); R_ProgramVariable(&p->sampler4, R_SAMPLER_2D, "SAMPLER4", true); R_ProgramVariable(&p->fog.start, R_UNIFORM_FLOAT, "FOG.START", true); R_ProgramVariable(&p->fog.end, R_UNIFORM_FLOAT, "FOG.END", true); R_ProgramVariable(&p->fog.color, R_UNIFORM_VEC3, "FOG.COLOR", true); R_ProgramVariable(&p->fog.density, R_UNIFORM_FLOAT, "FOG.DENSITY", true); if (r_state.max_active_lights) { p->lights = Mem_TagMalloc(sizeof(r_uniform_light_t) * r_state.max_active_lights, MEM_TAG_RENDERER); for (int32_t i = 0; i < r_state.max_active_lights; ++i) { R_ProgramVariable(&p->lights[i].origin, R_UNIFORM_VEC3, va("LIGHTS.ORIGIN[%i]", i), true); R_ProgramVariable(&p->lights[i].color, R_UNIFORM_VEC3, va("LIGHTS.COLOR[%i]", i), true); R_ProgramVariable(&p->lights[i].radius, R_UNIFORM_FLOAT, va("LIGHTS.RADIUS[%i]", i), true); } R_ProgramParameter1f(&p->lights[0].radius, 0.0); } else { p->lights = NULL; } R_ProgramVariable(&p->caustic.enable, R_UNIFORM_INT, "CAUSTIC.ENABLE", true); R_ProgramVariable(&p->caustic.color, R_UNIFORM_VEC3, "CAUSTIC.COLOR", true); R_ProgramVariable(&p->normal_mat, R_UNIFORM_MAT4, "NORMAL_MAT", true); R_ProgramVariable(&p->alpha_threshold, R_UNIFORM_FLOAT, "ALPHA_THRESHOLD", true); R_ProgramVariable(&p->time_fraction, R_UNIFORM_FLOAT, "TIME_FRACTION", true); R_ProgramVariable(&p->time, R_UNIFORM_FLOAT, "TIME", true); R_ProgramParameter1i(&p->lightmap, 0); R_ProgramParameter1i(&p->normalmap, 0); R_ProgramParameter1i(&p->glossmap, 0); R_ProgramParameter1f(&p->bump, 1.0); R_ProgramParameter1f(&p->parallax, 1.0); R_ProgramParameter1f(&p->hardness, 1.0); R_ProgramParameter1f(&p->specular, 1.0); R_ProgramParameter1i(&p->sampler0, R_TEXUNIT_DIFFUSE); R_ProgramParameter1i(&p->sampler1, R_TEXUNIT_LIGHTMAP); R_ProgramParameter1i(&p->sampler2, R_TEXUNIT_DELUXEMAP); R_ProgramParameter1i(&p->sampler3, R_TEXUNIT_NORMALMAP); R_ProgramParameter1i(&p->sampler4, R_TEXUNIT_SPECULARMAP); R_ProgramParameter1f(&p->fog.density, 0.0); R_ProgramParameter1f(&p->alpha_threshold, ALPHA_TEST_DISABLED_THRESHOLD); R_ProgramParameter1i(&p->caustic.enable, 0); R_ProgramParameter1f(&p->time_fraction, 0.0f); R_ProgramParameter1f(&p->time, 0.0f); }
void R_InitParticleProgram (r_program_t* prog) { R_ProgramParameter1i("SAMPLER0", 0); }