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); }
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 }
void OpenGLRenderer::invalidate() { currentDbuff = nullptr; currentProgram = nullptr; currentTextures.clear(); currentUBO = 0; setBlend(BlendMode::BLEND_NONE); setDepthMode(DepthMode::OFF); }
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); }
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); }
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); }
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(); } }