The match3D app prototyping library combines three ingredients: windowing library (GLFW), UI library (Dear ImGui), and build system infrastructure (CMake) to all but eliminate the boilerplate involved in making simple 3D applications with a UI.
- CMake
- C++11 compiler
- GLFW
match3D is developed and tested on Linux, but has nothing inherently platform specific in it. If you try it on macOS or Windows and find a problem, let me know!
The match3D library is consumed as a source library. This is easiest to do using CMake via the provided package config. The provided example (found in examples/simple) is built like an external consumer of the library.
The library is found by pointing your project's build to a local copy of the
match3D
source with either match3D_DIR
variable or appending it to
CMAKE_PREFIX_PATH
. Then the consuming CMake is very straightforward and will
look something like:
find_package(match3D REQUIRED)
add_executable(myApplication)
target_link_libraries(myApplication PRIVATE match3D::match3D)
Linking with the match3D::match3D
target is all that is needed to bring in the
necessary includes and linked libraries to build your application, including
GLFW and Dear Imgui. Note that find_package(match3D)
will require GLFW to be
found in your environment in order to succeed in finding match3D itself.
Downstream targets which link against match3D::match3D
have everything
directly built into it.
match3D can optionally bring in additional header-only libraries: currently
stb_image
and glm
. These are optionally added to the build by passing them
to find_package
as components. For example, the following will also fetch
glm
when constructing the match3D targets:
find_package(match3D REQUIRED COMPONENTS glm)
Which then lets you include glm
normally in your app:
#include <glm/glm.hpp>
The match3D library revoles around a single C++ base class: Application
.
This class has applications override methods to inject functionality for
creating the UI and drawing objects (with OpenGL) each frame. Specifically,
applications must override:
Application::setup()
-- this is invoked before the main UI loop is startedApplication::buildUI()
-- where all ImGui calls are made to create the UIApplication::drawBackground()
-- where any drawing underneath the UI happensApplication::teardown()
-- cleanup to occur before the destructor
Each of the above methods are pure-virtual (=0
) so that each customization
point is always visible in an implementation. The provided
example shows a minimal demonstration of an
application.
NOTE: all mouse and keyboard I/O is to be done through Dear ImGui -- see example app to see it in action.
Window resize events are queried on each call to buildUI()
via the protected
method bool Application::getWindowSize(int &width, int &height)
. The method
always writes the width/height as out parameters and returns true
if the
window has been resized since the last frame.
Finally, applications must create a simple main()
function to instantiate and
run the application. This may look something like:
int main()
{
MyMatch3DApp app;
app.run(1280, 800, "Example match3D application");
}
The arguments provided to Application::run()
are the initial window size and
title bar text.
- mulitple windowing library options (SDL2, GLUT, etc.)