xref: /haiku/src/add-ons/screen_savers/glife/GLifeSaver.cpp (revision 3c94b5cb05058d92687da398daedfe91634e1b34)
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>
70b4c5624SAlexander von Gluck IV  */
80b4c5624SAlexander von Gluck IV 
90b4c5624SAlexander von Gluck IV 
100b4c5624SAlexander von Gluck IV #include <stdio.h>
110b4c5624SAlexander von Gluck IV #include <stdlib.h>
120b4c5624SAlexander von Gluck IV #include <GLView.h>
130b4c5624SAlexander von Gluck IV #include <ScreenSaver.h>
140b4c5624SAlexander von Gluck IV #include <View.h>
150b4c5624SAlexander von Gluck IV 
16*3c94b5cbSAlexander von Gluck IV #include "GLifeGrid.h"
17*3c94b5cbSAlexander von Gluck IV #include "GLifeState.h"
18*3c94b5cbSAlexander von Gluck IV #include "GLifeConfig.h"
19*3c94b5cbSAlexander von Gluck IV #include "GLifeView.h"
20*3c94b5cbSAlexander von Gluck IV #include "GLifeSaver.h"
210b4c5624SAlexander von Gluck IV 
220b4c5624SAlexander von Gluck IV // ------------------------------------------------------
230b4c5624SAlexander von Gluck IV //  GLifeSaver Class Constructor Definition
240b4c5624SAlexander von Gluck IV GLifeSaver::GLifeSaver( BMessage* pbmPrefs, image_id iidImage )
250b4c5624SAlexander von Gluck IV 	:	BScreenSaver( pbmPrefs, iidImage )
260b4c5624SAlexander von Gluck IV {
270b4c5624SAlexander von Gluck IV 	// Check for preferences
280b4c5624SAlexander von Gluck IV 	if ( !( pbmPrefs->IsEmpty() ) )
290b4c5624SAlexander von Gluck IV 		RestoreState( pbmPrefs );
300b4c5624SAlexander von Gluck IV 
310b4c5624SAlexander von Gluck IV 	// Seed random number generator
320b4c5624SAlexander von Gluck IV 	srandom( system_time() );
330b4c5624SAlexander von Gluck IV }
340b4c5624SAlexander von Gluck IV 
350b4c5624SAlexander von Gluck IV // ------------------------------------------------------
360b4c5624SAlexander von Gluck IV //  GLifeSaver Class SaveState Definition
370b4c5624SAlexander von Gluck IV status_t GLifeSaver::SaveState( BMessage* pbmPrefs ) const
380b4c5624SAlexander von Gluck IV {
390b4c5624SAlexander von Gluck IV 	return m_glsState.SaveState( pbmPrefs );
400b4c5624SAlexander von Gluck IV }
410b4c5624SAlexander von Gluck IV 
420b4c5624SAlexander von Gluck IV // ------------------------------------------------------
430b4c5624SAlexander von Gluck IV //  GLifeSaver Class RestoreState Definition
440b4c5624SAlexander von Gluck IV void GLifeSaver::RestoreState( BMessage* pbmPrefs )
450b4c5624SAlexander von Gluck IV {
460b4c5624SAlexander von Gluck IV 	m_glsState.RestoreState( pbmPrefs );
470b4c5624SAlexander von Gluck IV }
480b4c5624SAlexander von Gluck IV 
490b4c5624SAlexander von Gluck IV // ------------------------------------------------------
500b4c5624SAlexander von Gluck IV //  GLifeSaver Class StartConfig Definition
510b4c5624SAlexander von Gluck IV void GLifeSaver::StartConfig( BView* pbvView )
520b4c5624SAlexander von Gluck IV {
530b4c5624SAlexander von Gluck IV 	// Setup the "config" class
540b4c5624SAlexander von Gluck IV 	GLifeConfig* pglcConfig = new GLifeConfig( pbvView->Bounds(),
550b4c5624SAlexander von Gluck IV 											   &m_glsState );
560b4c5624SAlexander von Gluck IV 	pbvView->AddChild( pglcConfig );
570b4c5624SAlexander von Gluck IV }
580b4c5624SAlexander von Gluck IV 
590b4c5624SAlexander von Gluck IV // ------------------------------------------------------
600b4c5624SAlexander von Gluck IV //  GLifeSaver Class StartSaver Definition
610b4c5624SAlexander von Gluck IV status_t GLifeSaver::StartSaver( BView* pbvView, bool bPreview )
620b4c5624SAlexander von Gluck IV {
630b4c5624SAlexander von Gluck IV 	if ( bPreview )
640b4c5624SAlexander von Gluck IV 	{
650b4c5624SAlexander von Gluck IV 		// We do not use the preview option
660b4c5624SAlexander von Gluck IV 		m_pglvViewport = 0;
670b4c5624SAlexander von Gluck IV 		return B_ERROR;
680b4c5624SAlexander von Gluck IV 	}
690b4c5624SAlexander von Gluck IV 	else
700b4c5624SAlexander von Gluck IV 	{
710b4c5624SAlexander von Gluck IV 		SetTickSize( c_iTickSize );
720b4c5624SAlexander von Gluck IV 
730b4c5624SAlexander von Gluck IV 		m_pglvViewport = new GLifeView( pbvView->Bounds(),
740b4c5624SAlexander von Gluck IV 										"GLifeView",
750b4c5624SAlexander von Gluck IV 										B_FOLLOW_NONE,
760b4c5624SAlexander von Gluck IV 										BGL_RGB | BGL_DEPTH | BGL_DOUBLE,
770b4c5624SAlexander von Gluck IV 										&m_glsState );
780b4c5624SAlexander von Gluck IV 		pbvView->AddChild( m_pglvViewport );
790b4c5624SAlexander von Gluck IV 
800b4c5624SAlexander von Gluck IV 		return B_OK;
810b4c5624SAlexander von Gluck IV 	}
820b4c5624SAlexander von Gluck IV }
830b4c5624SAlexander von Gluck IV 
840b4c5624SAlexander von Gluck IV // ------------------------------------------------------
850b4c5624SAlexander von Gluck IV //  GLifeSaver Class StopSaver Definition
860b4c5624SAlexander von Gluck IV void GLifeSaver::StopSaver( void )
870b4c5624SAlexander von Gluck IV {
880b4c5624SAlexander von Gluck IV 	if ( m_pglvViewport )
890b4c5624SAlexander von Gluck IV 		m_pglvViewport->EnableDirectMode( false );
900b4c5624SAlexander von Gluck IV }
910b4c5624SAlexander von Gluck IV 
920b4c5624SAlexander von Gluck IV // ------------------------------------------------------
930b4c5624SAlexander von Gluck IV //  GLifeSaver Class DirectConnected Definition
940b4c5624SAlexander von Gluck IV void GLifeSaver::DirectConnected( direct_buffer_info* pdbiInfo )
950b4c5624SAlexander von Gluck IV {
960b4c5624SAlexander von Gluck IV 	m_pglvViewport->DirectConnected( pdbiInfo );
970b4c5624SAlexander von Gluck IV 	m_pglvViewport->EnableDirectMode( true );
980b4c5624SAlexander von Gluck IV }
990b4c5624SAlexander von Gluck IV 
1000b4c5624SAlexander von Gluck IV // ------------------------------------------------------
1010b4c5624SAlexander von Gluck IV //  GLifeSaver Class DirectDraw Definition
1020b4c5624SAlexander von Gluck IV void GLifeSaver::DirectDraw( int32 iFrame )
1030b4c5624SAlexander von Gluck IV {
1040b4c5624SAlexander von Gluck IV 	m_pglvViewport->Advance();
1050b4c5624SAlexander von Gluck IV }
1060b4c5624SAlexander von Gluck IV 
1070b4c5624SAlexander von Gluck IV // ------------------------------------------------------
1080b4c5624SAlexander von Gluck IV //  Main Instantiation Function
1090b4c5624SAlexander von Gluck IV extern "C" _EXPORT BScreenSaver*
1100b4c5624SAlexander von Gluck IV instantiate_screen_saver( BMessage* pbmPrefs, image_id iidImage )
1110b4c5624SAlexander von Gluck IV {
1120b4c5624SAlexander von Gluck IV 	return new GLifeSaver( pbmPrefs, iidImage );
1130b4c5624SAlexander von Gluck IV }
114