Git Product home page Git Product logo

imdd's Introduction

imdd

Immediate Mode Debug Draw library written in C.

The library provides a simple immediate-mode interface to draw 3D shapes, to make it easy to inspect or debug state in games or other 3D applications. Utility functions are provided for rendering, with drop-in implementations for OpenGL 3.2 and Vulkan.

Usage

The library is header-only and compiles as C or C++. Include the header imdd.h in your project to use the library. Use a built-in renderer by including that header, or implement your own.

// one source file should define this to generate the implementation
#define IMDD_IMPLEMENTATION
#include "imdd.h"
#include "imdd_draw_gl3.h"

// create a shape store at startup
uint32_t shape_mem_size = IMDD_APPROX_SHAPE_SIZE_IN_BYTES*shape_count;
imdd_shape_store_t *store = imdd_init(malloc(shape_mem_size), shape_mem_size);

// create a renderer at startup
imdd_gl3_context_t ctx;
imdd_gl3_init(&ctx, shape_count, shape_count, shape_count);

// game frame loop
for (;;) {
	// clear existing shapes at the start of the frame
	imdd_reset(store);

	// ...

	// emit shapes at any point during the frame (from multiple threads)
	imdd_aabb(store, IMDD_STYLE_FILLED, IMDD_ZMODE_TEST, aabb_min, aabb_max, 0xff0000ffU);
	if (show_sphere) {
		imdd_sphere(store, IMDD_STYLE_WIRE, IMDD_ZMODE_TEST, centre_radius, 0xff00ff7fU);
	}

	// ...

	// render the shapes at the end of the frame
	imdd_gl3_update(&ctx, &store, 1);
	imdd_gl3_draw(&ctx, proj_from_world);

	// ...
}

Examples

See example_gl3.c or example_vulkan.c for a test scene that uses all shapes:

example

Details

The library is intended to solve two problems:

  • Efficient emission of large numbers of shapes from multiple threads simultaneously
  • Batching of these shapes into arrays of vertices or instance transforms for efficient rendering

Emitting Shapes

Emitting shapes is handled by the core library in imdd.h, which appends shapes into a store in memory:

  • The following shapes are supported:
    • Line, Triangle, Cube, Sphere, Cone, Cylinder
  • Each call to emit a shape reserves some space and writes out the parameters to memory
    • Parameters are written using SIMD instructions from imdd_simd.h, some parameters are expected to be passed in as SIMD types
    • Reserving space is done atomically using imdd_atomics.h to support multiple threads
  • All shapes except line can be drawn filled or wireframe
  • All shapes can be drawn with or without Z test

Rendering Shapes

Utility functions to simplify implementing a renderer can be found in imdd_draw_utils.h:

  • Functions to generate static vertex and index buffers for all shapes (filled and wireframe)
  • Functions to transform one or many stores into batches of vertices or transforms:
    • Lines and triangles generate vertex arrays for drawing directly
    • All other shapes generate arrays of transforms for instanced drawing
    • Arrays are partitioned into batches so that each combination of z test, blend mode and mesh can be drawn separately

By using the code from imdd_draw_utils.h, a renderer typically just has to:

  • Provide shaders for instanced and non-instanced rendering
  • Manage vertex buffer memory for static meshes and dynamic vertex and transform arrays
  • Set render state and emit a draw call for each batch

Renderer implementations are provided for:

API Header Notes
OpenGL 3.2 imdd_draw_gl3.h Currently requires the GL_ARB_base_instance extension for glDrawElementsInstancedBaseInstance.
Vulkan imdd_draw_vulkan.h Supports the OVR_multiview2 extension for stereo rendering (tested on Oculus Quest).

License

The library is released under the MIT license.

imdd's People

Contributors

sjb3d avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.