コード例 #1
0
ファイル: r_program.cpp プロジェクト: ArkyRomania/ufoai
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);
		}
	}
}
コード例 #2
0
ファイル: r_program.cpp プロジェクト: ArkyRomania/ufoai
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);
		}
	}
}
コード例 #3
0
/**
 * @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);
	}
}
コード例 #4
0
ファイル: r_program.cpp プロジェクト: ArkyRomania/ufoai
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);
		}
	}
}
コード例 #5
0
ファイル: r_program.cpp プロジェクト: ArkyRomania/ufoai
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);
		}
	}
}
コード例 #6
0
/**
 * @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);
	}
}
コード例 #7
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);
	}
}
コード例 #8
0
ファイル: r_program.cpp プロジェクト: ArkyRomania/ufoai
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);
		}
	}
}
コード例 #9
0
ファイル: r_program.cpp プロジェクト: ArkyRomania/ufoai
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);
		}
	}
}
コード例 #10
0
ファイル: r_light.cpp プロジェクト: jklemmack/ufoai
/**
 * @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);
}