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

CaveScene.C

Go to the documentation of this file.
00001 /***************************************************************************
00002  *cr                                                                       
00003  *cr            (C) Copyright 1995-2008 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: CaveScene.C,v $
00013  *      $Author: johns $        $Locker:  $             $State: Exp $
00014  *      $Revision: 1.48 $       $Date: 2008/03/27 19:36:35 $
00015  *
00016  ***************************************************************************
00017  * DESCRIPTION:
00018  *   The CAVE 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 <cave_ogl.h>
00026 
00027 #include "CaveScene.h"
00028 #include "CaveRoutines.h"
00029 #include "DisplayDevice.h"
00030 #include "Inform.h"
00031 #include "utilities.h"
00032 #include "VMDApp.h" // for VMDexit();
00033 
00034 #define CAVEUSERWLOCK 1
00035 
00037 CaveScene::CaveScene(VMDApp *vmdapp) : app(vmdapp) {
00038 #if defined(CAVEUSERWLOCK)
00039   msgInfo << "Creating R/W lock for shared mem access sync.\n" << sendmsg;
00040   draw_rwlock = CAVENewLock();   // allocate a new CAVE lock
00041   CAVESetWriteLock(draw_rwlock); // start out locked for writing
00042 #else 
00043   msgInfo << "Creating draw barrier for " <<  CAVEConfig->ActiveWalls
00044           << " active CAVE walls and master process.\n" << sendmsg; 
00045 
00046   // setup the drawing barrier used to control slave rendering processes
00047   draw_barrier =(vmd_barrier_t *) malloc_from_CAVE_memory(sizeof(vmd_barrier_t));
00048   if (draw_barrier == NULL) {
00049     msgErr << "CANNOT ALLOCATE SHARED MEMORY FOR CaveScene CLASS !!!"
00050            << sendmsg;
00051   }
00052   memset(draw_barrier, 0, sizeof(vmd_barrier_t));
00053 
00054   if (getenv("VMDCAVEDRAWPROCS") != NULL) {
00055     vmd_thread_barrier_init(draw_barrier, atoi(getenv("VMDCAVEDRAWPROCS")) + 1);
00056   } else {
00057     vmd_thread_barrier_init(draw_barrier, CAVEConfig->ActiveWalls + 1);
00058   }
00059 #endif 
00060 }
00061 
00063 CaveScene::~CaveScene(void) {
00064 #if defined(CAVEUSERWLOCK)
00065   CAVEFreeLock(draw_rwlock); // delete the drawing rwlock
00066 #else
00067   // free things allocated from shared memory
00068   free_to_CAVE_memory(draw_barrier);
00069 #endif
00070 
00071 }
00072 
00073 // Called by CAVElib, on each of the child rendering processes
00074 void CaveScene::draw(DisplayDevice *display) {
00075 #if defined(CAVEUSERWLOCK)
00076   if (display->is_renderer_process()) {
00077     CAVESetReadLock(draw_rwlock);
00078     Scene::draw(display);                // draw the scene
00079     CAVEUnsetReadLock(draw_rwlock);
00080   } else {
00081     CAVEUnsetWriteLock(draw_rwlock);
00082     vmd_msleep(1); // give 'em 1 millisecond to draw before re-locking 
00083     CAVESetWriteLock(draw_rwlock);
00084   }
00085 #else
00086   // Barrier synchronization for all drawing processes and the master
00087   vmd_thread_barrier(draw_barrier, 0); // wait for start of drawing 
00088   Scene::draw(display);                // draw the scene
00089   vmd_thread_barrier(draw_barrier, 0); // wait for end of drawing.
00090 #endif
00091 }
00092 
00093 // called in VMDupdate, this updates the values of numDisplayable[23]D
00094 // this is called by the parent!
00095 int CaveScene::prepare() {
00096   // check if the ESC key is being pressed; if so, quit
00097   // note: THIS IS A HACK, just for Bill Sherman ;-)
00098   if(CAVEgetbutton(CAVE_ESCKEY)) {
00099     CAVEExit();
00100     app->VMDexit("Exiting due to Cave escape key being pressed.", 10, 4);
00101   }
00102 
00103   return Scene::prepare(); // call regular scene prepare method
00104 }
00105 
00106 void *CaveScene::operator new(size_t s) {
00107   return malloc_from_CAVE_memory(s);
00108 }
00109 
00110 void CaveScene::operator delete(void *p, size_t) {
00111   free_to_CAVE_memory(p);
00112 }
00113 

Generated on Sun Jul 6 01:27:20 2008 for VMD (current) by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002