Transcript
Page 1: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler 1.0VR Juggler 1.0Application ProgrammingApplication Programming

Patrick HartlingPatrick Hartling

Virtual Reality Applications CenterVirtual Reality Applications Center

IEEE VR 2002IEEE VR 2002

Page 2: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

ObjectivesObjectives

• Learn VR Juggler programming basicsLearn VR Juggler programming basics• Be able to write VR Juggler applicationsBe able to write VR Juggler applications

• Please: Ask questions!!! Please: Ask questions!!!

Page 3: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

OverviewOverview

• Application objectsApplication objects• VR Juggler utility classesVR Juggler utility classes• Simple VR Juggler applicationSimple VR Juggler application• Advanced OGL applicationAdvanced OGL application

Page 4: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Online DocumentationOnline Documentation

• www.vrjuggler.orgwww.vrjuggler.org• ““Projects”Projects”

– VR JugglerVR Juggler DocumentationDocumentation

• Guides and Guides and referencesreferences

Page 5: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Application ObjectsApplication Objects

– All VR Juggler applications are objectsAll VR Juggler applications are objects– Override methods of a pre-defined interfaceOverride methods of a pre-defined interface

Derived class for each graphics APIDerived class for each graphics API

– No No main()main() – “Don’t call me, I’ll call you” – “Don’t call me, I’ll call you” Kernel controls application by calling methodsKernel controls application by calling methods

vjApp

+init()+apiInit()+exit()+preFrame()+intraFrame()+postFrame()

class MyApp : public vjApp{ void init(); void apiInit(); void exit(); void preFram e();

.

.

.};

Page 6: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Application ObjectsApplication Objects

• Application object is Application object is derived from graphics API derived from graphics API specific base classspecific base class

• User application methods User application methods must “fill-in-the-blank” must “fill-in-the-blank”

+init()+apiInit()+preFrame()+intraFrame()+postFrame()+...()

vjApp

+draw()+contextInit()+contextPreDraw()+...()

vjGlApp

+init()+apiInit()+preFrame()+intraFrame()+postFrame()+draw()+contextInit()+contextPreDraw()+...()

myApp

Page 7: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

#include <simpleApp.h>

int main (int argc, char* argv[])

{

// Get kernel

vjKernel* kernel = vjKernel::instance();

simpleApp* app = new simpleApp(); // Create app obj

kernel->loadConfigFile(…); // Configure kernel

kernel->start(); // Start kernel thread

kernel->setApplication(app); // Give app to kernel

while ( ! exit )

{

// sleep }

}

VR Juggler VR Juggler main()main()

• How VR Juggler How VR Juggler “starts-up”“starts-up”

Page 8: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

#include <simpleApp.h>

int main (int argc, char* argv[])

{

// Get kernel

vjKernel* kernel = vjKernel::instance();

simpleApp* app = new simpleApp(); // Create app obj

kernel->loadConfigFile(…); // Configure kernel

kernel->start(); // Start kernel thread

kernel->setApplication(app); // Give app to kernel

while ( ! exit )

{

// sleep }

}

VR Juggler VR Juggler main()main()

• Get handle to Get handle to kernelkernel

Page 9: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

#include <simpleApp.h>

int main (int argc, char* argv[])

{

// Get kernel

vjKernel* kernel = vjKernel::instance();

simpleApp* app = new simpleApp(); // Create app obj

kernel->loadConfigFile(…); // Configure kernel

kernel->start(); // Start kernel thread

kernel->setApplication(app); // Give app to kernel

while ( ! exit )

{

// sleep }

}

VR Juggler VR Juggler main()main()

• Create the Create the applicationapplication– Instance of user’s Instance of user’s

application objectapplication object

Page 10: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

#include <simpleApp.h>

int main (int argc, char* argv[])

{

// Get kernel

vjKernel* kernel = vjKernel::instance();

simpleApp* app = new simpleApp(); // Create app obj

kernel->loadConfigFile(…); // Configure kernel

kernel->start(); // Start kernel thread

kernel->setApplication(app); // Give app to kernel

while ( ! exit )

{

// sleep }

}

VR Juggler VR Juggler main()main()

• Give the kernel Give the kernel initial configuration initial configuration filesfiles

• Start the kernel Start the kernel threadthread– VR Juggler is now VR Juggler is now

fully runningfully running

Page 11: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

#include <simpleApp.h>

int main (int argc, char* argv[])

{

// Get kernel

vjKernel* kernel = vjKernel::instance();

simpleApp* app = new simpleApp(); // Create app obj

kernel->loadConfigFile(…); // Configure kernel

kernel->start(); // Start kernel thread

kernel->setApplication(app); // Give app to kernel

while ( ! exit )

{

// sleep }

}

VR Juggler VR Juggler main()main()

• Give the kernel an Give the kernel an application to runapplication to run

• Kernel now starts Kernel now starts calling the calling the application object’s application object’s methodsmethods

Page 12: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Application Object MethodsApplication Object MethodsInitializationInitialization

• init()init(): Application initialization: Application initialization– Ex: Loading data files, lookup tablesEx: Loading data files, lookup tables

• apiInit()apiInit(): Graphics API specific initialization: Graphics API specific initialization– Ex: scene graph loadingEx: scene graph loading

Frame functionsFrame functions• preFrame()preFrame(): Called at start of frame: Called at start of frame

– Ex: Updating data in response to device input Ex: Updating data in response to device input

• intraFrame()intraFrame(): Called while rendering: Called while rendering– Ex: Time consuming computation for next frameEx: Time consuming computation for next frame

• postFrame()postFrame(): Called after frame is done: Called after frame is done– Ex: Clean up, sync with external net or computeEx: Clean up, sync with external net or compute

+init()+apiInit()+preFrame()+intraFrame()+postFrame()+...()

vjApp

+draw()+contextInit()+contextPreDraw()+...()

vjGlApp

+init()+apiInit()+preFrame()+intraFrame()+postFrame()+draw()+contextInit()+contextPreDraw()+...()

myApp

Page 13: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Application InterfaceApplication Interface

• Other…Other…– ReconfigurationReconfiguration– ResetReset– ExitExit– Focus changeFocus change

+init()+apiInit()+preFrame()+intraFrame()+postFrame()+...()

vjApp

+draw()+contextInit()+contextPreDraw()+...()

vjGlApp

+init()+apiInit()+preFrame()+intraFrame()+postFrame()+draw()+contextInit()+contextPreDraw()+...()

myApp

Page 14: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

#include <simpleApp.h>

int main (int argc, char* argv[])

{

// Get kernel

vjKernel* kernel = vjKernel::instance();

simpleApp* app = new simpleApp(); // Create app obj

kernel->loadConfigFile(…); // Configure kernel

kernel->start(); // Start kernel thread

kernel->setApplication(app); // Give app to kernel

while ( ! exit )

{

// sleep }

}

Call TimingCall Timing

• setApplication()setApplication() starts the kernel calling the starts the kernel calling the application’s member functionsapplication’s member functions

kern

vjKernel

while(running)

OGLApp

vjGlApp

drawMgr

vjGlDrawManager

inputMgr

vjInputManager

/postFrame():void

/intraFrame():void

/preFrame():void

/apiInit():void

/init():void

/sync():void

/draw():void

/initAPI():void

/updateAllData():void

Page 15: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Call timing: Init Call timing: Init membersmembers• init()init()

– Called after kernel Called after kernel gets app gets app

• apiInit()apiInit()– Called after Called after

graphics API is graphics API is runningrunning

kern

vjKernel

while(running)

OGLApp

vjGlApp

drawMgr

vjGlDrawManager

inputMgr

vjInputManager

/postFrame():void

/intraFrame():void

/preFrame():void

/apiInit():void

/init():void

/sync():void

/draw():void

/initAPI():void

/updateAllData():void

Page 16: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Call timing: Frame Call timing: Frame membersmembers• preFrame()preFrame()

– Called after input updateCalled after input update

• intraFrame()intraFrame()– Called while rendering of Called while rendering of

environment is happeningenvironment is happening

• postFrame()postFrame()– Called after frame but before Called after frame but before

tracker updatestracker updates

kern

vjKernel

while(running)

OGLApp

vjGlApp

drawMgr

vjGlDrawManager

inputMgr

vjInputManager

/postFrame():void

/intraFrame():void

/preFrame():void

/apiInit():void

/init():void

/sync():void

/draw():void

/initAPI():void

/updateAllData():void

Page 17: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

vjGlAppvjGlApp: OpenGL : OpenGL Application InterfaceApplication Interface

• Derived from Derived from vjAppvjApp• OpenGL specific extensionsOpenGL specific extensions

– draw()draw() Draw the scene in OpenGLDraw the scene in OpenGL Called for each OpenGL contextCalled for each OpenGL context Stereo Stereo Called once per eye Called once per eye

– contextInit()contextInit(), , contextPreDraw()contextPreDraw(), , contextClose()contextClose()

Discussed laterDiscussed later

+init()+apiInit()+preFrame()+intraFrame()+postFrame()+...()

vjApp

+draw()+contextInit()+contextPreDraw()+...()

vjGlApp

+init()+apiInit()+preFrame()+intraFrame()+postFrame()+draw()+contextInit()+contextPreDraw()+...()

myApp

Page 18: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

vjPfAppvjPfApp: Performer: PerformerApplication InterfaceApplication Interface

• Derived from Derived from vjAppvjApp• Performer specific Performer specific

extensionsextensions– initScene()initScene()

Create the scene graphCreate the scene graph

– getScene()getScene() Return the root of the scene Return the root of the scene

graphgraph

+init()+apiInit()+preFrame()+intraFrame()+postFrame()+...()

vjApp

+initScene()+getScene()+...()

vjPfApp

+init()+apiInit()+preFrame()+intraFrame()+postFrame()+initScene()+getScene()+...()

myPfApp

Page 19: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Common ClassesCommon Classes

Helper classes needed for app Helper classes needed for app developmentdevelopment• Mathematics: matrix, vector, pointMathematics: matrix, vector, point• Input devicesInput devices

Page 20: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Common Classes: Common Classes: vjMatrixvjMatrix

4x4 matrix4x4 matrix• OpenGL orderingOpenGL ordering

MethodsMethods• Rotation: Rotation: makeXYZEuler()makeXYZEuler(), , makeRot()makeRot()• Translation: Translation: makeTrans()makeTrans(), , setTrans()setTrans()• Multiplication: Multiplication: mult()mult(), , preMult()preMult(), , postMult()postMult()

• Many others… (see Many others… (see Programmer’s GuideProgrammer’s Guide))

Page 21: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Common Classes: Common Classes: vjVec3vjVec3 & & vjVec4vjVec4

• Class for float vectorClass for float vector• Used for points and raysUsed for points and rays• MethodsMethods

– +,-,=+,-,=– dot()dot(), , normalize()normalize(), , cross()cross()– Many others… (see Many others… (see Programmer’s GuideProgrammer’s Guide))

Page 22: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Common Classes: Common Classes: vjProxyvjProxy

• Proxies are used to access all input dataProxies are used to access all input datawand_pos = mWandProxy->getData();wand_pos = mWandProxy->getData();

• Proxies cache and transform input dataProxies cache and transform input data

0..1

0..1

0..*

vjPosProxy

vjPosProxy~vjPosProxyupdateDatagetUpdateTimesetTransformsetgetDatagetUnitgetPositionPtrgetTransformtransformDatagetChunkTypeconfiggetProxiedInputDevice

vjPosInterface

vjPosInterfaceoperator->operator*refresh

vjPosition

vjPosition~vjPositionconfigstartSamplingstopSamplingsampleupdateDatagetDeviceNamegetPosDatagetPosUpdateTime

Page 23: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Common Classes: Common Classes: vjDeviceInterfacevjDeviceInterface

– Used to get access to devices through proxiesUsed to get access to devices through proxies

– Smart pointer to a device proxySmart pointer to a device proxy

– Makes proxies easier to useMakes proxies easier to use

– init()init()mWand.init(“VJWand”);mWand.init(“VJWand”);

0..1

0..1

0..*

vjPosProxy

vjPosProxy~vjPosProxyupdateDatagetUpdateTimesetTransformsetgetDatagetUnitgetPositionPtrgetTransformtransformDatagetChunkTypeconfiggetProxiedInputDevice

vjPosInterface

vjPosInterfaceoperator->operator*refresh

vjPosition

vjPosition~vjPositionconfigstartSamplingstopSamplingsampleupdateDatagetDeviceNamegetPosDatagetPosUpdateTime

Page 24: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Common Classes: Common Classes: vjPosInterfacevjPosInterface

vjPosInterfacevjPosInterface• Used to get positional information. Used to get positional information.

– Ex. trackers, wand position, head positionEx. trackers, wand position, head position

• Derived from Derived from vjDeviceInterfacevjDeviceInterface• Dereferences to Dereferences to vjPosProxyvjPosProxy

– operator*()operator*(), , operator->()operator->()– Get proxy data with: Get proxy data with: getData()getData()

vjMatrix* wand_pos;vjMatrix* wand_pos;wand_pos = mWand->getData();wand_pos = mWand->getData();

Page 25: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Common Classes: Common Classes: vjDigitalInterfacevjDigitalInterface

vjDigitalInterfacevjDigitalInterface• Used to get digital information (ie. 0 or 1)Used to get digital information (ie. 0 or 1)

– Ex: wand buttonsEx: wand buttons

• getData()getData() returns integer returns integer– States (return value):States (return value):

OFFOFF ONON TOGGLE_ON: Just switched to on stateTOGGLE_ON: Just switched to on state TOGGLE_OFF: Just switched to off stateTOGGLE_OFF: Just switched to off state

Page 26: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Sample Application 1:Sample Application 1:Simple OpenGL ApplicationSimple OpenGL Application

simpleAppsimpleApp

Page 27: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Sample Application 1: simpleAppSample Application 1: simpleApp

Simple OpenGL drawing appSimple OpenGL drawing app• Member functionMember function

– vjApp::init()vjApp::init()– vjGlApp::draw()vjGlApp::draw()

• FilesFiles– simpleApp/simpleApp.hsimpleApp/simpleApp.h, , simpleApp/simpleApp.cppsimpleApp/simpleApp.cpp

+init()+apiInit()+preFrame()+intraFrame()+postFrame()+...()

vjApp

+draw()+contextInit()+contextPreDraw()+...()

vjGlApp

+init()+draw()+contextInit()+...()

simpleApp

Page 28: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

class simpleApp: public vjGlApp

{

public:

simpleApp();

virtual void init();

virtual void draw();

public:

vjPosInterface mWand;

vjPosInterface mHead;

vjDigitalInterface mButton0;

vjDigitalInterface mButton1;

};

simpleApp: Data MemberssimpleApp: Data Members

• mWandmWand, , mHeadmHead::– Position interface to positional Position interface to positional

proxyproxy

– Get positionGet position

vjMatrix wand_pos;vjMatrix wand_pos;

wand_pos = *(mWand-wand_pos = *(mWand->getData());>getData());

• mButton0mButton0, , mButton1mButton1– Digital interface to digital proxyDigital interface to digital proxy

if(mButton0->getData())if(mButton0->getData())

cout << “Button Pressed”;cout << “Button Pressed”;

Page 29: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

simpleApp: simpleApp: init()init()

• Initialize device Initialize device interfaceinterface

• Device nameDevice name– From configuration fileFrom configuration file– Name of device alias or Name of device alias or

proxyproxy

void simpleApp::init()

{

// Initialize devices

mWand.init(“VJWand”);

mHead.init(“VJHead”);

mButton0.init(“VJButton0”);

mButton1.init(“VJButton1”);

}

Page 30: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

void simpleApp::draw()

{

...

// Create box offset matrix

vjMatrix box_offset;

box_offset.makeXYZEuler(-90,0,0);

box_offset.setTrans(0.0,1.0f,0.0f);

...

glPushMatrix();

// Push on offset

glMultMatrixf(box_offset.getFloatPtr());

...

drawCube();

glPopMatrix();

...

}

simpleApp: simpleApp: draw()draw()

• Create an offset Create an offset matrixmatrix

• Draw cubeDraw cube

Page 31: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Sample Application 2:Sample Application 2:OpenGL Application with Context-OpenGL Application with Context-

Specific DataSpecific Data

contextAppcontextApp

Page 32: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Context-Specific DataContext-Specific Data

What is a Context?What is a Context?• OpenGL Window OpenGL Window Context for OGL state Context for OGL state

machinemachine

What is context-specific data?What is context-specific data?• Display lists, texture objects, etc.Display lists, texture objects, etc.

Why do you need it?Why do you need it?• VR Juggler uses a single memory pool for all VR Juggler uses a single memory pool for all

threadsthreads– All threads have access to the same variablesAll threads have access to the same variables

• Ex: Multi-wall systemEx: Multi-wall system

Page 33: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Context-Specific DataContext-Specific Data

How does it workHow does it work• Template-based “smart pointer” classTemplate-based “smart pointer” class• Dereference like normal pointerDereference like normal pointer

– ie. operator*(), operator->()ie. operator*(), operator->()

vjGlContextData<GLuint> myDispList;vjGlContextData<GLuint> myDispList;……(* myDispList) = glGenList(1);(* myDispList) = glGenList(1);……glCallList(*myDispList);glCallList(*myDispList);

Page 34: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Class contextApp: public vjGlApp

{

public:

contextApp();

virtual void init();

virtual void contextInit();

virtual void draw();

public:

// Identifier for the cube display list

vjGlContextData<Gluint> mCubeDlId;

};

Context App: Data MembersContext App: Data Members

• Context-specific Context-specific data for a display data for a display list that draws a list that draws a cubecube

Page 35: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Context App: Context App: contextInit()contextInit()

• Create display listCreate display list• Context-specific Context-specific

version is usedversion is used

void simpleApp::contextInit()

{

// Allocate context specific data

(*mCubeDlId) = glGenLists(1);

glNewList((*mCubeDlId), GL_COMPILE);

glScalef(0.50f, 0.50f, 0.50f);

drawCube();

glEndList();

...

}

Page 36: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

Context App: Context App: draw()draw()

• Render display listRender display list• De-reference De-reference

context-specific context-specific display list IDdisplay list ID

void simpleApp::draw()

{

// Get Wand matrix

vjMatrix wand_matrix;

wand_mat = *(mWand->getData());

...

glPushMatrix();

glPushMatrix();

glMultMatrixf(wand_mat.getFloatPtr());

glCallList(*mCubeDlId);

glPopMatrix();

...

glPopMatrix();

}

Page 37: VR Juggler 1.0 Application Programming Patrick Hartling Virtual Reality Applications Center IEEE VR 2002

VR Juggler — www.vrjuggler.org

ConclusionConclusion

Questions?Questions?


Top Related