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