diff options
| -rw-r--r-- | CMakeLists.txt | 28 | ||||
| -rw-r--r-- | cmake/SetupOSGTargets.cmake | 60 | ||||
| -rw-r--r-- | src/main.cpp | 106 |
3 files changed, 123 insertions, 71 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 87b0a1f..90292e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,30 @@ cmake_minimum_required(VERSION 3.13) project(globalops CXX) -find_package(SDL2 REQUIRED) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_LIST_DIR}/cmake) +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +set(CMAKE_INSTALL_RPATH + ${CMAKE_INSTALL_RPATH} + ${CMAKE_INSTALL_FULL_LIBDIR} + ${CMAKE_INSTALL_PREFIX}/${SD_LIBDIR}/lib +) find_package(OpenGL REQUIRED) +find_package(OpenSceneGraph REQUIRED) +find_package(osgViewer REQUIRED) +include(SetupOSGTargets) add_executable(${PROJECT_NAME}) add_subdirectory(src) -target_compile_options(${PROJECT_NAME} PRIVATE -pedantic -Wall) +target_compile_options(${PROJECT_NAME} PRIVATE -pedantic -Wall -Og) target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17) -target_link_libraries(${PROJECT_NAME} PRIVATE SDL2::SDL2 OpenGL::GL) -set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 17 CXX_EXTENSIONS OFF) +set_target_properties(${PROJECT_NAME} PROPERTIES + CXX_STANDARD 17 + CXX_EXTENSIONS OFF +) +target_link_libraries(${PROJECT_NAME} PRIVATE + OpenGL::GL + OpenSceneGraph::Core + OpenSceneGraph::Viewer + OpenThreads::OpenThreads +) + +# https://stackoverflow.com/questions/53461465/cannot-find-shared-libraries-even-rpath-is-set-correctly +target_link_options(${PROJECT_NAME} PRIVATE -Wl,--disable-new-dtags) diff --git a/cmake/SetupOSGTargets.cmake b/cmake/SetupOSGTargets.cmake new file mode 100644 index 0000000..58354b7 --- /dev/null +++ b/cmake/SetupOSGTargets.cmake @@ -0,0 +1,60 @@ +function(_GetDebugOptimizedLib libraries) + set(debug_found 0) + set(optimized_found 0) + set(default ${libraries}) + unset(_out_libraries) + + foreach(path ${libraries}) + if (${path} STREQUAL "debug") + set(debug_found 1) + elseif (${path} STREQUAL "optimized") + set(optimized_found 1) + elseif(debug_found) + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(_out_libraries ${_out_libraries} ${path}) + endif() + + set(debug_found 0) + elseif(optimized_found) + if(CMAKE_BUILD_TYPE STREQUAL "Release") + set(_out_libraries ${_out_libraries} ${path}) + endif() + + set(optimized_found 0) + endif() + endforeach() + + if(_out_libraries STREQUAL "") + set(_out_libraries "${default}" PARENT_SCOPE) + else() + set(_out_libraries ${_out_libraries} PARENT_SCOPE) + message(STATUS "Choosing ${_out_libraries}") + endif() +endfunction() + +if(NOT TARGET OpenThreads::OpenThreads) + add_library(OpenThreads::OpenThreads INTERFACE IMPORTED) + _GetDebugOptimizedLib("${OPENTHREADS_LIBRARY}") + set_target_properties(OpenThreads::OpenThreads PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OPENTHREADS_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "${_out_libraries}") +endif() + +if(NOT TARGET OpenSceneGraph::Core) + add_library(OpenSceneGraph::Core INTERFACE IMPORTED) + _GetDebugOptimizedLib("${OPENSCENEGRAPH_LIBRARIES}") + set_target_properties(OpenSceneGraph::Core PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OPENSCENEGRAPH_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "${_out_libraries}") +endif() + +if(NOT TARGET OpenSceneGraph::Viewer) + add_library(OpenSceneGraph::Viewer INTERFACE IMPORTED) + _GetDebugOptimizedLib("${OSGVIEWER_LIBRARY}") + set_target_properties(OpenSceneGraph::Viewer PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OSGVIEWER_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "${_out_libraries}") +endif() + +unset(_out_libraries) +target_link_libraries(OpenSceneGraph::Core INTERFACE OpenThreads::OpenThreads) diff --git a/src/main.cpp b/src/main.cpp index 620e97e..382cc93 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,99 +1,71 @@ #define SDL_MAIN_HANDLED -#include <SDL2/SDL.h> -#include <SDL2/SDL_video.h> #include <abc.h> #include <dtx.h> #include <rez.h> +#include <GL/gl.h> +#include <osg/GLExtensions> +#include <osg/State> +#include <osgViewer/GraphicsWindow> +#include <osgViewer/Viewer> +#include <osgViewer/ViewerEventHandlers> #include <cstdlib> #include <cstdio> #include <iostream> -#include <GL/gl.h> int main(int argc, char *argv[]) { - int ret = EXIT_FAILURE; - rez::ball b("globalops.rez"); std::unique_ptr<rez::file> f, abcf; - SDL_Window *window = nullptr; - SDL_GLContext glcontext = nullptr; - static const char extension[] = "GL_EXT_texture_compression_s3tc"; + rez::ball b("globalops.rez"); abc abc; dtx dtx; + osgViewer::Viewer viewer; + osg::Camera *cam; + osg::GraphicsContext *gfx; + osg::State *state; + osg::GLExtensions *ext; + osgViewer::GraphicsWindow *gfxw; + + viewer.setUpViewInWindow(0, 0, 640, 480); + viewer.realize(); + cam = viewer.getCamera(); + gfx = cam->getGraphicsContext(); + gfxw = dynamic_cast<osgViewer::GraphicsWindow *>(gfx); - if (SDL_Init(SDL_INIT_VIDEO) < 0) + if (!gfxw) { - std::cerr << "SDL_Init failed: " << SDL_GetError() << '\n'; - goto end; + std::cerr << "Failed to cast osgViewe::GraphicContext to " + "osgViewer::GraphicsWindow\n"; + return EXIT_FAILURE; } - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + gfxw->setWindowName("GlobalOps"); + state = gfx->getState(); + state->initializeExtensionProcs(); + ext = osg::GLExtensions::Get(state->getContextID(), true); - if (!(window = SDL_CreateWindow("GlobalOps", SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, 640, 480, - SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE))) + if (!ext) { - std::cerr << "SDL_CreateWindow failed: " << SDL_GetError() << '\n'; - goto end; + std::cerr << "osg::GLExtensions::Get failed\n"; + return EXIT_FAILURE; } - else if (!(glcontext = SDL_GL_CreateContext(window))) + else if (!ext->isCompressedTexImage2DSupported()) { - std::cerr << "SDL_GL_CreateContext failed: " << SDL_GetError() << '\n'; - goto end; + std::cerr << "OpenGL extension glCompressedTextImage2D not supported\n"; + return EXIT_FAILURE; } - else if (!SDL_GL_ExtensionSupported(extension)) + else if (!ext->isTextureCompressionS3TCSupported) { - std::cerr << "OpenGL extension " << extension << " not supported\n"; - goto end; - } - else if (SDL_GL_MakeCurrent(window, glcontext)) - { - std::cerr << "SDL_GL_MakeCurrent failed: " << SDL_GetError() - << std::endl; - goto end; + std::cerr << "OpenGL extension GL_EXT_texture_compression_s3tc " + "not supported\n"; + return EXIT_FAILURE; } else if (b.parse() || !(f = b.open("interface/blueprints/antarctica_tacmap.dtx")) || dtx.parse(*f) || !(f = b.open("models/grenades/v_frag.abc")) || abc.parse(*f)) - goto end; - - for (;;) - { - SDL_Event event; - - while (SDL_PollEvent(&event)) - { - switch (event.type) - { - case SDL_QUIT: - ret = EXIT_SUCCESS; - goto end; - } - } - - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - - if (dtx.draw()) - goto end; - - SDL_GL_SwapWindow(window); - SDL_Delay(1.0f / 60.f * 1000.0f); - } - -end: - - if (glcontext) - SDL_GL_DeleteContext(glcontext); - - if (window) - SDL_DestroyWindow(window); - - if (SDL_WasInit(SDL_INIT_VIDEO)) - SDL_QuitSubSystem(SDL_INIT_VIDEO); + return EXIT_FAILURE; - return ret; + return viewer.run(); } |
