Posts

Paths to Power: How Every Member Got to Congress

Image
An interesting visualization from the New York Times, showing the education and career path of each member of the 116th congress. It outlines how a large number of representatives go through similar milestones, which are divided in three categories (education, career, government).  I was surprised to see that party affiliation does not appear to make a big difference in a representative's career path. With the exception of a few steps like non-profit work, milestones are distributed equally between democrats and republicans. The horizontal axis is not meaningful: I wonder if this would be easier to read as a simple parallel coordinates visualization. The large number of paths also makes it difficult to unveil relations between milestones: did more representatives with career in private law attend public or private college? It would be cool to be able to select a single milestone and see all paths going through it (the visualization allows to hover and view a single path at a ti...

Vis Critique: Farmland usage change in the US

Image
Bloomberg Graphics is one of my favorite places to check when looking for example of visualizations used in storytelling. Most of their articles are well done but the example below is an exception. The author wanted to show how farmland usage changed changed across US counties in the last 20 years. Each chart presented in the article showed the increase or decrease for a specific crop such as wheat or soybean. A cloropleth map would have worked fine here. But instead of using a color scale to represent percentage change, we have thin bars centered on each county, making the overall visualization busy and difficult to read. Original Article :  https://www.bloomberg.com/graphics/2018-crop-shift/

Flickering 2D transform elements in Chrome: a simple fix

This quick post is to point out a fix to an issue I had to deal with a few weeks ago and was caused by a Chrome update. Components with absolute positioning and a 2D CSS transform started flickering when placed inside a scrollable component. A brief search online revealed several people with similar problems, but the suggested fixes were all very different. I tested several of them (including obvious changes to the z order) before finding the one that actually did the trick. What eventually worked for me was adding an empty 3D transform to the same elements with 2D transforms: transform:translate3d(0,0,0); I guess the reason why this works is that it forces elements to be drawn via a different rendering / compositing path than standard 2D elements.

Organizing the React render method

Image
One common way to organize React render methods is to split the returned JSX into several smaller pieces, which are then assembled in the final JSX before returning. This makes the overall structure of the render function easier to understand. Note that the objective isn't to obtain JSX fragments we can reuse elsewhere, we just want our JSX to be split into bite-size, one-off sections that have a clear function in the component markup. Now, look at the two examples of a simple render method below. Which one would you use? Both approaches yield the same result and you would be tempted to use stateless components here, as the resulting all-JSX return statement looks better. But using stateless components defined inside your render method is a big no-no. Why? Because they will be re-rendered to the DOM from scratch every time the parent container renders. Keep in mind how reconciliation works. It will traverse your JSX tree, adding and removing nodes as needed. If a component in...

Omegalib v13 released

This release adds 64bit build support on Windows. We also include an extended camera streamer API and double precision support on GPU buffers. A lot of internal changes and code reorganization are also included in this relase. https://github.com/uic-evl/omegalib/releases/tag/v13

Supporting Co-Located Collaboration in Large-Scale Hybrid Immersive Environments

Image
These are videos from my talk for the 2016 Media Arts & Technology Seminar Series @ UCSB. While at UCSB, I had the chance to walk in the Allosphere : it's by far the most immersive large scale system I've ever seen!   Abstract: In the domain of large-scale visualization instruments, Hybrid Reality Environments (HREs) are a recent innovation that combines the best-in-class capabilities of immersive environments, with the best-in-class capabilities of ultra-high-resolution display walls. Co-located research groups in HREs tend to work on a variety of tasks during a research session (sometimes in parallel), and these tasks require 2D data views, 3D views, linking between them and the ability to bring in (or hide) data quickly as needed. Addressing these needs requires a matching software infrastructure that fully leverages the technological affordances offered by these new instruments. I detail the requirements of such infrastructure and outline the model of an operati...

glVertexAttribPointer and double precision buffers

Image
This post will hopefully help people avoid a mistake that cost me several hours of debugging. In one of my projects I have been working with OpenGL 4 double precision vertex buffers. As the buffer data was passed to the shader as a generic attribute, I have been using  glVertexAttribPointer  to specify the attribute location in the data stream. This worked fine with floating point data. When I needed to switch to double precision, I checked the glVertexAttribPointer specification: this function accepts GL_DOUBLE as an input type: therefore, I assumed that change was all I needed to pass double precision data to my shader. I noticed two other version of the attrib pointer function existed ( glVertexAttribIPointer and  glVertexAttribLPointer ) but I thought they were just legacy functions or alternatives to using glVertexAttribPointer with GL_DOUBLE or GL_INT type specifiers. Things did not work as I expected. trying to pass double precision data to the shader cau...

Omegalib 11.0 released

This version introduces a new set of classes to handle GPU resources (GpuBuffer, VertexArray, GpuRef etc.). It also adds an explicit display system flag to mark whether OpenGL should be initialized in core or compatibility profile. Other changes include A WorkerPool class improved packaging support the maintenance tools are now included as part of the distribution and include two new tools:   pack.app  to package a single application (experimental)   choose to choose a specific distribution as the enabled distribution on the machine (windows only for now) MissionControlClient.spawn  to start child orun processes that automatically connect back to a mission control server. Omegalib 11.0 is available as an update for the Windows and OSX binary distributions. Launch the package manager and choose update components to download the update.

Solving Bus Error: 10 crash on OSX

Image
This note is mostly a reminder to myself but could be useful to others. While running some CSV parsing code on OSX, I encountered a crash that took me a long time to debug. All I got when the crash happened was a Bus Error: 10  as soon as the program jumped into a text parsing function I wrote. Bus Error: 10 is a typical error appearing when undefined pointers are dereferenced, but this wasn't what was happening in my case: No code from the function was executed: the crash seemed to happen right at function start I was finally able to figure out the problem was with local array declarations , in particular an array whose size was about 256k. Since this array was declared within the function scope, it ended up being allocated on the stack, and the stack would end up overflowing because of this. Moving this array to the heap solved the problem for me.

Omegalib 9.0 Released!

This is the first release using alternate numbering for release and master branches: release branches will use odd numbers master branches will use even numbers This version introduces major improvements to mission control, and several fixes to both the GLFW and Equalizer display systems. Major Changes mission control can post commands to multiple clients using the wildcard character *  python console can switch to sending commands to a specific mission control client using the  @client syntax  -L off command line option to disable logging  --interactive-off command line flag to force disable interactive mode  .oapp files are now automatically interpreted as config files  Quad buffer support for active stereo  improvements to hybrid 2D/3D interaction on widgets (see ff5ba3e )

Omegalib v7.0 released

Image
This is the first release to be distributed as binary installer for both OSX and Windows. Support for display systems has been greatly improved: display systems are now loaded at runtime based on their name in the configuration file. New display systems can be added to omegalib just by adding their dll or shared library to the binary distribution. The Omegalib core ships with two display systems: Equalizer and GLFW. Other major changes since v6.0 include python multithreading support, improved logging and several bugfixes to resource allocation and cluster shutdown. Get the Windows/OSX installers here Download the source code here

Omegalib 6.0 released

Image
This is a large release, improving performance and fixing several bugs in the core library, introducing the omega maintenance scripts for easy installing and building omegalib on all platforms, and adding support for dynamic immersive windows both in the core library and through the MVI module. Full release notes here: https://github.com/uic-evl/omegalib/releases/tag/v6.0 Git tag: v6.0

Omegalib VR 2014 presentation

Image
This is the presentation of our paper  Omegalib: a Multi- View Application Framework for Hybrid Reality Environments  at IEEE VR 2014.

CAVE2 on Nature Medicine

Image
CAVE2 made it to the cover of Nature Medicine! In the picture, David Barnes (Monash University) is using EVL's Omegalib software to explore the beautiful brain connectome dataset by Olusola Ajilore (UIC). Read the full article here: http://www.nature.com/nm/journal/v20/n3/full/nm0314-228.html

Vtk Python scripting in Omegalib

Image
Since its early versions, omegalib offered a front-end for vtk. Vtk is a very powerful scientific visualization framework based on the assembly of processing and rendering components into a pipeline. Vtk supports python scripting, but up to now vtk/omegalib applications could only be created in C++. With its last update, The omegaVtk module supports running python vtk scripts on all platforms (Windows, Linux, OSX). Existing vtk python scripts can very easily be converted to run in omegalib. You just need to attach vtk Actors to omegalib scene nodes ( more info here ). It is also possible to attach vtk actors and OpenSceneGraph objects to the same node to overlay them. vtk scripting deeply simplifies the creation of scientific visualization tools with omegalib. omegaVtk also plays nice with other modules: write a bit of python and XML to create a web interface for your pipeline with porthole ; ore use the rift  module and explore your visualization with the Oculus Rift!...

CAVE2 and NASA ENDURANCE on Al Jazeera America

Image
Broadcast on Al Jazeera America News on December 8, 2013, this video features advanced visualization research at the Electronic Visualization Laboratory, University of Illinois at Chicago. The CAVE2(TM) Hybrid Virtual Reality Environment is featured along with the NASA ENDURANCE project which uses this technology.

Omegalib 5.1 released!

Image
omegalib running a cyclops demo ( https://github.com/omega-hub/cyclops/blob/master/examples/python/multishadow.py ), and using the webView module ( https://github.com/omega-hub/webView )  to display interactive webpages overlayed to the 3D scene. Version 5.1 adds a lot of improvements to the cyclops engine, and extends porthole to support multiple interfaces, complex python callbacks and javascript callbacks. IMPORTANT - FreeImage library Update: In this version the FreeImage library has been updated to solve issues with byte ordering on streamed images. To force a re-download and rebuild of FreeImage, delete FreeImage.tar.gz and the FreeImage directory in your build root. IMPORTANT - OSG Update: The internal version of osg has been slightly modified to support the render queue debug overlay. If you are updating your source from 5.0, You will need to force a rebuild of osg (for instance doing `make -B osg -j' in your build directory). Major Changes new module we...

Extending Omegalib With Custom Modules

Image
Starting form version 5.0, omegalib features a fully modular design. This new design allows users to start with a very lightweight version of omegalib, and customize it with the modules they need. Modules are kept in separate repositories so each revision history is separate, and development by different users is easier. When needed you can create your own modules in C++ or python, save them into a github repository and make them accessible to other omegalib users. Omegalib does the following to perform module search and installation: During the first cmake configuration, a  module list file  is downloaded from a specific github repository, called the  module hub . The predefined module hub is  http://github.com/omega-hub/hub , and it can be customized by setting the  OMEGA_HUB_URL  CMake variable. Changing the hub repository is useful if you want to maintan your own module list. The module list file is simply a  CMakeLists.txt  file contain...

Omegalib 5.0 released!

Image
This version will introduce physics support in cyclops and will ship with updated versions of several internal libraries (OpenSceneGraph, osgWorks, FBX). No API breaks are planned for this version, but due to changes in the dependency structure, a full, clean rebuild will be needed after updating to this version. This release notes will still list changes to external modules that are considered part of the core omegalib distribution: omegaOsg, omegaVtk and cyclops. breaking change  the cyclops shadow API has been deeply revised. Old apps using the shadow API will need to be modified (the old shadow system was quite buggy so I don't expect any application except for experiments making use of the old API) function change  In cyclops newly added lights are enabled by default. Major Changes general OpenScenegraph is now built automatically instead of being downloaded as a binary dependency Fixed several project dependencies in the build scripts. omegalib should now c...

Installing Modules In Omegalib 5.0

Image
How to install omegalib modules using the CMake GUI Starting form version 5.0 ( which will become the master version in a few days ), omegalib features a fully modular design. This new design allows users to start with a very lightweight version of omegalib, and customize it with the modules they need. Modules are kept in separate repositories so each revision history is separate, and development by different users is easier. Modules can be installed at configuration time in CMake, either by clicking on the checkboxes for modules you want to install, or by listing the desired module names in the  MODULES  cmake variable. How does omegalib install modules Omegalib does the following to perform module search and installation: During the first cmake configuration, a  module list file  is downloaded from a specific github repository, called the  module hub . The predefined module hub is  http://github.com/omega-hub/hub , and it can be customized by se...