0028148: Samples - add 3D Viewer sample for iOS platform
[occt.git] / samples / ios / UIKitSample / UIKitSample / GLView.mm
1 // Copyright (c) 2017 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #import <Foundation/Foundation.h>
15
16 #import "GLView.h"
17 #import "GLViewController.h"
18
19 @implementation GLView
20
21 // =======================================================================
22 // function : layerClass
23 // purpose  :
24 // =======================================================================
25 + (Class)layerClass
26 {
27   return [CAEAGLLayer class];
28 }
29
30 // =======================================================================
31 // function : setupLayer
32 // purpose  :
33 // =======================================================================
34 - (void)setupLayer
35 {
36   CAEAGLLayer* anEAGLLayer = (CAEAGLLayer*) self.layer;
37   anEAGLLayer.opaque = YES;
38   anEAGLLayer.contentsScale = [[UIScreen mainScreen] scale];
39 }
40
41 // =======================================================================
42 // function : setupContext
43 // purpose  :
44 // =======================================================================
45 - (void)setupContext
46 {
47   EAGLRenderingAPI aRendApi = kEAGLRenderingAPIOpenGLES2;
48   myGLContext = [[EAGLContext alloc] initWithAPI:aRendApi];
49   if (!myGLContext) {
50     NSLog(@"Failed to initialize OpenGLES 2.0 context");
51   }
52   
53   if (![EAGLContext setCurrentContext:myGLContext]) {
54     NSLog(@"Failed to set current OpenGL context");
55   }
56 }
57
58 // =======================================================================
59 // function : createBuffers
60 // purpose  :
61 // =======================================================================
62 - (void) createBuffers
63 {
64   glGenFramebuffers(1, &myFrameBuffer);
65   glBindFramebuffer(GL_FRAMEBUFFER, myFrameBuffer);
66   glGenRenderbuffers(1, &myRenderBuffer);
67   glBindRenderbuffer(GL_RENDERBUFFER, myRenderBuffer);
68   
69   [myGLContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
70   glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, myRenderBuffer);
71   glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &myBackingWidth);
72   glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &myBackingHeight);
73   
74   glGenRenderbuffers(1, &myDepthBuffer);
75   glBindRenderbuffer(GL_RENDERBUFFER, myDepthBuffer);
76   glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, myBackingWidth, myBackingHeight);
77   glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, myDepthBuffer);
78 }
79
80 // =======================================================================
81 // function : destroyBuffers
82 // purpose  :
83 // =======================================================================
84 - (void) destroyBuffers
85 {
86   glDeleteFramebuffers(1, &myFrameBuffer);
87   myFrameBuffer = 0;
88   glDeleteRenderbuffers(1, &myRenderBuffer);
89   myRenderBuffer = 0;
90   glDeleteRenderbuffers(1, &myDepthBuffer);
91   myDepthBuffer = 0;
92 }
93
94 // =======================================================================
95 // function : drawView
96 // purpose  :
97 // =======================================================================
98 - (void) drawView
99 {
100   glBindFramebuffer(GL_FRAMEBUFFER, myFrameBuffer);
101   
102   [myController Draw];
103   
104   glBindRenderbuffer(GL_RENDERBUFFER, myRenderBuffer);
105   [myGLContext presentRenderbuffer:GL_RENDERBUFFER];
106 }
107
108 // =======================================================================
109 // function : layoutSubviews
110 // purpose  :
111 // =======================================================================
112 - (void) layoutSubviews
113 {
114   [EAGLContext setCurrentContext:myGLContext];
115   
116   [self destroyBuffers];
117   [self createBuffers];
118   [self drawView];
119   
120   glBindRenderbuffer(GL_RENDERBUFFER, myRenderBuffer);
121   
122   glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &myBackingWidth);
123   glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &myBackingHeight);
124   
125   if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
126   {
127     NSLog(@"Failed to make complete framebuffer object %u",
128           glCheckFramebufferStatus(GL_FRAMEBUFFER));
129   }
130   
131   glViewport(0, 0, myBackingWidth, myBackingHeight);
132   
133   [myController Setup];
134 }
135
136 // =======================================================================
137 // function : init
138 // purpose  :
139 // =======================================================================
140 - (id) init
141 {
142   self = [super init];
143   
144   if (self) {
145     [self setupLayer];
146     [self setupContext];
147     
148     myController = NULL;
149     
150     myBackingWidth  = 0;
151     myBackingHeight = 0;
152     myFrameBuffer   = 0;
153     myRenderBuffer  = 0;
154     myDepthBuffer   = 0;
155   }
156   
157   return self;
158 }
159
160 @end