OSDN Git Service

scene2d.ui Disableable interface.
[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.LifecycleListener;\r
37 import com.badlogic.gdx.Graphics.DisplayMode;\r
38 import com.badlogic.gdx.graphics.GL10;\r
39 import com.badlogic.gdx.graphics.GL11;\r
40 import com.badlogic.gdx.graphics.GL20;\r
41 import com.badlogic.gdx.graphics.GLCommon;\r
42 import com.badlogic.gdx.graphics.Pixmap;\r
43 import com.badlogic.gdx.utils.Array;\r
44 \r
45 // FIXME add GL 1.x support by ripping Android's classes\r
46 public class IOSGraphics extends iPhoneOSGameView implements Graphics {\r
47 \r
48         private static final String tag = "IOSGraphics";\r
49 \r
50         IOSApplication app;\r
51         IOSInput input;\r
52         GL20 gl20;\r
53         int width;\r
54         int height;\r
55         long lastFrameTime;\r
56         float deltaTime;\r
57         long framesStart;\r
58         int frames;\r
59         int fps;\r
60         BufferFormat bufferFormat;\r
61         String extensions;\r
62 \r
63         private float ppiX = 0;\r
64         private float ppiY = 0;\r
65         private float ppcX = 0;\r
66         private float ppcY = 0;\r
67         private float density = 1;\r
68         \r
69         volatile boolean created;\r
70         volatile boolean paused;\r
71         boolean wasPaused;\r
72 \r
73         public IOSGraphics (RectangleF bounds, IOSApplication app, IOSInput input, GL20 gl20) {\r
74                 super(bounds);\r
75 \r
76                 // setup view and OpenGL\r
77                 width = (int)bounds.get_Width();\r
78                 height = (int)bounds.get_Height();\r
79                 app.debug(tag, bounds.get_Width() + "x" + bounds.get_Height() + ", " + UIScreen.get_MainScreen().get_Scale());\r
80                 this.app = app;\r
81                 this.input = input;\r
82                 set_LayerRetainsBacking(false);\r
83                 set_ContentScaleFactor(1);\r
84                 set_MultipleTouchEnabled(true);\r
85                 set_AutoResize(false);\r
86                 set_LayerColorFormat(EAGLColorFormat.RGB565);\r
87                 set_ContextRenderingApi(EAGLRenderingAPI.wrap(EAGLRenderingAPI.OpenGLES2));\r
88                 // FIXME fix this if we add rgba/depth/stencil flags to IOSApplicationConfiguration\r
89                 bufferFormat = new BufferFormat(5, 6, 5, 0, 16, 0, 0, false);\r
90                 this.gl20 = gl20;\r
91 \r
92                 // determine display density and PPI (PPI values via Wikipedia!)\r
93                 density = 1f;\r
94 \r
95                 if ((UIScreen.get_MainScreen().RespondsToSelector(new Selector("scale")))) {\r
96                         float scale = UIScreen.get_MainScreen().get_Scale();\r
97                         app.debug(tag, "Calculating density, UIScreen.mainScreen.scale: " + scale);\r
98                         if (scale == 2f) density = 2f;\r
99                 }\r
100 \r
101                 int ppi;\r
102                 if (UIDevice.get_CurrentDevice().get_UserInterfaceIdiom().Value == UIUserInterfaceIdiom.Pad) {\r
103                         // iPad\r
104                         ppi = Math.round(density * 132);\r
105                 } else {\r
106                         // iPhone or iPodTouch\r
107                         ppi = Math.round(density * 163);\r
108                 }\r
109                 ppiX = ppi;\r
110                 ppiY = ppi;\r
111                 ppcX = ppiX / 2.54f;\r
112                 ppcY = ppcY / 2.54f;\r
113                 app.debug(tag, "Display: ppi=" + ppi + ", density=" + density);\r
114 \r
115                 // time + FPS\r
116                 lastFrameTime = System.nanoTime();\r
117                 framesStart = lastFrameTime;\r
118                 \r
119                 paused = false;\r
120                 wasPaused = true;\r
121         }\r
122 \r
123         @Override\r
124         protected void ConfigureLayer (CAEAGLLayer layer) {\r
125                 layer.set_Opaque(true);\r
126                 super.ConfigureLayer(layer);\r
127         }\r
128 \r
129         @Override\r
130         protected void OnLoad (EventArgs arg0) {\r
131                 super.OnLoad(arg0);\r
132                 MakeCurrent();\r
133                 app.listener.create();\r
134                 app.listener.resize(width, height);\r
135                 created = true;\r
136         }\r
137         \r
138         public void resume() {\r
139                 paused = false;\r
140         }\r
141         \r
142         public void pause() {\r
143                 paused = true;\r
144         }\r
145 \r
146         @Override\r
147         protected void OnRenderFrame (FrameEventArgs arg0) {\r
148                 super.OnRenderFrame(arg0);\r
149                 if (paused) {\r
150                         if (!wasPaused) {\r
151                                 Array<LifecycleListener> listeners = app.lifecycleListeners;\r
152                                 synchronized(listeners) {\r
153                                         for(LifecycleListener listener: listeners) {\r
154                                                 listener.pause();\r
155                                         }\r
156                                 }\r
157                                 app.listener.pause();\r
158                                 wasPaused = true;\r
159                         }\r
160                         return;\r
161                 } else {\r
162                         if (wasPaused && !created) {\r
163                                 Array<LifecycleListener> listeners = app.lifecycleListeners;\r
164                                 synchronized(listeners) {\r
165                                         for(LifecycleListener listener: listeners) {\r
166                                                 listener.resume();\r
167                                         }\r
168                                 }\r
169                                 app.listener.resume();\r
170                                 wasPaused = false;\r
171                         } else {\r
172                                 if(created) {\r
173                                         wasPaused = false;\r
174                                         created = false;\r
175                                 }\r
176                         }\r
177                 }\r
178 \r
179                 long time = System.nanoTime();\r
180                 deltaTime = (time - lastFrameTime) / 1000000000.0f;\r
181                 lastFrameTime = time;\r
182 \r
183                 frames++;\r
184                 if (time - framesStart >= 1000000000l) {\r
185                         framesStart = time;\r
186                         fps = frames;\r
187                         frames = 0;\r
188                 }\r
189 \r
190                 MakeCurrent();\r
191                 ((IOSInput)Gdx.input).processEvents();\r
192                 app.listener.render();\r
193                 SwapBuffers();\r
194         }\r
195         \r
196         @Override\r
197         protected void OnUpdateFrame (FrameEventArgs frameEventArgs) {\r
198                 super.OnUpdateFrame(frameEventArgs);\r
199                 app.processRunnables();\r
200         }\r
201 \r
202         @Override\r
203         protected void OnResize (EventArgs event) {\r
204                 super.OnResize(event);\r
205                 MakeCurrent();\r
206                 // not used on iOS\r
207                 // FIXME resize could happen if app supports both portrait and landscape, so this should be implemented\r
208                 Gdx.app.debug("IOSGraphics", "iOS OnResize(...) is not implement (don't think it is needed?).");\r
209         }\r
210 \r
211         @ExportAttribute.Annotation("layerClass")\r
212         static cli.MonoTouch.ObjCRuntime.Class LayerClass () {\r
213                 return iPhoneOSGameView.GetLayerClass();\r
214         }\r
215 \r
216         @Override\r
217         public boolean isGL11Available () {\r
218                 return false;\r
219         }\r
220 \r
221         @Override\r
222         public boolean isGL20Available () {\r
223                 return true;\r
224         }\r
225 \r
226         @Override\r
227         public GLCommon getGLCommon () {\r
228                 return gl20;\r
229         }\r
230 \r
231         @Override\r
232         public GL10 getGL10 () {\r
233                 return null;\r
234         }\r
235 \r
236         @Override\r
237         public GL11 getGL11 () {\r
238                 return null;\r
239         }\r
240 \r
241         @Override\r
242         public GL20 getGL20 () {\r
243                 return gl20;\r
244         }\r
245 \r
246         @Override\r
247         public int getWidth () {\r
248                 return width;\r
249         }\r
250 \r
251         @Override\r
252         public int getHeight () {\r
253                 return height;\r
254         }\r
255 \r
256         @Override\r
257         public float getDeltaTime () {\r
258                 return deltaTime;\r
259         }\r
260 \r
261         @Override\r
262         public float getRawDeltaTime () {\r
263                 return deltaTime;\r
264         }\r
265 \r
266         @Override\r
267         public int getFramesPerSecond () {\r
268                 return fps;\r
269         }\r
270 \r
271         @Override\r
272         public GraphicsType getType () {\r
273                 return GraphicsType.iOSGL;\r
274         }\r
275 \r
276         @Override\r
277         public float getPpiX () {\r
278                 return ppiX;\r
279         }\r
280 \r
281         @Override\r
282         public float getPpiY () {\r
283                 return ppiY;\r
284         }\r
285 \r
286         @Override\r
287         public float getPpcX () {\r
288                 return ppcX;\r
289         }\r
290 \r
291         @Override\r
292         public float getPpcY () {\r
293                 return ppcY;\r
294         }\r
295 \r
296         /** Returns the display density.\r
297          * \r
298          * @return 1.0f for non-retina devices, 2.0f for retina devices. */\r
299         @Override\r
300         public float getDensity () {\r
301                 return density;\r
302         }\r
303 \r
304         @Override\r
305         public boolean supportsDisplayModeChange () {\r
306                 return false;\r
307         }\r
308 \r
309         @Override\r
310         public DisplayMode[] getDisplayModes () {\r
311                 return new DisplayMode[] {getDesktopDisplayMode()};\r
312         }\r
313 \r
314         @Override\r
315         public DisplayMode getDesktopDisplayMode () {\r
316                 return new IOSDisplayMode(getWidth(), getHeight(), 60, 0);\r
317         }\r
318 \r
319         private static class IOSDisplayMode extends DisplayMode {\r
320                 protected IOSDisplayMode (int width, int height, int refreshRate, int bitsPerPixel) {\r
321                         super(width, height, refreshRate, bitsPerPixel);\r
322                 }\r
323         }\r
324 \r
325         @Override\r
326         public boolean setDisplayMode (DisplayMode displayMode) {\r
327                 return false;\r
328         }\r
329 \r
330         @Override\r
331         public boolean setDisplayMode (int width, int height, boolean fullscreen) {\r
332                 return false;\r
333         }\r
334 \r
335         @Override\r
336         public void setTitle (String title) {\r
337         }\r
338 \r
339         @Override\r
340         public void setVSync (boolean vsync) {\r
341         }\r
342 \r
343         @Override\r
344         public BufferFormat getBufferFormat () {\r
345                 return bufferFormat;\r
346         }\r
347 \r
348         @Override\r
349         public boolean supportsExtension (String extension) {\r
350                 if (extensions == null) extensions = Gdx.gl.glGetString(GL10.GL_EXTENSIONS);\r
351                 return extensions.contains(extension);\r
352         }\r
353 \r
354         @Override\r
355         public void setContinuousRendering (boolean isContinuous) {\r
356                 // FIXME implement this if possible\r
357         }\r
358 \r
359         @Override\r
360         public boolean isContinuousRendering () {\r
361                 // FIXME implement this if possible\r
362                 return true;\r
363         }\r
364 \r
365         @Override\r
366         public void requestRendering () {\r
367                 // FIXME implement this if possible\r
368         }\r
369 \r
370         @Override\r
371         public boolean isFullscreen () {\r
372                 return true;\r
373         }\r
374 \r
375         @Override\r
376         public void TouchesBegan (NSSet touches, UIEvent event) {\r
377                 super.TouchesBegan(touches, event);\r
378                 input.touchDown(touches, event);\r
379         }\r
380 \r
381         @Override\r
382         public void TouchesCancelled (NSSet touches, UIEvent event) {\r
383                 super.TouchesCancelled(touches, event);\r
384                 input.touchUp(touches, event);\r
385         }\r
386 \r
387         @Override\r
388         public void TouchesEnded (NSSet touches, UIEvent event) {\r
389                 super.TouchesEnded(touches, event);\r
390                 input.touchUp(touches, event);\r
391         }\r
392 \r
393         @Override\r
394         public void TouchesMoved (NSSet touches, UIEvent event) {\r
395                 super.TouchesMoved(touches, event);\r
396                 input.touchMoved(touches, event);\r
397         }\r
398 }\r