This commit is contained in:
Stefan Bühler 2009-02-02 16:29:25 +01:00
parent f88bc07e4a
commit 64fa8ce59f
3 changed files with 45 additions and 33 deletions

View File

@ -27,6 +27,8 @@
#include <QGLPixelBuffer> #include <QGLPixelBuffer>
#include <QDebug>
#include <math.h> #include <math.h>
template<typename T> template<typename T>
@ -51,7 +53,7 @@ namespace toruschess {
m_textureBuffer(0), m_textureID(0), m_textureBuffer(0), m_textureID(0),
m_camDist(5) ,m_camRotX(45), m_camRotY(0), m_camRotZ(0), m_camDist(5) ,m_camRotX(45), m_camRotY(0), m_camRotZ(0),
m_originX(0), m_originY(0), m_mouseLastX(0), m_mouseLastY(0), m_originX(0), m_originY(0), m_mouseLastX(0), m_mouseLastY(0),
m_skySphere(0), m_skyTextureID(0), m_skySphere(0), m_skyTextureID(0), m_skyTimerID(0), m_skyOffset(0),
m_pickTextureID(0) { m_pickTextureID(0) {
qDebug("Field3d::Field3D"); qDebug("Field3d::Field3D");
for (int x = 0; x < 8; x++) for (int y = 0; y < 8; y++) m_marked[x][y] = false; for (int x = 0; x < 8; x++) for (int y = 0; y < 8; y++) m_marked[x][y] = false;
@ -108,6 +110,8 @@ namespace toruschess {
connect(m_game, SIGNAL(updated()), this, SLOT(fieldUpdated())); connect(m_game, SIGNAL(updated()), this, SLOT(fieldUpdated()));
m_pickBuffer = new QGLPixelBuffer(QSize(1024, 1024)); m_pickBuffer = new QGLPixelBuffer(QSize(1024, 1024));
m_skyTimerID = startTimer(20);
} }
void Field3D::resizeGL(int w, int h) { void Field3D::resizeGL(int w, int h) {
@ -130,7 +134,12 @@ namespace toruschess {
glDisable(GL_FOG); glDisable(GL_FOG);
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glBindTexture(GL_TEXTURE_2D, m_skyTextureID); glBindTexture(GL_TEXTURE_2D, m_skyTextureID);
glMatrixMode(GL_TEXTURE);
glPushMatrix();
glTranslatef(m_skyOffset, 0, 0);
gluSphere(m_skySphere, 256, 64, 64); gluSphere(m_skySphere, 256, 64, 64);
glMatrixMode(GL_TEXTURE);
glPopMatrix();
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
double ox = 2.0*(m_originX/(double)m_textureSize), oy = 2.0*(m_originY/(double)m_textureSize); double ox = 2.0*(m_originX/(double)m_textureSize), oy = 2.0*(m_originY/(double)m_textureSize);
@ -163,6 +172,7 @@ namespace toruschess {
const int repeat = 10; const int repeat = 10;
double ox = -2.0*(m_originX/(double)m_textureSize), oy = 2.0*(m_originY/(double)m_textureSize); double ox = -2.0*(m_originX/(double)m_textureSize), oy = 2.0*(m_originY/(double)m_textureSize);
glEnable(GL_FOG); glEnable(GL_FOG);
glEnable(GL_LIGHTING);
glBindTexture(GL_TEXTURE_2D, m_textureID); glBindTexture(GL_TEXTURE_2D, m_textureID);
glBegin(GL_QUADS); glBegin(GL_QUADS);
glTexCoord2f(-repeat+ox, repeat+oy); glVertex3f(-10*repeat, 0, -10*repeat); glTexCoord2f(-repeat+ox, repeat+oy); glVertex3f(-10*repeat, 0, -10*repeat);
@ -175,28 +185,12 @@ namespace toruschess {
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
} }
Pos Field3D::findPos(int mx, int my) { bool Field3D::findPos(int mx, int my, Pos &p) {
m_pickBuffer->makeCurrent(); glDisable(GL_FOG);
glDisable(GL_LIGHTING);
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
glViewport(0, 0, 1024, 1024);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.0, double(width())/height(), 0.01, 1000);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0, 0, -m_camDist);
glRotatef(m_camRotX,1,0,0);
glRotatef(m_camRotY,0,1,0);
glRotatef(m_camRotZ,0,0,1);
if (m_boardMode == TORUS) { if (m_boardMode == TORUS) {
double ox = 2.0*(m_originX/(double)m_textureSize), oy = 2.0*(m_originY/(double)m_textureSize); double ox = 2.0*(m_originX/(double)m_textureSize), oy = 2.0*(m_originY/(double)m_textureSize);
glBindTexture(GL_TEXTURE_2D, m_pickTextureID); glBindTexture(GL_TEXTURE_2D, m_pickTextureID);
@ -238,11 +232,12 @@ namespace toruschess {
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
m_pickBuffer->doneCurrent(); unsigned char pxbuf[3];
QImage i = m_pickBuffer->toImage(); glReadPixels(mx, height() - 1 - my, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, &pxbuf);
QRgb col = i.pixel((1024*mx)/width(), (1024*my)/height()); paintGL();
qDebug << QColor(col); qDebug() << pxbuf[0] << pxbuf[1];
return Pos(qRed(col), qGreen(col)); p = Pos(pxbuf[0] - 50, pxbuf[1] - 50);
return pxbuf[0] >= 50;
} }
@ -275,9 +270,10 @@ namespace toruschess {
for (int x = 0; x < 8; x++) for (int x = 0; x < 8; x++)
for (int y = 0; y < 8; y++) { for (int y = 0; y < 8; y++) {
QRect prect(x * pieceSize, y * pieceSize, pieceSize - 1, pieceSize - 1); QRect prect(x * pieceSize, y * pieceSize, pieceSize - 1, pieceSize - 1);
pt.fillRect(prect, QBrush(QColor(x,y,0))); pt.fillRect(prect, QBrush(QColor(x+50,y+50,50)));
} }
m_pickTextureID = bindTexture(*pickimage); m_pickTextureID = bindTexture(*pickimage);
// delete pickimage;
} }
/* glBindTexture(GL_TEXTURE_2D, m_textureID); /* glBindTexture(GL_TEXTURE_2D, m_textureID);
@ -346,8 +342,9 @@ namespace toruschess {
void Field3D::mousePressEvent(QMouseEvent *event) { void Field3D::mousePressEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton) { if (event->button() == Qt::LeftButton) {
QList<Move> moves; QList<Move> moves;
Pos p = findPos(event->x(), event->y()); Pos p;
moves = m_game->field()->validMoves(p); if (findPos(event->x(), event->y(), p))
moves = m_game->field()->validMoves(p);
markMoves(moves); markMoves(moves);
updateTexture(); updateTexture();
updateGL(); updateGL();
@ -375,13 +372,15 @@ namespace toruschess {
m_mouseLastX = event->x(); m_mouseLastX = event->x();
m_mouseLastY = event->y(); m_mouseLastY = event->y();
if (event->button() == Qt::LeftButton) { if (event->button() == Qt::LeftButton) {
/* if (m_markedMoves.size() == 0) return; if (m_markedMoves.size() == 0) return;
Pos from = m_markedMoves[0].from(); Pos from = m_markedMoves[0].from();
QList<Move> moves; QList<Move> moves;
markMoves(QList<Move>()); markMoves(QList<Move>());
Pos p = findPos(event->x(), event->y()); Pos p;
Move m(m_game->field(), from, p); if (findPos(event->x(), event->y(), p)) {
m_game->move(m);*/ Move m(m_game->field(), from, p);
m_game->move(m);
}
} }
} }
@ -401,4 +400,11 @@ namespace toruschess {
updateTexture(); updateTexture();
updateGL(); updateGL();
} }
void Field3D::timerEvent(QTimerEvent *) {
m_skyOffset = rotate<double>(m_skyOffset + 0.001, 1);
if (m_boardMode == TORUS)
updateGL();
}
} }

View File

@ -60,6 +60,8 @@ namespace toruschess {
virtual void mouseReleaseEvent(QMouseEvent *event); virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void wheelEvent(QWheelEvent *event); virtual void wheelEvent(QWheelEvent *event);
virtual void timerEvent(QTimerEvent *event);
protected slots: protected slots:
void fieldUpdated(); void fieldUpdated();
@ -70,7 +72,7 @@ namespace toruschess {
void freeTexture(); void freeTexture();
void updateTexture(); void updateTexture();
Pos findPos(int mx, int my); bool findPos(int mx, int my, Pos &p);
Game *m_game; Game *m_game;
PieceLibrary *m_lib; PieceLibrary *m_lib;
@ -93,6 +95,8 @@ namespace toruschess {
/* skybox */ /* skybox */
GLUquadric *m_skySphere; GLUquadric *m_skySphere;
GLuint m_skyTextureID; GLuint m_skyTextureID;
int m_skyTimerID;
double m_skyOffset;
/* Pick */ /* Pick */
GLuint m_pickTextureID; GLuint m_pickTextureID;

View File

@ -34,3 +34,5 @@ CONFIG -= release
FORMS += optiondlg.ui FORMS += optiondlg.ui
DISTFILES += ../README