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