void GL2HudRenderer::render() { if (client->getStateId() != Client::StateId::PLAYING) return; const Character &character = client->getLocalCharacter(); if (!character.isValid()) return; GL(Enable(GL_TEXTURE_2D)); vec2f texs[4]; GL2TextureManager::Entry tex_entry = renderer->getTextureManager()->get(client->getLocalCharacter().getBlock()); GL2TextureManager::getTextureCoords(tex_entry.index, tex_entry.type, texs); GL(BindTexture(GL_TEXTURE_2D, tex_entry.tex)); GL(Color4f(1.0f, 1.0f, 1.0f, 1.0f)); GL(PushMatrix()); float d = (client->getGraphics()->getWidth() < client->getGraphics()->getHeight() ? client->getGraphics()->getWidth() : client->getGraphics()->getHeight()) * 0.05f; GL(Translatef(-client->getGraphics()->getDrawWidth() * 0.48f, -client->getGraphics()->getDrawHeight() * 0.48f, 0)); glBegin(GL_QUADS); glTexCoord2f(texs[0][0], texs[0][1]); glVertex2f(0, 0); glTexCoord2f(texs[1][0], texs[1][1]); glVertex2f(d, 0); glTexCoord2f(texs[2][0], texs[2][1]); glVertex2f(d, d); glTexCoord2f(texs[3][0], texs[3][1]); glVertex2f(0, d); glEnd(); LOG_OPENGL_ERROR; GL(PopMatrix()); }
// gluLookAt implementation taken from Mesa3D void CMatrixGLES::LookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez, GLfloat centerx, GLfloat centery, GLfloat centerz, GLfloat upx, GLfloat upy, GLfloat upz) { GLfloat forward[3], side[3], up[3]; GLfloat m[4][4]; forward[0] = centerx - eyex; forward[1] = centery - eyey; forward[2] = centerz - eyez; up[0] = upx; up[1] = upy; up[2] = upz; GLfloat tmp = sqrt(forward[0]*forward[0] + forward[1]*forward[1] + forward[2]*forward[2]); if (tmp != 0.0) { forward[0] /= tmp; forward[1] /= tmp; forward[2] /= tmp; } side[0] = forward[1]*up[2] - forward[2]*up[1]; side[1] = forward[2]*up[0] - forward[0]*up[2]; side[2] = forward[0]*up[1] - forward[1]*up[0]; tmp = sqrt(side[0]*side[0] + side[1]*side[1] + side[2]*side[2]); if (tmp != 0.0) { side[0] /= tmp; side[1] /= tmp; side[2] /= tmp; } up[0] = side[1]*forward[2] - side[2]*forward[1]; up[1] = side[2]*forward[0] - side[0]*forward[2]; up[2] = side[0]*forward[1] - side[1]*forward[0]; m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f; m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f; m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f; m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f; m[0][0] = side[0]; m[1][0] = side[1]; m[2][0] = side[2]; m[0][1] = up[0]; m[1][1] = up[1]; m[2][1] = up[2]; m[0][2] = -forward[0]; m[1][2] = -forward[1]; m[2][2] = -forward[2]; MultMatrixf(&m[0][0]); Translatef(-eyex, -eyey, -eyez); }
void GL2ChunkRenderer::renderChunk(vec3i64 chunkCoords) { auto it = renderInfos.find(chunkCoords); if (it == renderInfos.end() || it->second.dl == 0) return; Character &character = client->getLocalCharacter(); vec3i64 cd = chunkCoords - character.getChunkPos(); GL(PushMatrix()); GL(Translatef(cd[0] * (float) Chunk::WIDTH, cd[1] * (float) Chunk::WIDTH, cd[2] * (float) Chunk::WIDTH)) GL(CallList(it->second.dl)); GL(PopMatrix()); }