2014年4月14日月曜日

GLFW3とGLFW2とEmscripten-1.14とネイティブに対応したGLFWの継ぎ接ぎだらけのひな形

昨日、GLFW3のうさぎ流ひな形を書きました。今日はそれにGLFW2対応Emscripten-1.14対応を施し、1つのソースでGLFW3GLFW2Emscriptenネイティブに対応したGLFWのひな形のエグザンプルを用意しました。

GLFW3GLFW2の違いがどころがわかりやすいようにCPPで継ぎ接ぎしてみたつもりです。


  • GLFW3からGLFW2Emscriptenに対応した違いどころ
    • namespace { }
      • GLFW2にはGLFW3glfwSetWindowShouldClose相当の機能が無いので、ここにメインループ終了フラグ bool main_loop_is_continuous = true; を用意しました。
    • main
      • GLFW3でのみglfwSetErrorCallbackを仕込めるのでそのように。
      • ウィンドウ生成はGLFW2では1つのウィンドウしか扱わずglfwOpenWindowで生成しますが、GLFW3では複数のウィンドウを扱えglfwCreateWindowで生成してGLFWwindow*型でハンドルします。
        • GLFW2glfwOpenWindowGL_BOOLでウィンドウ生成の成否を返しますが、GLFW3glfwCreateWindowGLFWwindow*を返し有効なポインターかどうかで成否を判断しGLFWwindow*は今後もそのウィンドウの操作に対して使う為に保持しておきます。
      • ウィンドウの生成に成功した場合、生成したウィンドウは使い終わったなら破棄関数を呼ぶ必要があります。GLFW3ではglfwDestroyWindowにハンドルを渡しますが、GLFW2ではウィンドウはそもそも内部的に1つだけを扱っているので引数無しのglfwCloseWindowを、それぞれBOOST_SCOPE_EXIT_ALLで仕込んでおきます。
      • glfwMakeContextCurrentは複数のウィンドウを扱うGLFW3でのみ必要なのでそのように。
      • glfwSetKeyCallbackは、
        • GLFW3では対称とするウィンドウのハンドルを渡したり、コールバックでも受け取ったりしますが、GLFW2ではウィンドウハンドルはユーザーが扱う必要は無いので無しに。
        • GLFW2ではコールバックでkeyactionしか得られませんでしたが、GLFW3ではscancodemods、それにウィンドウハンドルを得られるのでそのように。
        • GLFW3ではESCキーGLFW_KEY_ESCAPEですが、GLFW2ではGLFW_KEY_ESCで定義されているのでそのように。
        • GLFW3にはglfwSetWindowShouldCloseがありますが、GLFW2では相当する機能が無いので namespace { } に用意した main_loop_is_continuous フラグを false にする対応に。
      • glfwSetFramebufferSizeCallbackGLFW3にのみ必要な機能なのでそのように。
      • メインループは
        • Emscriptenではemscripten_set_main_loopを使う様に。
        • glfwSwapBuffersGLFW3ではウィンドウハンドルを引数に渡しますがGLFW2では必要無いのでそのように。
        • ループ終了条件GLFW3ではglfwSetWindowShouldCloseを、GLFW2では namespace { } に用意した main_loop_is_continuous フラグによるように。


0 件のコメント:

コメントを投稿