10b4c5624SAlexander von Gluck IV /* 20b4c5624SAlexander von Gluck IV * Copyright 2012, Haiku, Inc. 30b4c5624SAlexander von Gluck IV * Distributed under the terms of the MIT License. 40b4c5624SAlexander von Gluck IV * 50b4c5624SAlexander von Gluck IV * Authors: 60b4c5624SAlexander von Gluck IV * Aaron Hill <serac@hillvisions.com> 78bc51beeSAlexander von Gluck IV * Alexander von Gluck <kallisti5@unixzen.com> 80b4c5624SAlexander von Gluck IV */ 90b4c5624SAlexander von Gluck IV 100b4c5624SAlexander von Gluck IV 110b4c5624SAlexander von Gluck IV #include <stdio.h> 120b4c5624SAlexander von Gluck IV #include <stdlib.h> 130b4c5624SAlexander von Gluck IV #include <GLView.h> 140b4c5624SAlexander von Gluck IV #include <ScreenSaver.h> 150b4c5624SAlexander von Gluck IV #include <View.h> 160b4c5624SAlexander von Gluck IV 173c94b5cbSAlexander von Gluck IV #include "GLifeGrid.h" 183c94b5cbSAlexander von Gluck IV #include "GLifeState.h" 193c94b5cbSAlexander von Gluck IV #include "GLifeConfig.h" 203c94b5cbSAlexander von Gluck IV #include "GLifeView.h" 213c94b5cbSAlexander von Gluck IV #include "GLifeSaver.h" 220b4c5624SAlexander von Gluck IV 230b4c5624SAlexander von Gluck IV // ------------------------------------------------------ 240b4c5624SAlexander von Gluck IV // GLifeSaver Class Constructor Definition 250b4c5624SAlexander von Gluck IV GLifeSaver::GLifeSaver( BMessage* pbmPrefs, image_id iidImage ) 260b4c5624SAlexander von Gluck IV : BScreenSaver( pbmPrefs, iidImage ) 270b4c5624SAlexander von Gluck IV { 280b4c5624SAlexander von Gluck IV // Check for preferences 290b4c5624SAlexander von Gluck IV if ( !( pbmPrefs->IsEmpty() ) ) 300b4c5624SAlexander von Gluck IV RestoreState( pbmPrefs ); 310b4c5624SAlexander von Gluck IV 320b4c5624SAlexander von Gluck IV // Seed random number generator 330b4c5624SAlexander von Gluck IV srandom( system_time() ); 340b4c5624SAlexander von Gluck IV } 350b4c5624SAlexander von Gluck IV 360b4c5624SAlexander von Gluck IV // ------------------------------------------------------ 370b4c5624SAlexander von Gluck IV // GLifeSaver Class SaveState Definition 380b4c5624SAlexander von Gluck IV status_t GLifeSaver::SaveState( BMessage* pbmPrefs ) const 390b4c5624SAlexander von Gluck IV { 40*f6dff255SAlexander von Gluck IV return fGLifeState.SaveState( pbmPrefs ); 410b4c5624SAlexander von Gluck IV } 420b4c5624SAlexander von Gluck IV 430b4c5624SAlexander von Gluck IV // ------------------------------------------------------ 440b4c5624SAlexander von Gluck IV // GLifeSaver Class RestoreState Definition 450b4c5624SAlexander von Gluck IV void GLifeSaver::RestoreState( BMessage* pbmPrefs ) 460b4c5624SAlexander von Gluck IV { 47*f6dff255SAlexander von Gluck IV fGLifeState.RestoreState( pbmPrefs ); 480b4c5624SAlexander von Gluck IV } 490b4c5624SAlexander von Gluck IV 500b4c5624SAlexander von Gluck IV // ------------------------------------------------------ 510b4c5624SAlexander von Gluck IV // GLifeSaver Class StartConfig Definition 520b4c5624SAlexander von Gluck IV void GLifeSaver::StartConfig( BView* pbvView ) 530b4c5624SAlexander von Gluck IV { 540b4c5624SAlexander von Gluck IV // Setup the "config" class 550b4c5624SAlexander von Gluck IV GLifeConfig* pglcConfig = new GLifeConfig( pbvView->Bounds(), 56*f6dff255SAlexander von Gluck IV &fGLifeState ); 57*f6dff255SAlexander von Gluck IV 580b4c5624SAlexander von Gluck IV pbvView->AddChild( pglcConfig ); 590b4c5624SAlexander von Gluck IV } 600b4c5624SAlexander von Gluck IV 610b4c5624SAlexander von Gluck IV // ------------------------------------------------------ 620b4c5624SAlexander von Gluck IV // GLifeSaver Class StartSaver Definition 630b4c5624SAlexander von Gluck IV status_t GLifeSaver::StartSaver( BView* pbvView, bool bPreview ) 640b4c5624SAlexander von Gluck IV { 650b4c5624SAlexander von Gluck IV if ( bPreview ) 660b4c5624SAlexander von Gluck IV { 670b4c5624SAlexander von Gluck IV // We do not use the preview option 68*f6dff255SAlexander von Gluck IV fGLifeViewport = 0; 690b4c5624SAlexander von Gluck IV return B_ERROR; 700b4c5624SAlexander von Gluck IV } 710b4c5624SAlexander von Gluck IV else 720b4c5624SAlexander von Gluck IV { 730b4c5624SAlexander von Gluck IV SetTickSize( c_iTickSize ); 740b4c5624SAlexander von Gluck IV 75*f6dff255SAlexander von Gluck IV fGLifeViewport = new GLifeView( pbvView->Bounds(), 760b4c5624SAlexander von Gluck IV "GLifeView", 770b4c5624SAlexander von Gluck IV B_FOLLOW_NONE, 780b4c5624SAlexander von Gluck IV BGL_RGB | BGL_DEPTH | BGL_DOUBLE, 79*f6dff255SAlexander von Gluck IV &fGLifeState ); 80*f6dff255SAlexander von Gluck IV pbvView->AddChild(fGLifeViewport); 810b4c5624SAlexander von Gluck IV 820b4c5624SAlexander von Gluck IV return B_OK; 830b4c5624SAlexander von Gluck IV } 840b4c5624SAlexander von Gluck IV } 850b4c5624SAlexander von Gluck IV 860b4c5624SAlexander von Gluck IV // ------------------------------------------------------ 870b4c5624SAlexander von Gluck IV // GLifeSaver Class StopSaver Definition 880b4c5624SAlexander von Gluck IV void GLifeSaver::StopSaver( void ) 890b4c5624SAlexander von Gluck IV { 90*f6dff255SAlexander von Gluck IV if (fGLifeViewport != NULL) 91*f6dff255SAlexander von Gluck IV gGLifeViewport->EnableDirectMode( false ); 920b4c5624SAlexander von Gluck IV } 930b4c5624SAlexander von Gluck IV 940b4c5624SAlexander von Gluck IV // ------------------------------------------------------ 950b4c5624SAlexander von Gluck IV // GLifeSaver Class DirectConnected Definition 960b4c5624SAlexander von Gluck IV void GLifeSaver::DirectConnected( direct_buffer_info* pdbiInfo ) 970b4c5624SAlexander von Gluck IV { 98cfe5c09aSAlexander von Gluck IV // Enable or disable direct rendering 99cfe5c09aSAlexander von Gluck IV #if 1 100*f6dff255SAlexander von Gluck IV if (fGLifeViewport != NULL) { 101*f6dff255SAlexander von Gluck IV fGLifeViewport->DirectConnected( pdbiInfo ); 102*f6dff255SAlexander von Gluck IV fGLifeViewport->EnableDirectMode( true ); 1030b4c5624SAlexander von Gluck IV } 104cfe5c09aSAlexander von Gluck IV #endif 105cfe5c09aSAlexander von Gluck IV } 1060b4c5624SAlexander von Gluck IV 1070b4c5624SAlexander von Gluck IV // ------------------------------------------------------ 1080b4c5624SAlexander von Gluck IV // GLifeSaver Class DirectDraw Definition 1090b4c5624SAlexander von Gluck IV void GLifeSaver::DirectDraw( int32 iFrame ) 1100b4c5624SAlexander von Gluck IV { 111*f6dff255SAlexander von Gluck IV fGLifeViewport->Advance(); 1120b4c5624SAlexander von Gluck IV } 1130b4c5624SAlexander von Gluck IV 1140b4c5624SAlexander von Gluck IV // ------------------------------------------------------ 1150b4c5624SAlexander von Gluck IV // Main Instantiation Function 1160b4c5624SAlexander von Gluck IV extern "C" _EXPORT BScreenSaver* 1170b4c5624SAlexander von Gluck IV instantiate_screen_saver( BMessage* pbmPrefs, image_id iidImage ) 1180b4c5624SAlexander von Gluck IV { 1190b4c5624SAlexander von Gluck IV return new GLifeSaver( pbmPrefs, iidImage ); 1200b4c5624SAlexander von Gluck IV } 121