home *** CD-ROM | disk | FTP | other *** search
- // This may look like C code, but it is really -*- C++ -*-
- /*
- ************************************************************************
- *
- * Venus main module
- * that controls the whole flight
- *
- * It is this module that runs the event loop, dispatching orders from
- * the custom event queue. The module also implements a few orders (
- * creating, resizing and zooming the main window), some of them depositing
- * new orders into the queue. The module also installs AEHandlers to
- * relay the high-level events into our queue.
- *
- * $Id$
- *
- ************************************************************************
- */
-
- #include "ElevationMap.h"
- #include "EventHandlers.h"
- #include "FlightWindow.h"
- #include "myAEvents.h"
-
-
- // The simplest window to display an image view
- class DisplayMapView : public ScreenWindow
- {
- OffScreenBuffer& view_buffer;
- void draw(void) // It is this function that really draws smth
- { view_buffer.draw(q_bounds()); }
- public:
- DisplayMapView(OffScreenBuffer& pixel_buffer, const char * title)
- : ScreenWindow(pixel_buffer.q_bounds(),title),
- view_buffer(pixel_buffer) {}
- void init(void) { set_private_palette(view_buffer.q_clut()); show(); }
- };
-
-
-
-
- // Making elevation maps to fly through
-
- class MakeTestImage : public LazyImage // this one makes a couple of pyramids
- {
- void fill_in(IMAGE& im) const
- {
- const int ncols = im.q_ncols();
- for(register int j=-20; j<20; j++)
- for(register int i=-5; i<5; i++)
- im(64+i,j+ncols/2) = 128 - 5*abs(i+j),
- im(64+40+i,j+ncols/2) = 180 - 7*abs(i+j);
- }
- public:
- MakeTestImage(void) : LazyImage(256,256,8) {}
- };
-
- // So does the OpenDoc event. We process only
- // the first document of all of them dropped...
- class VenusOpenDoc : public AppleEventGenericHandler
- {
-
- OSErr operator() (void)
- {
- AEDescList desc_opened_doc; // Decsriptor of a list of open docs
- long no_opened_doc; // Number of documents to open
-
- get_direct_list(desc_opened_doc);
- assert( got_all_params() );
- do_well( AECountItems(&desc_opened_doc, &no_opened_doc) );
- assert( no_opened_doc == 1 );
- FSSpec& file_to_open = * new FSSpec;
-
- Size actual_size;
- AEKeyword keyword;
- DescType type_code;
-
- do_well( AEGetNthPtr(&desc_opened_doc, 1, typeFSS, &keyword, &type_code,
- (Ptr)&file_to_open, sizeof(file_to_open), &actual_size) );
- //assert( actual_size < alias_record_prealloc ); // Make sure we got the whole
- assert( actual_size == sizeof(file_to_open) ); // record
- do_well( AEDisposeDesc(&desc_opened_doc) );
-
- EventHandler::put_back_my_event(EventHandler::open_picture,
- (unsigned long)&file_to_open);
- return noErr;
- }
- public:
- VenusOpenDoc(void) : AppleEventGenericHandler(kAEOpenDocuments) {}
- };
-
-
-
- void main(void)
- {
- Initialize_MAC();
-
- GetDateTime((unsigned long *)&qd.randSeed);
- Random(); Random(); Random(); // Just randomizing
- srand(qd.randSeed);
-
- // Install AEEventHandlers
-
- // OpenApplication event is tacitly ignored....
- class Open_appl : AppleEventOpenAppl
- {
- OSErr operator() (void) { return noErr; }
- };
- Open_appl open_appl;
-
- // Quit event is relayed to our event queue
- struct Quit_appl : public AppleEventGenericHandler
- {
- OSErr operator() (void)
- { EventHandler::put_back_my_event(EventHandler::quit_requested);
- return noErr; }
- Quit_appl(void) : AppleEventGenericHandler(kAEQuitApplication) {}
- };
- Quit_appl quit_appl;
-
- VenusOpenDoc open_doc;
-
- #if 1
- ElevationMap elev_map(8);
- // ElevationMap elev_map = GaussClouds(8); // Get gaussian clouds and smooth them a bit
- // filter(elev_map).nondet_average(30);
- #else
- ElevationMap elev_map = MakeTestImage();
- #endif
-
- #if 0
- ImageView image_2d_view(elev_map);
- DisplayMapView map(image_2d_view,"Map");
- map.init();
- EventHandler event_handler(map,0);
- event_handler.loop();
- #else
-
- const int wind_id = 128;
- const int full_wind_id = 129;
-
- EventHandler::put_back_my_event(EventHandler::start_requested);
-
- for(;;)
- {
- EventRecord the_event;
- if( !EventHandler::wait_next_event(the_event,0) ||
- the_event.what != EventHandler::mykind )
- break;
- switch(the_event.modifiers)
- {
- case EventHandler::start_requested:
- {
- FlightWindow map(elev_map,wind_id);
- map.init();
- EventHandler(map,0).loop();
- } // make sure the map (Window) gets totally
- continue; // destroyed before proceeding!
-
- case EventHandler::resize_requested:
- {
- Handle wind_handle = GetResource('WIND',wind_id);
- assert( wind_handle != nil );
- Rect new_dim_rect;
- new_dim_rect.top = the_event.where.v;
- new_dim_rect.left = the_event.where.h;
- new_dim_rect.bottom = new_dim_rect.top + (the_event.message >> 16);
- new_dim_rect.right = new_dim_rect.left + (the_event.message & 0xffff);
- *((Rect *)(*wind_handle)) = new_dim_rect;
- const int title_size = ((char *)(*wind_handle))[18];
- // override auto-positioning in the WIND resource
- // Position the
- // window as told by new_dim_rect above!
- ((char *)(*wind_handle))[19+title_size] = 0;
- ((char *)(*wind_handle))[20+title_size] = 0;
- EventHandler::put_back_my_event(EventHandler::start_requested);
- }
- continue;
-
- case EventHandler::zoom_requested:
- {
- FullFlightWindow map(elev_map,full_wind_id);
- map.init();
- EventHandler(map,0).loop();
- }
- break;
-
- // Fly through a custom elevation map
- // The map is loaded from a file whose
- // (heap!) FSSpec pointer is given in this
- // event's message
- case EventHandler::open_picture:
- {
- FSSpec& file_to_open = *((FSSpec*)the_event.message);
- elev_map.load(file_to_open);
- delete &file_to_open;
- EventHandler::put_back_my_event(EventHandler::start_requested);
- }
- continue;
-
- default:
- break;
- }
- break;
-
- }
- #endif
- }
-