Hackpads are smart collaborative documents. .
316 days ago
Unfiled. Edited by Elliot Woods 316 days ago
  • Introduction
Welcome to the new rulr manual. It's work in progress, but we are working on it!

3 days ago
303 days ago
Unfiled. Edited by Michele Cremaschi 303 days ago
  1. Click on the small "+" in the bottom left corner and then select "add files to "ofxKinectV2Example"
  1. Go and hunt for these files and add them back again (ensure "Copy" and "Add to target" are both selected
  1. Build and run? OK!
  1. Add the ofxRay addon
  1. Now let's copy some code from the windows example 
  1. Replace the ofEasyCam with ofxRay::Camera
  1. Edit the draw function:
316 days ago
Unfiled. Edited by Elliot Woods 316 days ago
Rulr - MANUAL (in progress)
335 days ago
Unfiled. Edited by savvasio 335 days ago
savvasio Hi Elliot, everyone. Not sure if this is the right place to ask so feel free to delete it if not. I would like to ask if there was a specific version of RULR for the workshop, one that is able to talk to the Astra cam. And if so can u share more please? Attended the workshop only as a viewer so I couldn't get the files. Tnx
350 days ago
Unfiled. Edited by Elliot Woods 350 days ago
  • Widgets
Elliot W There are multiple ways to work with sliders:
  • Dragging
Put your cursor anywhere in teh active area of the slider (you will notice the graphics change slightly as you roll your mouse over), then begin dragging left or right to change the value. Note that the position of your cursor doesn't matter, only the movement. This helps with speed and accuracy.
  • Double click jump
Simply mouse over anywhere in the active area of the slider and double click to jump the value.
  • Hold to zoom
This is similar to dragging, but gives us more accuracy. Just hold the mouse still for at least a second before you start moving, and you'll notice it starts to zoom the values. The longer you hold, the more it zooms. This is good for delicate accuracy.
  • Enter value as text
Click the pencil icon, and a text box will appear allowing you to enter your value manually. If you leave the box empty or hit cancel then no change will be made.
354 days ago
Unfiled. Edited by emanuel andel 354 days ago
Elliot W Troubleshooting
emanuel a
  • Q. import transformation
is there a way to import the transform values generated by the dx11 pointcloud calibration  into rulr and then do the kinect projector calibration? it would help a lot using the dx11 pointcloud blobextraction...
355 days ago
Unfiled. Edited by Elliot Woods 355 days ago
Elliot W
  • Introduction
There is a template node at ofxRulr/Nodes/src/ofxRulr/Nodes/Template.h/cpp which can be used to help you start developing your own nodes for Rulr.
This node doesn't do anything useful, and has several bits of functionality which are unrelated each other.
  • Minimal node
  • namespace ofxRulr {
  •     namespace Nodes {
  •         namespace MyNamespace {
  •             class MyNode : public Nodes::Base {
  •                 string getTypeName() const override { return "MyNamespace::MyNode"; }
  •             };
  •         }
  •     }
  • }
All nodes go inside the `ofxRulr::Nodes` namespace, and generally (i.e. always) go into a sub-namespace of that.
Inherit from `Nodes::Base`
All nodes inherit from `Nodes::Base`. This provides the basic interface which you need to fulfil to make your class into a Rulr node.
Note that there are other utility classes which you might want to inherit from instead of `Nodes::Base`, e.g.:
  • Nodes::Item::RigidBody
  • Nodes::Item::View
  • Nodes::DMX::Fixture
  • Nodes::DMX::MovingHead
  • Nodes::DMX::Transmit
  • Nodes::Channels::Generator::Base
These classes already inherit from Nodes::Base, so you can just inherit these classes directly.
generally this means
Implement getTypeName
Every node class must inherit at least `getTypeName()`, e.g.:
  • string getTypeName() const override { return "MyNamespace::MyNode"; }
Declare the node to Rulr
You've now defined a node class. Congratulations! :partly_sunny: 
But Rulr doesn't know about this node yet, we have to declare the existence of this node somehow. There are 2 ways to do this:
  • A. When working inside the main Nodes project
Add your node to DeclareNodes.cpp (include your h and add a `RULR_DECLARE_NODE` line to `loadCoreNodes`)
  • B. When working in a plugin
Most often when we create our own nodes, we're doing so in an external project. In this case we add the declaration to the plugin.cpp, e.g. for a plugin with 4 nodes, this looks like:
  • #include "ofxRulr/Nodes/MultiTrack/ChannelGenerator/LocalKinect.h"
  • #include "ofxRulr/Nodes/MultiTrack/ClientHandler.h"
  • #include "ofxRulr/Nodes/MultiTrack/Receiver.h"
  • #include "ofxRulr/Nodes/MultiTrack/Test/FindMarker.h"
  • OFXPLUGIN_PLUGIN_REGISTER_MODULE(ofxRulr::Nodes::MultiTrack::ChannelGenerator::LocalKinect);
  • OFXPLUGIN_PLUGIN_REGISTER_MODULE(ofxRulr::Nodes::MultiTrack::ClientHandler);
  • OFXPLUGIN_PLUGIN_REGISTER_MODULE(ofxRulr::Nodes::MultiTrack::Receiver);
  • OFXPLUGIN_PLUGIN_REGISTER_MODULE(ofxRulr::Nodes::MultiTrack::Test::FindMarker);
(Notice how the namespaces are mirrored in the filename paths)
Now try it!
Run Rulr, and check the node browser. Tada! you should find your node there.
Add it to your patch, and see it sit there doing nothing. Hooray!
  • Implementing node functionality
Events rather than overrides
Often when we make a new node, we want to copy in functionality from existing nodes into the new one. E.g. Cameras and Projectors have a lot in common, so they both inherit from the View node which describes the way cameras and projectors see the world.
Inheritance is great! But then we get stuck in patterns where the child class must be sensitive to whatever the parent class implements itself. E.g. if we were to override the drawWorld function, then we might accidentally disable the parent class' drawWorld function. We can then fix that by explicitly calling `Parent::drawWorld`, but we may forget to do that, or the parents functions might change without us knowing.
We deal with this problem in Rulr by using events rather than overrides. Each node has a set of events:
  • ofxLiquidEvent<void> onInit;
  • ofxLiquidEvent<void> onDestroy;
  • ofxLiquidEvent<void> onUpdate;
  • ofxLiquidEvent<void> onDrawWorld;
  • ofxLiquidEvent<void> onDrawStencil;
  • ofxLiquidEvent<shared_ptr<Graph::AbstractPin>> onConnect;
  • ofxLiquidEvent<shared_ptr<Graph::AbstractPin>> onDisconnect;
  • ofxLiquidEvent<void> onAnyInputConnectionChanged;
Instead of overriding these actions, each class in listens for these events (stored in `Nodes::Base`) and fires its own event.
  • MyNode() { //constructor
  •     this->onInit += [this]() {
  •         this->init();
  •     }
  • }
This can be written in Rulr shorthand as:
Members (61)
Maria Yablonina Austin Ellis jean-maxence Chagnon Michele Cremaschi Daan de Lange 神田竜 Elie Zananiri Saren Arterius Andrea Kriff Criscione Dimitris Mylonas Manuel Ehrenfeld savvasio Martin Coyne Marko Mitranić Matthias Husinsky Bruce Lane Junghoon Pi Nicolas Kiéné zaki urbandrone Bob FourZeroFour

Create a New Collection


Move XXX to XXX

XXX will be invited to the XXX on XXX.


Contact Support

Please check out our How-to Guide and FAQ first to see if your question is already answered! :)

If you have a feature request, please add it to this pad. Thanks!

Log in / Sign up