xref: /haiku/src/add-ons/screen_savers/glife/GLifeView.cpp (revision 8bc51bee4ce16e63524fc638188634d6d73f756c)
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 <math.h>
110b4c5624SAlexander von Gluck IV #include <stdlib.h>
120b4c5624SAlexander von Gluck IV #include <GL/glu.h>
130b4c5624SAlexander von Gluck IV #include <GLView.h>
140b4c5624SAlexander von Gluck IV 
153c94b5cbSAlexander von Gluck IV #include "GLifeGrid.h"
163c94b5cbSAlexander von Gluck IV #include "GLifeState.h"
173c94b5cbSAlexander von Gluck IV #include "GLifeView.h"
180b4c5624SAlexander von Gluck IV 
190b4c5624SAlexander von Gluck IV 
200b4c5624SAlexander von Gluck IV // ------------------------------------------------------
210b4c5624SAlexander von Gluck IV //  GLifeView Class Constructor Definition
2251f9263bSAlexander von Gluck IV GLifeView::GLifeView(BRect rect, const char* name, ulong resizingMode,
230b4c5624SAlexander von Gluck IV 	ulong options, GLifeState* pglsState)
240b4c5624SAlexander von Gluck IV 	:
250b4c5624SAlexander von Gluck IV 	BGLView(rect, name, resizingMode, 0, options),
260b4c5624SAlexander von Gluck IV 	m_pglsState(pglsState)
270b4c5624SAlexander von Gluck IV {
280b4c5624SAlexander von Gluck IV 	// Setup the grid
290b4c5624SAlexander von Gluck IV 	m_pglgGrid = new GLifeGrid( pglsState->GridWidth(), pglsState->GridHeight() );
300b4c5624SAlexander von Gluck IV 
310b4c5624SAlexander von Gluck IV 	LockGL();
320b4c5624SAlexander von Gluck IV 
330b4c5624SAlexander von Gluck IV 	glClearDepth( 1.0 );
340b4c5624SAlexander von Gluck IV 	glDepthFunc( GL_LESS );
350b4c5624SAlexander von Gluck IV 	glEnable( GL_DEPTH_TEST );
360b4c5624SAlexander von Gluck IV 
370b4c5624SAlexander von Gluck IV 	glEnable( GL_BLEND );
380b4c5624SAlexander von Gluck IV 	glBlendFunc( GL_SRC_ALPHA, GL_ONE );
390b4c5624SAlexander von Gluck IV #if 0
400b4c5624SAlexander von Gluck IV 	glShadeModel( GL_SMOOTH );
410b4c5624SAlexander von Gluck IV #endif
420b4c5624SAlexander von Gluck IV 	glMatrixMode( GL_PROJECTION );
430b4c5624SAlexander von Gluck IV 	glLoadIdentity();
440b4c5624SAlexander von Gluck IV 	gluPerspective( 45.0, rect.Width() / rect.Height(), 2.0, 20000.0 );
450b4c5624SAlexander von Gluck IV 	glTranslatef( 0.0, 0.0, -50.0 );
460b4c5624SAlexander von Gluck IV 	glMatrixMode( GL_MODELVIEW );
470b4c5624SAlexander von Gluck IV 
480b4c5624SAlexander von Gluck IV 	glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
490b4c5624SAlexander von Gluck IV 
500b4c5624SAlexander von Gluck IV 	UnlockGL();
510b4c5624SAlexander von Gluck IV }
520b4c5624SAlexander von Gluck IV 
53*8bc51beeSAlexander von Gluck IV 
540b4c5624SAlexander von Gluck IV // ------------------------------------------------------
550b4c5624SAlexander von Gluck IV //  GLifeView Class Destructor Definition
560b4c5624SAlexander von Gluck IV GLifeView::~GLifeView( void )
570b4c5624SAlexander von Gluck IV {
580b4c5624SAlexander von Gluck IV 	delete m_pglgGrid;
590b4c5624SAlexander von Gluck IV }
600b4c5624SAlexander von Gluck IV 
61*8bc51beeSAlexander von Gluck IV 
620b4c5624SAlexander von Gluck IV // ------------------------------------------------------
630b4c5624SAlexander von Gluck IV //  GLifeView Class AttachedToWindow Definition
640b4c5624SAlexander von Gluck IV void GLifeView::AttachedToWindow( void )
650b4c5624SAlexander von Gluck IV {
660b4c5624SAlexander von Gluck IV 	LockGL();
670b4c5624SAlexander von Gluck IV 	BGLView::AttachedToWindow();
680b4c5624SAlexander von Gluck IV 	UnlockGL();
690b4c5624SAlexander von Gluck IV }
700b4c5624SAlexander von Gluck IV 
71*8bc51beeSAlexander von Gluck IV 
720b4c5624SAlexander von Gluck IV // ------------------------------------------------------
730b4c5624SAlexander von Gluck IV //  GLifeView Class Draw Definition
740b4c5624SAlexander von Gluck IV void GLifeView::Draw(BRect updateRect)
750b4c5624SAlexander von Gluck IV {
760b4c5624SAlexander von Gluck IV 	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
770b4c5624SAlexander von Gluck IV 
780b4c5624SAlexander von Gluck IV 	// TODO:  Dynamic colors or user-specified coloring
790b4c5624SAlexander von Gluck IV 	GLfloat glfGreen[] = { 0.05, 0.8, 0.15, 1.0 };
800b4c5624SAlexander von Gluck IV 	GLfloat glfOrange[] = { 0.65, 0.3, 0.05, 1.0 };
810b4c5624SAlexander von Gluck IV 
820b4c5624SAlexander von Gluck IV 	// Border control
830b4c5624SAlexander von Gluck IV 	bool bColor;
840b4c5624SAlexander von Gluck IV 
850b4c5624SAlexander von Gluck IV 	int32 iWidth = m_pglsState->GridWidth();
860b4c5624SAlexander von Gluck IV 	int32 iHeight = m_pglsState->GridHeight();
870b4c5624SAlexander von Gluck IV 	int32 iBorder = m_pglsState->Border();
880b4c5624SAlexander von Gluck IV 
890b4c5624SAlexander von Gluck IV 	glPushMatrix();
900b4c5624SAlexander von Gluck IV 
910b4c5624SAlexander von Gluck IV 	glRotatef( m_glfDelta * 3, 1.0, 0.0, 0.0 );
920b4c5624SAlexander von Gluck IV 	glRotatef( m_glfDelta * 1, 0.0, 0.0, 1.0 );
930b4c5624SAlexander von Gluck IV 	glRotatef( m_glfDelta * 2, 0.0, 1.0, 0.0 );
940b4c5624SAlexander von Gluck IV 
950b4c5624SAlexander von Gluck IV 	for( int32 iRow = ( 0 - iBorder ); iRow < ( iHeight + iBorder ); ++iRow )
960b4c5624SAlexander von Gluck IV 	{
970b4c5624SAlexander von Gluck IV 		GLfloat glfY = (GLfloat) iRow - ( (GLfloat) iHeight / 2 );
980b4c5624SAlexander von Gluck IV 
990b4c5624SAlexander von Gluck IV 		for( int32 iColumn = ( 0 - iBorder ); iColumn < ( iWidth + iBorder ); ++iColumn )
1000b4c5624SAlexander 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 
1050b4c5624SAlexander von Gluck IV 			if ( m_pglgGrid->Occupied( iRow, iColumn ) )
1060b4c5624SAlexander von Gluck IV 			{
1070b4c5624SAlexander von Gluck IV 				glPushMatrix();
1080b4c5624SAlexander von Gluck IV 
1090b4c5624SAlexander von Gluck IV 				glTranslatef( glfX, glfY, 0.0 );
1100b4c5624SAlexander von Gluck IV 				glScalef( 0.45, 0.45, 0.45 );
1110b4c5624SAlexander von Gluck IV 
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 );
1170b4c5624SAlexander von Gluck IV 					glMaterialfv(GL_FRONT, GL_DIFFUSE, bColor ? glfOrange : glfGreen);
1180b4c5624SAlexander von Gluck IV 					glNormal3f(  0.0,  1.0,  0.0 );
1190b4c5624SAlexander von Gluck IV 					glVertex3f(  1.0,  1.0, -1.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 
1240b4c5624SAlexander von Gluck IV 					glNormal3f(  0.0,  0.0,  1.0 );
1250b4c5624SAlexander von Gluck IV 					glVertex3f( -1.0,  1.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 
1300b4c5624SAlexander von Gluck IV 					glNormal3f(  0.0, -1.0,  0.0 );
1310b4c5624SAlexander von Gluck IV 					glVertex3f( -1.0, -1.0,  1.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 				glEnd();
1360b4c5624SAlexander von Gluck IV 
1370b4c5624SAlexander von Gluck IV 				glBegin( GL_QUAD_STRIP);
1380b4c5624SAlexander von Gluck IV 					if (bColor)
1390b4c5624SAlexander von Gluck IV 						glColor3f( 0.65, 0.3, 0.05 );
1400b4c5624SAlexander von Gluck IV 					else
1410b4c5624SAlexander von Gluck IV 						glColor3f( 0.05, 0.8, 0.15 );
1420b4c5624SAlexander von Gluck IV 					glMaterialfv(GL_FRONT, GL_DIFFUSE, bColor ? glfOrange : glfGreen);
1430b4c5624SAlexander von Gluck IV 					glNormal3f( -1.0,  0.0,  0.0 );
1440b4c5624SAlexander von Gluck IV 					glVertex3f( -1.0,  1.0,  1.0 );
1450b4c5624SAlexander von Gluck IV 					glVertex3f( -1.0, -1.0,  1.0 );
1460b4c5624SAlexander von Gluck IV 					glVertex3f( -1.0,  1.0, -1.0 );
1470b4c5624SAlexander von Gluck IV 					glVertex3f( -1.0, -1.0, -1.0 );
1480b4c5624SAlexander von Gluck IV 
1490b4c5624SAlexander von Gluck IV 					glNormal3f(  0.0,  0.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 					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(  1.0,  0.0,  0.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 				glEnd();
1610b4c5624SAlexander von Gluck IV 
1620b4c5624SAlexander von Gluck IV 				glPopMatrix();
1630b4c5624SAlexander von Gluck IV 			}
1640b4c5624SAlexander von Gluck IV 		}
1650b4c5624SAlexander von Gluck IV 	}
1660b4c5624SAlexander von Gluck IV 
1670b4c5624SAlexander von Gluck IV 	glPopMatrix();
1680b4c5624SAlexander von Gluck IV }
1690b4c5624SAlexander von Gluck IV 
170*8bc51beeSAlexander von Gluck IV 
1710b4c5624SAlexander von Gluck IV // ------------------------------------------------------
1720b4c5624SAlexander von Gluck IV //  GLifeView Class Advance Definition
1730b4c5624SAlexander von Gluck IV void GLifeView::Advance( void )
1740b4c5624SAlexander von Gluck IV {
1750b4c5624SAlexander von Gluck IV 	if ( ( ++m_glfDelta ) > 360.0)
1760b4c5624SAlexander von Gluck IV 		m_glfDelta -= 360.0;
1770b4c5624SAlexander von Gluck IV 	// TODO: Allow for customized intervals
1780b4c5624SAlexander von Gluck IV 	if ( ( ++m_iStep ) > 4 )
1790b4c5624SAlexander von Gluck IV 	{
1800b4c5624SAlexander von Gluck IV 		m_iStep = 0;
1810b4c5624SAlexander von Gluck IV 		m_pglgGrid->Generation();
1820b4c5624SAlexander von Gluck IV 	}
1830b4c5624SAlexander von Gluck IV 	LockGL();
1840b4c5624SAlexander von Gluck IV 	BRect location(0,0,0,0);
1850b4c5624SAlexander von Gluck IV 	Draw(location);
1860b4c5624SAlexander von Gluck IV 	SwapBuffers();
1870b4c5624SAlexander von Gluck IV 	UnlockGL();
1880b4c5624SAlexander von Gluck IV }
189