refactor iOS
added mfb_set_resize_callback to iOS minor fixes on iOS & MacOS X
This commit is contained in:
parent
6a96ceb1f5
commit
2be0d5a7e0
@ -44,6 +44,8 @@ set(SrcMacOSX
|
|||||||
set(SrcIOS
|
set(SrcIOS
|
||||||
src/ios/WindowData_IOS.h
|
src/ios/WindowData_IOS.h
|
||||||
src/ios/iOSMiniFB.m
|
src/ios/iOSMiniFB.m
|
||||||
|
src/ios/iOSView.h
|
||||||
|
src/ios/iOSView.m
|
||||||
src/ios/iOSViewController.h
|
src/ios/iOSViewController.h
|
||||||
src/ios/iOSViewController.m
|
src/ios/iOSViewController.m
|
||||||
src/ios/iOSViewDelegate.h
|
src/ios/iOSViewDelegate.h
|
||||||
|
@ -223,6 +223,7 @@ bool mfb_set_viewport(struct mfb_window *window, unsigned offset_
|
|||||||
|
|
||||||
void mfb_set_mouse_button_callback(struct mfb_window *window, mfb_mouse_button_func callback);
|
void mfb_set_mouse_button_callback(struct mfb_window *window, mfb_mouse_button_func callback);
|
||||||
void mfb_set_mouse_move_callback(struct mfb_window *window, mfb_mouse_move_func callback);
|
void mfb_set_mouse_move_callback(struct mfb_window *window, mfb_mouse_move_func callback);
|
||||||
|
void mfb_set_resize_callback(struct mfb_window *window, mfb_resize_func callback);
|
||||||
|
|
||||||
unsigned mfb_get_window_width(struct mfb_window *window);
|
unsigned mfb_get_window_width(struct mfb_window *window);
|
||||||
unsigned mfb_get_window_height(struct mfb_window *window);
|
unsigned mfb_get_window_height(struct mfb_window *window);
|
||||||
|
@ -9,6 +9,5 @@ typedef struct Vertex {
|
|||||||
} Vertex;
|
} Vertex;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
id<MTLCommandQueue> command_queue;
|
Vertex vertices[4];
|
||||||
id<MTLRenderPipelineState> pipeline_state;
|
|
||||||
} SWindowData_IOS;
|
} SWindowData_IOS;
|
||||||
|
@ -13,14 +13,26 @@ create_window_data(unsigned width, unsigned height) {
|
|||||||
SWindowData *window_data;
|
SWindowData *window_data;
|
||||||
|
|
||||||
window_data = malloc(sizeof(SWindowData));
|
window_data = malloc(sizeof(SWindowData));
|
||||||
|
if(window_data == 0x0) {
|
||||||
|
NSLog(@"Cannot allocate window data");
|
||||||
|
return 0x0;
|
||||||
|
}
|
||||||
memset(window_data, 0, sizeof(SWindowData));
|
memset(window_data, 0, sizeof(SWindowData));
|
||||||
|
|
||||||
SWindowData_IOS *window_data_ios = malloc(sizeof(SWindowData_IOS));
|
SWindowData_IOS *window_data_ios = malloc(sizeof(SWindowData_IOS));
|
||||||
|
if(window_data_ios == 0x0) {
|
||||||
|
free(window_data);
|
||||||
|
NSLog(@"Cannot allocate ios window data");
|
||||||
|
return 0x0;
|
||||||
|
}
|
||||||
memset((void *) window_data_ios, 0, sizeof(SWindowData_IOS));
|
memset((void *) window_data_ios, 0, sizeof(SWindowData_IOS));
|
||||||
window_data->specific = window_data_ios;
|
|
||||||
|
|
||||||
window_data->window_width = [UIScreen mainScreen].bounds.size.width;
|
float scale = [UIScreen mainScreen].scale;
|
||||||
window_data->window_height = [UIScreen mainScreen].bounds.size.height;
|
|
||||||
|
window_data->specific = window_data_ios;
|
||||||
|
|
||||||
|
window_data->window_width = [UIScreen mainScreen].bounds.size.width * scale;
|
||||||
|
window_data->window_height = [UIScreen mainScreen].bounds.size.height * scale;
|
||||||
|
|
||||||
window_data->dst_width = width;
|
window_data->dst_width = width;
|
||||||
window_data->dst_height = height;
|
window_data->dst_height = height;
|
||||||
@ -29,8 +41,10 @@ create_window_data(unsigned width, unsigned height) {
|
|||||||
window_data->buffer_height = height;
|
window_data->buffer_height = height;
|
||||||
window_data->buffer_stride = width * 4;
|
window_data->buffer_stride = width * 4;
|
||||||
|
|
||||||
window_data->draw_buffer = malloc(width * height * 4);
|
window_data->draw_buffer = malloc(width * height * 4);
|
||||||
if (!window_data->draw_buffer) {
|
if (!window_data->draw_buffer) {
|
||||||
|
free(window_data);
|
||||||
|
free(window_data_ios);
|
||||||
NSLog(@"Unable to create draw buffer");
|
NSLog(@"Unable to create draw buffer");
|
||||||
return 0x0;
|
return 0x0;
|
||||||
}
|
}
|
||||||
@ -47,6 +61,10 @@ mfb_open(const char *title, unsigned width, unsigned height) {
|
|||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
struct mfb_window *
|
struct mfb_window *
|
||||||
mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags) {
|
mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags) {
|
||||||
|
UIWindow *window;
|
||||||
|
NSArray *windows;
|
||||||
|
size_t numWindows;
|
||||||
|
|
||||||
kUnused(title);
|
kUnused(title);
|
||||||
kUnused(flags);
|
kUnused(flags);
|
||||||
|
|
||||||
@ -54,10 +72,15 @@ mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags)
|
|||||||
if (window_data == 0x0) {
|
if (window_data == 0x0) {
|
||||||
return 0x0;
|
return 0x0;
|
||||||
}
|
}
|
||||||
|
SWindowData_IOS *window_data_ios = (SWindowData_IOS *) window_data->specific;
|
||||||
|
|
||||||
UIWindow *window;
|
static Vertex s_vertices[4] = {
|
||||||
NSArray *windows;
|
{-1.0, -1.0, 0, 1},
|
||||||
size_t numWindows;
|
{-1.0, 1.0, 0, 1},
|
||||||
|
{ 1.0, -1.0, 0, 1},
|
||||||
|
{ 1.0, 1.0, 0, 1},
|
||||||
|
};
|
||||||
|
memcpy(window_data_ios->vertices, s_vertices, sizeof(s_vertices));
|
||||||
|
|
||||||
windows = [[UIApplication sharedApplication] windows];
|
windows = [[UIApplication sharedApplication] windows];
|
||||||
numWindows = [windows count];
|
numWindows = [windows count];
|
||||||
@ -130,6 +153,7 @@ mfb_update(struct mfb_window *window, void *buffer) {
|
|||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
mfb_update_state
|
mfb_update_state
|
||||||
mfb_update_events(struct mfb_window *window) {
|
mfb_update_events(struct mfb_window *window) {
|
||||||
|
kUnused(window);
|
||||||
return STATE_OK;
|
return STATE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,12 +162,11 @@ extern double g_time_for_frame;
|
|||||||
|
|
||||||
bool
|
bool
|
||||||
mfb_wait_sync(struct mfb_window *window) {
|
mfb_wait_sync(struct mfb_window *window) {
|
||||||
|
kUnused(window);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
extern Vertex g_vertices[4];
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
mfb_set_viewport(struct mfb_window *window, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height) {
|
mfb_set_viewport(struct mfb_window *window, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height) {
|
||||||
SWindowData *window_data = (SWindowData *) window;
|
SWindowData *window_data = (SWindowData *) window;
|
||||||
@ -165,17 +188,19 @@ mfb_set_viewport(struct mfb_window *window, unsigned offset_x, unsigned offset_y
|
|||||||
float y1 = ((float) offset_y / window_data->window_height) * 2.0f - 1.0f;
|
float y1 = ((float) offset_y / window_data->window_height) * 2.0f - 1.0f;
|
||||||
float y2 = (((float) offset_y + height) / window_data->window_height) * 2.0f - 1.0f;
|
float y2 = (((float) offset_y + height) / window_data->window_height) * 2.0f - 1.0f;
|
||||||
|
|
||||||
g_vertices[0].x = x1;
|
SWindowData_IOS *window_data_ios = (SWindowData_IOS *) window_data->specific;
|
||||||
g_vertices[0].y = y1;
|
|
||||||
|
|
||||||
g_vertices[1].x = x1;
|
window_data_ios->vertices[0].x = x1;
|
||||||
g_vertices[1].y = y2;
|
window_data_ios->vertices[0].y = y1;
|
||||||
|
|
||||||
g_vertices[2].x = x2;
|
window_data_ios->vertices[1].x = x1;
|
||||||
g_vertices[2].y = y1;
|
window_data_ios->vertices[1].y = y2;
|
||||||
|
|
||||||
g_vertices[3].x = x2;
|
window_data_ios->vertices[2].x = x2;
|
||||||
g_vertices[3].y = y2;
|
window_data_ios->vertices[2].y = y1;
|
||||||
|
|
||||||
|
window_data_ios->vertices[3].x = x2;
|
||||||
|
window_data_ios->vertices[3].y = y2;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,15 @@
|
|||||||
|
|
||||||
#import <MetalKit/MetalKit.h>
|
#import <MetalKit/MetalKit.h>
|
||||||
#include "WindowData.h"
|
#include "WindowData.h"
|
||||||
|
#include "WindowData_IOS.h"
|
||||||
|
|
||||||
// Our platform independent renderer class.
|
// Our platform independent renderer class.
|
||||||
// Implements the MTKViewDelegate protocol which allows it to accept per-frame
|
// Implements the MTKViewDelegate protocol which allows it to accept per-frame
|
||||||
// update and drawable resize callbacks.
|
// update and drawable resize callbacks.
|
||||||
@interface iOSViewDelegate : NSObject <MTKViewDelegate>
|
@interface iOSViewDelegate : NSObject <MTKViewDelegate>
|
||||||
{
|
{
|
||||||
@public SWindowData *window_data;
|
@public SWindowData *window_data;
|
||||||
|
@public SWindowData_IOS *window_data_ios;
|
||||||
}
|
}
|
||||||
|
|
||||||
-(nonnull instancetype) initWithMetalKitView:(nonnull MTKView *) view windowData:(nonnull SWindowData *) windowData;
|
-(nonnull instancetype) initWithMetalKitView:(nonnull MTKView *) view windowData:(nonnull SWindowData *) windowData;
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include "WindowData_IOS.h"
|
#include "WindowData_IOS.h"
|
||||||
#include <MiniFB.h>
|
#include <MiniFB.h>
|
||||||
#include <MiniFB_ios.h>
|
#include <MiniFB_ios.h>
|
||||||
|
#include <MiniFB_internal.h>
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
#define kShader(inc, src) @inc#src
|
#define kShader(inc, src) @inc#src
|
||||||
@ -23,14 +24,6 @@ enum { MaxBuffersInFlight = 3 }; // Number of textures in flight (tripple buf
|
|||||||
id<MTLDevice> g_metal_device = nil;
|
id<MTLDevice> g_metal_device = nil;
|
||||||
id<MTLLibrary> g_library = nil;
|
id<MTLLibrary> g_library = nil;
|
||||||
|
|
||||||
//--
|
|
||||||
Vertex g_vertices[4] = {
|
|
||||||
{-1.0, -1.0, 0, 1},
|
|
||||||
{-1.0, 1.0, 0, 1},
|
|
||||||
{ 1.0, -1.0, 0, 1},
|
|
||||||
{ 1.0, 1.0, 0, 1},
|
|
||||||
};
|
|
||||||
|
|
||||||
//--
|
//--
|
||||||
NSString *g_shader_src = kShader(
|
NSString *g_shader_src = kShader(
|
||||||
"#include <metal_stdlib>\n",
|
"#include <metal_stdlib>\n",
|
||||||
@ -87,14 +80,15 @@ NSString *g_shader_src = kShader(
|
|||||||
-(nonnull instancetype) initWithMetalKitView:(nonnull MTKView *) view windowData:(nonnull SWindowData *) windowData {
|
-(nonnull instancetype) initWithMetalKitView:(nonnull MTKView *) view windowData:(nonnull SWindowData *) windowData {
|
||||||
self = [super init];
|
self = [super init];
|
||||||
if (self) {
|
if (self) {
|
||||||
self->window_data = windowData;
|
self->window_data = windowData;
|
||||||
|
self->window_data_ios = (SWindowData_IOS *) windowData->specific;
|
||||||
g_metal_device = view.device;
|
|
||||||
|
|
||||||
view.colorPixelFormat = MTLPixelFormatBGRA8Unorm;
|
view.colorPixelFormat = MTLPixelFormatBGRA8Unorm;
|
||||||
view.sampleCount = 1;
|
view.sampleCount = 1;
|
||||||
|
|
||||||
m_semaphore = dispatch_semaphore_create(MaxBuffersInFlight);
|
g_metal_device = view.device;
|
||||||
|
|
||||||
|
m_semaphore = dispatch_semaphore_create(MaxBuffersInFlight);
|
||||||
m_command_queue = [g_metal_device newCommandQueue];
|
m_command_queue = [g_metal_device newCommandQueue];
|
||||||
|
|
||||||
[self _createShaders];
|
[self _createShaders];
|
||||||
@ -157,8 +151,7 @@ NSString *g_shader_src = kShader(
|
|||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
- (void) drawInMTKView:(nonnull MTKView *) view
|
- (void) drawInMTKView:(nonnull MTKView *) view {
|
||||||
{
|
|
||||||
// Per frame updates here
|
// Per frame updates here
|
||||||
dispatch_semaphore_wait(m_semaphore, DISPATCH_TIME_FOREVER);
|
dispatch_semaphore_wait(m_semaphore, DISPATCH_TIME_FOREVER);
|
||||||
|
|
||||||
@ -189,7 +182,7 @@ NSString *g_shader_src = kShader(
|
|||||||
|
|
||||||
// Set render command encoder state
|
// Set render command encoder state
|
||||||
[renderEncoder setRenderPipelineState:m_pipeline_state];
|
[renderEncoder setRenderPipelineState:m_pipeline_state];
|
||||||
[renderEncoder setVertexBytes:g_vertices length:sizeof(g_vertices) atIndex:0];
|
[renderEncoder setVertexBytes:window_data_ios->vertices length:sizeof(window_data_ios->vertices) atIndex:0];
|
||||||
|
|
||||||
//[renderEncoder setFragmentTexture:m_texture_buffers[m_current_buffer] atIndex:0];
|
//[renderEncoder setFragmentTexture:m_texture_buffers[m_current_buffer] atIndex:0];
|
||||||
[renderEncoder setFragmentTexture:m_texture_buffer atIndex:0];
|
[renderEncoder setFragmentTexture:m_texture_buffer atIndex:0];
|
||||||
@ -211,6 +204,10 @@ NSString *g_shader_src = kShader(
|
|||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
- (void) mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size {
|
- (void) mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size {
|
||||||
// Respond to drawable size or orientation changes here
|
// Respond to drawable size or orientation changes here
|
||||||
|
window_data->window_width = size.width;
|
||||||
|
window_data->window_height = size.height;
|
||||||
|
|
||||||
|
kCall(resize_func, size.width, size.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -120,18 +120,24 @@ mfb_open(const char *title, unsigned width, unsigned height) {
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
struct mfb_window *
|
SWindowData *
|
||||||
mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags) {
|
create_window_data(unsigned width, unsigned height) {
|
||||||
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
|
|
||||||
|
|
||||||
init_keycodes();
|
|
||||||
|
|
||||||
SWindowData *window_data = malloc(sizeof(SWindowData));
|
SWindowData *window_data = malloc(sizeof(SWindowData));
|
||||||
|
if(window_data == 0x0) {
|
||||||
|
NSLog(@"Cannot allocate window data");
|
||||||
|
return 0x0;
|
||||||
|
}
|
||||||
memset(window_data, 0, sizeof(SWindowData));
|
memset(window_data, 0, sizeof(SWindowData));
|
||||||
|
|
||||||
SWindowData_OSX *window_data_osx = malloc(sizeof(SWindowData_OSX));
|
SWindowData_OSX *window_data_osx = malloc(sizeof(SWindowData_OSX));
|
||||||
|
if(window_data_osx == 0x0) {
|
||||||
|
free(window_data);
|
||||||
|
NSLog(@"Cannot allocate osx window data");
|
||||||
|
return 0x0;
|
||||||
|
}
|
||||||
memset(window_data_osx, 0, sizeof(SWindowData_OSX));
|
memset(window_data_osx, 0, sizeof(SWindowData_OSX));
|
||||||
window_data->specific = window_data_osx;
|
|
||||||
|
window_data->specific = window_data_osx;
|
||||||
|
|
||||||
window_data->window_width = width;
|
window_data->window_width = width;
|
||||||
window_data->window_height = height;
|
window_data->window_height = height;
|
||||||
@ -143,21 +149,34 @@ mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags)
|
|||||||
window_data->buffer_height = height;
|
window_data->buffer_height = height;
|
||||||
window_data->buffer_stride = width * 4;
|
window_data->buffer_stride = width * 4;
|
||||||
|
|
||||||
[NSApplication sharedApplication];
|
|
||||||
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
|
|
||||||
|
|
||||||
#if defined(USE_METAL_API)
|
#if defined(USE_METAL_API)
|
||||||
g_metal_device = MTLCreateSystemDefaultDevice();
|
window_data->draw_buffer = malloc(width * height * 4);
|
||||||
if (!g_metal_device) {
|
if (!window_data->draw_buffer) {
|
||||||
NSLog(@"Metal is not supported on this device");
|
free(window_data_osx);
|
||||||
return 0x0;
|
free(window_data);
|
||||||
}
|
NSLog(@"Unable to create draw buffer");
|
||||||
|
|
||||||
if (!create_shaders((SWindowData_OSX *) window_data->specific)) {
|
|
||||||
return 0x0;
|
return 0x0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
return window_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct mfb_window *
|
||||||
|
mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags) {
|
||||||
|
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
|
||||||
|
|
||||||
|
SWindowData *window_data = create_window_data(width, height);
|
||||||
|
if (window_data == 0x0) {
|
||||||
|
return 0x0;
|
||||||
|
}
|
||||||
|
SWindowData_OSX *window_data_osx = (SWindowData_OSX *) window_data->specific;
|
||||||
|
|
||||||
|
init_keycodes();
|
||||||
|
|
||||||
|
[NSApplication sharedApplication];
|
||||||
|
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
|
||||||
|
|
||||||
NSWindowStyleMask styles = NSWindowStyleMaskClosable | NSWindowStyleMaskTitled;
|
NSWindowStyleMask styles = NSWindowStyleMaskClosable | NSWindowStyleMaskTitled;
|
||||||
|
|
||||||
if (flags & WF_BORDERLESS)
|
if (flags & WF_BORDERLESS)
|
||||||
@ -169,14 +188,27 @@ mfb_open_ex(const char *title, unsigned width, unsigned height, unsigned flags)
|
|||||||
NSRect rectangle = NSMakeRect(0, 0, width, height);
|
NSRect rectangle = NSMakeRect(0, 0, width, height);
|
||||||
NSRect frameRect = [NSWindow frameRectForContentRect:rectangle styleMask:styles];
|
NSRect frameRect = [NSWindow frameRectForContentRect:rectangle styleMask:styles];
|
||||||
window_data_osx->window = [[OSXWindow alloc] initWithContentRect:frameRect styleMask:styles backing:NSBackingStoreBuffered defer:NO windowData:window_data];
|
window_data_osx->window = [[OSXWindow alloc] initWithContentRect:frameRect styleMask:styles backing:NSBackingStoreBuffered defer:NO windowData:window_data];
|
||||||
if (!window_data_osx->window)
|
if (!window_data_osx->window) {
|
||||||
|
NSLog(@"Cannot create window");
|
||||||
|
if(window_data->draw_buffer != 0x0) {
|
||||||
|
free(window_data->draw_buffer);
|
||||||
|
window_data->draw_buffer = 0x0;
|
||||||
|
}
|
||||||
|
free(window_data_osx);
|
||||||
|
free(window_data);
|
||||||
return 0x0;
|
return 0x0;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(USE_METAL_API)
|
#if defined(USE_METAL_API)
|
||||||
window_data->draw_buffer = malloc(width * height * 4);
|
g_metal_device = MTLCreateSystemDefaultDevice();
|
||||||
|
if (!g_metal_device) {
|
||||||
if (!window_data->draw_buffer)
|
NSLog(@"Metal is not supported on this device");
|
||||||
return 0x0;
|
return 0x0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!create_shaders((SWindowData_OSX *) window_data->specific)) {
|
||||||
|
return 0x0;
|
||||||
|
}
|
||||||
|
|
||||||
static Vertex s_vertices[4] = {
|
static Vertex s_vertices[4] = {
|
||||||
{-1.0, -1.0, 0, 1},
|
{-1.0, -1.0, 0, 1},
|
||||||
@ -263,6 +295,12 @@ destroy_window_data(SWindowData *window_data) {
|
|||||||
memset(window_data_osx, 0, sizeof(SWindowData_OSX));
|
memset(window_data_osx, 0, sizeof(SWindowData_OSX));
|
||||||
free(window_data_osx);
|
free(window_data_osx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(window_data->draw_buffer != 0x0) {
|
||||||
|
free(window_data->draw_buffer);
|
||||||
|
window_data->draw_buffer = 0x0;
|
||||||
|
}
|
||||||
|
|
||||||
memset(window_data, 0, sizeof(SWindowData));
|
memset(window_data, 0, sizeof(SWindowData));
|
||||||
free(window_data);
|
free(window_data);
|
||||||
|
|
||||||
|
@ -6,17 +6,8 @@
|
|||||||
#if defined(USE_METAL_API)
|
#if defined(USE_METAL_API)
|
||||||
#import <MetalKit/MetalKit.h>
|
#import <MetalKit/MetalKit.h>
|
||||||
|
|
||||||
extern id<MTLDevice> g_metal_device;
|
|
||||||
extern id<MTLLibrary> g_library;
|
|
||||||
|
|
||||||
@implementation WindowViewController
|
@implementation WindowViewController
|
||||||
|
|
||||||
- (void) mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size {
|
|
||||||
(void)view;
|
|
||||||
(void)size;
|
|
||||||
// resize
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) drawInMTKView:(nonnull MTKView *)view {
|
- (void) drawInMTKView:(nonnull MTKView *)view {
|
||||||
OSXWindow *window = (OSXWindow *) view.window;
|
OSXWindow *window = (OSXWindow *) view.window;
|
||||||
SWindowData *window_data = window->window_data;
|
SWindowData *window_data = window->window_data;
|
||||||
@ -84,6 +75,13 @@ extern id<MTLLibrary> g_library;
|
|||||||
// Finalize rendering here & push the command buffer to the GPU
|
// Finalize rendering here & push the command buffer to the GPU
|
||||||
[commandBuffer commit];
|
[commandBuffer commit];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size {
|
||||||
|
(void)view;
|
||||||
|
(void)size;
|
||||||
|
// resize
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ struct mfb_window *g_window = 0x0;
|
|||||||
uint32_t *g_buffer = 0x0;
|
uint32_t *g_buffer = 0x0;
|
||||||
uint32_t g_width = 0;
|
uint32_t g_width = 0;
|
||||||
uint32_t g_height = 0;
|
uint32_t g_height = 0;
|
||||||
|
float g_scale = 1;
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
@interface AppDelegate ()
|
@interface AppDelegate ()
|
||||||
@ -37,6 +38,14 @@ mouse_move(struct mfb_window *window, int x, int y) {
|
|||||||
NSLog(@"Touch moved %d, %d", x, y);
|
NSLog(@"Touch moved %d, %d", x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
resize(struct mfb_window *window, int width, int height) {
|
||||||
|
kUnused(window);
|
||||||
|
g_width = width;
|
||||||
|
g_height = height;
|
||||||
|
NSLog(@"Resize %d, %d", width, height);
|
||||||
|
}
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
@implementation AppDelegate
|
@implementation AppDelegate
|
||||||
|
|
||||||
@ -44,18 +53,24 @@ mouse_move(struct mfb_window *window, int x, int y) {
|
|||||||
- (void) OnUpdateFrame {
|
- (void) OnUpdateFrame {
|
||||||
static int seed = 0xbeef;
|
static int seed = 0xbeef;
|
||||||
int noise, carry;
|
int noise, carry;
|
||||||
|
int dis = 0;
|
||||||
|
|
||||||
if(g_buffer != 0x0) {
|
if(g_buffer != 0x0) {
|
||||||
for (uint32_t i = 0; i < g_width * g_height; ++i) {
|
uint32_t i = 0;
|
||||||
noise = seed;
|
for (uint32_t y = 0; y < g_height; ++y) {
|
||||||
noise >>= 3;
|
for (uint32_t x = 0; x < g_width; ++x) {
|
||||||
noise ^= seed;
|
noise = seed;
|
||||||
carry = noise & 1;
|
noise >>= 3;
|
||||||
noise >>= 1;
|
noise ^= seed;
|
||||||
seed >>= 1;
|
carry = noise & 1;
|
||||||
seed |= (carry << 30);
|
noise >>= 1;
|
||||||
noise &= 0xFF;
|
seed >>= 1;
|
||||||
g_buffer[i] = MFB_RGB(noise, noise, noise);
|
seed |= (carry << 30);
|
||||||
|
noise &= 0xFF >> dis;
|
||||||
|
g_buffer[i++] = MFB_RGB(noise, noise, noise);
|
||||||
|
}
|
||||||
|
if((y & 0x07) == 0x07)
|
||||||
|
dis ^= 0x01;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,13 +90,15 @@ mouse_move(struct mfb_window *window, int x, int y) {
|
|||||||
kUnused(launchOptions);
|
kUnused(launchOptions);
|
||||||
|
|
||||||
if(g_window == 0x0) {
|
if(g_window == 0x0) {
|
||||||
g_width = [UIScreen mainScreen].bounds.size.width;
|
g_scale = [UIScreen mainScreen].scale;
|
||||||
g_height = [UIScreen mainScreen].bounds.size.height;
|
g_width = [UIScreen mainScreen].bounds.size.width * g_scale;
|
||||||
|
g_height = [UIScreen mainScreen].bounds.size.height * g_scale;
|
||||||
g_window = mfb_open("noise", g_width, g_height);
|
g_window = mfb_open("noise", g_width, g_height);
|
||||||
if(g_window != 0x0) {
|
if(g_window != 0x0) {
|
||||||
g_buffer = malloc(g_width * g_height * 4);
|
g_buffer = malloc(g_width * g_height * 4);
|
||||||
mfb_set_mouse_move_callback(g_window, mouse_move);
|
mfb_set_mouse_move_callback(g_window, mouse_move);
|
||||||
mfb_set_mouse_button_callback(g_window, mouse_btn);
|
mfb_set_mouse_button_callback(g_window, mouse_btn);
|
||||||
|
mfb_set_resize_callback(g_window, resize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user