Derelict3: грешка в сегмента на glfwPollEvents

Опитвам се да получа основен пример за GLFW, работещ с Derelict3 на D2. Изтеглих този пример от архивите на пощенския списък на D: http://forum.dlang.org/thread/[email protected]

Ето моят код досега:

import std.stdio;

import derelict.opengl3.gl;
import derelict.glfw3.glfw3;

pragma(lib, "DerelictGL3");
pragma(lib, "DerelictGLFW3");
pragma(lib, "DerelictUtil");
pragma(lib, "dl");

const int width = 800;
const int height = 600;

void init() {
    glViewport(0,0,width,height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
}

void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POLYGON);
        glVertex2d(0,0);
        glVertex2d(0,height);
        glVertex2d(width,height);
        glVertex2d(height,0);
    glEnd();
}

extern (C) {
    void resizeWindow(GLFWwindow window, int w, int h) {
    }

    void refreshWindow(GLFWwindow window) {
        writeln("Refresh");
        display();
    }

    void mouseMove(GLFWwindow window, int x, int y) {
    }

    void mouseClick(GLFWwindow window, int button, int action) {
    }

    int windowClose(GLFWwindow window) {
        //running = false;
        return GL_TRUE;
    }

    void keyTrigger(GLFWwindow window, int key, int action) {
        if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) {
            //running = false;
        }
    }
}

void main() {
    DerelictGL.load();
    DerelictGLFW3.load();

    if (!glfwInit()) {
        writeln("glfwInit didn't work");
        return;
    }

    auto window = glfwCreateWindow(width,height,GLFW_WINDOWED,"Hello 
DerelictGLFW3",null);
    glfwMakeContextCurrent(window);

    init();

    // register callbacks
    /*
    glfwSetWindowRefreshCallback(window, &refreshWindow);
    glfwSetWindowSizeCallback(window, &resizeWindow);
    glfwSetCursorPosCallback(window, &mouseMove);
    glfwSetMouseButtonCallback(window, &mouseClick);
    glfwSetWindowCloseCallback(window, &windowClose);
    glfwSetKeyCallback(window, &keyTrigger);
    */

    bool opened = true;
    while(opened) {
        display();
        glfwSwapBuffers(window);

        writeln("Before");
        glfwPollEvents();
        writeln("After");
    }
    glfwTerminate();
}

Понастоящем това се компилира и работи според очакванията, но веднага щом разкоментирам всички регистрации на обратно извикване, получавам segfault точно преди glfwPollEvents().

Не съм сигурен какво става тук. Мислех, че може да е конфликт в библиотеката, но всичко останало изглежда върви добре.

Сграда с:

dmd -I$HOME/sandbox/Derelict3/import -L-L$HOME/sandbox/Derelict3/lib -ofgame test.d

Платформа: Linux x64 (Fedora 17)

$HOME/sandbox/Derelict3 е git клонинг на https://github.com/aldacron/Derelict3

Също така, има ли пример за рендиране на проста форма с помощта на Derelict3 и GLFW?


person beatgammit    schedule 16.11.2012    source източник


Отговори (1)


Вашият код работи добре за мен с най-новия Derelict3 (commit b133eda) и GLFW3 (26abe0a) от https://github.com/elmindreda/glfw.git

Бих направил тези неща (в този ред):

  1. Уверете се, че вашите споделени библиотеки на Derelict са актуални (изпълнете rdmd build.d в директорията Derelict3/build).
  2. Уверете се, че вашите GLFW3 библиотеки са актуални (предполагам, че изграждате от изходния код, така че не забравяйте да изтеглите и възстановите, ако се появят нови ангажименти). Не забравяйте да make install.
  3. Ако все още имате проблема, опитайте да използвате GDB, за да получите обратно проследяване (препоръчвам да компилирате вашия тестов код с -g).

Не много прост пример (използва програмируем конвейер): https://gist.github.com/4090381

person Justin W    schedule 16.11.2012
comment
Е, това определено ме кара да се чувствам по-добре. Имах предчувствие, че може да е нещо с версия. Благодаря! Просто е трудно да се започне (никъде няма примери). - person beatgammit; 16.11.2012
comment
Добавих връзка към пример в моя отговор. Той използва програмируемия тръбопровод, така че е разпръснат върху няколко файла, но вероятно там трябва да се преместите. - person Justin W; 17.11.2012
comment
Беше остаряла версия на glfw. Благодаря! - person beatgammit; 17.11.2012