diff --git a/Classes/SKAntialiasedAsyncGLViewController.m b/Classes/SKAntialiasedAsyncGLViewController.m index 304418f..42873ef 100644 --- a/Classes/SKAntialiasedAsyncGLViewController.m +++ b/Classes/SKAntialiasedAsyncGLViewController.m @@ -88,7 +88,11 @@ - (void)drawGL:(CGRect)rect glFlush(); - glResolveMultisampleFramebufferAPPLE(); + if(self.api == kEAGLRenderingAPIOpenGLES2){ + glResolveMultisampleFramebufferAPPLE(); + }else{ + glBlitFramebuffer(0,0,rect.size.width,rect.size.height, 0,0,rect.size.width,rect.size.height, GL_COLOR_BUFFER_BIT, GL_NEAREST); + } const GLenum discards[] = { GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT }; glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 2, discards); diff --git a/Classes/SKAsyncGLView.m b/Classes/SKAsyncGLView.m index 9eaa8bd..94fe566 100644 --- a/Classes/SKAsyncGLView.m +++ b/Classes/SKAsyncGLView.m @@ -7,6 +7,8 @@ // #import "SKAsyncGLView.h" +#import +#import @interface SKAsyncGLView () @property (nonatomic) BOOL contextsCreated; diff --git a/Classes/SKBaseAsyncGLViewController.h b/Classes/SKBaseAsyncGLViewController.h index bbf3011..2297e6e 100644 --- a/Classes/SKBaseAsyncGLViewController.h +++ b/Classes/SKBaseAsyncGLViewController.h @@ -19,6 +19,8 @@ @property (nonatomic) BOOL paused; +@property (nonatomic) EAGLRenderingAPI api; + - (void)setupGL:(CGRect)rect; - (void)drawGL:(CGRect)rect; diff --git a/Classes/SKBaseAsyncGLViewController.m b/Classes/SKBaseAsyncGLViewController.m index 9d11033..9993a7a 100644 --- a/Classes/SKBaseAsyncGLViewController.m +++ b/Classes/SKBaseAsyncGLViewController.m @@ -20,6 +20,8 @@ @implementation SKBaseAsyncGLViewController - (void)loadView { + self.api = [self getApi]; + self.view = [SKAsyncGLView new]; self.view.delegate = self; } diff --git a/Examples/SKAsyncGLViewController/SKAsyncGLViewController.xcodeproj/project.pbxproj b/Examples/SKAsyncGLViewController/SKAsyncGLViewController.xcodeproj/project.pbxproj index 8153449..e31da91 100644 --- a/Examples/SKAsyncGLViewController/SKAsyncGLViewController.xcodeproj/project.pbxproj +++ b/Examples/SKAsyncGLViewController/SKAsyncGLViewController.xcodeproj/project.pbxproj @@ -25,6 +25,11 @@ 6A71C2B71CD21489004320A9 /* BasicViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A71C2B61CD21489004320A9 /* BasicViewController.m */; }; 7916229A1E80144400D14255 /* SKAntialiasedAsyncGLViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 791622991E80144400D14255 /* SKAntialiasedAsyncGLViewController.m */; }; 7958C68C1F3E0CC0002AC1D0 /* SKAsyncGLViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7958C68B1F3E0CC0002AC1D0 /* SKAsyncGLViewController.m */; }; + 79C6BA6B234CC54B00C4C502 /* MultipleInstancesGL3ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 79C6BA6A234CC54B00C4C502 /* MultipleInstancesGL3ViewController.m */; }; + 79C6BA6E234CC58700C4C502 /* CubeGL3ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 79C6BA6D234CC58700C4C502 /* CubeGL3ViewController.m */; }; + 79C6BA71234CC7E300C4C502 /* Shader.vsh in Resources */ = {isa = PBXBuildFile; fileRef = 79C6BA6F234CC7E300C4C502 /* Shader.vsh */; }; + 79C6BA72234CC7E300C4C502 /* Shader.fsh in Resources */ = {isa = PBXBuildFile; fileRef = 79C6BA70234CC7E300C4C502 /* Shader.fsh */; }; + 79C6BA74234CC8E500C4C502 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79C6BA73234CC8E500C4C502 /* OpenGLES.framework */; }; C3987DB84930E9B72C7DEEFE /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BF55AAE6227749C3F5551629 /* libPods.a */; }; /* End PBXBuildFile section */ @@ -64,6 +69,13 @@ 791622991E80144400D14255 /* SKAntialiasedAsyncGLViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SKAntialiasedAsyncGLViewController.m; sourceTree = ""; }; 7958C68A1F3E0CC0002AC1D0 /* SKAsyncGLViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SKAsyncGLViewController.h; sourceTree = ""; }; 7958C68B1F3E0CC0002AC1D0 /* SKAsyncGLViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SKAsyncGLViewController.m; sourceTree = ""; }; + 79C6BA69234CC54B00C4C502 /* MultipleInstancesGL3ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MultipleInstancesGL3ViewController.h; sourceTree = ""; }; + 79C6BA6A234CC54B00C4C502 /* MultipleInstancesGL3ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MultipleInstancesGL3ViewController.m; sourceTree = ""; }; + 79C6BA6C234CC58700C4C502 /* CubeGL3ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CubeGL3ViewController.h; sourceTree = ""; }; + 79C6BA6D234CC58700C4C502 /* CubeGL3ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CubeGL3ViewController.m; sourceTree = ""; }; + 79C6BA6F234CC7E300C4C502 /* Shader.vsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = Shader.vsh; sourceTree = ""; }; + 79C6BA70234CC7E300C4C502 /* Shader.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = Shader.fsh; sourceTree = ""; }; + 79C6BA73234CC8E500C4C502 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; BF55AAE6227749C3F5551629 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; D67F41E571512E67556CC63B /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -73,6 +85,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 79C6BA74234CC8E500C4C502 /* OpenGLES.framework in Frameworks */, C3987DB84930E9B72C7DEEFE /* libPods.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -83,6 +96,7 @@ 1D86BCC062DC133D8491B025 /* Frameworks */ = { isa = PBXGroup; children = ( + 79C6BA73234CC8E500C4C502 /* OpenGLES.framework */, BF55AAE6227749C3F5551629 /* libPods.a */, ); name = Frameworks; @@ -134,6 +148,8 @@ 6A71C2981CD13972004320A9 /* Shaders */ = { isa = PBXGroup; children = ( + 79C6BA70234CC7E300C4C502 /* Shader.fsh */, + 79C6BA6F234CC7E300C4C502 /* Shader.vsh */, 6A71C2991CD13980004320A9 /* SimpleVertex.glsl */, 6A71C29B1CD13A4F004320A9 /* SimpleFragment.glsl */, 6A71C29F1CD13E9B004320A9 /* CC3Foundation.h */, @@ -173,8 +189,12 @@ 6A71C2B61CD21489004320A9 /* BasicViewController.m */, 6A00F0131CD0C26700DF53D2 /* CubeGL2ViewController.h */, 6A00F0141CD0C26700DF53D2 /* CubeGL2ViewController.m */, + 79C6BA6C234CC58700C4C502 /* CubeGL3ViewController.h */, + 79C6BA6D234CC58700C4C502 /* CubeGL3ViewController.m */, 6A00F02F1CD1201300DF53D2 /* MultipleInstancesGL2ViewController.h */, 6A00F0301CD1201300DF53D2 /* MultipleInstancesGL2ViewController.m */, + 79C6BA69234CC54B00C4C502 /* MultipleInstancesGL3ViewController.h */, + 79C6BA6A234CC54B00C4C502 /* MultipleInstancesGL3ViewController.m */, ); name = ViewControllers; sourceTree = ""; @@ -252,8 +272,10 @@ files = ( 6A00F01D1CD0C26700DF53D2 /* LaunchScreen.storyboard in Resources */, 6A71C29A1CD13980004320A9 /* SimpleVertex.glsl in Resources */, + 79C6BA71234CC7E300C4C502 /* Shader.vsh in Resources */, 6A00F01A1CD0C26700DF53D2 /* Assets.xcassets in Resources */, 6A00F0181CD0C26700DF53D2 /* Main.storyboard in Resources */, + 79C6BA72234CC7E300C4C502 /* Shader.fsh in Resources */, 6A71C29C1CD13A4F004320A9 /* SimpleFragment.glsl in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -317,11 +339,13 @@ 6A00F0311CD1201300DF53D2 /* MultipleInstancesGL2ViewController.m in Sources */, 6A71C2B31CD21039004320A9 /* SKBaseAsyncGLViewController.m in Sources */, 6A71C2B21CD21039004320A9 /* SKAsyncGLView.m in Sources */, + 79C6BA6B234CC54B00C4C502 /* MultipleInstancesGL3ViewController.m in Sources */, 7916229A1E80144400D14255 /* SKAntialiasedAsyncGLViewController.m in Sources */, 6A00F0151CD0C26700DF53D2 /* CubeGL2ViewController.m in Sources */, 6A00F0121CD0C26700DF53D2 /* AppDelegate.m in Sources */, 6A71C2A91CD13E9B004320A9 /* CC3Foundation.m in Sources */, 6A00F00F1CD0C26700DF53D2 /* main.m in Sources */, + 79C6BA6E234CC58700C4C502 /* CubeGL3ViewController.m in Sources */, 7958C68C1F3E0CC0002AC1D0 /* SKAsyncGLViewController.m in Sources */, 6A71C2AA1CD13E9B004320A9 /* CC3GLMatrix.m in Sources */, 6A71C2B71CD21489004320A9 /* BasicViewController.m in Sources */, diff --git a/Examples/SKAsyncGLViewController/SKAsyncGLViewController.xcworkspace/xcuserdata/stepankopylov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Examples/SKAsyncGLViewController/SKAsyncGLViewController.xcworkspace/xcuserdata/stepankopylov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..e91168b --- /dev/null +++ b/Examples/SKAsyncGLViewController/SKAsyncGLViewController.xcworkspace/xcuserdata/stepankopylov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/SKAsyncGLViewController/SKAsyncGLViewController/Base.lproj/Main.storyboard b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/Base.lproj/Main.storyboard index d40b1d1..0560021 100644 --- a/Examples/SKAsyncGLViewController/SKAsyncGLViewController/Base.lproj/Main.storyboard +++ b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/Base.lproj/Main.storyboard @@ -20,6 +20,7 @@ + @@ -41,7 +42,7 @@ - + @@ -77,7 +78,7 @@ - + @@ -104,16 +105,16 @@ - + - + - + - - + + + + + - + @@ -147,7 +152,7 @@ - + @@ -168,6 +173,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -180,6 +229,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/SKAsyncGLViewController/SKAsyncGLViewController/CubeGL2ViewController.m b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/CubeGL2ViewController.m index 95724d8..7f03ee2 100644 --- a/Examples/SKAsyncGLViewController/SKAsyncGLViewController/CubeGL2ViewController.m +++ b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/CubeGL2ViewController.m @@ -215,8 +215,7 @@ -(void)setupGL:(CGRect)rect [self setupVBOs]; } - -- (void)drawGL:(CGRect)rect +- (void)drawGLInRect:(CGRect)rect { CC3GLMatrix *projection = [CC3GLMatrix matrix]; float h = 4.0f * rect.size.height / rect.size.width; @@ -232,12 +231,6 @@ - (void)drawGL:(CGRect)rect [modelView rotateBy:CC3VectorMake(_multiplier, _multiplier, 0)]; glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView.glMatrix); - [super drawGL:rect]; -} - - -- (void)drawGLInRect:(CGRect)rect -{ glClearColor(0.f, 0.f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glEnable(GL_DEPTH_TEST); diff --git a/Examples/SKAsyncGLViewController/SKAsyncGLViewController/CubeGL3ViewController.h b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/CubeGL3ViewController.h new file mode 100644 index 0000000..3d19ca3 --- /dev/null +++ b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/CubeGL3ViewController.h @@ -0,0 +1,15 @@ +// +// ViewController.h +// SKAsyncGLViewController +// +// Created by Stephen Kopylov - Home on 27/04/16. +// Copyright © 2016 test. All rights reserved. +// + +#import "SKAntialiasedAsyncGLViewController.h" + +@interface CubeGL3ViewController : SKAntialiasedAsyncGLViewController + +@property (nonatomic) BOOL floating; + +@end diff --git a/Examples/SKAsyncGLViewController/SKAsyncGLViewController/CubeGL3ViewController.m b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/CubeGL3ViewController.m new file mode 100644 index 0000000..cd0ac07 --- /dev/null +++ b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/CubeGL3ViewController.m @@ -0,0 +1,288 @@ +// +// RMViewController.m +// test +// +// Created by ramemiso on 2013/09/23. +// Copyright (c) 2013年 ramemiso. All rights reserved. +// + +#import "CubeGL3ViewController.h" +#import +#import + +#define BUFFER_OFFSET(i) ((char *)NULL + (i)) + +// Uniform index. +enum +{ + UNIFORM_MODELVIEWPROJECTION_MATRIX, + UNIFORM_NORMAL_MATRIX, + NUM_UNIFORMS +}; +GLint uniforms[NUM_UNIFORMS]; + + +enum +{ + ATTRIB_POSITION, + ATTRIB_NORMAL, +}; + +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 +}; + +@interface CubeGL3ViewController () { + GLuint _program; + + GLKMatrix4 _modelViewProjectionMatrix; + GLKMatrix3 _normalMatrix; + float _rotation; + + GLuint _vertexArray; + GLuint _vertexBuffer; +} + +- (BOOL)loadShaders; +- (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file; +- (BOOL)linkProgram:(GLuint)prog; +- (BOOL)validateProgram:(GLuint)prog; +@end + +@implementation CubeGL3ViewController + +-(void)setupGL:(CGRect)rect +{ + [super setupGL:rect]; + + [self loadShaders]; + + glEnable(GL_DEPTH_TEST); + + glGenVertexArrays(1, &_vertexArray); + glBindVertexArray(_vertexArray); + + glGenBuffers(1, &_vertexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW); + + glEnableVertexAttribArray(ATTRIB_POSITION); + glVertexAttribPointer(ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); + glEnableVertexAttribArray(ATTRIB_NORMAL); + glVertexAttribPointer(ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12)); + + glBindVertexArray(0); +} + +- (void)clearGL +{ + [super clearGL]; + + glDeleteBuffers(1, &_vertexBuffer); + glDeleteVertexArrays(1, &_vertexArray); + + if (_program) { + glDeleteProgram(_program); + _program = 0; + } +} + +-(EAGLRenderingAPI)getApi{ + return kEAGLRenderingAPIOpenGLES3; +} + +- (void)update +{ + +// _rotation += self.timeSinceLastUpdate * 0.5f; +} + +- (void)drawGLInRect:(CGRect)rect{ + float aspect = fabs(rect.size.width / rect.size.height); + GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f); + + 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); + + _normalMatrix = GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL); + + _modelViewProjectionMatrix = GLKMatrix4Multiply(projectionMatrix, modelViewMatrix); + + _rotation += 0.01; + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glBindVertexArray(_vertexArray); + + glUseProgram(_program); + + glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); + glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m); + + glDrawArrays(GL_TRIANGLES, 0, 36); +} + +- (BOOL)loadShaders +{ + GLuint vertShader, fragShader; + NSString *vertShaderPathname, *fragShaderPathname; + + _program = glCreateProgram(); + + vertShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"vsh"]; + if (![self compileShader:&vertShader type:GL_VERTEX_SHADER file:vertShaderPathname]) { + NSLog(@"Failed to compile vertex shader"); + return NO; + } + + fragShaderPathname = [[NSBundle mainBundle] pathForResource:@"Shader" ofType:@"fsh"]; + if (![self compileShader:&fragShader type:GL_FRAGMENT_SHADER file:fragShaderPathname]) { + NSLog(@"Failed to compile fragment shader"); + return NO; + } + + glAttachShader(_program, vertShader); + + glAttachShader(_program, fragShader); + + if (![self linkProgram:_program]) { + NSLog(@"Failed to link program: %d", _program); + + if (vertShader) { + glDeleteShader(vertShader); + vertShader = 0; + } + if (fragShader) { + glDeleteShader(fragShader); + fragShader = 0; + } + if (_program) { + glDeleteProgram(_program); + _program = 0; + } + + return NO; + } + + uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX] = glGetUniformLocation(_program, "modelViewProjectionMatrix"); + uniforms[UNIFORM_NORMAL_MATRIX] = glGetUniformLocation(_program, "normalMatrix"); + + if (vertShader) { + glDetachShader(_program, vertShader); + glDeleteShader(vertShader); + } + if (fragShader) { + glDetachShader(_program, fragShader); + glDeleteShader(fragShader); + } + + return YES; +} + +- (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file +{ + GLint status; + const GLchar *source; + + source = (GLchar *)[[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil] UTF8String]; + if (!source) { + NSLog(@"Failed to load vertex shader"); + return NO; + } + + *shader = glCreateShader(type); + glShaderSource(*shader, 1, &source, NULL); + glCompileShader(*shader); + + glGetShaderiv(*shader, GL_COMPILE_STATUS, &status); + if (status == 0) { + glDeleteShader(*shader); + return NO; + } + + return YES; +} + +- (BOOL)linkProgram:(GLuint)prog +{ + GLint status; + glLinkProgram(prog); + + glGetProgramiv(prog, GL_LINK_STATUS, &status); + if (status == 0) { + return NO; + } + + return YES; +} + +- (BOOL)validateProgram:(GLuint)prog +{ + GLint logLength, status; + + glValidateProgram(prog); + glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength); + if (logLength > 0) { + GLchar *log = (GLchar *)malloc(logLength); + glGetProgramInfoLog(prog, logLength, &logLength, log); + NSLog(@"Program validate log:\n%s", log); + free(log); + } + + glGetProgramiv(prog, GL_VALIDATE_STATUS, &status); + if (status == 0) { + return NO; + } + + return YES; +} + +@end diff --git a/Examples/SKAsyncGLViewController/SKAsyncGLViewController/MultipleInstancesGL3ViewController.h b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/MultipleInstancesGL3ViewController.h new file mode 100644 index 0000000..47314f9 --- /dev/null +++ b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/MultipleInstancesGL3ViewController.h @@ -0,0 +1,13 @@ +// +// ViewController.h +// SKAsyncGLViewController +// +// Created by Stephen Kopylov - Home on 27/04/16. +// Copyright © 2016 test. All rights reserved. +// + +#import + +@interface MultipleInstancesGL3ViewController : UIViewController + +@end diff --git a/Examples/SKAsyncGLViewController/SKAsyncGLViewController/MultipleInstancesGL3ViewController.m b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/MultipleInstancesGL3ViewController.m new file mode 100644 index 0000000..ece53ab --- /dev/null +++ b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/MultipleInstancesGL3ViewController.m @@ -0,0 +1,47 @@ +// +// ViewController.m +// SKAsyncGLViewController +// +// Created by Stephen Kopylov - Home on 27/04/16. +// Copyright © 2016 test. All rights reserved. +// + +#define boris_random(smallNumber, bigNumber) ((((float)(arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * (bigNumber - smallNumber)) + smallNumber) +#define SIDE 150.0f + +#import "MultipleInstancesGL3ViewController.h" +#import "CubeGL3ViewController.h" + +@interface MultipleInstancesGL3ViewController () + +@end + +@implementation MultipleInstancesGL3ViewController { +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.edgesForExtendedLayout = UIRectEdgeNone; +} + + +- (IBAction)buttonTapped:(id)sender +{ + CubeGL3ViewController *vc = [CubeGL3ViewController new]; + + vc.floating = YES; + [self addChildViewController:vc]; + [vc didMoveToParentViewController:self]; + + vc.view.frame = CGRectMake(boris_random(0.0, self.view.frame.size.width - SIDE), boris_random(0.0, self.view.frame.size.height - SIDE), SIDE, SIDE); + vc.view.alpha = 0.0f; + [self.view addSubview:vc.view]; + + [UIView animateWithDuration:0.2 animations:^{ + vc.view.alpha = 1.0f; + }]; +} + +@end diff --git a/Examples/SKAsyncGLViewController/SKAsyncGLViewController/Shader.fsh b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/Shader.fsh new file mode 100644 index 0000000..7fe5805 --- /dev/null +++ b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/Shader.fsh @@ -0,0 +1,17 @@ +// +// Shader.fsh +// test +// +// Created by ramemiso on 2013/09/23. +// Copyright (c) 2013年 ramemiso. All rights reserved. +// + +#version 300 es + +in lowp vec4 colorVarying; +out mediump vec4 fragColor; + +void main() +{ + fragColor = colorVarying; +} diff --git a/Examples/SKAsyncGLViewController/SKAsyncGLViewController/Shader.vsh b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/Shader.vsh new file mode 100644 index 0000000..8c4121b --- /dev/null +++ b/Examples/SKAsyncGLViewController/SKAsyncGLViewController/Shader.vsh @@ -0,0 +1,33 @@ +// +// Shader.vsh +// test +// +// Created by ramemiso on 2013/09/23. +// Copyright (c) 2013年 ramemiso. All rights reserved. +// + +#version 300 es + +#define ATTRIB_POSITION 0 +#define ATTRIB_NORMAL 1 + +layout (location = ATTRIB_POSITION) in vec4 position; +layout (location = ATTRIB_NORMAL) in vec3 normal; + +out mediump vec4 colorVarying; + +uniform mat4 modelViewProjectionMatrix; +uniform mat3 normalMatrix; + +void main() +{ + vec3 eyeNormal = normalize(normalMatrix * normal); + vec3 lightPosition = vec3(0.0, 0.0, 1.0); + vec4 diffuseColor = vec4(0.4, 0.4, 1.0, 1.0); + + float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition))); + + colorVarying = diffuseColor * nDotVP; + + gl_Position = modelViewProjectionMatrix * position; +} diff --git a/README.md b/README.md index da1c47f..2a7aaf2 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ SKAsyncGLViewController - replacement for classical GLKit stack (GLKView + GLKVi It renders all your stuff in background GCD-thread and shows result on main thread. -**Now it uses only OpenGLES2** +**OpenGLES2/OpenGLES3** ![Screenshot](misc/demo.gif) @@ -34,6 +34,9 @@ Download this repo and drop this files into your project ### Usage After installation, inherit your viewController from SKAsyncGLViewController and implement these methods: +:wrench: Select your API version by returning EAGLRenderingAPI value here (default is kEAGLRenderingAPIOpenGLES3) +- **- (EAGLRenderingAPI)getApi** + - **- (void)setupGL** :wrench: This one for setup your GL - create buffers/load shaders/etc here.