Ejemplo n.º 1
0
void CDecalsDrawerGL4::Draw()
{
	trackHandler.Draw();

	SCOPED_TIMER("DecalsDrawerGL4::Draw");

	if (!GetDrawDecals())
		return;

	if (!AnyDecalsInView())
		return;

	// disable parallax, when we are lagging for a while
	/*static bool wi = true;
	const bool setTimerQuery = drawTimerQuery.Available() || wi;
	if (setTimerQuery) {
		wi = false;
		const float lastDrawTime = drawTimerQuery.QueryMilliSeconds();
		static float avgfoo[2] = {0,0};
		float& f = avgfoo[decalShader->GetFlagBool("USE_PARALLAX")];
		f = mix(f, lastDrawTime, 0.2f);
		LOG_L(L_ERROR, "CDecalsDrawerGL4::Update %fms %fms", avgfoo[0], avgfoo[1]);
		if (lastDrawTime > 5.f) {
			++laggedFrames;
			if (laggedFrames > 30) {
				LOG_L(L_ERROR, "Disabling Parallax decals");
				decalShader->SetFlag("USE_PARALLAX", false);
			}
		} else {
			laggedFrames = 0;
		}
		drawTimerQuery.Start();
	}*/

	// we render the decals in screen space
	// for that we need the depth, to be able to reconstruct the worldpos
#ifdef glCopyTextureSubImage2D
	if (GLEW_EXT_direct_state_access) {
		glCopyTextureSubImage2D(depthTex, 0, 0, 0, globalRendering->viewPosX, 0, globalRendering->viewSizeX, globalRendering->viewSizeY);
	} else
#endif
	{
		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D, depthTex);
		glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, globalRendering->viewPosX, 0, globalRendering->viewSizeX, globalRendering->viewSizeY);
	}

	glEnable(GL_BLEND);
	glBlendFunc(GL_ONE, GL_SRC_ALPHA);
	glEnable(GL_CULL_FACE);
	glCullFace(GL_FRONT);
	glDepthMask(GL_FALSE);
	glEnable(GL_DEPTH_CLAMP);
	//glEnable(GL_DEPTH_TEST);
	glDisable(GL_DEPTH_TEST);
	glEnable(GL_ALPHA_TEST);
	glAlphaFunc(GL_LESS, 1.0f);

	decalShader->SetFlag("HAVE_SHADOWS", shadowHandler->ShadowsLoaded());
	decalShader->SetFlag("HAVE_INFOTEX", infoTextureHandler->IsEnabled());
	decalShader->Enable();
		decalShader->SetUniform3v("camPos", &camera->GetPos()[0]);
		decalShader->SetUniform3v("camDir", &camera->GetDir()[0]);

		CMatrix44f vpi = camera->GetViewProjectionMatrixInverse();
		vpi.Translate(-OnesVector);
		vpi.Scale(OnesVector * 2.f);
		decalShader->SetUniformMatrix4x4("viewProjMatrix", false, camera->GetViewProjectionMatrix().m);
		decalShader->SetUniformMatrix4x4("viewProjMatrixInv", false, vpi.m);

	const std::array<GLuint,5> textures = {
		atlasTex,
		static_cast<CSMFReadMap*>(readMap)->GetNormalsTexture(),
		shadowHandler->GetShadowTextureID(),
		infoTextureHandler->GetCurrentInfoTexture(),
		depthTex
	};
	glSpringBindTextures(0, textures.size(), &textures[0]);

	if (shadowHandler->ShadowsLoaded()) {
		CMatrix44f sm = shadowHandler->GetShadowMatrix();
		sm.GetPos() += float3(0.5f, 0.5f, 0.0f);
		decalShader->SetUniformMatrix4x4("shadowMatrix", false, sm.m);
		decalShader->SetUniform("shadowDensity", sky->GetLight()->GetGroundShadowDensity());
	}

	// Draw
	DrawDecals();

	glDisable(GL_DEPTH_CLAMP);
	glEnable(GL_DEPTH_TEST);
	glDisable(GL_CULL_FACE);
	glCullFace(GL_BACK);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glDisable(GL_BLEND);
	glDisable(GL_ALPHA_TEST);

	decalShader->Disable();
	//if (setTimerQuery) drawTimerQuery.Stop();
}
Ejemplo n.º 2
0
PIGLIT_GL_TEST_CONFIG_END

/** Test texture size errors and subtexture position errors */
static bool
test_pos_and_sizes(void)
{
	bool pass = true;
	GLuint name;

	/* all of these should generate GL_INVALID_VALUE */
	glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, -16, 0, GL_RGBA, GL_FLOAT, NULL);
	pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;

	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, -6, -5, 0, GL_RGBA, GL_FLOAT, NULL);
	pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;

	glTexImage2D(GL_TEXTURE_2D, -2, GL_RGBA, 16, 16, 0, GL_RGBA, GL_FLOAT, NULL);
	pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;

	glTexImage2D(GL_TEXTURE_2D, 2000, GL_RGBA, 16, 16, 0, GL_RGBA, GL_FLOAT, NULL);
	pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;

	/* Setup dsa. */
	glCreateTextures(GL_TEXTURE_2D, 1, &name);
	glBindTextureUnit(0, name);	/* Since next command isn't bindless. */

	/* setup valid 2D texture for subsequent TexSubImage calls */
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_FLOAT, NULL);

	glTextureSubImage2D(name, 0, 6, 6, 100, 100, GL_RGBA, GL_FLOAT, NULL);
	pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;

	glTextureSubImage2D(name, 0, -6, -6, 10, 10, GL_RGBA, GL_FLOAT, NULL);
	pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;

	glCopyTextureSubImage2D(name, 0, -6, -6, 2, 2, 10, 10);
	pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;

	glCopyTextureSubImage2D(name, 0, 6, 6, 2, 2, 200, 200);
	pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass;

	/* mipmap level 1 doesn't exist */
	glTextureSubImage2D(name, 1, 0, 0, 8, 8, GL_RGBA, GL_FLOAT, NULL);
	pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass;

	/* mipmap level 2 doesn't exist */
	glCopyTextureSubImage2D(name, 2, 0, 0, 0, 0, 4, 4);
	pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass;

	/* To test 1D and 3D entry points, let's try using the wrong functions. */
	glTextureSubImage1D(name, 0, 0, 4, GL_RGBA, GL_FLOAT, NULL);
	pass = piglit_check_gl_error(GL_INVALID_ENUM) && pass;

	glTextureSubImage3D(name, 0, 0, 0, 0, 4, 4, 4, GL_RGBA, GL_FLOAT, NULL);
	pass = piglit_check_gl_error(GL_INVALID_ENUM) && pass;

	glCopyTextureSubImage1D(name, 0, 0, 0, 0, 4);
	pass = piglit_check_gl_error(GL_INVALID_ENUM) && pass;

	glCopyTextureSubImage3D(name, 0, 0, 0, 0, 0, 0, 4, 4);
	pass = piglit_check_gl_error(GL_INVALID_ENUM) && pass;

	return pass;
}