xref: /haiku/src/add-ons/screen_savers/glife/GLifeSaver.cpp (revision f6dff2557639555a70898624c937f319c6efcc9b)
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