Skip to content
Alessandro Febretti edited this page Apr 27, 2015 · 66 revisions

This page is mostly for internal use and contains misc notes for omegalib features and modifications. Information here may refer to changes in the omegalib core library or any of the modules.

Works In Progress


CAVE2 omegalib demo update

  • build -> build.tmp
  • link & test current master version (do you get cur mvi?)
  • delete source & build.tmp
  • link & test current dev version
  • download & test railsim

icecloud port to CAVE2

  • 3D menu mode enable/disable when entering / exiting pointer mode, or just
  • place 2D menu where 3D wand is. This is because panels need 2D menu.
  • Plot panel does not display anything.
  • arrows to resize workspace do not work?
  • need button to turn off sonde drops.
  • UI scale issues
  • top down view test
  • window resize tests
  • multi-window tests
  • data save/reload tests
  • 2D interaction test
  • view launching & shutdown

Porthole Application Server

Porthole client grouping

In porthole.js on connection, python call porthole.getService().setClientGroup(%client_id%, group name, isMaster()) NOTE do not use the phCall because that only sends from master node. group name = (OMEGA.getAppId() = appName + multi instance id)

porthole::sendjs(cli): if cli has group name, send command to all clients in group, otherwise send to client only.

porthole::broadcastjs(cli) if cli = null send to all if cli != null if cli has group do not send to any client in group otherwise send to all clients except cli.

porthole::setClientGroup find portholeGUI with cli name portholeGUI->groupId portholeGUI->isMaster (set both through a portholeGUI->setGroup method)


Browser vs CAVE2 picking

Three.js:

// pos and dir are not needed.
raycaster = new THREE.Raycaster(camera.pos, camera.dir); 
mouse.x = '''
mouse.y = ...
raycaster.setFromCamera( mouse, camera )
intersections = raycaster.intersectObjects( objects ); // objects = object list

CHange to work in CAVE2

// pos and dir are probably not needed.
raycaster = new THREE.Raycaster(camera.pos, camera.dir); 
raycaster.ray = (ray coming from omegalib event)
intersections = raycaster.intersectObjects( objects ); // objects = object list

Simplify frame func support:

OMEGA.frameFunction = (pass the frame function)

in C++

invoke("OMEGA.frameFunction", context);

No need to keep vars around

Passing ray to js page:

OMEGA.buttonFunction(user, source, button, state)
OMEGA.trackerFunction(user, source, position, orientation, direction)
direction = orientation * (0, 0, -1) // direction = orientation * forward vec
both position and direction are relative to default camera for all mocap objects.

frameFunction, buttonFunction and trackerFunction might be set to a default empty function in porthole.js so user does not get errors....


appmgr user study tracker

  • app creation / destruction
  • app canvas updates
  • user position
  • user / app association ( icecloud can also have its own specific logs)

Log format

Canvases: do time snapshots, with window canvas positions each second (or 10 seconds?) Data: TIME, APPID, X, Y, W, H App creation / destruction - this can be inferred from canvas log but save separately TIME, APPID, Action (create / destroy) User log: snapshots every 1 or 10 seconds: TIME, USERID, POSITION, GAZE DIR, INPUT, APP ASSOCIATION (APPID), input mode rate input mode rate = how long input was in pointer vs wand mode over time slot. If time slot is just 1 second, we can just have a 2D or 3D value here Note - input is on/off if there has been input activity from user over last second (or 10 seconds)

icecloud log (one log for all apps - apps may send data to appmagaer, appmanager appmanager takes care of updatig the log to avoid having multiple apps open file for writing) snapshot TIME, APPID, MODE (3d, top/down, graph only, mixed), canvas (redundant), 2D/3D use 2D/3D use = area of display dedicated to 3d view vs area dedicated to 2d views also maybe 2D/3D inpt rate.If time slot is just 1 second input rate can just be 2D or 3D binary value.

Hypotheses:

  • display config changes depending on task - look at canvas snapshots
  • users work in parallel: look at user movement + app association
  • users alternate 2D/3D work: look at
  • 2D/3D interaction rate in apps
  • 2D/3D interaction rate over canvases.
  • window movement limited to task switching
  • canvas rearrangment limited and only happens at specific times in tape.

document mvi

what is mvi

Multi-View immersion (MVI) can be used to start multiple immersive applications on a single immersive installation. Applications can share the display space, be controller by multiple users, and be managed like windows.

How to start an mvi application

To run applications in MVI mode you need to run the MVI application manager (appmgr) which is part of the MVI distribution. You can then:

  • run applications from inside appmgr, using the :run quick command:
appmgr>:run path/to/my/script.py
  • run external applications and connect them to the app manager. You can do so using the mvi configuration from the mvi module:
bin> ./orun -s path/to/my/script.py -c mvi/mvi.cfg

Controlling MVI applications

Configuration

- appmgr
- mvi
- workspace script

How does it work

- general code structure

oapp file format

oapp can contain either python code or a config file. osystem reads first line of file and checks if it starts with config: to decide how to parse it.


OSX MAVERICKS WEIRDNESS

  • normals can't be inverted using gl_FrontFacing

  • add a new default_osx.frag shader and fix the point where it is loaded: the macro APPLE is incorrect.

  • shadow map / render buffer does not seem to clean between frames so th eshadow map end up being written over and over leading to weird shadows.


VTK distribution

Automate following steps

  • copy vtkbuild/Wrapping/Python/Vtk to modules/vtk
  • copy vtkbuild/bin/Release/*.pyd to bin
  • copy vtkbuild/bin/Release/*.dll to bin

Side note: sceneTools export to sceneTool, should export to modules/sceneTools


secondary camera active viewport

Let secondary cameras have an active viewport so they can become disabled on tiles/nodes that do not need them. Use case is secondary cameras rendering to an image widget - if the widget is off tile boundaries, camera does not need to render on that node.


orun within initScript breaks cluster launcher

used by applauncher to set a configurable init script wich then launches the mvi config script using orun. Need a way to start orun without changing dir or an alternative way of running the mvi config scripts.


Canvas size sugar

getting canvas rect from context / system is horrible: context.tile->displayConfig.getCanvasRect().size() add some syntactic sugar for this (make issue)

Wishlist


PointCloud: LOD issues

pointCloud vis seems to break for larger point clouds

  • use example dataset and identify break parameters (pc size, batch size, ...)

Per-node data sharing

Right now, modules with data sharing enabled share the same data with all slaves. In some scenarios (i.e. pixel data streaming) it is desirable to send a different subset of the data to each slave (i.e. to account for window position and send only tiles of the pixel data to target nodes, to reuce overhead).

Possible API

Implementation

Can we use Equalizer co::Object functions?


C++11 Transition

  • Create a C++11 branch in omegalib&omicron

omicron

  • update Asio
  • update Eigen

Omegalib

  • add new '-std=c++11' flag to linux, OSX CMakelists NOTE it might be easier to disable c++11 on 3rd party libraries.. it can probably be done when adding external projects

OSG static build

bullet

ok, already static

osg

osgWorks

osgBullet

omegaOsg


porthole vs node.js

  • porthole is designed for multi-user applications, not websites.

  • porthole supports either a small standalone server, or a 'rich' server driving a display, where the clients act as secondary interfaces to the server application

Clone this wiki locally