#include "GLifeSaver.h"
#include <GLView.h>
#include <ScreenSaver.h>
#include <stdio.h>
#include <stdlib.h>
#include <View.h>
#include "GLifeGrid.h"
#include "GLifeState.h"
#include "GLifeConfig.h"
#include "GLifeView.h"
GLifeSaver::GLifeSaver(BMessage* pbmPrefs, image_id iidImage)
:
BScreenSaver(pbmPrefs, iidImage)
{
if (!pbmPrefs->IsEmpty())
RestoreState(pbmPrefs);
srandom(system_time());
}
status_t
GLifeSaver::SaveState(BMessage* pbmPrefs) const
{
return fGLifeState.SaveState(pbmPrefs);
}
void
GLifeSaver::RestoreState(BMessage* pbmPrefs)
{
fGLifeState.RestoreState(pbmPrefs);
}
void
GLifeSaver::StartConfig(BView* pbvView)
{
GLifeConfig* pglcConfig = new GLifeConfig(pbvView->Bounds(),
&fGLifeState);
pbvView->AddChild(pglcConfig);
}
status_t
GLifeSaver::StartSaver(BView* pbvView, bool bPreview)
{
SetTickSize(c_iTickSize);
fGLifeViewport = new GLifeView(pbvView->Bounds(),
"GLifeView", B_FOLLOW_NONE, BGL_RGB | BGL_DEPTH | BGL_DOUBLE,
&fGLifeState);
pbvView->AddChild(fGLifeViewport);
return B_OK;
}
void
GLifeSaver::StopSaver(void)
{
if (fGLifeViewport != NULL)
fGLifeViewport->EnableDirectMode(false);
}
void
GLifeSaver::DirectConnected(direct_buffer_info* pdbiInfo)
{
if (fGLifeViewport != NULL) {
fGLifeViewport->DirectConnected(pdbiInfo);
fGLifeViewport->EnableDirectMode(true);
}
}
void
GLifeSaver::Draw(BView*, int32 iFrame)
{
fGLifeViewport->Advance();
}
extern "C" _EXPORT BScreenSaver*
instantiate_screen_saver(BMessage* pbmPrefs, image_id iidImage)
{
return new GLifeSaver(pbmPrefs, iidImage);
}