diff options
-rw-r--r-- | src/main.cpp | 244 |
1 files changed, 146 insertions, 98 deletions
diff --git a/src/main.cpp b/src/main.cpp index 80e7434..74674cf 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -270,10 +270,16 @@ private: // OpenGL bookkeeping private: // X compositor Display *x_display = nullptr; - Window src_window_id; + Window src_window_id = None; Pixmap src_window_pixmap; GLXFBConfig *configs; GLXPixmap glxpixmap; + + GLint pixmap_texture_width = 0; + GLint pixmap_texture_height = 0; + + bool sphere_projection = true; + double zoom = 0.0; }; @@ -362,6 +368,11 @@ void dprintf( const char *fmt, ... ) printf( "%s", buffer ); } +static void usage() { + fprintf(stderr, "usage: vr-video-player [--flat] [--zoom zoom-level] <window_id>\n"); + exit(1); +} + //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- @@ -396,13 +407,30 @@ CMainApplication::CMainApplication( int argc, char *argv[] ) , m_strPoseClasses("") , m_bShowCubes( true ) { - if(argc < 2) { - fprintf(stderr, "usage: vr_window_manager [window_id]\n"); - exit(1); + for(int i = 1; i < argc; ++i) { + if(strcmp(argv[i], "--flat") == 0) { + sphere_projection = false; + } else if(strcmp(argv[i], "--zoom") == 0 && i < argc - 1) { + zoom = atof(argv[i + 1]); + ++i; + } else if(argv[i][0] == '-') { + fprintf(stderr, "Invalid flag: %s\n", argv[i]); + usage(); + } else { + src_window_id = strtol(argv[1], nullptr, 0); + } } - src_window_id = strtol(argv[1], nullptr, 0); - printf("src window id: %d\n", src_window_id); + if(src_window_id == None) { + fprintf(stderr, "Missing required window_id flag\n"); + usage(); + } + + if(!sphere_projection && fabs(zoom) <= 0.00001) { + zoom = 1.0; + } + + printf("src window id: %ld, zoom: %f\n", src_window_id, zoom); #if 0 for( int i = 1; i < argc; i++ ) @@ -1275,6 +1303,11 @@ bool CMainApplication::SetupTexturemaps() glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &fLargest); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, fLargest); + + pixmap_texture_width = 0; + pixmap_texture_height = 0; + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &pixmap_texture_width); + glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &pixmap_texture_height); glBindTexture( GL_TEXTURE_2D, 0 ); @@ -1383,100 +1416,115 @@ void CMainApplication::AddCubeToScene( const glm::mat4 &mat, std::vector<float> glm::vec4 G = mat * glm::vec4( 1, 1, 1, 1 ); glm::vec4 H = mat * glm::vec4( 0, 1, 1, 1 ); - - long columns = 32; - long rows = 32; - double angle_x = 3.14; - double angle_y = 3.14; - double radius_depth = 1.0; - double zoom = 0.5; - double radius_height = zoom; - double radius = zoom * 1.0; - - for(long row = 0; row < rows-1; ++row) { - for(long column = 0; column < columns-1; ++column) { - double offset_angle = 0.0;//angle_x*0.5; - - double y_sin1 = sin((double)row / (double)rows * 3.14); - double y_sin2 = sin((double)(row + 1) / (double)rows * 3.14); - - double z1 = sin(offset_angle + (double)column / (double)columns * angle_x) * radius; - double z2 = sin(offset_angle + (double)(column + 1) / (double)columns * angle_x) * radius; - double z3 = z1; - - double z4 = z3; - double z5 = z2; - double z6 = z2; - - z1 *= y_sin1; - z2 *= y_sin1; - z3 *= y_sin2; - z4 *= y_sin2; - z5 *= y_sin2; - z6 *= y_sin1; - - double x1 = -cos(offset_angle + (double)column / (double)columns * angle_x) * radius; - double x2 = -cos(offset_angle + (double)(column + 1) / (double)columns * angle_x) * radius; - double x3 = x1; - - double x4 = x3; - double x5 = x2; - double x6 = x2; - - x1 *= y_sin1; - x2 *= y_sin1; - x3 *= y_sin2; - x4 *= y_sin2; - x5 *= y_sin2; - x6 *= y_sin1; -#if 0 - double y1 = cos((double)row / (double)rows * angle_y) * radius; - double y2 = y1; - double y3 = cos((double)(row + 1) / (double)rows * angle_y) * radius; - - double y4 = y3; - double y5 = y3; - double y6 = y1; - - z1 *= sin((double)row / (double)rows * angle_y) * radius_depth; - z2 *= sin((double)row / (double)rows * angle_y) * radius_depth; - z3 *= sin((double)(row + 1) / (double)rows * angle_y) * radius_depth; - z4 *= sin((double)(row + 1) / (double)rows * angle_y) * radius_depth; - z5 *= sin((double)(row + 1) / (double)rows * angle_y) * radius_depth; - z6 *= sin((double)row / (double)rows * angle_y) * radius_depth; - - x1 *= sin((double)row / (double)rows * angle_y) * radius_depth; - x2 *= sin((double)row / (double)rows * angle_y) * radius_depth; - x3 *= sin((double)(row + 1) / (double)rows * angle_y) * radius_depth; - x4 *= sin((double)(row + 1) / (double)rows * angle_y) * radius_depth; - x5 *= sin((double)(row + 1) / (double)rows * angle_y) * radius_depth; - x6 *= sin((double)row / (double)rows * angle_y) * radius_depth; -#else - double y1 = cos((double)row / (double)rows * 3.14) * radius_height; - double y2 = y1; - double y3 = cos((double)(row + 1) / (double)rows * 3.14) * radius_height; - - double y4 = y3; - double y5 = y3; - double y6 = y1; -#endif - - glm::vec4 v1 = mat * glm::vec4(x1, y1, z1, 1.0); - glm::vec4 v2 = mat * glm::vec4(x2, y2, z2, 1.0); - glm::vec4 v3 = mat * glm::vec4(x3, y3, z3, 1.0); - glm::vec4 v4 = mat * glm::vec4(x4, y4, z4, 1.0); - glm::vec4 v5 = mat * glm::vec4(x5, y5, z5, 1.0); - glm::vec4 v6 = mat * glm::vec4(x6, y6, z6, 1.0); - - AddCubeVertex(v1.x, v1.y, v1.z, 1.0 - (double)column / (double)columns, (double)row / (double)rows, vertdata); - AddCubeVertex(v2.x, v2.y, v2.z, 1.0 - (double)(column + 1) / (double)columns, (double)row / (double)rows, vertdata); - AddCubeVertex(v3.x, v3.y, v3.z, 1.0 - (double)column / (double)columns, (double)(row + 1) / (double)rows, vertdata); - - AddCubeVertex(v4.x, v4.y, v4.z, 1.0 - (double)column / (double)columns, (double)(row + 1) / (double)rows, vertdata); - AddCubeVertex(v5.x, v5.y, v5.z, 1.0 - (double)(column + 1) / (double)columns, (double)(row + 1) / (double)rows, vertdata); - AddCubeVertex(v6.x, v6.y, v6.z, 1.0 - (double)(column + 1) / (double)columns, (double)row / (double)rows, vertdata); + double width_ratio = ((double)pixmap_texture_width * 0.5) / (double)pixmap_texture_height; + + if(sphere_projection) + { + long columns = 32; + long rows = 32; + double angle_x = 3.14; + double angle_y = 3.14; + double radius_depth = 1.0; + double radius_height = 0.5; + double radius = 0.5 * width_ratio; + + for(long row = 0; row < rows-1; ++row) { + for(long column = 0; column < columns-1; ++column) { + double offset_angle = 0.0;//angle_x*0.5; + + double y_sin1 = sin((double)row / (double)rows * 3.14); + double y_sin2 = sin((double)(row + 1) / (double)rows * 3.14); + + double z1 = sin(offset_angle + (double)column / (double)columns * angle_x) * radius; + double z2 = sin(offset_angle + (double)(column + 1) / (double)columns * angle_x) * radius; + double z3 = z1; + + double z4 = z3; + double z5 = z2; + double z6 = z2; + + z1 *= y_sin1; + z2 *= y_sin1; + z3 *= y_sin2; + z4 *= y_sin2; + z5 *= y_sin2; + z6 *= y_sin1; + + double x1 = -cos(offset_angle + (double)column / (double)columns * angle_x) * radius; + double x2 = -cos(offset_angle + (double)(column + 1) / (double)columns * angle_x) * radius; + double x3 = x1; + + double x4 = x3; + double x5 = x2; + double x6 = x2; + + x1 *= y_sin1; + x2 *= y_sin1; + x3 *= y_sin2; + x4 *= y_sin2; + x5 *= y_sin2; + x6 *= y_sin1; + #if 0 + double y1 = cos((double)row / (double)rows * angle_y) * radius; + double y2 = y1; + double y3 = cos((double)(row + 1) / (double)rows * angle_y) * radius; + + double y4 = y3; + double y5 = y3; + double y6 = y1; + + z1 *= sin((double)row / (double)rows * angle_y) * radius_depth; + z2 *= sin((double)row / (double)rows * angle_y) * radius_depth; + z3 *= sin((double)(row + 1) / (double)rows * angle_y) * radius_depth; + z4 *= sin((double)(row + 1) / (double)rows * angle_y) * radius_depth; + z5 *= sin((double)(row + 1) / (double)rows * angle_y) * radius_depth; + z6 *= sin((double)row / (double)rows * angle_y) * radius_depth; + + x1 *= sin((double)row / (double)rows * angle_y) * radius_depth; + x2 *= sin((double)row / (double)rows * angle_y) * radius_depth; + x3 *= sin((double)(row + 1) / (double)rows * angle_y) * radius_depth; + x4 *= sin((double)(row + 1) / (double)rows * angle_y) * radius_depth; + x5 *= sin((double)(row + 1) / (double)rows * angle_y) * radius_depth; + x6 *= sin((double)row / (double)rows * angle_y) * radius_depth; + #else + double y1 = cos((double)row / (double)rows * 3.14) * radius_height; + double y2 = y1; + double y3 = cos((double)(row + 1) / (double)rows * 3.14) * radius_height; + + double y4 = y3; + double y5 = y3; + double y6 = y1; + #endif + + glm::vec4 v1 = mat * glm::vec4(x1, y1, z1 + zoom, 1.0); + glm::vec4 v2 = mat * glm::vec4(x2, y2, z2 + zoom, 1.0); + glm::vec4 v3 = mat * glm::vec4(x3, y3, z3 + zoom, 1.0); + glm::vec4 v4 = mat * glm::vec4(x4, y4, z4 + zoom, 1.0); + glm::vec4 v5 = mat * glm::vec4(x5, y5, z5 + zoom, 1.0); + glm::vec4 v6 = mat * glm::vec4(x6, y6, z6 + zoom, 1.0); + + AddCubeVertex(v1.x, v1.y, v1.z, 1.0 - (double)column / (double)columns, (double)row / (double)rows, vertdata); + AddCubeVertex(v2.x, v2.y, v2.z, 1.0 - (double)(column + 1) / (double)columns, (double)row / (double)rows, vertdata); + AddCubeVertex(v3.x, v3.y, v3.z, 1.0 - (double)column / (double)columns, (double)(row + 1) / (double)rows, vertdata); + + AddCubeVertex(v4.x, v4.y, v4.z, 1.0 - (double)column / (double)columns, (double)(row + 1) / (double)rows, vertdata); + AddCubeVertex(v5.x, v5.y, v5.z, 1.0 - (double)(column + 1) / (double)columns, (double)(row + 1) / (double)rows, vertdata); + AddCubeVertex(v6.x, v6.y, v6.z, 1.0 - (double)(column + 1) / (double)columns, (double)row / (double)rows, vertdata); + } } } + else + { + double width = 1.0 * width_ratio; + double height = 0.5; + AddCubeVertex(-width, height, zoom, 1.0, 0.0, vertdata); + AddCubeVertex(width, height, zoom, 0.0, 0.0, vertdata); + AddCubeVertex(-width, -height, zoom, 1.0, 1.0, vertdata); + + AddCubeVertex(-width, -height, zoom, 1.0, 1.0, vertdata); + AddCubeVertex(width, -height, zoom, 0.0, 1.0, vertdata); + AddCubeVertex(width, height, zoom, 0.0, 0.0, vertdata); + } } |