GL / glx не связывается правильно

Системные характеристики и задачи

Я использую Code :: Blocks в Ubuntu 10.10 и играю с OpenGL и glx. Я изучаю C ++ (имея опыт работы с C и Java), поэтому стиль любого кода не соответствует каким-либо действительно хорошим стандартам (но я открыт для предложений о том, как улучшить, даже если вы нет ответа на вопрос)

Редактировать:

Огромная реализация: по умолчанию OpenGL Project Code :: Blocks создает C, а не C ++. Я сейчас занимаюсь этим.

В настоящее время я пытаюсь изменить проект OpenGL по умолчанию на Code :: Blocks в простой трехмерный движок. Я получаю сообщение об ошибке:

ожидается ‘=’, ‘,’, ‘;’, ‘asm’ или ‘__attribute__’ перед Draw

Что исчезает, как только я закомментирую #include для ‹GL / glx.h>

Я где-то читал на форуме, что Code :: Blocks не смотрит в usr / include / по умолчанию, но я добавил это в каталоги поиска для компилятора в параметрах сборки проекта, и это, похоже, ничего не исправило.

Код:

main.cpp: main.c:

#include <time.h>
#include "Draw.h"

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{

/*draw init here*/

Draw::Draw renderer = Draw::Draw.getDraw();

printf( "Press left mouse button to rotate around X axis\n" );
printf( "Press middle mouse button to rotate around Y axis\n" );
printf( "Press right mouse button to rotate around Z axis\n" );
printf( "Press ESC to quit the application\n" );

/* timing variable*/
/* Set it to delay half a second before rendering the first frame*/
clock_t flip_time = clock() + 0.5f * CLOCKS_PER_SEC;

while (1)
{


    /* Update models */


    /* Draw scene */

    /*  wait until it's been 1/60th of a second*/
    while(clock() < flip_time){}

    flip_time = clock() + (1.0f/60.0f) * CLOCKS_PER_SEC;
    /* Actually flip the frame */

}
}

Draw.h:

#ifndef DRAW_H
#define DRAW_H

#include <GL/glx.h>    /* This is the problem line */
#include <GL/gl.h>

#include <X11/X.h>    /* X11 constant (e.g. TrueColor) */
#include <X11/keysym.h>

class Draw
{
public:
    static Draw getDraw();
    virtual ~Draw();
    void update();
    void render();

protected:
private:
    Draw();
    bool init();

    /* The singleton*/
    static Draw *instance;
    static bool exists;

    /* X Window values */
    Display             *dpy;
    Window               win;
    GLboolean            doubleBuffer;

    /* X Parameters*/
    XVisualInfo         *vi;
    Colormap             cmap;
    XSetWindowAttributes swa;
    GLXContext           cx;
    XEvent               event;
    int                  dummy;

};

#endif // DRAW_H

И последнее, но не менее важное: Draw.cpp:

#include "Draw.h"

/* Set up the singleton*/
bool Draw::exists = false;
Draw* Draw::instance = NULL;

Draw::Draw()
{
/*TODO: make this constructor */
}

Draw::~Draw()
{
//dtor
}

Draw Draw::getDraw()
{
if(!exists)
{
    instance = new Draw();
    instance->init();
    exists = true; //Thanks mat, This line was accidentally removed with extraneous comments
}

return *instance;
}

bool Draw::init()
{
/* Get the buffers ready */
static int snglBuf[] = {GLX_RGBA, GLX_DEPTH_SIZE, 16, None};
static int dblBuf[] = {GLX_RGBA, GLX_DEPTH_SIZE, 16, GLX_DOUBLEBUFFER, None};

/* Double Buffered is best*/
doubleBuffer = GL_TRUE;

/*TODO: add constructor if it hasn't been constructed already*/

dpy = XOpenDisplay(NULL);
if (dpy == NULL)
{
    return false;
}

/* make sure OpenGL's GLX extension supported */
if(!glXQueryExtension(dpy, &dummy, &dummy))
{
    return false;
}

/* find an appropriate visual */
/* find an OpenGL-capable RGB visual with depth buffer */
vi = glXChooseVisual(dpy, DefaultScreen(dpy), dblBuf);

if (vi == NULL)
{
    vi = glXChooseVisual(dpy, DefaultScreen(dpy), snglBuf);
    if (vi == NULL)
    {
        return false;
    }

    doubleBuffer = GL_FALSE;
}


/*
TODO: Fix or remove this
if(vi->class != TrueColor)
{
    return false;
}
*/
/* create an OpenGL rendering context  */

/* create an OpenGL rendering context */
cx = glXCreateContext(dpy, vi, /* no shared dlists */ None,
                    /* direct rendering if possible */ GL_TRUE);
if (cx == NULL)
{
    return false;
}

/* create an X window with the selected visual */

/* create an X colormap since probably not using default visual */
cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone);
swa.colormap = cmap;
swa.border_pixel = 0;
swa.event_mask = KeyPressMask    | ExposureMask
             | ButtonPressMask | StructureNotifyMask;
win = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0,
                  300, 300, 0, vi->depth, InputOutput, vi->visual,
                  CWBorderPixel | CWColormap | CWEventMask, &swa);
XSetStandardProperties(dpy, win, "main", "main", None,
                     NULL, NULL, NULL);

/* bind the rendering context to the window */
glXMakeCurrent(dpy, win, cx);

/* request the X window to be displayed on the screen */
XMapWindow(dpy, win);

/* configure the OpenGL context for rendering  */
glEnable(GL_DEPTH_TEST); /* enable depth buffering */
glDepthFunc(GL_LESS);    /* pedantic, GL_LESS is the default */
glClearDepth(1.0);       /* pedantic, 1.0 is the default */

/* frame buffer clears should be to black */
glClearColor(0.0, 0.0, 0.0, 0.0);

/* set up projection transform */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10.0);
/* establish initial viewport */

/* pedantic, full window size is default viewport */
glViewport(0, 0, 300, 300);

return true;
}

void Draw::update()
{
/*TODO: Add things to draw here*/
}

void Draw::render()
{
    /* actually flip buffers here */
}

Я удалил массу комментариев, прежде чем размещать это здесь, но это не должно влиять на то, компилируется он или нет.

Спасибо!


person Jeremy    schedule 06.04.2011    source источник


Ответы (2)


Эта строка в вашем основном файле неверна:

Draw::Draw renderer = Draw::Draw.getDraw();

Draw::Draw не тип. Чтобы это скомпилировать, вам просто нужно:

Draw renderer = Draw.getDraw();

Похоже, вы пытаетесь создать синглтон. Ваш код вообще этого не делает, вы будете получать копию каждый раз. (Обратите внимание, что вы нигде не устанавливаете exists, но это просто дополнительная ошибка.) Вы должны возвращать указатель или ссылку на общий экземпляр. См., Например, эту статью, чтобы получить правильный синтаксис: C ++ Singleton design pattern.

person Mat    schedule 06.04.2011
comment
Спасибо, я исправил первую ошибку и добавил строку, которую пропустил при копировании кода. Я просмотрел эту страницу ранее, но мне рекомендовали вместо этого использовать эту. Я еще раз посмотрю, чтобы убедиться, что мой шаблон работает правильно, но я уверен, что это не будет слишком сложно понять, когда я смогу скомпилировать и протестировать то, над чем я работаю. - person Jeremy; 06.04.2011
comment
Вместо указателя он мог также использовать ссылку; тот же эффект, в большинстве случаев идентичный двоичный код, но делает некоторые вещи немного лучше. Измените статический Draw getDraw () на статический Draw & getDraw (). Кроме того, поскольку ваш конструктор является частным, вы можете вызывать init прямо оттуда. - На заметку: лично я считаю синглтоны антипаттерном, их мало что можно использовать. Возможно, фабрики классов, но это тоже антипаттерны IMHO. - person datenwolf; 06.04.2011

Я обнаружил проблему со ссылкой.

Проект по умолчанию для OpenGL в Code :: Blocks - НЕ C ++, это C. Я настроил его на использование g ++, и он исправил проблему с некорректным связыванием glx. Я изменил свой синглтон, чтобы он стал немного больше похож на this, и теперь он тоже работает правильно . У меня проблема с тем, что окно не появляется, но я должен это понять.

Спасибо!

person Jeremy    schedule 06.04.2011