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