void Renderer::ApplyCamera(const Camera& cam, IContext& c){ Rect<unsigned int> r = cam.GetRect(); glViewport(r.x, r.y, r.width, r.height); glEnable(GL_SCISSOR_TEST); glScissor(r.x, r.y, r.width, r.height); CHECK_GL_ERROR(); Color bg = cam.BackgroundColor(); glClearColor(bg.Get(0), bg.Get(1), bg.Get(2), bg.Get(3)); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDisable(GL_SCISSOR_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); CHECK_GL_ERROR(); glMultMatrixf(cam.GetProjectionMatrix().GetData()); CHECK_GL_ERROR(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Apply camera transformation Matrix<4,4,float> camTrans = cam.GetTransformation()->GetAccumulatedMatrix(); if (!Invert(camTrans)) std::cout << "Camera matrix could not be inverted.\n"; glMultMatrixf(camTrans.GetData()); glEnable(GL_DEPTH_TEST); }
void OutlineShader::Draw(const Sprite *sprite, const Point &pos, const Point &size, const Color &color, const Point &unit, int frame) { glUseProgram(shader.Object()); glBindVertexArray(vao); glActiveTexture(GL_TEXTURE0); GLfloat scale[2] = {2.f / Screen::Width(), -2.f / Screen::Height()}; glUniform2fv(scaleI, 1, scale); Point uw = unit * size.X(); Point uh = unit * size.Y(); GLfloat transform[4] = { static_cast<float>(-uw.Y()), static_cast<float>(uw.X()), static_cast<float>(-uh.X()), static_cast<float>(-uh.Y()) }; glUniformMatrix2fv(transformI, 1, false, transform); GLfloat position[2] = { static_cast<float>(pos.X()), static_cast<float>(pos.Y())}; glUniform2fv(positionI, 1, position); glUniform4fv(colorI, 1, color.Get()); glBindTexture(GL_TEXTURE_2D, sprite->Texture(frame)); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glBindVertexArray(0); glUseProgram(0); }
void OutlineShader::Draw(const Sprite *sprite, const Point &pos, const Point &size, const Color &color) { glUseProgram(shader.Object()); glBindVertexArray(vao); glActiveTexture(GL_TEXTURE0); GLfloat scale[2] = {2.f / Screen::Width(), -2.f / Screen::Height()}; glUniform2fv(scaleI, 1, scale); GLfloat wh[2] = { static_cast<float>(size.X()), static_cast<float>(size.Y())}; glUniform2fv(sizeI, 1, wh); GLfloat position[2] = { static_cast<float>(pos.X()), static_cast<float>(pos.Y())}; glUniform2fv(positionI, 1, position); glUniform4fv(colorI, 1, color.Get()); glBindTexture(GL_TEXTURE_2D, sprite->Texture()); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glBindVertexArray(0); glUseProgram(0); }
void RingShader::Add(const Point &pos, float radius, float width, float fraction, const Color &color, float dash) { GLfloat position[2] = {static_cast<float>(pos.X()), static_cast<float>(pos.Y())}; glUniform2fv(positionI, 1, position); glUniform1f(radiusI, radius); glUniform1f(widthI, width); glUniform1f(angleI, fraction * 2. * PI); glUniform1f(dashI, dash ? 2. * PI / dash : 0.); glUniform4fv(colorI, 1, color.Get()); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }
void PointerShader::Add(const Point ¢er, const Point &angle, float width, float height, float offset, const Color &color) { GLfloat c[2] = {static_cast<float>(center.X()), static_cast<float>(center.Y())}; glUniform2fv(centerI, 1, c); GLfloat a[2] = {static_cast<float>(angle.X()), static_cast<float>(angle.Y())}; glUniform2fv(angleI, 1, a); GLfloat size[2] = {width, height}; glUniform2fv(sizeI, 1, size); glUniform1f(offsetI, offset); glUniform4fv(colorI, 1, color.Get()); glDrawArrays(GL_TRIANGLES, 0, 3); }
void FillShader::Fill(const Point ¢er, const Point &size, const Color &color) { if(!shader.Object()) throw runtime_error("FillShader: Draw() called before Init()."); glUseProgram(shader.Object()); glBindVertexArray(vao); GLfloat scale[2] = {2.f / Screen::Width(), -2.f / Screen::Height()}; glUniform2fv(scaleI, 1, scale); GLfloat centerV[2] = {static_cast<float>(center.X()), static_cast<float>(center.Y())}; glUniform2fv(centerI, 1, centerV); GLfloat sizeV[2] = {static_cast<float>(size.X()), static_cast<float>(size.Y())}; glUniform2fv(sizeI, 1, sizeV); glUniform4fv(colorI, 1, color.Get()); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glBindVertexArray(0); glUseProgram(0); }
void Font::DrawAliased(const string &str, double x, double y, const Color &color) const { glUseProgram(shader.Object()); glBindTexture(GL_TEXTURE_2D, texture); glBindVertexArray(vao); glUniform4fv(colorI, 1, color.Get()); // Update the scale, only if the screen size has changed. if(Screen::Width() != screenWidth || Screen::Height() != screenHeight) { screenWidth = Screen::Width(); screenHeight = Screen::Height(); GLfloat scale[2] = {2.f / screenWidth, -2.f / screenHeight}; glUniform2fv(scaleI, 1, scale); } GLfloat textPos[2] = { static_cast<float>(x - 1.), static_cast<float>(y)}; int previous = 0; bool isAfterSpace = true; bool underlineChar = false; const int underscoreGlyph = max(0, min(GLYPHS - 1, '_' - 32)); for(char c : str) { if(c == '_') { underlineChar = showUnderlines; continue; } int glyph = Glyph(c, isAfterSpace); if(c != '"' && c != '\'') isAfterSpace = !glyph; if(!glyph) { textPos[0] += space; continue; } glUniform1i(glyphI, glyph); glUniform1f(aspectI, 1.f); textPos[0] += advance[previous * GLYPHS + glyph] + KERN; glUniform2fv(positionI, 1, textPos); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); if(underlineChar) { glUniform1i(glyphI, underscoreGlyph); glUniform1f(aspectI, static_cast<float>(advance[glyph * GLYPHS] + KERN) / (advance[underscoreGlyph * GLYPHS] + KERN)); glUniform2fv(positionI, 1, textPos); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); underlineChar = false; } previous = glyph; } glBindVertexArray(0); glUseProgram(0); }