From 62426b51bad007b0b5c3da881535422fba93179d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matt=C3=A9o=20Delabre?= Date: Mon, 18 Apr 2016 12:05:45 +0200 Subject: [PATCH] Ajout de SFGUI --- CMakeLists.txt | 3 + FindSFGUI.cmake | 256 ++++++++++++++++++++++++++++++++++++++++++++ include/manager.hpp | 13 +++ src/manager.cpp | 37 +++++-- 4 files changed, 303 insertions(+), 6 deletions(-) create mode 100644 FindSFGUI.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 7e0e300..bcb5571 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,12 +35,15 @@ add_executable(skizzle ${SOURCES}) find_package(SFML 2.3.2 REQUIRED system window graphics network audio) find_package(Boost 1.60.0 COMPONENTS system filesystem) +find_package(SFGUI 0.2.3 REQUIRED) include_directories(${SFML_INCLUDE_DIRS}) include_directories(${Boost_INCLUDE_DIRS}) +include_directories(${SFGUI_INCLUDE_DIR}) target_link_libraries(skizzle ${SFML_LIBRARIES}) target_link_libraries(skizzle ${Boost_LIBRARIES}) +target_link_libraries(skizzle ${SFGUI_LIBRARY}) # Installation de l'exécutable install(TARGETS skizzle DESTINATION bin) diff --git a/FindSFGUI.cmake b/FindSFGUI.cmake new file mode 100644 index 0000000..c5be6f2 --- /dev/null +++ b/FindSFGUI.cmake @@ -0,0 +1,256 @@ +# This script locates the SFGUI library +# ------------------------------------ +# +# Usage +# ----- +# +# You can enforce a specific version, one of either MAJOR.MINOR.REVISION, +# MAJOR.MINOR or only MAJOR. If nothing is specified, the version won't +# be checked i.e. any version will be accepted. SFGUI does not consist of +# multiple components, so specifying COMPONENTS is not required. +# +# Example: +# find_package( SFGUI ) // no specific version +# find_package( SFGUI 0.2 ) // any 0.2 version +# find_package( SFGUI 0.2.3 ) // version 0.2.3 or greater +# +# By default, the dynamic version of SFGUI will be found. To find the static +# version instead, you must set the SFGUI_STATIC_LIBRARIES variable to TRUE +# before calling find_package( SFGUI ). In that case, SFGUI_STATIC will also be +# defined by this script. +# +# Example: +# set( SFGUI_STATIC_LIBRARIES TRUE ) +# find_package( SFGUI ) +# +# Since you have to link all of SFGUI's dependencies when you link SFGUI +# statically, the variable SFGUI_DEPENDENCIES is also defined. See below +# for a detailed description. +# +# On Mac OS X if SFGUI_STATIC_LIBRARIES is not set to TRUE then by default CMake +# will search for frameworks unless CMAKE_FIND_FRAMEWORK is set to "NEVER". +# Please refer to CMake documentation for more details. +# Moreover, keep in mind that SFGUI frameworks are only available as release +# libraries unlike dylibs which are available for both release and debug modes. +# +# If SFGUI is not installed in a standard path, you can use the SFGUI_ROOT +# CMake (or environment) variable to tell CMake where to look for SFGUI. +# +# Output +# ------ +# +# This script defines the following variables: +# - SFGUI_LIBRARY_DEBUG: the path to the debug library +# - SFGUI_LIBRARY_RELEASE: the path to the release library +# - SFGUI_LIBRARY: the path to the library to link to +# - SFGUI_FOUND: TRUE if the SFGUI library is found +# - SFGUI_INCLUDE_DIR: the path where SFGUI headers are located (the directory containing the SFGUI/Config.hpp file) +# - SFGUI_DEPENDENCIES: the list of libraries SFGUI depends on, in case of static linking +# +# Example (dynamic linking): +# find_package( SFGUI REQUIRED ) +# include_directories( ${SFGUI_INCLUDE_DIR} ) +# add_executable( myapp ... ) +# target_link_libraries( myapp ${SFGUI_LIBRARY} ... ) +# +# Example (static linking): +# set( SFGUI_STATIC_LIBRARIES TRUE ) +# find_package( SFGUI REQUIRED ) +# include_directories( ${SFGUI_INCLUDE_DIR} ) +# add_executable( myapp ... ) +# target_link_libraries( myapp ${SFGUI_LIBRARY} ${SFGUI_DEPENDENCIES} ... ) + +if( SFGUI_STATIC_LIBRARIES ) + add_definitions( -DSFGUI_STATIC ) +endif() + +set( + SFGUI_SEARCH_PATHS + "${SFGUI_ROOT}" + "$ENV{SFGUI_ROOT}" + ~/Library/Frameworks + /Library/Frameworks + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt +) + +find_path( + SFGUI_INCLUDE_DIR + SFGUI/Config.hpp + PATH_SUFFIXES + include + PATHS + ${SFGUI_SEARCH_PATHS} +) + +set( SFGUI_VERSION_OK true ) +if( SFGUI_FIND_VERSION AND SFGUI_INCLUDE_DIR ) + file( READ "${SFGUI_INCLUDE_DIR}/SFGUI/Config.hpp" SFGUI_CONFIG_HPP ) + + string( REGEX MATCH ".*#define SFGUI_MAJOR_VERSION ([0-9]+).*#define SFGUI_MINOR_VERSION ([0-9]+).*#define SFGUI_REVISION_VERSION ([0-9]+).*" SFGUI_CONFIG_HPP "${SFGUI_CONFIG_HPP}" ) + string( REGEX REPLACE ".*#define SFGUI_MAJOR_VERSION ([0-9]+).*" "\\1" SFGUI_VERSION_MAJOR "${SFGUI_CONFIG_HPP}" ) + string( REGEX REPLACE ".*#define SFGUI_MINOR_VERSION ([0-9]+).*" "\\1" SFGUI_VERSION_MINOR "${SFGUI_CONFIG_HPP}" ) + string( REGEX REPLACE ".*#define SFGUI_REVISION_VERSION ([0-9]+).*" "\\1" SFGUI_VERSION_PATCH "${SFGUI_CONFIG_HPP}" ) + + math( EXPR SFGUI_REQUESTED_VERSION "${SFGUI_FIND_VERSION_MAJOR} * 10000 + ${SFGUI_FIND_VERSION_MINOR} * 100 + ${SFGUI_FIND_VERSION_PATCH}" ) + + if( SFGUI_VERSION_MAJOR OR SFGUI_VERSION_MINOR OR SFGUI_VERSION_PATCH ) + math( EXPR SFGUI_VERSION "${SFGUI_VERSION_MAJOR} * 10000 + ${SFGUI_VERSION_MINOR} * 100 + ${SFGUI_VERSION_PATCH}" ) + + if( SFGUI_VERSION LESS SFGUI_REQUESTED_VERSION ) + set( SFGUI_VERSION_OK false ) + endif() + else() + # SFGUI version is < 0.3.0 + if( SFGUI_REQUESTED_VERSION GREATER 300 ) + set( SFGUI_VERSION_OK false ) + set( SFGUI_VERSION_MAJOR 0 ) + set( SFGUI_VERSION_MINOR x ) + set( SFGUI_VERSION_PATCH y ) + endif() + endif() +endif() + +find_library( + SFGUI_LIBRARY_DYNAMIC_RELEASE + NAMES + sfgui + PATH_SUFFIXES + lib + lib64 + PATHS + ${SFGUI_SEARCH_PATHS} +) + +find_library( + SFGUI_LIBRARY_DYNAMIC_DEBUG + NAMES + sfgui-d + PATH_SUFFIXES + lib + lib64 + PATHS + ${SFGUI_SEARCH_PATHS} +) + +find_library( + SFGUI_LIBRARY_STATIC_RELEASE + NAMES + sfgui-s + PATH_SUFFIXES + lib + lib64 + PATHS + ${SFGUI_SEARCH_PATHS} +) + +find_library( + SFGUI_LIBRARY_STATIC_DEBUG + NAMES + sfgui-s-d + PATH_SUFFIXES + lib + lib64 + PATHS + ${SFGUI_SEARCH_PATHS} +) + +if( SFGUI_STATIC_LIBRARIES ) + if( SFGUI_LIBRARY_STATIC_RELEASE ) + set( SFGUI_LIBRARY_RELEASE "${SFGUI_LIBRARY_STATIC_RELEASE}" ) + endif() + if( SFGUI_LIBRARY_STATIC_DEBUG ) + set( SFGUI_LIBRARY_DEBUG "${SFGUI_LIBRARY_STATIC_DEBUG}" ) + endif() +else() + if( SFGUI_LIBRARY_DYNAMIC_RELEASE ) + set( SFGUI_LIBRARY_RELEASE "${SFGUI_LIBRARY_DYNAMIC_RELEASE}" ) + endif() + if( SFGUI_LIBRARY_DYNAMIC_DEBUG ) + set( SFGUI_LIBRARY_DEBUG "${SFGUI_LIBRARY_DYNAMIC_DEBUG}" ) + endif() +endif() + +mark_as_advanced( + SFGUI_LIBRARY_STATIC_RELEASE + SFGUI_LIBRARY_STATIC_DEBUG + SFGUI_LIBRARY_DYNAMIC_RELEASE + SFGUI_LIBRARY_DYNAMIC_DEBUG +) + +if( SFGUI_LIBRARY_RELEASE OR SFGUI_LIBRARY_DEBUG ) + if( SFGUI_LIBRARY_RELEASE AND SFGUI_LIBRARY_DEBUG ) + set( SFGUI_LIBRARY debug "${SFGUI_LIBRARY_DEBUG}" optimized "${SFGUI_LIBRARY_RELEASE}" ) + elseif( SFGUI_LIBRARY_DEBUG AND NOT SFGUI_LIBRARY_RELEASE ) + set( SFGUI_LIBRARY_RELEASE "${SFGUI_LIBRARY_DEBUG}" ) + set( SFGUI_LIBRARY "${SFGUI_LIBRARY_DEBUG}" ) + elseif( SFGUI_LIBRARY_RELEASE AND NOT SFGUI_LIBRARY_DEBUG ) + set( SFGUI_LIBRARY_DEBUG "${SFGUI_LIBRARY_RELEASE}" ) + set( SFGUI_LIBRARY "${SFGUI_LIBRARY_RELEASE}" ) + endif() + + set( SFGUI_FOUND true ) +else() + set( SFGUI_LIBRARY "" ) + set( SFGUI_FOUND false ) +endif() + +mark_as_advanced( + SFGUI_LIBRARY + SFGUI_LIBRARY_RELEASE + SFGUI_LIBRARY_DEBUG +) + +if( SFGUI_STATIC_LIBRARIES ) + set( SFGUI_DEPENDENCIES ) + set( SFGUI_MISSING_DEPENDENCIES ) + + if( "${CMAKE_SYSTEM_NAME}" MATCHES "Linux" ) + find_library( X11_LIBRARY NAMES X11 PATHS ${SFGUI_SEARCH_PATHS} PATH_SUFFIXES lib ) + + if( ${X11_LIBRARY} STREQUAL "X11_LIBRARY-NOTFOUND" ) + unset( X11_LIBRARY ) + set( SFGUI_MISSING_DEPENDENCIES "${SFGUI_MISSING_DEPENDENCIES} X11" ) + endif() + endif() + + if( "${CMAKE_SYSTEM_NAME}" MATCHES "Windows" ) + set( SFGUI_DEPENDENCIES ${SFGUI_DEPENDENCIES} "opengl32" ) + elseif( ( "${CMAKE_SYSTEM_NAME}" MATCHES "Linux" ) OR ( "${CMAKE_SYSTEM_NAME}" MATCHES "FreeBSD" ) ) + set( SFGUI_DEPENDENCIES ${SFGUI_DEPENDENCIES} "GL" ${X11_LIBRARY} ) + elseif( "${CMAKE_SYSTEM_NAME}" MATCHES "Darwin" ) + set( SFGUI_DEPENDENCIES ${SFGUI_DEPENDENCIES} "-framework OpenGL -framework Foundation" ) + endif() +endif() + +if( NOT SFGUI_INCLUDE_DIR OR NOT SFGUI_LIBRARY ) + set( SFGUI_FOUND false ) +endif() + +if( NOT SFGUI_FOUND ) + set( FIND_SFGUI_ERROR "SFGUI not found." ) +elseif( NOT SFGUI_VERSION_OK ) + set( FIND_SFGUI_ERROR "SFGUI found but version too low, requested: ${SFGUI_FIND_VERSION}, found: ${SFGUI_VERSION_MAJOR}.${SFGUI_VERSION_MINOR}.${SFGUI_VERSION_PATCH}" ) + set( SFGUI_FOUND false ) +elseif( SFGUI_STATIC_LIBRARIES AND SFGUI_MISSING_DEPENDENCIES ) + set( FIND_SFGUI_ERROR "SFGUI found but some of its dependencies are missing: ${SFGUI_MISSING_DEPENDENCIES}" ) + set( SFGUI_FOUND false ) +endif() + +if( NOT SFGUI_FOUND ) + if( SFGUI_FIND_REQUIRED ) + message( FATAL_ERROR "${FIND_SFGUI_ERROR}" ) + elseif( NOT SFGUI_FIND_QUIETLY ) + message( "${FIND_SFGUI_ERROR}" ) + endif() +else() + if( SFGUI_FIND_VERSION ) + message( STATUS "Found SFGUI version ${SFGUI_VERSION_MAJOR}.${SFGUI_VERSION_MINOR}.${SFGUI_VERSION_PATCH} in ${SFGUI_INCLUDE_DIR}" ) + else() + message( STATUS "Found SFGUI in ${SFGUI_INCLUDE_DIR}" ) + endif() +endif() diff --git a/include/manager.hpp b/include/manager.hpp index 749d20a..30e7775 100644 --- a/include/manager.hpp +++ b/include/manager.hpp @@ -2,6 +2,9 @@ #define __SKIZZLE_MANAGER_HPP__ #include "resource_manager.hpp" +#include +#include +#include #include #include @@ -14,6 +17,10 @@ class State; class Manager { private: sf::RenderWindow window; + sf::Time previous_time; + sfg::SFGUI sfgui; + sfg::Desktop desktop; + unsigned int framerate; ResourceManager resource_manager; @@ -90,9 +97,15 @@ public: /** * Passage en vue de l'interface * (coin en haut à gauche, zoom 1:1) + * @deprecated */ void useGUIView(); + /** + * Renvoie le bureau pour l'affichage de l'interface + */ + sfg::Desktop& getDesktop(); + /** * Renvoie le titre actuel de la fenêtre */ diff --git a/src/manager.cpp b/src/manager.cpp index 73d12c5..5631113 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -5,7 +5,9 @@ const unsigned int Manager::FPS = 60; const sf::Time Manager::FRAME_TIME = sf::seconds(1.f / Manager::FPS); const float Manager::GRID = 32; -Manager::Manager() : title(sf::String(L"")), previous_state(nullptr) { +Manager::Manager() : previous_time(sf::seconds(0)), title(sf::String(L"")), + previous_state(nullptr) { + // préchargement des textures resource_manager.preload(); @@ -40,6 +42,9 @@ void Manager::start() { )); } + // événements de l'interface + desktop.HandleEvent(event); + // s'il n'y a plus d'état, on quitte if (states.empty()) { return; @@ -53,17 +58,33 @@ void Manager::start() { return; } - // si l'état que l'on va utiliser n'est pas le - // même que précédemment, on l'active - // Ceci permet un partage plus facile des - // ressources globales (vue, musique) + // si l'état que l'on va utiliser n'est pas le même que précédemment, + // on l'active. Ceci permet un partage plus facile des ressources + // globales (vue, musique) if (previous_state != states.top().get()) { previous_state = states.top().get(); + + // on vide l'interface de l'état précédent + desktop.RemoveAll(); + + // on initialise le nouvel état previous_state->enable(); } - // demande à l'état actuel d'afficher une frame + // demande à l'état actuel de dessiner une frame states.top()->frame(); + + // dessin de l'interface + sf::View normal_view = window.getView(); + useGUIView(); + + desktop.Update((getCurrentTime() - previous_time).asSeconds()); + previous_time = getCurrentTime(); + sfgui.Display(window); + + window.setView(normal_view); + + // envoi à l'écran pour affichage window.display(); } } @@ -104,6 +125,10 @@ void Manager::useGUIView() { window.setView(gui_view); } +sfg::Desktop& Manager::getDesktop() { + return desktop; +} + sf::String Manager::getTitle() { return title; }