diff --git a/GLGameTemplate.xcodeproj/project.pbxproj b/GLGameTemplate.xcodeproj/project.pbxproj index e5dd09c..8c96a70 100644 --- a/GLGameTemplate.xcodeproj/project.pbxproj +++ b/GLGameTemplate.xcodeproj/project.pbxproj @@ -53,6 +53,7 @@ 4280A9391553DD4C00664DC2 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ViewController_iPhone.xib; sourceTree = ""; }; 4280A93C1553DD4C00664DC2 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ViewController_iPad.xib; sourceTree = ""; }; 42E092841553DFB7002EA900 /* J.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = J.xcodeproj; path = ../J/J.xcodeproj; sourceTree = ""; }; + 42E092971553F367002EA900 /* App.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = App.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -105,14 +106,10 @@ 4280A9251553DD4C00664DC2 /* GLGameTemplate */ = { isa = PBXGroup; children = ( - 4280A92E1553DD4C00664DC2 /* AppDelegate.h */, - 4280A92F1553DD4C00664DC2 /* AppDelegate.m */, + 42E092971553F367002EA900 /* App.h */, 4280A9311553DD4C00664DC2 /* Shader.fsh */, 4280A9331553DD4C00664DC2 /* Shader.vsh */, - 4280A9351553DD4C00664DC2 /* ViewController.h */, - 4280A9361553DD4C00664DC2 /* ViewController.mm */, - 4280A9381553DD4C00664DC2 /* ViewController_iPhone.xib */, - 4280A93B1553DD4C00664DC2 /* ViewController_iPad.xib */, + 42E092981553F7E6002EA900 /* GLViews */, 4280A9261553DD4C00664DC2 /* Supporting Files */, ); path = GLGameTemplate; @@ -121,6 +118,8 @@ 4280A9261553DD4C00664DC2 /* Supporting Files */ = { isa = PBXGroup; children = ( + 4280A92E1553DD4C00664DC2 /* AppDelegate.h */, + 4280A92F1553DD4C00664DC2 /* AppDelegate.m */, 4280A9271553DD4C00664DC2 /* GLGameTemplate-Info.plist */, 4280A9281553DD4C00664DC2 /* InfoPlist.strings */, 4280A92B1553DD4C00664DC2 /* main.m */, @@ -137,6 +136,17 @@ name = Products; sourceTree = ""; }; + 42E092981553F7E6002EA900 /* GLViews */ = { + isa = PBXGroup; + children = ( + 4280A9351553DD4C00664DC2 /* ViewController.h */, + 4280A9361553DD4C00664DC2 /* ViewController.mm */, + 4280A9381553DD4C00664DC2 /* ViewController_iPhone.xib */, + 4280A93B1553DD4C00664DC2 /* ViewController_iPad.xib */, + ); + name = GLViews; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ diff --git a/GLGameTemplate/App.h b/GLGameTemplate/App.h new file mode 100644 index 0000000..773a2f7 --- /dev/null +++ b/GLGameTemplate/App.h @@ -0,0 +1,161 @@ +// +// App.h +// GLGameTemplate +// +// Created by Joshua Moerman on 5/4/12. +// Copyright (c) 2012 Vadovas. All rights reserved. +// + +#ifndef GLGameTemplate_App_h +#define GLGameTemplate_App_h + +#import + +#include +#include +#include "shader.h" + +#define BUFFER_OFFSET(i) ((char *)NULL + (i)) + +struct App { + std::unique_ptr program; + + GLKMatrix4 modelViewProjectionMatrix; + GLKMatrix3 normalMatrix; + float rotation; + float aspect; + + GLuint vertexArray; + GLuint vertexBuffer; + + App() + : program(nullptr) + , modelViewProjectionMatrix({{0}}) + , normalMatrix({{0}}) + , rotation(0) + , aspect(0.75) + , vertexArray(0) + , vertexBuffer(0) + { + std::cout << "APP CONSTRUCTED" << std::endl; + glEnable(GL_DEPTH_TEST); + + // shader + NSString * vshader_file = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"vsh"]; + NSString * fshader_file = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"fsh"]; + std::vector v; + v.emplace_back("position"); + v.emplace_back("normal"); + program.reset(new J::shader([vshader_file UTF8String], [fshader_file UTF8String], std::move(v))); + + // vertex-buffer + glGenVertexArraysOES(1, &vertexArray); + glBindVertexArrayOES(vertexArray); + + glGenBuffers(1, &vertexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); + + glEnableVertexAttribArray(GLKVertexAttribPosition); + glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); + glEnableVertexAttribArray(GLKVertexAttribNormal); + glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12)); + + glBindVertexArrayOES(0); + } + + ~App(){ + glDeleteBuffers(1, &vertexBuffer); + glDeleteVertexArraysOES(1, &vertexArray); + std::cout << "APP DESTRUCTED" << std::endl; + } + + void resize(float width, float height){ + aspect = std::abs(width/height); + } + + void update(float dt){ + // projection matrix (perspective) + GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f); + + // model matrix (rotation) + GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f); + baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, rotation, 0.0f, 1.0f, 0.0f); + + GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 1.5f); + modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, rotation, 1.0f, 1.0f, 1.0f); + modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix); + + // setting stuff for later use in the shader + normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL); + modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix); + + // time update + rotation += dt * 0.5f; + } + + void draw(){ + // clear + float red = rand() / (float)RAND_MAX; + glClearColor(red, 0.65f, 0.65f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // bind and set up + glBindVertexArrayOES(vertexArray); + + program->begin(); + program->set_uniform("modelViewProjectionMatrix", modelViewProjectionMatrix.m, 0); + program->set_uniform("normalMatrix", normalMatrix.m, 0); + + // draw + glDrawArrays(GL_TRIANGLES, 0, 36); + } + + constexpr GLfloat gCubeVertexData[216] = { + // Data layout for each line below is: + // positionX, positionY, positionZ, normalX, normalY, normalZ, + 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, + 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, + 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, + 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, + 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, + 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, + + 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, + -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, + 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, + 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, + -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, + -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, + + -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, + -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, + -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, + -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, + -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, + -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, + + -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, + 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, + -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, + -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, + 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, + 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, + + 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, + -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, + 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, + 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, + -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, + -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, + + 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, + -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, + 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, + 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, + -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, + -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f + }; +}; + +#endif diff --git a/GLGameTemplate/ViewController.mm b/GLGameTemplate/ViewController.mm index 390a99b..1193ada 100644 --- a/GLGameTemplate/ViewController.mm +++ b/GLGameTemplate/ViewController.mm @@ -7,66 +7,12 @@ // #import "ViewController.h" -#import "shader.h" - -#define BUFFER_OFFSET(i) ((char *)NULL + (i)) - -GLfloat gCubeVertexData[216] = { - // Data layout for each line below is: - // positionX, positionY, positionZ, normalX, normalY, normalZ, - 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, - 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, - 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, - 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, - 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, - 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, - - 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, - -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, - -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, - -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, - - -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, - -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, - -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, - -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, - -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, - -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, - - -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, - 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, - -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, - -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, - 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, - 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, - - 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, - -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, - 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, - 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, - -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, - -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, - - 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, - -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, - 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, - 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, - -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, - -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f -}; - +#import "App.h" @interface ViewController () { - J::shader * program; - - GLKMatrix4 _modelViewProjectionMatrix; - GLKMatrix3 _normalMatrix; - float _rotation; - - GLuint _vertexArray; - GLuint _vertexBuffer; + App * app; + float width; + float height; } @property (strong, nonatomic) EAGLContext *context; - (void)setupGL; @@ -84,6 +30,7 @@ GLfloat gCubeVertexData[216] = { #pragma mark - View stuff - (void)viewDidLoad { + self.preferredFramesPerSecond = 60; [super viewDidLoad]; self.context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2] autorelease]; @@ -92,6 +39,7 @@ GLfloat gCubeVertexData[216] = { GLKView* view = (GLKView* )self.view; view.context = self.context; view.drawableDepthFormat = GLKViewDrawableDepthFormat24; + view.drawableMultisample = GLKViewDrawableMultisample4X; [self setupGL]; } @@ -118,78 +66,28 @@ GLfloat gCubeVertexData[216] = { #pragma mark - openGL setup - (void)setupGL { [EAGLContext setCurrentContext:self.context]; - glEnable(GL_DEPTH_TEST); - - // shader - NSString * vshader_file = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"vsh"]; - NSString * fshader_file = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"fsh"]; - std::vector v; - v.emplace_back("position"); - v.emplace_back("normal"); - program = new J::shader([vshader_file UTF8String], [fshader_file UTF8String], std::move(v)); - - // vertex-buffer - glGenVertexArraysOES(1, &_vertexArray); - glBindVertexArrayOES(_vertexArray); - - glGenBuffers(1, &_vertexBuffer); - glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); - - glEnableVertexAttribArray(GLKVertexAttribPosition); - glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); - glEnableVertexAttribArray(GLKVertexAttribNormal); - glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12)); - - glBindVertexArrayOES(0); + app = new App; } - (void)tearDownGL { [EAGLContext setCurrentContext:self.context]; - glDeleteBuffers(1, &_vertexBuffer); - glDeleteVertexArraysOES(1, &_vertexArray); - - if (program) { - delete program; - program = 0; - } + delete app; + app = 0; } #pragma mark - GLKView and GLKViewController delegate methods - (void)update { - // projection matrix (perspective) - float aspect = fabsf(self.view.bounds.size.width / self.view.bounds.size.height); - GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f); - - // model matrix (rotation) - GLKMatrix4 baseModelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -4.0f); - baseModelViewMatrix = GLKMatrix4Rotate(baseModelViewMatrix, _rotation, 0.0f, 1.0f, 0.0f); - - GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 1.5f); - modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, _rotation, 1.0f, 1.0f, 1.0f); - modelViewMatrix = GLKMatrix4Multiply(baseModelViewMatrix, modelViewMatrix); - - // setting stuff for later use in the shader - _normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL); - _modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix); - - // time update - _rotation += self.timeSinceLastUpdate * 0.5f; + if(width != self.view.bounds.size.width || height != self.view.bounds.size.height){ + width = self.view.bounds.size.width; + height = self.view.bounds.size.height; + app->resize(width, height); + } + app->update(self.timeSinceLastUpdate); } - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { - // clear - glClearColor(0.65f, 0.65f, 0.65f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glBindVertexArrayOES(_vertexArray); - - program->begin(); - program->set_uniform("modelViewProjectionMatrix", _modelViewProjectionMatrix.m, 0); - program->set_uniform("normalMatrix", _normalMatrix.m, 0); - - glDrawArrays(GL_TRIANGLES, 0, 36); + app->draw(); } @end