| Index: plugin/mac/o3d_layer.mm
|
| ===================================================================
|
| --- plugin/mac/o3d_layer.mm (revision 0)
|
| +++ plugin/mac/o3d_layer.mm (revision 0)
|
| @@ -0,0 +1,187 @@
|
| +/*
|
| + * Copyright 2009, Google Inc.
|
| + * All rights reserved.
|
| + *
|
| + * Redistribution and use in source and binary forms, with or without
|
| + * modification, are permitted provided that the following conditions are
|
| + * met:
|
| + *
|
| + * * Redistributions of source code must retain the above copyright
|
| + * notice, this list of conditions and the following disclaimer.
|
| + * * Redistributions in binary form must reproduce the above
|
| + * copyright notice, this list of conditions and the following disclaimer
|
| + * in the documentation and/or other materials provided with the
|
| + * distribution.
|
| + * * Neither the name of Google Inc. nor the names of its
|
| + * contributors may be used to endorse or promote products derived from
|
| + * this software without specific prior written permission.
|
| + *
|
| + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| + */
|
| +
|
| +
|
| +#import "plugin_mac.h"
|
| +#import <OpenGL/OpenGL.h>
|
| +#import "o3d_layer.h"
|
| +
|
| +#include "display_window_mac.h"
|
| +using o3d::DisplayWindowMac;
|
| +
|
| +@implementation O3DLayer
|
| +
|
| +
|
| +- (id)init {
|
| + self = [super init];
|
| +
|
| + // Set ourselves up to composite correctly. Users can write
|
| + // arbitrary alpha values into the back buffer but O3D's output is
|
| + // defined as being opaque. For correct rendering results we must
|
| + // basically drop the alpha channel while drawing to the screen
|
| + // using Core Animation. Setting the opaque flag achieves this.
|
| + if (self != nil) {
|
| + self.opaque = YES;
|
| + }
|
| +
|
| + return self;
|
| +}
|
| +
|
| +- (void)setPluginObject:(PluginObject *)obj {
|
| + obj_ = obj;
|
| +}
|
| +
|
| +
|
| +/* Called when a new frame needs to be generated for layer time 't'.
|
| + * 'ctx' is attached to the rendering destination. It's state is
|
| + * otherwise undefined. When non-null 'ts' describes the display
|
| + * timestamp associated with layer time 't'. The default implementation
|
| + * of the method flushes the context. */
|
| +
|
| +
|
| +- (void)drawInCGLContext:(CGLContextObj)ctx
|
| + pixelFormat:(CGLPixelFormatObj)pf
|
| + forLayerTime:(CFTimeInterval)t
|
| + displayTime:(const CVTimeStamp *)ts {
|
| +
|
| + // Set the current context to the one given to us.
|
| + CGLSetCurrentContext(ctx);
|
| +
|
| + if (created_context_) {
|
| + DCHECK_EQ(ctx, obj_->mac_cgl_context_);
|
| + o3d::DisplayWindowMac default_display;
|
| + default_display.set_agl_context(obj_->mac_agl_context_);
|
| + default_display.set_cgl_context(obj_->mac_cgl_context_);
|
| + obj_->CreateRenderer(default_display);
|
| + obj_->client()->Init();
|
| + created_context_ = false;
|
| + }
|
| +
|
| + if (was_resized_) {
|
| + obj_->Resize(width_, height_);
|
| + was_resized_ = false;
|
| + }
|
| +
|
| +
|
| + if (obj_) {
|
| + obj_->client()->Tick();
|
| + obj_->client()->RenderClient(true);
|
| + }
|
| +
|
| + // Call super to finalize the drawing. By default it just calls glFlush().
|
| + [super drawInCGLContext:ctx pixelFormat:pf forLayerTime:t displayTime:ts];
|
| +}
|
| +
|
| +- (BOOL)canDrawInCGLContext:(CGLContextObj)ctx
|
| + pixelFormat:(CGLPixelFormatObj)pf
|
| + forLayerTime:(CFTimeInterval)t
|
| + displayTime:(const CVTimeStamp *)ts {
|
| + return YES;
|
| +}
|
| +
|
| +
|
| +
|
| +
|
| +/* Called by the CAOpenGLLayer implementation when a rendering context
|
| + * is needed by the layer. Should return an OpenGL context with
|
| + * renderers from pixel format 'pixelFormat'. The default implementation
|
| + * allocates a new context with a null share context. */
|
| +- (CGLContextObj)copyCGLContextForPixelFormat:(CGLPixelFormatObj)pixelFormat {
|
| + glContext_ = [super copyCGLContextForPixelFormat:pixelFormat];
|
| + obj_->mac_cgl_context_ = glContext_;
|
| + created_context_ = true;
|
| +
|
| + return glContext_;
|
| +}
|
| +
|
| +/*
|
| +- (CGLPixelFormatObj)copyCGLPixelFormatForDisplayMask:(uint32_t)mask {
|
| + return [super copyCGLPixelFormatForDisplayMask:mask];
|
| +}*/
|
| +
|
| +
|
| +#define PFA(number) static_cast<CGLPixelFormatAttribute>(number)
|
| +
|
| +#define O3D_COLOR_AND_DEPTH_SETTINGS kCGLPFAClosestPolicy, \
|
| + kCGLPFAColorSize, PFA(24), \
|
| + kCGLPFAAlphaSize, PFA(8), \
|
| + kCGLPFADepthSize, PFA(24), \
|
| + kCGLPFADoubleBuffer,
|
| +#define O3D_STENCIL_SETTINGS kCGLPFAStencilSize, PFA(8),
|
| +#define O3D_HARDWARE_RENDERER kCGLPFAAccelerated, kCGLPFANoRecovery,
|
| +#define O3D_MULTISAMPLE kCGLPFAMultisample, kCGLPFASamples, PFA(4),
|
| +#define O3D_DISPLAY_MASK(mask) kCGLPFADisplayMask, PFA(mask),
|
| +#define O3D_END PFA(0)
|
| +- (CGLPixelFormatObj)copyCGLPixelFormatForDisplayMask:(uint32_t)mask {
|
| + const CGLPixelFormatAttribute attributes[] = {
|
| + O3D_COLOR_AND_DEPTH_SETTINGS
|
| + O3D_STENCIL_SETTINGS
|
| + O3D_HARDWARE_RENDERER
|
| + O3D_DISPLAY_MASK(mask)
|
| + O3D_MULTISAMPLE
|
| + O3D_END
|
| + };
|
| + CGLPixelFormatObj pixel_format = NULL;
|
| + GLint num_screens = 0;
|
| + if (!CGLChoosePixelFormat(attributes, &pixel_format, &num_screens) &&
|
| + pixel_format) {
|
| + return pixel_format;
|
| + } else {
|
| + // Try a less capable set.
|
| + static const CGLPixelFormatAttribute low_end_attributes[] = {
|
| + O3D_COLOR_AND_DEPTH_SETTINGS
|
| + O3D_STENCIL_SETTINGS
|
| + O3D_HARDWARE_RENDERER
|
| + O3D_DISPLAY_MASK(mask)
|
| + O3D_END
|
| + };
|
| + if (!CGLChoosePixelFormat(low_end_attributes,
|
| + &pixel_format, &num_screens) && pixel_format) {
|
| + return pixel_format;
|
| + } else {
|
| + // Do whatever the superclass supports.
|
| + return [super copyCGLPixelFormatForDisplayMask:mask];
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| +- (CGLContextObj)glContext {
|
| + return glContext_;
|
| +}
|
| +
|
| +- (void)setWidth:(int)width height:(int)height {
|
| + width_ = width;
|
| + height_ = height;
|
| + was_resized_ = true;
|
| +}
|
| +
|
| +@end
|
|
|
| Property changes on: plugin/mac/o3d_layer.mm
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|