Start refactoring of OpenVulkanoView implementation (#1)
This commit is contained in:
@@ -8,21 +8,57 @@
|
||||
|
||||
#include "Input/Touch/InputDeviceTouch.hpp"
|
||||
#include "Input/InputManager.hpp"
|
||||
#include "MetalViewWindow.h"
|
||||
#include <map>
|
||||
|
||||
#import <MetalKit/MTKView.h>
|
||||
|
||||
using namespace OpenVulkano;
|
||||
|
||||
#pragma mark MetalViewDelegate
|
||||
@interface MetalViewDelegate : NSObject<MTKViewDelegate>
|
||||
- (void) mtkView:(MTKView *) view drawableSizeWillChange:(CGSize) size;
|
||||
- (void) drawInMTKView:(MTKView *) view;
|
||||
@end
|
||||
|
||||
@implementation MetalViewDelegate
|
||||
{
|
||||
MetalViewWindow* window;
|
||||
}
|
||||
|
||||
- (id)initWithWindow:(MetalViewWindow*)win
|
||||
{
|
||||
window = win;
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void) mtkView:(MTKView *) view drawableSizeWillChange:(CGSize) size
|
||||
{
|
||||
window->OnResize(size.width, size.height);
|
||||
}
|
||||
|
||||
- (void) drawInMTKView:(MTKView *) view
|
||||
{
|
||||
@autoreleasepool {
|
||||
window->TickHandler();
|
||||
}
|
||||
}
|
||||
@end
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark OpenVulkanoView
|
||||
|
||||
using namespace OpenVulkano;
|
||||
|
||||
@interface OpenVulkanoView()
|
||||
{
|
||||
CADisplayLink * m_displayLink;
|
||||
CADisplayLink* m_displayLink;
|
||||
MetalViewDelegate* m_mtdelegate;
|
||||
std::map<UITouch*, int32_t> m_touchToIdMap;
|
||||
Input::InputDeviceTouch m_touchDevice;
|
||||
MetalViewWindow m_window;
|
||||
}
|
||||
@end
|
||||
|
||||
#pragma mark OpenVulkanoView Implementation
|
||||
@implementation OpenVulkanoView
|
||||
/** Returns a Metal-compatible layer. */
|
||||
+(Class) layerClass { return [CAMetalLayer class]; }
|
||||
@@ -45,8 +81,28 @@ using namespace OpenVulkano;
|
||||
|
||||
- (void)commonInit {
|
||||
[self setMultipleTouchEnabled:YES];
|
||||
|
||||
self.contentScaleFactor = UIScreen.mainScreen.nativeScale / 1.5f;
|
||||
|
||||
auto size = self.bounds.size;
|
||||
auto sizeX = size.width * self.contentScaleFactor;
|
||||
auto sizeY = size.height * self.contentScaleFactor;
|
||||
m_window.Init(self.layer, {sizeX, sizeY});
|
||||
|
||||
m_touchDevice.Init(); //TODO link window
|
||||
Input::InputManager::GetInstance()->RegisterInputDevice(&m_touchDevice);
|
||||
|
||||
if ([self isKindOfClass:[MTKView class]]) {
|
||||
MTKView* mtkView = (MTKView*)(self);
|
||||
m_mtdelegate = [[MetalViewDelegate alloc] initWithWindow:&m_window];
|
||||
[mtkView setDelegate:m_mtdelegate];
|
||||
mtkView.preferredFramesPerSecond = 60;
|
||||
} else {
|
||||
m_displayLink = [CADisplayLink displayLinkWithTarget: self selector: @selector(renderLoop)];
|
||||
[m_displayLink setPreferredFramesPerSecond: 60];
|
||||
[m_displayLink addToRunLoop: NSRunLoop.currentRunLoop forMode: NSDefaultRunLoopMode];
|
||||
m_displayLink.paused = YES;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
@@ -55,9 +111,23 @@ using namespace OpenVulkano;
|
||||
}
|
||||
Input::InputManager::GetInstance()->UnregisterInputDevice(&m_touchDevice);
|
||||
m_touchDevice.Close();
|
||||
[m_displayLink release];
|
||||
[m_mtdelegate release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void)layoutSubviews {
|
||||
[super layoutSubviews];
|
||||
|
||||
if (m_displayLink)
|
||||
{ // Only use this update method if we use display link instead of metal delegate
|
||||
auto size = self.bounds.size;
|
||||
auto sizeX = size.width * self.contentScaleFactor;
|
||||
auto sizeY = size.height * self.contentScaleFactor;
|
||||
m_window.OnResize(sizeX, sizeY);
|
||||
}
|
||||
}
|
||||
|
||||
- (Math::Vector2f)getTouchPosition:(UITouch*)touch
|
||||
{
|
||||
CGPoint uitouchLocation = [touch locationInView:touch.view];
|
||||
@@ -121,5 +191,44 @@ using namespace OpenVulkano;
|
||||
}
|
||||
}
|
||||
|
||||
-(void*)GetWindow
|
||||
{
|
||||
return &m_window;
|
||||
}
|
||||
|
||||
-(void) renderLoop
|
||||
{
|
||||
m_window.TickHandler();
|
||||
}
|
||||
|
||||
-(void)WillAppear
|
||||
{
|
||||
if (m_displayLink) m_displayLink.paused = NO;
|
||||
}
|
||||
|
||||
-(void)DidAppear
|
||||
{
|
||||
if (m_displayLink) m_displayLink.paused = NO;
|
||||
}
|
||||
|
||||
-(void)WillDisappear
|
||||
{
|
||||
if (m_displayLink) m_displayLink.paused = YES;
|
||||
}
|
||||
|
||||
-(void)DidDisappear
|
||||
{
|
||||
if (m_displayLink) m_displayLink.paused = YES;
|
||||
}
|
||||
|
||||
-(void)DidUnload
|
||||
{
|
||||
if (m_displayLink)
|
||||
{
|
||||
[m_displayLink invalidate];
|
||||
[m_displayLink release];
|
||||
m_displayLink = nil;
|
||||
}
|
||||
}
|
||||
@end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user