Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

FreeVRScene.C

Go to the documentation of this file.
00001 /***************************************************************************
00002  *cr                                                                       
00003  *cr            (C) Copyright 1995-2011 The Board of Trustees of the           
00004  *cr                        University of Illinois                       
00005  *cr                         All Rights Reserved                        
00006  *cr                                                                   
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  * RCS INFORMATION:
00011  *
00012  *      $RCSfile: FreeVRScene.C,v $
00013  *      $Author: johns $        $Locker:  $             $State: Exp $
00014  *      $Revision: 1.38 $       $Date: 2010/12/16 04:08:16 $
00015  *
00016  ***************************************************************************
00017  * DESCRIPTION:
00018  *   The FreeVR specific Scene.  It has to get information from the
00019  * shared memory arena, since the display lists are shared amoung
00020  * the different machines
00021  *
00022  ***************************************************************************/
00023 
00024 #include <stdlib.h>
00025 #include <freevr.h>
00026 
00027 #include "FreeVRScene.h"
00028 #include "FreeVRRoutines.h"
00029 #include "DisplayDevice.h"
00030 #include "Inform.h"
00031 #include "utilities.h"
00032 #include "VMDApp.h" // for VMDexit()
00033 
00034 #define FREEVRUSERWLOCK 1
00035 
00037 FreeVRScene::FreeVRScene(VMDApp *vmdapp) : app(vmdapp) {
00038 #if defined(FREEVRUSERWLOCK)
00039   msgInfo << "Creating R/W lock for shared mem access sync.\n" << sendmsg;
00040 //  draw_rwlock = vrLockCreate(vmdapp->freevrcontext); // allocate an RW Lock
00041   draw_rwlock = vrLockCreate();    // allocate an RW Lock
00042   vrLockWriteSet(draw_rwlock);     // start out locked for writing
00043 #else
00044   msgInfo << "Creating draw barrier for " << vrContext->config->num_windows 
00045           << " active FreeVR walls and master process.\n" << sendmsg;
00046 
00047   // setup the drawing barrier used to control slave rendering processes
00048   draw_barrier =(vmd_barrier_t *) malloc_from_FreeVR_memory(sizeof(vmd_barrier_t));
00049   if (draw_barrier == NULL) {
00050     msgErr << "CANNOT ALLOCATE SHARED MEMORY FOR FreeVRScene CLASS !!!"
00051            << sendmsg;
00052   }
00053   memset(draw_barrier, 0, sizeof(vmd_barrier_t));
00054 
00055   if (getenv("VMDFREEVRDRAWPROCS") != NULL) {
00056     vmd_thread_barrier_init_proc_shared(draw_barrier, atoi(getenv("VMDFREEVRDRAWPROCS")) + 1);
00057   } else {
00058     vmd_thread_barrier_init_proc_shared(draw_barrier, vrContext->config->num_windows + 1);
00059   }
00060 #endif
00061 }
00062 
00064 FreeVRScene::~FreeVRScene(void) {
00065 #if defined(FREEVRUSERWLOCK)
00066   // XXX somehow we need to get the rendering slaves to 
00067   //     exit cleanly rather than getting stuck in mid-draw
00068   //     attempting to do various stuff when the world goes away. 
00069   vrLockFree(draw_rwlock); // delete the drawing rwlock
00070 #else
00071   // free things allocated from shared memory
00072   free_to_FreeVR_memory(draw_barrier);
00073 #endif
00074 }
00075 
00076 // Called by FreeVR, on each of the child rendering processes
00077 void FreeVRScene::draw(DisplayDevice *display) {
00078 #if defined(FREEVRUSERWLOCK) 
00079   if (display->is_renderer_process()) {
00080     vrLockReadSet(draw_rwlock);
00081     Scene::draw(display);
00082     vrLockReadRelease(draw_rwlock);
00083   } else {
00084     vrLockWriteRelease(draw_rwlock);
00085     vmd_msleep(1); // give 'em 1 millisecond to draw before re-locking
00086     vrLockWriteSet(draw_rwlock); 
00087   }
00088 #else
00089   // Barrier synchronization for all drawing processes and the master
00090   vmd_thread_barrier(draw_barrier, 0); // wait for start of drawing
00091   Scene::draw(display);                // draw the scene
00092   vmd_thread_barrier(draw_barrier, 0); // wait for end of drawing.
00093 #endif
00094 }
00095 
00096 // this is called by the parent!
00097 int FreeVRScene::prepare() {
00098   // check if the ESC key is being pressed; if so, quit
00099   // note: THIS IS A HACK, just for Bill Sherman
00100   if(vrGet2switchValue(0)) {
00101     vrExit();
00102     app->VMDexit("Exiting due to FreeVR escape key being pressed", 10, 4);
00103   }
00104 
00105   return Scene::prepare(); // call regular scene prepare method
00106 }
00107 
00108 void *FreeVRScene::operator new(size_t s) {
00109   return malloc_from_FreeVR_memory(s);
00110 }
00111 
00112 void FreeVRScene::operator delete(void *p, size_t) {
00113   free_to_FreeVR_memory(p);
00114 }
00115 

Generated on Sat May 26 01:47:59 2012 for VMD (current) by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002