C.1 CAT Application Programmers Interface /////////////////////////////////////////////////////////////////////////// #include <stdio.h> #include <unistd.h> #include <iostream.h> #include <cave_ogl.h> #include "cat_track.h" #include "cat_prompt.h" void *CAT_malloc( size_t sz ); /* calls CAVEMalloc with err-msg */ /* environment variables */ /* CAT_DATA_PATH = "./data" */ char *CAT_data_env( char *sub_path = 0 ); /* CAT_AUDIO_PATH = "/usr/CAVE/audio" */ char *CAT_audio_env( char *sub_path = 0 ); /* is vss listening? set only in loop */ extern int VSS_aud_connected; /* use any of these to set the current horizontal boundary size. * subsequently created apps inherit the values */ void CAT_set_corners( float x1, float z1, float x2, float z2 ); void CAT_set_boundary( float px, float pz, float dx, float dz ); void CAT_set_placement( float px, float pz ); void CAT_set_dimension( float dx, float dz ); #define APP_SUBJECT 0 /* does not clear screen */ #define APP_MASTER 1 /* specify a clearing domain */ #define APP_TYP_OBJECT 0 /* no APP_CTL_CONT service */ #define APP_TYP_STANDARD 1 /* full frame-update service */ #define APP_CTL_NULL 0 /* possible ppr and ffn flag values */ #define APP_CTL_INIT 1 #define APP_CTL_BGN 2 #define APP_CTL_CONT 3 #define APP_CTL_END 4 #define APP_CTL_EXIT 5 void CAT_create_app( void (*ppr)(int,void*) = NULL, void (*ffn)(int,void*) = NULL, void (*dsp)(void*) = NULL, long status = APP_SUBJECT, long type = APP_TYP_STANDARD, void *data = NULL ); void CAT_loop(int, char**); /* arguments passed to CAVEInit */ /* command-line input structure */ extern command_t CAT_command; /* for drawing in cave space */ extern GLfloat CAT_non_CAVENav_matrix[16]; /* animation clock time */ extern float CAT_time, CAT_dt; /* actual event time */ extern float REAL_time, REAL_dt, REAL_dt_smooth; /* PPR only: CAVE display clipping planes */ void CAT_set_clipping( float near, float far ); /* PPR only: set app callback data arg */ void CAT_set_app_data( void * data ); /* navigation data is always in global coordinates. * a replacement routine need only load the CAVE matrix. * this will result in updating CAT_nav_data. */ void CAT_nav_replace( void (*nav)(void) ); void CAT_nav_restore( void ); extern navigator_t CAT_nav_data; /* current global navigation data */ navigator_t CAT_dfl_navigate ( void ); /* generate default nav input */ #define APP_RADIUS_3D_SQRT 0 #define APP_RADIUS_2D_SQRT 1 #define APP_RADIUS_3D_FAST 2 #define APP_RADIUS_2D_FAST 3 /* hypotenuse of app-origin to head, for culling */ float CAT_get_radius(int flag = APP_RADIUS_3D_SQRT); /* rendering hint: 0.0 -> 1.0 */ float CAT_get_lod( float target_fps = 0.0 ); /* trackers are distinct from navigation data because they are * in app-local coordinates. */ tracker_t CAT_get_cave(void); tracker_t CAT_get_head(void); tracker_t CAT_get_wand(void); int CAT_get_button(int index); float CAT_get_valuator(int index); #define CATBUTTON1 CAT_get_button(1) #define CATBUTTON2 CAT_get_button(2) #define CATBUTTON3 CAT_get_button(3) #define CAT_JOYSTICK_X CAT_get_valuator(0) #define CAT_JOYSTICK_Y CAT_get_valuator(1) /* joystick sensitivity utilities */ float CAT_joy_deadzone( float in, float zone = 0.1 ); float CAT_joy_curve( float in, float power ); int CAT_master_ppr(void); /* TRUE for 1 ppr per cave */ int CAT_master_ffn(void); /* TRUE for 1 ffn per node */ int CAT_master_dsp(void); /* TRUE for 1 view per node */ int CAT_master_view(void); /* TRUE for 1 view per pipe all nodes */ #define APP_FEED_STOP 0 /* hint: pause in time : CAT_dt == 0.0 */ #define APP_FEED_IDLE 1 /* hint: free running */ #define APP_FEED_RECORD 2 /* hint: preserve live data */ #define APP_FEED_REPLAY 3 /* hint: extract recorded data */ /* if you want to record something, this helps */ extern int CAT_feed_mode; #define APP_DSP_NULL 0 #define APP_DSP_NORMAL 1 /* hint: regular cavewall display */ #define APP_DSP_VIDEO 2 /* hint: low detail for live video image */ #define APP_DSP_PHOTO 3 /* hint: high quality for still frame rendering */ extern int CAT_dsp_mode; /* world display functions: without navigation transform */ void CAT_dsp_execute(void); void CAT_dsp_video_execute(void); void CAT_dsp_photo_execute(void); #define APP_DFL_LIGHT_UBIND 0 /* un-bind lighting */ #define APP_DFL_LIGHT_BIND 1 /* bind default lights */ #define APP_DFL_LIGHT_REBIND 2 /* re-bind lighting */ #define APP_DFL_LIGHT_DEFINE 3 /* refresh default settings for BGN */ void CAT_dfl_light( int flag ); /* calls clear(): */ void CAT_dfl_fog( ulong col, float visibility, int do_clear = 1 ); void CAT_dfl_sky( ulong col ); void CAT_dfl_ground( ulong col ); void CAT_set_linewidth(int lw); /* relative to image size */ void CAT_net_set_dsp( void (*net_dsp)(void) ); void CAT_start_screen( void (*dsp)(void) ); /* Virtual Director command function */ void CAT_command_director( char *tok, char *v1=0, char *v2=0 ); ///////////////////////////////////////////////////////////////////////////
C.2 Point Cloud Format #include "ogl_cloud.h" typedef struct { float x, y, z, option4; } point; non-default-path/somedata.bin [ dimensions: <32bits> 2 (number of dimensions to follow) length: <32bits> i (number of data frames) size: <32bits> j (number of points per frame) point data: <sizeof(point)*len*size> (raw binary data array) ] non-default-path/someconfig.cf [ # binarydata : non-default-path/<prefix>.bin binarydata somedata # rgbtexture : non-default-path/<prefix>.rgb rgbtexture gauss_64 # format : absolute|relative format absolute # range : first and last desired data frames (begin at 1) range 1 730 # rate : data frames per second rate 24.0 # option4 : ignore r g b a R # option4 : funpack R # option4 : radius r g b a # option4 : interpolate r g b a to r g b a and R # option4 : interpolateR r g b a R to r g b a R option4 funpack 0.002 # oldstylecolor : y|n ( funpack : irisGL uses ABGR ) oldstylecolor y # object : triangle|square|texture|pyramid object triangle ]
C.3 Wavefront Modelling API by Dave Pape wfObject *wfReadObject(char *fname); void wfInitObject(wfObject *obj); void wfDrawObject(wfObject *obj); void wfWriteObject(FILE *fp,wfObject *obj); void wfGetBoundingSphere(wfObject *obj,wfVertex center,float *radius); void wfGetBoundingBox(wfObject *obj,wfVertex corner0,wfVertex corner1); void wfSetMemoryAllocator(void * (*allocfn)(size_t),void (*freefn)(void *)); void wfSetNewIDFunction(int (*idfn)(void)); int wfNewID(void); void wfEnable(int); void wfDisable(int); int wfIsEnabled(int); void wfTranslateObject(wfObject *obj,float tx,float ty,float tz); void wfScaleObject(wfObject *obj,float sx,float sy,float sz); void wfRotateObject(wfObject *obj,float angle,float x,float y,float z); void wfDeformObject(wfObject *obj,void (*vF)(float *),void (*nF)(float *)); wfObject * wfCopyObjectGeometry(wfObject *obj); void wfComputeNormals(wfObject *obj,int smooth,int clockwise); wfFace *wfRayIntersection(wfObject *obj,float *ray0,float *delta,float *ret_t); int wfRayHits(wfObject *obj,float *ray0,float *raydelta);
C.4 Example Application #include <cat_ogl.h> extern void calculate(); extern void *swap(); extern void transform( void *vp ); extern void draw(); /* parent process routines */ void my_nav( void ) { /* assign CAVENav matrix */ } void my_ppr( int flag, void* ) { if( flag == APP_CTL_BGN ) CAT_nav_replace( my_nav ); calculate(); void *vp = swap(); CAT_set_app_data( vp ); } /* child process routines */ void my_ffn( int, void* ) { /* optional */ } void my_dsp( void *vp ) { glPushMatrix(); transform( vp ); draw(); glPopMatrix(); } main() { CAT_create_app( my_ppr, my_ffn, my_dsp ); CAT_command_director( "please" ); CAT_loop(); }