Results 1 to 8 of 8

Thread: cocos2d + irrlicht 3D

  1. #1
    Lesser Wizard
    Join Date
    Feb 2013
    Posts
    142

    Default cocos2d + irrlicht 3D


  2. #2
    Lesser Wizard
    Join Date
    Feb 2013
    Posts
    142

    Default Layer

    Guys how do u think

    use 2 layers GLview? cocos2d cover irrlicht?

    or on the same layer?

    Quote Originally Posted by feelthat View Post
    Last edited by feelthat; 02-17-2015 at 12:57 PM.

  3. #3
    Lesser Wizard
    Join Date
    Feb 2013
    Posts
    142

    Default proton eglview

    //
    // EAGLView.m
    //
    // Created by Seth Robinson on 3/6/09.
    // For license info, check the license.txt file that should have come with this.
    //

    #import <QuartzCore/QuartzCore.h>
    #import <OpenGLES/EAGLDrawable.h>
    #import "EAGLView.h"
    #import "MyAppDelegate.h"
    //by stone
    #import "App.h"
    #import "Irrlicht/IrrlichtManager.h"

    #define USE_DEPTH_BUFFER 1

    // A class extension to declare private methods
    @interface EAGLView ()

    @property (nonatomic, retain) EAGLContext *context;
    @property (nonatomic, assign) NSTimer *animationTimer;

    - (BOOL) createFramebuffer;
    - (void) destroyFramebuffer;

    @end


    @implementation EAGLView

    @synthesize context;
    @synthesize animationTimer;
    @synthesize animationInterval;
    @synthesize animationIntervalSave;


    // You must implement this
    + (Class)layerClass
    {
    return [CAEAGLLayer class];
    }

    //The GL view is stored in the nib file. When it's unarchived it's sent -initWithCoder:
    - (id)initWithCoderNSCoder*)coder
    {
    if ((self = [super initWithCoder:coder]))
    {
    // Get the layer
    CAEAGLLayer* eaglLayer = (CAEAGLLayer *)self.layer;

    eaglLayer.opaque = YES;
    eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];

    //by stone
    //context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
    switch(AppGetOGLESType())
    {
    case irr::video::EDT_OGLES1:
    context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES1];
    break;

    case irr::video::EDT_OGLES2:
    context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];
    break;
    }

    if (!context || ![EAGLContext setCurrentContext:context])
    {
    [self release];
    return nil;
    }

    CHECK_GL_ERROR();

    animationIntervalSave = 1.0/60.0;
    animationInterval = animationIntervalSave;
    }

    //CGFloat pixelScale = [[UIScreen mainScreen] scale];
    UIScreen *pScreen = [UIScreen mainScreen];
    CGRect fullScreenRect = pScreen.bounds;

    bool bUseSizeGuess = false;

    if (GetPrimaryGLX() == 0)
    {
    bUseSizeGuess = true;
    SetPrimaryScreenSize(fullScreenRect.size.width, fullScreenRect.size.height);
    SetupScreenInfo(GetPrimaryGLX(), GetPrimaryGLY(), 0);
    }

    if (!BaseApp::GetBaseApp()->Init())
    {

    NSLog(@"Couldn't init app");
    [self release];
    return nil;
    }

    if (bUseSizeGuess)
    {
    //put it back, otherwise we may not fix it later
    SetPrimaryScreenSize(0,0);
    }

    //BaseApp::GetBaseApp()->OnScreenSizeChange();

    return self;
    }

    - (void)onKill
    {
    BaseApp::GetBaseApp()->Kill();
    }

    - (void)drawView
    {
    if (!viewRenderbuffer)
    return;

    [EAGLContext setCurrentContext:context];

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glViewport(0, 0, GetPrimaryGLX(), GetPrimaryGLY());

    if (GetScreenSizeX() != 0)
    {
    BaseApp::GetBaseApp()->Update();
    BaseApp::GetBaseApp()->Draw();
    }
    else
    {
    //not quite ready
    }

    while (!BaseApp::GetBaseApp()->GetOSMessages()->empty())
    {
    OSMessage m = BaseApp::GetBaseApp()->GetOSMessages()->front();
    BaseApp::GetBaseApp()->GetOSMessages()->pop_front();

    //LogMsg("Got OS message %d, %s", m.m_type, m.m_string.c_str());
    MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

    [appDelegate onOSMessage: &m];
    }

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    // if(main_throttled_update())
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
    }


    - (void)layoutSubviews
    {
    [EAGLContext setCurrentContext:context];
    [self destroyFramebuffer];
    [self createFramebuffer];
    [self drawView];
    }

    - (BOOL)createFramebuffer
    {

    CGFloat pixelScale = [[UIScreen mainScreen] scale];
    UIScreen *pScreen = [UIScreen mainScreen];
    CGRect fullScreenRect = pScreen.bounds;


    LogMsg("Scale: %.2f", pixelScale);
    SetProtonPixelScaleFactor(pixelScale);

    [self setContentScaleFactor: GetProtonPixelScaleFactor()];


    glGenFramebuffersOES(1, &viewFramebuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

    glGenRenderbuffersOES(1, &viewRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);

    if (![context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawableCAEAGLLayer*)self.layer])
    return NO;

    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);

    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OE S, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OE S, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

    if (USE_DEPTH_BUFFER)
    {
    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
    }

    glGenRenderbuffersOES(1, &m_StencilBuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_StencilBuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH24_STENCIL8_OES, backingWidth, backingHeight);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_StencilBuffer);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_STENCIL_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_StencilBuffer);

    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
    {
    NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
    return NO;
    }

    if (GetPrimaryGLX() == 0)
    {
    SetPrimaryScreenSize(backingWidth, backingHeight);
    SetupScreenInfo(GetPrimaryGLX(), GetPrimaryGLY(), 0);
    }


    return YES;
    }


    - (void)destroyFramebuffer
    {

    glDeleteFramebuffersOES(1, &viewFramebuffer);
    viewFramebuffer = 0;
    glDeleteRenderbuffersOES(1, &viewRenderbuffer);
    viewRenderbuffer = 0;

    if(depthRenderbuffer)
    {
    glDeleteRenderbuffersOES(1, &depthRenderbuffer);
    depthRenderbuffer = 0;
    }

    if(m_StencilBuffer)
    {
    glDeleteRenderbuffersOES(1, &m_StencilBuffer);
    m_StencilBuffer = 0;
    }
    }


    - (void)startAnimation
    {
    self.animationTimer =
    [NSTimer scheduledTimerWithTimeInterval:animationInterval
    target:self
    selector:@selector(drawView)
    userInfo:nil
    repeats:YES];

    NSRunLoop* runner = [NSRunLoop currentRunLoop];
    [runner addTimer:self.animationTimer forMode: NSRunLoopCommonModes];

    //[self.animationTimer release];
    }


    - (void)stopAnimation
    {
    self.animationTimer = nil;
    }


    - (void)setAnimationTimerNSTimer *)newTimer
    {
    [animationTimer invalidate];
    animationTimer = newTimer;
    }


    - (void)setAnimationIntervalNSTimeInterval)interval
    {

    animationInterval = interval;

    if (animationTimer)
    {
    [self stopAnimation];
    [self startAnimation];
    }
    }

    - (void)setAnimationIntervalSaveNSTimeInterval)interval
    {

    animationIntervalSave = interval;

    [self setAnimationInterval:animationIntervalSave];
    }

    - (void)dealloc
    {

    [self stopAnimation];

    if ([EAGLContext currentContext] == context)
    {
    [EAGLContext setCurrentContext:nil];
    }

    [context release];
    [super dealloc];
    }

    const int MAX_TOUCHES= 12;

    class TouchTrack
    {
    public:

    TouchTrack()
    {
    m_touchPointer = NULL;
    }

    void *m_touchPointer;
    };

    TouchTrack g_touchTracker[MAX_TOUCHES];

    int GetFingerTrackIDByTouch(void* touch)
    {
    for (int i=0; i < MAX_TOUCHES; i++)
    {
    if (g_touchTracker[i].m_touchPointer == touch)
    {
    return i;
    }
    }

    //LogMsg("Can't locate fingerID by touch %d", touch);
    return -1;
    }

    int AddNewTouch(void* touch)
    {
    for (int i=0; i < MAX_TOUCHES; i++)
    {
    if (!g_touchTracker[i].m_touchPointer)
    {
    //hey, an empty slot, yay
    g_touchTracker[i].m_touchPointer = touch;
    return i;
    }
    }

    LogMsg("Can't add new fingerID");
    return -1;
    }

    int GetTouchesActive()
    {
    int count = 0;

    for (int i=0; i < MAX_TOUCHES; i++)
    {
    if (g_touchTracker[i].m_touchPointer)
    {
    count++;
    }
    }
    return count;
    }

    //by stone
    // Handles the start of a touch
    - (void)touchesBeganNSSet *)touches withEventUIEvent *)event
    {
    // Enumerate through all the touch objects.
    UITouch* touch = [touches anyObject];

    #ifdef _IRR_COMPILE_WITH_GUI_
    CGPoint touchPoint = [touch locationInView:self];
    UIInterfaceOrientation orientation = [UIDevice currentDevice].orientation;
    irr::SEvent ev;

    float scale = 1.0f;

    //if ([self respondsToSelector:@selector(setContentScaleFactor])
    // scale = [[UIScreen mainScreen] scale];

    if (orientation == UIInterfaceOrientationLandscapeLeft
    ||
    orientation == UIInterfaceOrientationLandscapeRight)
    {
    //Landscape
    ev.MouseInput.X = touchPoint.y*scale;
    ev.MouseInput.Y = touchPoint.x*scale;
    }
    else
    {
    ev.MouseInput.X = touchPoint.x*scale;
    ev.MouseInput.Y = touchPoint.y*scale;
    }

    // event as mouse.
    ev.EventType = irr::EET_MOUSE_INPUT_EVENT;
    ev.MouseInput.Event = irr::EMIE_LMOUSE_PRESSED_DOWN;

    ev.MouseInput.ButtonStates = 0;
    IrrlichtManager::GetIrrlichtManager()->GetDevice()->postEventFromUser(ev);
    #endif

    for (touch in touches)
    {
    //found a touch. Is it already on our list?
    int fingerID = GetFingerTrackIDByTouch(touch);

    if (fingerID == -1)
    {
    //add it to our list
    fingerID = AddNewTouch(touch);
    }
    else
    {
    //already on the list. Don't send this
    //LogMsg("Ignoring touch %d", fingerID);
    continue;
    }

    CGPoint pt =[touch locationInView:self];
    ConvertCoordinatesIfRequired(pt.x, pt.y);
    MessageManager::GetMessageManager()->SendGUIEx(MESSAGE_TYPE_GUI_CLICK_START,pt.x, pt.y,fingerID);
    }
    }

    //by stone
    - (void)touchesEndedNSSet *)touches withEventUIEvent *)event
    {
    UITouch* touch = [touches anyObject];

    #ifdef _IRR_COMPILE_WITH_GUI_
    CGPoint touchPoint = [touch locationInView:self];
    UIInterfaceOrientation orientation = [UIDevice currentDevice].orientation;
    irr::SEvent ev;

    float scale = 1.0f;

    //if ([self respondsToSelector:@selector(setContentScaleFactor])
    // scale = [[UIScreen mainScreen] scale];

    if (orientation == UIInterfaceOrientationLandscapeLeft
    ||
    orientation == UIInterfaceOrientationLandscapeRight)
    {
    //Landscape
    ev.MouseInput.X = touchPoint.y*scale;
    ev.MouseInput.Y = touchPoint.x*scale;
    }
    else
    {
    ev.MouseInput.X = touchPoint.x*scale;
    ev.MouseInput.Y = touchPoint.y*scale;
    }

    ev.EventType = irr::EET_MOUSE_INPUT_EVENT;
    ev.MouseInput.Event = irr::EMIE_LMOUSE_LEFT_UP;

    ev.MouseInput.ButtonStates = 0;
    IrrlichtManager::GetIrrlichtManager()->GetDevice()->postEventFromUser(ev);
    #endif

    // Enumerate through all the touch objects.
    for (touch in touches)
    {
    //found a touch. Is it already on our list?
    int fingerID = GetFingerTrackIDByTouch(touch);
    if (fingerID != -1)
    {
    g_touchTracker[fingerID].m_touchPointer = NULL; //clear it
    }
    else
    {
    //wasn't on our list
    continue;
    }

    CGPoint pt =[touch locationInView:self];
    ConvertCoordinatesIfRequired(pt.x, pt.y);
    MessageManager::GetMessageManager()->SendGUIEx(MESSAGE_TYPE_GUI_CLICK_END,pt.x, pt.y, fingerID);
    }
    }

    - (void)touchesCancelledNSSet *)touches withEventUIEvent *)event
    {
    // Enumerate through all the touch objects.
    for (UITouch *touch in touches)
    {
    //found a touch. Is it already on our list?
    int fingerID = GetFingerTrackIDByTouch(touch);
    if (fingerID != -1)
    {
    g_touchTracker[fingerID].m_touchPointer = NULL; //clear it
    }
    else
    {
    //wasn't on our list
    continue;
    }

    CGPoint pt =[touch locationInView:self];
    ConvertCoordinatesIfRequired(pt.x, pt.y);
    MessageManager::GetMessageManager()->SendGUIEx(MESSAGE_TYPE_GUI_CLICK_END,pt.x, pt.y, fingerID);
    }
    }


    - (void)touchesMovedNSSet *)touches withEventUIEvent *)event
    {
    // Enumerate through all the touch objects.
    for (UITouch *touch in touches)
    {

    //found a touch. Is it already on our list?
    int fingerID = GetFingerTrackIDByTouch(touch);
    if (fingerID != -1)
    {
    //found it
    }
    else
    {
    //wasn't on our list?!
    continue;
    }

    CGPoint pt =[touch locationInView:self];
    ConvertCoordinatesIfRequired(pt.x, pt.y);
    MessageManager::GetMessageManager()->SendGUIEx(MESSAGE_TYPE_GUI_CLICK_MOVE,pt.x, pt.y, fingerID);
    }
    }

    @end

    - - - Updated - - -

    /*

    ===== IMPORTANT =====

    This is sample code demonstrating API, technology or techniques in development.
    Although this sample code has been reviewed for technical accuracy, it is not
    final. Apple is supplying this information to help you plan for the adoption of
    the technologies and programming interfaces described herein. This information
    is subject to change, and software implemented based on this sample code should
    be tested with final operating system software and final documentation. Newer
    versions of this sample code may be provided with future seeds of the API or
    technology. For information about updates to this and other developer
    documentation, view the New & Updated sidebars in subsequent documentation
    seeds.

    =====================

    File: EAGLView.m
    Abstract: Convenience class that wraps the CAEAGLLayer from CoreAnimation into a
    UIView subclass.

    Version: 1.3

    Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc.
    ("Apple") in consideration of your agreement to the following terms, and your
    use, installation, modification or redistribution of this Apple software
    constitutes acceptance of these terms. If you do not agree with these terms,
    please do not use, install, modify or redistribute this Apple software.

    In consideration of your agreement to abide by the following terms, and subject
    to these terms, Apple grants you a personal, non-exclusive license, under
    Apple's copyrights in this original Apple software (the "Apple Software"), to
    use, reproduce, modify and redistribute the Apple Software, with or without
    modifications, in source and/or binary forms; provided that if you redistribute
    the Apple Software in its entirety and without modifications, you must retain
    this notice and the following text and disclaimers in all such redistributions
    of the Apple Software.
    Neither the name, trademarks, service marks or logos of Apple Inc. may be used
    to endorse or promote products derived from the Apple Software without specific
    prior written permission from Apple. Except as expressly stated in this notice,
    no other rights or licenses, express or implied, are granted by Apple herein,
    including but not limited to any patent rights that may be infringed by your
    derivative works or by other works in which the Apple Software may be
    incorporated.

    The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
    WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
    WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
    COMBINATION WITH YOUR PRODUCTS.

    IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
    GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR
    DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF
    CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
    APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    Copyright (C) 2008 Apple Inc. All Rights Reserved.

    */

    #import <QuartzCore/QuartzCore.h>

    #import "EAGLView.h"
    #import "ES1Renderer.h"
    #import "CCDirector.h"
    #import "CCSet.h"
    #import "CCTouch.h"
    #import "CCIMEDispatcher.h"
    #import "OpenGL_Internal.h"

    //CLASS IMPLEMENTATIONS:

    #define MAX_TOUCHES 11

    static EAGLView *view;
    static cocos2d::CCTouch *s_pTouches[MAX_TOUCHES];

    @interface EAGLView (Private)
    - (BOOL) setupSurfaceWithSharegroupEAGLSharegroup*)sharegroup;
    - (unsigned int) convertPixelFormatNSString*) pixelFormat;
    @end

    @implementation EAGLView

    @synthesize surfaceSize=size_;
    @synthesize pixelFormat=pixelformat_, depthFormat=depthFormat_;
    @synthesize context=context_;
    @synthesize touchesIntergerDict;
    @synthesize indexBitsUsed;
    @synthesize multiSampling=multiSampling_;

    + (Class) layerClass
    {
    return [CAEAGLLayer class];
    }

    + (id) viewWithFrameCGRect)frame
    {
    return [[[self alloc] initWithFrame:frame] autorelease];
    }

    + (id) viewWithFrameCGRect)frame pixelFormatNSString*)format
    {
    return [[[self alloc]initWithFrame:frame pixelFormat:format] autorelease];
    }

    + (id) viewWithFrameCGRect)frame pixelFormatNSString*)format depthFormatGLuint)depth
    {
    return [[[self alloc] initWithFrame:frame pixelFormat:format depthFormat:depth preserveBackbuffer:NO sharegroup:nil multiSampling:NO numberOfSamples:0] autorelease];
    }

    + (id) viewWithFrameCGRect)frame pixelFormatNSString*)format depthFormatGLuint)depth preserveBackbufferBOOL)retained sharegroupEAGLSharegroup*)sharegroup multiSamplingBOOL)multisampling numberOfSamplesunsigned int)samples
    {
    return [[[self alloc]initWithFrame:frame pixelFormat:format depthFormat:depth preserveBackbuffer:retained sharegroup:sharegroup multiSampling:multisampling numberOfSamples:samples] autorelease];
    }

    + (id) sharedEGLView
    {
    return view;
    }

    - (id) initWithFrameCGRect)frame
    {
    return [self initWithFrame:frame pixelFormat:kEAGLColorFormatRGB565 depthFormat:0 preserveBackbuffer:NO sharegroup:nil multiSampling:NO numberOfSamples:0];
    }

    - (id) initWithFrameCGRect)frame pixelFormatNSString*)format
    {
    return [self initWithFrame:frame pixelFormat:format depthFormat:0 preserveBackbuffer:NO sharegroup:nil multiSampling:NO numberOfSamples:0];
    }

    - (id) initWithFrameCGRect)frame pixelFormatNSString*)format depthFormatGLuint)depth preserveBackbufferBOOL)retained sharegroupEAGLSharegroup*)sharegroup multiSamplingBOOL)sampling numberOfSamplesunsigned int)nSamples;
    {
    if((self = [super initWithFrame:frame]))
    {
    pixelformat_ = format;
    depthFormat_ = depth;
    multiSampling_ = sampling;
    requestedSamples_ = nSamples;
    preserveBackbuffer_ = retained;
    markedText_ = nil;
    if( ! [self setupSurfaceWithSharegroup:sharegroup] ) {
    [self release];
    return nil;
    }
    }

    touchesIntergerDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 4, NULL, NULL);
    indexBitsUsed = 0x00000000;

    view = self;
    return self;
    }

    -(id) initWithCoderNSCoder *)aDecoder
    {
    if( (self = [super initWithCoder:aDecoder]) ) {

    CAEAGLLayer* eaglLayer = (CAEAGLLayer*)[self layer];

    pixelformat_ = kEAGLColorFormatRGB565;
    depthFormat_ = 0; // GL_DEPTH_COMPONENT24_OES;
    multiSampling_= NO;
    requestedSamples_ = 0;
    size_ = [eaglLayer bounds].size;
    markedText_ = nil;

    if( ! [self setupSurfaceWithSharegroup:nil] ) {
    [self release];
    return nil;
    }
    }

    view = self;
    return self;
    }

    - (void)didMoveToWindow;
    {
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(onUIKeyboardNotification
    name:UIKeyboardWillShowNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(onUIKeyboardNotification
    name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(onUIKeyboardNotification
    name:UIKeyboardWillHideNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(onUIKeyboardNotification
    name:UIKeyboardDidHideNotification object:nil];
    }

    -(int) getWidth
    {
    CGSize bound = [self bounds].size;
    return bound.width;
    }

    -(int) getHeight
    {
    CGSize bound = [self bounds].size;
    return bound.height;
    }

    -(int) getUnUsedIndex
    {
    int i;
    int temp = indexBitsUsed;

    for (i = 0; i < MAX_TOUCHES; i++) {
    if (! (temp & 0x00000001)) {
    indexBitsUsed |= (1 << i);
    return i;
    }

    temp >>= 1;
    }

    // all bits are used
    return -1;
    }

    -(void) removeUsedIndexBitint) index
    {
    if (index < 0 || index >= MAX_TOUCHES) {
    return;
    }

    unsigned int temp = 1 << index;
    temp = ~temp;
    indexBitsUsed &= temp;
    }

    -(BOOL) setupSurfaceWithSharegroupEAGLSharegroup*)sharegroup
    {
    CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;

    eaglLayer.opaque = YES;
    eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBoolreserveBackbuffer_], kEAGLDrawablePropertyRetainedBacking,
    pixelformat_, kEAGLDrawablePropertyColorFormat, nil];


    renderer_ = [[ES1Renderer alloc] initWithDepthFormat:depthFormat_
    withPixelFormat:[self convertPixelFormatixelformat_]
    withSharegroup:sharegroup
    withMultiSampling:multiSampling_
    withNumberOfSamples:requestedSamples_];
    if (!renderer_)
    return NO;

    context_ = [renderer_ context];
    [context_ renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:eaglLayer];

    //discardFramebufferSupported_ = [[CCConfiguration sharedConfiguration] supportsDiscardFramebuffer];

    return YES;
    }

    - (void) dealloc
    {
    CFRelease(touchesIntergerDict);
    [renderer_ release];
    [super dealloc];
    }

    - (void) layoutSubviews
    {
    [renderer_ resizeFromLayerCAEAGLLayer*)self.layer];
    size_ = [renderer_ backingSize];

    // Issue #914 #924
    // CCDirector *director = [CCDirector sharedDirector];
    // [director reshapeProjection:size_];
    cocos2d::CCSize size;
    size.width = size_.width;
    size.height = size_.height;
    cocos2d::CCDirector::sharedDirector()->reshapeProjection(size);

    // Avoid flicker. Issue #350
    //[director performSelectorOnMainThread:@selector(drawScene) withObject:nil waitUntilDone:YES];
    cocos2d::CCDirector::sharedDirector()->drawScene();
    }

    - (void) swapBuffers
    {
    // IMPORTANT:
    // - preconditions
    // -> context_ MUST be the OpenGL context
    // -> renderbuffer_ must be the the RENDER BUFFER

    #ifdef __IPHONE_4_0

    if (multiSampling_)
    {
    /* Resolve from msaaFramebuffer to resolveFramebuffer */
    //glDisable(GL_SCISSOR_TEST);
    glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, [renderer_ msaaFrameBuffer]);
    glBindFramebufferOES(GL_DRAW_FRAMEBUFFER_APPLE, [renderer_ defaultFrameBuffer]);
    glResolveMultisampleFramebufferAPPLE();
    }

    if( discardFramebufferSupported_)
    {
    if (multiSampling_)
    {
    if (depthFormat_)
    {
    GLenum attachments[] = {GL_COLOR_ATTACHMENT0_OES, GL_DEPTH_ATTACHMENT_OES};
    glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 2, attachments);
    }
    else
    {
    GLenum attachments[] = {GL_COLOR_ATTACHMENT0_OES};
    glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 1, attachments);
    }

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, [renderer_ colorRenderBuffer]);

    }

    // not MSAA
    else if (depthFormat_ ) {
    GLenum attachments[] = { GL_DEPTH_ATTACHMENT_OES};
    glDiscardFramebufferEXT(GL_FRAMEBUFFER_OES, 1, attachments);
    }
    }

    #endif // __IPHONE_4_0

    if(![context_ presentRenderbuffer:GL_RENDERBUFFER_OES])
    {
    // CCLOG(@"cocos2d: Failed to swap renderbuffer in %s\n", __FUNCTION__);
    }

    #if COCOS2D_DEBUG
    CHECK_GL_ERROR();
    #endif

    // We can safely re-bind the framebuffer here, since this will be the
    // 1st instruction of the new main loop
    if( multiSampling_ )
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, [renderer_ msaaFrameBuffer]);
    }

    - (unsigned int) convertPixelFormatNSString*) pixelFormat
    {
    // define the pixel format
    GLenum pFormat;


    if([pixelFormat isEqualToString:@"EAGLColorFormat565"])
    pFormat = GL_RGB565_OES;
    else
    pFormat = GL_RGBA8_OES;

    return pFormat;
    }

    #pragma mark EAGLView - Point conversion

    - (CGPoint) convertPointFromViewToSurfaceCGPoint)point
    {
    CGRect bounds = [self bounds];

    CGPoint ret;
    ret.x = (point.x - bounds.origin.x) / bounds.size.width * size_.width;
    ret.y = (point.y - bounds.origin.y) / bounds.size.height * size_.height;

    return ret;
    }

    - (CGRect) convertRectFromViewToSurfaceCGRect)rect
    {
    CGRect bounds = [self bounds];

    CGRect ret;
    ret.origin.x = (rect.origin.x - bounds.origin.x) / bounds.size.width * size_.width;
    ret.origin.y = (rect.origin.y - bounds.origin.y) / bounds.size.height * size_.height;
    ret.size.width = rect.size.width / bounds.size.width * size_.width;
    ret.size.height = rect.size.height / bounds.size.height * size_.height;

    return ret;
    }

    // Pass the touches to the superview
    #pragma mark EAGLView - Touch Delegate

    - (void)touchesBeganNSSet *)touches withEventUIEvent *)event
    {
    cocos2d::CCSet set;
    cocos2d::CCTouch *pTouch;

    for (UITouch *touch in touches) {
    NSNumber *index = (NSNumber*)CFDictionaryGetValue(touchesIntergerDic t, touch);
    int unUsedIndex = 0;

    // it is a new touch
    if (! index) {
    unUsedIndex = [self getUnUsedIndex];

    // The touches is more than MAX_TOUCHES ?
    if (unUsedIndex == -1) {
    return;
    }

    pTouch = s_pTouches[unUsedIndex] = new cocos2d::CCTouch();
    }

    float x = [touch locationInView: [touch view]].x;
    float y = [touch locationInView: [touch view]].y;
    pTouch->SetTouchInfo(0, x, y);

    CFDictionaryAddValue(touchesIntergerDict, touch, [NSNumber numberWithInt:unUsedIndex]);

    set.addObject(pTouch);
    }

    cocos2d::CCDirector::sharedDirector()->getOpenGLView()->touchesBegan(&set);
    }

    - (void)touchesMovedNSSet *)touches withEventUIEvent *)event
    {
    cocos2d::CCSet set;
    for (UITouch *touch in touches) {
    NSNumber *index = (NSNumber*)CFDictionaryGetValue(touchesIntergerDic t, touch);
    if (! index) {
    // if the index doesn't exist, it is an error
    return;
    }

    cocos2d::CCTouch *pTouch = s_pTouches[[index intValue]];
    if (! pTouch) {
    // if the pTouch is null, it is an error
    return;
    }

    float x = [touch locationInView: [touch view]].x;
    float y = [touch locationInView: [touch view]].y;
    pTouch->SetTouchInfo(0, x, y);

    set.addObject(pTouch);
    }

    cocos2d::CCDirector::sharedDirector()->getOpenGLView()->touchesMoved(&set);
    }

    - (void)touchesEndedNSSet *)touches withEventUIEvent *)event
    {
    cocos2d::CCSet set;
    for (UITouch *touch in touches) {
    NSNumber *index = (NSNumber*)CFDictionaryGetValue(touchesIntergerDic t, touch);
    if (! index) {
    // if the index doesn't exist, it is an error
    return;
    }

    cocos2d::CCTouch *pTouch = s_pTouches[[index intValue]];
    if (! pTouch) {
    // if the pTouch is null, it is an error
    return;
    }

    float x = [touch locationInView: [touch view]].x;
    float y = [touch locationInView: [touch view]].y;
    pTouch->SetTouchInfo(0, x, y);

    set.addObject(pTouch);
    CFDictionaryRemoveValue(touchesIntergerDict, touch);
    pTouch->release();
    s_pTouches[[index intValue]] = NULL;
    [self removeUsedIndexBit:[index intValue]];
    }

    cocos2d::CCDirector::sharedDirector()->getOpenGLView()->touchesEnded(&set);
    }

    - (void)touchesCancelledNSSet *)touches withEventUIEvent *)event
    {
    cocos2d::CCSet set;
    for (UITouch *touch in touches) {
    NSNumber *index = (NSNumber*)CFDictionaryGetValue(touchesIntergerDic t, touch);
    if (! index) {
    // if the index doesn't exist, it is an error
    return;
    }

    cocos2d::CCTouch *pTouch = s_pTouches[[index intValue]];
    if (! pTouch) {
    // if the pTouch is null, it is an error
    return;
    }

    float x = [touch locationInView: [touch view]].x;
    float y = [touch locationInView: [touch view]].y;
    pTouch->SetTouchInfo(0, x, y);

    set.addObject(pTouch);
    CFDictionaryRemoveValue(touchesIntergerDict, touch);
    pTouch->release();
    s_pTouches[[index intValue]] = NULL;
    [self removeUsedIndexBit:[index intValue]];
    }

    cocos2d::CCDirector::sharedDirector()->getOpenGLView()->touchesCancelled(&set);
    }

    #pragma mark -
    #pragma mark UIView - Responder

    - (BOOL)canBecomeFirstResponder
    {
    if (nil != markedText_) {
    [markedText_ release];
    }
    markedText_ = nil;
    return YES;
    }

    #pragma mark -
    #pragma mark UIKeyInput protocol

    - (BOOL)hasText
    {
    return NO;
    }

    - (void)insertTextNSString *)text
    {
    if (nil != markedText_) {
    [markedText_ release];
    markedText_ = nil;
    }
    const char * pszText = [text cStringUsingEncoding:NSUTF8StringEncoding];
    cocos2d::CCIMEDispatcher::sharedDispatcher()->dispatchInsertText(pszText, strlen(pszText));
    }

    - (void)deleteBackward
    {
    if (nil != markedText_) {
    [markedText_ release];
    markedText_ = nil;
    }
    cocos2d::CCIMEDispatcher::sharedDispatcher()->dispatchDeleteBackward();
    }

    #pragma mark -
    #pragma mark UITextInputTrait protocol

    -(UITextAutocapitalizationType) autocapitalizationType
    {
    return UITextAutocapitalizationTypeNone;
    }

    #pragma mark -
    #pragma mark UITextInput protocol

    #pragma mark UITextInput - properties

    @synthesize beginningOfDocument;
    @synthesize endOfDocument;
    @synthesize inputDelegate;
    @synthesize markedTextRange;
    @synthesize markedTextStyle;
    // @synthesize selectedTextRange; // must implement
    @synthesize tokenizer;

    /* Text may have a selection, either zero-length (a caret) or ranged. Editing operations are
    * always performed on the text from this selection. nil corresponds to no selection. */
    - (void)setSelectedTextRangeUITextRange *)aSelectedTextRange;
    {
    CCLOG("UITextRange:setSelectedTextRange");
    }
    - (UITextRange *)selectedTextRange;
    {
    return [[[UITextRange alloc] init] autorelease];
    }

    #pragma mark UITextInput - Replacing and Returning Text

    - (NSString *)textInRangeUITextRange *)range;
    {
    CCLOG("textInRange");
    return @"";
    }
    - (void)replaceRangeUITextRange *)range withTextNSString *)theText;
    {
    CCLOG("replaceRange");
    }

    #pragma mark UITextInput - Working with Marked and Selected Text



    /* If text can be selected, it can be marked. Marked text represents provisionally
    * inserted text that has yet to be confirmed by the user. It requires unique visual
    * treatment in its display. If there is any marked text, the selection, whether a
    * caret or an extended range, always resides witihin.
    *
    * Setting marked text either replaces the existing marked text or, if none is present,
    * inserts it from the current selection. */

    - (void)setMarkedTextRangeUITextRange *)markedTextRange;
    {
    CCLOG("setMarkedTextRange");
    }

    - (UITextRange *)markedTextRange;
    {
    CCLOG("markedTextRange");
    return nil; // Nil if no marked text.
    }
    - (void)setMarkedTextStyleNSDictionary *)markedTextStyle;
    {
    CCLOG("setMarkedTextStyle");

    }
    - (NSDictionary *)markedTextStyle;
    {
    CCLOG("markedTextStyle");
    return nil;
    }
    - (void)setMarkedTextNSString *)markedText selectedRangeNSRange)selectedRange;
    {
    CCLOG("setMarkedText");
    if (markedText == markedText_) {
    return;
    }
    if (nil != markedText_) {
    [markedText_ release];
    }
    markedText_ = markedText;
    [markedText_ retain];
    }
    - (void)unmarkText;
    {
    CCLOG("unmarkText");
    if (nil == markedText_)
    {
    return;
    }
    const char * pszText = [markedText_ cStringUsingEncoding:NSUTF8StringEncoding];
    cocos2d::CCIMEDispatcher::sharedDispatcher()->dispatchInsertText(pszText, strlen(pszText));
    [markedText_ release];
    markedText_ = nil;
    }

    #pragma mark Methods for creating ranges and positions.

    - (UITextRange *)textRangeFromPositionUITextPosition *)fromPosition toPositionUITextPosition *)toPosition;
    {
    CCLOG("textRangeFromPosition");
    return nil;
    }
    - (UITextPosition *)positionFromPositionUITextPosition *)position offsetNSInteger)offset;
    {
    CCLOG("positionFromPosition");
    return nil;
    }
    - (UITextPosition *)positionFromPositionUITextPosition *)position inDirectionUITextLayoutDirection)direction offsetNSInteger)offset;
    {
    CCLOG("positionFromPosition");
    return nil;
    }

    /* Simple evaluation of positions */
    - (NSComparisonResult)comparePositionUITextPosition *)position toPositionUITextPosition *)other;
    {
    CCLOG("comparePosition");
    return 0;
    }
    - (NSInteger)offsetFromPositionUITextPosition *)from toPositionUITextPosition *)toPosition;
    {
    CCLOG("offsetFromPosition");
    return 0;
    }

    - (UITextPosition *)positionWithinRangeUITextRange *)range farthestInDirectionUITextLayoutDirection)direction;
    {
    CCLOG("positionWithinRange");
    return nil;
    }
    - (UITextRange *)characterRangeByExtendingPositionUITextPosition *)position inDirectionUITextLayoutDirection)direction;
    {
    CCLOG("characterRangeByExtendingPosition");
    return nil;
    }

    #pragma mark Writing direction

    - (UITextWritingDirection)baseWritingDirectionForPos itionUITextPosition *)position inDirectionUITextStorageDirection)direction;
    {
    CCLOG("baseWritingDirectionForPosition");
    return UITextWritingDirectionNatural;
    }
    - (void)setBaseWritingDirectionUITextWritingDirection)writingDirection forRangeUITextRange *)range;
    {
    CCLOG("setBaseWritingDirection");
    }

    #pragma mark Geometry

    /* Geometry used to provide, for example, a correction rect. */
    - (CGRect)firstRectForRangeUITextRange *)range;
    {
    CCLOG("firstRectForRange");
    return CGRectNull;
    }
    - (CGRect)caretRectForPositionUITextPosition *)position;
    {
    CCLOG("caretRectForPosition");
    return caretRect_;
    }

    #pragma mark Hit testing

    /* JS - Find the closest position to a given point */
    - (UITextPosition *)closestPositionToPointCGPoint)point;
    {
    CCLOG("closestPositionToPoint");
    return nil;
    }
    - (UITextPosition *)closestPositionToPointCGPoint)point withinRangeUITextRange *)range;
    {
    CCLOG("closestPositionToPoint");
    return nil;
    }
    - (UITextRange *)characterRangeAtPointCGPoint)point;
    {
    CCLOG("characterRangeAtPoint");
    return nil;
    }

    #pragma mark -
    #pragma mark UIKeyboard notification

    - (void)onUIKeyboardNotificationNSNotification *)notif;
    {
    NSString * type = notif.name;

    NSDictionary* info = [notif userInfo];
    CGRect begin = [self convertRect:
    [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue]
    fromView:self];
    CGRect end = [self convertRect:
    [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]
    fromView:self];
    double aniDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKe y] doubleValue];

    CGSize viewSize = self.frame.size;
    CGFloat tmp;

    switch ([[UIApplication sharedApplication] statusBarOrientation])
    {
    case UIInterfaceOrientationPortrait:
    begin.origin.y = viewSize.height - begin.origin.y - begin.size.height;
    end.origin.y = viewSize.height - end.origin.y - end.size.height;
    break;

    case UIInterfaceOrientationPortraitUpsideDown:
    begin.origin.x = viewSize.width - (begin.origin.x + begin.size.width);
    end.origin.x = viewSize.width - (end.origin.x + end.size.width);
    break;

    case UIInterfaceOrientationLandscapeLeft:
    tmp = begin.size.width;
    begin.size.width = begin.size.height;
    begin.size.height = tmp;
    tmp = end.size.width;
    end.size.width = end.size.height;
    end.size.height = tmp;
    tmp = viewSize.width;
    viewSize.width = viewSize.height;
    viewSize.height = tmp;

    tmp = begin.origin.x;
    begin.origin.x = begin.origin.y;
    begin.origin.y = viewSize.height - tmp - begin.size.height;
    tmp = end.origin.x;
    end.origin.x = end.origin.y;
    end.origin.y = viewSize.height - tmp - end.size.height;
    break;

    case UIInterfaceOrientationLandscapeRight:
    tmp = begin.size.width;
    begin.size.width = begin.size.height;
    begin.size.height = tmp;
    tmp = end.size.width;
    end.size.width = end.size.height;
    end.size.height = tmp;
    tmp = viewSize.width;
    viewSize.width = viewSize.height;
    viewSize.height = tmp;

    tmp = begin.origin.x;
    begin.origin.x = begin.origin.y;
    begin.origin.y = tmp;
    tmp = end.origin.x;
    end.origin.x = end.origin.y;
    end.origin.y = tmp;
    break;

    default:
    break;
    }
    cocos2d::CCIMEKeyboardNotificationInfo notiInfo;
    notiInfo.begin = cocos2d::CCRect(begin.origin.x,
    begin.origin.y,
    begin.size.width,
    begin.size.height);
    notiInfo.end = cocos2d::CCRect(end.origin.x,
    end.origin.y,
    end.size.width,
    end.size.height);
    notiInfo.duration = (float)aniDuration;
    cocos2d::CCIMEDispatcher* dispatcher = cocos2d::CCIMEDispatcher::sharedDispatcher();
    if (UIKeyboardWillShowNotification == type)
    {
    dispatcher->dispatchKeyboardWillShow(notiInfo);
    }
    else if (UIKeyboardDidShowNotification == type)
    {
    //CGSize screenSize = self.window.screen.bounds.size;
    dispatcher->dispatchKeyboardDidShow(notiInfo);
    caretRect_ = end;
    caretRect_.origin.y = viewSize.height - (caretRect_.origin.y + caretRect_.size.height + [UIFont smallSystemFontSize]);
    caretRect_.size.height = 0;
    }
    else if (UIKeyboardWillHideNotification == type)
    {
    dispatcher->dispatchKeyboardWillHide(notiInfo);
    }
    else if (UIKeyboardDidHideNotification == type)
    {
    caretRect_ = CGRectZero;
    dispatcher->dispatchKeyboardDidHide(notiInfo);
    }
    }
    @end

  4. #4
    Master Sorcerer Simplify_'s Avatar
    Join Date
    Dec 2014
    Posts
    873

    Default

    Quote Originally Posted by feelthat View Post
    //
    // EAGLView.m
    //
    // Created by Seth Robinson on 3/6/09.
    // For license info, check the license.txt file that should have come with this.
    //

    #import <QuartzCore/QuartzCore.h>
    #import <OpenGLES/EAGLDrawable.h>
    #import "EAGLView.h"
    #import "MyAppDelegate.h"
    //by stone
    #import "App.h"
    #import "Irrlicht/IrrlichtManager.h"

    #define USE_DEPTH_BUFFER 1

    // A class extension to declare private methods
    @interface EAGLView ()

    @property (nonatomic, retain) EAGLContext *context;
    @property (nonatomic, assign) NSTimer *animationTimer;

    - (BOOL) createFramebuffer;
    - (void) destroyFramebuffer;

    @end


    @implementation EAGLView

    @synthesize context;
    @synthesize animationTimer;
    @synthesize animationInterval;
    @synthesize animationIntervalSave;


    // You must implement this
    + (Class)layerClass
    {
    return [CAEAGLLayer class];
    }

    //The GL view is stored in the nib file. When it's unarchived it's sent -initWithCoder:
    - (id)initWithCoderNSCoder*)coder
    {
    if ((self = [super initWithCoder:coder]))
    {
    // Get the layer
    CAEAGLLayer* eaglLayer = (CAEAGLLayer *)self.layer;

    eaglLayer.opaque = YES;
    eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];

    //by stone
    //context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
    switch(AppGetOGLESType())
    {
    case irr::video::EDT_OGLES1:
    context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES1];
    break;

    case irr::video::EDT_OGLES2:
    context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];
    break;
    }

    if (!context || ![EAGLContext setCurrentContext:context])
    {
    [self release];
    return nil;
    }

    CHECK_GL_ERROR();

    animationIntervalSave = 1.0/60.0;
    animationInterval = animationIntervalSave;
    }

    //CGFloat pixelScale = [[UIScreen mainScreen] scale];
    UIScreen *pScreen = [UIScreen mainScreen];
    CGRect fullScreenRect = pScreen.bounds;

    bool bUseSizeGuess = false;

    if (GetPrimaryGLX() == 0)
    {
    bUseSizeGuess = true;
    SetPrimaryScreenSize(fullScreenRect.size.width, fullScreenRect.size.height);
    SetupScreenInfo(GetPrimaryGLX(), GetPrimaryGLY(), 0);
    }

    if (!BaseApp::GetBaseApp()->Init())
    {

    NSLog(@"Couldn't init app");
    [self release];
    return nil;
    }

    if (bUseSizeGuess)
    {
    //put it back, otherwise we may not fix it later
    SetPrimaryScreenSize(0,0);
    }

    //BaseApp::GetBaseApp()->OnScreenSizeChange();

    return self;
    }

    - (void)onKill
    {
    BaseApp::GetBaseApp()->Kill();
    }

    - (void)drawView
    {
    if (!viewRenderbuffer)
    return;

    [EAGLContext setCurrentContext:context];

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glViewport(0, 0, GetPrimaryGLX(), GetPrimaryGLY());

    if (GetScreenSizeX() != 0)
    {
    BaseApp::GetBaseApp()->Update();
    BaseApp::GetBaseApp()->Draw();
    }
    else
    {
    //not quite ready
    }

    while (!BaseApp::GetBaseApp()->GetOSMessages()->empty())
    {
    OSMessage m = BaseApp::GetBaseApp()->GetOSMessages()->front();
    BaseApp::GetBaseApp()->GetOSMessages()->pop_front();

    //LogMsg("Got OS message %d, %s", m.m_type, m.m_string.c_str());
    MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

    [appDelegate onOSMessage: &m];
    }

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    // if(main_throttled_update())
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
    }


    - (void)layoutSubviews
    {
    [EAGLContext setCurrentContext:context];
    [self destroyFramebuffer];
    [self createFramebuffer];
    [self drawView];
    }

    - (BOOL)createFramebuffer
    {

    CGFloat pixelScale = [[UIScreen mainScreen] scale];
    UIScreen *pScreen = [UIScreen mainScreen];
    CGRect fullScreenRect = pScreen.bounds;


    LogMsg("Scale: %.2f", pixelScale);
    SetProtonPixelScaleFactor(pixelScale);

    [self setContentScaleFactor: GetProtonPixelScaleFactor()];


    glGenFramebuffersOES(1, &viewFramebuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

    glGenRenderbuffersOES(1, &viewRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);

    if (![context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawableCAEAGLLayer*)self.layer])
    return NO;

    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);

    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OE S, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OE S, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

    if (USE_DEPTH_BUFFER)
    {
    glGenRenderbuffersOES(1, &depthRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
    }

    glGenRenderbuffersOES(1, &m_StencilBuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_StencilBuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH24_STENCIL8_OES, backingWidth, backingHeight);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_StencilBuffer);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_STENCIL_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_StencilBuffer);

    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
    {
    NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
    return NO;
    }

    if (GetPrimaryGLX() == 0)
    {
    SetPrimaryScreenSize(backingWidth, backingHeight);
    SetupScreenInfo(GetPrimaryGLX(), GetPrimaryGLY(), 0);
    }


    return YES;
    }


    - (void)destroyFramebuffer
    {

    glDeleteFramebuffersOES(1, &viewFramebuffer);
    viewFramebuffer = 0;
    glDeleteRenderbuffersOES(1, &viewRenderbuffer);
    viewRenderbuffer = 0;

    if(depthRenderbuffer)
    {
    glDeleteRenderbuffersOES(1, &depthRenderbuffer);
    depthRenderbuffer = 0;
    }

    if(m_StencilBuffer)
    {
    glDeleteRenderbuffersOES(1, &m_StencilBuffer);
    m_StencilBuffer = 0;
    }
    }


    - (void)startAnimation
    {
    self.animationTimer =
    [NSTimer scheduledTimerWithTimeInterval:animationInterval
    target:self
    selector:@selector(drawView)
    userInfo:nil
    repeats:YES];

    NSRunLoop* runner = [NSRunLoop currentRunLoop];
    [runner addTimer:self.animationTimer forMode: NSRunLoopCommonModes];

    //[self.animationTimer release];
    }


    - (void)stopAnimation
    {
    self.animationTimer = nil;
    }


    - (void)setAnimationTimerNSTimer *)newTimer
    {
    [animationTimer invalidate];
    animationTimer = newTimer;
    }


    - (void)setAnimationIntervalNSTimeInterval)interval
    {

    animationInterval = interval;

    if (animationTimer)
    {
    [self stopAnimation];
    [self startAnimation];
    }
    }

    - (void)setAnimationIntervalSaveNSTimeInterval)interval
    {

    animationIntervalSave = interval;

    [self setAnimationInterval:animationIntervalSave];
    }

    - (void)dealloc
    {

    [self stopAnimation];

    if ([EAGLContext currentContext] == context)
    {
    [EAGLContext setCurrentContext:nil];
    }

    [context release];
    [super dealloc];
    }

    const int MAX_TOUCHES= 12;

    class TouchTrack
    {
    public:

    TouchTrack()
    {
    m_touchPointer = NULL;
    }

    void *m_touchPointer;
    };

    TouchTrack g_touchTracker[MAX_TOUCHES];

    int GetFingerTrackIDByTouch(void* touch)
    {
    for (int i=0; i < MAX_TOUCHES; i++)
    {
    if (g_touchTracker[i].m_touchPointer == touch)
    {
    return i;
    }
    }

    //LogMsg("Can't locate fingerID by touch %d", touch);
    return -1;
    }

    int AddNewTouch(void* touch)
    {
    for (int i=0; i < MAX_TOUCHES; i++)
    {
    if (!g_touchTracker[i].m_touchPointer)
    {
    //hey, an empty slot, yay
    g_touchTracker[i].m_touchPointer = touch;
    return i;
    }
    }

    LogMsg("Can't add new fingerID");
    return -1;
    }

    int GetTouchesActive()
    {
    int count = 0;

    for (int i=0; i < MAX_TOUCHES; i++)
    {
    if (g_touchTracker[i].m_touchPointer)
    {
    count++;
    }
    }
    return count;
    }

    //by stone
    // Handles the start of a touch
    - (void)touchesBeganNSSet *)touches withEventUIEvent *)event
    {
    // Enumerate through all the touch objects.
    UITouch* touch = [touches anyObject];

    #ifdef _IRR_COMPILE_WITH_GUI_
    CGPoint touchPoint = [touch locationInView:self];
    UIInterfaceOrientation orientation = [UIDevice currentDevice].orientation;
    irr::SEvent ev;

    float scale = 1.0f;

    //if ([self respondsToSelector:@selector(setContentScaleFactor])
    // scale = [[UIScreen mainScreen] scale];

    if (orientation == UIInterfaceOrientationLandscapeLeft
    ||
    orientation == UIInterfaceOrientationLandscapeRight)
    {
    //Landscape
    ev.MouseInput.X = touchPoint.y*scale;
    ev.MouseInput.Y = touchPoint.x*scale;
    }
    else
    {
    ev.MouseInput.X = touchPoint.x*scale;
    ev.MouseInput.Y = touchPoint.y*scale;
    }

    // event as mouse.
    ev.EventType = irr::EET_MOUSE_INPUT_EVENT;
    ev.MouseInput.Event = irr::EMIE_LMOUSE_PRESSED_DOWN;

    ev.MouseInput.ButtonStates = 0;
    IrrlichtManager::GetIrrlichtManager()->GetDevice()->postEventFromUser(ev);
    #endif

    for (touch in touches)
    {
    //found a touch. Is it already on our list?
    int fingerID = GetFingerTrackIDByTouch(touch);

    if (fingerID == -1)
    {
    //add it to our list
    fingerID = AddNewTouch(touch);
    }
    else
    {
    //already on the list. Don't send this
    //LogMsg("Ignoring touch %d", fingerID);
    continue;
    }

    CGPoint pt =[touch locationInView:self];
    ConvertCoordinatesIfRequired(pt.x, pt.y);
    MessageManager::GetMessageManager()->SendGUIEx(MESSAGE_TYPE_GUI_CLICK_START,pt.x, pt.y,fingerID);
    }
    }

    //by stone
    - (void)touchesEndedNSSet *)touches withEventUIEvent *)event
    {
    UITouch* touch = [touches anyObject];

    #ifdef _IRR_COMPILE_WITH_GUI_
    CGPoint touchPoint = [touch locationInView:self];
    UIInterfaceOrientation orientation = [UIDevice currentDevice].orientation;
    irr::SEvent ev;

    float scale = 1.0f;

    //if ([self respondsToSelector:@selector(setContentScaleFactor])
    // scale = [[UIScreen mainScreen] scale];

    if (orientation == UIInterfaceOrientationLandscapeLeft
    ||
    orientation == UIInterfaceOrientationLandscapeRight)
    {
    //Landscape
    ev.MouseInput.X = touchPoint.y*scale;
    ev.MouseInput.Y = touchPoint.x*scale;
    }
    else
    {
    ev.MouseInput.X = touchPoint.x*scale;
    ev.MouseInput.Y = touchPoint.y*scale;
    }

    ev.EventType = irr::EET_MOUSE_INPUT_EVENT;
    ev.MouseInput.Event = irr::EMIE_LMOUSE_LEFT_UP;

    ev.MouseInput.ButtonStates = 0;
    IrrlichtManager::GetIrrlichtManager()->GetDevice()->postEventFromUser(ev);
    #endif

    // Enumerate through all the touch objects.
    for (touch in touches)
    {
    //found a touch. Is it already on our list?
    int fingerID = GetFingerTrackIDByTouch(touch);
    if (fingerID != -1)
    {
    g_touchTracker[fingerID].m_touchPointer = NULL; //clear it
    }
    else
    {
    //wasn't on our list
    continue;
    }

    CGPoint pt =[touch locationInView:self];
    ConvertCoordinatesIfRequired(pt.x, pt.y);
    MessageManager::GetMessageManager()->SendGUIEx(MESSAGE_TYPE_GUI_CLICK_END,pt.x, pt.y, fingerID);
    }
    }

    - (void)touchesCancelledNSSet *)touches withEventUIEvent *)event
    {
    // Enumerate through all the touch objects.
    for (UITouch *touch in touches)
    {
    //found a touch. Is it already on our list?
    int fingerID = GetFingerTrackIDByTouch(touch);
    if (fingerID != -1)
    {
    g_touchTracker[fingerID].m_touchPointer = NULL; //clear it
    }
    else
    {
    //wasn't on our list
    continue;
    }

    CGPoint pt =[touch locationInView:self];
    ConvertCoordinatesIfRequired(pt.x, pt.y);
    MessageManager::GetMessageManager()->SendGUIEx(MESSAGE_TYPE_GUI_CLICK_END,pt.x, pt.y, fingerID);
    }
    }


    - (void)touchesMovedNSSet *)touches withEventUIEvent *)event
    {
    // Enumerate through all the touch objects.
    for (UITouch *touch in touches)
    {

    //found a touch. Is it already on our list?
    int fingerID = GetFingerTrackIDByTouch(touch);
    if (fingerID != -1)
    {
    //found it
    }
    else
    {
    //wasn't on our list?!
    continue;
    }

    CGPoint pt =[touch locationInView:self];
    ConvertCoordinatesIfRequired(pt.x, pt.y);
    MessageManager::GetMessageManager()->SendGUIEx(MESSAGE_TYPE_GUI_CLICK_MOVE,pt.x, pt.y, fingerID);
    }
    }

    @end

    - - - Updated - - -

    /*

    ===== IMPORTANT =====

    This is sample code demonstrating API, technology or techniques in development.
    Although this sample code has been reviewed for technical accuracy, it is not
    final. Apple is supplying this information to help you plan for the adoption of
    the technologies and programming interfaces described herein. This information
    is subject to change, and software implemented based on this sample code should
    be tested with final operating system software and final documentation. Newer
    versions of this sample code may be provided with future seeds of the API or
    technology. For information about updates to this and other developer
    documentation, view the New & Updated sidebars in subsequent documentation
    seeds.

    =====================

    File: EAGLView.m
    Abstract: Convenience class that wraps the CAEAGLLayer from CoreAnimation into a
    UIView subclass.

    Version: 1.3

    Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc.
    ("Apple") in consideration of your agreement to the following terms, and your
    use, installation, modification or redistribution of this Apple software
    constitutes acceptance of these terms. If you do not agree with these terms,
    please do not use, install, modify or redistribute this Apple software.

    In consideration of your agreement to abide by the following terms, and subject
    to these terms, Apple grants you a personal, non-exclusive license, under
    Apple's copyrights in this original Apple software (the "Apple Software"), to
    use, reproduce, modify and redistribute the Apple Software, with or without
    modifications, in source and/or binary forms; provided that if you redistribute
    the Apple Software in its entirety and without modifications, you must retain
    this notice and the following text and disclaimers in all such redistributions
    of the Apple Software.
    Neither the name, trademarks, service marks or logos of Apple Inc. may be used
    to endorse or promote products derived from the Apple Software without specific
    prior written permission from Apple. Except as expressly stated in this notice,
    no other rights or licenses, express or implied, are granted by Apple herein,
    including but not limited to any patent rights that may be infringed by your
    derivative works or by other works in which the Apple Software may be
    incorporated.

    The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
    WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
    WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
    COMBINATION WITH YOUR PRODUCTS.

    IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
    GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR
    DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF
    CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
    APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    Copyright (C) 2008 Apple Inc. All Rights Reserved.

    */

    #import <QuartzCore/QuartzCore.h>

    #import "EAGLView.h"
    #import "ES1Renderer.h"
    #import "CCDirector.h"
    #import "CCSet.h"
    #import "CCTouch.h"
    #import "CCIMEDispatcher.h"
    #import "OpenGL_Internal.h"

    //CLASS IMPLEMENTATIONS:

    #define MAX_TOUCHES 11

    static EAGLView *view;
    static cocos2d::CCTouch *s_pTouches[MAX_TOUCHES];

    @interface EAGLView (Private)
    - (BOOL) setupSurfaceWithSharegroupEAGLSharegroup*)sharegroup;
    - (unsigned int) convertPixelFormatNSString*) pixelFormat;
    @end

    @implementation EAGLView

    @synthesize surfaceSize=size_;
    @synthesize pixelFormat=pixelformat_, depthFormat=depthFormat_;
    @synthesize context=context_;
    @synthesize touchesIntergerDict;
    @synthesize indexBitsUsed;
    @synthesize multiSampling=multiSampling_;

    + (Class) layerClass
    {
    return [CAEAGLLayer class];
    }

    + (id) viewWithFrameCGRect)frame
    {
    return [[[self alloc] initWithFrame:frame] autorelease];
    }

    + (id) viewWithFrameCGRect)frame pixelFormatNSString*)format
    {
    return [[[self alloc]initWithFrame:frame pixelFormat:format] autorelease];
    }

    + (id) viewWithFrameCGRect)frame pixelFormatNSString*)format depthFormatGLuint)depth
    {
    return [[[self alloc] initWithFrame:frame pixelFormat:format depthFormat:depth preserveBackbuffer:NO sharegroup:nil multiSampling:NO numberOfSamples:0] autorelease];
    }

    + (id) viewWithFrameCGRect)frame pixelFormatNSString*)format depthFormatGLuint)depth preserveBackbufferBOOL)retained sharegroupEAGLSharegroup*)sharegroup multiSamplingBOOL)multisampling numberOfSamplesunsigned int)samples
    {
    return [[[self alloc]initWithFrame:frame pixelFormat:format depthFormat:depth preserveBackbuffer:retained sharegroup:sharegroup multiSampling:multisampling numberOfSamples:samples] autorelease];
    }

    + (id) sharedEGLView
    {
    return view;
    }

    - (id) initWithFrameCGRect)frame
    {
    return [self initWithFrame:frame pixelFormat:kEAGLColorFormatRGB565 depthFormat:0 preserveBackbuffer:NO sharegroup:nil multiSampling:NO numberOfSamples:0];
    }

    - (id) initWithFrameCGRect)frame pixelFormatNSString*)format
    {
    return [self initWithFrame:frame pixelFormat:format depthFormat:0 preserveBackbuffer:NO sharegroup:nil multiSampling:NO numberOfSamples:0];
    }

    - (id) initWithFrameCGRect)frame pixelFormatNSString*)format depthFormatGLuint)depth preserveBackbufferBOOL)retained sharegroupEAGLSharegroup*)sharegroup multiSamplingBOOL)sampling numberOfSamplesunsigned int)nSamples;
    {
    if((self = [super initWithFrame:frame]))
    {
    pixelformat_ = format;
    depthFormat_ = depth;
    multiSampling_ = sampling;
    requestedSamples_ = nSamples;
    preserveBackbuffer_ = retained;
    markedText_ = nil;
    if( ! [self setupSurfaceWithSharegroup:sharegroup] ) {
    [self release];
    return nil;
    }
    }

    touchesIntergerDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 4, NULL, NULL);
    indexBitsUsed = 0x00000000;

    view = self;
    return self;
    }

    -(id) initWithCoderNSCoder *)aDecoder
    {
    if( (self = [super initWithCoder:aDecoder]) ) {

    CAEAGLLayer* eaglLayer = (CAEAGLLayer*)[self layer];

    pixelformat_ = kEAGLColorFormatRGB565;
    depthFormat_ = 0; // GL_DEPTH_COMPONENT24_OES;
    multiSampling_= NO;
    requestedSamples_ = 0;
    size_ = [eaglLayer bounds].size;
    markedText_ = nil;

    if( ! [self setupSurfaceWithSharegroup:nil] ) {
    [self release];
    return nil;
    }
    }

    view = self;
    return self;
    }

    - (void)didMoveToWindow;
    {
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(onUIKeyboardNotification
    name:UIKeyboardWillShowNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(onUIKeyboardNotification
    name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(onUIKeyboardNotification
    name:UIKeyboardWillHideNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(onUIKeyboardNotification
    name:UIKeyboardDidHideNotification object:nil];
    }

    -(int) getWidth
    {
    CGSize bound = [self bounds].size;
    return bound.width;
    }

    -(int) getHeight
    {
    CGSize bound = [self bounds].size;
    return bound.height;
    }

    -(int) getUnUsedIndex
    {
    int i;
    int temp = indexBitsUsed;

    for (i = 0; i < MAX_TOUCHES; i++) {
    if (! (temp & 0x00000001)) {
    indexBitsUsed |= (1 << i);
    return i;
    }

    temp >>= 1;
    }

    // all bits are used
    return -1;
    }

    -(void) removeUsedIndexBitint) index
    {
    if (index < 0 || index >= MAX_TOUCHES) {
    return;
    }

    unsigned int temp = 1 << index;
    temp = ~temp;
    indexBitsUsed &= temp;
    }

    -(BOOL) setupSurfaceWithSharegroupEAGLSharegroup*)sharegroup
    {
    CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;

    eaglLayer.opaque = YES;
    eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBoolreserveBackbuffer_], kEAGLDrawablePropertyRetainedBacking,
    pixelformat_, kEAGLDrawablePropertyColorFormat, nil];


    renderer_ = [[ES1Renderer alloc] initWithDepthFormat:depthFormat_
    withPixelFormat:[self convertPixelFormatixelformat_]
    withSharegroup:sharegroup
    withMultiSampling:multiSampling_
    withNumberOfSamples:requestedSamples_];
    if (!renderer_)
    return NO;

    context_ = [renderer_ context];
    [context_ renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:eaglLayer];

    //discardFramebufferSupported_ = [[CCConfiguration sharedConfiguration] supportsDiscardFramebuffer];

    return YES;
    }

    - (void) dealloc
    {
    CFRelease(touchesIntergerDict);
    [renderer_ release];
    [super dealloc];
    }

    - (void) layoutSubviews
    {
    [renderer_ resizeFromLayerCAEAGLLayer*)self.layer];
    size_ = [renderer_ backingSize];

    // Issue #914 #924
    // CCDirector *director = [CCDirector sharedDirector];
    // [director reshapeProjection:size_];
    cocos2d::CCSize size;
    size.width = size_.width;
    size.height = size_.height;
    cocos2d::CCDirector::sharedDirector()->reshapeProjection(size);

    // Avoid flicker. Issue #350
    //[director performSelectorOnMainThread:@selector(drawScene) withObject:nil waitUntilDone:YES];
    cocos2d::CCDirector::sharedDirector()->drawScene();
    }

    - (void) swapBuffers
    {
    // IMPORTANT:
    // - preconditions
    // -> context_ MUST be the OpenGL context
    // -> renderbuffer_ must be the the RENDER BUFFER

    #ifdef __IPHONE_4_0

    if (multiSampling_)
    {
    /* Resolve from msaaFramebuffer to resolveFramebuffer */
    //glDisable(GL_SCISSOR_TEST);
    glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, [renderer_ msaaFrameBuffer]);
    glBindFramebufferOES(GL_DRAW_FRAMEBUFFER_APPLE, [renderer_ defaultFrameBuffer]);
    glResolveMultisampleFramebufferAPPLE();
    }

    if( discardFramebufferSupported_)
    {
    if (multiSampling_)
    {
    if (depthFormat_)
    {
    GLenum attachments[] = {GL_COLOR_ATTACHMENT0_OES, GL_DEPTH_ATTACHMENT_OES};
    glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 2, attachments);
    }
    else
    {
    GLenum attachments[] = {GL_COLOR_ATTACHMENT0_OES};
    glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 1, attachments);
    }

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, [renderer_ colorRenderBuffer]);

    }

    // not MSAA
    else if (depthFormat_ ) {
    GLenum attachments[] = { GL_DEPTH_ATTACHMENT_OES};
    glDiscardFramebufferEXT(GL_FRAMEBUFFER_OES, 1, attachments);
    }
    }

    #endif // __IPHONE_4_0

    if(![context_ presentRenderbuffer:GL_RENDERBUFFER_OES])
    {
    // CCLOG(@"cocos2d: Failed to swap renderbuffer in %s\n", __FUNCTION__);
    }

    #if COCOS2D_DEBUG
    CHECK_GL_ERROR();
    #endif

    // We can safely re-bind the framebuffer here, since this will be the
    // 1st instruction of the new main loop
    if( multiSampling_ )
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, [renderer_ msaaFrameBuffer]);
    }

    - (unsigned int) convertPixelFormatNSString*) pixelFormat
    {
    // define the pixel format
    GLenum pFormat;


    if([pixelFormat isEqualToString:@"EAGLColorFormat565"])
    pFormat = GL_RGB565_OES;
    else
    pFormat = GL_RGBA8_OES;

    return pFormat;
    }

    #pragma mark EAGLView - Point conversion

    - (CGPoint) convertPointFromViewToSurfaceCGPoint)point
    {
    CGRect bounds = [self bounds];

    CGPoint ret;
    ret.x = (point.x - bounds.origin.x) / bounds.size.width * size_.width;
    ret.y = (point.y - bounds.origin.y) / bounds.size.height * size_.height;

    return ret;
    }

    - (CGRect) convertRectFromViewToSurfaceCGRect)rect
    {
    CGRect bounds = [self bounds];

    CGRect ret;
    ret.origin.x = (rect.origin.x - bounds.origin.x) / bounds.size.width * size_.width;
    ret.origin.y = (rect.origin.y - bounds.origin.y) / bounds.size.height * size_.height;
    ret.size.width = rect.size.width / bounds.size.width * size_.width;
    ret.size.height = rect.size.height / bounds.size.height * size_.height;

    return ret;
    }

    // Pass the touches to the superview
    #pragma mark EAGLView - Touch Delegate

    - (void)touchesBeganNSSet *)touches withEventUIEvent *)event
    {
    cocos2d::CCSet set;
    cocos2d::CCTouch *pTouch;

    for (UITouch *touch in touches) {
    NSNumber *index = (NSNumber*)CFDictionaryGetValue(touchesIntergerDic t, touch);
    int unUsedIndex = 0;

    // it is a new touch
    if (! index) {
    unUsedIndex = [self getUnUsedIndex];

    // The touches is more than MAX_TOUCHES ?
    if (unUsedIndex == -1) {
    return;
    }

    pTouch = s_pTouches[unUsedIndex] = new cocos2d::CCTouch();
    }

    float x = [touch locationInView: [touch view]].x;
    float y = [touch locationInView: [touch view]].y;
    pTouch->SetTouchInfo(0, x, y);

    CFDictionaryAddValue(touchesIntergerDict, touch, [NSNumber numberWithInt:unUsedIndex]);

    set.addObject(pTouch);
    }

    cocos2d::CCDirector::sharedDirector()->getOpenGLView()->touchesBegan(&set);
    }

    - (void)touchesMovedNSSet *)touches withEventUIEvent *)event
    {
    cocos2d::CCSet set;
    for (UITouch *touch in touches) {
    NSNumber *index = (NSNumber*)CFDictionaryGetValue(touchesIntergerDic t, touch);
    if (! index) {
    // if the index doesn't exist, it is an error
    return;
    }

    cocos2d::CCTouch *pTouch = s_pTouches[[index intValue]];
    if (! pTouch) {
    // if the pTouch is null, it is an error
    return;
    }

    float x = [touch locationInView: [touch view]].x;
    float y = [touch locationInView: [touch view]].y;
    pTouch->SetTouchInfo(0, x, y);

    set.addObject(pTouch);
    }

    cocos2d::CCDirector::sharedDirector()->getOpenGLView()->touchesMoved(&set);
    }

    - (void)touchesEndedNSSet *)touches withEventUIEvent *)event
    {
    cocos2d::CCSet set;
    for (UITouch *touch in touches) {
    NSNumber *index = (NSNumber*)CFDictionaryGetValue(touchesIntergerDic t, touch);
    if (! index) {
    // if the index doesn't exist, it is an error
    return;
    }

    cocos2d::CCTouch *pTouch = s_pTouches[[index intValue]];
    if (! pTouch) {
    // if the pTouch is null, it is an error
    return;
    }

    float x = [touch locationInView: [touch view]].x;
    float y = [touch locationInView: [touch view]].y;
    pTouch->SetTouchInfo(0, x, y);

    set.addObject(pTouch);
    CFDictionaryRemoveValue(touchesIntergerDict, touch);
    pTouch->release();
    s_pTouches[[index intValue]] = NULL;
    [self removeUsedIndexBit:[index intValue]];
    }

    cocos2d::CCDirector::sharedDirector()->getOpenGLView()->touchesEnded(&set);
    }

    - (void)touchesCancelledNSSet *)touches withEventUIEvent *)event
    {
    cocos2d::CCSet set;
    for (UITouch *touch in touches) {
    NSNumber *index = (NSNumber*)CFDictionaryGetValue(touchesIntergerDic t, touch);
    if (! index) {
    // if the index doesn't exist, it is an error
    return;
    }

    cocos2d::CCTouch *pTouch = s_pTouches[[index intValue]];
    if (! pTouch) {
    // if the pTouch is null, it is an error
    return;
    }

    float x = [touch locationInView: [touch view]].x;
    float y = [touch locationInView: [touch view]].y;
    pTouch->SetTouchInfo(0, x, y);

    set.addObject(pTouch);
    CFDictionaryRemoveValue(touchesIntergerDict, touch);
    pTouch->release();
    s_pTouches[[index intValue]] = NULL;
    [self removeUsedIndexBit:[index intValue]];
    }

    cocos2d::CCDirector::sharedDirector()->getOpenGLView()->touchesCancelled(&set);
    }

    #pragma mark -
    #pragma mark UIView - Responder

    - (BOOL)canBecomeFirstResponder
    {
    if (nil != markedText_) {
    [markedText_ release];
    }
    markedText_ = nil;
    return YES;
    }

    #pragma mark -
    #pragma mark UIKeyInput protocol

    - (BOOL)hasText
    {
    return NO;
    }

    - (void)insertTextNSString *)text
    {
    if (nil != markedText_) {
    [markedText_ release];
    markedText_ = nil;
    }
    const char * pszText = [text cStringUsingEncoding:NSUTF8StringEncoding];
    cocos2d::CCIMEDispatcher::sharedDispatcher()->dispatchInsertText(pszText, strlen(pszText));
    }

    - (void)deleteBackward
    {
    if (nil != markedText_) {
    [markedText_ release];
    markedText_ = nil;
    }
    cocos2d::CCIMEDispatcher::sharedDispatcher()->dispatchDeleteBackward();
    }

    #pragma mark -
    #pragma mark UITextInputTrait protocol

    -(UITextAutocapitalizationType) autocapitalizationType
    {
    return UITextAutocapitalizationTypeNone;
    }

    #pragma mark -
    #pragma mark UITextInput protocol

    #pragma mark UITextInput - properties

    @synthesize beginningOfDocument;
    @synthesize endOfDocument;
    @synthesize inputDelegate;
    @synthesize markedTextRange;
    @synthesize markedTextStyle;
    // @synthesize selectedTextRange; // must implement
    @synthesize tokenizer;

    /* Text may have a selection, either zero-length (a caret) or ranged. Editing operations are
    * always performed on the text from this selection. nil corresponds to no selection. */
    - (void)setSelectedTextRangeUITextRange *)aSelectedTextRange;
    {
    CCLOG("UITextRange:setSelectedTextRange");
    }
    - (UITextRange *)selectedTextRange;
    {
    return [[[UITextRange alloc] init] autorelease];
    }

    #pragma mark UITextInput - Replacing and Returning Text

    - (NSString *)textInRangeUITextRange *)range;
    {
    CCLOG("textInRange");
    return @"";
    }
    - (void)replaceRangeUITextRange *)range withTextNSString *)theText;
    {
    CCLOG("replaceRange");
    }

    #pragma mark UITextInput - Working with Marked and Selected Text



    /* If text can be selected, it can be marked. Marked text represents provisionally
    * inserted text that has yet to be confirmed by the user. It requires unique visual
    * treatment in its display. If there is any marked text, the selection, whether a
    * caret or an extended range, always resides witihin.
    *
    * Setting marked text either replaces the existing marked text or, if none is present,
    * inserts it from the current selection. */

    - (void)setMarkedTextRangeUITextRange *)markedTextRange;
    {
    CCLOG("setMarkedTextRange");
    }

    - (UITextRange *)markedTextRange;
    {
    CCLOG("markedTextRange");
    return nil; // Nil if no marked text.
    }
    - (void)setMarkedTextStyleNSDictionary *)markedTextStyle;
    {
    CCLOG("setMarkedTextStyle");

    }
    - (NSDictionary *)markedTextStyle;
    {
    CCLOG("markedTextStyle");
    return nil;
    }
    - (void)setMarkedTextNSString *)markedText selectedRangeNSRange)selectedRange;
    {
    CCLOG("setMarkedText");
    if (markedText == markedText_) {
    return;
    }
    if (nil != markedText_) {
    [markedText_ release];
    }
    markedText_ = markedText;
    [markedText_ retain];
    }
    - (void)unmarkText;
    {
    CCLOG("unmarkText");
    if (nil == markedText_)
    {
    return;
    }
    const char * pszText = [markedText_ cStringUsingEncoding:NSUTF8StringEncoding];
    cocos2d::CCIMEDispatcher::sharedDispatcher()->dispatchInsertText(pszText, strlen(pszText));
    [markedText_ release];
    markedText_ = nil;
    }

    #pragma mark Methods for creating ranges and positions.

    - (UITextRange *)textRangeFromPositionUITextPosition *)fromPosition toPositionUITextPosition *)toPosition;
    {
    CCLOG("textRangeFromPosition");
    return nil;
    }
    - (UITextPosition *)positionFromPositionUITextPosition *)position offsetNSInteger)offset;
    {
    CCLOG("positionFromPosition");
    return nil;
    }
    - (UITextPosition *)positionFromPositionUITextPosition *)position inDirectionUITextLayoutDirection)direction offsetNSInteger)offset;
    {
    CCLOG("positionFromPosition");
    return nil;
    }

    /* Simple evaluation of positions */
    - (NSComparisonResult)comparePositionUITextPosition *)position toPositionUITextPosition *)other;
    {
    CCLOG("comparePosition");
    return 0;
    }
    - (NSInteger)offsetFromPositionUITextPosition *)from toPositionUITextPosition *)toPosition;
    {
    CCLOG("offsetFromPosition");
    return 0;
    }

    - (UITextPosition *)positionWithinRangeUITextRange *)range farthestInDirectionUITextLayoutDirection)direction;
    {
    CCLOG("positionWithinRange");
    return nil;
    }
    - (UITextRange *)characterRangeByExtendingPositionUITextPosition *)position inDirectionUITextLayoutDirection)direction;
    {
    CCLOG("characterRangeByExtendingPosition");
    return nil;
    }

    #pragma mark Writing direction

    - (UITextWritingDirection)baseWritingDirectionForPos itionUITextPosition *)position inDirectionUITextStorageDirection)direction;
    {
    CCLOG("baseWritingDirectionForPosition");
    return UITextWritingDirectionNatural;
    }
    - (void)setBaseWritingDirectionUITextWritingDirection)writingDirection forRangeUITextRange *)range;
    {
    CCLOG("setBaseWritingDirection");
    }

    #pragma mark Geometry

    /* Geometry used to provide, for example, a correction rect. */
    - (CGRect)firstRectForRangeUITextRange *)range;
    {
    CCLOG("firstRectForRange");
    return CGRectNull;
    }
    - (CGRect)caretRectForPositionUITextPosition *)position;
    {
    CCLOG("caretRectForPosition");
    return caretRect_;
    }

    #pragma mark Hit testing

    /* JS - Find the closest position to a given point */
    - (UITextPosition *)closestPositionToPointCGPoint)point;
    {
    CCLOG("closestPositionToPoint");
    return nil;
    }
    - (UITextPosition *)closestPositionToPointCGPoint)point withinRangeUITextRange *)range;
    {
    CCLOG("closestPositionToPoint");
    return nil;
    }
    - (UITextRange *)characterRangeAtPointCGPoint)point;
    {
    CCLOG("characterRangeAtPoint");
    return nil;
    }

    #pragma mark -
    #pragma mark UIKeyboard notification

    - (void)onUIKeyboardNotificationNSNotification *)notif;
    {
    NSString * type = notif.name;

    NSDictionary* info = [notif userInfo];
    CGRect begin = [self convertRect:
    [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue]
    fromView:self];
    CGRect end = [self convertRect:
    [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]
    fromView:self];
    double aniDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKe y] doubleValue];

    CGSize viewSize = self.frame.size;
    CGFloat tmp;

    switch ([[UIApplication sharedApplication] statusBarOrientation])
    {
    case UIInterfaceOrientationPortrait:
    begin.origin.y = viewSize.height - begin.origin.y - begin.size.height;
    end.origin.y = viewSize.height - end.origin.y - end.size.height;
    break;

    case UIInterfaceOrientationPortraitUpsideDown:
    begin.origin.x = viewSize.width - (begin.origin.x + begin.size.width);
    end.origin.x = viewSize.width - (end.origin.x + end.size.width);
    break;

    case UIInterfaceOrientationLandscapeLeft:
    tmp = begin.size.width;
    begin.size.width = begin.size.height;
    begin.size.height = tmp;
    tmp = end.size.width;
    end.size.width = end.size.height;
    end.size.height = tmp;
    tmp = viewSize.width;
    viewSize.width = viewSize.height;
    viewSize.height = tmp;

    tmp = begin.origin.x;
    begin.origin.x = begin.origin.y;
    begin.origin.y = viewSize.height - tmp - begin.size.height;
    tmp = end.origin.x;
    end.origin.x = end.origin.y;
    end.origin.y = viewSize.height - tmp - end.size.height;
    break;

    case UIInterfaceOrientationLandscapeRight:
    tmp = begin.size.width;
    begin.size.width = begin.size.height;
    begin.size.height = tmp;
    tmp = end.size.width;
    end.size.width = end.size.height;
    end.size.height = tmp;
    tmp = viewSize.width;
    viewSize.width = viewSize.height;
    viewSize.height = tmp;

    tmp = begin.origin.x;
    begin.origin.x = begin.origin.y;
    begin.origin.y = tmp;
    tmp = end.origin.x;
    end.origin.x = end.origin.y;
    end.origin.y = tmp;
    break;

    default:
    break;
    }
    cocos2d::CCIMEKeyboardNotificationInfo notiInfo;
    notiInfo.begin = cocos2d::CCRect(begin.origin.x,
    begin.origin.y,
    begin.size.width,
    begin.size.height);
    notiInfo.end = cocos2d::CCRect(end.origin.x,
    end.origin.y,
    end.size.width,
    end.size.height);
    notiInfo.duration = (float)aniDuration;
    cocos2d::CCIMEDispatcher* dispatcher = cocos2d::CCIMEDispatcher::sharedDispatcher();
    if (UIKeyboardWillShowNotification == type)
    {
    dispatcher->dispatchKeyboardWillShow(notiInfo);
    }
    else if (UIKeyboardDidShowNotification == type)
    {
    //CGSize screenSize = self.window.screen.bounds.size;
    dispatcher->dispatchKeyboardDidShow(notiInfo);
    caretRect_ = end;
    caretRect_.origin.y = viewSize.height - (caretRect_.origin.y + caretRect_.size.height + [UIFont smallSystemFontSize]);
    caretRect_.size.height = 0;
    }
    else if (UIKeyboardWillHideNotification == type)
    {
    dispatcher->dispatchKeyboardWillHide(notiInfo);
    }
    else if (UIKeyboardDidHideNotification == type)
    {
    caretRect_ = CGRectZero;
    dispatcher->dispatchKeyboardDidHide(notiInfo);
    }
    }
    @end
    Wow, that's ALOT of stuff to type ._.



  5. #5
    Lesser Wizard
    Join Date
    Feb 2013
    Posts
    142

    Default impelement cocos2d + irrlicht 3D answer

    my ask~~~

    1.
    use the 2 egl layers? one for cocos2d, one for irrlicht
    and cocos2d cover on irrlicht

    2.
    or use the same ogl layer?

    ///////////////////////////////////////////////////////////////////////

    receiver:jesse stone

    Hi. Jesse Stone

    I’ve used one EGL layer.
    I’ve first drawn irrlicht, then cocos2d.

    In addition, it is still important that OpenGL-E should recover state like glEnable, glBindTexture, etc.

    Especially, remember OpenGL is a sort of State Machine.



    Quote Originally Posted by Simplify_ View Post
    Wow, that's ALOT of stuff to type ._.

  6. #6
    Lesser Wizard
    Join Date
    Feb 2013
    Posts
    142

    Default proton cocos2d

    After mix lastest version cocos2d GUI and proton OGLES2 on shared directory

    I will open the source link here

  7. #7
    Lesser Wizard
    Join Date
    Feb 2013
    Posts
    142

    Default code sample

    https://plus.google.com/photos/10618...41018774360364

    code sample Move to irrlicht 3d forum

    Quote Originally Posted by feelthat View Post
    After mix lastest version cocos2d GUI and proton OGLES2 on shared directory

    I will open the source link here
    Last edited by feelthat; 02-21-2015 at 12:49 PM.

  8. #8
    Lesser Wizard
    Join Date
    Feb 2013
    Posts
    142

    Default libGLESv2.lib can not simulator glLinkProgram

    the libGLESv2.lib can not simulator glLinkProgram(Program);

    so GLES 2.0 can not do well~

    Quote Originally Posted by feelthat View Post
    After mix lastest version cocos2d GUI and proton OGLES2 on shared directory

    I will open the source link here

Bookmarks

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •