diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index 028920df..00ef0112 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -242,8 +242,8 @@ void VulkanExampleBase::nextFrame() frameCounter++; auto tEnd = std::chrono::high_resolution_clock::now(); auto tDiff = std::chrono::duration(tEnd - tStart).count(); -#if defined(VK_USE_PLATFORM_MACOS_MVK) - frameTimer = (float)tDiff / 100.0f; // SRS - Divide by 100 for macOS - perhaps shorter tDiff due to background rendering? +#if (defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK)) + frameTimer = (float)tDiff * refreshPeriod; // SRS - Multiply by the display refresh period due to fixed vsync rendering on iOS and macOS #else frameTimer = (float)tDiff / 1000.0f; #endif diff --git a/base/vulkanexamplebase.h b/base/vulkanexamplebase.h index 14644f6b..4d5befcd 100644 --- a/base/vulkanexamplebase.h +++ b/base/vulkanexamplebase.h @@ -254,6 +254,7 @@ public: int64_t lastTapTime = 0; #elif (defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK)) void* view; + double refreshPeriod = 1.0/60.0; // SRS - default refreshPeriod for 60 fps display #elif defined(VK_USE_PLATFORM_DIRECTFB_EXT) bool quit = false; IDirectFB *dfb = nullptr; diff --git a/xcode/MVKExample.cpp b/xcode/MVKExample.cpp index df8ac5e5..b1dc66dd 100644 --- a/xcode/MVKExample.cpp +++ b/xcode/MVKExample.cpp @@ -11,15 +11,19 @@ #include "examples.h" /* -void MVKExample::renderFrame() { // SRS - don't need to expose VulkanExampleBase::renderFrame() to DemoViewController +void MVKExample::renderFrame() { // SRS - don't need to expose VulkanExampleBase::renderFrame() to DemoViewController _vulkanExample->renderFrame(); } */ -void MVKExample::displayLinkOutputCb() { // SRS - expose VulkanExampleBase::displayLinkOutputCb() to DemoViewController +void MVKExample::displayLinkOutputCb() { // SRS - expose VulkanExampleBase::displayLinkOutputCb() to DemoViewController _vulkanExample->displayLinkOutputCb(); } +void MVKExample::getRefreshPeriod(double refreshPeriod) { // SRS - get the actual refresh period of the display + _vulkanExample->refreshPeriod = refreshPeriod; +} + void MVKExample::windowWillResize(float x, float y) { _vulkanExample->windowWillResize(x, y); } @@ -85,14 +89,22 @@ void MVKExample::mouseUp(double x, double y) { _vulkanExample->mouseButtons.left = false; } -void MVKExample::otherMouseDown() { +void MVKExample::rightMouseDown() { _vulkanExample->mouseButtons.right = true; } -void MVKExample::otherMouseUp() { +void MVKExample::rightMouseUp() { _vulkanExample->mouseButtons.right = false; } +void MVKExample::otherMouseDown() { + _vulkanExample->mouseButtons.middle = true; +} + +void MVKExample::otherMouseUp() { + _vulkanExample->mouseButtons.middle = false; +} + void MVKExample::mouseDragged(double x, double y) { _vulkanExample->mouseDragged(x, y); } @@ -109,7 +121,7 @@ MVKExample::MVKExample(void* view) { _vulkanExample = new VulkanExample(); _vulkanExample->initVulkan(); _vulkanExample->setupWindow(view); -// _vulkanExample->initSwapchain(); // SRS - initSwapchain() is now part of VulkanExampleBase::prepare() + //_vulkanExample->initSwapchain(); // SRS - initSwapchain() is now part of VulkanExampleBase::prepare() _vulkanExample->prepare(); } diff --git a/xcode/MVKExample.h b/xcode/MVKExample.h index 34cb35e6..254f3485 100644 --- a/xcode/MVKExample.h +++ b/xcode/MVKExample.h @@ -15,6 +15,7 @@ class MVKExample { public: //void renderFrame(); // SRS - don't need to expose VulkanExampleBase::renderFrame() to DemoViewController void displayLinkOutputCb(); // SRS - expose VulkanExampleBase::displayLinkOutputCb() to DemoViewController + void getRefreshPeriod(double refreshPeriod); // SRS - get the actual refresh period of the display void windowWillResize(float x, float y); // SRS - expose window resize events to DemoViewController void windowDidResize(); @@ -25,6 +26,8 @@ public: void mouseDown(double x, double y); // SRS - expose mouse events to DemoViewController void mouseUp(double x, double y); + void rightMouseDown(); + void rightMouseUp(); void otherMouseDown(); void otherMouseUp(); void mouseDragged(double x, double y); diff --git a/xcode/macos/DemoViewController.mm b/xcode/macos/DemoViewController.mm index a58a81d1..d135854b 100644 --- a/xcode/macos/DemoViewController.mm +++ b/xcode/macos/DemoViewController.mm @@ -48,7 +48,14 @@ MVKExample* _mvkExample; CVDisplayLinkStart(_displayLink); } -// SRS - Handle window resize events +// SRS - get the actual refresh period of the display +-(void) viewWillAppear { + [super viewWillAppear]; + + _mvkExample->getRefreshPeriod(CVDisplayLinkGetActualOutputVideoRefreshPeriod(_displayLink)); +} + +// SRS - Handle window resize events (FIXME: resizeable window not yet supported at init) -(NSSize) windowWillResize:(NSWindow*) sender toSize:(NSSize)frameSize { CVDisplayLinkStop(_displayLink); _mvkExample->windowWillResize(frameSize.width, frameSize.height); @@ -118,6 +125,14 @@ MVKExample* _mvkExample; _mvkExample->mouseUp(point.x, point.y); } +-(void) rightMouseDown:(NSEvent*) theEvent { + _mvkExample->rightMouseDown(); +} + +-(void) rightMouseUp:(NSEvent*) theEvent { + _mvkExample->rightMouseUp(); +} + -(void) otherMouseDown:(NSEvent*) theEvent { _mvkExample->otherMouseDown(); } @@ -131,6 +146,16 @@ MVKExample* _mvkExample; _mvkExample->mouseDragged(point.x, point.y); } +-(void) rightMouseDragged:(NSEvent*) theEvent { + auto point = [self getMouseLocalPoint:theEvent]; + _mvkExample->mouseDragged(point.x, point.y); +} + +-(void) otherMouseDragged:(NSEvent*) theEvent { + auto point = [self getMouseLocalPoint:theEvent]; + _mvkExample->mouseDragged(point.x, point.y); +} + -(void) mouseMoved:(NSEvent*) theEvent { auto point = [self getMouseLocalPoint:theEvent]; _mvkExample->mouseDragged(point.x, point.y);