|
|
@@ -8,22 +8,20 @@
|
|
|
|
|
|
#import "GameView.h"
|
|
|
|
|
|
-#include <memory>
|
|
|
-#include <OpenGL/gl3.h>
|
|
|
+#import "AppDelegate.h"
|
|
|
+#import "GameBridge.h"
|
|
|
|
|
|
-#include "danmaku/world.hpp"
|
|
|
+#include <OpenGL/gl3.h>
|
|
|
#include "game/engine/events.hpp"
|
|
|
-#include "game/engine/game_dispatch.hpp"
|
|
|
-#include "game/graphics/renderer.hpp"
|
|
|
+#include "vector/vector.hpp"
|
|
|
|
|
|
namespace env { namespace detail {
|
|
|
extern void resize_screen(math::vec2i const&);
|
|
|
}}
|
|
|
|
|
|
-@implementation GameView {
|
|
|
- std::shared_ptr<graphics::direct_renderer> renderer;
|
|
|
- std::shared_ptr<engine::game_dispatch> game;
|
|
|
-}
|
|
|
+@implementation GameView
|
|
|
+
|
|
|
+@synthesize gamebridge;
|
|
|
|
|
|
- (id)initWithFrame:(NSRect)aRect {
|
|
|
NSOpenGLPixelFormatAttribute attr[] = {
|
|
|
@@ -42,14 +40,6 @@ namespace env { namespace detail {
|
|
|
return nil;
|
|
|
}
|
|
|
|
|
|
- using graphics::direct_renderer;
|
|
|
- using graphics::driver;
|
|
|
- renderer = std::make_shared<direct_renderer>(driver::openGL);
|
|
|
- game = std::make_shared<engine::game_dispatch>(renderer);
|
|
|
- auto world = danmaku::world::load_world("scripts/level/world.json", game);
|
|
|
- game->register_scene(world);
|
|
|
- game->activate_scene("light-1");
|
|
|
-
|
|
|
// make the context current
|
|
|
NSOpenGLContext* context = [[NSOpenGLContext alloc] initWithFormat:nsglFormat
|
|
|
shareContext:nil];
|
|
|
@@ -70,20 +60,26 @@ namespace env { namespace detail {
|
|
|
forParameter:NSOpenGLCPSurfaceOpacity];
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+- (void) setScreenSize:(CGSize)dims {
|
|
|
+ [self setScreenWidth:dims.width andHeight:dims.height];
|
|
|
+}
|
|
|
+
|
|
|
+- (void) setScreenWidth:(int)width andHeight:(int)height {
|
|
|
+ env::detail::resize_screen(make_vector(width, height));
|
|
|
+}
|
|
|
+
|
|
|
- (void)drawRect:(NSRect)dirtyRect {
|
|
|
// glClear(GL_COLOR_BUFFER_BIT);
|
|
|
// glLoadIdentity();
|
|
|
|
|
|
- env::detail::resize_screen({{(int)dirtyRect.size.width,
|
|
|
- (int)dirtyRect.size.height}});
|
|
|
- if (game) {
|
|
|
- renderer->clear();
|
|
|
- game->render();
|
|
|
- }
|
|
|
+ [self setScreenSize:dirtyRect.size];
|
|
|
+
|
|
|
// glFlush();
|
|
|
// the correct way to do double buffering on Mac is this:
|
|
|
[[self openGLContext] flushBuffer];
|
|
|
-
|
|
|
+ [[self gamebridge] refresh];
|
|
|
+
|
|
|
int err;
|
|
|
if ((err = glGetError()) != 0) {
|
|
|
NSLog(@"glGetError(): %d", err);
|
|
|
@@ -97,13 +93,11 @@ namespace env { namespace detail {
|
|
|
|
|
|
// window resize; width and height are in pixel coordinates
|
|
|
// but they are floats
|
|
|
- float screen_w = [self frame].size.width;
|
|
|
- float screen_h = [self frame].size.height;
|
|
|
|
|
|
// glViewport(0,0, screen_w, screen_h);
|
|
|
|
|
|
// here I cast floats to ints; most systems use integer coordinate systems
|
|
|
- env::detail::resize_screen({{(int)screen_w, (int)screen_h}});
|
|
|
+ [self setScreenSize:[self frame].size];
|
|
|
}
|
|
|
|
|
|
- (BOOL)acceptsFirstResponder {
|
|
|
@@ -113,14 +107,14 @@ namespace env { namespace detail {
|
|
|
- (void) press_key:(int)key forEvent:(NSEvent *)evt ns_key:(int)local
|
|
|
down:(BOOL)pressed {
|
|
|
if ([evt keyCode] == local) {
|
|
|
- game->process_key_event(key, pressed);
|
|
|
+ [[self gamebridge] keyEvent:key down:pressed];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- (void) toggle_key:(int)key forEvent:(NSEvent *)evt ns_key:(int)local {
|
|
|
NSUInteger flags = [evt modifierFlags] &
|
|
|
NSEventModifierFlagDeviceIndependentFlagsMask;
|
|
|
- game->process_key_event(key, flags & local);
|
|
|
+ [[self gamebridge] keyEvent:key down:(flags & local)];
|
|
|
}
|
|
|
|
|
|
- (void)keyDown:(NSEvent *)theEvent {
|
|
|
@@ -152,7 +146,7 @@ namespace env { namespace detail {
|
|
|
|
|
|
NSLog(@"keyDown -> { 0x%04x, 0x%08lx, 0x%02x=%c }", [theEvent keyCode],
|
|
|
[theEvent modifierFlags], c, c);
|
|
|
- game->process_key_event(c, true);
|
|
|
+ [[self gamebridge] keyEvent:c down:YES];
|
|
|
}
|
|
|
|
|
|
- (void)keyUp:(NSEvent *)theEvent {
|
|
|
@@ -172,7 +166,7 @@ namespace env { namespace detail {
|
|
|
[self press_key:LEFT_ARROW forEvent:theEvent ns_key:0x007b down:NO];
|
|
|
[self press_key:RIGHT_ARROW forEvent:theEvent ns_key:0x007c down:NO];
|
|
|
|
|
|
- game->process_key_event(c, false);
|
|
|
+ [[self gamebridge] keyEvent:c down:NO];
|
|
|
}
|
|
|
|
|
|
static NSTimer *timer = nil;
|
|
|
@@ -214,18 +208,19 @@ static NSTimeInterval const FRAME_INTERVAL = 1.0 / 60.0;
|
|
|
}
|
|
|
|
|
|
- (void)renderEvent:(NSTimer *)t {
|
|
|
- game->render();
|
|
|
+ [[self gamebridge] render];
|
|
|
[[self openGLContext] flushBuffer];
|
|
|
}
|
|
|
|
|
|
- (void)timerEvent:(NSTimer *)t {
|
|
|
- game->update();
|
|
|
+ [[self gamebridge] update];
|
|
|
[self setNeedsDisplay:YES];
|
|
|
}
|
|
|
|
|
|
- (void) awakeFromNib
|
|
|
{
|
|
|
NSOpenGLPixelFormatAttribute attributes [] = {
|
|
|
+ NSOpenGLPFADoubleBuffer,
|
|
|
NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)24,
|
|
|
NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
|
|
|
(NSOpenGLPixelFormatAttribute)0
|