Geist Software Labs

The Geist3D graphics engine includes a set of powerful runtime and modeling capabilities. The editor has an intuitive graphical user interface to manipulate 3D objects and construct Petri Nets, as well as source code editors for Lua scripts and the OpenGL shading language. The rendering pipeline of Geist3D is based on a scene tree architecture where different types of nodes encapsulate graphic artifacts such as geometries, textures and shading programs. Some of the main features include rigid body physics, skeletal-based character animation and a planetary rendering engine.

 

Programming Language

Geist3D supports an event-driven programming language based on a combination of Petri Nets and Lua script. The scene tree nodes can travel as tokens through the Petri Net graph structure where they are subjected to different user-defined event handlers. Each type of node publishes a Lua scripting interface and generates events while contained within the Petri Net. The development studio contains a layout tool to design the Petri Net graph and associate Lua Scripts with the different Petri Net constructs.

 

 


OpenGL Shading Language

The development studio includes a GLSL source code editor desgined to interactively develop shaderig programs for lighting algorithms and particle systems. Some of the node types implicitly supply uniform parameters to vertex and fragment shader such as normals, tangent space, color gradients and noise textures. Geist3D already contains a growing library of predefined shader templates for different types of surfaces, atmospheric scattering and water.

 

 

 


Terrain Rendering

Geist3D supports large spherical as well as planar terrains. The planets are generated using a customizable noise function while the planar landscapes are based on external digital elevation models and Landsat 7 satellite images (more...). An effective Level-of-Detail algorithm enables seamless transition from near the surface to millions of kilometers away. Most of the problems caused by floating point precision and z-fighting at that scale have been resolved, and high frame rates are achieved on most modern desktop computers. The development studio provides an interface to define the noise function as well as the gradient map that specifies the terrain color for a given elevation and slope.

 

 


Rigid Body Physics

Geist3D also computes rigid body physics for a set of simple dynamic shapes and mechanical joints. Efficient collision detection and constraint solving algorithms ensure that dynamic objects and avatars display realistic physical behavior. More complex mechanical systems are assembled by connecting dynamic shapes through sliders or hinges. The physics computation functions seamlessly even on a large planetary scale.

 

 

 

 

Lighting and Texturing

Geist3D supports a variety of lighting and texturing techniques. Different types of cameras render color or depth values into floating point textures and cube maps which can be used for High Dyanamic Range rendering, or for shadow maps, screens and mirrors. Predefined 2D and 3D noise textures are available for shading programs that produce procedural textures and surfaces. The development studio provides an interface to configure and position cameras, and to define color gradients and noise functions.

 

 


Character Animation

Geist3D supports skeletal character animation in the md5 file format. The triangles meshes and animation sequences of an md5 file are combined to form a user-controlled avatar. Some of the animations are automatically mapped to the keyboard while others are invoked though the scripting interfaces. Geist3D uses the displacement of the animation root bone to apply forces that move the character accordingly. Each avatar is contained by a simple collision shape that interacts with other dynamic objects in the environment.

 

 


User interface

Geist3D also contains a growing toolbox of 2D interface widgets such as windows, sliders and buttons. The interface components are encapsulated by scene tree nodes which are programmable with the same Petri Net based language as the 3D node types. A 2D canvas allows users to draw arbitrary content using a Lua interface for OpenGL.