Yep, I have done it. It has taken a little time, but I am now in the final steps to finish a new engine to develop interactive components. This can be used to create workflow systems or user interfaces.
The UI subsystem I created for my simple sensor application was not capable to handle the complexity and flexibility required to implement a multi-dimensional layout engine.
I struggeled around a few days with the layout engine based on the old UI subsystem, but then decided to revamp the subsystem completely to create a new – more Pi-Calculus based – system, where the connection ports are copyable and channels between ports are created on demand.
So today, after 3 attempts I finally finished the user interface event subsystem. Thanks to elists I was capable to create a small scheduler for event handlers and a template based system similar to the signal and slots system of trolltech’s Qt framework.
The externalising of slots is done now. I have created a small application named ‘desktop’ which is capable to handle space organisation for the terminals starting up. Additionally, the server supports a hierarchical slot namespace, so it is possible to place and access slots by path names.
Today I decided, that it would be nice to support window (slot) decorations containing some essential buttons. So it is not time to start building the user interface subsystem. Of course, it will include automatic 2d/3d layout-management and full support for the costomisation of 3D widgets.
Expect some buttons soon, click, click
Ok, slot management is implemented, today, while thinking what to put next on my todo list I got a new idea: I will rewrite the whole slot management system to allow any client to provide 3D slots and to start other clients inside these slots. This would solve some of my current issues with space partitioning and application startup:
I rewrote the complete focusmanager and movement engine, so now it is possible to use the mouse-wheel to adjust the relative depth to the current object. Additionally, it is now possible to concatenate movements: Users are able to adjust the relative depth while moving the focus to a new object.
This screenshot shows (from left to right) a gprof output and source editing using vim and some output produced by the find command. The text quality is not final and the borders are somewhat overlapping. But all in all it is possible to work within the paramatrix terminal emulator. Please click on ‘original image’ to get the real impression.
Zombie objects and the event-system are finished. The event-system is preliminary, but it is now possible to work with multiple applications while switching through them using the Focusmanager. Yep! Again, one point less on my todo list. But the next is near:
Both, the association system, I called tlists (from type-lists) and the focusmanager are implemented and working.
In fact, the focusmanager is working much better than in my 3D prototype I’ve made in 2000. The mouse feedback is very acceptible for touch interaction. You touch an object, and the camera will move itsself into the best position to focus it, with the mouse cursor not leaving the appropriate position in the 3D plane of the focused object.
So, to implement the Focusmanager I found out, that there is another small technology needed. Basically, I need some kind of an association system to link arbitrary typed instances to the scenegraph nodes. While rendering the scenegraph, this could have multiple uses:
I finished all code required for implementing the focusmanager today. 3D Ray/Polygon intersection and all the associated math. This time I was not able use the OpenGL functions, so I had to manage and implement all matrix math required. Testing was a little bit of a struggle, because of my limited experience with inversed matrices and some bugs in the math code. But finally it worked.