Beispiel #1
0
void ParkScene::_draw(float time)
{
	float camTime = time / Duration();
	mat4 mPersp = perspective(mix(45.0f, endFov, myx(camTime)), demo.aspect, 0.5f, 1000.0f);
	mat4 mCamera = lookAt(interpolatePath(oCamPath, endCamPos * 0.1f, camTime), interpolatePath(oLookPath, endLookAt * 0.1f, camTime), mix(vec3(0, 1, 0), endUp, myx(camTime)));

	setDepthMode(DEPTH_FULL);
	for (int i = 0; i < ARRAY_SIZE(tPark); i++) {
		GlslShader *sDraw = sPark[i];
		sDraw->bind();
		sDraw->uniform("u_matrix", mPersp * mCamera);
		sDraw->uniform("u_modelview", mCamera);
		sDraw->uniform("u_projection", mPersp);
		sDraw->uniform("u_alpha", 1.0f);
		sDraw->bindTexture("tex", tPark[i], 0);
		oPark->draw(i);
		sDraw->unbind();
	}
	if (time > Duration() - SceneTime::park2ink) {
		setBlendMode(BLEND_ALPHA);
		sDrawOverlay->bind();
		sDrawOverlay->uniform("u_matrix", mat4(1));
		sDrawOverlay->uniform("u_modelview", mCamera);
		sDrawOverlay->uniform("u_projection", mPersp);
		sDrawOverlay->bindFbo("tex", gFullScreenFbo, 0);
		blendOverlay(oInkBlotOverlay, mPersp * mCamera, pow(clamp((time - Duration() + ovlBlendTime) / ovlBlendTime, 0.0f, 1.0f), 2.0f));
		sDrawOverlay->unbind();
		setBlendMode(NO_BLEND);
	}
	setDepthMode(NO_DEPTH);
}
Beispiel #2
0
void OpenGLRenderer::setDrawState(const glm::mat4& model, DrawBuffer* draw,
                                  const Renderer::DrawParameters& p) {
    useDrawBuffer(draw);

    for (GLuint u = 0; u < p.textures.size(); ++u) {
        useTexture(u, p.textures[u]);
    }

    setBlend(p.blendMode);
    setDepthWrite(p.depthWrite);
    setDepthMode(p.depthMode);

    ObjectUniformData objectData{model,
                             glm::vec4(p.colour.r / 255.f, p.colour.g / 255.f,
                                       p.colour.b / 255.f, p.colour.a / 255.f),
                             1.f, 1.f, p.visibility};
    uploadUBO(UBOObject, objectData);

    drawCounter++;
#ifdef RW_GRAPHICS_STATS
    if (currentDebugDepth > 0) {
        profileInfo[currentDebugDepth - 1].draws++;
        profileInfo[currentDebugDepth - 1].primitives += p.count;
    }
#endif
}
Beispiel #3
0
void OpenGLRenderer::invalidate() {
    currentDbuff = nullptr;
    currentProgram = nullptr;
    currentTextures.clear();
    currentUBO = 0;
    setBlend(BlendMode::BLEND_NONE);
    setDepthMode(DepthMode::OFF);
}
Beispiel #4
0
MGLContext::MGLContext(void):
m_currentFrameBuffer(0)
{
	// version
	const char * version = (const char *)glGetString(GL_VERSION);
	if(version)
	{
		sscanf(version, "%d", &g_GLversion);
		printf("GL_VERSION : %s\n", version);
	}

	// init cull face (back)
	enableCullFace();
	setCullMode(M_CULL_BACK);

	// normalize
	glEnable(GL_NORMALIZE);

	// fog
	glHint(GL_FOG_HINT, GL_NICEST);
	glFogf(GL_FOG_MODE, GL_LINEAR);

	// depth
	enableDepthTest();
	setDepthMode(M_DEPTH_LEQUAL);
	glClearDepth(1.0f);

	// line
	glLineWidth(1);

	// stencil
	glClearStencil(0);

	// pixel pack/unpack
	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
	glPixelStorei(GL_PACK_ALIGNMENT, 1);
	
	// anisotropic filtering
	glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisotropy);
}
Beispiel #5
0
MES2Context::MES2Context(void):
m_currentFrameBuffer(0)
{
    m_matrixStep = 0;
    m_matrixMode = M_MATRIX_MODELVIEW;

    // version
    const char * version = (const char *)glGetString(GL_VERSION);
    if(version)
    {
        m_gl_version=version;
        sscanf(version, "%d", &g_GLversion);
    }

    // init cull face (back)
    enableCullFace();
    setCullMode(M_CULL_BACK);

    // depth
    enableDepthTest();
    setDepthMode(M_DEPTH_LEQUAL);
    glClearDepthf(1.0f);

    // line
    glLineWidth(1);

    // stencil
    glClearStencil(0);

    // pixel pack/unpack
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glPixelStorei(GL_PACK_ALIGNMENT, 1);

    // anisotropic filtering
    glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisotropy);
}
Beispiel #6
0
void EndScene::_draw(float time)
{
	std::vector<vec3> path;

	skrand(625734);
	for (int i = 0; i < 10; i++)
		path.push_back(endCamPos + vec3(rand(-1.f, 1.f), rand(-1.f, 1.f), rand(-1.f, 1.f)));

	mat4 mPersp = perspective(45.0f, demo.aspect, 0.5f, 1000.0f);
	mat4 mCamera = lookAt(interpolatePath(path, time / Duration()) * 0.1f, endLookAt * 0.1f, vec3(0, 1, 0));

	setDepthMode(DEPTH_FULL);
	for (int i = 0; i < ARRAY_SIZE(tPark); i++) {
		GlslShader *sDraw = sPark[i];
		sDraw->bind();
		sDraw->uniform("u_matrix", mPersp * mCamera);
		sDraw->uniform("u_modelview", mCamera);
		sDraw->uniform("u_projection", mPersp);
		sDraw->uniform("u_alpha", 1.0f);
		sDraw->bindTexture("tex", tPark[i], 0);
		oPark->draw(i);
		sDraw->unbind();
	}

	sDrawFlat->bind();
	sDrawFlat->bindTexture("tex", tSmoke, 0);
	setBlendMode(BLEND_ALPHA);
	sDrawFlat->uniform("u_alpha", smokeAlpha);
	mat4 sm(1);
	sm = translate(sm, smokeCenter * 0.1f);
	sm = rotate(sm, smokeRot, vec3(0, 1, 0));
	sm = scale(sm, vec3(smokeSize, 1));
	sDrawFlat->uniform("u_matrix", mPersp * mCamera * sm);

	int animStep = int(floor(time * 24.0f));
	int animX = animStep & 7;
	int animY = (animStep >> 3) & 3;
	float l = float(animX) / 8, r = float(animX + 1) / 8;
	float b = float(animY) / 4, t = float(animY + 1) / 4;

	drawRect(vec2(-0.5, -0.5), vec2(0.5, 0.5), vec2(l, t), vec2(r, b));
	sDrawFlat->unbind();

	setDepthMode(NO_DEPTH);

	float logoFade = clamp((time - logoFadeStart) / (logoFadeEnd - logoFadeStart), 0.f, 1.f);

	setBlendMode(BLEND_ALPHA);
	sDrawFlat->bind();
	sDrawFlat->bindTexture("tex", tLogo, 0);
	sDrawFlat->uniform("u_alpha", logoFade);
	mat4 lm(demo.fix_aspect(mat4(1)));
	lm = translate(lm, logoCenter + vec3(sin(time) * 2, cos(2 * time), 0) * .01f);
	lm = scale(lm, vec3(tLogo->aspect, 1, 1) * logoSize);
	sDrawFlat->uniform("u_matrix", lm);
	drawUnitQuad();
	lm = demo.fix_aspect(mat4(1));
	lm = translate(lm, textCenter + vec3(cos(time + .6135), sin(-2 * time - .6135), 0) * .003f);
	lm = scale(lm, vec3(tText->aspect, 1, 1) * textSize);
	sDrawFlat->uniform("u_matrix", lm);
	sDrawFlat->bindTexture("tex", tText, 0);
	drawUnitQuad();
	sDrawFlat->unbind();
	setBlendMode(NO_BLEND);
}
Beispiel #7
0
void CubewallScene::_draw(float time)
{
	int textBitmapWidthL = min(textBitmapWidth, (int)(time*30.f));

	time -= SceneTime::outStorm2cubewall;

	float fadeIn = min(1.0f, 1.f+time*0.33f);
	bool fadeActive = (fadeIn < 1.0);

	if (!fadeActive)
	{
		fboOverlay->bind();
	}

	float fade2 = max(0.f, min(1.f, time));

	setBlendMode(NO_BLEND);
	setCullMode(NO_CULL);
	setDepthMode(NO_DEPTH);
	glClearDepth(1.0f);

	glClearColor(56.f/256.f * fade2, 60.f/256.f * fade2, 50.f/256.f * fade2, 1.0f);
	glClear((fadeActive ? 0 : GL_COLOR_BUFFER_BIT) | GL_DEPTH_BUFFER_BIT);

	float ctime = max(0.f, time);
	int cctime = clamp((int)(gMusic->getBeat() / 16) - int(SceneTime::cubewallStart / BEAT / 16), 0, 6); //6 Teile,Schluß

	vec3 eye(-1.5*((cctime & 2) ? -1.f : 1.f), 0.5, (cctime & 1) ? 1. : (2. + 0.95*cos(ctime*0.2) + ctime*ctime*0.005));
	vec3 center(0, -0.1 + 0.2*sin(time*0.15) + 0.5*atan(time*0.1), 0);
	vec3 up(0, 1, 0);
	mat4 view = lookAt(eye, center, up);
	mat4 proj = perspective<float>(30.f + 10.f*(float)cos(time*0.1), demo.aspect, 0.001f, 100.f);
	mat4 projView = proj*view;

	floorClearShader->bind();

	setBlendMode(BLEND_ALPHA);
	floorClearShader->uniform("u_fade", fadeIn);
	floorClearShader->uniform("u_matrix", projView);
	drawArray(GL_TRIANGLE_FAN, floorVerts, NULL, NULL, NULL, NULL, sizeof(floorVerts) / (3 * sizeof(float)));

	floorClearShader->unbind();


	setDepthMode(DEPTH_FULL);
	setBlendMode(NO_BLEND);

	cubeShader->bind();

	cubeShader->uniform("u_eye", eye);
	cubeShader->uniform("u_matrix", projView);

	float cubeScaleFade = clamp((Duration() - time - 4.0f) / 1.0f, 0.0f, 1.0f);

	//ab 179: Kötzchen weg
	float explosionTime = max(0.f, time - (179.f - SceneTime::cubewallStart));
	float explosionY = explosionTime*explosionTime;

	float cubeScale = 16.f / (float)textBitmapWidth;

	int cubeInstanceIndex = 0;

	for (int x = 0; x < textBitmapWidthL; x++)
	{
		for (int y = 0; y < textBitmapHeight; y++)
		{
			int cubeIndex = ((textBitmapHeight - 1) - y)*textBitmapWidth + x;
			int pixelPos = cubeIndex * 4;
			int   a = textBitmap[pixelPos + 3];
			if (a == 0) continue;
			float r = (textBitmap[pixelPos]   * a) * (1.f/(255.f*255.f));
			float g = (textBitmap[pixelPos+1] * a) * (1.f/(255.f*255.f));
			float b = (textBitmap[pixelPos+2] * a) * (1.f/(255.f*255.f));

			float random = randomValues[cubeIndex];
			float cubeShiftAmp = 1.f - fract(gMusic->getBeat());// fmod(time * 2 * 1.2f, 1.f);
			float cubeShift = (0.5f - random) * cubeShiftAmp * 2;

			vec4 color(r, g, b, 1.f);
			color *= (1. - (0.5*cubeShift) + cubeShift*random);
			float highlightRandom = randomValues[((textBitmapHeight - 1) - y)*textBitmapWidth + (x / 3 + (int)(gMusic->getBeat() / 4)) % (textBitmapWidth*textBitmapHeight)];
			float highlight = pow(highlightRandom, 10) * 10;
			color *= 1. + highlight;

			for (int mirror = 0; mirror < 2; mirror++)
			{
				vec3 pos(x*cubeScale + time*-0.65f + 1.5f, (y*cubeScale + 0.05f) * (mirror ? -1 : 1), cubeShift*0.5f*cubeScale);
				pos.y -= explosionY*(1.f+0.1f*random);
				pos.x += explosionTime*sin(10.f*random);

				cubePosScale[cubeInstanceIndex] = vec4(pos, cubeScaleFade * 0.4f*cubeScale);
				cubeCol     [cubeInstanceIndex] = color;
				cubeInstanceIndex++;

				if (cubeInstanceIndex == 510) //TODO: allokierter Buffer für alle Werte statt der nur 1024 Konstanten-Register
				{
					cubeShader->uniform("u_posScale", cubePosScale, cubeInstanceIndex);
					cubeShader->uniform("u_color", cubeCol, cubeInstanceIndex);
					drawArray(GL_TRIANGLE_STRIP, semicube, NULL, NULL, NULL, NULL, sizeof(semicube) / (3 * sizeof(float)), cubeInstanceIndex);
					cubeInstanceIndex = 0;
				}
			}
		}
	}

	cubeShader->uniform("u_posScale", cubePosScale, cubeInstanceIndex);
	cubeShader->uniform("u_color", cubeCol, cubeInstanceIndex);
	drawArray(GL_TRIANGLE_STRIP, semicube, NULL, NULL, NULL, NULL, sizeof(semicube) / (3 * sizeof(float)), cubeInstanceIndex);

	cubeShader->unbind();

	floorShader->bind();
	setBlendMode(BLEND_ALPHA);
	floorShader->uniform("u_eye", eye);
	floorShader->uniform("u_matrix", projView);
	floorShader->uniform("u_fade", fadeIn);
	drawArray(GL_TRIANGLE_FAN, floorVerts, NULL, NULL, NULL, NULL, sizeof(floorVerts) / (3 * sizeof(float)));
	floorShader->unbind();

	if (!fadeActive)
	{
		fboOverlay->unbind();

		setBlendMode(NO_BLEND);
		setCullMode(NO_CULL);
		setDepthMode(NO_DEPTH);

		kratzerShader->bind();
		kratzerShader->bindFbo("src", fboOverlay, 0);

		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
		kratzerShader->bindTexture("tex", kratzer, 1);
		kratzerShader->uniform("u_fade", fade2);
		drawFullscreenQuad();
		kratzerShader->unbind();
	}

	setDepthMode(NO_DEPTH);
	setBlendMode(BLEND_ALPHA);
	setCullMode(NO_CULL);

	if (fadeIn >= 1.0f)
	{
		float creditsStart = 3.f;
		float creditsDuration = (SceneTime::lazorsStart - SceneTime::cubewallStart) - creditsStart;
		float creditTime = (time - creditsStart - 1.f) * 3.f / creditsDuration;
		float pos = floor(creditTime);
		creditsShader->bind();
		creditsShader->bindTexture("tex", credits, 0);
		creditsShader->uniform("fade", 2 * (creditTime - pos));
		drawRect(vec2(-1, -1 + 0.1185), vec2(1, -1 + 2 * 0.1185), vec2(0, (1. / 3.)*(pos + 1)), vec2(1, (1. / 3.)*pos));
		creditsShader->unbind();
	}
}