A minimalist library with basic facilities for developing interactive real-time 3D applications, with a strong emphasis on simplicity and ease of use.

Overview

SlimEngine

A minimalist and platform-agnostic base project for interactive graphical applications (2D/3D)
with a strong emphasis on simplicity, ease of use and almost no setup to get started with.

Available as either a single header file, or a directory of headers (a "unity build").
Written in plain C and can be complied in either C or C++.

This project uses SlimApp as it's base platform/application layer(s).

(*A bare-bone application executable on Windows measures at around 17 KB(!))

Architecture:

The platform layer only uses operating-system headers (no standard library used).
The application layer itself has no dependencies, apart from the standard math header.
It is just a library that the platform layer uses - it has no knowledge of the platform.

More details on this architecture here.

Usage:

The single header file variant includes everything.
Otherwise, specific headers can be included from the directory of headers.
The main entry point for the app needs to be defined explicitly (see SlimApp).

Features:

All features of SlimApp are available here as well.
Additional features include basic facilities needed in interactive 3D application:

  • A 3D viewport with wireframe rendering, a HUD and rich mouse/keyboard navigation.
  • A scene with cameras, meshes and parametric shapes.
  • Scene selection and interactive transformations (moving, rotating and scaling).

Well documented example applications cover the features:

  • Viewport: HUD (Head-UP Display)
    1_viewport_HUD
    Viewports come with a HUD that can be toggled on/off
    SlimEngine comes with an empty scene, apart from a default camera bound to a default viewport.
    The window content is bound to the default viewport so they resize together.
    Customizing the scene/viewport can be done in callbacks that get invoked when they're ready.
    The HUD is fully customizable, and can hold any number of lines set at viewport-initialization time.

    1_viewport_updateAndRender_code 1_viewport_initialization_code 1_viewport_HUD_update_code 1_viewport_setup_code

  • Viewport: Navigation
    1_scene
    Viewport navigation actions can be composed to set-up WASD(FPS)/DCC(orb) navigation style(s).
    Keyboard navigation is agnostic to key-binding and is trivial to map keys to.
    It supports moving forward, backwards, left, right, up and down and turning left or right.
    Mouse navigation controls the viewport's camera and is more granular.
    It can pan, zoom, dolly, orient or orbit the camera around a target.

    2_navigation_setup_code 2_navigation_mouse_code

  • Cameras: Viewport binding
    1_scene
    The scene can have any number of cameras which can be bound to any viewport dynamically.
    The camera can be drawn as part of the drawing of the scene

    3_cameras_update_code 3_cameras_setup_code

  • Shapes: Setup and drawing parametric primitives (Grid, Box, Curves, etc.)
    1_scene
    SlimEngine allocates and initializes the scene based on quantities set at app-initialization time.
    Wireframe drawing of the scene to the viewport can be set-up to occur on window-redraw.

    4_scene_initialization_and_viewport_drawing_code 4_scene_viewport_drawing_code

  • Scene: Object selection and manipulation (Translation, Rotation and Scale)

    5_manipulation_along_screen 5_manipulation_along_axis_shapes

    Scene objects can be dragged around the screen, moving them parallel to the viewing plane.
    Selecting an object displays it's bouding box, enabling for per-axis translation, rotation and scaling.

    4_manipulation_update_code 4_manipulation_scene_setup_code

  • Scene: Mesh loading from file, instancing and wire-frame drawing
    6_mesh_with_normals
    Meshes can be loaded from binary files, with vertex positions, normals and texture coordinates.
    They can be moves and transformed just like any other kind of primitive.
    6_mesh_instancing
    A mesh can have multiple instances, each with their own transformation and colors.
    Simply have multiple mesh primitives all set with same mesh id.
    Memory is allocated automatically for the meshes by reading their headers before loading.

    6_mesh_drawing_code 6_mesh_setup_code

  • Scene: Saving to and loading from .scene files
    7_scene
    Scenes can be saved to a file and later loaded back in-place.

    7_scene_io_code 7_scene_message_code

  • obj2mesh: Also privided is a separate CLI tool for converting .obj files to .mesh files.
    It is also written in plain C, so should compile with either C or C++.
    Usage is simple: ./obj2mesh my_obj_file.obj my_mesh_file.mesh

You might also like...
CS-GY 6533 A – Interactive Computer Graphics - Fall 2021

CS-GY 6533 A – Interactive Computer Graphics - Fall 2021 Course Instructors Cláudio Silva (instructor) 370 Jay Street, room 1153 [email protected] Offic

iMSTK - Interactive Medical Simulation Toolkit

iMSTK - Interactive Medical Simulation Toolkit About Overview Participants Licensing Resources Documentation Discourse Issue tracker Prerequisites Get

A dx12 river renderer using wave particles with interactive vortices.
A dx12 river renderer using wave particles with interactive vortices.

Wave Particles with Interactive Vortices Final Result Overview In game industry water can be divided into two domains, ocean and river. This project f

A toy renderer written in C using Vulkan to perform real-time ray tracing research.

This is a toy renderer written in C using Vulkan. It is intentionally minimalist. It has been developed and used for the papers "BRDF Importance Sampl

A personal project that uses DX12 to implement various render techniques to ultimately create breathtaking real-time visuals

D3D12Playground (Real Time) A personal project that uses DX12 to implement various render techniques to ultimately create breathtaking real-time visua

A sample app that demonstrates several techniques for rendering real-time shadow maps

Shadows This is a D3D11 sample app that demonstrates several techniques for rendering real-time shadow maps. The following techniques are implemented:

A real-time DirectX 11 renderer. The renderer is named by my girlfriend's english name.
A real-time DirectX 11 renderer. The renderer is named by my girlfriend's english name.

sophia Sophia is a real-time DirectX 11 renderer. It is not quite a rich graphics engine, only packages some low-level DirectX functions and contains

A multi core friendly rigid body physics and collision detection library suitable for games and VR applications.
A multi core friendly rigid body physics and collision detection library suitable for games and VR applications.

A multi core friendly rigid body physics and collision detection library suitable for games and VR applications.

Owner
Arnon Marcus
A long time enthusiast of computer graphics and programming. Veteran developer in the VFX industry, working at top studios (most recently at Weta Digital)
Arnon Marcus
Modern C++14 library for the development of real-time graphical applications

CI Community Support bs::framework is a C++ library that aims to provide a unified foundation for the development of real-time graphical applications,

null 1.7k Jan 2, 2023
Overlay Microsoft Flight Simulator (FS2020) aircraft data onto real airport charts in real-time

FLIGHTSIM CHARTS Introduction Overlay Microsoft Flight Simulator (FS2020) aircraft data onto real airport charts in real-time. Instantly teleport to a

Scott Vincent 3 May 31, 2022
StereoKit is an easy-to-use open source mixed reality library for building HoloLens and VR applications with C# and OpenXR!

StereoKit is an easy-to-use open source mixed reality library for building HoloLens and VR applications with C# and OpenXR! Inspired by libraries like XNA and Processing, StereoKit is meant to be fun to use and easy to develop with, yet still quite capable of creating professional and business ready software.

Nick Klingensmith 730 Jan 4, 2023
Kimera is a C++ library for real-time metric-semantic simultaneous localization and mapping

Kimera is a C++ library for real-time metric-semantic simultaneous localization and mapping, which uses camera images and inertial data to build a semantically annotated 3D mesh of the environment. Kimera is modular, ROS-enabled, and runs on a CPU.

null 1.4k Jan 2, 2023
Source Code for "Ray Tracing Gems: High-Quality and Real-Time Rendering with DXR and Other APIs" by Eric Haines and Tomas Akenine-Möller

Apress Source Code This repository accompanies Ray Tracing Gems: High-Quality and Real-Time Rendering with DXR and Other APIs by Eric Haines and Tomas

Apress 862 Dec 29, 2022
Demonstrates basic advantages of integrating the Data Distribution Service (DDS) and Time-Sensitive Networking (TSN) Ethernet.

ROS2-DDS-TSN integration demo This repository demonstrates basic advantages of integrating the Data Distribution Service (DDS) and Time-Sensitive Netw

NXP 60 Jan 6, 2023
Real-Time SLAM for Monocular, Stereo and RGB-D Cameras, with Loop Detection and Relocalization Capabilities

Real-Time SLAM for Monocular, Stereo and RGB-D Cameras, with Loop Detection and Relocalization Capabilities

Raul Mur-Artal 7.8k Jan 5, 2023
This Project Implement an interactive camera for 3D model using Quaternion. It have some advantages over eulerian camera like no gimbal lock and faster to compute.

Quaternion-Camera This Project Implement an interactive camera for 3D model using Quaternion. It have some advantages over eulerian camera like no gim

Phan Sang 8 Nov 10, 2022
Bullet Physics SDK: real-time collision detection and multi-physics simulation for VR, games, visual effects, robotics, machine learning etc.

Bullet Physics SDK: real-time collision detection and multi-physics simulation for VR, games, visual effects, robotics, machine learning etc.

Bullet Physics SDK 10.1k Jan 7, 2023
2D mesh deformation interactive demo

2D mesh deformation interactive demo

Dmitry V. Sokolov 18 Dec 7, 2022