QPixmap Renderer::renderMarkerOn(QPixmap pixmap, int symbol, int range, int color) const { // TODO maybe it would be good to directly integrate the renderMarker implementation and // make renderMarker be based on this method. (same for renderSymbol and renderSymbolOn) // We use a smaller size of marker in Mathdoku and Killer // Sudoku, to allow space for the cage labels. int size = m_mathdokuStyle ? (pixmap.width()+1)*3/4 : pixmap.width(); QPixmap symbolPixmap = renderMarker(symbol, range, size); if(color) { QPainter p(&symbolPixmap); p.setCompositionMode(QPainter::CompositionMode_Multiply); p.setBrush(QBrush(QColor(128,128,128,255))); p.drawRect(0, 0, size, size); p.setCompositionMode(QPainter::CompositionMode_DestinationOver); p.drawPixmap(0, 0, pixmap); p.end(); return symbolPixmap; } else { QPainter p(&pixmap); // Offset the marker from 0,0 in Mathdoku and Killer Sudoku. int offset = m_mathdokuStyle ? (size + 7)/8 : 0; p.drawPixmap(offset, 2*offset, symbolPixmap); p.end(); return pixmap; } }
void renderFrame(XStuff* xs, GameState* gs, InputState* is) { //mModel = IDENT_MATRIX; gs->sunNormal.x = cos(gs->frameTime * gs->sunSpeed); gs->sunNormal.y = sin(gs->frameTime * gs->sunSpeed); gs->sunNormal.z = 0.0; //mScale3f(10, 10, 10, &mModel); //mRot3f(0, 1, 0, gs->direction, &mModel); msPush(&gs->proj); msPerspective(60, gs->screen.aspect, nearPlane, farPlane, &gs->proj); msPush(&gs->view); // order matters! don't mess with this. msTrans3f(0, -1, gs->zoom, &gs->view); msRot3f(1, 0, 0, F_PI / 6, &gs->view); msRot3f(0,1,0, gs->direction, &gs->view); msTrans3f(-gs->lookCenter.x, 0, -gs->lookCenter.y, &gs->view); // y-up to z-up rotation msRot3f(1, 0, 0, F_PI_2, &gs->view); msScale3f(1, 1, -1, &gs->view); // calculate cursor position Vector cursorp; Vector eyeCoord; Vector worldCoord; Matrix p, invp, invv; // device space (-1:1) Vector devCoord; devCoord.x = 0.50; devCoord.y = 0.50; devCoord.z = -1.0; // eye space mInverse(msGetTop(&gs->proj), &invp); vMatrixMul(&devCoord, &invp, &eyeCoord); vNorm(&eyeCoord, &eyeCoord); // world space mInverse(msGetTop(&gs->view), &invv); vMatrixMul(&eyeCoord, &invv, &worldCoord); vNorm(&worldCoord, &worldCoord); // mFastMul(msGetTop(&gs->view), msGetTop(&gs->proj), &mp); // mInverse(&mp, &invmp); // vMatrixMul(&devCoord, &invmp, &cursorp); //printf("(%f, %f, %f)\n", worldCoord.x, worldCoord.y, worldCoord.z); Vector2 c2; c2.x = 300; //cursorp.x; c2.y = 300; //cursorp.z; // draw terrain // drawTerrainBlock(&gs->map, msGetTop(&gs->model), msGetTop(&gs->view), msGetTop(&gs->proj), &gs->cursorPos); drawTerrain(&gs->map, msGetTop(&gs->view), msGetTop(&gs->proj), &gs->cursorPos, &gs->screen.wh); renderMarker(gs, 0,0); msPop(&gs->view); msPop(&gs->proj); glUseProgram(textProg->id); // text stuff textProj = IDENT_MATRIX; textModel = IDENT_MATRIX; mOrtho(0, gs->screen.aspect, 0, 1, -1, 100, &textProj); //mScale3f(.5,.5,.5, &textProj); mScale3f(.06, .06, .06, &textModel); GLuint tp_ul = glGetUniformLocation(textProg->id, "mProj"); GLuint tm_ul = glGetUniformLocation(textProg->id, "mModel"); GLuint ts_ul = glGetUniformLocation(textProg->id, "fontTex"); glUniformMatrix4fv(tp_ul, 1, GL_FALSE, textProj.m); glUniformMatrix4fv(tm_ul, 1, GL_FALSE, textModel.m); glexit("text matrix uniforms"); glDisable(GL_CULL_FACE); glActiveTexture(GL_TEXTURE0); glexit("active texture"); glUniform1i(ts_ul, 0); glexit("text sampler uniform"); glBindTexture(GL_TEXTURE_2D, arial->textureID); glexit("bind texture"); glBindVertexArray(strRI->vao); glexit("text vao bind"); glBindBuffer(GL_ARRAY_BUFFER, strRI->vbo); glexit("text vbo bind"); glDrawArrays(GL_TRIANGLES, 0, strRI->vertexCnt); glexit("text drawing"); }