Use displaylists for 3d figure

This commit is contained in:
Stefan Bühler 2009-02-19 22:39:33 +01:00
parent b1b13ce865
commit 24a3454267
3 changed files with 18 additions and 10 deletions

View File

@ -17,8 +17,8 @@
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifndef TORUSCHESSTESTGAME_H
#define TORUSCHESSTESTGAME_H
#ifndef TORUSCHESSGAME_H
#define TORUSCHESSGAME_H
#include <QWidget>
#include <QSvgRenderer>

View File

@ -25,8 +25,6 @@
#include <lib3ds/io.h>
#include <lib3ds/mesh.h>
#include <GL/gl.h>
namespace toruschess {
typedef Lib3dsBool (*Lib3dsIoErrorFunc)(void *self);
typedef long (*Lib3dsIoSeekFunc)(void *self, long offset, Lib3dsIoSeek origin);
@ -117,7 +115,7 @@ typedef size_t (*Lib3dsIoWriteFunc)(void *self, const void *buffer, size_t size)
IO3ds io(data);
Lib3dsFile *f = lib3ds_file_new();
if (!lib3ds_file_read(f, io.io())) {
qDebug("data size: %i", (int) data.size());
// qDebug("data size: %i", (int) data.size());
lib3ds_file_free(f);
return NULL;
}
@ -126,13 +124,13 @@ typedef size_t (*Lib3dsIoWriteFunc)(void *self, const void *buffer, size_t size)
QByteArray loadResource(const QString &filename) {
QResource res(filename);
qDebug("res size: %i", (int) res.size());
// qDebug("res size: %i", (int) res.size());
return QByteArray((const char*) res.data(), (int) res.size());
}
PieceLibrary::PieceLibrary(QObject *parent)
: QObject(parent), m_pieces(0), m_buffers(0) {
: QObject(parent), m_pieces(0), m_buffers(0), m_pawn_list(0) {
m_board = new QImage*[2];
m_board[0] = new QImage(":/media/board2_white.png");
m_board[1] = new QImage(":/media/board2_dark.png");
@ -142,6 +140,7 @@ typedef size_t (*Lib3dsIoWriteFunc)(void *self, const void *buffer, size_t size)
PieceLibrary::~PieceLibrary() {
if (m_pawn) lib3ds_file_free(m_pawn);
if (m_pawn_list) glDeleteLists(m_pawn_list, 1);
delete [] m_pieces;
delete [] m_buffers;
delete [] m_board;
@ -190,9 +189,16 @@ typedef size_t (*Lib3dsIoWriteFunc)(void *self, const void *buffer, size_t size)
void PieceLibrary::paint_pawn() {
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_FLOAT,0,m_pawn->meshes->pointL);
for (unsigned int i = 0; i < m_pawn->meshes->faces; i++) {
glNormal3fv(m_pawn->meshes->faceL[i].normal);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, m_pawn->meshes->faceL[i].points);
if (m_pawn_list) {
glCallList(m_pawn_list);
} else {
m_pawn_list = glGenLists(1);
if (m_pawn_list) glNewList(m_pawn_list, GL_COMPILE_AND_EXECUTE);
for (unsigned int i = 0; i < m_pawn->meshes->faces; i++) {
glNormal3fv(m_pawn->meshes->faceL[i].normal);
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, m_pawn->meshes->faceL[i].points);
}
if (m_pawn_list) glEndList();
}
glDisableClientState(GL_VERTEX_ARRAY);
}

View File

@ -22,6 +22,7 @@
#include <QSvgRenderer>
#include <GL/gl.h>
#include <lib3ds/file.h>
/**
@ -60,6 +61,7 @@ namespace toruschess {
int m_width, m_height;
Lib3dsFile *m_pawn;
GLuint m_pawn_list;
};
}