250 lines
9.3 KiB
C++
250 lines
9.3 KiB
C++
//----------------------------------------------------------------------------//
|
|
// //
|
|
// ozz-animation is hosted at http://github.com/guillaumeblanc/ozz-animation //
|
|
// and distributed under the MIT License (MIT). //
|
|
// //
|
|
// Copyright (c) Guillaume Blanc //
|
|
// //
|
|
// Permission is hereby granted, free of charge, to any person obtaining a //
|
|
// copy of this software and associated documentation files (the "Software"), //
|
|
// to deal in the Software without restriction, including without limitation //
|
|
// the rights to use, copy, modify, merge, publish, distribute, sublicense, //
|
|
// and/or sell copies of the Software, and to permit persons to whom the //
|
|
// Software is furnished to do so, subject to the following conditions: //
|
|
// //
|
|
// The above copyright notice and this permission notice shall be included in //
|
|
// all copies or substantial portions of the Software. //
|
|
// //
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR //
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, //
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL //
|
|
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER //
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING //
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER //
|
|
// DEALINGS IN THE SOFTWARE. //
|
|
// //
|
|
//----------------------------------------------------------------------------//
|
|
|
|
#ifndef OZZ_SAMPLES_FRAMEWORK_APPLICATION_H_
|
|
#define OZZ_SAMPLES_FRAMEWORK_APPLICATION_H_
|
|
|
|
#include <cstddef>
|
|
|
|
#include "ozz/base/containers/string.h"
|
|
#include "ozz/base/memory/unique_ptr.h"
|
|
|
|
namespace ozz {
|
|
namespace math {
|
|
struct Box;
|
|
struct Float2;
|
|
struct Float3;
|
|
struct Float4x4;
|
|
} // namespace math
|
|
namespace sample {
|
|
|
|
class ImGui;
|
|
class Renderer;
|
|
class Record;
|
|
|
|
namespace internal {
|
|
class ImGuiImpl;
|
|
class RendererImpl;
|
|
class Camera;
|
|
class Shooter;
|
|
} // namespace internal
|
|
|
|
// Screen resolution settings.
|
|
struct Resolution {
|
|
int width;
|
|
int height;
|
|
};
|
|
|
|
class Application {
|
|
public:
|
|
// Creates a window and initialize GL context.
|
|
// Any failure during initialization or loop execution will be silently
|
|
// handled, until the call to ::Run that will return EXIT_FAILURE.
|
|
Application();
|
|
|
|
// Destroys the application. Cleans up everything.
|
|
virtual ~Application();
|
|
|
|
// Runs application main loop.
|
|
// Caller must provide main function arguments, as well as application version
|
|
// and usage strings.
|
|
// Returns EXIT_SUCCESS if the application exits due to user request, or
|
|
// EXIT_FAILURE if an error occurred during initialization or the main loop.
|
|
// Only one application can be run at a time, otherwise EXIT_FAILURE is
|
|
// returned.
|
|
int Run(int _argc, const char** _argv, const char* _version,
|
|
const char* _title);
|
|
|
|
protected:
|
|
// Allows application to convert from world space to screen coordinates.
|
|
math::Float2 WorldToScreen(const math::Float3& _world) const;
|
|
|
|
private:
|
|
// Provides initialization event to the inheriting application. Called while
|
|
// the help screen is being displayed.
|
|
// OnInitialize can return false which will in turn skip the display loop and
|
|
// exit the application with EXIT_FAILURE. Note that OnDestroy is called in
|
|
// any case.
|
|
virtual bool OnInitialize();
|
|
|
|
// Provides de-initialization event to the inheriting application.
|
|
// OnDestroy is called even if OnInitialize failed and returned an error.
|
|
virtual void OnDestroy();
|
|
|
|
// Provides update event to the inheriting application.
|
|
// _dt is the elapsed time (in seconds) since the last update.
|
|
// _time is application time including scaling (aka accumulated _dt).
|
|
// OnUpdate can return false which will in turn stop the loop and exit the
|
|
// application with EXIT_FAILURE. Note that OnDestroy is called in any case.
|
|
virtual bool OnUpdate(float _dt, float _time);
|
|
|
|
// Provides immediate mode gui display event to the inheriting application.
|
|
// This function is called in between the OnDisplay and swap functions.
|
|
// OnGui can return false which will in turn stop the loop and exit the
|
|
// application with EXIT_FAILURE. Note that OnDestroy is called in any case.
|
|
virtual bool OnGui(ImGui* _im_gui);
|
|
|
|
// Provides immediate mode floating gui display event to the inheriting
|
|
// application. Floating gui allows to render a Gui anywere one screen. User
|
|
// must provide the form. OnFloatingGui can return false which will in turn
|
|
// stop the loop and exit the application with EXIT_FAILURE. Note that
|
|
// OnDestroy is called in any case.
|
|
virtual bool OnFloatingGui(ImGui* _im_gui);
|
|
|
|
// Provides display event to the inheriting application.
|
|
// This function is called in between the clear and swap functions.
|
|
// OnDisplay can return false which will in turn stop the loop and exit the
|
|
// application with EXIT_FAILURE. Note that OnDestroy is called in any case.
|
|
virtual bool OnDisplay(Renderer* _renderer);
|
|
|
|
// Initial camera values. These will only be considered if function returns
|
|
// true;
|
|
virtual bool GetCameraInitialSetup(math::Float3* _center,
|
|
math::Float2* _angles,
|
|
float* _distance) const;
|
|
|
|
// Allows the inheriting application to override camera location.
|
|
// Application should return true (false by default) if it wants to override
|
|
// Camera location, and fills in this case _transform matrix.
|
|
// This function is never called before a first OnUpdate.
|
|
virtual bool GetCameraOverride(math::Float4x4* _transform) const;
|
|
|
|
// Requires the inheriting application to provide scene bounds. It is used by
|
|
// the camera to frame all the scene.
|
|
// This function is never called before a first OnUpdate.
|
|
// If _bound is set to "invalid", then camera won't be updated.
|
|
virtual void GetSceneBounds(math::Box* _bound) const;
|
|
|
|
// Implements framework internal loop function.
|
|
bool Loop();
|
|
|
|
// This callback has to forward loop call to OneLoop private function.
|
|
friend void OneLoopCbk(void*);
|
|
|
|
// Implements framework internal one iteration loop function.
|
|
enum LoopStatus {
|
|
kContinue, // Can continue with next loop.
|
|
kBreak, // Should stop looping (ex: exit).
|
|
kBreakFailure, // // Should stop looping beacause something went wrong.
|
|
};
|
|
LoopStatus OneLoop(int _loops);
|
|
|
|
// Implements framework internal idle function.
|
|
// Returns the value returned by OnIdle or from an internal issue.
|
|
bool Idle(bool _first_frame);
|
|
|
|
// Implements framework internal display callback.
|
|
// Returns the value returned by OnDisplay or from an internal issue.
|
|
bool Display();
|
|
|
|
// Implements framework internal gui callback.
|
|
// Returns the value returned by OnGui or from an internal error.
|
|
bool Gui();
|
|
|
|
// Implements framework gui rendering.
|
|
bool FrameworkGui();
|
|
|
|
// Implements framework glfw window reshape callback.
|
|
static void ResizeCbk(int _width, int _height);
|
|
|
|
// Implements framework glfw window close callback.
|
|
static int CloseCbk();
|
|
|
|
// Get README.md for content to display it in the help ui.
|
|
void ParseReadme();
|
|
|
|
// Disallow copy and assignment.
|
|
Application(const Application& _application);
|
|
void operator=(const Application& _application);
|
|
|
|
// A pointer to the current, and only, running application.
|
|
static Application* application_;
|
|
|
|
// Application exit request.
|
|
bool exit_;
|
|
|
|
// Update time freeze state.
|
|
bool freeze_;
|
|
|
|
// Fixes update rat to a fixed value, instead of real_time.
|
|
bool fix_update_rate;
|
|
|
|
// Fixed update rate, only applies to application update dt, not the real fps.
|
|
float fixed_update_rate;
|
|
|
|
// Update time scale factor.
|
|
float time_factor_;
|
|
|
|
// Current application time, including scaling and freezes..
|
|
float time_;
|
|
|
|
// Last time the idle function was called, in seconds.
|
|
// This is a double value in order to maintain enough accuracy when the
|
|
// application is running since a long time.
|
|
double last_idle_time_;
|
|
|
|
// The camera object used by the application.
|
|
unique_ptr<internal::Camera> camera_;
|
|
|
|
// The screen shooter object used by the application.
|
|
unique_ptr<internal::Shooter> shooter_;
|
|
|
|
// Set to true to display help.
|
|
bool show_help_;
|
|
|
|
bool vertical_sync_; // On by default.
|
|
int swap_interval_;
|
|
|
|
// Grid display settings.
|
|
bool show_grid_;
|
|
bool show_axes_;
|
|
|
|
// Capture settings.
|
|
bool capture_video_;
|
|
bool capture_screenshot_;
|
|
|
|
// The renderer utility object used by the application.
|
|
unique_ptr<internal::RendererImpl> renderer_;
|
|
|
|
// Immediate mode gui interface.
|
|
unique_ptr<internal::ImGuiImpl> im_gui_;
|
|
|
|
// Timing records.
|
|
unique_ptr<Record> fps_;
|
|
unique_ptr<Record> update_time_;
|
|
unique_ptr<Record> render_time_;
|
|
|
|
// Current screen resolution.
|
|
Resolution resolution_;
|
|
|
|
// Help message.
|
|
ozz::string help_;
|
|
};
|
|
} // namespace sample
|
|
} // namespace ozz
|
|
#endif // OZZ_SAMPLES_FRAMEWORK_APPLICATION_H_
|