crammed linux support and spent several hours trying to hunt down static initialization demons just for my .so lib to be made wrong
This commit is contained in:
parent
0fb2e3b750
commit
c5f0ec69b2
81
Makefile
81
Makefile
@ -3,7 +3,8 @@ CC = $(shell cat "./makefiles/default/cc")
|
||||
RENDERER = $(shell cat "./makefiles/default/renderer")
|
||||
TARGET_NAME = program
|
||||
TARGET_EXTENSION = exe
|
||||
TARGET_LIB_EXTENSION = dll
|
||||
LIB_EXTENSION = dll
|
||||
LIB_EXTENSION_A = .a
|
||||
PREFIX = $(ARCH).$(CC)
|
||||
|
||||
include makefiles/$(PREFIX).make
|
||||
@ -36,10 +37,18 @@ EXT_LIB_NAME += ext
|
||||
|
||||
7Z += /c/Program\ Files/7-Zip/7z.exe
|
||||
|
||||
VULKAN_SDK_PATH += /c/VulkanSDK/1.4.321.1/
|
||||
GLSLC += $(VULKAN_SDK_PATH)/Bin/glslc
|
||||
SPV_OPTIMIZER += $(VULKAN_SDK_PATH)/Bin/spirv-opt
|
||||
SPV_LINTER += $(VULKAN_SDK_PATH)/Bin/spirv-lint
|
||||
ifneq (,$(findstring win64,$(ARCH)))
|
||||
VULKAN_SDK_PATH = /c/VulkanSDK/1.4.321.1/
|
||||
GLSLC = $(VULKAN_SDK_PATH)/Bin/glslc
|
||||
SPV_OPTIMIZER = $(VULKAN_SDK_PATH)/Bin/spirv-opt
|
||||
SPV_LINTER = $(VULKAN_SDK_PATH)/Bin/spirv-lint
|
||||
else
|
||||
VULKAN_SDK_PATH = /
|
||||
GLSLC = glslc
|
||||
SPV_OPTIMIZER = spirv-opt
|
||||
SPV_LINTER = spirv-lint
|
||||
endif
|
||||
|
||||
|
||||
# Base Engine's DLL
|
||||
INC_DIR += $(ENGINE_INC_DIR)
|
||||
@ -62,6 +71,15 @@ ifneq (,$(findstring win64,$(ARCH)))
|
||||
DEPS += -lgdi32 -ldwmapi
|
||||
LINKS += #-Wl,-subsystem,windows
|
||||
INCS := -I./dep/master/include $(INCS)
|
||||
else ifneq (,$(findstring linux,$(ARCH)))
|
||||
ifneq (,$(findstring -DUF_DEV_ENV,$(FLAGS)))
|
||||
REQ_DEPS += toml xatlas curl dc:texconv # meshoptimizer ffx:fsr cpptrace vall_e # ncurses openvr draco discord bullet ultralight-ux
|
||||
FLAGS += -march=native -g # -flto # -g
|
||||
endif
|
||||
REQ_DEPS += $(RENDERER) json:nlohmann zlib luajit reactphysics simd ctti gltf imgui fmt freetype openal ogg wav
|
||||
FLAGS += -DUF_ENV_LINUX -fPIC
|
||||
DEPS += -pthread -ldl -lX11 -lXrandr
|
||||
INCS := -I./dep/master/include $(INCS)
|
||||
else ifneq (,$(findstring dreamcast,$(ARCH)))
|
||||
FLAGS += -DUF_ENV_DREAMCAST # -DUF_LEAN_AND_MEAN # this apparently crashes
|
||||
REQ_DEPS += opengl gldc json:nlohmann zlib lua reactphysics simd ctti fmt freetype openal aldc ogg wav png # imgui
|
||||
@ -69,10 +87,18 @@ else ifneq (,$(findstring dreamcast,$(ARCH)))
|
||||
endif
|
||||
|
||||
ifneq (,$(findstring vulkan,$(REQ_DEPS)))
|
||||
FLAGS += -DVK_USE_PLATFORM_WIN32_KHR -DUF_USE_VULKAN
|
||||
DEPS += -lvulkan-1 -lspirv-cross-core -lspirv-cross-cpp #-lVulkanMemoryAllocator
|
||||
FLAGS += -DUF_USE_VULKAN
|
||||
DEPS += -lspirv-cross-core -lspirv-cross-cpp #-lVulkanMemoryAllocator
|
||||
INCS += -I$(VULKAN_SDK_PATH)/include -I./dep/include/spirv_cross/
|
||||
LIBS += -L$(VULKAN_SDK_PATH)/Lib
|
||||
|
||||
ifneq (,$(findstring linux,$(ARCH)))
|
||||
DEPS += -lvulkan
|
||||
FLAGS += -DVK_USE_PLATFORM_XLIB_KHR # VK_USE_PLATFORM_XCB_KHR
|
||||
else
|
||||
DEPS += -lvulkan-1
|
||||
FLAGS += -DVK_USE_PLATFORM_WIN32_KHR
|
||||
endif
|
||||
endif
|
||||
ifneq (,$(findstring opengl,$(REQ_DEPS)))
|
||||
FLAGS += -DUF_USE_OPENGL -DUF_USE_OPENGL_FIXED_FUNCTION
|
||||
@ -182,7 +208,12 @@ ifneq (,$(findstring lua,$(REQ_DEPS)))
|
||||
ifneq (,$(findstring luajit,$(REQ_DEPS)))
|
||||
FLAGS += -DUF_USE_LUAJIT
|
||||
DEPS += -lluajit-5.1
|
||||
INCS += -I/mingw64/include/luajit-2.1
|
||||
|
||||
ifneq (,$(findstring linux,$(ARCH)))
|
||||
INCS += -I/usr/include/luajit-2.1
|
||||
else
|
||||
INCS += -I/mingw64/include/luajit-2.1
|
||||
endif
|
||||
else
|
||||
ifneq (,$(findstring dreamcast,$(ARCH)))
|
||||
DEPS += -llua
|
||||
@ -253,8 +284,8 @@ endif
|
||||
SRCS_DLL := $(shell find $(ENGINE_SRC_DIR) -name "*.cpp") $(shell find $(DEP_SRC_DIR) -name "*.cpp")
|
||||
OBJS_DLL += $(patsubst %.cpp,%.$(PREFIX).o,$(SRCS_DLL))
|
||||
BASE_DLL += lib$(LIB_NAME)
|
||||
IM_DLL += $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_DLL).$(TARGET_LIB_EXTENSION).a
|
||||
EX_DLL += $(BIN_DIR)/exe/lib/$(PREFIX_PATH)/$(BASE_DLL).$(TARGET_LIB_EXTENSION)
|
||||
IM_DLL += $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_DLL).$(LIB_EXTENSION)$(LIB_EXTENSION_A)
|
||||
EX_DLL += $(BIN_DIR)/exe/lib/$(PREFIX_PATH)/$(BASE_DLL).$(LIB_EXTENSION)
|
||||
# External Engine's DLL
|
||||
EXT_INC_DIR += $(INC_DIR)
|
||||
EXT_LB_FLAGS += $(LIB_DIR)
|
||||
@ -269,8 +300,8 @@ EXT_LIBS += $(LIBS)
|
||||
SRCS_EXT_DLL := $(shell find $(EXT_SRC_DIR) -name "*.cpp")
|
||||
OBJS_EXT_DLL += $(patsubst %.cpp,%.$(PREFIX).o,$(SRCS_EXT_DLL))
|
||||
BASE_EXT_DLL += lib$(EXT_LIB_NAME)
|
||||
EXT_IM_DLL += $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_EXT_DLL).$(TARGET_LIB_EXTENSION).a
|
||||
EXT_EX_DLL += $(BIN_DIR)/exe/lib/$(PREFIX_PATH)/$(BASE_EXT_DLL).$(TARGET_LIB_EXTENSION)
|
||||
EXT_IM_DLL += $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_EXT_DLL).$(LIB_EXTENSION)$(LIB_EXTENSION_A)
|
||||
EXT_EX_DLL += $(BIN_DIR)/exe/lib/$(PREFIX_PATH)/$(BASE_EXT_DLL).$(LIB_EXTENSION)
|
||||
# Client EXE
|
||||
#SRCS += $(wildcard $(CLIENT_SRC_DIR)/*.cpp) $(wildcard $(CLIENT_SRC_DIR)/*/*.cpp)
|
||||
SRCS := $(shell find $(CLIENT_SRC_DIR) -name "*.cpp")
|
||||
@ -302,13 +333,13 @@ $(EX_DLL): FLAGS += -DUF_EXPORTS
|
||||
$(EX_DLL): $(OBJS_DLL)
|
||||
$(KOS_AR) cru $@ $^
|
||||
$(KOS_RANLIB) $@
|
||||
cp $@ $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_DLL).a
|
||||
cp $@ $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_DLL)$(LIB_EXTENSION_A)
|
||||
|
||||
$(EXT_EX_DLL): FLAGS += -DEXT_EXPORTS
|
||||
$(EXT_EX_DLL): $(OBJS_EXT_DLL)
|
||||
$(KOS_AR) cru $@ $^
|
||||
$(KOS_RANLIB) $@
|
||||
cp $@ $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_EXT_DLL).a
|
||||
cp $@ $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_EXT_DLL)$(LIB_EXTENSION_A)
|
||||
|
||||
./bin/dreamcast/romdisk.img:
|
||||
$(KOS_GENROMFS) -f ./bin/dreamcast/romdisk.img -d ./bin/dreamcast/romdisk/ -v
|
||||
@ -333,11 +364,28 @@ $(PREFIX): $(EX_DLL) $(EXT_EX_DLL) $(TARGET) $(TARGET_SHADERS)
|
||||
%.$(PREFIX).o: %.cpp
|
||||
$(CXX) $(FLAGS) $(INCS) -c $< -o $@
|
||||
|
||||
ifneq (,$(findstring linux,$(ARCH)))
|
||||
#$(EX_DLL): FLAGS += -DUF_EXPORTS -DEXT_EXPORTS
|
||||
$(EX_DLL): FLAGS += -DUF_EXPORTS
|
||||
$(EX_DLL): $(OBJS_DLL)
|
||||
$(CXX) $(FLAGS) -shared -Wl,-soname,$(BASE_DLL).$(LIB_EXTENSION) $(OBJS_DLL) $(LIBS) $(INCS) $(LINKS) -o $(EX_DLL)
|
||||
cp $(EX_DLL) $(IM_DLL)
|
||||
@echo -n $(ARCH) > "./bin/exe/default/arch"
|
||||
@echo -n $(CC) > "./bin/exe/default/cc"
|
||||
@echo -n $(RENDERER) > "./bin/exe/default/renderer"
|
||||
@echo "Setting defaults: $(ARCH).$(CC).$(RENDERER)"
|
||||
$(EXT_EX_DLL): FLAGS += -DEXT_EXPORTS
|
||||
$(EXT_EX_DLL): $(OBJS_EXT_DLL)
|
||||
$(CXX) -shared -Wl,-soname,$(BASE_EXT_DLL).$(LIB_EXTENSION) $(OBJS_EXT_DLL) $(EXT_LIBS) $(EXT_INCS) $(EXT_LINKS) -o $(EXT_EX_DLL)
|
||||
cp $(EXT_EX_DLL) $(EXT_IM_DLL)
|
||||
|
||||
else
|
||||
|
||||
#$(EX_DLL): FLAGS += -DUF_EXPORTS -DEXT_EXPORTS
|
||||
$(EX_DLL): FLAGS += -DUF_EXPORTS
|
||||
$(EX_DLL): $(OBJS_DLL)
|
||||
$(CXX) $(FLAGS) -shared -o $(EX_DLL) -Wl,--out-implib=$(IM_DLL) $(OBJS_DLL) $(LIBS) $(INCS) $(LINKS)
|
||||
cp $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_DLL).$(TARGET_LIB_EXTENSION).a $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_DLL).a
|
||||
cp $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_DLL).$(LIB_EXTENSION).a $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_DLL).a
|
||||
@echo -n $(ARCH) > "./bin/exe/default/arch"
|
||||
@echo -n $(CC) > "./bin/exe/default/cc"
|
||||
@echo -n $(RENDERER) > "./bin/exe/default/renderer"
|
||||
@ -347,7 +395,8 @@ $(EX_DLL): $(OBJS_DLL)
|
||||
$(EXT_EX_DLL): FLAGS += -DEXT_EXPORTS
|
||||
$(EXT_EX_DLL): $(OBJS_EXT_DLL)
|
||||
$(CXX) -shared -o $(EXT_EX_DLL) -Wl,--out-implib=$(EXT_IM_DLL) $(OBJS_EXT_DLL) $(EXT_LIBS) $(EXT_INCS) $(EXT_LINKS)
|
||||
cp $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_EXT_DLL).$(TARGET_LIB_EXTENSION).a $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_EXT_DLL).a
|
||||
cp $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_EXT_DLL).$(LIB_EXTENSION).a $(ENGINE_LIB_DIR)/$(PREFIX_PATH)/$(BASE_EXT_DLL).a
|
||||
endif
|
||||
|
||||
$(TARGET): $(OBJS)
|
||||
$(CXX) $(FLAGS) $(OBJS) $(LIBS) $(INCS) $(LINKS) -l$(LIB_NAME) -l$(EXT_LIB_NAME) -o $(TARGET)
|
||||
|
||||
@ -77,7 +77,7 @@ int main(int argc, char** argv){
|
||||
for ( size_t i = 0; i < argc; ++i ) {
|
||||
char* c_str = argv[i];
|
||||
std::string string(argv[i]);
|
||||
uf::arguments.emplace_back(string);
|
||||
// uf::arguments.emplace_back(string);
|
||||
}
|
||||
|
||||
std::atexit(::handlers::exit);
|
||||
|
||||
3
debug.sh
Normal file → Executable file
3
debug.sh
Normal file → Executable file
@ -3,5 +3,8 @@ cd bin
|
||||
ARCH=$(cat ./exe/default/arch)
|
||||
CC=$(cat ./exe/default/cc)
|
||||
RENDERER=$(cat ./exe/default/renderer)
|
||||
|
||||
export PATH="$(pwd)/exe/lib/${ARCH}/:$(pwd)/exe/lib/${ARCH}/${CC}/${RENDERER}/:${PATH}"
|
||||
export LD_LIBRARY_PATH="$(pwd)/exe/lib/${ARCH}/:$(pwd)/exe/lib/${ARCH}/${CC}/:$(pwd)/exe/lib/${ARCH}/${CC}/${RENDERER}/:${LD_LIBRARY_PATH}"
|
||||
|
||||
gdb -ex 'break abort' ./exe/program.${ARCH}.${CC}.${RENDERER}.exe
|
||||
|
||||
@ -6057,7 +6057,9 @@ namespace sol {
|
||||
static_assert(std::is_constructible<T, Args&&...>::value, "T must be constructible with Args");
|
||||
|
||||
*this = nullopt;
|
||||
this->construct(std::forward<Args>(args)...);
|
||||
//this->construct(std::forward<Args>(args)...);
|
||||
new (static_cast<void*>(this)) optional(std::in_place, std::forward<Args>(args)...);
|
||||
return **this;
|
||||
}
|
||||
|
||||
/// Swaps this optional with the other.
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
namespace uf {
|
||||
extern bool UF_API ready;
|
||||
extern uf::stl::vector<uf::stl::string> UF_API arguments;
|
||||
|
||||
extern uf::Serializer UF_API config;
|
||||
|
||||
extern void UF_API load();
|
||||
|
||||
@ -14,7 +14,6 @@
|
||||
namespace uf {
|
||||
class UF_API Object : public uf::Entity {
|
||||
public:
|
||||
static uf::Timer<long long> timer;
|
||||
static bool assertionLoad;
|
||||
static bool deferLazyCalls;
|
||||
|
||||
|
||||
@ -8,7 +8,9 @@
|
||||
#if !UF_EXCEPTIONS
|
||||
#define JSON_NOEXCEPTION 1
|
||||
#endif
|
||||
// #define NDEBUG 1
|
||||
#if !UF_RTTI
|
||||
#define JSON_HAS_STATIC_RTTI 0
|
||||
#endif
|
||||
|
||||
#include <nlohmann/json.hpp>
|
||||
#include <nlohmann/fifo_map.hpp>
|
||||
|
||||
@ -4,6 +4,13 @@
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <vk_mem_alloc.h>
|
||||
|
||||
#if UF_ENV_LINUX
|
||||
#ifdef Success
|
||||
#undef Success
|
||||
#undef None
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <typeinfo>
|
||||
#include <iostream>
|
||||
#include <cassert>
|
||||
|
||||
@ -187,6 +187,7 @@ namespace ext {
|
||||
}
|
||||
|
||||
extern UF_API Device device;
|
||||
|
||||
extern UF_API Allocator allocator;
|
||||
extern UF_API Swapchain swapchain;
|
||||
extern UF_API std::mutex mutex;
|
||||
|
||||
38
engine/inc/uf/spec/context/linux.h
Normal file
38
engine/inc/uf/spec/context/linux.h
Normal file
@ -0,0 +1,38 @@
|
||||
#pragma once
|
||||
|
||||
#include "universal.h"
|
||||
|
||||
#if !UF_USE_OPENGL || UF_USE_OPENGL_GLDC
|
||||
#include "unknown.h"
|
||||
namespace spec {
|
||||
typedef spec::unknown::Context Context;
|
||||
}
|
||||
#else
|
||||
namespace spec {
|
||||
namespace x11 {
|
||||
class UF_API_VAR Context : public spec::uni::Context {
|
||||
public:
|
||||
typedef ::Display* dc_t;
|
||||
typedef ::GLXContext context_t;
|
||||
protected:
|
||||
dc_t m_display;
|
||||
context_t m_context;
|
||||
::Window m_window;
|
||||
public:
|
||||
UF_API_CALL Context( uni::Context* shared, const Context::Settings& settings = Settings() );
|
||||
UF_API_CALL Context( uni::Context* shared, const Context::Settings& settings, const Context::window_t& window );
|
||||
UF_API_CALL Context( uni::Context* shared, const Context::Settings& settings, unsigned int width, unsigned int height );
|
||||
~Context();
|
||||
|
||||
virtual void UF_API_CALL terminate();
|
||||
|
||||
virtual bool UF_API_CALL makeCurrent();
|
||||
virtual void UF_API_CALL setVerticalSyncEnabled(bool enabled);
|
||||
virtual void UF_API_CALL display();
|
||||
protected:
|
||||
virtual void UF_API_CALL create( uni::Context* shared );
|
||||
};
|
||||
}
|
||||
typedef spec::x11::Context Context;
|
||||
}
|
||||
#endif
|
||||
23
engine/inc/uf/spec/controller/linux.h
Normal file
23
engine/inc/uf/spec/controller/linux.h
Normal file
@ -0,0 +1,23 @@
|
||||
#pragma once
|
||||
|
||||
#include <uf/config.h>
|
||||
#include "universal.h"
|
||||
|
||||
#if UF_ENV_LINUX
|
||||
|
||||
namespace spec {
|
||||
namespace linux {
|
||||
namespace controller {
|
||||
void UF_API initialize();
|
||||
void UF_API tick();
|
||||
void UF_API terminate();
|
||||
|
||||
bool UF_API connected( size_t = 0 );
|
||||
// bool UF_API pressed( const uf::stl::string&, size_t = 0 );
|
||||
// float UF_API analog( const uf::stl::string&, size_t = 0 );
|
||||
}
|
||||
}
|
||||
namespace controller = linux::controller;
|
||||
}
|
||||
|
||||
#endif
|
||||
11
engine/inc/uf/spec/linux.h
Normal file
11
engine/inc/uf/spec/linux.h
Normal file
@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
#include <uf/config.h>
|
||||
// In the event some fool includes this file directly
|
||||
#include "universal.h"
|
||||
// Windows-specific stuffs
|
||||
#ifdef UF_ENV_LINUX
|
||||
|
||||
// Headers
|
||||
|
||||
#endif
|
||||
22
engine/inc/uf/spec/time/linux.h
Normal file
22
engine/inc/uf/spec/time/linux.h
Normal file
@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
#include <uf/config.h>
|
||||
#include "universal.h"
|
||||
|
||||
#if UF_ENV_LINUX
|
||||
|
||||
namespace spec {
|
||||
namespace linux {
|
||||
class UF_API Time : public spec::uni::Time {
|
||||
public:
|
||||
static Time::exp_t unit;
|
||||
spec::uni::Time& UF_API_CALL getUniversal();
|
||||
|
||||
spec::uni::Time::time_t UF_API_CALL getTime();
|
||||
};
|
||||
}
|
||||
typedef linux::Time Time;
|
||||
extern UF_API Time time;
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -6,5 +6,5 @@
|
||||
// include universal
|
||||
#include "universal.h"
|
||||
// defines which implementation to use
|
||||
#include UF_ENV_HEADER
|
||||
// #include UF_ENV_HEADER
|
||||
//
|
||||
|
||||
@ -4,16 +4,15 @@
|
||||
|
||||
namespace spec {
|
||||
namespace uni {
|
||||
class UF_API Time {
|
||||
public:
|
||||
namespace time {
|
||||
typedef long long time_t;
|
||||
typedef int exp_t;
|
||||
static Time::exp_t unit;
|
||||
protected:
|
||||
|
||||
public:
|
||||
spec::uni::Time::time_t UF_API_CALL unixTime();
|
||||
spec::uni::Time::time_t UF_API_CALL getTime();
|
||||
};
|
||||
};
|
||||
static constexpr exp_t unit = -6;
|
||||
|
||||
time_t UF_API unixTime();
|
||||
time_t UF_API getTime();
|
||||
}
|
||||
}
|
||||
|
||||
namespace time = uni::time;
|
||||
}
|
||||
94
engine/inc/uf/spec/window/linux.h
Normal file
94
engine/inc/uf/spec/window/linux.h
Normal file
@ -0,0 +1,94 @@
|
||||
#pragma once
|
||||
|
||||
#include <uf/config.h>
|
||||
#include "universal.h"
|
||||
|
||||
#if UF_ENV_LINUX
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
#include <X11/Xatom.h>
|
||||
#include <X11/XKBlib.h>
|
||||
|
||||
#if UF_USE_VULKAN
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <vulkan/vulkan_xlib.h>
|
||||
#elif UF_USE_OPENGL
|
||||
#include <GL/glx.h>
|
||||
#endif
|
||||
|
||||
namespace spec {
|
||||
namespace x11 {
|
||||
class UF_API Window : public spec::uni::Window {
|
||||
public:
|
||||
typedef ::Window handle_t;
|
||||
typedef void* context_t;
|
||||
|
||||
protected:
|
||||
Display* m_display;
|
||||
int m_screen;
|
||||
handle_t m_handle;
|
||||
GC m_gc;
|
||||
XIM m_xim;
|
||||
XIC m_xic;
|
||||
context_t* m_context;
|
||||
|
||||
vector_t m_lastSize;
|
||||
bool m_keyRepeatEnabled;
|
||||
bool m_resizing;
|
||||
bool m_mouseGrabbed;
|
||||
bool m_syncParse;
|
||||
bool m_asyncParse;
|
||||
|
||||
public:
|
||||
UF_API_CALL Window();
|
||||
UF_API_CALL Window( const vector_t& size, const title_t& title = L"Window" );
|
||||
~Window();
|
||||
|
||||
void UF_API_CALL create(const vector_t& size, const title_t& title = L"Window");
|
||||
void UF_API_CALL terminate();
|
||||
|
||||
handle_t UF_API_CALL getHandle() const;
|
||||
vector_t UF_API_CALL getPosition() const;
|
||||
vector_t UF_API_CALL getSize() const;
|
||||
size_t UF_API_CALL getRefreshRate() const;
|
||||
|
||||
void UF_API_CALL setPosition(const vector_t& position);
|
||||
void UF_API_CALL centerWindow();
|
||||
void UF_API_CALL setMousePosition(const vector_t& position);
|
||||
vector_t UF_API_CALL getMousePosition();
|
||||
void UF_API_CALL setSize(const vector_t& size);
|
||||
void UF_API_CALL setTitle(const title_t& title);
|
||||
void UF_API_CALL setIcon(const vector_t& size, uint8_t* pixels);
|
||||
void UF_API_CALL setVisible(bool visibility);
|
||||
void UF_API_CALL setCursorVisible(bool visibility);
|
||||
void UF_API_CALL setKeyRepeatEnabled(bool state);
|
||||
void UF_API_CALL setMouseGrabbed(bool state);
|
||||
|
||||
static bool UF_API_CALL isKeyPressed( const uf::stl::string& key );
|
||||
|
||||
void UF_API_CALL requestFocus();
|
||||
bool UF_API_CALL hasFocus() const;
|
||||
|
||||
void UF_API_CALL bufferInputs();
|
||||
void UF_API_CALL processEvents();
|
||||
bool UF_API_CALL pollEvents(bool block = false);
|
||||
void UF_API_CALL grabMouse(bool state);
|
||||
|
||||
static pod::Vector2ui UF_API_CALL getResolution();
|
||||
void UF_API_CALL toggleFullscreen(bool borderless = false);
|
||||
|
||||
#if UF_USE_VULKAN
|
||||
uf::stl::vector<uf::stl::string> UF_API_CALL getExtensions(bool validationEnabled);
|
||||
void UF_API_CALL createSurface(VkInstance instance, VkSurfaceKHR& surface);
|
||||
#endif
|
||||
|
||||
void display();
|
||||
};
|
||||
}
|
||||
typedef spec::x11::Window Window;
|
||||
}
|
||||
|
||||
namespace uf {
|
||||
using Window = spec::x11::Window;
|
||||
}
|
||||
#endif
|
||||
@ -8,3 +8,4 @@
|
||||
// defines which implementation to use
|
||||
#include UF_ENV_HEADER
|
||||
//
|
||||
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#if UF_USE_FMT
|
||||
#if UF_ENV_DREAMCAST
|
||||
#if UF_ENV_DREAMCAST || UF_ENV_LINUX
|
||||
#define FMT_HEADER_ONLY
|
||||
#endif
|
||||
#include <fmt/core.h>
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
#include <uf/config.h>
|
||||
#include <uf/utils/math/transform.h>
|
||||
#include <uf/utils/time/time.h>
|
||||
#include <uf/engine/object/object.h>
|
||||
|
||||
#if UF_USE_BULLET
|
||||
#include <uf/ext/bullet/bullet.h>
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
// #include <limits>
|
||||
// #include <functional>
|
||||
|
||||
#define UF_MEMORYPOOL_USE_STL_ALLOCATOR 0
|
||||
#define UF_MEMORYPOOL_USE_STL_ALLOCATOR 1
|
||||
|
||||
namespace uf {
|
||||
namespace allocator {
|
||||
|
||||
@ -16,7 +16,7 @@ namespace uf {
|
||||
typedef uf::stl::string output_t;
|
||||
typedef uf::stl::string input_t;
|
||||
|
||||
Serializer();
|
||||
Serializer() = default;
|
||||
Serializer( const uf::stl::string& str );
|
||||
Serializer( const ext::json::base_value& );
|
||||
Serializer( const ext::json::Value& );
|
||||
|
||||
@ -5,11 +5,11 @@
|
||||
#include <cmath>
|
||||
|
||||
namespace uf {
|
||||
template<typename T = spec::Time::time_t>
|
||||
template<typename T = spec::time::time_t>
|
||||
class /*UF_API*/ Time {
|
||||
public:
|
||||
typedef T time_t;
|
||||
typedef spec::Time::exp_t exp_t;
|
||||
typedef spec::time::exp_t exp_t;
|
||||
protected:
|
||||
uf::Time<T>::time_t m_time;
|
||||
uf::Time<T>::exp_t m_exp;
|
||||
@ -19,7 +19,7 @@ namespace uf {
|
||||
static const uf::Time<T>::exp_t microseconds = -6;
|
||||
static const uf::Time<T>::exp_t nanoseconds = -9;
|
||||
|
||||
Time(uf::Time<T>::time_t t = 0, uf::Time<T>::exp_t b = spec::Time::unit );
|
||||
Time(uf::Time<T>::time_t t = 0, uf::Time<T>::exp_t b = spec::time::unit );
|
||||
|
||||
void set(uf::Time<T>::time_t t);
|
||||
void set(uf::Time<T>::time_t t, uf::Time<T>::exp_t b);
|
||||
@ -31,7 +31,7 @@ namespace uf {
|
||||
uf::Time<T>::time_t get() const;
|
||||
uf::Time<T>::exp_t getBase() const;
|
||||
|
||||
uf::Time<T>::time_t asBase(uf::Time<T>::exp_t base = spec::Time::unit );
|
||||
uf::Time<T>::time_t asBase(uf::Time<T>::exp_t base = spec::time::unit );
|
||||
inline uf::Time<T>::time_t asSeconds();
|
||||
inline uf::Time<T>::time_t asMilliseconds();
|
||||
inline uf::Time<T>::time_t asMicroseconds();
|
||||
@ -55,17 +55,17 @@ namespace uf {
|
||||
uf::Time<T> operator-( const uf::Time<T>& t );
|
||||
uf::Time<T> operator+( const uf::Time<T>& t );
|
||||
};
|
||||
template<typename T = spec::Time::time_t>
|
||||
template<typename T = spec::time::time_t>
|
||||
class /*UF_API*/ Timer {
|
||||
public:
|
||||
typedef T time_t;
|
||||
typedef spec::Time::exp_t exp_t;
|
||||
typedef spec::time::exp_t exp_t;
|
||||
protected:
|
||||
bool m_running;
|
||||
uf::Time<T> m_begin;
|
||||
uf::Time<T> m_end;
|
||||
public:
|
||||
Timer(bool running = true, uf::Timer<T>::exp_t b = spec::Time::unit);
|
||||
Timer(bool running = true, uf::Timer<T>::exp_t b = spec::time::unit);
|
||||
|
||||
void start( uf::Time<T> = 0 );
|
||||
void stop();
|
||||
|
||||
@ -20,12 +20,12 @@ void uf::Timer<T>::stop() {
|
||||
}
|
||||
template <typename T>
|
||||
void uf::Timer<T>::reset() {
|
||||
this->m_end = this->m_begin = spec::time.getTime();
|
||||
this->m_end = this->m_begin = spec::time::getTime();
|
||||
}
|
||||
template <typename T>
|
||||
void uf::Timer<T>::update() {
|
||||
if ( !this->m_running ) return;
|
||||
this->m_end = spec::time.getTime();
|
||||
this->m_end = spec::time::getTime();
|
||||
}
|
||||
template <typename T>
|
||||
bool uf::Timer<T>::running() const {
|
||||
|
||||
@ -48,6 +48,7 @@
|
||||
|
||||
bool uf::ready = false;
|
||||
uf::stl::vector<uf::stl::string> uf::arguments;
|
||||
|
||||
uf::Serializer uf::config;
|
||||
|
||||
namespace {
|
||||
@ -56,7 +57,7 @@ namespace {
|
||||
std::ofstream output;
|
||||
|
||||
struct {
|
||||
uf::stl::string output = uf::io::root+"/logs/output.txt";
|
||||
uf::stl::string output;
|
||||
} filenames;
|
||||
} io;
|
||||
|
||||
@ -70,8 +71,6 @@ namespace {
|
||||
} total;
|
||||
} times;
|
||||
|
||||
auto& json = uf::config;
|
||||
|
||||
struct {
|
||||
struct {
|
||||
struct {
|
||||
@ -112,23 +111,23 @@ void UF_API uf::load() {
|
||||
uf::config.readFromFile(uf::io::root+"config.json");
|
||||
}
|
||||
void UF_API uf::load( ext::json::Value& json ) {
|
||||
::config.engine.gc.enabled = json["engine"]["debug"]["garbage collection"]["enabled"].as(::config.engine.gc.enabled);
|
||||
::config.engine.gc.every = json["engine"]["debug"]["garbage collection"]["every"].as(::config.engine.gc.every);
|
||||
::config.engine.gc.mode = json["engine"]["debug"]["garbage collection"]["mode"].as(::config.engine.gc.mode);
|
||||
::config.engine.gc.announce = json["engine"]["debug"]["garbage collection"]["announce"].as(::config.engine.gc.announce);
|
||||
/*global*/::config.engine.gc.enabled = json["engine"]["debug"]["garbage collection"]["enabled"].as(/*global*/::config.engine.gc.enabled);
|
||||
/*global*/::config.engine.gc.every = json["engine"]["debug"]["garbage collection"]["every"].as(/*global*/::config.engine.gc.every);
|
||||
/*global*/::config.engine.gc.mode = json["engine"]["debug"]["garbage collection"]["mode"].as(/*global*/::config.engine.gc.mode);
|
||||
/*global*/::config.engine.gc.announce = json["engine"]["debug"]["garbage collection"]["announce"].as(/*global*/::config.engine.gc.announce);
|
||||
|
||||
::config.engine.ext.ultralight.enabled = json["engine"]["ext"]["ultralight"]["enabled"].as(::config.engine.ext.ultralight.enabled);
|
||||
::config.engine.ext.discord.enabled = json["engine"]["ext"]["discord"]["enabled"].as(::config.engine.ext.discord.enabled);
|
||||
::config.engine.ext.imgui.enabled = json["engine"]["ext"]["imgui"]["enabled"].as(::config.engine.ext.imgui.enabled);
|
||||
/*global*/::config.engine.ext.ultralight.enabled = json["engine"]["ext"]["ultralight"]["enabled"].as(/*global*/::config.engine.ext.ultralight.enabled);
|
||||
/*global*/::config.engine.ext.discord.enabled = json["engine"]["ext"]["discord"]["enabled"].as(/*global*/::config.engine.ext.discord.enabled);
|
||||
/*global*/::config.engine.ext.imgui.enabled = json["engine"]["ext"]["imgui"]["enabled"].as(/*global*/::config.engine.ext.imgui.enabled);
|
||||
|
||||
::config.engine.ext.vall_e.enabled = json["engine"]["ext"]["vall_e"]["enabled"].as(::config.engine.ext.vall_e.enabled);
|
||||
::config.engine.ext.vall_e.model_path = json["engine"]["ext"]["vall_e"]["model_path"].as(::config.engine.ext.vall_e.model_path);
|
||||
::config.engine.ext.vall_e.encodec_path = json["engine"]["ext"]["vall_e"]["encodec_path"].as(::config.engine.ext.vall_e.encodec_path);
|
||||
/*global*/::config.engine.ext.vall_e.enabled = json["engine"]["ext"]["vall_e"]["enabled"].as(/*global*/::config.engine.ext.vall_e.enabled);
|
||||
/*global*/::config.engine.ext.vall_e.model_path = json["engine"]["ext"]["vall_e"]["model_path"].as(/*global*/::config.engine.ext.vall_e.model_path);
|
||||
/*global*/::config.engine.ext.vall_e.encodec_path = json["engine"]["ext"]["vall_e"]["encodec_path"].as(/*global*/::config.engine.ext.vall_e.encodec_path);
|
||||
|
||||
::config.engine.limiter.print = json["engine"]["debug"]["framerate"]["print"].as(::config.engine.limiter.print);
|
||||
/*global*/::config.engine.limiter.print = json["engine"]["debug"]["framerate"]["print"].as(/*global*/::config.engine.limiter.print);
|
||||
|
||||
::config.engine.fps.print = json["engine"]["debug"]["framerate"]["print"].as(::config.engine.fps.print);
|
||||
::config.engine.fps.every = json["engine"]["debug"]["framerate"]["every"].as(::config.engine.fps.every);
|
||||
/*global*/::config.engine.fps.print = json["engine"]["debug"]["framerate"]["print"].as(/*global*/::config.engine.fps.print);
|
||||
/*global*/::config.engine.fps.every = json["engine"]["debug"]["framerate"]["every"].as(/*global*/::config.engine.fps.every);
|
||||
|
||||
uf::Mesh::defaultInterleaved = json["engine"]["scenes"]["meshes"]["interleaved"].as( uf::Mesh::defaultInterleaved );
|
||||
|
||||
@ -161,8 +160,8 @@ void UF_API uf::load( ext::json::Value& json ) {
|
||||
|
||||
/* Frame limiter */ {
|
||||
size_t limit = configEngineLimitersJson["framerate"].as<size_t>();
|
||||
::times.limiter = limit != 0 ? 1.0 / limit : 0;
|
||||
UF_MSG_DEBUG("Limiter set to {} ms", ::times.limiter);
|
||||
/*global*/::times.limiter = limit != 0 ? 1.0 / limit : 0;
|
||||
UF_MSG_DEBUG("Limiter set to {} ms", /*global*/::times.limiter);
|
||||
}
|
||||
/* Max delta time */{
|
||||
size_t limit = configEngineLimitersJson["deltaTime"].as<size_t>();
|
||||
@ -265,14 +264,14 @@ void UF_API uf::load( ext::json::Value& json ) {
|
||||
uf::renderer::settings::defaultDeferBufferDestroy = configRenderInvariantJson["default defer buffer destroy"].as( uf::renderer::settings::defaultDeferBufferDestroy );
|
||||
#if 1
|
||||
uf::renderer::settings::defaultCommandBufferImmediate = true;
|
||||
::requestDeferredCommandBufferSubmit = !configRenderInvariantJson["default command buffer immediate"].as( uf::renderer::settings::defaultCommandBufferImmediate );
|
||||
/*global*/::requestDeferredCommandBufferSubmit = !configRenderInvariantJson["default command buffer immediate"].as( uf::renderer::settings::defaultCommandBufferImmediate );
|
||||
#else
|
||||
uf::renderer::settings::defaultCommandBufferImmediate = configRenderInvariantJson["default command buffer immediate"].as( uf::renderer::settings::defaultCommandBufferImmediate );
|
||||
#endif
|
||||
#endif
|
||||
#if 1
|
||||
uf::renderer::settings::experimental::dedicatedThread = false;
|
||||
::requestDedicatedRenderThread = configRenderExperimentalJson["dedicated thread"].as( uf::renderer::settings::experimental::dedicatedThread );
|
||||
/*global*/::requestDedicatedRenderThread = configRenderExperimentalJson["dedicated thread"].as( uf::renderer::settings::experimental::dedicatedThread );
|
||||
#else
|
||||
uf::renderer::settings::experimental::dedicatedThread = configRenderExperimentalJson["dedicated thread"].as( uf::renderer::settings::experimental::dedicatedThread );
|
||||
#endif
|
||||
@ -303,7 +302,7 @@ void UF_API uf::load( ext::json::Value& json ) {
|
||||
UF_MSG_DEBUG("Using FFX FSR Preset: {} ({:.3f}% render scale)", mode, (100.0f / renderMode.scale));
|
||||
} else
|
||||
#endif
|
||||
renderMode.scale = ::json["engine"]["ext"]["vulkan"]["framebuffer"]["size"].as(1.0f);
|
||||
renderMode.scale = uf::config["engine"]["ext"]["vulkan"]["framebuffer"]["size"].as(1.0f);
|
||||
UF_MSG_DEBUG("Geometry render scale: {:.3f}", renderMode.scale);
|
||||
}
|
||||
}
|
||||
@ -316,15 +315,15 @@ void UF_API uf::initialize() {
|
||||
uf::thread::get(uf::thread::asyncThreadName);
|
||||
}
|
||||
/* set JSON implicit preferences */ {
|
||||
ext::json::PREFERRED_ENCODING = ::json["engine"]["ext"]["json"]["encoding"].as(ext::json::PREFERRED_ENCODING);
|
||||
ext::json::PREFERRED_COMPRESSION = ::json["engine"]["ext"]["json"]["compression"].as(ext::json::PREFERRED_COMPRESSION);
|
||||
ext::json::PREFERRED_ENCODING = uf::config["engine"]["ext"]["json"]["encoding"].as(ext::json::PREFERRED_ENCODING);
|
||||
ext::json::PREFERRED_COMPRESSION = uf::config["engine"]["ext"]["json"]["compression"].as(ext::json::PREFERRED_COMPRESSION);
|
||||
|
||||
UF_MSG_DEBUG("Setting JSON implicit preference: {}.{}", ext::json::PREFERRED_ENCODING, ext::json::PREFERRED_COMPRESSION);
|
||||
}
|
||||
|
||||
/* Arguments */ {
|
||||
bool modified = false;
|
||||
auto& arguments = ::json["arguments"];
|
||||
auto& arguments = uf::config["arguments"];
|
||||
for ( auto& arg : uf::arguments ) {
|
||||
// store raw argument
|
||||
int i = arguments.size();
|
||||
@ -335,7 +334,7 @@ void UF_API uf::initialize() {
|
||||
uf::stl::string keyString = match[1];
|
||||
uf::stl::string valueString = match[2];
|
||||
uf::Serializer value; value.deserialize(valueString);
|
||||
::json.path(keyString) = value;
|
||||
uf::config.path(keyString) = value;
|
||||
modified = true;
|
||||
}
|
||||
/*
|
||||
@ -346,30 +345,31 @@ void UF_API uf::initialize() {
|
||||
uf::stl::string keyString = match[1].str();
|
||||
uf::stl::string valueString = match[2].str();
|
||||
uf::Serializer value; value.deserialize(valueString);
|
||||
::json.path(keyString) = value;
|
||||
uf::config.path(keyString) = value;
|
||||
modified = true;
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
// UF_MSG_DEBUG("Arguments: {}", uf::Serializer(arguments));
|
||||
if ( modified ) UF_MSG_DEBUG("New config: {}", ::json.serialize());
|
||||
if ( modified ) UF_MSG_DEBUG("New config: {}", uf::config.serialize());
|
||||
}
|
||||
/* Seed */ {
|
||||
std::srand(std::time(NULL));
|
||||
}
|
||||
/* Open output file */ {
|
||||
::io.output.open(::io.filenames.output);
|
||||
/*global*/::io.filenames.output = uf::io::root+"/logs/output.txt";
|
||||
/*global*/::io.output.open(/*global*/::io.filenames.output);
|
||||
}
|
||||
/* Initialize timers */ {
|
||||
times.sys.start();
|
||||
/*global*/::times.sys.start();
|
||||
}
|
||||
/* Read persistent data */ {
|
||||
// #include "./inits/persistence.inl"
|
||||
}
|
||||
|
||||
/* Set memory pool sizes */ {
|
||||
auto& configMemoryPoolJson = ::json["engine"]["memory pool"];
|
||||
auto& configMemoryPoolJson = uf::config["engine"]["memory pool"];
|
||||
|
||||
// check if we are even allowed to use memory pools
|
||||
bool enabled = configMemoryPoolJson["enabled"].as(true);
|
||||
@ -427,19 +427,19 @@ void UF_API uf::initialize() {
|
||||
uf::Scene& scene = uf::instantiator::instantiate<uf::Scene>(); //new uf::Scene;
|
||||
uf::scene::scenes.emplace_back(&scene);
|
||||
auto& metadata = scene.getComponent<uf::Serializer>();
|
||||
// metadata["system"]["config"] = ::json;
|
||||
// metadata["system"]["config"] = uf::config;
|
||||
}
|
||||
|
||||
uf::load( ::json );
|
||||
uf::load( uf::config );
|
||||
|
||||
// renderer settings
|
||||
{
|
||||
#if UF_USE_VULKAN
|
||||
auto& configRenderJson = ::json["engine"]["ext"]["vulkan"];
|
||||
auto& configRenderJson = uf::config["engine"]["ext"]["vulkan"];
|
||||
#elif UF_USE_OPENGL
|
||||
auto& configRenderJson = ::json["engine"]["ext"]["opengl"];
|
||||
auto& configRenderJson = uf::config["engine"]["ext"]["opengl"];
|
||||
#else
|
||||
auto& configRenderJson = ::json["engine"]["ext"]["software"];
|
||||
auto& configRenderJson = uf::config["engine"]["ext"]["software"];
|
||||
#endif
|
||||
auto& configRenderInvariantJson = configRenderJson["invariant"];
|
||||
auto& configRenderExperimentalJson = configRenderJson["experimental"];
|
||||
@ -529,7 +529,7 @@ void UF_API uf::initialize() {
|
||||
if ( uf::renderer::settings::pipelines::rt ) {
|
||||
// uf::renderer::settings::pipelines::vxgi = false;
|
||||
// uf::renderer::settings::pipelines::culling = false;
|
||||
::json["engine"]["scenes"]["lights"]["shadows"]["enabled"] = false;
|
||||
uf::config["engine"]["scenes"]["lights"]["shadows"]["enabled"] = false;
|
||||
}
|
||||
#define JSON_TO_FORMAT( key ) if ( configRenderJson["formats"][#key].is<uf::stl::string>() ) {\
|
||||
uf::stl::string format = configRenderJson["formats"][#key].as<uf::stl::string>();\
|
||||
@ -548,7 +548,9 @@ void UF_API uf::initialize() {
|
||||
|
||||
#if UF_USE_LUA
|
||||
/* Lua */ {
|
||||
auto& configLuaJson = ::json["engine"]["ext"]["lua"];
|
||||
auto& configLuaJson = uf::config["engine"]["ext"]["lua"];
|
||||
|
||||
ext::lua::main = uf::io::root + "/scripts/main.lua";
|
||||
|
||||
ext::lua::enabled = configLuaJson["enabled"].as(ext::lua::enabled);
|
||||
ext::lua::main = configLuaJson["main"].as(ext::lua::main);
|
||||
@ -565,7 +567,7 @@ void UF_API uf::initialize() {
|
||||
|
||||
#if UF_USE_OPENVR
|
||||
{
|
||||
auto& configVrJson = ::json["engine"]["ext"]["vr"];
|
||||
auto& configVrJson = uf::config["engine"]["ext"]["vr"];
|
||||
|
||||
ext::openvr::enabled = configVrJson["enable"].as( ext::openvr::enabled );
|
||||
ext::openvr::swapEyes = configVrJson["swap eyes"].as( ext::openvr::swapEyes );
|
||||
@ -578,7 +580,7 @@ void UF_API uf::initialize() {
|
||||
|
||||
ext::openvr::driver.manifest = configVrJson["manifest"].as(ext::openvr::driver.manifest);
|
||||
|
||||
if ( ext::openvr::enabled ) ::json["engine"]["render modes"]["stereo deferred"] = true;
|
||||
if ( ext::openvr::enabled ) uf::config["engine"]["render modes"]["stereo deferred"] = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -586,11 +588,11 @@ void UF_API uf::initialize() {
|
||||
// to-do: have this set per config value instead of relying on the scene to handle its own rendermodes
|
||||
if ( false ) {
|
||||
// setup render mode
|
||||
if ( ::json["engine"]["render modes"]["deferred"].as<bool>(true) ) {
|
||||
if ( uf::config["engine"]["render modes"]["deferred"].as<bool>(true) ) {
|
||||
auto* renderMode = new uf::renderer::DeferredRenderMode;
|
||||
|
||||
if ( ::json["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"].is<uf::stl::string>() )
|
||||
renderMode->metadata.json["postProcess"] = ::json["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"];
|
||||
if ( uf::config["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"].is<uf::stl::string>() )
|
||||
renderMode->metadata.json["postProcess"] = uf::config["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"];
|
||||
|
||||
renderMode->blitter.descriptor.renderMode = "Swapchain";
|
||||
renderMode->blitter.descriptor.subpass = 0;
|
||||
@ -609,10 +611,10 @@ void UF_API uf::initialize() {
|
||||
UF_MSG_DEBUG("Using FFX FSR Preset: {} ({:.3f}% render scale)", mode, (100.0f / renderMode->scale));
|
||||
} else
|
||||
#endif
|
||||
renderMode->scale = ::json["engine"]["ext"]["vulkan"]["framebuffer"]["size"].as(1.0f);
|
||||
renderMode->scale = uf::config["engine"]["ext"]["vulkan"]["framebuffer"]["size"].as(1.0f);
|
||||
UF_MSG_DEBUG("Geometry render scale: {:.3f}", renderMode->scale);
|
||||
|
||||
if ( ::json["engine"]["render modes"]["stereo deferred"].as<bool>() ) {
|
||||
if ( uf::config["engine"]["render modes"]["stereo deferred"].as<bool>() ) {
|
||||
renderMode->metadata.eyes = 2;
|
||||
}
|
||||
#if UF_USE_VULKAN
|
||||
@ -630,10 +632,10 @@ void UF_API uf::initialize() {
|
||||
uf::renderer::addRenderMode( renderMode, "" );
|
||||
}
|
||||
|
||||
if ( ::json["engine"]["render modes"]["gui"].as<bool>(true) ) {
|
||||
if ( uf::config["engine"]["render modes"]["gui"].as<bool>(true) ) {
|
||||
auto* renderMode = new uf::renderer::RenderTargetRenderMode;
|
||||
if ( ::json["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"].is<uf::stl::string>() )
|
||||
renderMode->metadata.json["postProcess"] = ::json["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"];
|
||||
if ( uf::config["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"].is<uf::stl::string>() )
|
||||
renderMode->metadata.json["postProcess"] = uf::config["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"];
|
||||
|
||||
uf::stl::string name = "Gui";
|
||||
renderMode->blitter.descriptor.renderMode = "Swapchain";
|
||||
@ -657,8 +659,8 @@ void UF_API uf::initialize() {
|
||||
|
||||
UF_MSG_DEBUG("Recommended VR Resolution: {}, {}", renderMode.width, renderMode.height);
|
||||
|
||||
if ( ::json["engine"]["ext"]["vr"]["scale"].is<float>() ) {
|
||||
float scale = ::json["engine"]["ext"]["vr"]["scale"].as<float>();
|
||||
if ( uf::config["engine"]["ext"]["vr"]["scale"].is<float>() ) {
|
||||
float scale = uf::config["engine"]["ext"]["vr"]["scale"].as<float>();
|
||||
renderMode.width *= scale;
|
||||
renderMode.height *= scale;
|
||||
|
||||
@ -668,7 +670,7 @@ void UF_API uf::initialize() {
|
||||
#endif
|
||||
|
||||
#if UF_USE_OPENAL
|
||||
/* Initialize OpenAL */ {
|
||||
/* Initialize OpenAL */ if ( !uf::audio::muted ) {
|
||||
ext::al::initialize();
|
||||
}
|
||||
#endif
|
||||
@ -679,23 +681,23 @@ void UF_API uf::initialize() {
|
||||
|
||||
pod::Thread& threadMain = uf::thread::get(uf::thread::mainThreadName);
|
||||
#if UF_USE_DISCORD
|
||||
/* Discord */ if ( ::config.engine.ext.discord.enabled ) {
|
||||
/* Discord */ if ( /*global*/::config.engine.ext.discord.enabled ) {
|
||||
ext::discord::initialize();
|
||||
}
|
||||
#endif
|
||||
#if UF_USE_ULTRALIGHT
|
||||
/* Ultralight-UX */ if ( ::config.engine.ext.ultralight.enabled ) {
|
||||
/* Ultralight-UX */ if ( /*global*/::config.engine.ext.ultralight.enabled ) {
|
||||
ext::ultralight::initialize();
|
||||
}
|
||||
#endif
|
||||
#if UF_USE_IMGUI
|
||||
if ( ::config.engine.ext.imgui.enabled ) {
|
||||
if ( /*global*/::config.engine.ext.imgui.enabled ) {
|
||||
// ext::imgui::initialize();
|
||||
}
|
||||
#endif
|
||||
#if UF_USE_VALL_E
|
||||
if ( ::config.engine.ext.vall_e.enabled ) {
|
||||
ext::vall_e::initialize( ::config.engine.ext.vall_e.model_path, ::config.engine.ext.vall_e.encodec_path );
|
||||
if ( /*global*/::config.engine.ext.vall_e.enabled ) {
|
||||
ext::vall_e::initialize( /*global*/::config.engine.ext.vall_e.model_path, /*global*/::config.engine.ext.vall_e.encodec_path );
|
||||
|
||||
// bind the hook
|
||||
uf::hooks.addHook( "llm:VALL-E.synthesize", [&](ext::json::Value& json){
|
||||
@ -720,8 +722,8 @@ void UF_API uf::initialize() {
|
||||
#endif
|
||||
/* Add hooks */ {
|
||||
uf::hooks.addHook( "game:Scene.Load", [&](ext::json::Value& json){
|
||||
::sceneTransition.payload = json;
|
||||
::sceneTransition.phase = 0;
|
||||
/*global*/::sceneTransition.payload = json;
|
||||
/*global*/::sceneTransition.phase = 0;
|
||||
});
|
||||
uf::hooks.addHook( "system:Quit", [&](ext::json::Value& json){
|
||||
if ( json["message"].is<uf::stl::string>() ) {
|
||||
@ -733,11 +735,11 @@ void UF_API uf::initialize() {
|
||||
|
||||
/* Initialize root scene*/ {
|
||||
ext::json::Value payload;
|
||||
payload["scene"] = ::json["engine"]["scenes"]["start"];
|
||||
::sceneTransition.payload = payload;
|
||||
::sceneTransition.phase = 0;
|
||||
payload["scene"] = uf::config["engine"]["scenes"]["start"];
|
||||
/*global*/::sceneTransition.payload = payload;
|
||||
/*global*/::sceneTransition.phase = 0;
|
||||
|
||||
// auto& scene = uf::scene::loadScene( ::json["engine"]["scenes"]["start"] );
|
||||
// auto& scene = uf::scene::loadScene( uf::config["engine"]["scenes"]["start"] );
|
||||
}
|
||||
|
||||
/*
|
||||
@ -747,14 +749,14 @@ void UF_API uf::initialize() {
|
||||
*/
|
||||
|
||||
uf::ready = true;
|
||||
UF_MSG_INFO("EXT took {} seconds to initialize", times.sys.elapsed().asDouble());
|
||||
UF_MSG_INFO("EXT took {} seconds to initialize", /*global*/::times.sys.elapsed().asDouble());
|
||||
}
|
||||
|
||||
void UF_API uf::tick() {
|
||||
#if 1
|
||||
if ( ::sceneTransition.phase >= 0 ) {
|
||||
auto target = ::sceneTransition.payload["scene"].as<uf::stl::string>();
|
||||
auto& phase = ::sceneTransition.phase;
|
||||
if ( /*global*/::sceneTransition.phase >= 0 ) {
|
||||
auto target = /*global*/::sceneTransition.payload["scene"].as<uf::stl::string>();
|
||||
auto& phase = /*global*/::sceneTransition.phase;
|
||||
|
||||
++phase;
|
||||
|
||||
@ -764,12 +766,12 @@ void UF_API uf::tick() {
|
||||
uf::renderer::synchronize();
|
||||
|
||||
if ( uf::renderer::settings::experimental::dedicatedThread ) {
|
||||
::requestDedicatedRenderThread = true;
|
||||
/*global*/::requestDedicatedRenderThread = true;
|
||||
uf::renderer::settings::experimental::dedicatedThread = !uf::renderer::settings::experimental::dedicatedThread;
|
||||
}
|
||||
#if UF_USE_VULKAN
|
||||
if ( !uf::renderer::settings::defaultCommandBufferImmediate ) {
|
||||
::requestDeferredCommandBufferSubmit = true;
|
||||
/*global*/::requestDeferredCommandBufferSubmit = true;
|
||||
uf::renderer::settings::defaultCommandBufferImmediate = !uf::renderer::settings::defaultCommandBufferImmediate;
|
||||
}
|
||||
#endif
|
||||
@ -777,7 +779,7 @@ void UF_API uf::tick() {
|
||||
uf::scene::unloadScene();
|
||||
uf::scene::loadScene( target );
|
||||
|
||||
::sceneTransition.phase = -1;
|
||||
/*global*/::sceneTransition.phase = -1;
|
||||
|
||||
#if UF_USE_VULKAN
|
||||
uf::renderer::flushCommandBuffers();
|
||||
@ -801,7 +803,6 @@ void UF_API uf::tick() {
|
||||
#endif
|
||||
/* Print Memory Pool Information */ {
|
||||
TIMER(1, uf::inputs::kbm::states::P ) {
|
||||
// uf::iostream << uf::renderer::allocatorStats() << "\n";
|
||||
UF_MSG_DEBUG("==== Memory Pool Information ====");
|
||||
if ( uf::memoryPool::global.size() > 0 ) UF_MSG_DEBUG("Global Memory Pool: {}", uf::memoryPool::global.stats());
|
||||
if ( uf::Entity::memoryPool.size() > 0 ) UF_MSG_DEBUG("Entity Memory Pool: {}", uf::Entity::memoryPool.stats());
|
||||
@ -855,7 +856,7 @@ void UF_API uf::tick() {
|
||||
uf::thread::process( uf::thread::get(uf::thread::mainThreadName) );
|
||||
}
|
||||
#if UF_USE_ULTRALIGHT
|
||||
/* Ultralight-UX */ if ( ::config.engine.ext.ultralight.enabled ) {
|
||||
/* Ultralight-UX */ if ( /*global*/::config.engine.ext.ultralight.enabled ) {
|
||||
ext::ultralight::tick();
|
||||
}
|
||||
#endif
|
||||
@ -864,24 +865,24 @@ void UF_API uf::tick() {
|
||||
}
|
||||
|
||||
#if UF_USE_DISCORD
|
||||
/* Discord */ if ( ::config.engine.ext.discord.enabled ) {
|
||||
/* Discord */ if ( /*global*/::config.engine.ext.discord.enabled ) {
|
||||
ext::discord::tick();
|
||||
}
|
||||
#endif
|
||||
#if UF_USE_IMGUI
|
||||
if ( ::config.engine.ext.imgui.enabled ) {
|
||||
if ( /*global*/::config.engine.ext.imgui.enabled ) {
|
||||
ext::imgui::tick();
|
||||
}
|
||||
#endif
|
||||
/* FPS Print */ if ( ::config.engine.fps.print ) {
|
||||
++::times.frames;
|
||||
++::times.total.frames;
|
||||
TIMER( ::config.engine.fps.every ) {
|
||||
UF_MSG_DEBUG("System: {:.3f} ms/frame | Time: {:.3f} | Frames: {} | FPS: {:.3f}", (time * 1000.0/::times.frames), time, ::times.frames, ::times.frames / time);
|
||||
/* FPS Print */ if ( /*global*/::config.engine.fps.print ) {
|
||||
++/*global*/::times.frames;
|
||||
++/*global*/::times.total.frames;
|
||||
TIMER( /*global*/::config.engine.fps.every ) {
|
||||
UF_MSG_DEBUG("System: {:.3f} ms/frame | Time: {:.3f} | Frames: {} | FPS: {:.3f}", (time * 1000.0 / /*global*/::times.frames), time, /*global*/::times.frames, /*global*/::times.frames / time);
|
||||
#if UF_ENV_DREAMCAST
|
||||
DC_STATS();
|
||||
#endif
|
||||
::times.frames = 0;
|
||||
/*global*/::times.frames = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -889,17 +890,17 @@ void UF_API uf::tick() {
|
||||
|
||||
// to-do: handle when the memory pool is disabled, because entities are NOT cleaned up at all
|
||||
// should also handle entity deletion when GC is disabled
|
||||
if ( ::config.engine.gc.enabled ) {
|
||||
TIMER( ::config.engine.gc.every ) {
|
||||
size_t collected = uf::instantiator::collect( ::config.engine.gc.mode );
|
||||
if ( /*global*/::config.engine.gc.enabled ) {
|
||||
TIMER( /*global*/::config.engine.gc.every ) {
|
||||
size_t collected = uf::instantiator::collect( /*global*/::config.engine.gc.mode );
|
||||
if ( collected > 0 ) {
|
||||
if ( ::config.engine.gc.announce ) UF_MSG_DEBUG("GC collected {} unused entities", (int) collected);
|
||||
if ( /*global*/::config.engine.gc.announce ) UF_MSG_DEBUG("GC collected {} unused entities", (int) collected);
|
||||
}
|
||||
}
|
||||
}
|
||||
#if !UF_ENV_DREAMCAST
|
||||
if ( ::times.limiter > 0 ) {
|
||||
double limiter = ::times.limiter * 1000.0;
|
||||
if ( /*global*/::times.limiter > 0 ) {
|
||||
double limiter = /*global*/::times.limiter * 1000.0;
|
||||
|
||||
static uf::Timer<long long> timer(false);
|
||||
if ( !timer.running() ) timer.start();
|
||||
@ -913,14 +914,14 @@ void UF_API uf::tick() {
|
||||
}
|
||||
|
||||
|
||||
if ( ::requestDedicatedRenderThread && controller.getName() == "Player" ) {
|
||||
::requestDedicatedRenderThread = false;
|
||||
if ( /*global*/::requestDedicatedRenderThread && controller.getName() == "Player" ) {
|
||||
/*global*/::requestDedicatedRenderThread = false;
|
||||
uf::renderer::settings::experimental::dedicatedThread = true;
|
||||
UF_MSG_DEBUG("Dedicated render requested");
|
||||
}
|
||||
#if UF_USE_VULKAN
|
||||
if ( ::requestDeferredCommandBufferSubmit && controller.getName() == "Player" ) {
|
||||
::requestDeferredCommandBufferSubmit = false;
|
||||
if ( /*global*/::requestDeferredCommandBufferSubmit && controller.getName() == "Player" ) {
|
||||
/*global*/::requestDeferredCommandBufferSubmit = false;
|
||||
uf::renderer::settings::defaultCommandBufferImmediate = false;
|
||||
UF_MSG_DEBUG("Defer command buffer submit requested");
|
||||
}
|
||||
@ -930,12 +931,12 @@ void UF_API uf::tick() {
|
||||
void UF_API uf::render() {
|
||||
if ( uf::scene::scenes.empty() ) return;
|
||||
|
||||
if ( ::sceneTransition.phase >= 0 ) {
|
||||
if ( /*global*/::sceneTransition.phase >= 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
#if UF_USE_ULTRALIGHT
|
||||
/* Ultralight-UX */ if ( ::config.engine.ext.ultralight.enabled ) {
|
||||
/* Ultralight-UX */ if ( /*global*/::config.engine.ext.ultralight.enabled ) {
|
||||
ext::ultralight::render();
|
||||
}
|
||||
#endif
|
||||
@ -963,17 +964,17 @@ void UF_API uf::terminate() {
|
||||
spec::controller::terminate();
|
||||
}
|
||||
#if UF_USE_VALL_E
|
||||
if ( ::config.engine.ext.vall_e.enabled ) {
|
||||
if ( /*global*/::config.engine.ext.vall_e.enabled ) {
|
||||
ext::vall_e::terminate();
|
||||
}
|
||||
#endif
|
||||
#if UF_USE_IMGUI
|
||||
if ( ::config.engine.ext.imgui.enabled ) {
|
||||
if ( /*global*/::config.engine.ext.imgui.enabled ) {
|
||||
ext::imgui::terminate();
|
||||
}
|
||||
#endif
|
||||
#if UF_USE_ULTRALIGHT
|
||||
/* Ultralight-UX */ if ( ::config.engine.ext.ultralight.enabled ) {
|
||||
/* Ultralight-UX */ if ( /*global*/::config.engine.ext.ultralight.enabled ) {
|
||||
ext::ultralight::terminate();
|
||||
}
|
||||
#endif
|
||||
@ -999,10 +1000,10 @@ void UF_API uf::terminate() {
|
||||
/* Kill physics */ {
|
||||
// uf::physics::terminate();
|
||||
}
|
||||
/* Garbage collection */ if ( ::config.engine.gc.enabled ) {
|
||||
size_t collected = uf::instantiator::collect( ::config.engine.gc.mode );
|
||||
/* Garbage collection */ if ( /*global*/::config.engine.gc.enabled ) {
|
||||
size_t collected = uf::instantiator::collect( /*global*/::config.engine.gc.mode );
|
||||
if ( collected > 0 ) {
|
||||
if ( ::config.engine.gc.announce ) UF_MSG_DEBUG("GC collected {} unused entities", (int) collected);
|
||||
if ( /*global*/::config.engine.gc.announce ) UF_MSG_DEBUG("GC collected {} unused entities", (int) collected);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1016,20 +1017,20 @@ void UF_API uf::terminate() {
|
||||
}
|
||||
|
||||
#if UF_USE_OPENAL
|
||||
/* Initialize OpenAL */ {
|
||||
/* Initialize OpenAL */ if ( !uf::audio::muted ) {
|
||||
ext::al::destroy();
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Print system stats */ {
|
||||
::times.total.time = times.sys.elapsed().asDouble();
|
||||
UF_MSG_DEBUG("System: Total Time: {} | Total Frames: {} | Average FPS: {}", ::times.total.time, ::times.total.frames, ::times.total.frames / ::times.total.time);
|
||||
/*global*/::times.total.time = /*global*/::times.sys.elapsed().asDouble();
|
||||
UF_MSG_DEBUG("System: Total Time: {} | Total Frames: {} | Average FPS: {}", /*global*/::times.total.time, /*global*/::times.total.frames, /*global*/::times.total.frames / /*global*/::times.total.time);
|
||||
}
|
||||
|
||||
/* Flush input buffer */ {
|
||||
::io.output << ::io.input << "\n";
|
||||
for ( const auto& str : uf::iostream.getHistory() ) ::io.output << str << "\n";
|
||||
::io.output << "\nTerminated after " << times.sys.elapsed().asDouble() << " seconds" << "\n";
|
||||
::io.output.close();
|
||||
/*global*/::io.output << /*global*/::io.input << "\n";
|
||||
for ( const auto& str : uf::iostream.getHistory() ) /*global*/::io.output << str << "\n";
|
||||
/*global*/::io.output << "\nTerminated after " << /*global*/::times.sys.elapsed().asDouble() << " seconds" << "\n";
|
||||
/*global*/::io.output.close();
|
||||
}
|
||||
}
|
||||
@ -933,10 +933,9 @@ void uf::graph::process( pod::Graph& graph ) {
|
||||
// process nodes
|
||||
UF_DEBUG_TIMER_MULTITRACE("Processing nodes");
|
||||
for ( auto index : graph.root.children ) {
|
||||
UF_DEBUG_TIMER_MULTITRACE("Processing node: {}", graph.nodes[index].name);
|
||||
process( graph, index, *graph.root.entity );
|
||||
|
||||
auto& node = graph.nodes[index];
|
||||
if ( node.entity ) UF_DEBUG_TIMER_MULTITRACE("Processed node: {}", node.name);
|
||||
UF_DEBUG_TIMER_MULTITRACE("Processed node: {}", graph.nodes[index].name);
|
||||
}
|
||||
|
||||
// patch materials/textures
|
||||
@ -1352,7 +1351,7 @@ void uf::graph::process( pod::Graph& graph, int32_t index, uf::Object& parent )
|
||||
metadataJson["physics"]["center"] = uf::vector::encode( center );
|
||||
metadataJson["physics"]["corner"] = uf::vector::encode( corner );
|
||||
}
|
||||
#if UF_GRAPH_EXTENDED
|
||||
#if !UF_GRAPH_EXTENDED
|
||||
if ( type == "mesh" ) {
|
||||
auto& collider = entity.getComponent<pod::PhysicsState>();
|
||||
collider.stats.mass = phyziks["mass"].as(collider.stats.mass);
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
bool ext::lua::enabled = true;
|
||||
sol::state ext::lua::state;
|
||||
uf::stl::string ext::lua::main = uf::io::root + "/scripts/main.lua";
|
||||
uf::stl::string ext::lua::main;
|
||||
uf::stl::unordered_map<uf::stl::string, uf::stl::string> ext::lua::modules;
|
||||
|
||||
#include <uf/utils/math/transform.h>
|
||||
|
||||
@ -77,7 +77,7 @@ GLhandle(VkColorSpaceKHR) ext::opengl::settings::formats::colorSpace;
|
||||
ext::opengl::enums::Format::type_t ext::opengl::settings::formats::color = ext::opengl::enums::Format::R8G8B8A8_UNORM;
|
||||
ext::opengl::enums::Format::type_t ext::opengl::settings::formats::depth = ext::opengl::enums::Format::D32_SFLOAT;
|
||||
|
||||
ext::opengl::Device ext::opengl::device;
|
||||
ext::opengl::Device* ext::opengl::device = NULL;
|
||||
std::mutex ext::opengl::mutex;
|
||||
std::mutex ext::opengl::immediateModeMutex;
|
||||
|
||||
@ -505,6 +505,8 @@ void ext::opengl::destroy() {
|
||||
// swapchain.destroy();
|
||||
device.destroy();
|
||||
ext::opengl::mutex.unlock();
|
||||
|
||||
delete device;
|
||||
}
|
||||
void ext::opengl::synchronize( uint8_t flag ) {
|
||||
if ( flag & 0b01 ) {
|
||||
|
||||
@ -746,6 +746,8 @@ VkQueue ext::vulkan::Device::getQueue( ext::vulkan::QueueEnum queueEnum ) {
|
||||
return this->getQueue( queueEnum, std::this_thread::get_id() );
|
||||
}
|
||||
VkCommandPool ext::vulkan::Device::getCommandPool( ext::vulkan::QueueEnum queueEnum, std::thread::id id ) {
|
||||
auto& device = *this;
|
||||
|
||||
uint32_t index{0};
|
||||
uf::ThreadUnique<VkCommandPool>* commandPool{NULL};
|
||||
|
||||
@ -780,6 +782,8 @@ VkCommandPool ext::vulkan::Device::getCommandPool( ext::vulkan::QueueEnum queueE
|
||||
return pool;
|
||||
}
|
||||
VkQueue ext::vulkan::Device::getQueue( ext::vulkan::QueueEnum queueEnum, std::thread::id id ) {
|
||||
auto& device = *this;
|
||||
|
||||
uint32_t index = 0;
|
||||
uf::ThreadUnique<VkQueue>* commandPool{NULL};
|
||||
switch ( queueEnum ) {
|
||||
@ -810,7 +814,9 @@ VkQueue ext::vulkan::Device::getQueue( ext::vulkan::QueueEnum queueEnum, std::th
|
||||
return queue;
|
||||
}
|
||||
|
||||
void ext::vulkan::Device::initialize() {
|
||||
void ext::vulkan::Device::initialize() {
|
||||
auto& device = *this;
|
||||
|
||||
uf::stl::vector<uf::stl::string> instanceLayers = {
|
||||
// "VK_LAYER_KHRONOS_synchronization2",
|
||||
};
|
||||
|
||||
@ -1196,7 +1196,7 @@ bool ext::vulkan::Graphic::updateMesh( uf::Mesh& mesh ) {
|
||||
return rebuild;
|
||||
}
|
||||
void ext::vulkan::Graphic::generateBottomAccelerationStructures() {
|
||||
auto& device = *this->device; // ext::vulkan::device;
|
||||
auto& device = *this->device;
|
||||
bool update = !this->accelerationStructures.bottoms.empty();
|
||||
|
||||
VkPhysicalDeviceAccelerationStructurePropertiesKHR acclerationStructureProperties{};
|
||||
|
||||
@ -654,8 +654,8 @@ void ext::vulkan::DeferredRenderMode::createCommandBuffers( const uf::stl::vecto
|
||||
cmdBufInfo.pNext = nullptr;
|
||||
|
||||
VkImageMemoryBarrier imageMemoryBarrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER };
|
||||
imageMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; // ext::vulkan::device->queueFamilyIndices.graphics; //VK_QUEUE_FAMILY_IGNORED
|
||||
imageMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; // ext::vulkan::device->queueFamilyIndices.graphics; //VK_QUEUE_FAMILY_IGNORED
|
||||
imageMemoryBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; // ext::vulkan::device.queueFamilyIndices.graphics; //VK_QUEUE_FAMILY_IGNORED
|
||||
imageMemoryBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; // ext::vulkan::device.queueFamilyIndices.graphics; //VK_QUEUE_FAMILY_IGNORED
|
||||
imageMemoryBarrier.subresourceRange.baseMipLevel = 0;
|
||||
imageMemoryBarrier.subresourceRange.levelCount = 1;
|
||||
imageMemoryBarrier.subresourceRange.baseArrayLayer = 0;
|
||||
|
||||
@ -64,6 +64,7 @@ namespace {
|
||||
}
|
||||
|
||||
ext::vulkan::Sampler ext::vulkan::Sampler::retrieve( const ext::vulkan::Sampler::Descriptor& info ) {
|
||||
auto& device = ext::vulkan::device;
|
||||
ext::vulkan::Sampler sampler;
|
||||
for ( auto& s : samplers ) {
|
||||
if ( memcmp( &info, &s.descriptor, sizeof(info) - sizeof(VkDescriptorImageInfo) ) != 0 ) continue;
|
||||
@ -79,7 +80,7 @@ ext::vulkan::Sampler ext::vulkan::Sampler::retrieve( const ext::vulkan::Sampler:
|
||||
{
|
||||
auto& s = samplers.emplace_back();
|
||||
s.descriptor = info;
|
||||
s.initialize( ext::vulkan::device );
|
||||
s.initialize( device );
|
||||
sampler = s;
|
||||
}
|
||||
RETRIEVE_RETURN:
|
||||
|
||||
114
engine/src/spec/context/linux.cpp
Normal file
114
engine/src/spec/context/linux.cpp
Normal file
@ -0,0 +1,114 @@
|
||||
#include <uf/spec/context/context.h>
|
||||
|
||||
#if UF_ENV_LINUX && UF_USE_OPENGL && !UF_USE_OPENGL_GLDC
|
||||
#include <uf/utils/io/iostream.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
#include <GL/glx.h>
|
||||
#include <GL/glxext.h>
|
||||
|
||||
spec::x11::Context::Context( uni::Context* shared, const Context::Settings& settings ) :
|
||||
uni::Context(NULL, true, settings),
|
||||
m_display(nullptr),
|
||||
m_context(nullptr),
|
||||
m_window(0)
|
||||
{
|
||||
m_display = XOpenDisplay(NULL);
|
||||
if (!m_display) {
|
||||
std::cerr << "Failed to open X display\n";
|
||||
return;
|
||||
}
|
||||
|
||||
// Create a hidden dummy window
|
||||
int scr = DefaultScreen(m_display);
|
||||
|
||||
XSetWindowAttributes swa;
|
||||
swa.event_mask = StructureNotifyMask;
|
||||
m_window = XCreateSimpleWindow(m_display, RootWindow(m_display, scr), 0, 0, 1, 1, 0, 0, 0);
|
||||
XMapWindow(m_display, m_window);
|
||||
|
||||
this->create(shared);
|
||||
}
|
||||
|
||||
spec::x11::Context::Context( uni::Context* shared, const Context::Settings& settings, const Context::window_t& window ) :
|
||||
uni::Context(NULL, false, settings),
|
||||
m_display(window.getDisplay()),
|
||||
m_context(nullptr),
|
||||
m_window(window.getHandle())
|
||||
{
|
||||
if (m_display && m_window)
|
||||
this->create(shared);
|
||||
}
|
||||
|
||||
spec::x11::Context::Context( uni::Context* shared, const Context::Settings& settings, unsigned int width, unsigned int height ) :
|
||||
Context(shared, settings) {
|
||||
// Nothing more; dummy window variant handles this
|
||||
}
|
||||
|
||||
spec::x11::Context::~Context() {
|
||||
this->terminate();
|
||||
}
|
||||
|
||||
void spec::x11::Context::create( uni::Context* shared ) {
|
||||
int attribs[] = {
|
||||
GLX_RGBA,
|
||||
GLX_DOUBLEBUFFER,
|
||||
GLX_DEPTH_SIZE, (int)m_settings.depthBits,
|
||||
GLX_STENCIL_SIZE, (int)m_settings.stencilBits,
|
||||
None
|
||||
};
|
||||
|
||||
int scr = DefaultScreen(m_display);
|
||||
XVisualInfo* vi = glXChooseVisual(m_display, scr, attribs);
|
||||
if (!vi) {
|
||||
std::cerr << "Failed to choose visual\n";
|
||||
return;
|
||||
}
|
||||
|
||||
GLXContext sharedCtx = shared ? ((x11::Context*)shared)->m_context : nullptr;
|
||||
m_context = glXCreateContext(m_display, vi, sharedCtx, True);
|
||||
|
||||
if (!m_context) {
|
||||
std::cerr << "glXCreateContext failed\n";
|
||||
}
|
||||
}
|
||||
|
||||
void spec::x11::Context::terminate() {
|
||||
if (m_context) {
|
||||
if (glXGetCurrentContext() == m_context)
|
||||
glXMakeCurrent(m_display, None, NULL);
|
||||
glXDestroyContext(m_display, m_context);
|
||||
m_context = nullptr;
|
||||
}
|
||||
|
||||
if (m_display && m_window && m_ownsWindow) {
|
||||
XDestroyWindow(m_display, m_window);
|
||||
}
|
||||
|
||||
if (m_display) {
|
||||
XCloseDisplay(m_display);
|
||||
m_display = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
bool spec::x11::Context::makeCurrent() {
|
||||
if (!m_display || !m_context || !m_window) return false;
|
||||
return glXMakeCurrent(m_display, m_window, m_context);
|
||||
}
|
||||
|
||||
void spec::x11::Context::display() {
|
||||
if (m_display && m_window)
|
||||
glXSwapBuffers(m_display, m_window);
|
||||
}
|
||||
|
||||
void spec::x11::Context::setVerticalSyncEnabled(bool enabled) {
|
||||
typedef int (*glXSwapIntervalEXTProc)(Display*, GLXDrawable, int);
|
||||
static glXSwapIntervalEXTProc glXSwapIntervalEXT =
|
||||
(glXSwapIntervalEXTProc) glXGetProcAddressARB((const GLubyte*)"glXSwapIntervalEXT");
|
||||
|
||||
if (glXSwapIntervalEXT) {
|
||||
glXSwapIntervalEXT(m_display, glXGetCurrentDrawable(), enabled ? 1 : 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
133
engine/src/spec/controller/linux.cpp
Normal file
133
engine/src/spec/controller/linux.cpp
Normal file
@ -0,0 +1,133 @@
|
||||
#include <uf/spec/controller/controller.h>
|
||||
#include <uf/utils/string/ext.h>
|
||||
|
||||
#ifdef UF_ENV_LINUX
|
||||
#if UF_USE_OPENVR
|
||||
#include <uf/ext/openvr/openvr.h>
|
||||
#endif
|
||||
|
||||
void spec::linux::controller::initialize() {}
|
||||
void spec::linux::controller::tick() {
|
||||
#if 0 && UF_USE_OPENVR
|
||||
if ( ext::openvr::context ) {
|
||||
uf::stl::string key = "";
|
||||
if ( name == "R_DPAD_UP" ) { i = vr::Controller_Hand::Hand_Right; key = "dpadUp"; }
|
||||
else if ( name == "R_DPAD_DOWN" ) { i = vr::Controller_Hand::Hand_Right; key = "dpadDown"; }
|
||||
else if ( name == "R_DPAD_LEFT" ) { i = vr::Controller_Hand::Hand_Right; key = "dpadLeft"; }
|
||||
else if ( name == "R_DPAD_RIGHT" ) { i = vr::Controller_Hand::Hand_Right; key = "dpadRight"; }
|
||||
else if ( name == "R_JOYSTICK" ) { i = vr::Controller_Hand::Hand_Right; key = "thumbclick"; }
|
||||
else if ( name == "R_A" ) { i = vr::Controller_Hand::Hand_Right; key = "a"; }
|
||||
else if ( name == "R_B" ) { i = vr::Controller_Hand::Hand_Right; key = "b"; }
|
||||
else if ( name == "DPAD_UP" && i == vr::Controller_Hand::Hand_Right ) key = "dpadUp";
|
||||
else if ( name == "DPAD_DOWN" && i == vr::Controller_Hand::Hand_Right ) key = "dpadDown";
|
||||
else if ( name == "DPAD_LEFT" && i == vr::Controller_Hand::Hand_Right ) key = "dpadLeft";
|
||||
else if ( name == "DPAD_RIGHT" && i == vr::Controller_Hand::Hand_Right ) key = "dpadRight";
|
||||
else if ( name == "JOYSTICK" && i == vr::Controller_Hand::Hand_Right ) key = "thumbclick";
|
||||
else if ( name == "A" && i == vr::Controller_Hand::Hand_Right ) key = "a";
|
||||
else if ( name == "B" && i == vr::Controller_Hand::Hand_Right ) key = "b";
|
||||
|
||||
else if ( name == "L_DPAD_UP" ) { i = vr::Controller_Hand::Hand_Left; key = "dpadUp"; }
|
||||
else if ( name == "L_DPAD_DOWN" ) { i = vr::Controller_Hand::Hand_Left; key = "dpadDown"; }
|
||||
else if ( name == "L_DPAD_LEFT" ) { i = vr::Controller_Hand::Hand_Left; key = "dpadLeft"; }
|
||||
else if ( name == "L_DPAD_RIGHT" ) { i = vr::Controller_Hand::Hand_Left; key = "dpadRight"; }
|
||||
else if ( name == "L_JOYSTICK" ) { i = vr::Controller_Hand::Hand_Left; key = "thumbclick"; }
|
||||
else if ( name == "L_A" ) { i = vr::Controller_Hand::Hand_Left; key = "a"; }
|
||||
else if ( name == "L_B" ) { i = vr::Controller_Hand::Hand_Left; key = "b"; }
|
||||
else if ( name == "DPAD_UP" && i == vr::Controller_Hand::Hand_Left ) key = "dpadUp";
|
||||
else if ( name == "DPAD_DOWN" && i == vr::Controller_Hand::Hand_Left ) key = "dpadDown";
|
||||
else if ( name == "DPAD_LEFT" && i == vr::Controller_Hand::Hand_Left ) key = "dpadLeft";
|
||||
else if ( name == "DPAD_RIGHT" && i == vr::Controller_Hand::Hand_Left ) key = "dpadRight";
|
||||
else if ( name == "JOYSTICK" && i == vr::Controller_Hand::Hand_Left ) key = "thumbclick";
|
||||
else if ( name == "A" && i == vr::Controller_Hand::Hand_Left ) key = "a";
|
||||
else if ( name == "B" && i == vr::Controller_Hand::Hand_Left ) key = "b";
|
||||
|
||||
if ( name != "" ) return ext::openvr::controllerState( i == 0 ? vr::Controller_Hand::Hand_Left : vr::Controller_Hand::Hand_Right, key )["state"].as<bool>();
|
||||
}
|
||||
if ( ext::openvr::context ) {
|
||||
size_t offset = 0;
|
||||
uf::stl::string key = "";
|
||||
if ( name == "R_JOYSTICK_X" ) { i = vr::Controller_Hand::Hand_Right; key = "thumbstick"; offset = 0; }
|
||||
else if ( name == "JOYSTICK_X" && i == vr::Controller_Hand::Hand_Right ) { key = "thumbstick"; offset = 0;}
|
||||
else if ( name == "R_JOYSTICK_Y" ) { i = vr::Controller_Hand::Hand_Right; key = "thumbstick"; offset = 1; }
|
||||
else if ( name == "JOYSTICK_Y" && i == vr::Controller_Hand::Hand_Right ) { key = "thumbstick"; offset = 1; }
|
||||
|
||||
else if ( name == "L_JOYSTICK_X" ) { i = vr::Controller_Hand::Hand_Left; key = "thumbstick"; offset = 0; }
|
||||
else if ( name == "JOYSTICK_X" && i == vr::Controller_Hand::Hand_Left ) { key = "thumbstick"; offset = 0;}
|
||||
else if ( name == "L_JOYSTICK_Y" ) { i = vr::Controller_Hand::Hand_Left; key = "thumbstick"; offset = 1; }
|
||||
else if ( name == "JOYSTICK_Y" && i == vr::Controller_Hand::Hand_Left ) { key = "thumbstick"; offset = 1; }
|
||||
|
||||
if ( name != "" ) return ext::openvr::controllerState( i == 0 ? vr::Controller_Hand::Hand_Left : vr::Controller_Hand::Hand_Right, key )["analog"]["position"][offset].as<float>();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
void spec::linux::controller::terminate() {}
|
||||
bool spec::linux::controller::connected( size_t i ) {
|
||||
#if UF_USE_OPENVR
|
||||
if ( ext::openvr::controllerActive( i == 0 ? vr::Controller_Hand::Hand_Left : vr::Controller_Hand::Hand_Right ) ) return true;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
bool spec::linux::controller::pressed( const uf::stl::string& _name, size_t i ) {
|
||||
uf::stl::string name = uf::string::uppercase(_name);
|
||||
#if UF_USE_OPENVR
|
||||
if ( ext::openvr::context ) {
|
||||
uf::stl::string key = "";
|
||||
if ( name == "R_DPAD_UP" ) { i = vr::Controller_Hand::Hand_Right; key = "dpadUp"; }
|
||||
else if ( name == "R_DPAD_DOWN" ) { i = vr::Controller_Hand::Hand_Right; key = "dpadDown"; }
|
||||
else if ( name == "R_DPAD_LEFT" ) { i = vr::Controller_Hand::Hand_Right; key = "dpadLeft"; }
|
||||
else if ( name == "R_DPAD_RIGHT" ) { i = vr::Controller_Hand::Hand_Right; key = "dpadRight"; }
|
||||
else if ( name == "R_JOYSTICK" ) { i = vr::Controller_Hand::Hand_Right; key = "thumbclick"; }
|
||||
else if ( name == "R_A" ) { i = vr::Controller_Hand::Hand_Right; key = "a"; }
|
||||
else if ( name == "R_B" ) { i = vr::Controller_Hand::Hand_Right; key = "b"; }
|
||||
else if ( name == "DPAD_UP" && i == vr::Controller_Hand::Hand_Right ) key = "dpadUp";
|
||||
else if ( name == "DPAD_DOWN" && i == vr::Controller_Hand::Hand_Right ) key = "dpadDown";
|
||||
else if ( name == "DPAD_LEFT" && i == vr::Controller_Hand::Hand_Right ) key = "dpadLeft";
|
||||
else if ( name == "DPAD_RIGHT" && i == vr::Controller_Hand::Hand_Right ) key = "dpadRight";
|
||||
else if ( name == "JOYSTICK" && i == vr::Controller_Hand::Hand_Right ) key = "thumbclick";
|
||||
else if ( name == "A" && i == vr::Controller_Hand::Hand_Right ) key = "a";
|
||||
else if ( name == "B" && i == vr::Controller_Hand::Hand_Right ) key = "b";
|
||||
|
||||
else if ( name == "L_DPAD_UP" ) { i = vr::Controller_Hand::Hand_Left; key = "dpadUp"; }
|
||||
else if ( name == "L_DPAD_DOWN" ) { i = vr::Controller_Hand::Hand_Left; key = "dpadDown"; }
|
||||
else if ( name == "L_DPAD_LEFT" ) { i = vr::Controller_Hand::Hand_Left; key = "dpadLeft"; }
|
||||
else if ( name == "L_DPAD_RIGHT" ) { i = vr::Controller_Hand::Hand_Left; key = "dpadRight"; }
|
||||
else if ( name == "L_JOYSTICK" ) { i = vr::Controller_Hand::Hand_Left; key = "thumbclick"; }
|
||||
else if ( name == "L_A" ) { i = vr::Controller_Hand::Hand_Left; key = "a"; }
|
||||
else if ( name == "L_B" ) { i = vr::Controller_Hand::Hand_Left; key = "b"; }
|
||||
else if ( name == "DPAD_UP" && i == vr::Controller_Hand::Hand_Left ) key = "dpadUp";
|
||||
else if ( name == "DPAD_DOWN" && i == vr::Controller_Hand::Hand_Left ) key = "dpadDown";
|
||||
else if ( name == "DPAD_LEFT" && i == vr::Controller_Hand::Hand_Left ) key = "dpadLeft";
|
||||
else if ( name == "DPAD_RIGHT" && i == vr::Controller_Hand::Hand_Left ) key = "dpadRight";
|
||||
else if ( name == "JOYSTICK" && i == vr::Controller_Hand::Hand_Left ) key = "thumbclick";
|
||||
else if ( name == "A" && i == vr::Controller_Hand::Hand_Left ) key = "a";
|
||||
else if ( name == "B" && i == vr::Controller_Hand::Hand_Left ) key = "b";
|
||||
|
||||
if ( name != "" ) return ext::openvr::controllerState( i == 0 ? vr::Controller_Hand::Hand_Left : vr::Controller_Hand::Hand_Right, key )["state"].as<bool>();
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
float spec::linux::controller::analog( const uf::stl::string& _name, size_t i ) {
|
||||
uf::stl::string name = uf::string::uppercase(_name);
|
||||
#if UF_USE_OPENVR
|
||||
if ( ext::openvr::context ) {
|
||||
size_t offset = 0;
|
||||
uf::stl::string key = "";
|
||||
if ( name == "R_JOYSTICK_X" ) { i = vr::Controller_Hand::Hand_Right; key = "thumbstick"; offset = 0; }
|
||||
else if ( name == "JOYSTICK_X" && i == vr::Controller_Hand::Hand_Right ) { key = "thumbstick"; offset = 0;}
|
||||
else if ( name == "R_JOYSTICK_Y" ) { i = vr::Controller_Hand::Hand_Right; key = "thumbstick"; offset = 1; }
|
||||
else if ( name == "JOYSTICK_Y" && i == vr::Controller_Hand::Hand_Right ) { key = "thumbstick"; offset = 1; }
|
||||
|
||||
else if ( name == "L_JOYSTICK_X" ) { i = vr::Controller_Hand::Hand_Left; key = "thumbstick"; offset = 0; }
|
||||
else if ( name == "JOYSTICK_X" && i == vr::Controller_Hand::Hand_Left ) { key = "thumbstick"; offset = 0;}
|
||||
else if ( name == "L_JOYSTICK_Y" ) { i = vr::Controller_Hand::Hand_Left; key = "thumbstick"; offset = 1; }
|
||||
else if ( name == "JOYSTICK_Y" && i == vr::Controller_Hand::Hand_Left ) { key = "thumbstick"; offset = 1; }
|
||||
|
||||
if ( name != "" ) return ext::openvr::controllerState( i == 0 ? vr::Controller_Hand::Hand_Left : vr::Controller_Hand::Hand_Right, key )["analog"]["position"][offset].as<float>();
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
47
engine/src/spec/terminal/linux.cpp
Normal file
47
engine/src/spec/terminal/linux.cpp
Normal file
@ -0,0 +1,47 @@
|
||||
#include <uf/spec/terminal/terminal.h>
|
||||
|
||||
#ifdef UF_ENV_LINUX
|
||||
|
||||
#include <iostream>
|
||||
#include <locale>
|
||||
#include <unistd.h>
|
||||
#include <termios.h>
|
||||
#include <cstdio>
|
||||
|
||||
void spec::Terminal::clear() {
|
||||
spec::uni::Terminal::clear();
|
||||
std::cout << "\033[2J\033[H" << std::flush;
|
||||
}
|
||||
|
||||
void spec::Terminal::setLocale() {
|
||||
spec::uni::Terminal::setLocale();
|
||||
std::setlocale(LC_ALL, "en_US.UTF-8");
|
||||
}
|
||||
|
||||
void spec::Terminal::hide() {
|
||||
/*
|
||||
if (isatty(fileno(stdin))) {
|
||||
struct termios tty;
|
||||
if (tcgetattr(STDIN_FILENO, &tty) == 0) {
|
||||
tty.c_lflag &= ~ECHO;
|
||||
tcsetattr(STDIN_FILENO, TCSANOW, &tty);
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void spec::Terminal::show() {
|
||||
/*
|
||||
if (isatty(fileno(stdin))) {
|
||||
struct termios tty;
|
||||
if (tcgetattr(STDIN_FILENO, &tty) == 0) {
|
||||
tty.c_lflag |= ECHO;
|
||||
tcsetattr(STDIN_FILENO, TCSANOW, &tty);
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@ -18,8 +18,7 @@ void spec::uni::Terminal::hide() {
|
||||
void spec::uni::Terminal::show() {
|
||||
}
|
||||
void spec::uni::Terminal::setLocale() {
|
||||
#if UF_ENV_DREAMCAST
|
||||
#else
|
||||
#if !UF_ENV_DREAMCAST
|
||||
const char* locales[4] = {
|
||||
"", "C.utf8", "C", "POSIX"
|
||||
};
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
#include <uf/spec/time/time.h>
|
||||
#ifdef UF_ENV_DREAMCAST
|
||||
#if 0 && UF_ENV_DREAMCAST
|
||||
#include <arch/timer.h>
|
||||
|
||||
spec::uni::Time::time_t spec::dreamcast::Time::getTime() {
|
||||
|
||||
25
engine/src/spec/time/linux.cpp
Normal file
25
engine/src/spec/time/linux.cpp
Normal file
@ -0,0 +1,25 @@
|
||||
#include <uf/spec/time/time.h>
|
||||
|
||||
#if 0 && UF_ENV_LINUX
|
||||
namespace {
|
||||
typedef std::chrono::time_point<std::chrono::system_clock> chrono_time_t;
|
||||
chrono_time_t getTimePoint() {
|
||||
return std::chrono::system_clock::now();
|
||||
}
|
||||
inline chrono_time_t& startPoint() {
|
||||
static chrono_time_t start = getTimePoint(); // constructed on 1st use
|
||||
return start;
|
||||
}
|
||||
}
|
||||
|
||||
spec::uni::Time::time_t spec::linux::Time::getTime() {
|
||||
std::chrono::duration<double> elapsed = getTimePoint() - startPoint();
|
||||
return elapsed.count() * 1000000;
|
||||
}
|
||||
spec::uni::Time& spec::linux::Time::getUniversal() {
|
||||
return (spec::uni::Time&) *this;
|
||||
}
|
||||
|
||||
spec::linux::Time spec::time;
|
||||
spec::linux::Time::exp_t spec::linux::Time::unit = -6;
|
||||
#endif
|
||||
@ -2,20 +2,33 @@
|
||||
|
||||
#include <chrono>
|
||||
|
||||
spec::uni::Time::exp_t spec::uni::Time::unit = -6;
|
||||
|
||||
namespace {
|
||||
typedef std::chrono::time_point<std::chrono::system_clock> chrono_time_t;
|
||||
chrono_time_t getTimePoint() {
|
||||
return std::chrono::system_clock::now();
|
||||
}
|
||||
chrono_time_t start = getTimePoint();
|
||||
inline chrono_time_t& startPoint() {
|
||||
static chrono_time_t start = getTimePoint(); // constructed on 1st use
|
||||
return start;
|
||||
}
|
||||
}
|
||||
|
||||
spec::uni::time::time_t spec::uni::time::unixTime() {
|
||||
return std::chrono::duration_cast<std::chrono::microseconds>(getTimePoint().time_since_epoch()).count();
|
||||
}
|
||||
spec::uni::time::time_t spec::uni::time::getTime() {
|
||||
std::chrono::duration<double> elapsed = getTimePoint() - startPoint();
|
||||
return elapsed.count() * 1000000;
|
||||
}
|
||||
|
||||
/*
|
||||
spec::uni::Time::time_t spec::uni::Time::unixTime() {
|
||||
return std::chrono::duration_cast<std::chrono::microseconds>(getTimePoint().time_since_epoch()).count();
|
||||
}
|
||||
spec::uni::Time::time_t spec::uni::Time::getTime() {
|
||||
std::chrono::duration<double> elapsed = getTimePoint() - start;
|
||||
std::chrono::duration<double> elapsed = getTimePoint() - startPoint();
|
||||
return elapsed.count() * 1000000;
|
||||
}
|
||||
}
|
||||
|
||||
spec::uni::Time::exp_t spec::uni::Time::unit = -6;
|
||||
*/
|
||||
@ -1,7 +1,6 @@
|
||||
#include <uf/spec/time/time.h>
|
||||
|
||||
#ifdef UF_ENV_WINDOWS
|
||||
|
||||
#if 0 && UF_ENV_WINDOWS
|
||||
namespace {
|
||||
LARGE_INTEGER getFrequency() {
|
||||
LARGE_INTEGER freq;
|
||||
|
||||
1287
engine/src/spec/window/linux.cpp
Normal file
1287
engine/src/spec/window/linux.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@ -79,128 +79,132 @@ namespace {
|
||||
uf::stl::vector<WPARAM> keys;
|
||||
keys.reserve(8);
|
||||
|
||||
if ( uf::inputs::kbm::states::LShift ) keys.emplace_back(VK_LSHIFT);
|
||||
if ( uf::inputs::kbm::states::RShift ) keys.emplace_back(VK_RSHIFT);
|
||||
#define IF_KEY_STATE( K, V ) if ( uf::inputs::kbm::states::K ) keys.emplace_back(V);
|
||||
|
||||
if ( uf::inputs::kbm::states::LAlt ) keys.emplace_back(VK_LMENU);
|
||||
if ( uf::inputs::kbm::states::RAlt ) keys.emplace_back(VK_RMENU);
|
||||
IF_KEY_STATE( LShift, VK_LSHIFT);
|
||||
IF_KEY_STATE( RShift, VK_RSHIFT);
|
||||
|
||||
if ( uf::inputs::kbm::states::LControl ) keys.emplace_back(VK_LCONTROL);
|
||||
if ( uf::inputs::kbm::states::RControl ) keys.emplace_back(VK_RCONTROL);
|
||||
IF_KEY_STATE( LAlt, VK_LMENU);
|
||||
IF_KEY_STATE( RAlt, VK_RMENU);
|
||||
|
||||
if ( uf::inputs::kbm::states::LSystem ) keys.emplace_back(VK_LWIN);
|
||||
if ( uf::inputs::kbm::states::RSystem ) keys.emplace_back(VK_RWIN);
|
||||
IF_KEY_STATE( LControl, VK_LCONTROL);
|
||||
IF_KEY_STATE( RControl, VK_RCONTROL);
|
||||
|
||||
if ( uf::inputs::kbm::states::Menu ) keys.emplace_back(VK_APPS);
|
||||
if ( uf::inputs::kbm::states::SemiColon ) keys.emplace_back(VK_OEM_1);
|
||||
if ( uf::inputs::kbm::states::Slash ) keys.emplace_back(VK_OEM_2);
|
||||
if ( uf::inputs::kbm::states::Equal ) keys.emplace_back(VK_OEM_PLUS);
|
||||
if ( uf::inputs::kbm::states::Dash ) keys.emplace_back(VK_OEM_MINUS);
|
||||
if ( uf::inputs::kbm::states::LBracket ) keys.emplace_back(VK_OEM_4);
|
||||
if ( uf::inputs::kbm::states::RBracket ) keys.emplace_back(VK_OEM_6);
|
||||
if ( uf::inputs::kbm::states::Comma ) keys.emplace_back(VK_OEM_COMMA);
|
||||
if ( uf::inputs::kbm::states::Period ) keys.emplace_back(VK_OEM_PERIOD);
|
||||
if ( uf::inputs::kbm::states::Quote ) keys.emplace_back(VK_OEM_7);
|
||||
if ( uf::inputs::kbm::states::BackSlash ) keys.emplace_back(VK_OEM_5);
|
||||
if ( uf::inputs::kbm::states::Tilde ) keys.emplace_back(VK_OEM_3);
|
||||
|
||||
if ( uf::inputs::kbm::states::Escape ) keys.emplace_back(VK_ESCAPE);
|
||||
if ( uf::inputs::kbm::states::Space ) keys.emplace_back(VK_SPACE);
|
||||
if ( uf::inputs::kbm::states::Enter ) keys.emplace_back(VK_RETURN);
|
||||
if ( uf::inputs::kbm::states::BackSpace ) keys.emplace_back(VK_BACK);
|
||||
if ( uf::inputs::kbm::states::Tab ) keys.emplace_back(VK_TAB);
|
||||
if ( uf::inputs::kbm::states::PageUp ) keys.emplace_back(VK_PRIOR);
|
||||
if ( uf::inputs::kbm::states::PageDown ) keys.emplace_back(VK_NEXT);
|
||||
if ( uf::inputs::kbm::states::End ) keys.emplace_back(VK_END);
|
||||
if ( uf::inputs::kbm::states::Home ) keys.emplace_back(VK_HOME);
|
||||
if ( uf::inputs::kbm::states::Insert ) keys.emplace_back(VK_INSERT);
|
||||
if ( uf::inputs::kbm::states::Delete ) keys.emplace_back(VK_DELETE);
|
||||
if ( uf::inputs::kbm::states::Add ) keys.emplace_back(VK_ADD);
|
||||
if ( uf::inputs::kbm::states::Subtract ) keys.emplace_back(VK_SUBTRACT);
|
||||
if ( uf::inputs::kbm::states::Multiply ) keys.emplace_back(VK_MULTIPLY);
|
||||
if ( uf::inputs::kbm::states::Divide ) keys.emplace_back(VK_DIVIDE);
|
||||
if ( uf::inputs::kbm::states::Pause ) keys.emplace_back(VK_PAUSE);
|
||||
|
||||
if ( uf::inputs::kbm::states::F1 ) keys.emplace_back(VK_F1);
|
||||
if ( uf::inputs::kbm::states::F2 ) keys.emplace_back(VK_F2);
|
||||
if ( uf::inputs::kbm::states::F3 ) keys.emplace_back(VK_F3);
|
||||
if ( uf::inputs::kbm::states::F4 ) keys.emplace_back(VK_F4);
|
||||
if ( uf::inputs::kbm::states::F5 ) keys.emplace_back(VK_F5);
|
||||
if ( uf::inputs::kbm::states::F6 ) keys.emplace_back(VK_F6);
|
||||
if ( uf::inputs::kbm::states::F7 ) keys.emplace_back(VK_F7);
|
||||
if ( uf::inputs::kbm::states::F8 ) keys.emplace_back(VK_F8);
|
||||
if ( uf::inputs::kbm::states::F9 ) keys.emplace_back(VK_F9);
|
||||
if ( uf::inputs::kbm::states::F10 ) keys.emplace_back(VK_F10);
|
||||
if ( uf::inputs::kbm::states::F11 ) keys.emplace_back(VK_F11);
|
||||
if ( uf::inputs::kbm::states::F12 ) keys.emplace_back(VK_F12);
|
||||
if ( uf::inputs::kbm::states::F13 ) keys.emplace_back(VK_F13);
|
||||
if ( uf::inputs::kbm::states::F14 ) keys.emplace_back(VK_F14);
|
||||
if ( uf::inputs::kbm::states::F15 ) keys.emplace_back(VK_F15);
|
||||
|
||||
if ( uf::inputs::kbm::states::Left ) keys.emplace_back(VK_LEFT);
|
||||
if ( uf::inputs::kbm::states::Right ) keys.emplace_back(VK_RIGHT);
|
||||
if ( uf::inputs::kbm::states::Up ) keys.emplace_back(VK_UP);
|
||||
if ( uf::inputs::kbm::states::Down ) keys.emplace_back(VK_DOWN);
|
||||
IF_KEY_STATE( LSystem, VK_LWIN);
|
||||
IF_KEY_STATE( RSystem, VK_RWIN);
|
||||
|
||||
if ( uf::inputs::kbm::states::Numpad0 ) keys.emplace_back(VK_NUMPAD0);
|
||||
if ( uf::inputs::kbm::states::Numpad1 ) keys.emplace_back(VK_NUMPAD1);
|
||||
if ( uf::inputs::kbm::states::Numpad2 ) keys.emplace_back(VK_NUMPAD2);
|
||||
if ( uf::inputs::kbm::states::Numpad3 ) keys.emplace_back(VK_NUMPAD3);
|
||||
if ( uf::inputs::kbm::states::Numpad4 ) keys.emplace_back(VK_NUMPAD4);
|
||||
if ( uf::inputs::kbm::states::Numpad5 ) keys.emplace_back(VK_NUMPAD5);
|
||||
if ( uf::inputs::kbm::states::Numpad6 ) keys.emplace_back(VK_NUMPAD6);
|
||||
if ( uf::inputs::kbm::states::Numpad7 ) keys.emplace_back(VK_NUMPAD7);
|
||||
if ( uf::inputs::kbm::states::Numpad8 ) keys.emplace_back(VK_NUMPAD8);
|
||||
if ( uf::inputs::kbm::states::Numpad9 ) keys.emplace_back(VK_NUMPAD9);
|
||||
IF_KEY_STATE( Menu, VK_APPS);
|
||||
IF_KEY_STATE( SemiColon, VK_OEM_1);
|
||||
IF_KEY_STATE( Slash, VK_OEM_2);
|
||||
IF_KEY_STATE( Equal, VK_OEM_PLUS);
|
||||
IF_KEY_STATE( Dash, VK_OEM_MINUS);
|
||||
IF_KEY_STATE( LBracket, VK_OEM_4);
|
||||
IF_KEY_STATE( RBracket, VK_OEM_6);
|
||||
IF_KEY_STATE( Comma, VK_OEM_COMMA);
|
||||
IF_KEY_STATE( Period, VK_OEM_PERIOD);
|
||||
IF_KEY_STATE( Quote, VK_OEM_7);
|
||||
IF_KEY_STATE( BackSlash, VK_OEM_5);
|
||||
IF_KEY_STATE( Tilde, VK_OEM_3);
|
||||
|
||||
IF_KEY_STATE( Escape, VK_ESCAPE);
|
||||
IF_KEY_STATE( Space, VK_SPACE);
|
||||
IF_KEY_STATE( Enter, VK_RETURN);
|
||||
IF_KEY_STATE( BackSpace, VK_BACK);
|
||||
IF_KEY_STATE( Tab, VK_TAB);
|
||||
IF_KEY_STATE( PageUp, VK_PRIOR);
|
||||
IF_KEY_STATE( PageDown, VK_NEXT);
|
||||
IF_KEY_STATE( End, VK_END);
|
||||
IF_KEY_STATE( Home, VK_HOME);
|
||||
IF_KEY_STATE( Insert, VK_INSERT);
|
||||
IF_KEY_STATE( Delete, VK_DELETE);
|
||||
IF_KEY_STATE( Add, VK_ADD);
|
||||
IF_KEY_STATE( Subtract, VK_SUBTRACT);
|
||||
IF_KEY_STATE( Multiply, VK_MULTIPLY);
|
||||
IF_KEY_STATE( Divide, VK_DIVIDE);
|
||||
IF_KEY_STATE( Pause, VK_PAUSE);
|
||||
|
||||
IF_KEY_STATE( F1, VK_F1);
|
||||
IF_KEY_STATE( F2, VK_F2);
|
||||
IF_KEY_STATE( F3, VK_F3);
|
||||
IF_KEY_STATE( F4, VK_F4);
|
||||
IF_KEY_STATE( F5, VK_F5);
|
||||
IF_KEY_STATE( F6, VK_F6);
|
||||
IF_KEY_STATE( F7, VK_F7);
|
||||
IF_KEY_STATE( F8, VK_F8);
|
||||
IF_KEY_STATE( F9, VK_F9);
|
||||
IF_KEY_STATE( F10, VK_F10);
|
||||
IF_KEY_STATE( F11, VK_F11);
|
||||
IF_KEY_STATE( F12, VK_F12);
|
||||
IF_KEY_STATE( F13, VK_F13);
|
||||
IF_KEY_STATE( F14, VK_F14);
|
||||
IF_KEY_STATE( F15, VK_F15);
|
||||
|
||||
IF_KEY_STATE( Left, VK_LEFT);
|
||||
IF_KEY_STATE( Right, VK_RIGHT);
|
||||
IF_KEY_STATE( Up, VK_UP);
|
||||
IF_KEY_STATE( Down, VK_DOWN);
|
||||
|
||||
if ( uf::inputs::kbm::states::Q ) keys.emplace_back('Q');
|
||||
if ( uf::inputs::kbm::states::W ) keys.emplace_back('W');
|
||||
if ( uf::inputs::kbm::states::E ) keys.emplace_back('E');
|
||||
if ( uf::inputs::kbm::states::R ) keys.emplace_back('R');
|
||||
if ( uf::inputs::kbm::states::T ) keys.emplace_back('T');
|
||||
if ( uf::inputs::kbm::states::Y ) keys.emplace_back('Y');
|
||||
if ( uf::inputs::kbm::states::U ) keys.emplace_back('U');
|
||||
if ( uf::inputs::kbm::states::I ) keys.emplace_back('I');
|
||||
if ( uf::inputs::kbm::states::O ) keys.emplace_back('O');
|
||||
if ( uf::inputs::kbm::states::P ) keys.emplace_back('P');
|
||||
IF_KEY_STATE( Numpad0, VK_NUMPAD0);
|
||||
IF_KEY_STATE( Numpad1, VK_NUMPAD1);
|
||||
IF_KEY_STATE( Numpad2, VK_NUMPAD2);
|
||||
IF_KEY_STATE( Numpad3, VK_NUMPAD3);
|
||||
IF_KEY_STATE( Numpad4, VK_NUMPAD4);
|
||||
IF_KEY_STATE( Numpad5, VK_NUMPAD5);
|
||||
IF_KEY_STATE( Numpad6, VK_NUMPAD6);
|
||||
IF_KEY_STATE( Numpad7, VK_NUMPAD7);
|
||||
IF_KEY_STATE( Numpad8, VK_NUMPAD8);
|
||||
IF_KEY_STATE( Numpad9, VK_NUMPAD9);
|
||||
|
||||
IF_KEY_STATE( Q, 'Q');
|
||||
IF_KEY_STATE( W, 'W');
|
||||
IF_KEY_STATE( E, 'E');
|
||||
IF_KEY_STATE( R, 'R');
|
||||
IF_KEY_STATE( T, 'T');
|
||||
IF_KEY_STATE( Y, 'Y');
|
||||
IF_KEY_STATE( U, 'U');
|
||||
IF_KEY_STATE( I, 'I');
|
||||
IF_KEY_STATE( O, 'O');
|
||||
IF_KEY_STATE( P, 'P');
|
||||
|
||||
if ( uf::inputs::kbm::states::A ) keys.emplace_back('A');
|
||||
if ( uf::inputs::kbm::states::S ) keys.emplace_back('S');
|
||||
if ( uf::inputs::kbm::states::D ) keys.emplace_back('D');
|
||||
if ( uf::inputs::kbm::states::F ) keys.emplace_back('F');
|
||||
if ( uf::inputs::kbm::states::G ) keys.emplace_back('G');
|
||||
if ( uf::inputs::kbm::states::H ) keys.emplace_back('H');
|
||||
if ( uf::inputs::kbm::states::J ) keys.emplace_back('J');
|
||||
if ( uf::inputs::kbm::states::K ) keys.emplace_back('K');
|
||||
if ( uf::inputs::kbm::states::L ) keys.emplace_back('L');
|
||||
IF_KEY_STATE( A, 'A');
|
||||
IF_KEY_STATE( S, 'S');
|
||||
IF_KEY_STATE( D, 'D');
|
||||
IF_KEY_STATE( F, 'F');
|
||||
IF_KEY_STATE( G, 'G');
|
||||
IF_KEY_STATE( H, 'H');
|
||||
IF_KEY_STATE( J, 'J');
|
||||
IF_KEY_STATE( K, 'K');
|
||||
IF_KEY_STATE( L, 'L');
|
||||
|
||||
if ( uf::inputs::kbm::states::Z ) keys.emplace_back('Z');
|
||||
if ( uf::inputs::kbm::states::X ) keys.emplace_back('X');
|
||||
if ( uf::inputs::kbm::states::C ) keys.emplace_back('C');
|
||||
if ( uf::inputs::kbm::states::V ) keys.emplace_back('V');
|
||||
if ( uf::inputs::kbm::states::B ) keys.emplace_back('B');
|
||||
if ( uf::inputs::kbm::states::N ) keys.emplace_back('N');
|
||||
if ( uf::inputs::kbm::states::M ) keys.emplace_back('M');
|
||||
IF_KEY_STATE( Z, 'Z');
|
||||
IF_KEY_STATE( X, 'X');
|
||||
IF_KEY_STATE( C, 'C');
|
||||
IF_KEY_STATE( V, 'V');
|
||||
IF_KEY_STATE( B, 'B');
|
||||
IF_KEY_STATE( N, 'N');
|
||||
IF_KEY_STATE( M, 'M');
|
||||
|
||||
if ( uf::inputs::kbm::states::Num1 ) keys.emplace_back('1');
|
||||
if ( uf::inputs::kbm::states::Num2 ) keys.emplace_back('2');
|
||||
if ( uf::inputs::kbm::states::Num3 ) keys.emplace_back('3');
|
||||
if ( uf::inputs::kbm::states::Num4 ) keys.emplace_back('4');
|
||||
if ( uf::inputs::kbm::states::Num5 ) keys.emplace_back('5');
|
||||
if ( uf::inputs::kbm::states::Num6 ) keys.emplace_back('6');
|
||||
if ( uf::inputs::kbm::states::Num7 ) keys.emplace_back('7');
|
||||
if ( uf::inputs::kbm::states::Num8 ) keys.emplace_back('8');
|
||||
if ( uf::inputs::kbm::states::Num9 ) keys.emplace_back('9');
|
||||
if ( uf::inputs::kbm::states::Num0 ) keys.emplace_back('0');
|
||||
IF_KEY_STATE( Num1, '1');
|
||||
IF_KEY_STATE( Num2, '2');
|
||||
IF_KEY_STATE( Num3, '3');
|
||||
IF_KEY_STATE( Num4, '4');
|
||||
IF_KEY_STATE( Num5, '5');
|
||||
IF_KEY_STATE( Num6, '6');
|
||||
IF_KEY_STATE( Num7, '7');
|
||||
IF_KEY_STATE( Num8, '8');
|
||||
IF_KEY_STATE( Num9, '9');
|
||||
IF_KEY_STATE( Num0, '0');
|
||||
|
||||
if ( uf::inputs::kbm::states::Mouse1 ) keys.emplace_back(VK_LBUTTON);
|
||||
if ( uf::inputs::kbm::states::Mouse2 ) keys.emplace_back(VK_RBUTTON);
|
||||
if ( uf::inputs::kbm::states::Mouse3 ) keys.emplace_back(VK_MBUTTON);
|
||||
IF_KEY_STATE( Mouse1, VK_LBUTTON);
|
||||
IF_KEY_STATE( Mouse2, VK_RBUTTON);
|
||||
IF_KEY_STATE( Mouse3, VK_MBUTTON);
|
||||
|
||||
return keys;
|
||||
}
|
||||
|
||||
|
||||
uf::stl::string _GetKeyName( WPARAM key, LPARAM flags = 0 ) {
|
||||
#define CASE_KEY_RETURN( K, V ) case K: return V;
|
||||
switch ( key ) {
|
||||
// Check the scancode to distinguish between left and right shift
|
||||
case VK_SHIFT: {
|
||||
@ -214,109 +218,109 @@ namespace {
|
||||
case VK_CONTROL : return (HIWORD(flags) & KF_EXTENDED) ? "RControl" : "LControl";
|
||||
|
||||
// Other keys are reported properly
|
||||
case VK_LWIN: return "LSystem";
|
||||
case VK_RWIN: return "RSystem";
|
||||
case VK_APPS: return "Menu";
|
||||
case VK_OEM_1: return "SemiColon";
|
||||
case VK_OEM_2: return "Slash";
|
||||
case VK_OEM_PLUS: return "Equal";
|
||||
case VK_OEM_MINUS: return "Dash";
|
||||
case VK_OEM_4: return "LBracket";
|
||||
case VK_OEM_6: return "RBracket";
|
||||
case VK_OEM_COMMA: return "Comma";
|
||||
case VK_OEM_PERIOD: return "Period";
|
||||
case VK_OEM_7: return "Quote";
|
||||
case VK_OEM_5: return "BackSlash";
|
||||
case VK_OEM_3: return "Tilde";
|
||||
CASE_KEY_RETURN(VK_LWIN, "LSystem");
|
||||
CASE_KEY_RETURN(VK_RWIN, "RSystem");
|
||||
CASE_KEY_RETURN(VK_APPS, "Menu");
|
||||
CASE_KEY_RETURN(VK_OEM_1, "SemiColon");
|
||||
CASE_KEY_RETURN(VK_OEM_2, "Slash");
|
||||
CASE_KEY_RETURN(VK_OEM_PLUS, "Equal");
|
||||
CASE_KEY_RETURN(VK_OEM_MINUS, "Dash");
|
||||
CASE_KEY_RETURN(VK_OEM_4, "LBracket");
|
||||
CASE_KEY_RETURN(VK_OEM_6, "RBracket");
|
||||
CASE_KEY_RETURN(VK_OEM_COMMA, "Comma");
|
||||
CASE_KEY_RETURN(VK_OEM_PERIOD, "Period");
|
||||
CASE_KEY_RETURN(VK_OEM_7, "Quote");
|
||||
CASE_KEY_RETURN(VK_OEM_5, "BackSlash");
|
||||
CASE_KEY_RETURN(VK_OEM_3, "Tilde");
|
||||
|
||||
case VK_ESCAPE: return "Escape";
|
||||
case VK_SPACE: return "Space";
|
||||
case VK_RETURN: return "Enter";
|
||||
case VK_BACK: return "BackSpace";
|
||||
case VK_TAB: return "Tab";
|
||||
case VK_PRIOR: return "PageUp";
|
||||
case VK_NEXT: return "PageDown";
|
||||
case VK_END: return "End";
|
||||
case VK_HOME: return "Home";
|
||||
case VK_INSERT: return "Insert";
|
||||
case VK_DELETE: return "Delete";
|
||||
case VK_ADD: return "Add";
|
||||
case VK_SUBTRACT: return "Subtract";
|
||||
case VK_MULTIPLY: return "Multiply";
|
||||
case VK_DIVIDE: return "Divide";
|
||||
case VK_PAUSE: return "Pause";
|
||||
CASE_KEY_RETURN(VK_ESCAPE, "Escape");
|
||||
CASE_KEY_RETURN(VK_SPACE, "Space");
|
||||
CASE_KEY_RETURN(VK_RETURN, "Enter");
|
||||
CASE_KEY_RETURN(VK_BACK, "BackSpace");
|
||||
CASE_KEY_RETURN(VK_TAB, "Tab");
|
||||
CASE_KEY_RETURN(VK_PRIOR, "PageUp");
|
||||
CASE_KEY_RETURN(VK_NEXT, "PageDown");
|
||||
CASE_KEY_RETURN(VK_END, "End");
|
||||
CASE_KEY_RETURN(VK_HOME, "Home");
|
||||
CASE_KEY_RETURN(VK_INSERT, "Insert");
|
||||
CASE_KEY_RETURN(VK_DELETE, "Delete");
|
||||
CASE_KEY_RETURN(VK_ADD, "Add");
|
||||
CASE_KEY_RETURN(VK_SUBTRACT, "Subtract");
|
||||
CASE_KEY_RETURN(VK_MULTIPLY, "Multiply");
|
||||
CASE_KEY_RETURN(VK_DIVIDE, "Divide");
|
||||
CASE_KEY_RETURN(VK_PAUSE, "Pause");
|
||||
|
||||
case VK_F1: return "F1";
|
||||
case VK_F2: return "F2";
|
||||
case VK_F3: return "F3";
|
||||
case VK_F4: return "F4";
|
||||
case VK_F5: return "F5";
|
||||
case VK_F6: return "F6";
|
||||
case VK_F7: return "F7";
|
||||
case VK_F8: return "F8";
|
||||
case VK_F9: return "F9";
|
||||
case VK_F10: return "F10";
|
||||
case VK_F11: return "F11";
|
||||
case VK_F12: return "F12";
|
||||
case VK_F13: return "F13";
|
||||
case VK_F14: return "F14";
|
||||
case VK_F15: return "F15";
|
||||
CASE_KEY_RETURN(VK_F1, "F1");
|
||||
CASE_KEY_RETURN(VK_F2, "F2");
|
||||
CASE_KEY_RETURN(VK_F3, "F3");
|
||||
CASE_KEY_RETURN(VK_F4, "F4");
|
||||
CASE_KEY_RETURN(VK_F5, "F5");
|
||||
CASE_KEY_RETURN(VK_F6, "F6");
|
||||
CASE_KEY_RETURN(VK_F7, "F7");
|
||||
CASE_KEY_RETURN(VK_F8, "F8");
|
||||
CASE_KEY_RETURN(VK_F9, "F9");
|
||||
CASE_KEY_RETURN(VK_F10, "F10");
|
||||
CASE_KEY_RETURN(VK_F11, "F11");
|
||||
CASE_KEY_RETURN(VK_F12, "F12");
|
||||
CASE_KEY_RETURN(VK_F13, "F13");
|
||||
CASE_KEY_RETURN(VK_F14, "F14");
|
||||
CASE_KEY_RETURN(VK_F15, "F15");
|
||||
|
||||
case VK_LEFT: return "Left";
|
||||
case VK_RIGHT: return "Right";
|
||||
case VK_UP: return "Up";
|
||||
case VK_DOWN: return "Down";
|
||||
CASE_KEY_RETURN(VK_LEFT, "Left");
|
||||
CASE_KEY_RETURN(VK_RIGHT, "Right");
|
||||
CASE_KEY_RETURN(VK_UP, "Up");
|
||||
CASE_KEY_RETURN(VK_DOWN, "Down");
|
||||
|
||||
case VK_NUMPAD0: return "Numpad0";
|
||||
case VK_NUMPAD1: return "Numpad1";
|
||||
case VK_NUMPAD2: return "Numpad2";
|
||||
case VK_NUMPAD3: return "Numpad3";
|
||||
case VK_NUMPAD4: return "Numpad4";
|
||||
case VK_NUMPAD5: return "Numpad5";
|
||||
case VK_NUMPAD6: return "Numpad6";
|
||||
case VK_NUMPAD7: return "Numpad7";
|
||||
case VK_NUMPAD8: return "Numpad8";
|
||||
case VK_NUMPAD9: return "Numpad9";
|
||||
CASE_KEY_RETURN(VK_NUMPAD0, "Numpad0");
|
||||
CASE_KEY_RETURN(VK_NUMPAD1, "Numpad1");
|
||||
CASE_KEY_RETURN(VK_NUMPAD2, "Numpad2");
|
||||
CASE_KEY_RETURN(VK_NUMPAD3, "Numpad3");
|
||||
CASE_KEY_RETURN(VK_NUMPAD4, "Numpad4");
|
||||
CASE_KEY_RETURN(VK_NUMPAD5, "Numpad5");
|
||||
CASE_KEY_RETURN(VK_NUMPAD6, "Numpad6");
|
||||
CASE_KEY_RETURN(VK_NUMPAD7, "Numpad7");
|
||||
CASE_KEY_RETURN(VK_NUMPAD8, "Numpad8");
|
||||
CASE_KEY_RETURN(VK_NUMPAD9, "Numpad9");
|
||||
|
||||
case 'Q': return "Q";
|
||||
case 'W': return "W";
|
||||
case 'E': return "E";
|
||||
case 'R': return "R";
|
||||
case 'T': return "T";
|
||||
case 'Y': return "Y";
|
||||
case 'U': return "U";
|
||||
case 'I': return "I";
|
||||
case 'O': return "O";
|
||||
case 'P': return "P";
|
||||
CASE_KEY_RETURN('Q', "Q");
|
||||
CASE_KEY_RETURN('W', "W");
|
||||
CASE_KEY_RETURN('E', "E");
|
||||
CASE_KEY_RETURN('R', "R");
|
||||
CASE_KEY_RETURN('T', "T");
|
||||
CASE_KEY_RETURN('Y', "Y");
|
||||
CASE_KEY_RETURN('U', "U");
|
||||
CASE_KEY_RETURN('I', "I");
|
||||
CASE_KEY_RETURN('O', "O");
|
||||
CASE_KEY_RETURN('P', "P");
|
||||
|
||||
case 'A': return "A";
|
||||
case 'S': return "S";
|
||||
case 'D': return "D";
|
||||
case 'F': return "F";
|
||||
case 'G': return "G";
|
||||
case 'H': return "H";
|
||||
case 'J': return "J";
|
||||
case 'K': return "K";
|
||||
case 'L': return "L";
|
||||
CASE_KEY_RETURN('A', "A");
|
||||
CASE_KEY_RETURN('S', "S");
|
||||
CASE_KEY_RETURN('D', "D");
|
||||
CASE_KEY_RETURN('F', "F");
|
||||
CASE_KEY_RETURN('G', "G");
|
||||
CASE_KEY_RETURN('H', "H");
|
||||
CASE_KEY_RETURN('J', "J");
|
||||
CASE_KEY_RETURN('K', "K");
|
||||
CASE_KEY_RETURN('L', "L");
|
||||
|
||||
case 'Z': return "Z";
|
||||
case 'X': return "X";
|
||||
case 'C': return "C";
|
||||
case 'V': return "V";
|
||||
case 'B': return "B";
|
||||
case 'N': return "N";
|
||||
case 'M': return "M";
|
||||
CASE_KEY_RETURN('Z', "Z");
|
||||
CASE_KEY_RETURN('X', "X");
|
||||
CASE_KEY_RETURN('C', "C");
|
||||
CASE_KEY_RETURN('V', "V");
|
||||
CASE_KEY_RETURN('B', "B");
|
||||
CASE_KEY_RETURN('N', "N");
|
||||
CASE_KEY_RETURN('M', "M");
|
||||
|
||||
case '1': return "Num1";
|
||||
case '2': return "Num2";
|
||||
case '3': return "Num3";
|
||||
case '4': return "Num4";
|
||||
case '5': return "Num5";
|
||||
case '6': return "Num6";
|
||||
case '7': return "Num7";
|
||||
case '8': return "Num8";
|
||||
case '9': return "Num9";
|
||||
case '0': return "Num0";
|
||||
CASE_KEY_RETURN('1', "Num1");
|
||||
CASE_KEY_RETURN('2', "Num2");
|
||||
CASE_KEY_RETURN('3', "Num3");
|
||||
CASE_KEY_RETURN('4', "Num4");
|
||||
CASE_KEY_RETURN('5', "Num5");
|
||||
CASE_KEY_RETURN('6', "Num6");
|
||||
CASE_KEY_RETURN('7', "Num7");
|
||||
CASE_KEY_RETURN('8', "Num8");
|
||||
CASE_KEY_RETURN('9', "Num9");
|
||||
CASE_KEY_RETURN('0', "Num0");
|
||||
}
|
||||
return std::to_string((int) key);
|
||||
}
|
||||
@ -326,114 +330,116 @@ namespace {
|
||||
|
||||
WPARAM GetKeyCode( const uf::stl::string& _name ) {
|
||||
uf::stl::string name = uf::string::uppercase(_name);
|
||||
if ( name == "A" ) return 'A';
|
||||
else if ( name == "B" ) return 'B';
|
||||
else if ( name == "C" ) return 'C';
|
||||
else if ( name == "D" ) return 'D';
|
||||
else if ( name == "E" ) return 'E';
|
||||
else if ( name == "F" ) return 'F';
|
||||
else if ( name == "G" ) return 'G';
|
||||
else if ( name == "H" ) return 'H';
|
||||
else if ( name == "I" ) return 'I';
|
||||
else if ( name == "J" ) return 'J';
|
||||
else if ( name == "K" ) return 'K';
|
||||
else if ( name == "L" ) return 'L';
|
||||
else if ( name == "M" ) return 'M';
|
||||
else if ( name == "N" ) return 'N';
|
||||
else if ( name == "O" ) return 'O';
|
||||
else if ( name == "P" ) return 'P';
|
||||
else if ( name == "Q" ) return 'Q';
|
||||
else if ( name == "R" ) return 'R';
|
||||
else if ( name == "S" ) return 'S';
|
||||
else if ( name == "T" ) return 'T';
|
||||
else if ( name == "U" ) return 'U';
|
||||
else if ( name == "V" ) return 'V';
|
||||
else if ( name == "W" ) return 'W';
|
||||
else if ( name == "X" ) return 'X';
|
||||
else if ( name == "Y" ) return 'Y';
|
||||
else if ( name == "Z" ) return 'Z';
|
||||
else if ( name == "0" ) return '0';
|
||||
else if ( name == "1" ) return '1';
|
||||
else if ( name == "2" ) return '2';
|
||||
else if ( name == "3" ) return '3';
|
||||
else if ( name == "4" ) return '4';
|
||||
else if ( name == "5" ) return '5';
|
||||
else if ( name == "6" ) return '6';
|
||||
else if ( name == "7" ) return '7';
|
||||
else if ( name == "8" ) return '8';
|
||||
else if ( name == "9" ) return '9';
|
||||
else if ( name == "ESCAPE" ) return VK_ESCAPE;
|
||||
else if ( name == "LCONTROL" ) return VK_LCONTROL;
|
||||
else if ( name == "LSHIFT" ) return VK_LSHIFT;
|
||||
else if ( name == "LALT" ) return VK_LMENU;
|
||||
else if ( name == "LSYSTEM" ) return VK_LWIN;
|
||||
else if ( name == "RCONTROL" ) return VK_RCONTROL;
|
||||
else if ( name == "RSHIFT" ) return VK_RSHIFT;
|
||||
else if ( name == "RALT" ) return VK_RMENU;
|
||||
else if ( name == "RSYSTEM" ) return VK_RWIN;
|
||||
else if ( name == "APPS" ) return VK_APPS;
|
||||
else if ( name == "OEM4" ) return VK_OEM_4;
|
||||
else if ( name == "OEM6" ) return VK_OEM_6;
|
||||
else if ( name == "OEM1" ) return VK_OEM_1;
|
||||
else if ( name == "OEMCOMMA" ) return VK_OEM_COMMA;
|
||||
else if ( name == "OEMPERIOD" ) return VK_OEM_PERIOD;
|
||||
else if ( name == "OEM7" ) return VK_OEM_7;
|
||||
else if ( name == "OEM2" ) return VK_OEM_2;
|
||||
else if ( name == "OEM5" ) return VK_OEM_5;
|
||||
else if ( name == "OEM3" ) return VK_OEM_3;
|
||||
else if ( name == "OEM+" ) return VK_OEM_PLUS;
|
||||
else if ( name == "OEM-" ) return VK_OEM_MINUS;
|
||||
else if ( name == " " ) return VK_SPACE;
|
||||
else if ( name == "SPACE" ) return VK_SPACE;
|
||||
else if ( name == "ENTER" ) return VK_RETURN;
|
||||
else if ( name == "BACK" ) return VK_BACK;
|
||||
else if ( name == "TAB" ) return VK_TAB;
|
||||
else if ( name == "PRIOR" ) return VK_PRIOR;
|
||||
else if ( name == "NEXT" ) return VK_NEXT;
|
||||
else if ( name == "END" ) return VK_END;
|
||||
else if ( name == "HOME" ) return VK_HOME;
|
||||
else if ( name == "INSERT" ) return VK_INSERT;
|
||||
else if ( name == "DELETE" ) return VK_DELETE;
|
||||
else if ( name == "+" ) return VK_ADD;
|
||||
else if ( name == "-" ) return VK_SUBTRACT;
|
||||
else if ( name == "*" ) return VK_MULTIPLY;
|
||||
else if ( name == "/" ) return VK_DIVIDE;
|
||||
else if ( name == "LEFT" ) return VK_LEFT;
|
||||
else if ( name == "RIGHT" ) return VK_RIGHT;
|
||||
else if ( name == "UP" ) return VK_UP;
|
||||
else if ( name == "DOWN" ) return VK_DOWN;
|
||||
else if ( name == "NUM0" ) return VK_NUMPAD0;
|
||||
else if ( name == "NUM1" ) return VK_NUMPAD1;
|
||||
else if ( name == "NUM2" ) return VK_NUMPAD2;
|
||||
else if ( name == "NUM3" ) return VK_NUMPAD3;
|
||||
else if ( name == "NUM4" ) return VK_NUMPAD4;
|
||||
else if ( name == "NUM5" ) return VK_NUMPAD5;
|
||||
else if ( name == "NUM6" ) return VK_NUMPAD6;
|
||||
else if ( name == "NUM7" ) return VK_NUMPAD7;
|
||||
else if ( name == "NUM8" ) return VK_NUMPAD8;
|
||||
else if ( name == "NUM9" ) return VK_NUMPAD9;
|
||||
else if ( name == "F1" ) return VK_F1;
|
||||
else if ( name == "F2" ) return VK_F2;
|
||||
else if ( name == "F3" ) return VK_F3;
|
||||
else if ( name == "F4" ) return VK_F4;
|
||||
else if ( name == "F5" ) return VK_F5;
|
||||
else if ( name == "F6" ) return VK_F6;
|
||||
else if ( name == "F7" ) return VK_F7;
|
||||
else if ( name == "F8" ) return VK_F8;
|
||||
else if ( name == "F9" ) return VK_F9;
|
||||
else if ( name == "F10" ) return VK_F10;
|
||||
else if ( name == "F11" ) return VK_F11;
|
||||
else if ( name == "F12" ) return VK_F12;
|
||||
else if ( name == "F13" ) return VK_F13;
|
||||
else if ( name == "F14" ) return VK_F14;
|
||||
else if ( name == "F15" ) return VK_F15;
|
||||
else if ( name == "PAUSE" ) return VK_PAUSE;
|
||||
#define IF_KEY_RETURN( K, V ) if ( name == K ) return V
|
||||
|
||||
IF_KEY_RETURN( "A", 'A');
|
||||
else IF_KEY_RETURN( "B", 'B');
|
||||
else IF_KEY_RETURN( "C", 'C');
|
||||
else IF_KEY_RETURN( "D", 'D');
|
||||
else IF_KEY_RETURN( "E", 'E');
|
||||
else IF_KEY_RETURN( "F", 'F');
|
||||
else IF_KEY_RETURN( "G", 'G');
|
||||
else IF_KEY_RETURN( "H", 'H');
|
||||
else IF_KEY_RETURN( "I", 'I');
|
||||
else IF_KEY_RETURN( "J", 'J');
|
||||
else IF_KEY_RETURN( "K", 'K');
|
||||
else IF_KEY_RETURN( "L", 'L');
|
||||
else IF_KEY_RETURN( "M", 'M');
|
||||
else IF_KEY_RETURN( "N", 'N');
|
||||
else IF_KEY_RETURN( "O", 'O');
|
||||
else IF_KEY_RETURN( "P", 'P');
|
||||
else IF_KEY_RETURN( "Q", 'Q');
|
||||
else IF_KEY_RETURN( "R", 'R');
|
||||
else IF_KEY_RETURN( "S", 'S');
|
||||
else IF_KEY_RETURN( "T", 'T');
|
||||
else IF_KEY_RETURN( "U", 'U');
|
||||
else IF_KEY_RETURN( "V", 'V');
|
||||
else IF_KEY_RETURN( "W", 'W');
|
||||
else IF_KEY_RETURN( "X", 'X');
|
||||
else IF_KEY_RETURN( "Y", 'Y');
|
||||
else IF_KEY_RETURN( "Z", 'Z');
|
||||
else IF_KEY_RETURN( "0", '0');
|
||||
else IF_KEY_RETURN( "1", '1');
|
||||
else IF_KEY_RETURN( "2", '2');
|
||||
else IF_KEY_RETURN( "3", '3');
|
||||
else IF_KEY_RETURN( "4", '4');
|
||||
else IF_KEY_RETURN( "5", '5');
|
||||
else IF_KEY_RETURN( "6", '6');
|
||||
else IF_KEY_RETURN( "7", '7');
|
||||
else IF_KEY_RETURN( "8", '8');
|
||||
else IF_KEY_RETURN( "9", '9');
|
||||
else IF_KEY_RETURN( "ESCAPE", VK_ESCAPE);
|
||||
else IF_KEY_RETURN( "LCONTROL", VK_LCONTROL);
|
||||
else IF_KEY_RETURN( "LSHIFT", VK_LSHIFT);
|
||||
else IF_KEY_RETURN( "LALT", VK_LMENU);
|
||||
else IF_KEY_RETURN( "LSYSTEM", VK_LWIN);
|
||||
else IF_KEY_RETURN( "RCONTROL", VK_RCONTROL);
|
||||
else IF_KEY_RETURN( "RSHIFT", VK_RSHIFT);
|
||||
else IF_KEY_RETURN( "RALT", VK_RMENU);
|
||||
else IF_KEY_RETURN( "RSYSTEM", VK_RWIN);
|
||||
else IF_KEY_RETURN( "APPS", VK_APPS);
|
||||
else IF_KEY_RETURN( "OEM4", VK_OEM_4);
|
||||
else IF_KEY_RETURN( "OEM6", VK_OEM_6);
|
||||
else IF_KEY_RETURN( "OEM1", VK_OEM_1);
|
||||
else IF_KEY_RETURN( "OEMCOMMA", VK_OEM_COMMA);
|
||||
else IF_KEY_RETURN( "OEMPERIOD", VK_OEM_PERIOD);
|
||||
else IF_KEY_RETURN( "OEM7", VK_OEM_7);
|
||||
else IF_KEY_RETURN( "OEM2", VK_OEM_2);
|
||||
else IF_KEY_RETURN( "OEM5", VK_OEM_5);
|
||||
else IF_KEY_RETURN( "OEM3", VK_OEM_3);
|
||||
else IF_KEY_RETURN( "OEM+", VK_OEM_PLUS);
|
||||
else IF_KEY_RETURN( "OEM-", VK_OEM_MINUS);
|
||||
else IF_KEY_RETURN( " ", VK_SPACE);
|
||||
else IF_KEY_RETURN( "SPACE", VK_SPACE);
|
||||
else IF_KEY_RETURN( "ENTER", VK_RETURN);
|
||||
else IF_KEY_RETURN( "BACK", VK_BACK);
|
||||
else IF_KEY_RETURN( "TAB", VK_TAB);
|
||||
else IF_KEY_RETURN( "PRIOR", VK_PRIOR);
|
||||
else IF_KEY_RETURN( "NEXT", VK_NEXT);
|
||||
else IF_KEY_RETURN( "END", VK_END);
|
||||
else IF_KEY_RETURN( "HOME", VK_HOME);
|
||||
else IF_KEY_RETURN( "INSERT", VK_INSERT);
|
||||
else IF_KEY_RETURN( "DELETE", VK_DELETE);
|
||||
else IF_KEY_RETURN( "+", VK_ADD);
|
||||
else IF_KEY_RETURN( "-", VK_SUBTRACT);
|
||||
else IF_KEY_RETURN( "*", VK_MULTIPLY);
|
||||
else IF_KEY_RETURN( "/", VK_DIVIDE);
|
||||
else IF_KEY_RETURN( "LEFT", VK_LEFT);
|
||||
else IF_KEY_RETURN( "RIGHT", VK_RIGHT);
|
||||
else IF_KEY_RETURN( "UP", VK_UP);
|
||||
else IF_KEY_RETURN( "DOWN", VK_DOWN);
|
||||
else IF_KEY_RETURN( "NUM0", VK_NUMPAD0);
|
||||
else IF_KEY_RETURN( "NUM1", VK_NUMPAD1);
|
||||
else IF_KEY_RETURN( "NUM2", VK_NUMPAD2);
|
||||
else IF_KEY_RETURN( "NUM3", VK_NUMPAD3);
|
||||
else IF_KEY_RETURN( "NUM4", VK_NUMPAD4);
|
||||
else IF_KEY_RETURN( "NUM5", VK_NUMPAD5);
|
||||
else IF_KEY_RETURN( "NUM6", VK_NUMPAD6);
|
||||
else IF_KEY_RETURN( "NUM7", VK_NUMPAD7);
|
||||
else IF_KEY_RETURN( "NUM8", VK_NUMPAD8);
|
||||
else IF_KEY_RETURN( "NUM9", VK_NUMPAD9);
|
||||
else IF_KEY_RETURN( "F1", VK_F1);
|
||||
else IF_KEY_RETURN( "F2", VK_F2);
|
||||
else IF_KEY_RETURN( "F3", VK_F3);
|
||||
else IF_KEY_RETURN( "F4", VK_F4);
|
||||
else IF_KEY_RETURN( "F5", VK_F5);
|
||||
else IF_KEY_RETURN( "F6", VK_F6);
|
||||
else IF_KEY_RETURN( "F7", VK_F7);
|
||||
else IF_KEY_RETURN( "F8", VK_F8);
|
||||
else IF_KEY_RETURN( "F9", VK_F9);
|
||||
else IF_KEY_RETURN( "F10", VK_F10);
|
||||
else IF_KEY_RETURN( "F11", VK_F11);
|
||||
else IF_KEY_RETURN( "F12", VK_F12);
|
||||
else IF_KEY_RETURN( "F13", VK_F13);
|
||||
else IF_KEY_RETURN( "F14", VK_F14);
|
||||
else IF_KEY_RETURN( "F15", VK_F15);
|
||||
else IF_KEY_RETURN( "PAUSE", VK_PAUSE);
|
||||
|
||||
else if ( name == "MOUSE1" ) return VK_LBUTTON;
|
||||
else if ( name == "MOUSE2" ) return VK_RBUTTON;
|
||||
else if ( name == "MOUSE3" ) return VK_MBUTTON;
|
||||
else if ( name == "XBUTTON1" ) return VK_XBUTTON1;
|
||||
else if ( name == "XBUTTON2" ) return VK_XBUTTON2;
|
||||
else IF_KEY_RETURN( "MOUSE1", VK_LBUTTON);
|
||||
else IF_KEY_RETURN( "MOUSE2", VK_RBUTTON);
|
||||
else IF_KEY_RETURN( "MOUSE3", VK_MBUTTON);
|
||||
else IF_KEY_RETURN( "XBUTTON1", VK_XBUTTON1);
|
||||
else IF_KEY_RETURN( "XBUTTON2", VK_XBUTTON2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -704,125 +710,126 @@ bool spec::win32::Window::hasFocus() const {
|
||||
void spec::win32::Window::bufferInputs() {
|
||||
uf::Window::focused = this->hasFocus();
|
||||
|
||||
#define GET_KEYSTATE(X) uf::Window::focused ? GetAsyncKeyState(X) & 0x8000 : false;
|
||||
#define GET_KEYSTATE(X) uf::Window::focused ? GetAsyncKeyState(X) & 0x8000 : false;
|
||||
#define STORE_KEYSTATE(K, V) uf::inputs::kbm::states::K = GET_KEYSTATE(V);
|
||||
|
||||
uf::inputs::kbm::states::LShift = GET_KEYSTATE(VK_LSHIFT);
|
||||
uf::inputs::kbm::states::RShift = GET_KEYSTATE(VK_RSHIFT);
|
||||
STORE_KEYSTATE(LShift, VK_LSHIFT);
|
||||
STORE_KEYSTATE(RShift, VK_RSHIFT);
|
||||
|
||||
uf::inputs::kbm::states::LAlt = GET_KEYSTATE(VK_LMENU);
|
||||
uf::inputs::kbm::states::RAlt = GET_KEYSTATE(VK_RMENU);
|
||||
STORE_KEYSTATE(LAlt, VK_LMENU);
|
||||
STORE_KEYSTATE(RAlt, VK_RMENU);
|
||||
|
||||
uf::inputs::kbm::states::LControl = GET_KEYSTATE(VK_LCONTROL);
|
||||
uf::inputs::kbm::states::RControl = GET_KEYSTATE(VK_RCONTROL);
|
||||
STORE_KEYSTATE(LControl, VK_LCONTROL);
|
||||
STORE_KEYSTATE(RControl, VK_RCONTROL);
|
||||
|
||||
uf::inputs::kbm::states::LSystem = GET_KEYSTATE(VK_LWIN);
|
||||
uf::inputs::kbm::states::RSystem = GET_KEYSTATE(VK_RWIN);
|
||||
STORE_KEYSTATE(LSystem, VK_LWIN);
|
||||
STORE_KEYSTATE(RSystem, VK_RWIN);
|
||||
|
||||
uf::inputs::kbm::states::Menu = GET_KEYSTATE(VK_APPS);
|
||||
uf::inputs::kbm::states::SemiColon = GET_KEYSTATE(VK_OEM_1);
|
||||
uf::inputs::kbm::states::Slash = GET_KEYSTATE(VK_OEM_2);
|
||||
uf::inputs::kbm::states::Equal = GET_KEYSTATE(VK_OEM_PLUS);
|
||||
uf::inputs::kbm::states::Dash = GET_KEYSTATE(VK_OEM_MINUS);
|
||||
uf::inputs::kbm::states::LBracket = GET_KEYSTATE(VK_OEM_4);
|
||||
uf::inputs::kbm::states::RBracket = GET_KEYSTATE(VK_OEM_6);
|
||||
uf::inputs::kbm::states::Comma = GET_KEYSTATE(VK_OEM_COMMA);
|
||||
uf::inputs::kbm::states::Period = GET_KEYSTATE(VK_OEM_PERIOD);
|
||||
uf::inputs::kbm::states::Quote = GET_KEYSTATE(VK_OEM_7);
|
||||
uf::inputs::kbm::states::BackSlash = GET_KEYSTATE(VK_OEM_5);
|
||||
uf::inputs::kbm::states::Tilde = GET_KEYSTATE(VK_OEM_3);
|
||||
STORE_KEYSTATE(Menu, VK_APPS);
|
||||
STORE_KEYSTATE(SemiColon, VK_OEM_1);
|
||||
STORE_KEYSTATE(Slash, VK_OEM_2);
|
||||
STORE_KEYSTATE(Equal, VK_OEM_PLUS);
|
||||
STORE_KEYSTATE(Dash, VK_OEM_MINUS);
|
||||
STORE_KEYSTATE(LBracket, VK_OEM_4);
|
||||
STORE_KEYSTATE(RBracket, VK_OEM_6);
|
||||
STORE_KEYSTATE(Comma, VK_OEM_COMMA);
|
||||
STORE_KEYSTATE(Period, VK_OEM_PERIOD);
|
||||
STORE_KEYSTATE(Quote, VK_OEM_7);
|
||||
STORE_KEYSTATE(BackSlash, VK_OEM_5);
|
||||
STORE_KEYSTATE(Tilde, VK_OEM_3);
|
||||
|
||||
uf::inputs::kbm::states::Escape = GET_KEYSTATE(VK_ESCAPE);
|
||||
uf::inputs::kbm::states::Space = GET_KEYSTATE(VK_SPACE);
|
||||
uf::inputs::kbm::states::Enter = GET_KEYSTATE(VK_RETURN);
|
||||
uf::inputs::kbm::states::BackSpace = GET_KEYSTATE(VK_BACK);
|
||||
uf::inputs::kbm::states::Tab = GET_KEYSTATE(VK_TAB);
|
||||
uf::inputs::kbm::states::PageUp = GET_KEYSTATE(VK_PRIOR);
|
||||
uf::inputs::kbm::states::PageDown = GET_KEYSTATE(VK_NEXT);
|
||||
uf::inputs::kbm::states::End = GET_KEYSTATE(VK_END);
|
||||
uf::inputs::kbm::states::Home = GET_KEYSTATE(VK_HOME);
|
||||
uf::inputs::kbm::states::Insert = GET_KEYSTATE(VK_INSERT);
|
||||
uf::inputs::kbm::states::Delete = GET_KEYSTATE(VK_DELETE);
|
||||
uf::inputs::kbm::states::Add = GET_KEYSTATE(VK_ADD);
|
||||
uf::inputs::kbm::states::Subtract = GET_KEYSTATE(VK_SUBTRACT);
|
||||
uf::inputs::kbm::states::Multiply = GET_KEYSTATE(VK_MULTIPLY);
|
||||
uf::inputs::kbm::states::Divide = GET_KEYSTATE(VK_DIVIDE);
|
||||
uf::inputs::kbm::states::Pause = GET_KEYSTATE(VK_PAUSE);
|
||||
STORE_KEYSTATE(Escape, VK_ESCAPE);
|
||||
STORE_KEYSTATE(Space, VK_SPACE);
|
||||
STORE_KEYSTATE(Enter, VK_RETURN);
|
||||
STORE_KEYSTATE(BackSpace, VK_BACK);
|
||||
STORE_KEYSTATE(Tab, VK_TAB);
|
||||
STORE_KEYSTATE(PageUp, VK_PRIOR);
|
||||
STORE_KEYSTATE(PageDown, VK_NEXT);
|
||||
STORE_KEYSTATE(End, VK_END);
|
||||
STORE_KEYSTATE(Home, VK_HOME);
|
||||
STORE_KEYSTATE(Insert, VK_INSERT);
|
||||
STORE_KEYSTATE(Delete, VK_DELETE);
|
||||
STORE_KEYSTATE(Add, VK_ADD);
|
||||
STORE_KEYSTATE(Subtract, VK_SUBTRACT);
|
||||
STORE_KEYSTATE(Multiply, VK_MULTIPLY);
|
||||
STORE_KEYSTATE(Divide, VK_DIVIDE);
|
||||
STORE_KEYSTATE(Pause, VK_PAUSE);
|
||||
|
||||
uf::inputs::kbm::states::F1 = GET_KEYSTATE(VK_F1);
|
||||
uf::inputs::kbm::states::F2 = GET_KEYSTATE(VK_F2);
|
||||
uf::inputs::kbm::states::F3 = GET_KEYSTATE(VK_F3);
|
||||
uf::inputs::kbm::states::F4 = GET_KEYSTATE(VK_F4);
|
||||
uf::inputs::kbm::states::F5 = GET_KEYSTATE(VK_F5);
|
||||
uf::inputs::kbm::states::F6 = GET_KEYSTATE(VK_F6);
|
||||
uf::inputs::kbm::states::F7 = GET_KEYSTATE(VK_F7);
|
||||
uf::inputs::kbm::states::F8 = GET_KEYSTATE(VK_F8);
|
||||
uf::inputs::kbm::states::F9 = GET_KEYSTATE(VK_F9);
|
||||
uf::inputs::kbm::states::F10 = GET_KEYSTATE(VK_F10);
|
||||
uf::inputs::kbm::states::F11 = GET_KEYSTATE(VK_F11);
|
||||
uf::inputs::kbm::states::F12 = GET_KEYSTATE(VK_F12);
|
||||
uf::inputs::kbm::states::F13 = GET_KEYSTATE(VK_F13);
|
||||
uf::inputs::kbm::states::F14 = GET_KEYSTATE(VK_F14);
|
||||
uf::inputs::kbm::states::F15 = GET_KEYSTATE(VK_F15);
|
||||
STORE_KEYSTATE(F1, VK_F1);
|
||||
STORE_KEYSTATE(F2, VK_F2);
|
||||
STORE_KEYSTATE(F3, VK_F3);
|
||||
STORE_KEYSTATE(F4, VK_F4);
|
||||
STORE_KEYSTATE(F5, VK_F5);
|
||||
STORE_KEYSTATE(F6, VK_F6);
|
||||
STORE_KEYSTATE(F7, VK_F7);
|
||||
STORE_KEYSTATE(F8, VK_F8);
|
||||
STORE_KEYSTATE(F9, VK_F9);
|
||||
STORE_KEYSTATE(F10, VK_F10);
|
||||
STORE_KEYSTATE(F11, VK_F11);
|
||||
STORE_KEYSTATE(F12, VK_F12);
|
||||
STORE_KEYSTATE(F13, VK_F13);
|
||||
STORE_KEYSTATE(F14, VK_F14);
|
||||
STORE_KEYSTATE(F15, VK_F15);
|
||||
|
||||
uf::inputs::kbm::states::Left = GET_KEYSTATE(VK_LEFT);
|
||||
uf::inputs::kbm::states::Right = GET_KEYSTATE(VK_RIGHT);
|
||||
uf::inputs::kbm::states::Up = GET_KEYSTATE(VK_UP);
|
||||
uf::inputs::kbm::states::Down = GET_KEYSTATE(VK_DOWN);
|
||||
STORE_KEYSTATE(Left, VK_LEFT);
|
||||
STORE_KEYSTATE(Right, VK_RIGHT);
|
||||
STORE_KEYSTATE(Up, VK_UP);
|
||||
STORE_KEYSTATE(Down, VK_DOWN);
|
||||
|
||||
uf::inputs::kbm::states::Numpad0 = GET_KEYSTATE(VK_NUMPAD0);
|
||||
uf::inputs::kbm::states::Numpad1 = GET_KEYSTATE(VK_NUMPAD1);
|
||||
uf::inputs::kbm::states::Numpad2 = GET_KEYSTATE(VK_NUMPAD2);
|
||||
uf::inputs::kbm::states::Numpad3 = GET_KEYSTATE(VK_NUMPAD3);
|
||||
uf::inputs::kbm::states::Numpad4 = GET_KEYSTATE(VK_NUMPAD4);
|
||||
uf::inputs::kbm::states::Numpad5 = GET_KEYSTATE(VK_NUMPAD5);
|
||||
uf::inputs::kbm::states::Numpad6 = GET_KEYSTATE(VK_NUMPAD6);
|
||||
uf::inputs::kbm::states::Numpad7 = GET_KEYSTATE(VK_NUMPAD7);
|
||||
uf::inputs::kbm::states::Numpad8 = GET_KEYSTATE(VK_NUMPAD8);
|
||||
uf::inputs::kbm::states::Numpad9 = GET_KEYSTATE(VK_NUMPAD9);
|
||||
STORE_KEYSTATE(Numpad0, VK_NUMPAD0);
|
||||
STORE_KEYSTATE(Numpad1, VK_NUMPAD1);
|
||||
STORE_KEYSTATE(Numpad2, VK_NUMPAD2);
|
||||
STORE_KEYSTATE(Numpad3, VK_NUMPAD3);
|
||||
STORE_KEYSTATE(Numpad4, VK_NUMPAD4);
|
||||
STORE_KEYSTATE(Numpad5, VK_NUMPAD5);
|
||||
STORE_KEYSTATE(Numpad6, VK_NUMPAD6);
|
||||
STORE_KEYSTATE(Numpad7, VK_NUMPAD7);
|
||||
STORE_KEYSTATE(Numpad8, VK_NUMPAD8);
|
||||
STORE_KEYSTATE(Numpad9, VK_NUMPAD9);
|
||||
|
||||
uf::inputs::kbm::states::Q = GET_KEYSTATE('Q');
|
||||
uf::inputs::kbm::states::W = GET_KEYSTATE('W');
|
||||
uf::inputs::kbm::states::E = GET_KEYSTATE('E');
|
||||
uf::inputs::kbm::states::R = GET_KEYSTATE('R');
|
||||
uf::inputs::kbm::states::T = GET_KEYSTATE('T');
|
||||
uf::inputs::kbm::states::Y = GET_KEYSTATE('Y');
|
||||
uf::inputs::kbm::states::U = GET_KEYSTATE('U');
|
||||
uf::inputs::kbm::states::I = GET_KEYSTATE('I');
|
||||
uf::inputs::kbm::states::O = GET_KEYSTATE('O');
|
||||
uf::inputs::kbm::states::P = GET_KEYSTATE('P');
|
||||
STORE_KEYSTATE(Q, 'Q');
|
||||
STORE_KEYSTATE(W, 'W');
|
||||
STORE_KEYSTATE(E, 'E');
|
||||
STORE_KEYSTATE(R, 'R');
|
||||
STORE_KEYSTATE(T, 'T');
|
||||
STORE_KEYSTATE(Y, 'Y');
|
||||
STORE_KEYSTATE(U, 'U');
|
||||
STORE_KEYSTATE(I, 'I');
|
||||
STORE_KEYSTATE(O, 'O');
|
||||
STORE_KEYSTATE(P, 'P');
|
||||
|
||||
uf::inputs::kbm::states::A = GET_KEYSTATE('A');
|
||||
uf::inputs::kbm::states::S = GET_KEYSTATE('S');
|
||||
uf::inputs::kbm::states::D = GET_KEYSTATE('D');
|
||||
uf::inputs::kbm::states::F = GET_KEYSTATE('F');
|
||||
uf::inputs::kbm::states::G = GET_KEYSTATE('G');
|
||||
uf::inputs::kbm::states::H = GET_KEYSTATE('H');
|
||||
uf::inputs::kbm::states::J = GET_KEYSTATE('J');
|
||||
uf::inputs::kbm::states::K = GET_KEYSTATE('K');
|
||||
uf::inputs::kbm::states::L = GET_KEYSTATE('L');
|
||||
STORE_KEYSTATE(A, 'A');
|
||||
STORE_KEYSTATE(S, 'S');
|
||||
STORE_KEYSTATE(D, 'D');
|
||||
STORE_KEYSTATE(F, 'F');
|
||||
STORE_KEYSTATE(G, 'G');
|
||||
STORE_KEYSTATE(H, 'H');
|
||||
STORE_KEYSTATE(J, 'J');
|
||||
STORE_KEYSTATE(K, 'K');
|
||||
STORE_KEYSTATE(L, 'L');
|
||||
|
||||
uf::inputs::kbm::states::Z = GET_KEYSTATE('Z');
|
||||
uf::inputs::kbm::states::X = GET_KEYSTATE('X');
|
||||
uf::inputs::kbm::states::C = GET_KEYSTATE('C');
|
||||
uf::inputs::kbm::states::V = GET_KEYSTATE('V');
|
||||
uf::inputs::kbm::states::B = GET_KEYSTATE('B');
|
||||
uf::inputs::kbm::states::N = GET_KEYSTATE('N');
|
||||
uf::inputs::kbm::states::M = GET_KEYSTATE('M');
|
||||
STORE_KEYSTATE(Z, 'Z');
|
||||
STORE_KEYSTATE(X, 'X');
|
||||
STORE_KEYSTATE(C, 'C');
|
||||
STORE_KEYSTATE(V, 'V');
|
||||
STORE_KEYSTATE(B, 'B');
|
||||
STORE_KEYSTATE(N, 'N');
|
||||
STORE_KEYSTATE(M, 'M');
|
||||
|
||||
uf::inputs::kbm::states::Num1 = GET_KEYSTATE('1');
|
||||
uf::inputs::kbm::states::Num2 = GET_KEYSTATE('2');
|
||||
uf::inputs::kbm::states::Num3 = GET_KEYSTATE('3');
|
||||
uf::inputs::kbm::states::Num4 = GET_KEYSTATE('4');
|
||||
uf::inputs::kbm::states::Num5 = GET_KEYSTATE('5');
|
||||
uf::inputs::kbm::states::Num6 = GET_KEYSTATE('6');
|
||||
uf::inputs::kbm::states::Num7 = GET_KEYSTATE('7');
|
||||
uf::inputs::kbm::states::Num8 = GET_KEYSTATE('8');
|
||||
uf::inputs::kbm::states::Num9 = GET_KEYSTATE('9');
|
||||
uf::inputs::kbm::states::Num0 = GET_KEYSTATE('0');
|
||||
STORE_KEYSTATE(Num1, '1');
|
||||
STORE_KEYSTATE(Num2, '2');
|
||||
STORE_KEYSTATE(Num3, '3');
|
||||
STORE_KEYSTATE(Num4, '4');
|
||||
STORE_KEYSTATE(Num5, '5');
|
||||
STORE_KEYSTATE(Num6, '6');
|
||||
STORE_KEYSTATE(Num7, '7');
|
||||
STORE_KEYSTATE(Num8, '8');
|
||||
STORE_KEYSTATE(Num9, '9');
|
||||
STORE_KEYSTATE(Num0, '0');
|
||||
|
||||
uf::inputs::kbm::states::Mouse1 = GET_KEYSTATE(VK_LBUTTON);
|
||||
uf::inputs::kbm::states::Mouse2 = GET_KEYSTATE(VK_RBUTTON);
|
||||
uf::inputs::kbm::states::Mouse3 = GET_KEYSTATE(VK_MBUTTON);
|
||||
STORE_KEYSTATE(Mouse1, VK_LBUTTON);
|
||||
STORE_KEYSTATE(Mouse2, VK_RBUTTON);
|
||||
STORE_KEYSTATE(Mouse3, VK_MBUTTON);
|
||||
|
||||
uf::inputs::kbm::states::MouseWheel = uf::Window::focused ? ::lastMouseWheel : 0;
|
||||
::lastMouseWheel = 0;
|
||||
@ -896,73 +903,11 @@ bool spec::win32::Window::pollEvents( bool block ) {
|
||||
|
||||
while ( !this->m_events.empty() ) {
|
||||
auto& event = this->m_events.front();
|
||||
/*
|
||||
if ( event.payload.is<uf::stl::string>() ) {
|
||||
ext::json::Value payload = uf::Serializer( event.payload.as<uf::stl::string>() );
|
||||
uf::hooks.call( "window:Event", payload );
|
||||
uf::hooks.call( event.name, payload );
|
||||
} else if ( event.payload.is<uf::Serializer>() ) {
|
||||
uf::Serializer& payload = event.payload.as<uf::Serializer>();
|
||||
uf::hooks.call( "window:Event", payload );
|
||||
uf::hooks.call( event.name, payload );
|
||||
} else if ( event.payload.is<ext::json::Value>() ) {
|
||||
ext::json::Value& payload = event.payload.as<ext::json::Value>();
|
||||
uf::hooks.call( "window:Event", payload );
|
||||
uf::hooks.call( event.name, payload );
|
||||
} else */ {
|
||||
uf::hooks.call( "window:Event", event.payload );
|
||||
uf::hooks.call( event.name, event.payload );
|
||||
}
|
||||
uf::hooks.call( "window:Event", event.payload );
|
||||
uf::hooks.call( event.name, event.payload );
|
||||
this->m_events.pop();
|
||||
}
|
||||
return true;
|
||||
#if 0
|
||||
/* Empty; look for something! */ if ( this->m_events.readable.empty() && this->m_events.optimal.empty() ) {
|
||||
do {
|
||||
this->processEvents();
|
||||
} while ( block && this->m_events.readable.empty() && this->m_events.optimal.empty() );
|
||||
}
|
||||
|
||||
if ( uf::hooks.prefersReadable() ) // Should we handle events in a readable format...
|
||||
/* Process events parsed in a readable format */ {
|
||||
// process things
|
||||
while ( !this->m_events.readable.empty() ) {
|
||||
auto& event = this->m_events.readable.front();
|
||||
uf::hooks.call( event.name, event.argument );
|
||||
/*
|
||||
try {
|
||||
uf::hooks.call( "window:Event", event.argument );
|
||||
uf::hooks.call( event.name, event.argument );
|
||||
// uf::iostream << event.name << "\t" << event.argument << "\n";
|
||||
} catch ( ... ) {
|
||||
// Let the hook handler handle the exceptions
|
||||
}
|
||||
*/
|
||||
this->m_events.readable.pop();
|
||||
}
|
||||
// this->m_events.optimal.clear(); // flush queue in case
|
||||
} else // ... or in an optimal format?
|
||||
/* Process events parsed in an optimal format */ {
|
||||
// process things
|
||||
while ( !this->m_events.optimal.empty() ) {
|
||||
auto& event = this->m_events.optimal.front();
|
||||
uf::hooks.call( event.name, event.argument );
|
||||
/*
|
||||
try {
|
||||
uf::hooks.call( "window:Event", event.argument );
|
||||
uf::hooks.call( event.name, event.argument );
|
||||
// uf::iostream << event.name << "\t" << event.argument << "\n";
|
||||
} catch ( ... ) {
|
||||
// Let the hook handler handle the exceptions
|
||||
}
|
||||
*/
|
||||
uf::userdata::destroy(event.argument);
|
||||
this->m_events.optimal.pop();
|
||||
}
|
||||
// this->m_events.readable.clear(); // flush queue in case
|
||||
}
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
void spec::win32::Window::registerWindowClass() {
|
||||
|
||||
@ -271,7 +271,7 @@ size_t uf::io::mtime( const uf::stl::string& _filename ) {
|
||||
return buffer.st_mtime;
|
||||
}
|
||||
bool uf::io::mkdir( const uf::stl::string& _filename ) {
|
||||
#if UF_ENV_DREAMCAST
|
||||
#if UF_ENV_DREAMCAST || UF_ENV_LINUX
|
||||
return false;
|
||||
#else
|
||||
uf::stl::string filename = sanitize(_filename);
|
||||
|
||||
@ -56,7 +56,7 @@ bool uf::IoStream::ncurses = false;
|
||||
uf::IoStream uf::iostream;
|
||||
|
||||
uf::IoStream::IoStream() {
|
||||
spec::terminal.setLocale();
|
||||
//spec::terminal.setLocale();
|
||||
}
|
||||
uf::IoStream::~IoStream() {
|
||||
}
|
||||
@ -326,7 +326,7 @@ std::ostream& operator<< ( std::ostream& os, uf::IoStream& io ) {
|
||||
}
|
||||
|
||||
uf::stl::string uf::IoStream::getColor() {
|
||||
return this->m_currentColor;
|
||||
return ""; // this->m_currentColor;
|
||||
}
|
||||
void uf::IoStream::setColor( const uf::stl::string& str ) {
|
||||
}
|
||||
|
||||
@ -17,11 +17,7 @@
|
||||
#define UF_SERIALIZER_AUTO_CONVERT 1
|
||||
#endif
|
||||
|
||||
//#define UF_MSG_DEBUG_(...) UF_MSG_DEBUG(__VA_ARGS__)
|
||||
#define UF_MSG_DEBUG_(...)
|
||||
|
||||
uf::Serializer::Serializer() {
|
||||
}
|
||||
// uf::Serializer::Serializer() {}
|
||||
uf::Serializer::Serializer( const uf::stl::string& str ) {
|
||||
this->deserialize(str);
|
||||
}
|
||||
|
||||
@ -29,7 +29,7 @@ void uf::thread::quit( pod::Thread& thread ) { if ( !thread.running ) return;
|
||||
|
||||
}
|
||||
void uf::thread::tick( pod::Thread& thread ) {
|
||||
#if !UF_ENV_DREAMCAST
|
||||
#if UF_ENV_WINDOWS
|
||||
bool res = SetThreadAffinityMask(GetCurrentThread(), (1u << thread.affinity));
|
||||
// if ( !res ) UF_THREAD_ANNOUNCE("Failed to set affinity of Thread #" << thread.uid << " (" << thread.name << " on core " << pthread_self() << "/" << thread.affinity << ")");
|
||||
#endif
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
#include <uf/utils/time/time.h> // time(r)
|
||||
|
||||
namespace {
|
||||
uf::Time<> zero = spec::time.getTime(); // Program epoch, used for getting time deltas (without uf::Timer)
|
||||
uf::Time<> zero = spec::time::getTime(); // Program epoch, used for getting time deltas (without uf::Timer)
|
||||
}
|
||||
// extern UF_API uf::Timer<> timer; // System timer, used for getting time deltas
|
||||
|
||||
@ -13,5 +13,5 @@ float uf::time::delta = 0;
|
||||
float uf::time::clamp = 0;
|
||||
|
||||
size_t uf::time::time() {
|
||||
return spec::time.unixTime();
|
||||
return spec::time::unixTime();
|
||||
}
|
||||
@ -1 +1 @@
|
||||
win64
|
||||
linux
|
||||
|
||||
11
makefiles/linux.clang.make
Normal file
11
makefiles/linux.clang.make
Normal file
@ -0,0 +1,11 @@
|
||||
ARCH = linux
|
||||
CDIR =
|
||||
CC = clang
|
||||
CXX = clang++
|
||||
OPTIMIZATIONS = -O3 -fstrict-aliasing -DUF_NO_EXCEPTIONS # -flto # -march=native
|
||||
WARNINGS = -Wall -Wno-pointer-arith -Wno-unused-function -Wno-unused-variable -Wno-switch -Wno-reorder-ctor -Wno-ignored-attributes -Wno-c++11-narrowing -Wno-unknown-pragmas -Wno-nullability-completeness -Wno-defaulted-function-deleted -Wno-mismatched-tags
|
||||
SANITIZE = -fsanitize=address # -fuse-ld=lld -fno-omit-frame-pointer
|
||||
FLAGS += -std=c++2b $(OPTIMIZATIONS) $(WARNINGS) $(SANITIZE) -fcolor-diagnostics -fansi-escape-codes
|
||||
|
||||
LIB_EXTENSION = so
|
||||
LIB_EXTENSION_A =
|
||||
10
makefiles/linux.gcc.make
Normal file
10
makefiles/linux.gcc.make
Normal file
@ -0,0 +1,10 @@
|
||||
ARCH = linux
|
||||
CDIR =
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
OPTIMIZATIONS = -O3 -fstrict-aliasing -DUF_NO_EXCEPTIONS
|
||||
WARNINGS = -Wall -Wno-attributes -Wno-dangling-reference -Wno-unknown-pragmas -Wno-unused-function -Wno-unused-variable -Wno-switch -Wno-reorder -Wno-sign-compare -Wno-unused-but-set-variable -Wno-ignored-attributes -Wno-narrowing -Wno-misleading-indentation
|
||||
FLAGS += -std=c++2b $(OPTIMIZATIONS) $(WARNINGS) -fdiagnostics-color=always
|
||||
|
||||
LIB_EXTENSION = so
|
||||
LIB_EXTENSION_A =
|
||||
@ -2,7 +2,7 @@ ARCH = win64
|
||||
CDIR =
|
||||
CC = clang
|
||||
CXX = clang++
|
||||
OPTIMIZATIONS = -O3 -fstrict-aliasing -DUF_NO_EXCEPTIONS -flto # -march=native
|
||||
OPTIMIZATIONS = -O3 -fstrict-aliasing -DUF_NO_EXCEPTIONS # -flto # -march=native
|
||||
WARNINGS = -Wall -Wno-pointer-arith -Wno-unused-function -Wno-unused-variable -Wno-switch -Wno-reorder-ctor -Wno-ignored-attributes -Wno-c++11-narrowing -Wno-unknown-pragmas -Wno-nullability-completeness -Wno-defaulted-function-deleted -Wno-mismatched-tags
|
||||
SANITIZE = -fuse-ld=lld # -fsanitize=address -fno-omit-frame-pointer
|
||||
SANITIZE = -fsanitize=address # -fuse-ld=lld -fno-omit-frame-pointer
|
||||
FLAGS += -std=c++2b $(OPTIMIZATIONS) $(WARNINGS) $(SANITIZE) -fcolor-diagnostics -fansi-escape-codes
|
||||
2
program.sh
Normal file → Executable file
2
program.sh
Normal file → Executable file
@ -1,5 +1,4 @@
|
||||
#!/bin/bash
|
||||
tskill program
|
||||
cd bin
|
||||
|
||||
ARCH=$(cat ./exe/default/arch)
|
||||
@ -7,6 +6,7 @@ CC=$(cat ./exe/default/cc)
|
||||
RENDERER=$(cat ./exe/default/renderer)
|
||||
|
||||
export PATH="$(pwd)/exe/lib/${ARCH}/:$(pwd)/exe/lib/${ARCH}/${CC}/:$(pwd)/exe/lib/${ARCH}/${CC}/${RENDERER}/:${PATH}"
|
||||
export LD_LIBRARY_PATH="$(pwd)/exe/lib/${ARCH}/:$(pwd)/exe/lib/${ARCH}/${CC}/:$(pwd)/exe/lib/${ARCH}/${CC}/${RENDERER}/:${LD_LIBRARY_PATH}"
|
||||
|
||||
echo PATH: ${PATH}
|
||||
echo Executing ./exe/program.${ARCH}.${CC}.${RENDERER}.exe $@
|
||||
|
||||
Loading…
Reference in New Issue
Block a user