Fix tvOS build, move common UIKit stuff into it's own folder
This commit is contained in:
parent
50b6c33bbc
commit
2771be2a57
8 changed files with 64 additions and 366 deletions
|
@ -35,7 +35,7 @@ endif()
|
|||
if(${CMAKE_SYSTEM_NAME} STREQUAL "iOS")
|
||||
message("iOS build detected!")
|
||||
|
||||
set(ENABLE_VULKAN TRUE)
|
||||
#set(ENABLE_VULKAN TRUE)
|
||||
set(ENABLE_DARWIN TRUE)
|
||||
set(ENABLE_IOS TRUE)
|
||||
set(ENABLE_METAL TRUE)
|
||||
|
@ -44,7 +44,7 @@ endif()
|
|||
if(${CMAKE_SYSTEM_NAME} STREQUAL "tvOS")
|
||||
message("tvOS build detected!")
|
||||
|
||||
set(ENABLE_VULKAN TRUE)
|
||||
#set(ENABLE_VULKAN TRUE)
|
||||
set(ENABLE_DARWIN TRUE)
|
||||
set(ENABLE_TVOS TRUE)
|
||||
set(ENABLE_METAL TRUE)
|
||||
|
|
|
@ -8,7 +8,7 @@ function(add_shader_command)
|
|||
set(EXTRA_PLATFORM_ARG "0")
|
||||
|
||||
# if targeting ios, we want to use the host's shader compiler
|
||||
if(ENABLE_IOS)
|
||||
if(ENABLE_IOS OR ENABLE_TVOS)
|
||||
set(SHADER_COMPILER_COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/../build/bin/Debug/ShaderCompilerTool")
|
||||
set(EXTRA_PLATFORM_ARG "1")
|
||||
endif()
|
||||
|
@ -35,7 +35,7 @@ endfunction()
|
|||
|
||||
# add shaders to target
|
||||
function(add_shaders)
|
||||
if(NOT ENABLE_IOS)
|
||||
if(NOT ENABLE_IOS AND NOT ENABLE_TVOS)
|
||||
cmake_parse_arguments(ARGS "" "TARGET" "SHADERS" ${ARGN})
|
||||
|
||||
foreach(SHADER_FILENAME ${ARGS_SHADERS})
|
||||
|
|
|
@ -32,13 +32,13 @@ find_library(CORE_GRAPHICS CoreGraphics)
|
|||
|
||||
add_platform(
|
||||
MAIN_FILE
|
||||
ViewController.mm.in
|
||||
../uikit/ViewController.mm.in
|
||||
SRC
|
||||
MACOSX_BUNDLE
|
||||
${APP_HEADER_FILES}
|
||||
${APP_SOURCE_FILES}
|
||||
${RESOURCES}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/file.mm
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../uikit/file.mm
|
||||
EXECUTABLE_PROPERTIES
|
||||
MACOSX_BUNDLE ON
|
||||
LINK_LIBRARIES
|
||||
|
|
|
@ -20,7 +20,6 @@ set(RESOURCES
|
|||
|
||||
include(../../cmake/AddPlatformExecutable.cmake)
|
||||
|
||||
# Locate system libraries on iOS
|
||||
find_library(UIKIT UIKit)
|
||||
find_library(FOUNDATION Foundation)
|
||||
find_library(MOBILECORESERVICES MobileCoreServices)
|
||||
|
@ -28,66 +27,63 @@ find_library(CFNETWORK CFNetwork)
|
|||
find_library(SYSTEMCONFIGURATION SystemConfiguration)
|
||||
find_library(GAMECONTROLLER GameController)
|
||||
find_library(QUARTZ QuartzCore)
|
||||
|
||||
# link the frameworks located above
|
||||
|
||||
find_library(METAL Metal)
|
||||
|
||||
add_platform(
|
||||
MAIN_FILE
|
||||
ViewController.mm.in
|
||||
../uikit/ViewController.mm.in
|
||||
SRC
|
||||
MACOSX_BUNDLE
|
||||
${APP_HEADER_FILES}
|
||||
${APP_SOURCE_FILES}
|
||||
${RESOURCES}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/file.mm
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../uikit/file.mm
|
||||
EXECUTABLE_PROPERTIES
|
||||
MACOSX_BUNDLE ON
|
||||
LINK_LIBRARIES
|
||||
Core
|
||||
GFXMetal
|
||||
${UIKIT}
|
||||
${UIKIT}
|
||||
${FOUNDATION}
|
||||
${MOBILECORESERVICES}
|
||||
${CFNETWORK}
|
||||
${CFNETWORK}
|
||||
${SYSTEMCONFIGURATION}
|
||||
${GAMECONTROLLER}
|
||||
${QUARTZ}
|
||||
${GAMECONTROLLER}
|
||||
${QUARTZ}
|
||||
${METAL}
|
||||
GFXMetal
|
||||
COMPILE_OPTIONS
|
||||
)
|
||||
|
||||
function(add_platform_commands APP_NAME)
|
||||
set(APP_BUNDLE_IDENTIFIER "com.test.app.fantasy") # <== Set to your app's bundle identifier
|
||||
# set in cmake optionss
|
||||
#set(APP_BUNDLE_IDENTIFIER "com.test.app")
|
||||
#set(CODE_SIGN_IDENTITY "iPhone Developer")
|
||||
#set(DEVELOPMENT_TEAM_ID "aaaa")
|
||||
|
||||
set(CODE_SIGN_IDENTITY "iPhone Developer") # <== Set to your team ID from Apple
|
||||
set(DEVELOPMENT_TEAM_ID "JM5LKVKH48") # <== Set to your preferred code sign identity, to see list:
|
||||
# /usr/bin/env xcrun security # <== Set to "1" to target iPhone, set to "2" to target iPad, set to "1,2" to target both
|
||||
set(RESOURCES
|
||||
${PROJECT_SOURCE_DIR}/engine/platforms/tvos/Main.storyboard
|
||||
${PROJECT_SOURCE_DIR}/engine/platforms/tvos/LaunchScreen.storyboard
|
||||
set(RESOURCES
|
||||
${PROJECT_SOURCE_DIR}/platforms/tvos/Main.storyboard
|
||||
${PROJECT_SOURCE_DIR}/platforms/tvos/LaunchScreen.storyboard
|
||||
${CMAKE_SOURCE_DIR}/data
|
||||
${CMAKE_BINARY_DIR}/shaders
|
||||
)
|
||||
)
|
||||
|
||||
set(PRODUCT_NAME ${APP_NAME})
|
||||
set(EXECUTABLE_NAME ${APP_NAME})
|
||||
set(MACOSX_BUNDLE_EXECUTABLE_NAME ${APP_NAME})
|
||||
set(MACOSX_BUNDLE_INFO_STRING ${APP_BUNDLE_IDENTIFIER})
|
||||
set(MACOSX_BUNDLE_GUI_IDENTIFIER ${APP_BUNDLE_IDENTIFIER})
|
||||
set(MACOSX_BUNDLE_BUNDLE_NAME ${APP_BUNDLE_IDENTIFIER})
|
||||
set(MACOSX_BUNDLE_ICON_FILE "")
|
||||
set(MACOSX_BUNDLE_LONG_VERSION_STRING "1.0")
|
||||
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "1.0")
|
||||
set(MACOSX_BUNDLE_BUNDLE_VERSION "1.0")
|
||||
set(MACOSX_BUNDLE_COPYRIGHT "Copyright YOU")
|
||||
set(MACOSX_DEPLOYMENT_TARGET ${DEPLOYMENT_TARGET})
|
||||
set(PRODUCT_NAME ${APP_NAME})
|
||||
set(EXECUTABLE_NAME ${APP_NAME})
|
||||
set(MACOSX_BUNDLE_EXECUTABLE_NAME ${APP_NAME})
|
||||
set(MACOSX_BUNDLE_INFO_STRING ${APP_BUNDLE_IDENTIFIER})
|
||||
set(MACOSX_BUNDLE_GUI_IDENTIFIER ${APP_BUNDLE_IDENTIFIER})
|
||||
set(MACOSX_BUNDLE_BUNDLE_NAME ${APP_BUNDLE_IDENTIFIER})
|
||||
set(MACOSX_BUNDLE_ICON_FILE "")
|
||||
set(MACOSX_BUNDLE_LONG_VERSION_STRING "1.0")
|
||||
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "1.0")
|
||||
set(MACOSX_BUNDLE_BUNDLE_VERSION "1.0")
|
||||
set(MACOSX_BUNDLE_COPYRIGHT "Copyright YOU")
|
||||
set(MACOSX_DEPLOYMENT_TARGET ${DEPLOYMENT_TARGET})
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fobjc-arc")
|
||||
configure_file(${PROJECT_SOURCE_DIR}/platforms/tvos/plist.in ${CMAKE_BINARY_DIR}/${add_platform_executable_TARGET}Info.plist)
|
||||
|
||||
configure_file(${PROJECT_SOURCE_DIR}/engine/platforms/tvos/plist.in ${CMAKE_BINARY_DIR}/${add_platform_executable_TARGET}Info.plist)
|
||||
|
||||
set_target_properties(${APP_NAME} PROPERTIES
|
||||
set_target_properties(${APP_NAME} PROPERTIES
|
||||
XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym"
|
||||
RESOURCE "${RESOURCES}"
|
||||
XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER "YES"
|
||||
|
@ -102,14 +98,5 @@ set_target_properties(${APP_NAME} PROPERTIES
|
|||
XCODE_ATTRIBUTE_INSTALL_PATH "$(LOCAL_APPS_DIR)"
|
||||
XCODE_ATTRIBUTE_ENABLE_TESTABILITY YES
|
||||
XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN YES
|
||||
)
|
||||
|
||||
# Set the app's linker search path to the default location on iOS
|
||||
set_target_properties(
|
||||
${APP_NAME}
|
||||
PROPERTIES
|
||||
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS
|
||||
"@executable_path/Frameworks"
|
||||
)
|
||||
|
||||
)
|
||||
endfunction()
|
||||
|
|
|
@ -1,259 +0,0 @@
|
|||
#include <MetalKit/MetalKit.h>
|
||||
#include <gfx_metal.hpp>
|
||||
#include <GameController/GameController.h>
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#include <engine.hpp>
|
||||
|
||||
#include <@APP_INCLUDE@>
|
||||
|
||||
@APP_CLASS@* app = nullptr;
|
||||
|
||||
int maxFPS = 60;
|
||||
|
||||
std::array<bool, 8> inputKeys;
|
||||
|
||||
float rightX = 0.0f, rightY = 0.0f;
|
||||
float leftX = 0.0f, leftY = 0.0f;
|
||||
|
||||
@interface GameView : UIView
|
||||
@end
|
||||
|
||||
@implementation GameView
|
||||
|
||||
+ (Class) layerClass {
|
||||
return [CAMetalLayer class];
|
||||
}
|
||||
|
||||
- (void)draw {
|
||||
engine->update(1.0f / (float)maxFPS);
|
||||
engine->begin_frame(1.0f / (float)maxFPS);
|
||||
engine->render(0);
|
||||
}
|
||||
|
||||
- (void) controllerConnected {
|
||||
GCController* controller = [GCController controllers][0];
|
||||
[[controller extendedGamepad] setValueChangedHandler:^(GCExtendedGamepad * _Nonnull gamepad, GCControllerElement * _Nonnull element) {
|
||||
const auto& handle_element = [element](int index, GCControllerElement* e) {
|
||||
if(element == e)
|
||||
inputKeys[index] = [(GCControllerButtonInput*)e value] == 1.0f;
|
||||
};
|
||||
|
||||
handle_element(0, [[controller extendedGamepad] buttonA]);
|
||||
handle_element(1, [[controller extendedGamepad] buttonB]);
|
||||
handle_element(2, [[controller extendedGamepad] buttonX]);
|
||||
handle_element(3, [[controller extendedGamepad] buttonY]);
|
||||
|
||||
if(element == [[controller extendedGamepad] dpad]) {
|
||||
inputKeys[4] = [[[[controller extendedGamepad] dpad] up] value] == 1.0f;
|
||||
inputKeys[5] = [[[[controller extendedGamepad] dpad] down] value] == 1.0f;
|
||||
inputKeys[6] = [[[[controller extendedGamepad] dpad] left] value] == 1.0f;
|
||||
inputKeys[7] = [[[[controller extendedGamepad] dpad] right] value] == 1.0f;
|
||||
}
|
||||
|
||||
if(element == [[controller extendedGamepad] leftThumbstick]) {
|
||||
leftX = [[[[controller extendedGamepad] leftThumbstick] xAxis] value];
|
||||
leftY = [[[[controller extendedGamepad] leftThumbstick] yAxis] value];
|
||||
}
|
||||
|
||||
if(element == [[controller extendedGamepad] rightThumbstick]) {
|
||||
rightX = [[[[controller extendedGamepad] rightThumbstick] xAxis] value];
|
||||
rightY = [[[[controller extendedGamepad] rightThumbstick] yAxis] value];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@interface GameViewController : UIViewController
|
||||
|
||||
@end
|
||||
|
||||
float mouse_x = 0.0f, mouse_y = 0.0f;
|
||||
bool mouse_down = false;
|
||||
|
||||
@interface GameViewController ()
|
||||
{
|
||||
GameView* view;
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation GameViewController
|
||||
|
||||
int width, height;
|
||||
int drawable_width, drawable_height;
|
||||
|
||||
- (void)viewDidLoad {
|
||||
[super viewDidLoad];
|
||||
view = (GameView*)self.view;
|
||||
view.userInteractionEnabled = true;
|
||||
|
||||
CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:view selector:@selector(draw)];
|
||||
[displayLink addToRunLoop:NSRunLoop.mainRunLoop forMode:NSDefaultRunLoopMode];
|
||||
|
||||
width = [view frame].size.width;
|
||||
height = [view frame].size.height;
|
||||
|
||||
drawable_width = [view frame].size.width * [view contentScaleFactor];
|
||||
drawable_height = [view frame].size.height * [view contentScaleFactor];
|
||||
|
||||
engine = new prism::Engine(0, nullptr);
|
||||
|
||||
app = new @APP_CLASS@();
|
||||
engine->set_app(app);
|
||||
|
||||
GFXCreateInfo createInfo = {};
|
||||
createInfo.api_validation_enabled = true;
|
||||
|
||||
GFXMetal* gfx = new GFXMetal();
|
||||
gfx->initialize(createInfo);
|
||||
engine->set_gfx(gfx);
|
||||
|
||||
app_main(engine);
|
||||
|
||||
engine->add_window((void*)CFBridgingRetain([view layer]), 0, {static_cast<uint32_t>(width), static_cast<uint32_t>(height)});
|
||||
|
||||
app->initialize_render();
|
||||
|
||||
NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
|
||||
[nc addObserver:view
|
||||
selector:@selector(controllerConnected)
|
||||
name:GCControllerDidConnectNotification
|
||||
object:nil];
|
||||
}
|
||||
|
||||
- (void)didReceiveMemoryWarning {
|
||||
[super didReceiveMemoryWarning];
|
||||
// Dispose of any resources that can be recreated.
|
||||
}
|
||||
|
||||
-(bool)prefersStatusBarHidden {
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
void platform::capture_mouse(const bool capture) {
|
||||
|
||||
}
|
||||
|
||||
const char* platform::get_name() {
|
||||
return "tvOS";
|
||||
}
|
||||
|
||||
Offset platform::get_cursor_position() {
|
||||
return {static_cast<int32_t>(mouse_x), static_cast<int32_t>(mouse_y)};
|
||||
}
|
||||
|
||||
std::tuple<float, float> platform::get_right_stick_position() {
|
||||
return {rightX, rightY};
|
||||
}
|
||||
|
||||
std::tuple<float, float> platform::get_left_stick_position() {
|
||||
return {leftX, leftY};
|
||||
}
|
||||
|
||||
bool platform::get_key_down(InputButton key) {
|
||||
if(key == InputButton::ButtonA)
|
||||
return inputKeys[0];
|
||||
|
||||
if(key == InputButton::ButtonB)
|
||||
return inputKeys[1];
|
||||
|
||||
if(key == InputButton::ButtonX)
|
||||
return inputKeys[2];
|
||||
|
||||
if(key == InputButton::ButtonY)
|
||||
return inputKeys[3];
|
||||
|
||||
if(key == InputButton::DPadUp)
|
||||
return inputKeys[4];
|
||||
|
||||
if(key == InputButton::DPadDown)
|
||||
return inputKeys[5];
|
||||
|
||||
if(key == InputButton::DPadLeft)
|
||||
return inputKeys[6];
|
||||
|
||||
if(key == InputButton::DPadRight)
|
||||
return inputKeys[7];
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int platform::open_window(const std::string_view title, const Rectangle rect, const WindowFlags flags) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void platform::set_window_title(const int index, const std::string_view title) {
|
||||
|
||||
}
|
||||
|
||||
bool platform::is_window_focused(const int index) {
|
||||
|
||||
}
|
||||
|
||||
void platform::set_window_focused(const int index) {
|
||||
|
||||
}
|
||||
|
||||
Extent platform::get_window_size(const int index) {
|
||||
return {static_cast<uint32_t>(width), static_cast<uint32_t>(height)};
|
||||
}
|
||||
|
||||
Extent platform::get_window_drawable_size(const int index) {
|
||||
return {static_cast<uint32_t>(drawable_width), static_cast<uint32_t>(drawable_height)};
|
||||
}
|
||||
|
||||
Offset platform::get_window_position(const int index) {
|
||||
|
||||
}
|
||||
|
||||
void platform::set_window_size(const int index, const Extent extent) {
|
||||
|
||||
}
|
||||
|
||||
void platform::set_window_position(const int index, const Offset offset) {
|
||||
|
||||
}
|
||||
|
||||
void platform::close_window(const int index) {
|
||||
|
||||
}
|
||||
|
||||
char* platform::translate_keycode(const unsigned int keycode) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
int platform::get_keycode(const InputButton button) {
|
||||
|
||||
}
|
||||
|
||||
Rectangle platform::get_monitor_resolution() {
|
||||
|
||||
}
|
||||
|
||||
Rectangle platform::get_monitor_work_area() {
|
||||
|
||||
}
|
||||
|
||||
Offset platform::get_screen_cursor_position() {
|
||||
|
||||
}
|
||||
|
||||
float platform::get_window_dpi(const int index) {
|
||||
return 2.0f;
|
||||
}
|
||||
|
||||
bool platform::get_mouse_button_down(const int index) {
|
||||
return mouse_down;
|
||||
}
|
||||
|
||||
float platform::get_monitor_dpi() {
|
||||
return 2.0f;
|
||||
}
|
||||
|
||||
std::tuple<float, float> platform::get_wheel_delta() {
|
||||
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
#include "file.hpp"
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#include <array>
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#include "string_utils.hpp"
|
||||
|
||||
#include "log.hpp"
|
||||
|
||||
void file::initialize_domain(const FileDomain domain, const AccessMode mode, const std::string_view path) {
|
||||
NSBundle* bundle = [NSBundle mainBundle];
|
||||
NSString* resourceFolderPath = [bundle resourcePath];
|
||||
|
||||
std::string s = std::string(path);
|
||||
s = replace_substring(s, "{resource_dir}", std::string([resourceFolderPath cStringUsingEncoding:NSUTF8StringEncoding]));
|
||||
|
||||
domain_data[(int)domain] = s;
|
||||
}
|
||||
|
||||
std::string file::get_writeable_path(const std::string_view path) {
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
|
||||
|
||||
NSString* resourceFolderPath = paths[0];
|
||||
|
||||
std::string s = std::string([resourceFolderPath cStringUsingEncoding:NSUTF8StringEncoding]) + "/" + std::string(path);
|
||||
|
||||
return s;
|
||||
}
|
Reference in a new issue