Pārlūkot izejas kodu

Merge branch 'master' of https://github.com/okamstudio/godot

Juan Linietsky 10 gadi atpakaļ
vecāks
revīzija
bd736e5af2

+ 2 - 0
platform/iphone/app_delegate.mm

@@ -236,6 +236,8 @@ static int frame_count = 0;
 	view_controller.view = glView;
 	window.rootViewController = view_controller;
 
+	glView.useCADisplayLink = bool(GLOBAL_DEF("display.iOS/use_cadisplaylink",true)) ? YES : NO;
+	printf("cadisaplylink: %d", glView.useCADisplayLink);
 	glView.animationInterval = 1.0 / kRenderingFrequency;
 	[glView startAnimation];
 	

+ 4 - 5
platform/iphone/gl_view.h

@@ -34,8 +34,6 @@
 #import <MediaPlayer/MediaPlayer.h>
 #import <AVFoundation/AVFoundation.h>
 
-#define USE_CADISPLAYLINK      0   //iOS version 3.1+ is required
-
 @protocol GLViewDelegate;
 
 @interface GLView : UIView<UIKeyInput>
@@ -53,13 +51,13 @@
 	// OpenGL name for the depth buffer that is attached to viewFramebuffer, if it exists (0 if it does not exist)
 	GLuint depthRenderbuffer;
 	
-#if USE_CADISPLAYLINK
+	BOOL useCADisplayLink;
 	// CADisplayLink available on 3.1+ synchronizes the animation timer & drawing with the refresh rate of the display, only supports animation intervals of 1/60 1/30 & 1/15
 	CADisplayLink *displayLink;
-#else
+
 	// An animation timer that, when animation is started, will periodically call -drawView at the given rate.
+	// Only used if CADisplayLink is not
 	NSTimer *animationTimer;
-#endif
 	
 	NSTimeInterval animationInterval;
 	
@@ -104,6 +102,7 @@
 - (void)audioRouteChangeListenerCallback:(NSNotification*)notification;
 
 @property NSTimeInterval animationInterval;
+@property(nonatomic, assign) BOOL useCADisplayLink;
 
 @end
 

+ 38 - 37
platform/iphone/gl_view.mm

@@ -334,13 +334,15 @@ static void clear_touches() {
 	delegateSetup = ![delegate respondsToSelector:@selector(setupView:)];
 }
 
+@synthesize useCADisplayLink;
+
 // If our view is resized, we'll be asked to layout subviews.
 // This is the perfect opportunity to also update the framebuffer so that it is
 // the same size as our display area.
 
 -(void)layoutSubviews
 {
-	printf("HERE\n");
+	//printf("HERE\n");
 	[EAGLContext setCurrentContext:context];
 	[self destroyFramebuffer];
 	[self createFramebuffer];
@@ -418,19 +420,21 @@ static void clear_touches() {
 		return;
 	active = TRUE;
 	printf("start animation!\n");
-#if USE_CADISPLAYLINK
-	// Approximate frame rate
-	// assumes device refreshes at 60 fps
-	int frameInterval = (int) floor(animationInterval * 60.0f);
-
-	displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawView)];
-	[displayLink setFrameInterval:frameInterval];
-
-	// Setup DisplayLink in main thread
-	[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
-#else
-	animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval target:self selector:@selector(drawView) userInfo:nil repeats:YES];
-#endif
+	if (useCADisplayLink) {
+
+		// Approximate frame rate
+		// assumes device refreshes at 60 fps
+		int frameInterval = (int) floor(animationInterval * 60.0f);
+
+		displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawView)];
+		[displayLink setFrameInterval:frameInterval];
+
+		// Setup DisplayLink in main thread
+		[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
+	}
+	else {
+		animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval target:self selector:@selector(drawView) userInfo:nil repeats:YES];
+	}
 
 	if (video_playing)
 	{
@@ -444,13 +448,16 @@ static void clear_touches() {
 		return;
 	active = FALSE;
 	printf("******** stop animation!\n");
-#if USE_CADISPLAYLINK
-	[displayLink invalidate];
-	displayLink = nil;
-#else
-	[animationTimer invalidate];
-	animationTimer = nil;
-#endif
+
+	if (useCADisplayLink) {
+		[displayLink invalidate];
+		displayLink = nil;
+	}
+	else {
+		[animationTimer invalidate];
+		animationTimer = nil;
+	}
+
 	clear_touches();
 
 	if (video_playing)
@@ -462,13 +469,7 @@ static void clear_touches() {
 - (void)setAnimationInterval:(NSTimeInterval)interval
 {
 	animationInterval = interval;
-	
-#if USE_CADISPLAYLINK
-	if(displayLink)
-#else
-	if(animationTimer)
-#endif
-	{
+	if ( (useCADisplayLink && displayLink) || ( !useCADisplayLink && animationTimer ) ) {
 		[self stopAnimation];
 		[self startAnimation];
 	}
@@ -477,16 +478,16 @@ static void clear_touches() {
 // Updates the OpenGL view when the timer fires
 - (void)drawView
 {
-#if USE_CADISPLAYLINK
-	// Pause the CADisplayLink to avoid recursion
-	[displayLink setPaused: YES];
+	if (useCADisplayLink) {
+		// Pause the CADisplayLink to avoid recursion
+		[displayLink setPaused: YES];
 
-	// Process all input events
-	while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, TRUE) == kCFRunLoopRunHandledSource);
+		// Process all input events
+		while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, TRUE) == kCFRunLoopRunHandledSource);
 
-	// We are good to go, resume the CADisplayLink
-	[displayLink setPaused: NO];
-#endif
+		// We are good to go, resume the CADisplayLink
+		[displayLink setPaused: NO];
+	}
 
 	if (!active) {
 		printf("draw view not active!\n");
@@ -632,7 +633,7 @@ static void clear_touches() {
 		case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
 			NSLog(@"AVAudioSessionRouteChangeReasonOldDeviceUnavailable");
 			NSLog(@"Headphone/Line was pulled. Resuming video play....");
-			if (_is_video_playing) {
+			if (_is_video_playing()) {
 
 				dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5f * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
 							[_instance.avPlayer play]; // NOTE: change this line according your current player implementation

+ 1 - 0
platform/iphone/globals/global_defaults.cpp

@@ -9,4 +9,5 @@ void register_iphone_global_defaults() {
 	GLOBAL_DEF("rasterizer.iOS/fp16_framebuffer",false);
 	GLOBAL_DEF("display.iOS/driver","GLES2");
 	Globals::get_singleton()->set_custom_property_info("display.iOS/driver",PropertyInfo(Variant::STRING,"display.iOS/driver",PROPERTY_HINT_ENUM,"GLES1,GLES2"));
+	GLOBAL_DEF("display.iOS/use_cadisplaylink",true);
 }

+ 8 - 2
platform/x11/context_gl_x11.cpp

@@ -46,7 +46,6 @@ struct ContextGL_X11_Private {
 	::GLXContext glx_context;
 };
 
-
 void ContextGL_X11::release_current() {
 
 	glXMakeCurrent(x11_display, None, NULL);
@@ -56,10 +55,12 @@ void ContextGL_X11::make_current() {
 
 	glXMakeCurrent(x11_display, x11_window, p->glx_context);
 }
+
 void ContextGL_X11::swap_buffers() {
 
 	glXSwapBuffers(x11_display,x11_window);
 }
+
 /*
 static GLWrapperFuncPtr wrapper_get_proc_address(const char* p_function) {
 
@@ -154,6 +155,9 @@ Error ContextGL_X11::initialize() {
 */
 	//glXMakeCurrent(x11_display, None, NULL);
 
+	XFree( vi );
+	XFree( fbc );
+
 	return OK;
 }
 
@@ -164,12 +168,12 @@ int ContextGL_X11::get_window_width() {
 	
 	return xwa.width;
 }
+
 int ContextGL_X11::get_window_height() {
 	XWindowAttributes xwa;
 	XGetWindowAttributes(x11_display,x11_window,&xwa);
 	
 	return xwa.height;
-
 }
 
 
@@ -189,6 +193,8 @@ ContextGL_X11::ContextGL_X11(::Display *p_x11_display,::Window &p_x11_window,con
 
 
 ContextGL_X11::~ContextGL_X11() {
+	release_current();
+	glXDestroyContext( x11_display, p->glx_context );
 
 	memdelete( p );
 }

+ 28 - 38
platform/x11/os_x11.cpp

@@ -73,20 +73,18 @@
 #undef CursorShape
 
 int OS_X11::get_video_driver_count() const {
-
 	return 1;
 }
-const char * OS_X11::get_video_driver_name(int p_driver) const {
 
+const char * OS_X11::get_video_driver_name(int p_driver) const {
 	return "GLES2";
 }
-OS::VideoMode OS_X11::get_default_video_mode() const {
 
+OS::VideoMode OS_X11::get_default_video_mode() const {
 	return OS::VideoMode(800,600,false);
 }
 
 int OS_X11::get_audio_driver_count() const {
-
     return AudioDriverManagerSW::get_driver_count();
 }
 
@@ -153,6 +151,7 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi
 			
 			XFree (xim_styles);
 		}
+		XFree( imvalret );
 	}
 
 	/*
@@ -256,7 +255,6 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi
 	}
 #endif
 
-
 	AudioDriverManagerSW::get_driver(p_audio_driver)->set_singleton();
 
 	audio_driver_index=p_audio_driver;
@@ -351,6 +349,7 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi
 	for(int i=0;i<CURSOR_MAX;i++) {
 
 		cursors[i]=None;
+		img[i]=NULL;
 	}
 
 	current_cursor=CURSOR_ARROW;
@@ -379,16 +378,15 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi
 				"question_arrow"
 			};
 
-			XcursorImage *img = XcursorLibraryLoadImage(cursor_file[i],cursor_theme,cursor_size);
-			if (img) {
-				cursors[i]=XcursorImageLoadCursor(x11_display,img);
+			img[i] = XcursorLibraryLoadImage(cursor_file[i],cursor_theme,cursor_size);
+			if (img[i]) {
+				cursors[i]=XcursorImageLoadCursor(x11_display,img[i]);
 				//print_line("found cursor: "+String(cursor_file[i])+" id "+itos(cursors[i]));
 			} else {
 				if (OS::is_stdout_verbose())
 					print_line("failed cursor: "+String(cursor_file[i]));
 			}
 		}
-
 	}
 
 
@@ -399,9 +397,9 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi
 		 XColor col;
 		 Cursor cursor;
 
-		 cursormask = XCreatePixmap(x11_display, RootWindow(x11_display,DefaultScreen(x11_display)), 1, 1, 1);
-		 xgc.function = GXclear;
-		 gc = XCreateGC(x11_display, cursormask, GCFunction, &xgc);
+		cursormask = XCreatePixmap(x11_display, RootWindow(x11_display,DefaultScreen(x11_display)), 1, 1, 1);
+		xgc.function = GXclear;
+		gc = XCreateGC(x11_display, cursormask, GCFunction, &xgc);
 		XFillRectangle(x11_display, cursormask, gc, 0, 0, 1, 1);
 		col.pixel = 0;
 		col.red = 0;
@@ -437,14 +435,8 @@ void OS_X11::initialize(const VideoMode& p_desired,int p_video_driver,int p_audi
 	probe_joystick();
 
 	_ensure_data_dir();
-
-	net_wm_icon = XInternAtom(x11_display, "_NET_WM_ICON", False);
-
-
-
-	//printf("got map notify\n");
-		
 }
+
 void OS_X11::finalize() {
 
 	if(main_loop)
@@ -476,14 +468,26 @@ void OS_X11::finalize() {
 
 	memdelete(input);
 
+	XUnmapWindow( x11_display, x11_window );
+	XDestroyWindow( x11_display, x11_window );
+
 #if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED)
 	memdelete(context_gl);
 #endif
-	
+	for(int i=0;i<CURSOR_MAX;i++) {
+		if( cursors[i] != None )
+			XFreeCursor( x11_display, cursors[i] );		
+		if( img[i] != NULL )
+			XcursorImageDestroy( img[i] );
+	};	
+
+	XDestroyIC( xic );
+	XCloseIM( xim );
 
 	XCloseDisplay(x11_display);
 	if (xmbstring)
 		memfree(xmbstring);
+
 		
 	args.clear();
 }
@@ -559,37 +563,29 @@ void OS_X11::warp_mouse_pos(const Point2& p_to) {
 }
 
 OS::MouseMode OS_X11::get_mouse_mode() const {
-
 	return mouse_mode;
 }
 
-
-
 int OS_X11::get_mouse_button_state() const {
 	return last_button_state;
 }
 
 Point2 OS_X11::get_mouse_pos() const {
-
 	return last_mouse_pos;
 }
 
 void OS_X11::set_window_title(const String& p_title) {
-
 	XStoreName(x11_display,x11_window,p_title.utf8().get_data());
 }
 
 void OS_X11::set_video_mode(const VideoMode& p_video_mode,int p_screen) {
-
-
 }
-OS::VideoMode OS_X11::get_video_mode(int p_screen) const {
 
+OS::VideoMode OS_X11::get_video_mode(int p_screen) const {
 	return current_videomode;
 }
-void OS_X11::get_fullscreen_mode_list(List<VideoMode> *p_list,int p_screen) const {
-
 
+void OS_X11::get_fullscreen_mode_list(List<VideoMode> *p_list,int p_screen) const {
 }
 
 //#ifdef NEW_WM_API
@@ -672,7 +668,6 @@ void OS_X11::set_current_screen(int p_screen) {
 }
 
 Point2 OS_X11::get_screen_position(int p_screen) const {
-
 	// Using Xinerama Extension
 	int event_base, error_base;
 	const Bool ext_okay = XineramaQueryExtension(x11_display, &event_base, &error_base);
@@ -707,7 +702,6 @@ Size2 OS_X11::get_screen_size(int p_screen) const {
 	XFree(xsi);
 	return size;
 }
-	
 
 Point2 OS_X11::get_window_position() const {
 	int x,y;
@@ -896,7 +890,6 @@ void OS_X11::set_window_maximized(bool p_enabled) {
 	current_videomode.height = xwa.height;
 */
 	maximized = p_enabled;
-
 }
 
 bool OS_X11::is_window_maximized() const {
@@ -992,7 +985,6 @@ unsigned int OS_X11::get_mouse_button_state(unsigned int p_x11_state) {
 }
 	
 void OS_X11::handle_key_event(XKeyEvent *p_event, bool p_echo) {
-
 			
 	// X11 functions don't know what const is
 	XKeyEvent *xkeyevent = p_event;
@@ -1158,8 +1150,6 @@ void OS_X11::handle_key_event(XKeyEvent *p_event, bool p_echo) {
 
 	//printf("key: %x\n",event.key.scancode);
 	input->parse_input_event( event);
-
-	
 }
 
 void OS_X11::process_xevents() {
@@ -1861,7 +1851,6 @@ void OS_X11::set_cursor_shape(CursorShape p_shape) {
 			XDefineCursor(x11_display,x11_window,cursors[CURSOR_ARROW]);
 	}
 
-
 	current_cursor=p_shape;
 }
 
@@ -1894,6 +1883,8 @@ void OS_X11::alert(const String& p_alert,const String& p_title) {
 }
 
 void OS_X11::set_icon(const Image& p_icon) {
+	Atom net_wm_icon = XInternAtom(x11_display, "_NET_WM_ICON", False);
+
 	if (!p_icon.empty()) {
 		Image img=p_icon;
 		img.convert(Image::FORMAT_RGBA);
@@ -1926,7 +1917,6 @@ void OS_X11::set_icon(const Image& p_icon) {
 	    XDeleteProperty(x11_display, x11_window, net_wm_icon);
 	}
 	XFlush(x11_display);
-
 }
 
 

+ 1 - 5
platform/x11/os_x11.h

@@ -119,6 +119,7 @@ class OS_X11 : public OS_Unix {
 
 	const char *cursor_theme;
 	int cursor_size;
+	XcursorImage *img[CURSOR_MAX];
 	Cursor cursors[CURSOR_MAX];
 	Cursor null_cursor;
 	CursorShape current_cursor;
@@ -155,12 +156,7 @@ class OS_X11 : public OS_Unix {
 			};
 		};
 	};
-
-	Atom net_wm_icon;
-
-
 	int joystick_count;
-
 	Joystick joysticks[JOYSTICKS_MAX];
 
 	int audio_driver_index;