OSDN Git Service

Added extra flag paused to IOSGraphics to avoid calling render if the app is paused...
[mikumikustudio/libgdx-mikumikustudio.git] / backends / gdx-backend-iosmonotouch / src / com / badlogic / gdx / backends / ios / IOSGraphics.java
1 /*******************************************************************************\r
2  * Copyright 2011 See AUTHORS file.\r
3  * \r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  * \r
8  *   http://www.apache.org/licenses/LICENSE-2.0\r
9  * \r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  ******************************************************************************/\r
16 \r
17 package com.badlogic.gdx.backends.ios;\r
18 \r
19 import cli.MonoTouch.Foundation.ExportAttribute;\r
20 import cli.MonoTouch.Foundation.NSSet;\r
21 import cli.MonoTouch.CoreAnimation.CAEAGLLayer;\r
22 import cli.MonoTouch.ObjCRuntime.Selector;\r
23 import cli.MonoTouch.OpenGLES.EAGLColorFormat;\r
24 import cli.MonoTouch.OpenGLES.EAGLRenderingAPI;\r
25 import cli.MonoTouch.UIKit.UIDevice;\r
26 import cli.MonoTouch.UIKit.UIEvent;\r
27 import cli.MonoTouch.UIKit.UIScreen;\r
28 import cli.MonoTouch.UIKit.UIUserInterfaceIdiom;\r
29 import cli.OpenTK.FrameEventArgs;\r
30 import cli.OpenTK.Platform.iPhoneOS.iPhoneOSGameView;\r
31 import cli.System.EventArgs;\r
32 import cli.System.Drawing.RectangleF;\r
33 \r
34 import com.badlogic.gdx.Gdx;\r
35 import com.badlogic.gdx.Graphics;\r
36 import com.badlogic.gdx.Graphics.DisplayMode;\r
37 import com.badlogic.gdx.graphics.GL10;\r
38 import com.badlogic.gdx.graphics.GL11;\r
39 import com.badlogic.gdx.graphics.GL20;\r
40 import com.badlogic.gdx.graphics.GLCommon;\r
41 import com.badlogic.gdx.graphics.GLU;\r
42 import com.badlogic.gdx.graphics.Pixmap;\r
43 \r
44 // FIXME add GL 1.x support by ripping Android's classes\r
45 public class IOSGraphics extends iPhoneOSGameView implements Graphics {\r
46 \r
47         private static final String tag = "IOSGraphics";\r
48 \r
49         IOSApplication app;\r
50         IOSInput input;\r
51         GL20 gl20;\r
52         int width;\r
53         int height;\r
54         long lastFrameTime;\r
55         float deltaTime;\r
56         long framesStart;\r
57         int frames;\r
58         int fps;\r
59         BufferFormat bufferFormat;\r
60         String extensions;\r
61 \r
62         private float ppiX = 0;\r
63         private float ppiY = 0;\r
64         private float ppcX = 0;\r
65         private float ppcY = 0;\r
66         private float density = 1;\r
67         \r
68         boolean paused;\r
69 \r
70         public IOSGraphics (RectangleF bounds, IOSApplication app, IOSInput input, GL20 gl20) {\r
71                 super(bounds);\r
72 \r
73                 // setup view and OpenGL\r
74                 width = (int)bounds.get_Width();\r
75                 height = (int)bounds.get_Height();\r
76                 app.debug(tag, bounds.get_Width() + "x" + bounds.get_Height() + ", " + UIScreen.get_MainScreen().get_Scale());\r
77                 this.app = app;\r
78                 this.input = input;\r
79                 set_LayerRetainsBacking(false);\r
80                 set_ContentScaleFactor(1);\r
81                 set_MultipleTouchEnabled(true);\r
82                 set_AutoResize(false);\r
83                 set_LayerColorFormat(EAGLColorFormat.RGB565);\r
84                 set_ContextRenderingApi(EAGLRenderingAPI.wrap(EAGLRenderingAPI.OpenGLES2));\r
85                 // FIXME fix this if we add rgba/depth/stencil flags to IOSApplicationConfiguration\r
86                 bufferFormat = new BufferFormat(5, 6, 5, 0, 16, 0, 0, false);\r
87                 this.gl20 = gl20;\r
88 \r
89                 // determine display density and PPI (PPI values via Wikipedia!)\r
90                 density = 1f;\r
91 \r
92                 if ((UIScreen.get_MainScreen().RespondsToSelector(new Selector("scale")))) {\r
93                         float scale = UIScreen.get_MainScreen().get_Scale();\r
94                         app.debug(tag, "Calculating density, UIScreen.mainScreen.scale: " + scale);\r
95                         if (scale == 2f) density = 2f;\r
96                 }\r
97 \r
98                 int ppi;\r
99                 if (UIDevice.get_CurrentDevice().get_UserInterfaceIdiom().Value == UIUserInterfaceIdiom.Pad) {\r
100                         // iPad\r
101                         ppi = Math.round(density * 132);\r
102                 } else {\r
103                         // iPhone or iPodTouch\r
104                         ppi = Math.round(density * 163);\r
105                 }\r
106                 ppiX = ppi;\r
107                 ppiY = ppi;\r
108                 ppcX = ppiX / 2.54f;\r
109                 ppcY = ppcY / 2.54f;\r
110                 app.debug(tag, "Display: ppi=" + ppi + ", density=" + density);\r
111 \r
112                 // time + FPS\r
113                 lastFrameTime = System.nanoTime();\r
114                 framesStart = lastFrameTime;\r
115                 \r
116                 paused = false;\r
117         }\r
118 \r
119         @Override\r
120         protected void ConfigureLayer (CAEAGLLayer layer) {\r
121                 layer.set_Opaque(true);\r
122                 super.ConfigureLayer(layer);\r
123         }\r
124 \r
125         @Override\r
126         protected void OnLoad (EventArgs arg0) {\r
127                 super.OnLoad(arg0);\r
128                 MakeCurrent();\r
129                 app.listener.create();\r
130         }\r
131         \r
132         public void resume() {\r
133                 paused = false;\r
134         }\r
135         \r
136         public void pause() {\r
137                 paused = true;\r
138         }\r
139 \r
140         @Override\r
141         protected void OnRenderFrame (FrameEventArgs arg0) {\r
142                 super.OnRenderFrame(arg0);\r
143                 \r
144                 if (paused)\r
145                         return;\r
146 \r
147                 long time = System.nanoTime();\r
148                 deltaTime = (time - lastFrameTime) / 1000000000.0f;\r
149                 lastFrameTime = time;\r
150 \r
151                 frames++;\r
152                 if (time - framesStart >= 1000000000l) {\r
153                         framesStart = time;\r
154                         fps = frames;\r
155                         frames = 0;\r
156                 }\r
157 \r
158                 MakeCurrent();\r
159                 ((IOSInput)Gdx.input).processEvents();\r
160                 app.listener.render();\r
161                 SwapBuffers();\r
162         }\r
163         \r
164         @Override\r
165         protected void OnUpdateFrame (FrameEventArgs frameEventArgs) {\r
166                 super.OnUpdateFrame(frameEventArgs);\r
167                 app.processRunnables();\r
168         }\r
169 \r
170         @Override\r
171         protected void OnResize (EventArgs event) {\r
172                 super.OnResize(event);\r
173 \r
174                 // not used on iOS\r
175                 // FIXME resize could happen if app supports both portrait and landscape, so this should be implemented\r
176                 Gdx.app.debug("IOSGraphics", "iOS OnResize(...) is not implement (don't think it is needed?).");\r
177         }\r
178 \r
179         @ExportAttribute.Annotation("layerClass")\r
180         static cli.MonoTouch.ObjCRuntime.Class LayerClass () {\r
181                 return iPhoneOSGameView.GetLayerClass();\r
182         }\r
183 \r
184         @Override\r
185         public boolean isGL11Available () {\r
186                 return false;\r
187         }\r
188 \r
189         @Override\r
190         public boolean isGL20Available () {\r
191                 return true;\r
192         }\r
193 \r
194         @Override\r
195         public GLCommon getGLCommon () {\r
196                 return gl20;\r
197         }\r
198 \r
199         @Override\r
200         public GL10 getGL10 () {\r
201                 return null;\r
202         }\r
203 \r
204         @Override\r
205         public GL11 getGL11 () {\r
206                 return null;\r
207         }\r
208 \r
209         @Override\r
210         public GL20 getGL20 () {\r
211                 return gl20;\r
212         }\r
213 \r
214         @Override\r
215         public GLU getGLU () {\r
216                 // FIXME implement this\r
217                 return null;\r
218         }\r
219 \r
220         @Override\r
221         public int getWidth () {\r
222                 return width;\r
223         }\r
224 \r
225         @Override\r
226         public int getHeight () {\r
227                 return height;\r
228         }\r
229 \r
230         @Override\r
231         public float getDeltaTime () {\r
232                 return deltaTime;\r
233         }\r
234 \r
235         @Override\r
236         public float getRawDeltaTime () {\r
237                 return deltaTime;\r
238         }\r
239 \r
240         @Override\r
241         public int getFramesPerSecond () {\r
242                 return fps;\r
243         }\r
244 \r
245         @Override\r
246         public GraphicsType getType () {\r
247                 return GraphicsType.iOSGL;\r
248         }\r
249 \r
250         @Override\r
251         public float getPpiX () {\r
252                 return ppiX;\r
253         }\r
254 \r
255         @Override\r
256         public float getPpiY () {\r
257                 return ppiY;\r
258         }\r
259 \r
260         @Override\r
261         public float getPpcX () {\r
262                 return ppcX;\r
263         }\r
264 \r
265         @Override\r
266         public float getPpcY () {\r
267                 return ppcY;\r
268         }\r
269 \r
270         /** Returns the display density.\r
271          * \r
272          * @return 1.0f for non-retina devices, 2.0f for retina devices. */\r
273         @Override\r
274         public float getDensity () {\r
275                 return density;\r
276         }\r
277 \r
278         @Override\r
279         public boolean supportsDisplayModeChange () {\r
280                 return false;\r
281         }\r
282 \r
283         @Override\r
284         public DisplayMode[] getDisplayModes () {\r
285                 return new DisplayMode[] {getDesktopDisplayMode()};\r
286         }\r
287 \r
288         @Override\r
289         public DisplayMode getDesktopDisplayMode () {\r
290                 return new IOSDisplayMode(getWidth(), getHeight(), 60, 0);\r
291         }\r
292 \r
293         private static class IOSDisplayMode extends DisplayMode {\r
294                 protected IOSDisplayMode (int width, int height, int refreshRate, int bitsPerPixel) {\r
295                         super(width, height, refreshRate, bitsPerPixel);\r
296                 }\r
297         }\r
298 \r
299         @Override\r
300         public boolean setDisplayMode (DisplayMode displayMode) {\r
301                 return false;\r
302         }\r
303 \r
304         @Override\r
305         public boolean setDisplayMode (int width, int height, boolean fullscreen) {\r
306                 return false;\r
307         }\r
308 \r
309         @Override\r
310         public void setTitle (String title) {\r
311         }\r
312 \r
313         @Override\r
314         public void setVSync (boolean vsync) {\r
315         }\r
316 \r
317         @Override\r
318         public BufferFormat getBufferFormat () {\r
319                 return bufferFormat;\r
320         }\r
321 \r
322         @Override\r
323         public boolean supportsExtension (String extension) {\r
324                 if (extensions == null) extensions = Gdx.gl.glGetString(GL10.GL_EXTENSIONS);\r
325                 return extensions.contains(extension);\r
326         }\r
327 \r
328         @Override\r
329         public void setContinuousRendering (boolean isContinuous) {\r
330                 // FIXME implement this if possible\r
331         }\r
332 \r
333         @Override\r
334         public boolean isContinuousRendering () {\r
335                 // FIXME implement this if possible\r
336                 return true;\r
337         }\r
338 \r
339         @Override\r
340         public void requestRendering () {\r
341                 // FIXME implement this if possible\r
342         }\r
343 \r
344         @Override\r
345         public boolean isFullscreen () {\r
346                 return true;\r
347         }\r
348 \r
349         @Override\r
350         public void TouchesBegan (NSSet touches, UIEvent event) {\r
351                 super.TouchesBegan(touches, event);\r
352                 input.touchDown(touches, event);\r
353         }\r
354 \r
355         @Override\r
356         public void TouchesCancelled (NSSet touches, UIEvent event) {\r
357                 super.TouchesCancelled(touches, event);\r
358                 input.touchUp(touches, event);\r
359         }\r
360 \r
361         @Override\r
362         public void TouchesEnded (NSSet touches, UIEvent event) {\r
363                 super.TouchesEnded(touches, event);\r
364                 input.touchUp(touches, event);\r
365         }\r
366 \r
367         @Override\r
368         public void TouchesMoved (NSSet touches, UIEvent event) {\r
369                 super.TouchesMoved(touches, event);\r
370                 input.touchMoved(touches, event);\r
371         }\r
372 }\r