Bonjours,
J'ai un bug avec cocoa combiner avec opengl. Lorsque j'appuis sur une touche on m'emvoit un bit sonore. Comment faire disparaître ce bit dérengeant.
voici le code
J'ai un bug avec cocoa combiner avec opengl. Lorsque j'appuis sur une touche on m'emvoit un bit sonore. Comment faire disparaître ce bit dérengeant.
voici le code
Bloc de code:
#import <Cocoa/Cocoa.h>
#include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include "BigWindowEvent.h"
/*================================================
Structure memorisant tous les elements de la plateform de mac:
fenetre, evenement, etc...
/*================================================*/
struct BigContext
{
NSAutoreleasePool *Pool;
NSApplication* App;
NSWindow* Window;
NSEvent* Event;
NSOpenGLView *GLview;
NSOpenGLContext* WindowCtx;
NSOpenGLContext* FullscreenCtx;
NSModalSession Session;
NSPoint mouseLoc;
BIGenum eventType;
BIGboolean isActive;
BIGboolean isWindowDestroyed;
BIGboolean isFullscreen;
BIGstring windowTitle;
BIGsizei width;
BIGsizei height;
BIGushort bpp;
BIGboolean isKeyActive[255];
}BigContext;
/*================================================
Fonction permettant d'inicialiser les elements central de
la plateforme.
/*================================================*/
void bigInit(BIGvoid)
{
/* On a besoin de la classe de l'application */
BigContext.App = [NSApplication sharedApplication];
/* On a besoin d'inicialiser le pool des evenement */
//BigContext.Pool = [[NSAutoreleasePool alloc] init];
}
/*================================================
Fonction permettant de cree une fenetre ou sera dessine les elements graphique.
@param title
titre de la fenetre
@param width
largeur de la fenetre
@param height
hauteur de la fenetre
@param bpp
resolution couleur de la fenetre
@param fullscreen
indication d'une fenetre plein ecran ou non.
/*================================================*/
void bigCreateWindow( const char* title, BIGsizei width, BIGsizei height, BIGushort bpp, BIGboolean fullscreen )
{
/* creation de la fenetre*/
BigContext.Window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, width, height)
styleMask:NSClosableWindowMask | NSTitledWindowMask
backing:NSBackingStoreBuffered defer:NO]; // Create an FSInterpreterView
if(fullscreen)
{
CGLContextObj cglContext;
long oldSwapInterval;
long newSwapInterval;
/* l'attribution des pixels */
NSOpenGLPixelFormatAttribute attribs[] =
{
NSOpenGLPFANoRecovery,
NSOpenGLPFAAccelerated,
NSOpenGLPFADoubleBuffer,
NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute) bpp,
NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute) 24,
NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute) 0,
NSOpenGLPFAAccumSize, (NSOpenGLPixelFormatAttribute) 0,
NSOpenGLPFAFullScreen,
NSOpenGLPFAScreenMask, (NSOpenGLPixelFormatAttribute) CGDisplayIDToOpenGLDisplayMask(0),
(NSOpenGLPixelFormatAttribute) 0
};
NSOpenGLPixelFormat* PixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes: attribs] autorelease];
/* Creation du context openGL */
BigContext.FullscreenCtx = [[NSOpenGLContext alloc] initWithFormat: PixelFormat shareContext: nil];
if (BigContext.FullscreenCtx == nil) {
NSLog(@"Failed to create fullScreenContext");
exit(1);
}
CGCaptureAllDisplays();
/* Optimisation de la surface */
CGDisplaySwitchToMode( kCGDirectMainDisplay,
CGDisplayBestModeForParameters( kCGDirectMainDisplay, bpp, width, height, 0 ) ) ;
/* Application du context openGL en mode plein ecran */
[BigContext.FullscreenCtx setFullScreen];
[BigContext.FullscreenCtx makeCurrentContext];
cglContext = CGLGetCurrentContext();
CGLGetParameter(cglContext, kCGLCPSwapInterval, &oldSwapInterval);
newSwapInterval = 1;
CGLSetParameter(cglContext, kCGLCPSwapInterval, &newSwapInterval);
/* application sur une surface */
BigContext.GLview = [[NSOpenGLView alloc] initWithFrame:NSMakeRect(0, 0, width, height)];
}else
{
[ BigContext.Window setAcceptsMouseMovedEvents: YES];
/* l'attribution des pixels */
NSOpenGLPixelFormatAttribute attribs[] =
{
NSOpenGLPFANoRecovery,
NSOpenGLPFAAccelerated,
NSOpenGLPFADoubleBuffer,
NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute) bpp,
NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute) 24,
NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute) 0,
NSOpenGLPFAAccumSize, (NSOpenGLPixelFormatAttribute) 0,
NSOpenGLPFAWindow,
(NSOpenGLPixelFormatAttribute) 0,
};
NSOpenGLPixelFormat* PixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes: attribs]autorelease];
BigContext.WindowCtx = [[NSOpenGLContext alloc] initWithFormat: PixelFormat shareContext:nil];
BigContext.GLview = [[NSOpenGLView alloc] initWithFrame:NSMakeRect(0, 0, width, height)];
/* on attribut la projection a la fenetre */
[BigContext.Window setContentView:BigContext.GLview];
[BigContext.WindowCtx setView:BigContext.GLview];
[BigContext.GLview setOpenGLContext:BigContext.WindowCtx];
}
/* on ne veut pas detruire la fenetre lorsqu'on quite
Cela cree un bug a cause de la classe Pool. */
[BigContext.Window setReleasedWhenClosed: NO];
NSString * String = [[[NSString alloc] initWithFormat:
@"%s", title] autorelease];
[BigContext.Window setTitle: String];
/* memorisation des parametres de la fenetre*/
BigContext.isActive = BIG_TRUE;
BigContext.isWindowDestroyed = BIG_FALSE;
BigContext.windowTitle = (BIGstring)title;
BigContext.width = width;
BigContext.height= height;
BigContext.isFullscreen = fullscreen;
/* On active la session de boucle */
BigContext.Session = [BigContext.App beginModalSessionForWindow:BigContext.Window];
}
/*================================================
Fonction qui permet de detruire la fenetre
/*================================================*/
void bigDestroyWindow( BIGvoid )
{
if(!BigContext.isWindowDestroyed)
{
BigContext.isActive = BIG_FALSE;
BigContext.isWindowDestroyed = BIG_TRUE;
//[BigContext.Window release];
}
}
/*
=====================================================
Fonction permettant d'optenir le titre de la fenetre
@return
titre de la fenetre
====================================================
*/
BIGstring bigGetWindowTitle(BIGvoid)
{
return BigContext.windowTitle;
}
/*================================================
Fonction permettant d'optenir l'information consernant
la fenetre
@param mode
choix de l'information à obtenir
@return
l'information choisie
/*================================================*/
BIGsizei bigGetIntegerWindow(BIGenum mode)
{
switch( mode )
{
case BIG_GET_WIDTH: return BigContext.width;
case BIG_GET_HEIGHT: return BigContext.height;
case BIG_GET_BPP: return BigContext.bpp;
case BIG_GET_FULLSCREEN: return BigContext.isFullscreen;
default: return -1;
}
}
void bigBeginFrame( BIGvoid)
{
if ([BigContext.App runModalSession:BigContext.Session] != NSRunContinuesResponse)
{
[BigContext.App endModalSession:BigContext.Session];
BigContext.isActive = BIG_FALSE;
}
if(![BigContext.Window isVisible] && !BigContext.isFullscreen ) [BigContext.App abortModal];
BigContext.Event = [ BigContext.Window currentEvent];
switch([BigContext.Event type])
{
case NSLeftMouseDown: BigContext.eventType = BIG_LEFT_MOUSE_DOWN;
printf("mouseDown\n");
break;
case NSLeftMouseUp: BigContext.eventType = BIG_LEFT_MOUSE_UP;
printf("mouseUp\n");
break;
case NSRightMouseDown: BigContext.eventType = BIG_RIGHT_MOUSE_DOWN;
break;
case NSRightMouseUp: BigContext.eventType = BIG_RIGHT_MOUSE_UP;
break;
case NSMouseMoved: BigContext.eventType = BIG_MOUSE_MOUVED;
if(!BigContext.isFullscreen)
{
BigContext.mouseLoc = [BigContext.GLview convertPoint:[BigContext.Event locationInWindow]
fromView:BigContext.GLview];
}else
{
BigContext.mouseLoc = [NSEvent mouseLocation];
CGRect screenBounds = CGDisplayBounds(kCGDirectMainDisplay);
BigContext.mouseLoc.y += screenBounds.size.height;
BigContext.mouseLoc.y -= ([[NSScreen mainScreen] frame].size.height + 1);
}
break;
case NSKeyDown: BigContext.eventType = BIG_KEY_DOWN;
printf("KeyDown\n");
break;
case NSKeyUp: BigContext.eventType = BIG_KEY_UP;
//BigContext.isKeyActive[[BigContext.Event keyCode]] = BIG_FALSE;
break;
case NSScrollWheel: BigContext.eventType = BIG_SCROLL_MOUVED;
break;
case NSOtherMouseDown: BigContext.eventType = BIG_MIDDLE_MOUSE_DOWN;
break;
case NSOtherMouseUp: BigContext.eventType = BIG_MIDDLE_MOUSE_UP;
break;
default: BigContext.eventType = BIG_EVENT_NOTHING;
[ NSApp sendEvent:BigContext.Event ];
break;
}
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
}
void bigEndFrame( BIGvoid)
{
[[NSOpenGLContext currentContext] flushBuffer];
}
BIGboolean bigWindowIsActive( BIGvoid )
{
return( BigContext.isActive );
}
void bigExit(BIGvoid)
{
[BigContext.Pool release];
//[BigContext.App release];
bigDestroyWindow();
}
BIGboolean bigGetIntegerEvent(BIGenum mode)
{
return( BigContext.eventType == mode);
}
BIGenum bigGetEventType(BIGvoid)
{
return( BigContext.eventType );
}
BIGenum bigGetKeyCode(BIGvoid)
{
return [BigContext.Event keyCode];
}
BIGboolean bigIsActiveKey(BIGenum key)
{
return BigContext.isKeyActive[key];
}
void bigGetMouseLocation(BIGint* loc)
{
loc[0] = BigContext.mouseLoc.x;
loc[1] = BigContext.mouseLoc.y;
}
void bigCreateAlertMessageBox(const char* title, const char* msg)
{
NSString *StrTitle = [[[NSString alloc] initWithFormat:
@"%s", title] autorelease];
NSString *StrMsg = [[[NSString alloc] initWithFormat:
@"%s", msg] autorelease];
NSRunCriticalAlertPanel(StrTitle, StrMsg, @"ok", nil, nil);
}
BIGshort bigCreateYesNoMessageBox(const char* title, const char* msg )
{
NSString *StrTitle = [[[NSString alloc] initWithFormat:
@"%s", title] autorelease];
NSString *StrMsg = [[[NSString alloc] initWithFormat:
@"%s", msg] autorelease];
return NSRunInformationalAlertPanel(StrTitle, StrMsg, @"Yes", @"No", nil);
}