static void testcase1(const char *desc) { int err; printteststart(__FILE__, __PRETTY_FUNCTION__, EXPECTED2PASS, desc); if (dontrun) return; err = ggInit(); if (err != GGI_OK) { printfailure("expected return value: 0\n" "actual return value: %i\n", err); return; } err = ggInit(); if (err != GGI_OK) { printfailure("expected return value: 0\n" "actual return value: %i\n", err); return; } printsuccess(); return; }
int main(int argc, char **argv) { #if defined(GGINIT_DEFINED) ggInit(); #endif gg_lib = AS3_Object(""); gg_reg(gg_lib, "PacketToByteArray", thunk_PacketToByteArray); gg_reg(gg_lib, "CreatePacketFromByteArray", thunk_CreatePacketFromByteArray); gg_reg(gg_lib, "InitAnnounceResponsePacket", thunk_InitAnnounceResponsePacket); gg_reg(gg_lib, "InitPeerDownloadInfo", thunk_InitPeerDownloadInfo); gg_reg(gg_lib, "InitBlockMap", thunk_InitBlockMap); gg_reg(gg_lib, "InitSubPiecePacket", thunk_InitSubPiecePacket); gg_reg(gg_lib, "SubPieceRequestPacketToByteArray", thunk_SubPieceRequestPacketToByteArray); AS3_LibInit(gg_lib); return 1; }
// // コンストラクタ // Window::Window(const char *title, int width, int height) : window(glfwCreateWindow(width, height, title, NULL, NULL)) , blightness(0), selection(0) { if (window == NULL) { // ウィンドウが作成できなかった std::cerr << "Can't create GLFW window." << std::endl; exit(1); } // 現在のウィンドウを処理対象にする glfwMakeContextCurrent(window); // 作成したウィンドウに対する設定 glfwSwapInterval(1); // ゲームグラフィックス特論の都合にもとづく初期化 ggInit(); // このインスタンスの this ポインタを記録しておく glfwSetWindowUserPointer(window, this); // キーボードを操作した時の処理 glfwSetKeyCallback(window, keyboard); // マウスボタンを操作したときの処理 glfwSetMouseButtonCallback(window, mouse); // マウスホイール操作時に呼び出す処理 glfwSetScrollCallback(window, wheel); // ウィンドウのサイズ変更時に呼び出す処理を登録する glfwSetFramebufferSizeCallback(window, resize); // カメラの初期位置を設定する position[0] = -initialPosition[0]; position[1] = -initialPosition[1]; position[2] = -initialPosition[2]; // ウィンドウの設定を初期化する resize(window, width, height); }
// // コンストラクタ // Window::Window(int width, int height, const char *title, GLFWmonitor *monitor, GLFWwindow *share) : window(glfwCreateWindow(width, height, title, monitor, share)) , ex(startPosition[0]) // カメラの x 座標 , ey(startPosition[1]) // カメラの y 座標 , ez(startPosition[2]) // カメラの z 座標 , threshold(0.5f) // 閾値 , blend(true) // アルファブレンディング #if STEREO != OCULUS && STEREO != NONE , parallax(initialParallax) #endif #if STEREO != OCULUS , scrH(zNear * screenCenter / screenDistance) #endif { if (!window) return; // 現在のウィンドウを処理対象にする glfwMakeContextCurrent(window); // 作成したウィンドウに対する設定 glfwSwapInterval(1); // ウィンドウのサイズ変更時に呼び出す処理の登録 glfwSetFramebufferSizeCallback(window, resize); // マウスボタンを操作したときの処理 glfwSetMouseButtonCallback(window, mouse); // マウスホイール操作時に呼び出す処理 glfwSetScrollCallback(window, wheel); // キーボードを操作した時の処理 glfwSetKeyCallback(window, keyboard); // マウスカーソルを表示する glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL); // このインスタンスの this ポインタを記録しておく glfwSetWindowUserPointer(window, this); // ゲームグラフィックス特論の都合にもとづく初期化 if (!glCreateProgram) ggInit(); // ジョイステックの有無を調べて番号を決める joy = glfwJoystickPresent(count) ? count : -1; // スティックの中立位置を求める if (joy >= 0) { int axesCount; const float *const axes(glfwGetJoystickAxes(joy, &axesCount)); if (axesCount > 3 + axesOffset) { // 起動直後のスティックの位置を基準にする origin[0] = axes[0]; origin[1] = axes[1]; origin[2] = axes[2 + axesOffset]; origin[3] = axes[3 + axesOffset]; } } #if STEREO == OCULUS // プログラムオブジェクト, VAO / VBO, Oculus Rift のデバイスマネージャーの作成は最初一度だけ行う if (count == 0) { // Oculus Rift のレンズの歪みを補正するシェーダプログラム ocuProgram = ggLoadShader("oculus.vert", "oculus.frag"); ocuFboColorLoc = glGetUniformLocation(ocuProgram, "ocuFboColor"); ocuAspectLoc = glGetUniformLocation(ocuProgram, "ocuAspect"); projectionCenterOffsetLoc = glGetUniformLocation(ocuProgram, "projectionCenterOffset"); lensDistortionLoc = glGetUniformLocation(ocuProgram, "lensDistortion"); lensScaleLoc = glGetUniformLocation(ocuProgram, "lensScale"); // Oculus Rift 表示に使う矩形 glGenVertexArrays(1, &ocuVao); glBindVertexArray(ocuVao); glGenBuffers(1, &ocuVbo); glBindBuffer(GL_ARRAY_BUFFER, ocuVbo); static const GLfloat rect[] = { -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f }; glBufferData(GL_ARRAY_BUFFER, sizeof rect, rect, GL_STATIC_DRAW); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(0); // Oculus Rift のデバイスマネージャーの作成 pManager = *DeviceManager::Create(); } // Oculus Rift のデバイスマネージャーが作成できたら情報を取得する if (pManager && (pHmd = *pManager->EnumerateDevices<HMDDevice>().CreateDevice()) && pHmd->GetDeviceInfo(&hmdInfo) ) { # if defined(_DEBUG) // 取得した情報を表示する std::cout << hmdInfo.DisplayDeviceName << std::endl; std::cout << "\nResolution:" << hmdInfo.HResolution << ", " << hmdInfo.VResolution << std::endl; std::cout << "\nScreen size: " << hmdInfo.HScreenSize << ", " << hmdInfo.VScreenSize << std::endl; std::cout << "\nVertical Screen Center: " << hmdInfo.VScreenCenter << std::endl; std::cout << "\nEye to Screen Distance: " << hmdInfo.EyeToScreenDistance << std::endl; std::cout << "\nLens Separation Distance: " << hmdInfo.LensSeparationDistance << std::endl; std::cout << "\nInterpupillary Distance: " << hmdInfo.InterpupillaryDistance << std::endl; std::cout << "\nDistortion: " << hmdInfo.DistortionK[0] << ", " << hmdInfo.DistortionK[1] << ", " << hmdInfo.DistortionK[2] << ", " << hmdInfo.DistortionK[3] << std::endl; std::cout << std::endl; # endif // レンズの中心の画面の中心からのずれ projectionCenterOffset = 1.0f - 2.0f * hmdInfo.LensSeparationDistance / hmdInfo.HScreenSize; // スクリーンの幅と高さ scrW = scrH = zNear * hmdInfo.VScreenCenter / hmdInfo.EyeToScreenDistance; // 視差 parallax = hmdInfo.InterpupillaryDistance * 0.5f; // レンズの歪みの補正係数 lensDistortion[0] = hmdInfo.DistortionK[0]; lensDistortion[1] = hmdInfo.DistortionK[1]; lensDistortion[2] = hmdInfo.DistortionK[2]; lensDistortion[3] = hmdInfo.DistortionK[3]; // 片目の表示領域のアスペクト比 ocuAspect = hmdInfo.HScreenSize * 0.5f / hmdInfo.VScreenSize; // Oculus Rift のセンサの取得 pSensor = *pHmd->GetSensor(); // センサーを登録する if (pSensor) sensorFusion.AttachToSensor(pSensor); } else { // Oculus Rift をつながずにデバッグする時の設定 scrW = scrH = zNear * 0.0468f / 0.041f; parallax = 0.064f * 0.5f; projectionCenterOffset = 1.0f - 2.0f * 0.0635f / 0.14976f; lensDistortion[0] = 1.0f; lensDistortion[1] = 0.2f; lensDistortion[2] = 0.24f; lensDistortion[3] = 0.0f; ocuAspect = 0.14976f * 0.5f / 0.0936f; pSensor = nullptr; } // レンズの歪み補正に伴う拡大率の補正 lensScale = 1.0f / (lensDistortion[0] + lensDistortion[1] + lensDistortion[2] + lensDistortion[3]); // Oculus Rift の左目用と右目用の FBO の準備 glGenFramebuffers(2, ocuFbo); // Oculus Rift 表示用の FBO のデプスバッファとして使うレンダーバッファの作成 glGenRenderbuffers(1, &ocuFboDepth); glBindRenderbuffer(GL_RENDERBUFFER, ocuFboDepth); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, fboWidth, fboHeight); // Oculus Rift 表示用の FBO のカラーバッファとして使うカラーテクスチャの作成 glGenTextures(2, ocuFboColor); for (int i = 0; i < 2; ++i) { // 左右の目のそれぞれの表示サイズより少し大きなテクスチャメモリの確保 glBindTexture(GL_TEXTURE_2D, ocuFboColor[i]); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fboWidth, fboHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border); // 左右の目のそれぞれについて FBO を作成する glBindFramebuffer(GL_FRAMEBUFFER, ocuFbo[i]); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ocuFboColor[i], 0); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, ocuFboDepth); } #endif // 投影変換行列・ビューポートを初期化する resize(window, width, height); #if BENCHMARK // 時間計測用の Query Object を作成する glGenQueries(1, &query); #endif // 参照カウントを増す ++count; }
int giiInit(void) { int err; const char *str; char *conffile; if (_giiLibIsUp>0) { /* Initialize only at first call. */ _giiLibIsUp++; return 0; } err = ggInit(); if (err != GGI_OK) { fprintf(stderr, "LibGII: unable to initialize LibGG\n"); return err; } err = GGI_ENOMEM; if ((_gii_event_lock = ggLockCreate()) == NULL) { fprintf(stderr,"LibGII: unable to initialize event mutex.\n"); goto out_ggexit; } if ((_gii_safe_lock = ggLockCreate()) == NULL) { fprintf(stderr,"LibGII: unable to initialize safe mutex.\n"); goto out_destroy_event; } if ((_gii_global_lock = ggLockCreate()) == NULL) { fprintf(stderr,"LibGII: unable to initialize global mutex.\n"); goto out_destroy_safe; } conffile = malloc(strlen(giiGetConfDir()) + 1 + strlen(GIICONFFILE) +1); if (conffile == NULL) { fprintf(stderr,"LibGII: unable to allocate memory for config filename.\n"); goto out_destroy_global; } snprintf(conffile, strlen(giiGetConfDir()) + strlen(GIICONFFILE) + 2, "%s%c%s", giiGetConfDir(), CHAR_DIRDELIM, GIICONFFILE); if(ggLoadConfig(conffile, &_giiconfhandle)) { fprintf(stderr, "LibGII: fatal error - could not load %s\n", conffile); free(conffile); goto out_destroy_global; } free(conffile); str = getenv("GII_DEBUGSYNC"); if (str != NULL) { _giiDebug |= DEBUG_SYNC; } str = getenv("GII_DEBUG"); if (str != NULL) { _giiDebug |= atoi(str) & DEBUG_ALL; DPRINT_CORE("%s Debugging=%d\n", DEBUG_ISSYNC ? "sync" : "async", _giiDebug); } _giiInitBuiltins(); _giiLibIsUp++; return 0; out_destroy_global: ggLockDestroy(_gii_global_lock); out_destroy_safe: ggLockDestroy(_gii_safe_lock); out_destroy_event: ggLockDestroy(_gii_event_lock); out_ggexit: ggExit(); return err; }