gl3n - linear algebra and more for D

David admin at dav1d.de
Fri Dec 2 14:36:59 PST 2011


Hello,

I am currently working on gl3n - https://bitbucket.org/dav1d/gl3n - gl3n 
provides all the math you need to work with OpenGL, DirectX or just 
vectors and matrices (it's mainly targeted at graphics - gl3n will never 
be more then a pure math library). What it supports:

  * vectors
  * matrices
  * quaternions
  * interpolation (lerp, slerp, hermite, catmull rom, nearest)
  * nearly all glsl functions (according to spec 4.1)
  * some more cool features, like templated types (vectors, matrices,
    quats), cool ctors, dynamic swizzling

And the best is, it's MIT licensed ;). Unfortunatly there's no 
documentation yet, but it shouldn't be hard to understand how to use it, 
if you run anytime into troubles just take a look into the source, I did 
add to every part of the lib unittests, so you can see how it works when 
looking at the unittests, furthermore I am very often at #D on freenode.
But gl3n isn't finished! My current plans are to add more interpolation 
functions and the rest of the glsl defined functions, but I am new to 
graphics programming (about 4 months I am now into OpenGL), so tell me 
what you're missing, the chances are good that I'll implement and add 
it. So let me know what you think about it.

Before I forget it, a bit of code to show you how to use gl3n:

------------------------------------------------------------------------
vec4 v4 = vec4(1.0f, vec3(2.0f, 3.0f, 4.0f));
vec4 v4 = vec4(1.0f, vec4(1.0f, 2.0f, 3.0f, 4.0f).xyz)); // "dynamic" 
swizzling with opDispatch
vec3 v3 = my_3dvec.rgb;
float[] foo = v4.xyzzzwzyyxw // not useful but possible!
glUniformMatrix4fv(location, 1, GL_TRUE, mat4.translation(-0.5f, -0.54f, 
0.42f).rotatex(PI).rotatez(PI/2).value_ptr); // yes they are row major!
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(...) ...);

struct Camera {
     vec3 position = vec3(0.0f, 0.0f, 0.0f);
     quat orientation = quat.identity;

     Camera rotatex(real alpha) { orientation.rotatex(alpha); return this; }
     Camera rotatey(real alpha) { orientation.rotatey(alpha); return this; }
     Camera rotatez(real alpha) { orientation.rotatez(alpha); return this; }

     Camera move(float x, float y, float z) {
         position += vec3(x, y, z);
         return this;
     }
     Camera move(vec3 s) {
         position += s;
         return this;
     }

     @property camera() {
         //writefln("yaw: %s, pitch: %s, roll: %s", 
degrees(orientation.yaw), degrees(orientation.pitch), 
degrees(orientation.roll));
         return mat4.translation(position.x, position.y, position.z) * 
orientation.to_matrix!(4,4);
     }
}

         glUniformMatrix4fv(programs.main.view, 1, GL_TRUE, 
cam.camera.value_ptr);
         glUniformMatrix3fv(programs.main.inv_rot, 1, GL_TRUE, 
cam.orientation.to_matrix!(3,3).inverse.value_ptr);
------------------------------------------------------------------------

I hope this gave you a little introduction of gl3n.

- dav1d
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d-announce/attachments/20111202/78d5c32d/attachment-0001.html>


More information about the Digitalmars-d-announce mailing list