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
1.2.14 written by Dimitri van Heesch,
© 1997-2002