xref: /haiku/src/add-ons/screen_savers/glife/GLifeView.cpp (revision 4b66f476de4dd838321f118fdc319ad93dc50d08)
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 
10*4b66f476SAlexander von Gluck IV #include "GLifeView.h"
11*4b66f476SAlexander von Gluck IV 
120b4c5624SAlexander von Gluck IV #include <GL/glu.h>
130b4c5624SAlexander von Gluck IV #include <GLView.h>
14*4b66f476SAlexander von Gluck IV #include <math.h>
15*4b66f476SAlexander von Gluck IV #include <stdlib.h>
160b4c5624SAlexander von Gluck IV 
173c94b5cbSAlexander von Gluck IV #include "GLifeGrid.h"
183c94b5cbSAlexander von Gluck IV #include "GLifeState.h"
190b4c5624SAlexander von Gluck IV 
200b4c5624SAlexander von Gluck IV 
210b4c5624SAlexander von Gluck IV // ------------------------------------------------------
220b4c5624SAlexander von Gluck IV //  GLifeView Class Constructor Definition
2351f9263bSAlexander von Gluck IV GLifeView::GLifeView(BRect rect, const char* name, ulong resizingMode,
240b4c5624SAlexander von Gluck IV 	ulong options, GLifeState* pglsState)
250b4c5624SAlexander von Gluck IV 	:
260b4c5624SAlexander von Gluck IV 	BGLView(rect, name, resizingMode, 0, options),
270b4c5624SAlexander von Gluck IV 	m_pglsState(pglsState)
280b4c5624SAlexander von Gluck IV {
290b4c5624SAlexander von Gluck IV 	// Setup the grid
300b4c5624SAlexander von Gluck IV 	m_pglgGrid = new GLifeGrid(pglsState->GridWidth(), pglsState->GridHeight());
310b4c5624SAlexander von Gluck IV 
320b4c5624SAlexander von Gluck IV 	LockGL();
330b4c5624SAlexander von Gluck IV 
340b4c5624SAlexander von Gluck IV 	glClearDepth(1.0);
350b4c5624SAlexander von Gluck IV 	glDepthFunc(GL_LESS);
360b4c5624SAlexander von Gluck IV 	glEnable(GL_DEPTH_TEST);
370b4c5624SAlexander von Gluck IV 
380b4c5624SAlexander von Gluck IV 	glEnable(GL_BLEND);
390b4c5624SAlexander von Gluck IV 	glBlendFunc(GL_SRC_ALPHA, GL_ONE);
400b4c5624SAlexander von Gluck IV #if 0
410b4c5624SAlexander von Gluck IV 	glShadeModel(GL_SMOOTH);
420b4c5624SAlexander von Gluck IV #endif
430b4c5624SAlexander von Gluck IV 	glMatrixMode(GL_PROJECTION);
440b4c5624SAlexander von Gluck IV 	glLoadIdentity();
450b4c5624SAlexander von Gluck IV 	gluPerspective(45.0, rect.Width() / rect.Height(), 2.0, 20000.0);
460b4c5624SAlexander von Gluck IV 	glTranslatef(0.0, 0.0, -50.0);
470b4c5624SAlexander von Gluck IV 	glMatrixMode(GL_MODELVIEW);
480b4c5624SAlexander von Gluck IV 
490b4c5624SAlexander von Gluck IV 	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
500b4c5624SAlexander von Gluck IV 
510b4c5624SAlexander von Gluck IV 	UnlockGL();
520b4c5624SAlexander von Gluck IV }
530b4c5624SAlexander von Gluck IV 
548bc51beeSAlexander von Gluck IV 
550b4c5624SAlexander von Gluck IV // ------------------------------------------------------
560b4c5624SAlexander von Gluck IV //  GLifeView Class Destructor Definition
570b4c5624SAlexander von Gluck IV GLifeView::~GLifeView(void)
580b4c5624SAlexander von Gluck IV {
590b4c5624SAlexander von Gluck IV 	delete m_pglgGrid;
600b4c5624SAlexander von Gluck IV }
610b4c5624SAlexander von Gluck IV 
628bc51beeSAlexander von Gluck IV 
630b4c5624SAlexander von Gluck IV // ------------------------------------------------------
640b4c5624SAlexander von Gluck IV //  GLifeView Class AttachedToWindow Definition
65*4b66f476SAlexander von Gluck IV void
66*4b66f476SAlexander von Gluck IV GLifeView::AttachedToWindow(void)
670b4c5624SAlexander von Gluck IV {
680b4c5624SAlexander von Gluck IV 	LockGL();
690b4c5624SAlexander von Gluck IV 	BGLView::AttachedToWindow();
700b4c5624SAlexander von Gluck IV 	UnlockGL();
710b4c5624SAlexander von Gluck IV }
720b4c5624SAlexander von Gluck IV 
738bc51beeSAlexander von Gluck IV 
740b4c5624SAlexander von Gluck IV // ------------------------------------------------------
750b4c5624SAlexander von Gluck IV //  GLifeView Class Draw Definition
76*4b66f476SAlexander von Gluck IV void
77*4b66f476SAlexander von Gluck IV GLifeView::Draw(BRect updateRect)
780b4c5624SAlexander von Gluck IV {
790b4c5624SAlexander von Gluck IV 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
800b4c5624SAlexander von Gluck IV 
810b4c5624SAlexander von Gluck IV 	// TODO:  Dynamic colors or user-specified coloring
820b4c5624SAlexander von Gluck IV 	GLfloat glfGreen[] = {0.05, 0.8, 0.15, 1.0};
830b4c5624SAlexander von Gluck IV 	GLfloat glfOrange[] = {0.65, 0.3, 0.05, 1.0};
840b4c5624SAlexander von Gluck IV 
850b4c5624SAlexander von Gluck IV 	// Border control
860b4c5624SAlexander von Gluck IV 	bool bColor;
870b4c5624SAlexander von Gluck IV 
880b4c5624SAlexander von Gluck IV 	int32 iWidth = m_pglsState->GridWidth();
890b4c5624SAlexander von Gluck IV 	int32 iHeight = m_pglsState->GridHeight();
900b4c5624SAlexander von Gluck IV 	int32 iBorder = m_pglsState->Border();
910b4c5624SAlexander von Gluck IV 
920b4c5624SAlexander von Gluck IV 	glPushMatrix();
930b4c5624SAlexander von Gluck IV 
940b4c5624SAlexander von Gluck IV 	glRotatef(m_glfDelta * 3, 1.0, 0.0, 0.0);
950b4c5624SAlexander von Gluck IV 	glRotatef(m_glfDelta * 1, 0.0, 0.0, 1.0);
960b4c5624SAlexander von Gluck IV 	glRotatef(m_glfDelta * 2, 0.0, 1.0, 0.0);
970b4c5624SAlexander von Gluck IV 
98*4b66f476SAlexander von Gluck IV 	for(int32 iRow = (0 - iBorder); iRow < (iHeight + iBorder); ++iRow) {
990b4c5624SAlexander von Gluck IV 		GLfloat glfY = (GLfloat)iRow - ((GLfloat)iHeight / 2);
1000b4c5624SAlexander von Gluck IV 
101*4b66f476SAlexander von Gluck IV 		for(int32 iColumn = (0 - iBorder); iColumn < (iWidth + iBorder); ++iColumn) {
102*4b66f476SAlexander von Gluck IV 
1030b4c5624SAlexander von Gluck IV 			GLfloat glfX = (GLfloat)iColumn - ((GLfloat) iWidth / 2);
1040b4c5624SAlexander von Gluck IV 
1050b4c5624SAlexander von Gluck IV 			bColor = (iColumn < 0) || (iColumn >= iWidth) || (iRow < 0) || (iRow >= iHeight);
1060b4c5624SAlexander von Gluck IV 
107*4b66f476SAlexander von Gluck IV 			if (m_pglgGrid->Occupied(iRow, iColumn)) {
1080b4c5624SAlexander von Gluck IV 				glPushMatrix();
1090b4c5624SAlexander von Gluck IV 
1100b4c5624SAlexander von Gluck IV 				glTranslatef(glfX, glfY, 0.0);
1110b4c5624SAlexander von Gluck IV 				glScalef(0.45, 0.45, 0.45);
1120b4c5624SAlexander von Gluck IV 
113*4b66f476SAlexander von Gluck IV 				// GL Begin
1140b4c5624SAlexander von Gluck IV 				glBegin(GL_QUAD_STRIP);
1150b4c5624SAlexander von Gluck IV 				if (bColor)
1160b4c5624SAlexander von Gluck IV 					glColor3f( 0.65, 0.3, 0.05 );
1170b4c5624SAlexander von Gluck IV 				else
1180b4c5624SAlexander von Gluck IV 					glColor3f( 0.05, 0.8, 0.15 );
119*4b66f476SAlexander von Gluck IV 
1200b4c5624SAlexander von Gluck IV 				glMaterialfv(GL_FRONT, GL_DIFFUSE, bColor ? glfOrange : glfGreen);
1210b4c5624SAlexander von Gluck IV 				glNormal3f(0.0,  1.0, 0.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 				glVertex3f(1.0,  1.0, 1.0);
1250b4c5624SAlexander von Gluck IV 				glVertex3f(-1.0,  1.0, 1.0);
1260b4c5624SAlexander von Gluck IV 
1270b4c5624SAlexander von Gluck IV 				glNormal3f(0.0, 0.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 				glVertex3f(-1.0, -1.0, 1.0);
1310b4c5624SAlexander von Gluck IV 				glVertex3f(1.0, -1.0, 1.0);
1320b4c5624SAlexander von Gluck IV 
1330b4c5624SAlexander von Gluck IV 				glNormal3f(0.0, -1.0, 0.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 				glVertex3f(-1.0, -1.0, -1.0);
1370b4c5624SAlexander von Gluck IV 				glVertex3f(1.0, -1.0, -1.0);
1380b4c5624SAlexander von Gluck IV 				glEnd();
139*4b66f476SAlexander von Gluck IV 				// GL End
1400b4c5624SAlexander von Gluck IV 
141*4b66f476SAlexander von Gluck IV 				// GL Begin
1420b4c5624SAlexander von Gluck IV 				glBegin( GL_QUAD_STRIP);
1430b4c5624SAlexander von Gluck IV 				if (bColor)
1440b4c5624SAlexander von Gluck IV 					glColor3f(0.65, 0.3, 0.05);
1450b4c5624SAlexander von Gluck IV 				else
1460b4c5624SAlexander von Gluck IV 					glColor3f(0.05, 0.8, 0.15);
147*4b66f476SAlexander von Gluck IV 
1480b4c5624SAlexander von Gluck IV 				glMaterialfv(GL_FRONT, GL_DIFFUSE, bColor ? glfOrange : glfGreen);
1490b4c5624SAlexander von Gluck IV 				glNormal3f(-1.0, 0.0, 0.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 				glVertex3f(-1.0, 1.0, -1.0);
1530b4c5624SAlexander von Gluck IV 				glVertex3f(-1.0, -1.0, -1.0);
1540b4c5624SAlexander von Gluck IV 
1550b4c5624SAlexander von Gluck IV 				glNormal3f(0.0, 0.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 				glVertex3f(1.0, 1.0, -1.0);
1590b4c5624SAlexander von Gluck IV 				glVertex3f(1.0, -1.0, -1.0);
1600b4c5624SAlexander von Gluck IV 
1610b4c5624SAlexander von Gluck IV 				glNormal3f(1.0, 0.0, 0.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 				glVertex3f(1.0, 1.0, 1.0);
1650b4c5624SAlexander von Gluck IV 				glVertex3f(1.0, -1.0, 1.0);
1660b4c5624SAlexander von Gluck IV 				glEnd();
167*4b66f476SAlexander von Gluck IV 				// GL End
1680b4c5624SAlexander von Gluck IV 
1690b4c5624SAlexander von Gluck IV 				glPopMatrix();
1700b4c5624SAlexander von Gluck IV 			}
1710b4c5624SAlexander von Gluck IV 		}
1720b4c5624SAlexander von Gluck IV 	}
1730b4c5624SAlexander von Gluck IV 
1740b4c5624SAlexander von Gluck IV 	glPopMatrix();
1750b4c5624SAlexander von Gluck IV }
1760b4c5624SAlexander von Gluck IV 
1778bc51beeSAlexander von Gluck IV 
1780b4c5624SAlexander von Gluck IV // ------------------------------------------------------
1790b4c5624SAlexander von Gluck IV //  GLifeView Class Advance Definition
180*4b66f476SAlexander von Gluck IV void
181*4b66f476SAlexander von Gluck IV GLifeView::Advance(void)
1820b4c5624SAlexander von Gluck IV {
183*4b66f476SAlexander von Gluck IV 	if (m_glfDelta++ > 360.0)
1840b4c5624SAlexander von Gluck IV 		m_glfDelta -= 360.0;
1850b4c5624SAlexander von Gluck IV 	// TODO: Allow for customized intervals
186*4b66f476SAlexander von Gluck IV 	if (m_iStep++ > 4) {
1870b4c5624SAlexander von Gluck IV 		m_iStep = 0;
1880b4c5624SAlexander von Gluck IV 		m_pglgGrid->Generation();
1890b4c5624SAlexander von Gluck IV 	}
190*4b66f476SAlexander von Gluck IV 
1910b4c5624SAlexander von Gluck IV 	LockGL();
1920b4c5624SAlexander von Gluck IV 	BRect location(0,0,0,0);
1930b4c5624SAlexander von Gluck IV 	Draw(location);
1940b4c5624SAlexander von Gluck IV 	SwapBuffers();
1950b4c5624SAlexander von Gluck IV 	UnlockGL();
1960b4c5624SAlexander von Gluck IV }
197