xref: /haiku/src/add-ons/screen_savers/glife/GLifeView.cpp (revision a3cdc7c5889d45d1005b83f4403ef0d82d40b77c)
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>
705779cd9SAlexander von Gluck IV  *		Alexander von Gluck <kallisti5@unixzen.com>
80b4c5624SAlexander von Gluck IV  */
90b4c5624SAlexander von Gluck IV 
100b4c5624SAlexander von Gluck IV 
114b66f476SAlexander von Gluck IV #include "GLifeView.h"
124b66f476SAlexander von Gluck IV 
130b4c5624SAlexander von Gluck IV #include <GL/glu.h>
140b4c5624SAlexander von Gluck IV #include <GLView.h>
154b66f476SAlexander von Gluck IV #include <math.h>
164b66f476SAlexander von Gluck IV #include <stdlib.h>
170b4c5624SAlexander von Gluck IV 
183c94b5cbSAlexander von Gluck IV #include "GLifeGrid.h"
193c94b5cbSAlexander von Gluck IV #include "GLifeState.h"
200b4c5624SAlexander von Gluck IV 
210b4c5624SAlexander von Gluck IV 
220b4c5624SAlexander von Gluck IV // ------------------------------------------------------
230b4c5624SAlexander von Gluck IV //  GLifeView Class Constructor Definition
GLifeView(BRect rect,const char * name,ulong resizingMode,ulong options,GLifeState * pglsState)2451f9263bSAlexander von Gluck IV GLifeView::GLifeView(BRect rect, const char* name, ulong resizingMode,
250b4c5624SAlexander von Gluck IV 	ulong options, GLifeState* pglsState)
260b4c5624SAlexander von Gluck IV 	:
27*a3cdc7c5SAdrien Destugues 	BGLView(rect, name, resizingMode, B_FRAME_EVENTS | B_WILL_DRAW, options),
280b4c5624SAlexander von Gluck IV 	m_pglsState(pglsState)
290b4c5624SAlexander von Gluck IV {
300b4c5624SAlexander von Gluck IV 	// Setup the grid
310b4c5624SAlexander von Gluck IV 	m_pglgGrid = new GLifeGrid(pglsState->GridWidth(), pglsState->GridHeight());
320b4c5624SAlexander von Gluck IV }
330b4c5624SAlexander von Gluck IV 
348bc51beeSAlexander von Gluck IV 
350b4c5624SAlexander von Gluck IV // ------------------------------------------------------
360b4c5624SAlexander von Gluck IV //  GLifeView Class Destructor Definition
~GLifeView(void)370b4c5624SAlexander von Gluck IV GLifeView::~GLifeView(void)
380b4c5624SAlexander von Gluck IV {
390b4c5624SAlexander von Gluck IV 	delete m_pglgGrid;
400b4c5624SAlexander von Gluck IV }
410b4c5624SAlexander von Gluck IV 
428bc51beeSAlexander von Gluck IV 
430b4c5624SAlexander von Gluck IV // ------------------------------------------------------
440b4c5624SAlexander von Gluck IV //  GLifeView Class AttachedToWindow Definition
454b66f476SAlexander von Gluck IV void
AttachedToWindow(void)464b66f476SAlexander von Gluck IV GLifeView::AttachedToWindow(void)
470b4c5624SAlexander von Gluck IV {
480b4c5624SAlexander von Gluck IV 	LockGL();
490b4c5624SAlexander von Gluck IV 	BGLView::AttachedToWindow();
50*a3cdc7c5SAdrien Destugues 
51*a3cdc7c5SAdrien Destugues 	glClearDepth(1.0);
52*a3cdc7c5SAdrien Destugues 	glDepthFunc(GL_LESS);
53*a3cdc7c5SAdrien Destugues 	glEnable(GL_DEPTH_TEST);
54*a3cdc7c5SAdrien Destugues 
55*a3cdc7c5SAdrien Destugues 	glEnable(GL_BLEND);
56*a3cdc7c5SAdrien Destugues 	glBlendFunc(GL_SRC_ALPHA, GL_ONE);
57*a3cdc7c5SAdrien Destugues #if 0
58*a3cdc7c5SAdrien Destugues 	glShadeModel(GL_SMOOTH);
59*a3cdc7c5SAdrien Destugues #endif
60*a3cdc7c5SAdrien Destugues 	glMatrixMode(GL_PROJECTION);
61*a3cdc7c5SAdrien Destugues 	glLoadIdentity();
62*a3cdc7c5SAdrien Destugues 	gluPerspective(45.0, Bounds().Width() / Bounds().Height(), 2.0, 20000.0);
63*a3cdc7c5SAdrien Destugues 	glTranslatef(0.0, 0.0, -50.0);
64*a3cdc7c5SAdrien Destugues 	glMatrixMode(GL_MODELVIEW);
65*a3cdc7c5SAdrien Destugues 
66*a3cdc7c5SAdrien Destugues 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
67*a3cdc7c5SAdrien Destugues 
680b4c5624SAlexander von Gluck IV 	UnlockGL();
690b4c5624SAlexander von Gluck IV }
700b4c5624SAlexander von Gluck IV 
718bc51beeSAlexander von Gluck IV 
720b4c5624SAlexander von Gluck IV // ------------------------------------------------------
730b4c5624SAlexander von Gluck IV //  GLifeView Class Draw Definition
744b66f476SAlexander von Gluck IV void
Draw(BRect updateRect)754b66f476SAlexander von Gluck IV GLifeView::Draw(BRect updateRect)
760b4c5624SAlexander von Gluck IV {
770b4c5624SAlexander von Gluck IV 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
780b4c5624SAlexander von Gluck IV 
790b4c5624SAlexander von Gluck IV 	// TODO:  Dynamic colors or user-specified coloring
800b4c5624SAlexander von Gluck IV 	GLfloat glfGreen[] = {0.05, 0.8, 0.15, 1.0};
810b4c5624SAlexander von Gluck IV 	GLfloat glfOrange[] = {0.65, 0.3, 0.05, 1.0};
820b4c5624SAlexander von Gluck IV 
830b4c5624SAlexander von Gluck IV 	// Border control
840b4c5624SAlexander von Gluck IV 	bool bColor;
850b4c5624SAlexander von Gluck IV 
860b4c5624SAlexander von Gluck IV 	int32 iWidth = m_pglsState->GridWidth();
870b4c5624SAlexander von Gluck IV 	int32 iHeight = m_pglsState->GridHeight();
8805779cd9SAlexander von Gluck IV 	int32 iBorder = m_pglsState->GridBorder();
890b4c5624SAlexander von Gluck IV 
900b4c5624SAlexander von Gluck IV 	glPushMatrix();
910b4c5624SAlexander von Gluck IV 
920b4c5624SAlexander von Gluck IV 	glRotatef(m_glfDelta * 3, 1.0, 0.0, 0.0);
930b4c5624SAlexander von Gluck IV 	glRotatef(m_glfDelta * 1, 0.0, 0.0, 1.0);
940b4c5624SAlexander von Gluck IV 	glRotatef(m_glfDelta * 2, 0.0, 1.0, 0.0);
950b4c5624SAlexander von Gluck IV 
964b66f476SAlexander von Gluck IV 	for(int32 iRow = (0 - iBorder); iRow < (iHeight + iBorder); ++iRow) {
970b4c5624SAlexander von Gluck IV 		GLfloat glfY = (GLfloat)iRow - ((GLfloat)iHeight / 2);
980b4c5624SAlexander von Gluck IV 
994b66f476SAlexander von Gluck IV 		for(int32 iColumn = (0 - iBorder); iColumn < (iWidth + iBorder); ++iColumn) {
1004b66f476SAlexander von Gluck IV 
1010b4c5624SAlexander von Gluck IV 			GLfloat glfX = (GLfloat)iColumn - ((GLfloat) iWidth / 2);
1020b4c5624SAlexander von Gluck IV 
1030b4c5624SAlexander von Gluck IV 			bColor = (iColumn < 0) || (iColumn >= iWidth) || (iRow < 0) || (iRow >= iHeight);
1040b4c5624SAlexander von Gluck IV 
1054b66f476SAlexander von Gluck IV 			if (m_pglgGrid->Occupied(iRow, iColumn)) {
1060b4c5624SAlexander von Gluck IV 				glPushMatrix();
1070b4c5624SAlexander von Gluck IV 
1080b4c5624SAlexander von Gluck IV 				glTranslatef(glfX, glfY, 0.0);
1090b4c5624SAlexander von Gluck IV 				glScalef(0.45, 0.45, 0.45);
1100b4c5624SAlexander von Gluck IV 
1114b66f476SAlexander von Gluck IV 				// GL Begin
1120b4c5624SAlexander von Gluck IV 				glBegin(GL_QUAD_STRIP);
1130b4c5624SAlexander von Gluck IV 				if (bColor)
1140b4c5624SAlexander von Gluck IV 					glColor3f( 0.65, 0.3, 0.05 );
1150b4c5624SAlexander von Gluck IV 				else
1160b4c5624SAlexander von Gluck IV 					glColor3f( 0.05, 0.8, 0.15 );
1174b66f476SAlexander von Gluck IV 
1180b4c5624SAlexander von Gluck IV 				glMaterialfv(GL_FRONT, GL_DIFFUSE, bColor ? glfOrange : glfGreen);
1190b4c5624SAlexander von Gluck IV 				glNormal3f(0.0,  1.0, 0.0);
1200b4c5624SAlexander von Gluck IV 				glVertex3f(1.0,  1.0, -1.0);
1210b4c5624SAlexander von Gluck IV 				glVertex3f(-1.0,  1.0, -1.0);
1220b4c5624SAlexander von Gluck IV 				glVertex3f(1.0,  1.0, 1.0);
1230b4c5624SAlexander von Gluck IV 				glVertex3f(-1.0,  1.0, 1.0);
1240b4c5624SAlexander von Gluck IV 
1250b4c5624SAlexander von Gluck IV 				glNormal3f(0.0, 0.0, 1.0);
1260b4c5624SAlexander von Gluck IV 				glVertex3f(-1.0, 1.0, 1.0);
1270b4c5624SAlexander von Gluck IV 				glVertex3f(1.0, 1.0, 1.0);
1280b4c5624SAlexander von Gluck IV 				glVertex3f(-1.0, -1.0, 1.0);
1290b4c5624SAlexander von Gluck IV 				glVertex3f(1.0, -1.0, 1.0);
1300b4c5624SAlexander von Gluck IV 
1310b4c5624SAlexander von Gluck IV 				glNormal3f(0.0, -1.0, 0.0);
1320b4c5624SAlexander von Gluck IV 				glVertex3f(-1.0, -1.0, 1.0);
1330b4c5624SAlexander von Gluck IV 				glVertex3f(1.0, -1.0, 1.0);
1340b4c5624SAlexander von Gluck IV 				glVertex3f(-1.0, -1.0, -1.0);
1350b4c5624SAlexander von Gluck IV 				glVertex3f(1.0, -1.0, -1.0);
1360b4c5624SAlexander von Gluck IV 				glEnd();
1374b66f476SAlexander von Gluck IV 				// GL End
1380b4c5624SAlexander von Gluck IV 
1394b66f476SAlexander von Gluck IV 				// GL Begin
1400b4c5624SAlexander von Gluck IV 				glBegin( GL_QUAD_STRIP);
1410b4c5624SAlexander von Gluck IV 				if (bColor)
1420b4c5624SAlexander von Gluck IV 					glColor3f(0.65, 0.3, 0.05);
1430b4c5624SAlexander von Gluck IV 				else
1440b4c5624SAlexander von Gluck IV 					glColor3f(0.05, 0.8, 0.15);
1454b66f476SAlexander von Gluck IV 
1460b4c5624SAlexander von Gluck IV 				glMaterialfv(GL_FRONT, GL_DIFFUSE, bColor ? glfOrange : glfGreen);
1470b4c5624SAlexander von Gluck IV 				glNormal3f(-1.0, 0.0, 0.0);
1480b4c5624SAlexander von Gluck IV 				glVertex3f(-1.0, 1.0, 1.0);
1490b4c5624SAlexander von Gluck IV 				glVertex3f(-1.0, -1.0, 1.0);
1500b4c5624SAlexander von Gluck IV 				glVertex3f(-1.0, 1.0, -1.0);
1510b4c5624SAlexander von Gluck IV 				glVertex3f(-1.0, -1.0, -1.0);
1520b4c5624SAlexander von Gluck IV 
1530b4c5624SAlexander von Gluck IV 				glNormal3f(0.0, 0.0, -1.0);
1540b4c5624SAlexander von Gluck IV 				glVertex3f(-1.0, 1.0, -1.0);
1550b4c5624SAlexander von Gluck IV 				glVertex3f(-1.0, -1.0, -1.0);
1560b4c5624SAlexander von Gluck IV 				glVertex3f(1.0, 1.0, -1.0);
1570b4c5624SAlexander von Gluck IV 				glVertex3f(1.0, -1.0, -1.0);
1580b4c5624SAlexander von Gluck IV 
1590b4c5624SAlexander von Gluck IV 				glNormal3f(1.0, 0.0, 0.0);
1600b4c5624SAlexander von Gluck IV 				glVertex3f(1.0, 1.0, -1.0);
1610b4c5624SAlexander von Gluck IV 				glVertex3f(1.0, -1.0, -1.0);
1620b4c5624SAlexander von Gluck IV 				glVertex3f(1.0, 1.0, 1.0);
1630b4c5624SAlexander von Gluck IV 				glVertex3f(1.0, -1.0, 1.0);
1640b4c5624SAlexander von Gluck IV 				glEnd();
1654b66f476SAlexander von Gluck IV 				// GL End
1660b4c5624SAlexander von Gluck IV 
1670b4c5624SAlexander von Gluck IV 				glPopMatrix();
1680b4c5624SAlexander von Gluck IV 			}
1690b4c5624SAlexander von Gluck IV 		}
1700b4c5624SAlexander von Gluck IV 	}
1710b4c5624SAlexander von Gluck IV 
1720b4c5624SAlexander von Gluck IV 	glPopMatrix();
1730b4c5624SAlexander von Gluck IV }
1740b4c5624SAlexander von Gluck IV 
1758bc51beeSAlexander von Gluck IV 
1760b4c5624SAlexander von Gluck IV // ------------------------------------------------------
1770b4c5624SAlexander von Gluck IV //  GLifeView Class Advance Definition
1784b66f476SAlexander von Gluck IV void
Advance(void)1794b66f476SAlexander von Gluck IV GLifeView::Advance(void)
1800b4c5624SAlexander von Gluck IV {
1814b66f476SAlexander von Gluck IV 	if (m_glfDelta++ > 360.0)
1820b4c5624SAlexander von Gluck IV 		m_glfDelta -= 360.0;
18305779cd9SAlexander von Gluck IV 
18405779cd9SAlexander von Gluck IV 	int32 gridDelay = m_pglsState->GridDelay();
18505779cd9SAlexander von Gluck IV 	if (m_iStep++ > gridDelay) {
1860b4c5624SAlexander von Gluck IV 		m_iStep = 0;
1870b4c5624SAlexander von Gluck IV 		m_pglgGrid->Generation();
1880b4c5624SAlexander von Gluck IV 	}
1894b66f476SAlexander von Gluck IV 
1900b4c5624SAlexander von Gluck IV 	LockGL();
1910b4c5624SAlexander von Gluck IV 	BRect location(0,0,0,0);
1920b4c5624SAlexander von Gluck IV 	Draw(location);
1930b4c5624SAlexander von Gluck IV 	SwapBuffers();
1940b4c5624SAlexander von Gluck IV 	UnlockGL();
1950b4c5624SAlexander von Gluck IV }
196