Skip to main content

· One min read
Jules Fouchy

      👩‍💻 GLSL is a pretty low-level language. But what if we turned it into a classy functional programming language capable of handling higher-order functions? That is, giving it the ability to pass functions as parameters to other functions. Well, this is exactly what CoolLab does!

· One min read
Jules Fouchy

You can now write scripts to control CoolLab. Everything that you can do in the UI in now also doable through scripts.
Moreover, you can write those scripts in the language of your choice! That's right, every language in the world will do, even the one you wrote last weekend and that only you possesses an interpreter for.

All of this magic relies on a well knwown friend: the HTTP protocol.

· 2 min read
Jules Fouchy

After a lot of trouble and bugs, I have come to the conclusion that you sould use floats most of the time.

The reason is simple : when you are doing maths, it is rare that the logic of your calculations will only output integers.

· One min read
Jules Fouchy

Remove dependency on a backend, let users implement it the way they like, and provide implementations for popluar backend.

I was scared to generalize my cam library because I thought I would need to use template, and know how to get the transpose of a matric for example. But this is much simpler, flexible, and does come with all the annoyances of templates (all the code in headers, harder for ides to handle)

· 2 min read
Jules Fouchy

How often have you used an angle in radians when the function was expecting it in degrees, or vice-versa? I personnaly have, way too often. And so I decided that that time was over. We need to enforce these kind of checks in the signature of our functions and our type-system!

· 3 min read
Jules Fouchy

I often end up writting classes that wrap other classes or primitive types.

struct MyData {
float field1;
float field2;
float field3;
float field4;
float field5;

void do_something();
};
class MyDataWrapper {
public:
void do_something_else();

private:
MyData _my_data;
};

And for a long time I was annoyed when needing to access the underlying wrapped class. At first I was writting one getter function for each method or field of the wrapped class that I still needed to access.