1/*
2 * Copyright 2012, Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * 		Aaron Hill <serac@hillvisions.com>
7 *		Alexander von Gluck <kallisti5@unixzen.com>
8 */
9
10
11#include "GLifeSaver.h"
12
13#include <GLView.h>
14#include <ScreenSaver.h>
15#include <stdio.h>
16#include <stdlib.h>
17#include <View.h>
18
19#include "GLifeGrid.h"
20#include "GLifeState.h"
21#include "GLifeConfig.h"
22#include "GLifeView.h"
23
24
25// ------------------------------------------------------
26//  GLifeSaver Class Constructor Definition
27GLifeSaver::GLifeSaver(BMessage* pbmPrefs, image_id iidImage)
28	:
29	BScreenSaver(pbmPrefs, iidImage)
30{
31	// Check for preferences
32	if (!pbmPrefs->IsEmpty())
33		RestoreState(pbmPrefs);
34
35	// Seed random number generator
36	srandom(system_time());
37}
38
39
40// ------------------------------------------------------
41//  GLifeSaver Class SaveState Definition
42status_t
43GLifeSaver::SaveState(BMessage* pbmPrefs) const
44{
45	return fGLifeState.SaveState(pbmPrefs);
46}
47
48
49// ------------------------------------------------------
50//  GLifeSaver Class RestoreState Definition
51void
52GLifeSaver::RestoreState(BMessage* pbmPrefs)
53{
54	fGLifeState.RestoreState(pbmPrefs);
55}
56
57
58// ------------------------------------------------------
59//  GLifeSaver Class StartConfig Definition
60void
61GLifeSaver::StartConfig(BView* pbvView)
62{
63	// Setup the "config" class
64	GLifeConfig* pglcConfig = new GLifeConfig(pbvView->Bounds(),
65		&fGLifeState);
66
67	pbvView->AddChild(pglcConfig);
68}
69
70
71// ------------------------------------------------------
72//  GLifeSaver Class StartSaver Definition
73status_t
74GLifeSaver::StartSaver(BView* pbvView, bool bPreview)
75{
76	SetTickSize(c_iTickSize);
77
78	fGLifeViewport = new GLifeView(pbvView->Bounds(),
79		"GLifeView", B_FOLLOW_NONE, BGL_RGB | BGL_DEPTH | BGL_DOUBLE,
80		&fGLifeState);
81
82	pbvView->AddChild(fGLifeViewport);
83
84	return B_OK;
85}
86
87
88// ------------------------------------------------------
89//  GLifeSaver Class StopSaver Definition
90void
91GLifeSaver::StopSaver(void)
92{
93	if (fGLifeViewport != NULL)
94		fGLifeViewport->EnableDirectMode(false);
95}
96
97
98// ------------------------------------------------------
99//  GLifeSaver Class DirectConnected Definition
100void
101GLifeSaver::DirectConnected(direct_buffer_info* pdbiInfo)
102{
103	// Enable or disable direct rendering
104	if (fGLifeViewport != NULL) {
105		fGLifeViewport->DirectConnected(pdbiInfo);
106		fGLifeViewport->EnableDirectMode(true);
107	}
108}
109
110
111// ------------------------------------------------------
112//  GLifeSaver Class DirectDraw Definition
113void
114GLifeSaver::Draw(BView*, int32 iFrame)
115{
116	fGLifeViewport->Advance();
117}
118
119
120// ------------------------------------------------------
121//  Main Instantiation Function
122extern "C" _EXPORT BScreenSaver*
123instantiate_screen_saver(BMessage* pbmPrefs, image_id iidImage)
124{
125	return new GLifeSaver(pbmPrefs, iidImage);
126}
127