Compare commits

...

13 Commits

Author SHA1 Message Date
Marco Tylus
8edad0b65e
Merge 8935c520c0 into 57fbf42475 2026-07-25 21:55:12 +02:00
fallenoak
57fbf42475 chore(ui): fix style nits in StringTo functions
Some checks are pending
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:cl compiler_name:MSVC cxx:cl os:windows-latest system_name:Windows test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:clang compiler_name:Clang cxx:clang++ os:macos-latest system_name:macOS test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:gcc compiler_name:GCC cxx:g++ os:ubuntu-latest system_name:Linux test_path:WhoaTest]) (push) Waiting to run
2026-07-25 12:41:57 -05:00
fallenoak
7ed3475059 chore(ui): consolidate StringTo functions in ui
Some checks are pending
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:cl compiler_name:MSVC cxx:cl os:windows-latest system_name:Windows test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:clang compiler_name:Clang cxx:clang++ os:macos-latest system_name:macOS test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:gcc compiler_name:GCC cxx:g++ os:ubuntu-latest system_name:Linux test_path:WhoaTest]) (push) Waiting to run
2026-07-24 23:34:54 -05:00
fallenoak
0163d91543 chore(util): tune up StringToDrawLayer
Some checks are pending
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:cl compiler_name:MSVC cxx:cl os:windows-latest system_name:Windows test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:clang compiler_name:Clang cxx:clang++ os:macos-latest system_name:macOS test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:gcc compiler_name:GCC cxx:g++ os:ubuntu-latest system_name:Linux test_path:WhoaTest]) (push) Waiting to run
2026-07-24 13:29:07 -05:00
fallenoak
dd3a0f6a81 fix(util): fix improper handling of BOTTOM in StringToJustify 2026-07-24 13:21:36 -05:00
aomizu
8935c520c0 feat: Add texture matrix transform support to Metal shaders for animated textures 2025-12-26 17:03:37 +09:00
aomizu
7cf7127810 feat: Implement color animation in Metal shaders by using diffuse and emissive vertex constants for output color. 2025-12-25 15:11:18 +09:00
aomizu
8fb51991e0 revert: remove non-metal shader init from Client.cpp 2025-12-25 13:24:07 +09:00
aomizu
7fdd22545f feat: Convert GxTex_Argb4444 textures to RGBA8 during Metal upload to simplify handling 2025-12-25 13:10:25 +09:00
aomizu
15eafe92d7 feat: Implement fog and point size in Metal shaders and refine render state processing for textures and other states. 2025-12-25 13:10:25 +09:00
aomizu
1ad3679f90 feat: Implement initial Metal graphics device with comprehensive shader system and pipeline management. 2025-12-25 13:10:25 +09:00
aomizu
81970958a8 feat: Add debug rendering pipeline to draw a triangle in the Metal backend. 2025-12-25 13:10:25 +09:00
aomizu
a9cad5238d init metal backend 2025-12-25 13:10:25 +09:00
37 changed files with 2242 additions and 248 deletions

View File

@ -32,6 +32,8 @@ if(WHOA_SYSTEM_MAC)
"-framework AppKit"
"-framework Carbon"
"-framework IOKit"
"-framework Metal"
"-framework QuartzCore"
)
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/mac/MainMenu.nib DESTINATION "bin")

View File

@ -0,0 +1,9 @@
#ifndef APP_MAC_ENGINE_MTL_LAYER_VIEW_H
#define APP_MAC_ENGINE_MTL_LAYER_VIEW_H
#include "app/mac/EngineGLLayerView.h"
@interface EngineMTLLayerView : EngineGLLayerView
@end
#endif

View File

@ -0,0 +1,36 @@
#include "app/mac/EngineMTLLayerView.h"
#import <QuartzCore/CAMetalLayer.h>
@implementation EngineMTLLayerView
- (CALayer*)makeBackingLayer {
return [CAMetalLayer layer];
}
- (id)initWithFrame:(NSRect)frame glWindow:(GLWindow*)window {
self = [super initWithFrame:frame glWindow:window];
if (self) {
[self setWantsLayer:YES];
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect {
// Rendering is driven by CGxDeviceMTL.
}
- (void)update {
[super update];
if (![self.layer isKindOfClass:[CAMetalLayer class]]) {
return;
}
CAMetalLayer* layer = (CAMetalLayer*)self.layer;
CGSize size = [self convertSizeToBacking:self.bounds.size];
layer.drawableSize = size;
}
@end

View File

@ -1,7 +1,9 @@
#include "app/mac/View.h"
#include "app/mac/EngineGLLayerView.h"
#include "app/mac/EngineMTLLayerView.h"
#include "app/mac/WindowCallbacks.h"
#include "gx/gll/GLWindow.h"
#include "gx/Device.hpp"
GLWindowCallbacks EngineViewCallbacks = {
&MacOnResized,
@ -23,5 +25,9 @@ void AssignEngineViewCallbacks(GLWindowCallbacks* callbacks) {
}
Class GetEngineViewClass() {
if (GxDevApi() == GxApi_Metal) {
return [EngineMTLLayerView class];
}
return [EngineGLLayerView class];
}

View File

@ -2,6 +2,7 @@
#include "app/mac/MacClient.h"
#include "event/Input.hpp"
#include "gx/gll/CGxDeviceGLL.hpp"
#include "gx/mtl/CGxDeviceMTL.hpp"
#include "gx/Device.hpp"
#include "gx/Window.hpp"
#include <bc/Debug.hpp>
@ -171,7 +172,11 @@ void MacOnResized(int32_t width, int32_t height, bool a3) {
return;
}
if (GxDevApi() == GxApi_GLL) {
static_cast<CGxDeviceGLL*>(g_theGxDevicePtr)->Resize(width, height);
} else if (GxDevApi() == GxApi_Metal) {
static_cast<CGxDeviceMTL*>(g_theGxDevicePtr)->Resize(width, height);
}
OsQueuePut(OS_INPUT_SIZE, width, height, 0, 0);

View File

@ -6,6 +6,7 @@
#include "gx/Adapter.hpp"
#include "gx/Device.hpp"
#include <storm/Array.hpp>
#include <cstdlib>
#include <cstring>
static CGxDevice* s_device;
@ -417,6 +418,13 @@ void ConsoleDeviceInitialize(const char* title) {
api = GxApi_GLL;
#endif
#if defined(WHOA_SYSTEM_MAC)
const char* apiOverride = getenv("WHOA_GX_API");
if (apiOverride && !strcmp(apiOverride, "metal")) {
api = GxApi_Metal;
}
#endif
s_device = GxDevCreate(api, OsWindowProc, format);
// TODO

View File

@ -3,9 +3,9 @@
#include "db/Db.hpp"
#include "glue/CGlueMgr.hpp"
#include "glue/CRealmList.hpp"
#include "util/StringTo.hpp"
#include "ui/FrameScript.hpp"
#include "ui/Types.hpp"
#include "ui/Util.hpp"
#include "util/Lua.hpp"
#include "util/Unimplemented.hpp"
#include <cstdint>

View File

@ -18,6 +18,7 @@
#if defined(WHOA_SYSTEM_MAC)
#include "gx/gll/CGxDeviceGLL.hpp"
#include "gx/mtl/CGxDeviceMTL.hpp"
#include "gx/mac/Display.hpp"
#include <ApplicationServices/ApplicationServices.h>
#include <OpenGL/OpenGL.h>
@ -117,6 +118,8 @@ int32_t CGxDevice::AdapterFormats(EGxApi api, TSGrowableArray<CGxFormat>& adapte
CGxDevice::OpenGlAdapterFormats(adapterFormats);
} else if (api == GxApi_GLL) {
CGxDevice::GLLAdapterFormats(adapterFormats);
} else if (api == GxApi_Metal) {
CGxDevice::OpenGlAdapterFormats(adapterFormats);
}
#elif defined(WHOA_SYSTEM_LINUX)
@ -228,6 +231,11 @@ CGxDevice* CGxDevice::NewGLL() {
auto m = SMemAlloc(sizeof(CGxDeviceGLL), __FILE__, __LINE__, 0x0);
return new (m) CGxDeviceGLL();
}
CGxDevice* CGxDevice::NewMTL() {
auto m = SMemAlloc(sizeof(CGxDeviceMTL), __FILE__, __LINE__, 0x0);
return new (m) CGxDeviceMTL();
}
#endif
CGxDevice* CGxDevice::NewOpenGl() {

View File

@ -77,6 +77,7 @@ class CGxDevice {
#endif
#if defined(WHOA_SYSTEM_MAC)
static CGxDevice* NewGLL();
static CGxDevice* NewMTL();
#endif
static CGxDevice* NewOpenGl();
static void OpenGlAdapterFormats(TSGrowableArray<CGxFormat>& adapterFormats);

View File

@ -20,6 +20,7 @@ if(WHOA_SYSTEM_MAC)
file(GLOB MAC_SOURCES
"gll/*.cpp"
"gll/*.mm"
"mtl/*.mm"
"mac/*.cpp"
)

View File

@ -24,6 +24,8 @@ CGxDevice* GxDevCreate(EGxApi api, int32_t (*windowProc)(void* window, uint32_t
device = CGxDevice::NewOpenGl();
} else if (api == GxApi_GLL) {
device = CGxDevice::NewGLL();
} else if (api == GxApi_Metal) {
device = CGxDevice::NewMTL();
} else {
// Error
}

View File

@ -35,7 +35,8 @@ enum EGxApi {
GxApi_D3d10 = 3,
GxApi_D3d11 = 4,
GxApi_GLL = 5,
GxApis_Last = 6
GxApi_Metal = 6,
GxApis_Last = 7
};
enum EGxBlend {

View File

@ -0,0 +1,81 @@
#ifndef GX_MTL_C_GX_DEVICE_MTL_HPP
#define GX_MTL_C_GX_DEVICE_MTL_HPP
#include "gx/CGxDevice.hpp"
#include "gx/gll/GLWindow.h"
class CGxBatch;
class CGxShader;
class CGxDeviceMTL : public CGxDevice {
public:
// Member variables
GLWindow m_window;
// Virtual member functions
void ITexMarkAsUpdated(CGxTex*) override;
void IRsSendToHw(EGxRenderState) override;
int32_t DeviceCreate(int32_t (*windowProc)(void* window, uint32_t message, uintptr_t wparam, intptr_t lparam), const CGxFormat&) override;
int32_t DeviceSetFormat(const CGxFormat&) override;
void* DeviceWindow() override;
void DeviceWM(EGxWM wm, uintptr_t param1, uintptr_t param2) override {};
void CapsWindowSize(CRect&) override;
void CapsWindowSizeInScreenCoords(CRect& dst) override;
void ScenePresent() override;
void SceneClear(uint32_t, CImVector) override;
void Draw(CGxBatch* batch, int32_t indexed) override;
void PoolSizeSet(CGxPool*, uint32_t) override;
char* BufLock(CGxBuf*) override;
int32_t BufUnlock(CGxBuf*, uint32_t) override;
void BufData(CGxBuf* buf, const void* data, size_t size, uintptr_t offset) override;
void TexDestroy(CGxTex* texId) override;
void IShaderCreate(CGxShader*) override;
void ShaderCreate(CGxShader*[], EGxShTarget, const char*, const char*, int32_t) override;
int32_t StereoEnabled(void) override;
void XformSetProjection(const C44Matrix& matrix) override;
// Member functions
CGxDeviceMTL();
void Resize(uint32_t width, uint32_t height);
private:
void ISetCaps(const CGxFormat& format);
void EnsureLibrary();
void BeginFrame();
void* GetPipeline(EGxVertexBufferFormat format, bool useColor, bool useSkin, bool useTex, int32_t blendMode);
void* GetPoolBuffer(CGxPool* pool);
void ITexCreate(CGxTex* texId);
void ITexUpload(CGxTex* texId);
void* GetTexture(CGxTex* texId);
void* GetSampler(CGxTex* texId);
void EnsureFallbackTexture();
void EnsureDepthTexture(uint32_t width, uint32_t height);
void* GetDepthState(bool depthTest, bool depthWrite, uint32_t depthFunc);
void* m_device = nullptr;
void* m_commandQueue = nullptr;
void* m_layer = nullptr;
void* m_shaderLibrary = nullptr;
void* m_pipelineColor[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineSolid[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineSkin[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineColorTex[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineSolidTex[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineSkinTex[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineColorTex2[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineSolidTex2[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_pipelineSkinTex2[GxVertexBufferFormats_Last][GxBlends_Last] = {};
void* m_frameCommandBuffer = nullptr;
void* m_frameEncoder = nullptr;
void* m_frameDrawable = nullptr;
uint32_t m_frameHasDraw = 0;
uint32_t m_clearMask = 0;
uint32_t m_clearColor = 0;
void* m_fallbackTexture = nullptr;
void* m_fallbackSampler = nullptr;
void* m_depthTexture = nullptr;
uint32_t m_depthWidth = 0;
uint32_t m_depthHeight = 0;
void* m_depthStates[2][2][4] = {};
};
#endif

1855
src/gx/mtl/CGxDeviceMTL.mm Normal file

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,6 @@
#include "ui/LoadXML.hpp"
#include "ui/Util.hpp"
#include "util/CStatus.hpp"
#include "util/StringTo.hpp"
#include <common/XML.hpp>
#include <storm/Error.hpp>

View File

@ -2,11 +2,11 @@
#include "gx/Coordinate.hpp"
#include "ui/CScriptRegion.hpp"
#include "ui/FrameScript_Object.hpp"
#include "ui/Util.hpp"
#include "ui/simple/CSimpleFontString.hpp"
#include "ui/simple/CSimpleTexture.hpp"
#include "ui/simple/CSimpleTop.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include "util/Unimplemented.hpp"
#include <cstdint>
#include <tempest/Rect.hpp>

View File

@ -1,5 +1,5 @@
#include "ui/Util.hpp"
#include <type_traits>
#include "util/Lua.hpp"
#include <storm/String.hpp>
const char* LanguageProcess(const char* string) {
@ -9,101 +9,248 @@ const char* LanguageProcess(const char* string) {
int32_t StringToBlendMode(const char* string, EGxBlend& blend) {
struct BlendEntry {
EGxBlend value;
const char* string;
EGxBlend value;
};
static BlendEntry blendMap[] = {
{ GxBlend_Opaque, "DISABLE" },
{ GxBlend_Alpha, "BLEND" },
{ GxBlend_AlphaKey, "ALPHAKEY" },
{ GxBlend_Add, "ADD" },
{ GxBlend_Mod, "MOD" }
{ "DISABLE", GxBlend_Opaque },
{ "BLEND", GxBlend_Alpha },
{ "ALPHAKEY", GxBlend_AlphaKey },
{ "ADD", GxBlend_Add },
{ "MOD", GxBlend_Mod },
};
for (int32_t i = 0; i < std::extent<decltype(blendMap)>::value; i++) {
if (!SStrCmpI(blendMap[i].string, string, 0x7FFFFFFFu)) {
blend = blendMap[i].value;
return 1;
for (const auto& entry : blendMap) {
if (!SStrCmpI(entry.string, string)) {
blend = entry.value;
return true;
}
}
return false;
}
int32_t StringToBOOL(const char* string) {
return StringToBOOL(string, false);
}
bool StringToBOOL(const char* string, int32_t def) {
if (!string) {
return def;
}
switch (*string) {
case '0':
case 'F':
case 'N':
case 'f':
case 'n':
return false;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 'T':
case 'Y':
case 't':
case 'y':
return true;
default:
if (!SStrCmpI(string, "off") || !SStrCmpI(string, "disabled")) {
return false;
}
if (!SStrCmpI(string, "on") || !SStrCmpI(string, "enabled")) {
return true;
}
return def;
}
}
bool StringToBOOL(lua_State* L, int32_t idx, int32_t def) {
switch (lua_type(L, idx)) {
case LUA_TNIL:
return false;
case LUA_TBOOLEAN:
return lua_toboolean(L, idx);
case LUA_TNUMBER:
return lua_tonumber(L, idx) != 0;
case LUA_TSTRING:
return StringToBOOL(lua_tostring(L, idx), def);
default:
return def;
}
}
uint64_t StringToClickAction(const char* string) {
if (!string || !*string) {
return 0;
}
if (!SStrCmpI(string, "LeftButtonDown")) {
return 1;
}
if (!SStrCmpI(string, "LeftButtonUp")) {
return 0x80000000;
}
if (!SStrCmpI(string, "MiddleButtonDown")) {
return 2;
}
if (!SStrCmpI(string, "MiddleButtonUp")) {
return 0;
}
if (!SStrCmpI(string, "RightButtonDown")) {
return 4;
}
if (!SStrCmpI(string, "RightButtonUp")) {
return 0;
}
// TODO remaining buttons
return 0;
}
int32_t StringToDrawLayer(const char* string, int32_t& layer) {
struct LayerEntry {
const char* string;
int32_t layer;
};
static LayerEntry layerMap[] = {
{ "BACKGROUND", DRAWLAYER_BACKGROUND },
{ "BORDER", DRAWLAYER_BACKGROUND_BORDER },
{ "ARTWORK", DRAWLAYER_ARTWORK },
{ "OVERLAY", DRAWLAYER_ARTWORK_OVERLAY },
{ "HIGHLIGHT", DRAWLAYER_HIGHLIGHT },
};
for (const auto& entry : layerMap) {
if (!SStrCmpI(string, entry.string)) {
layer = entry.layer;
return true;
}
}
return false;
}
int32_t StringToFramePoint(const char* string, FRAMEPOINT& point) {
struct FramePointEntry {
FRAMEPOINT value;
const char* string;
FRAMEPOINT value;
};
static FramePointEntry framePointMap[] = {
{ FRAMEPOINT_BOTTOM, "BOTTOM" },
{ FRAMEPOINT_BOTTOMLEFT, "BOTTOMLEFT" },
{ FRAMEPOINT_BOTTOMRIGHT, "BOTTOMRIGHT" },
{ FRAMEPOINT_CENTER, "CENTER" },
{ FRAMEPOINT_TOP, "TOP" },
{ FRAMEPOINT_TOPRIGHT, "TOPRIGHT" },
{ FRAMEPOINT_TOPLEFT, "TOPLEFT" },
{ FRAMEPOINT_LEFT, "LEFT" },
{ FRAMEPOINT_RIGHT, "RIGHT" }
{ "BOTTOM", FRAMEPOINT_BOTTOM },
{ "BOTTOMLEFT", FRAMEPOINT_BOTTOMLEFT },
{ "BOTTOMRIGHT", FRAMEPOINT_BOTTOMRIGHT },
{ "CENTER", FRAMEPOINT_CENTER },
{ "TOP", FRAMEPOINT_TOP },
{ "TOPRIGHT", FRAMEPOINT_TOPRIGHT },
{ "TOPLEFT", FRAMEPOINT_TOPLEFT },
{ "LEFT", FRAMEPOINT_LEFT },
{ "RIGHT", FRAMEPOINT_RIGHT },
};
for (int32_t i = 0; i < std::extent<decltype(framePointMap)>::value; i++) {
if (!SStrCmpI(framePointMap[i].string, string, 0x7FFFFFFFu)) {
point = framePointMap[i].value;
return 1;
for (const auto& entry : framePointMap) {
if (!SStrCmpI(entry.string, string)) {
point = entry.value;
return true;
}
}
return 0;
return false;
}
int32_t StringToFrameStrata(const char* string, FRAME_STRATA& strata) {
struct FrameStrataEntry {
FRAME_STRATA value;
const char* string;
FRAME_STRATA value;
};
// FRAME_STRATA_WORLD is hardcoded
static FrameStrataEntry frameStrataMap[] = {
{ FRAME_STRATA_BACKGROUND, "BACKGROUND" },
{ FRAME_STRATA_LOW, "LOW" },
{ FRAME_STRATA_MEDIUM, "MEDIUM" },
{ FRAME_STRATA_HIGH, "HIGH" },
{ FRAME_STRATA_DIALOG, "DIALOG" },
{ FRAME_STRATA_FULLSCREEN, "FULLSCREEN" },
{ FRAME_STRATA_FULLSCREEN_DIALOG, "FULLSCREEN_DIALOG" },
{ FRAME_STRATA_TOOLTIP, "TOOLTIP" }
{ "BACKGROUND", FRAME_STRATA_BACKGROUND },
{ "LOW", FRAME_STRATA_LOW },
{ "MEDIUM", FRAME_STRATA_MEDIUM },
{ "HIGH", FRAME_STRATA_HIGH },
{ "DIALOG", FRAME_STRATA_DIALOG },
{ "FULLSCREEN", FRAME_STRATA_FULLSCREEN },
{ "FULLSCREEN_DIALOG", FRAME_STRATA_FULLSCREEN_DIALOG },
{ "TOOLTIP", FRAME_STRATA_TOOLTIP },
};
for (int32_t i = 0; i < std::extent<decltype(frameStrataMap)>::value; i++) {
if (!SStrCmpI(frameStrataMap[i].string, string, 0x7FFFFFFFu)) {
strata = frameStrataMap[i].value;
return 1;
for (const auto& entry : frameStrataMap) {
if (!SStrCmpI(entry.string, string)) {
strata = entry.value;
return true;
}
}
return 0;
return false;
}
int32_t StringToJustify(const char* string, uint32_t& justify) {
struct JustifyEntry {
const char* string;
uint32_t value;
};
static JustifyEntry justifyMap[] = {
{ "LEFT", 0x1 },
{ "CENTER", 0x2 },
{ "RIGHT", 0x4 },
{ "TOP", 0x8 },
{ "MIDDLE", 0x10 },
{ "BOTTOM", 0x20 },
};
for (const auto& entry : justifyMap) {
if (!SStrCmpI(entry.string, string)) {
justify = entry.value;
return true;
}
}
return false;
}
int32_t StringToOrientation(const char* string, ORIENTATION& orientation) {
struct OrientationEntry {
ORIENTATION value;
const char* string;
ORIENTATION value;
};
static OrientationEntry orientationMap[] = {
{ ORIENTATION_HORIZONTAL, "HORIZONTAL" },
{ ORIENTATION_VERTICAL, "VERTICAL" },
{ "HORIZONTAL", ORIENTATION_HORIZONTAL },
{ "VERTICAL", ORIENTATION_VERTICAL },
};
for (auto& entry : orientationMap) {
for (const auto& entry : orientationMap) {
if (!SStrCmpI(entry.string, string)) {
orientation = entry.value;
return 1;
return true;
}
}
return 0;
return false;
}

View File

@ -5,14 +5,28 @@
#include "ui/Types.hpp"
#include <cstdint>
struct lua_State;
const char* LanguageProcess(const char* string);
int32_t StringToBlendMode(const char* string, EGxBlend& blend);
int32_t StringToBOOL(const char* string);
bool StringToBOOL(const char* string, int32_t def);
bool StringToBOOL(lua_State* L, int32_t idx, int32_t def);
uint64_t StringToClickAction(const char* string);
int32_t StringToDrawLayer(const char* string, int32_t& layer);
int32_t StringToFramePoint(const char* string, FRAMEPOINT& point);
int32_t StringToFrameStrata(const char* string, FRAME_STRATA& strata);
int32_t StringToJustify(const char* string, uint32_t& justify);
int32_t StringToOrientation(const char* string, ORIENTATION& orientation);
#endif

View File

@ -3,10 +3,10 @@
#include "gx/Coordinate.hpp"
#include "ui/FrameScript.hpp"
#include "ui/ScriptFunctionsShared.hpp"
#include "ui/Util.hpp"
#include "ui/game/CGGameUI.hpp"
#include "ui/game/Types.hpp"
#include "ui/simple/CSimpleTop.hpp"
#include "util/StringTo.hpp"
#include "util/Unimplemented.hpp"
namespace {

View File

@ -3,12 +3,12 @@
#include "object/Client.hpp"
#include "ui/FrameScript.hpp"
#include "ui/ScriptFunctionsSystem.hpp"
#include "ui/Util.hpp"
#include "ui/game/CGGameUI.hpp"
#include "ui/game/ScriptUtil.hpp"
#include "ui/game/Types.hpp"
#include "util/GUID.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include "util/Unimplemented.hpp"
#define NUM_SCRIPT_EVENTS 722

View File

@ -1,11 +1,11 @@
#include "ui/simple/CSimpleButtonScript.hpp"
#include "gx/Coordinate.hpp"
#include "ui/Util.hpp"
#include "ui/simple/CSimpleButton.hpp"
#include "ui/simple/CSimpleFont.hpp"
#include "ui/simple/CSimpleFontString.hpp"
#include "ui/simple/CSimpleTexture.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include "util/Unimplemented.hpp"
#include <cstdint>

View File

@ -1,8 +1,8 @@
#include "ui/simple/CSimpleCheckbox.hpp"
#include "ui/LoadXML.hpp"
#include "ui/Util.hpp"
#include "ui/simple/CSimpleCheckboxScript.hpp"
#include "ui/simple/CSimpleTexture.hpp"
#include "util/StringTo.hpp"
#include <common/XML.hpp>
int32_t CSimpleCheckbox::s_metatable;

View File

@ -1,7 +1,7 @@
#include "ui/simple/CSimpleCheckboxScript.hpp"
#include "ui/Util.hpp"
#include "ui/simple/CSimpleCheckbox.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include "util/Unimplemented.hpp"
#include <cstdint>

View File

@ -2,6 +2,7 @@
#include "gx/Coordinate.hpp"
#include "gx/Gx.hpp"
#include "ui/LoadXML.hpp"
#include "ui/Util.hpp"
#include "ui/simple/CSimpleEditBoxScript.hpp"
#include "ui/simple/CSimpleFontString.hpp"
#include "ui/simple/CSimpleFontedFrameFont.hpp"
@ -10,7 +11,6 @@
#include "util/Byte.hpp"
#include "util/CStatus.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include <common/XML.hpp>
#include <storm/String.hpp>
#include <storm/Unicode.hpp>

View File

@ -4,9 +4,9 @@
#include "ui/FrameXML.hpp"
#include "ui/LoadXML.hpp"
#include "ui/Types.hpp"
#include "ui/Util.hpp"
#include "ui/simple/CSimpleFontScript.hpp"
#include "util/CStatus.hpp"
#include "util/StringTo.hpp"
#include <common/XML.hpp>
#include <storm/String.hpp>

View File

@ -12,7 +12,6 @@
#include "ui/simple/CSimpleFrame.hpp"
#include "ui/simple/CSimpleTop.hpp"
#include "util/CStatus.hpp"
#include "util/StringTo.hpp"
#include <common/XML.hpp>
#include <storm/String.hpp>

View File

@ -1,8 +1,8 @@
#include "ui/simple/CSimpleFontStringScript.hpp"
#include "ui/Util.hpp"
#include "ui/simple/CSimpleFont.hpp"
#include "ui/simple/CSimpleFontString.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include "util/Unimplemented.hpp"
#include <cstdint>

View File

@ -8,6 +8,7 @@
#include "ui/FrameScript_Object.hpp"
#include "ui/FrameXML.hpp"
#include "ui/LoadXML.hpp"
#include "ui/Util.hpp"
#include "ui/simple/CSimpleFontString.hpp"
#include "ui/simple/CSimpleFrameScript.hpp"
#include "ui/simple/CSimpleRender.hpp"
@ -16,7 +17,6 @@
#include "ui/simple/CSimpleTitleRegion.hpp"
#include "ui/simple/CSimpleTop.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include <common/XML.hpp>
#include <storm/Error.hpp>
#include <storm/String.hpp>

View File

@ -3,12 +3,12 @@
#include "ui/CBackdropGenerator.hpp"
#include "ui/FrameScript.hpp"
#include "ui/FrameXML.hpp"
#include "ui/Util.hpp"
#include "ui/simple/CSimpleFont.hpp"
#include "ui/simple/CSimpleFontString.hpp"
#include "ui/simple/CSimpleFrame.hpp"
#include "ui/simple/CSimpleTexture.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include "util/Unimplemented.hpp"
#include <storm/Memory.hpp>
#include <algorithm>

View File

@ -1,11 +1,11 @@
#include "ui/simple/CSimpleHTML.hpp"
#include "ui/Util.hpp"
#include "ui/simple/CSimpleFontString.hpp"
#include "ui/simple/CSimpleFontedFrameFont.hpp"
#include "ui/simple/CSimpleHTMLScript.hpp"
#include "ui/simple/CSimpleTop.hpp"
#include "util/CStatus.hpp"
#include "util/SFile.hpp"
#include "util/StringTo.hpp"
#include <common/XML.hpp>
int32_t CSimpleHTML::s_metatable;

View File

@ -1,10 +1,10 @@
#include "ui/simple/CSimpleSlider.hpp"
#include "math/Utils.hpp"
#include "ui/LoadXML.hpp"
#include "ui/Util.hpp"
#include "ui/simple/CSimpleSliderScript.hpp"
#include "ui/simple/CSimpleTexture.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include <common/XML.hpp>
#include <tempest/Math.hpp>

View File

@ -1,10 +1,10 @@
#include "ui/simple/CSimpleStatusBar.hpp"
#include "ui/LoadXML.hpp"
#include "ui/Util.hpp"
#include "ui/simple/CSimpleStatusBarScript.hpp"
#include "ui/simple/CSimpleTexture.hpp"
#include "util/CStatus.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include <common/XML.hpp>
int32_t CSimpleStatusBar::s_metatable;

View File

@ -9,7 +9,6 @@
#include "ui/Util.hpp"
#include "ui/simple/CSimpleFrame.hpp"
#include "ui/simple/CSimpleTextureScript.hpp"
#include "util/StringTo.hpp"
#include <algorithm>
#include <climits>
#include <common/XML.hpp>

View File

@ -1,8 +1,8 @@
#include "ui/simple/CSimpleTextureScript.hpp"
#include "ui/Types.hpp"
#include "ui/Util.hpp"
#include "ui/simple/CSimpleTexture.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include "util/Unimplemented.hpp"
#include <cstdint>

View File

@ -1,161 +0,0 @@
#include "util/StringTo.hpp"
#include "util/Lua.hpp"
#include <storm/String.hpp>
uint64_t StringToClickAction(const char* actionStr) {
if (!actionStr || !*actionStr) {
return 0;
}
if (!SStrCmpI(actionStr, "LeftButtonDown", STORM_MAX_STR)) {
return 1;
}
if (!SStrCmpI(actionStr, "LeftButtonUp", STORM_MAX_STR)) {
return 0x80000000;
}
if (!SStrCmpI(actionStr, "MiddleButtonDown", STORM_MAX_STR)) {
return 2;
}
if (!SStrCmpI(actionStr, "MiddleButtonUp", STORM_MAX_STR)) {
return 0;
}
if (!SStrCmpI(actionStr, "RightButtonDown", STORM_MAX_STR)) {
return 4;
}
if (!SStrCmpI(actionStr, "RightButtonUp", STORM_MAX_STR)) {
return 0;
}
// TODO remaining buttons
return 0;
}
int32_t StringToBOOL(const char* str) {
return StringToBOOL(str, 0);
}
bool StringToBOOL(const char* str, int32_t def) {
if (!str) {
return def;
}
switch (*str) {
case '0':
case 'F':
case 'N':
case 'f':
case 'n':
return false;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 'T':
case 'Y':
case 't':
case 'y':
return true;
default:
if (!SStrCmpI(str, "off", 0x7FFFFFFFu) || !SStrCmpI(str, "disabled", 0x7FFFFFFFu)) {
return false;
}
if (!SStrCmpI(str, "on", 0x7FFFFFFFu) || !SStrCmpI(str, "enabled", 0x7FFFFFFFu)) {
return true;
}
return def;
}
}
bool StringToBOOL(lua_State* L, int32_t idx, int32_t def) {
bool result;
const char* str;
switch (lua_type(L, idx)) {
case LUA_TNIL:
result = false;
break;
case LUA_TBOOLEAN:
result = lua_toboolean(L, idx);
break;
case LUA_TNUMBER:
result = lua_tonumber(L, idx) != 0;
break;
case LUA_TSTRING:
str = lua_tostring(L, idx);
result = StringToBOOL(str, def);
break;
default:
result = def;
break;
}
return result;
}
int32_t StringToDrawLayer(const char* string, int32_t& layer) {
struct drawlayer {
int32_t layer;
const char* string;
};
static drawlayer array_drawlayer[5] = {
{ 0, "BACKGROUND" },
{ 1, "BORDER" },
{ 2, "ARTWORK" },
{ 3, "OVERLAY" },
{ 4, "HIGHLIGHT" }
};
for (int32_t i = 0; i < 5; i++) {
if (!SStrCmpI(array_drawlayer[i].string, string, 0x7FFFFFFFu)) {
layer = array_drawlayer[i].layer;
return 1;
}
}
return 0;
}
int32_t StringToJustify(const char* string, uint32_t& justify) {
struct JustifyEntry {
uint32_t value;
const char* string;
};
static JustifyEntry justifyMap[6] = {
{ 0x1, "LEFT" },
{ 0x2, "CENTER" },
{ 0x4, "RIGHT" },
{ 0x8, "TOP" },
{ 0x10, "MIDDLE" },
{ 0x20, "BOTTOM" }
};
for (int32_t i = 0; i < 5; i++) {
if (!SStrCmpI(justifyMap[i].string, string, 0x7FFFFFFFu)) {
justify = justifyMap[i].value;
return 1;
}
}
return 0;
}

View File

@ -1,20 +0,0 @@
#ifndef UTIL_STRING_TO_HPP
#define UTIL_STRING_TO_HPP
#include <cstdint>
struct lua_State;
uint64_t StringToClickAction(const char* actionStr);
int32_t StringToBOOL(const char*);
bool StringToBOOL(const char*, int32_t);
bool StringToBOOL(lua_State*, int32_t, int32_t);
int32_t StringToDrawLayer(const char*, int32_t&);
int32_t StringToJustify(const char*, uint32_t&);
#endif

View File

@ -23,6 +23,8 @@ if(WHOA_SYSTEM_MAC)
"-framework AppKit"
"-framework Carbon"
"-framework IOKit"
"-framework Metal"
"-framework QuartzCore"
)
endif()