gl3n 1.4.1

OpenGL Maths for D (not glm for D but better).

To use this package, run the following command in your project's root directory:

Manual usage
Put the following dependency into your project's dependences section:


Build Status

gl3n provides all the math you need to work with OpenGL. Currently gl3n supports:

  • linear algebra
  • vectors
  • matrices
  • quaternions
  • geometry
  • axis aligned bounding boxes
  • planes
  • frustum (use it with care, not a 100% tested)
  • interpolation
  • linear interpolation (lerp)
  • spherical linear interpolation (slerp)
  • hermite interpolation
  • catmull rom interpolation
  • colors - hsv to rgb and rgb to hsv conversion
  • nearly all GLSL defined functions (according to spec 4.1)
  • the power of D, e.g. dynamic swizzling, templated types (vectors, matrices, quaternions), impressive constructors and more!


gl3n is MIT licensed, which allows you to use it everywhere you want it.


gl3n uses ddoc for documentation. You can build it easily with the Makefile:

make ddoc

But there is of course also an online documentation available.


On Linux you can build gl3n for yourself with:

make install

# archlinux structure:
make PREFIX=/usr
make install PREFIX=/usr

Or for debian based systems you can use the .deb packages provided by the d-apt repository. If you want to use gl3n on Fedora, you can use your package manager to install it!

On Windows you can also use the Makefile, but you need e.g. cygwin to run it. Otherwise you can use the raw .d files and include them into your project (-I flag).

If you want to use gl3n in your project, simply include the sources or use git submodules!


vec4 v4 = vec4(1.0f, vec3(2.0f, 3.0f, 4.0f));
vec4 v4_2 = vec4(1.0f, vec4(1.0f, 2.0f, 3.0f, 4.0f).xyz); // "dynamic" swizzling with opDispatch
vec4 v4_3 = v4_2.xxyz; // opDispatch returns a static array which you can pass directly to the ctor of a vector!

vec3 v3 = my_3dvec.rgb;
vec3 foo = // not useful but possible!

mat4 m4fv = mat4.translation(-0.5f, -0.54f, 0.42f).rotatex(PI).rotatez(PI/2);
glUniformMatrix4fv(location, 1, GL_TRUE, m4fv.value_ptr); // yes they are row major!

alias Matrix!(double, 4, 4) mat4d;
mat4d projection;
glGetDoublev(GL_PROJECTION_MATRIX, projection.value_ptr);

mat3 inv_view = view.rotation;
mat3 inv_view = mat3(view);

mat4 m4 = mat4(vec4(1.0f, 2.0f, 3.0f, 4.0f), 5.0f, 6.0f, 7.0f, 8.0f, vec4(...) ...); 
    void strafe_left(float delta) { // A
        vec3 vcross = cross(up, forward).normalized;
        _position = _position + (vcross*delta);

    void strafe_right(float delta) { // D
        vec3 vcross = cross(up, forward).normalized;
        _position = _position - (vcross*delta);
  • David Herberth
1.4.1 2021-Mar-22
1.4.0 2021-Mar-10
1.3.1 2016-Jan-07
1.3.0 2016-Jan-06
1.2.0 2015-Jun-25
Show all 9 versions
Download Stats:
  • 0 downloads today

  • 13 downloads this week

  • 35 downloads this month

  • 10000 downloads total

Short URL: