Browse Source

perform some cleanup

Sam Jaffe 3 years ago
parent
commit
cce80e7f44

+ 1 - 1
.clang-format

@@ -75,7 +75,7 @@ KeepEmptyLinesAtTheStartOfBlocks: true
 MacroBlockBegin: ''
 MacroBlockEnd:   ''
 MaxEmptyLinesToKeep: 1
-NamespaceIndentation: All
+NamespaceIndentation: Inner
 ObjCBlockIndentWidth: 2
 ObjCSpaceAfterProperty: false
 ObjCSpaceBeforeProtocolList: true

+ 9 - 11
engine/engine.xcodeproj/project.pbxproj

@@ -9,8 +9,8 @@
 /* Begin PBXBuildFile section */
 		CD1C83562298B55F00825C4E /* fps_counter.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD1C83542298B55F00825C4E /* fps_counter.cxx */; };
 		CD1C8419229A095600825C4E /* text_engine.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD1C8417229A095600825C4E /* text_engine.cxx */; };
+		CD210444285E4CBC00F15770 /* libjsoncpp_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CD210443285E4CB100F15770 /* libjsoncpp_static.a */; };
 		CD39A88F22F521DB00FEC384 /* libjsoncpp.1.9.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CD39A88D22F521A200FEC384 /* libjsoncpp.1.9.0.dylib */; };
-		CD39A89022F5225500FEC384 /* libjsoncpp.1.9.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CD39A88D22F521A200FEC384 /* libjsoncpp.1.9.0.dylib */; };
 		CD39A89222F6052D00FEC384 /* entity_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD39A89122F6052D00FEC384 /* entity_test.cxx */; };
 		CD62D8462251A94C0023219A /* libgraphics.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CD62D8452251A94C0023219A /* libgraphics.dylib */; };
 		CD62D8482251A9500023219A /* libmath.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CD62D8472251A9500023219A /* libmath.dylib */; };
@@ -81,6 +81,7 @@
 /* Begin PBXFileReference section */
 		CD1C83542298B55F00825C4E /* fps_counter.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = fps_counter.cxx; sourceTree = "<group>"; };
 		CD1C8417229A095600825C4E /* text_engine.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = text_engine.cxx; sourceTree = "<group>"; };
+		CD210443285E4CB100F15770 /* libjsoncpp_static.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjsoncpp_static.a; path = ../../../../../../../opt/local/lib/libjsoncpp_static.a; sourceTree = "<group>"; };
 		CD39A88D22F521A200FEC384 /* libjsoncpp.1.9.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libjsoncpp.1.9.0.dylib; path = ../../../../../../../opt/local/lib/libjsoncpp.1.9.0.dylib; sourceTree = "<group>"; };
 		CD39A89122F6052D00FEC384 /* entity_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = entity_test.cxx; sourceTree = "<group>"; };
 		CD62D8452251A94C0023219A /* libgraphics.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; path = libgraphics.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -124,8 +125,8 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				CD39A89022F5225500FEC384 /* libjsoncpp.1.9.0.dylib in Frameworks */,
 				CD7E87792295FAB400D877FE /* libgameutils.dylib in Frameworks */,
+				CD210444285E4CBC00F15770 /* libjsoncpp_static.a in Frameworks */,
 				CD62D8482251A9500023219A /* libmath.dylib in Frameworks */,
 				CD62D8462251A94C0023219A /* libgraphics.dylib in Frameworks */,
 			);
@@ -137,6 +138,7 @@
 		CD62D8442251A94C0023219A /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				CD210443285E4CB100F15770 /* libjsoncpp_static.a */,
 				CD39A88D22F521A200FEC384 /* libjsoncpp.1.9.0.dylib */,
 				CD7E87782295FAB400D877FE /* libgameutils.dylib */,
 				CD62FD3922936E9C00376440 /* libjsoncpp.1.8.4.dylib */,
@@ -273,7 +275,7 @@
 			isa = PBXProject;
 			attributes = {
 				LastSwiftUpdateCheck = 1010;
-				LastUpgradeCheck = 1030;
+				LastUpgradeCheck = 1240;
 				ORGANIZATIONNAME = "Sam Jaffe";
 				TargetAttributes = {
 					CD62FCC822904A8900376440 = {
@@ -422,7 +424,6 @@
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
 				CLANG_ENABLE_OBJC_WEAK = YES;
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
 				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
@@ -435,7 +436,6 @@
 					"$(inherited)",
 					/opt/local/lib,
 				);
-				MACOSX_DEPLOYMENT_TARGET = 10.13;
 				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
 				MTL_FAST_MATH = YES;
 				PRODUCT_BUNDLE_IDENTIFIER = "leumasjaffe.engine-test";
@@ -452,7 +452,6 @@
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
 				CLANG_ENABLE_OBJC_WEAK = YES;
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
 				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
@@ -465,7 +464,6 @@
 					"$(inherited)",
 					/opt/local/lib,
 				);
-				MACOSX_DEPLOYMENT_TARGET = 10.13;
 				MTL_FAST_MATH = YES;
 				PRODUCT_BUNDLE_IDENTIFIER = "leumasjaffe.engine-test";
 				PRODUCT_NAME = "$(TARGET_NAME)";
@@ -478,7 +476,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LANGUAGE_STANDARD = "c++17";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
@@ -496,6 +494,7 @@
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -520,7 +519,6 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				MTL_ENABLE_DEBUG_INFO = YES;
 				ONLY_ACTIVE_ARCH = YES;
 				SDKROOT = macosx;
@@ -533,7 +531,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LANGUAGE_STANDARD = "c++17";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
@@ -551,6 +549,7 @@
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -569,7 +568,6 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				SDKROOT = macosx;
 				SYSTEM_HEADER_SEARCH_PATHS = /opt/local/include/;

+ 1 - 1
engine/engine.xcodeproj/xcshareddata/xcschemes/engine-test.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1110"
+   LastUpgradeVersion = "1240"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 30 - 32
engine/include/game/engine/events.hpp

@@ -12,39 +12,37 @@
 
 #include "engine_fwd.hpp"
 
-namespace engine {
-  namespace keys {
-    enum default_keys : key_enum_t { QUIT = 'q' };
-    extern key_enum_t const UP_ARROW;
-    extern key_enum_t const DOWN_ARROW;
-    extern key_enum_t const LEFT_ARROW;
-    extern key_enum_t const RIGHT_ARROW;
-    extern key_enum_t const MOD_SHIFT;
-    extern key_enum_t const MOD_CONTROL;
-    extern key_enum_t const MOD_ALT;
-    extern key_enum_t const MOD_COMMAND;
-  }
+namespace engine::keys {
+enum default_keys : key_enum_t { QUIT = 'q' };
+extern key_enum_t const UP_ARROW;
+extern key_enum_t const DOWN_ARROW;
+extern key_enum_t const LEFT_ARROW;
+extern key_enum_t const RIGHT_ARROW;
+extern key_enum_t const MOD_SHIFT;
+extern key_enum_t const MOD_CONTROL;
+extern key_enum_t const MOD_ALT;
+extern key_enum_t const MOD_COMMAND;
+}
 
-  namespace event {
-    enum event_type {
-      PRESSED_MASK = 0x1,
-      RELEASED_MASK = 0x2,
-      KEY_MASK = 0x4,
-      MOUSE_MASK = 0x8,
-      KEY_PRESSED = KEY_MASK | PRESSED_MASK,
-      KEY_RELEASED = KEY_MASK | RELEASED_MASK,
-      MOUSE_PRESSED = MOUSE_MASK | PRESSED_MASK,
-      MOUSE_RELEASED = MOUSE_MASK | RELEASED_MASK
-    };
+namespace engine::event {
+enum event_type {
+  PRESSED_MASK = 0x1,
+  RELEASED_MASK = 0x2,
+  KEY_MASK = 0x4,
+  MOUSE_MASK = 0x8,
+  KEY_PRESSED = KEY_MASK | PRESSED_MASK,
+  KEY_RELEASED = KEY_MASK | RELEASED_MASK,
+  MOUSE_PRESSED = MOUSE_MASK | PRESSED_MASK,
+  MOUSE_RELEASED = MOUSE_MASK | RELEASED_MASK
+};
 
-    struct key_event {
-      key_enum_t key;
-      event_type type;
-    };
+struct key_event {
+  key_enum_t key;
+  event_type type;
+};
 
-    struct mouse_event {
-      math::vec2 current_mouse_position;
-      event_type type;
-    };
-  }
+struct mouse_event {
+  math::vec2 current_mouse_position;
+  event_type type;
+};
 }

+ 3 - 1
engine/test/game_dispatch_test.cxx

@@ -10,6 +10,8 @@
 
 #include <gmock/gmock.h>
 
+#include "math/vector/vector.hpp"
+
 #include "game/engine/events.hpp"
 #include "game/engine/game_dispatch.hpp"
 #include "game/engine/scene.hpp"
@@ -43,7 +45,7 @@ protected:
 };
 
 void GameDispatchTest::SetUp() {
-  env::resize_screen({{100, 100}});
+  env::resize_screen(math::vec2i{{100, 100}});
   renderer_.reset(new stub_renderer);
   dispatch_.reset(new engine::game_dispatch(renderer_));
   dispatch_->set_target_fps(env::fps::v60);

+ 5 - 13
graphics/graphics.xcodeproj/project.pbxproj

@@ -365,7 +365,7 @@
 		CD3AC6DA1D2C0364002B4BB0 /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
-				LastUpgradeCheck = 1030;
+				LastUpgradeCheck = 1240;
 				ORGANIZATIONNAME = "Sam Jaffe";
 				TargetAttributes = {
 					CD3AC6E11D2C0364002B4BB0 = {
@@ -529,7 +529,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LANGUAGE_STANDARD = "c++17";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
@@ -547,6 +547,7 @@
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -571,7 +572,6 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				MTL_ENABLE_DEBUG_INFO = YES;
 				ONLY_ACTIVE_ARCH = YES;
 				SDKROOT = macosx;
@@ -583,7 +583,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LANGUAGE_STANDARD = "c++17";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
@@ -601,6 +601,7 @@
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -619,7 +620,6 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				SDKROOT = macosx;
 				USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/include/ $(PROJECT_DIR)/../include/expect/include/ $(PROJECT_DIR)/../math/ $(PROJECT_DIR)/../include/ $(PROJECT_DIR)/../math/include/ $(PROJECT_DIR)/../include/resource_factory/include/ $(PROJECT_DIR)/../util/include";
@@ -658,7 +658,6 @@
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
 				CLANG_ENABLE_OBJC_WEAK = YES;
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
 				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
@@ -667,7 +666,6 @@
 				DYLIB_CURRENT_VERSION = 1;
 				EXECUTABLE_PREFIX = lib;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
-				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
 				MTL_FAST_MATH = YES;
 				PRODUCT_NAME = "$(TARGET_NAME)";
@@ -681,7 +679,6 @@
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
 				CLANG_ENABLE_OBJC_WEAK = YES;
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
 				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
@@ -690,7 +687,6 @@
 				DYLIB_CURRENT_VERSION = 1;
 				EXECUTABLE_PREFIX = lib;
 				GCC_C_LANGUAGE_STANDARD = gnu11;
-				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				MTL_FAST_MATH = YES;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SKIP_INSTALL = YES;
@@ -703,7 +699,6 @@
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
 				CLANG_ENABLE_OBJC_WEAK = YES;
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
 				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
@@ -712,7 +707,6 @@
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = "graphics-test/Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
-				MACOSX_DEPLOYMENT_TARGET = 10.13;
 				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
 				MTL_FAST_MATH = YES;
 				PRODUCT_BUNDLE_IDENTIFIER = "leumasjaffe.graphics-test";
@@ -726,7 +720,6 @@
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
 				CLANG_ENABLE_OBJC_WEAK = YES;
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
 				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
@@ -735,7 +728,6 @@
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = "graphics-test/Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
-				MACOSX_DEPLOYMENT_TARGET = 10.13;
 				MTL_FAST_MATH = YES;
 				PRODUCT_BUNDLE_IDENTIFIER = "leumasjaffe.graphics-test";
 				PRODUCT_NAME = "$(TARGET_NAME)";

+ 1 - 1
graphics/graphics.xcodeproj/xcshareddata/xcschemes/graphics-test.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1110"
+   LastUpgradeVersion = "1240"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 3 - 5
math/math.xcodeproj/project.pbxproj

@@ -243,7 +243,7 @@
 			isa = PBXProject;
 			attributes = {
 				LastSwiftUpdateCheck = 1010;
-				LastUpgradeCheck = 1030;
+				LastUpgradeCheck = 1240;
 				ORGANIZATIONNAME = "Sam Jaffe";
 				TargetAttributes = {
 					CD1FCFCC227E194D00F9BF93 = {
@@ -393,7 +393,6 @@
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = "math-test/Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
-				MACOSX_DEPLOYMENT_TARGET = 10.13;
 				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
 				MTL_FAST_MATH = YES;
 				PRODUCT_BUNDLE_IDENTIFIER = "leumasjaffe.math-test";
@@ -419,7 +418,6 @@
 				GCC_C_LANGUAGE_STANDARD = gnu11;
 				INFOPLIST_FILE = "math-test/Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
-				MACOSX_DEPLOYMENT_TARGET = 10.13;
 				MTL_FAST_MATH = YES;
 				PRODUCT_BUNDLE_IDENTIFIER = "leumasjaffe.math-test";
 				PRODUCT_NAME = "$(TARGET_NAME)";
@@ -450,6 +448,7 @@
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -474,7 +473,6 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				MTL_ENABLE_DEBUG_INFO = YES;
 				ONLY_ACTIVE_ARCH = YES;
 				SDKROOT = macosx;
@@ -504,6 +502,7 @@
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -522,7 +521,6 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				SDKROOT = macosx;
 				USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/ $(PROJECT_DIR)/include/ $(PROJECT_DIR)/../include/expect/include/";

+ 1 - 1
math/math.xcodeproj/xcshareddata/xcschemes/math-test.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
-   LastUpgradeVersion = "1110"
+   LastUpgradeVersion = "1240"
    version = "1.3">
    <BuildAction
       parallelizeBuildables = "YES"

+ 19 - 9
util/gameutils.xcodeproj/project.pbxproj

@@ -9,7 +9,9 @@
 /* Begin PBXBuildFile section */
 		CD62FD04229195FF00376440 /* files.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD62FD02229195FF00376440 /* files.cxx */; settings = {COMPILER_FLAGS = "-fvisibility=default"; }; };
 		CD62FD082291988F00376440 /* osx_env.mm in Sources */ = {isa = PBXBuildFile; fileRef = CD62FD072291988F00376440 /* osx_env.mm */; settings = {COMPILER_FLAGS = "-fvisibility=default"; }; };
-		CD7E87772295FA1F00D877FE /* time.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CD7E876F2295FA1F00D877FE /* time.cpp */; settings = {COMPILER_FLAGS = "-fvisibility=default"; }; };
+		CD79A0F927246F4500CAFFC2 /* state_machine.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD79A0F727246F4500CAFFC2 /* state_machine.cxx */; };
+		CD79A0FA27246F4500CAFFC2 /* state_machine.h in Headers */ = {isa = PBXBuildFile; fileRef = CD79A0F827246F4500CAFFC2 /* state_machine.h */; };
+		CD7E87772295FA1F00D877FE /* time.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD7E876F2295FA1F00D877FE /* time.cxx */; settings = {COMPILER_FLAGS = "-fvisibility=default"; }; };
 		CD7E884822960F4800D877FE /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CD7E884722960F4800D877FE /* AppKit.framework */; };
 /* End PBXBuildFile section */
 
@@ -51,8 +53,11 @@
 		CD62FCFF2291953700376440 /* game */ = {isa = PBXFileReference; lastKnownFileType = folder; name = game; path = include/game; sourceTree = "<group>"; };
 		CD62FD02229195FF00376440 /* files.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = files.cxx; sourceTree = "<group>"; };
 		CD62FD072291988F00376440 /* osx_env.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = osx_env.mm; sourceTree = "<group>"; };
-		CD7E876F2295FA1F00D877FE /* time.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = time.cpp; sourceTree = "<group>"; };
+		CD79A0F727246F4500CAFFC2 /* state_machine.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = state_machine.cxx; sourceTree = "<group>"; };
+		CD79A0F827246F4500CAFFC2 /* state_machine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = state_machine.h; sourceTree = "<group>"; };
+		CD7E876F2295FA1F00D877FE /* time.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = time.cxx; sourceTree = "<group>"; };
 		CD7E884722960F4800D877FE /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
+		CDA31AB32725C6190071CDC2 /* smart_map.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = smart_map.hpp; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -92,7 +97,10 @@
 				CD62FCFC2291951400376440 /* linux_env.cxx */,
 				CD62FD072291988F00376440 /* osx_env.mm */,
 				CD62FD02229195FF00376440 /* files.cxx */,
-				CD7E876F2295FA1F00D877FE /* time.cpp */,
+				CD79A0F727246F4500CAFFC2 /* state_machine.cxx */,
+				CDA31AB32725C6190071CDC2 /* smart_map.hpp */,
+				CD79A0F827246F4500CAFFC2 /* state_machine.h */,
+				CD7E876F2295FA1F00D877FE /* time.cxx */,
 			);
 			path = src;
 			sourceTree = "<group>";
@@ -123,6 +131,7 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				CD79A0FA27246F4500CAFFC2 /* state_machine.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -153,7 +162,7 @@
 		CD3AC7001D2C0726002B4BB0 /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
-				LastUpgradeCheck = 1030;
+				LastUpgradeCheck = 1240;
 				ORGANIZATIONNAME = "Sam Jaffe";
 				TargetAttributes = {
 					CD3AC7071D2C0726002B4BB0 = {
@@ -243,7 +252,8 @@
 			files = (
 				CD62FD082291988F00376440 /* osx_env.mm in Sources */,
 				CD62FD04229195FF00376440 /* files.cxx in Sources */,
-				CD7E87772295FA1F00D877FE /* time.cpp in Sources */,
+				CD7E87772295FA1F00D877FE /* time.cxx in Sources */,
+				CD79A0F927246F4500CAFFC2 /* state_machine.cxx in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -255,7 +265,7 @@
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LANGUAGE_STANDARD = "c++17";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
@@ -273,6 +283,7 @@
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -297,7 +308,6 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				MTL_ENABLE_DEBUG_INFO = YES;
 				ONLY_ACTIVE_ARCH = YES;
 				SDKROOT = macosx;
@@ -310,7 +320,7 @@
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+				CLANG_CXX_LANGUAGE_STANDARD = "c++17";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
@@ -328,6 +338,7 @@
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -346,7 +357,6 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				MACOSX_DEPLOYMENT_TARGET = 10.10;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				SDKROOT = macosx;
 				USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/include $(PROJECT_DIR)/../include/ $(PROJECT_DIR)/../math/ $(PROJECT_DIR)/../math/include/ $(PROJECT_DIR)/../include/expect/include/";

+ 28 - 4
util/include/game/util/env.hpp

@@ -12,9 +12,33 @@
 
 #include "game/math/math_fwd.hpp"
 
+#define ENVIRONMENT_FREE_FUNCTION_ALIAS(function)                              \
+  template <typename... Args> auto function(Args &&... args) {                 \
+    auto & env = Environment::global_instance();                               \
+    return env.function(std::forward<Args>(args)...);                          \
+  }
+
 namespace env {
-  std::string resource_file(std::string const & relative_path);
-  void resize_screen(math::vec2i const & size);
-  math::vec2i screen_size();
-  math::vec2i screen_resolution();
+class Environment {
+public:
+  static Environment & global_instance();
+
+  virtual std::string resource_file(std::string const & rel_path) const = 0;
+
+  virtual void resize_screen(math::vec2i const & size) = 0;
+  virtual math::vec2i screen_size() const = 0;
+  virtual math::vec2i screen_resolution() const = 0;
+
+protected:
+  ~Environment() = default;
+  Environment & operator=(Environment const &) = delete;
+  Environment & operator=(Environment &&) = delete;
+};
+
+ENVIRONMENT_FREE_FUNCTION_ALIAS(resource_file)
+ENVIRONMENT_FREE_FUNCTION_ALIAS(resize_screen)
+ENVIRONMENT_FREE_FUNCTION_ALIAS(screen_size)
+ENVIRONMENT_FREE_FUNCTION_ALIAS(screen_resolution)
 }
+
+#undef ENVIRONMENT_FREE_FUNCTION_ALIAS

+ 22 - 22
util/include/game/util/time.hpp

@@ -9,29 +9,29 @@
 
 #include <chrono>
 
-namespace env {
-  namespace clock {
-    using clock_t = std::chrono::steady_clock;
-    using timestamp = std::chrono::time_point<clock_t>;
-    using duration = clock_t::duration;
+namespace env::clock {
+using clock_t = std::chrono::steady_clock;
+using timestamp = std::chrono::time_point<clock_t>;
+using duration = clock_t::duration;
 
-    struct tick {
-      tick(timestamp prev) : now(clock_t::now()), since(now - prev) {}
-      timestamp now;
-      duration since;
-    };
+struct tick {
+  tick(timestamp prev) : now(clock_t::now()), since(now - prev) {}
+  timestamp now;
+  duration since;
+};
 
-    inline timestamp now() { return clock_t::now(); }
-    template <typename T> T current_time() {
-      return std::chrono::duration<T>(now().time_since_epoch()).count();
-    }
-  }
+inline timestamp now() { return clock_t::now(); }
+template <typename T> T current_time() {
+  return std::chrono::duration<T>(now().time_since_epoch()).count();
+}
+}
 
-  struct fps {
-    static clock::duration const v24;
-    static clock::duration const v30;
-    static clock::duration const v60;
-    static clock::duration const v120;
-    static clock::duration const v144;
-  };
+namespace env {
+struct fps {
+  static clock::duration const v24;
+  static clock::duration const v30;
+  static clock::duration const v60;
+  static clock::duration const v120;
+  static clock::duration const v144;
+};
 }

+ 67 - 51
util/src/osx_env.mm

@@ -13,64 +13,80 @@
 #include "vector/vector.hpp"
 
 namespace {
-  NSUInteger encoding = NSUTF8StringEncoding;
-  NSString* translate(std::string const & str) {
-    return [NSString stringWithCString:str.c_str() encoding:encoding];
-  }
+
+NSString* translate(std::string const & str) {
+  return [NSString stringWithCString:str.c_str() encoding:NSUTF8StringEncoding];
+}
+
+math::vec2i init_screen() {
+  NSRect frame = [[NSView focusView] frame];
+  return make_vector(static_cast<int>(frame.size.width),
+                     static_cast<int>(frame.size.height));
+}
+
 }
 
 namespace env {
-  namespace detail {
-    NSString * bundle_name = nil;
-    void bundle(std::string const & str) {
-      bundle_name = str.empty() ? nil : translate(str);
-    }
-    NSBundle * bundle() {
-      return bundle_name == nil ? [NSBundle mainBundle] :
-          [NSBundle bundleWithIdentifier:bundle_name];
-    }
-  }
+
+class OSXEnvironment : public Environment {
+public:
+  std::string resource_file(std::string const & rel_path) const override;
   
-  std::string resource_file(std::string const& path) {
-    size_t dir_idx = path.find_last_of("/");
-    size_t ext_idx = path.find_first_of(".");
-    std::string base = path.substr(0, dir_idx);
-    std::string name = path.substr(dir_idx + 1, ext_idx - (dir_idx + 1));
-    std::string type = path.substr(ext_idx + 1);
-    
-    NSString* url = [detail::bundle() pathForResource:translate(name)
-                                               ofType:translate(type)
-                                          inDirectory:translate(base)];
-    
-    char const* abs_path = [url cStringUsingEncoding:encoding];
-    return abs_path ? std::string(abs_path) : std::string();
+  void resize_screen(math::vec2i const & size) override;
+  math::vec2i screen_size() const override;
+  math::vec2i screen_resolution() const override;
+
+  void bundle(std::string const &id) {
+    bundle(id.size() ? [NSBundle bundleWithIdentifier:translate(id)] : nil);
   }
+
+private:
+  NSBundle *bundle() const { return override_bundle_ ?: [NSBundle mainBundle]; }
+  void bundle(NSBundle * bund) { override_bundle_ = bund; }
+
+private:
+  NSBundle *override_bundle_;
+  math::vec2i screen_size_{init_screen()};
+};
+
+Environment &Environment::global_instance() {
+  static OSXEnvironment s_env;
+  return s_env;
+}
   
-  namespace detail {
-    math::vec2i init_screen() {
-      NSRect frame = [[NSView focusView] frame];
-      return make_vector(static_cast<int>(frame.size.width),
-                         static_cast<int>(frame.size.height));
-    }
-    
-    math::vec2i screenSize = init_screen();
-    
-    void resize_screen(math::vec2i const& size) {
-      screenSize = size;
-    }
-  }
+std::string OSXEnvironment::resource_file(std::string const& path) const {
+  size_t dir_idx = path.find_last_of("/");
+  size_t ext_idx = path.find_first_of(".");
+  std::string base = path.substr(0, dir_idx);
+  std::string name = path.substr(dir_idx + 1, ext_idx - (dir_idx + 1));
+  std::string type = path.substr(ext_idx + 1);
   
-  math::vec2i screen_resolution() {
-    return detail::screenSize * 2; // TODO: aquire this programmatically
-  }
+  NSString* url = [bundle() pathForResource:translate(name)
+                                     ofType:translate(type)
+                                inDirectory:translate(base)];
   
-  math::vec2i screen_size() {
-    return detail::screenSize;
-  }
+  char const* abs_path = [url cStringUsingEncoding:NSUTF8StringEncoding];
+  return abs_path ? std::string(abs_path) : std::string();
+}
+
+void OSXEnvironment::resize_screen(math::vec2i const& size) {
+  NSSize sz = NSMakeSize(size[0], size[1]);
+  [[NSView focusView] setFrameSize:sz];
+  screen_size_ = size;
+}
   
-  void resize_screen(math::vec2i const& size) {
-    NSSize sz = NSMakeSize(size[0], size[1]);
-    [[NSView focusView] setFrameSize:sz];
-    detail::resize_screen(size);
-  }
+math::vec2i OSXEnvironment::screen_size() const {
+  return screen_size_;
+}
+ 
+math::vec2i OSXEnvironment::screen_resolution() const {
+  return screen_size() * 2; // TODO: aquire this programmatically
+}
+
+}
+
+namespace env { namespace osx {
+void bundle(std::string const &id) {
+  static_cast<OSXEnvironment &>(Environment::global_instance()).bundle(id);
 }
+}}

+ 0 - 18
util/src/time.cpp

@@ -1,18 +0,0 @@
-//
-//  time.cpp
-//  engine
-//
-//  Created by Sam Jaffe on 9/3/16.
-//
-
-#include "game/util/time.hpp"
-
-namespace env {
-  using std::chrono::nanoseconds;
-
-  clock::duration const fps::v24{nanoseconds{41666666}};
-  clock::duration const fps::v30{nanoseconds{33333333}};
-  clock::duration const fps::v60{nanoseconds{16666666}};
-  clock::duration const fps::v120{nanoseconds{8333333}};
-  clock::duration const fps::v144{nanoseconds{6944444}};
-}

+ 20 - 0
util/src/time.cxx

@@ -0,0 +1,20 @@
+//
+//  time.cpp
+//  engine
+//
+//  Created by Sam Jaffe on 9/3/16.
+//
+
+#include "game/util/time.hpp"
+
+#include <chrono>
+
+namespace env {
+using std::literals::chrono_literals::operator""ns;
+
+clock::duration const fps::v24{41666666ns};
+clock::duration const fps::v30{33333333ns};
+clock::duration const fps::v60{16666666ns};
+clock::duration const fps::v120{8333333ns};
+clock::duration const fps::v144{6944444ns};
+}