diff --git a/.gitignore b/.gitignore index b7386bef..246d1664 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ .vscode *.DS_Store *.blend1 -paint/assets/models/*.onnx paint/assets/models/*.json paint/assets/models/*.txt paint/assets/models/*.zip diff --git a/base/plugins/plugins.c b/base/plugins/plugins.c deleted file mode 100644 index de1cbef1..00000000 --- a/base/plugins/plugins.c +++ /dev/null @@ -1,8 +0,0 @@ - -#include "plugin_api.h" - -void plugin_embed_base() { - JSValue global_obj = JS_GetGlobalObject(js_ctx); - - JS_FreeValue(js_ctx, global_obj); -} diff --git a/base/plugins/project.js b/base/plugins/project.js deleted file mode 100644 index 032ad27d..00000000 --- a/base/plugins/project.js +++ /dev/null @@ -1,6 +0,0 @@ -let project = new Project("plugins"); - -project.add_cfiles("plugin_api.c"); -project.add_cfiles("plugins.c"); - -return project; diff --git a/base/project.js b/base/project.js index 5882b099..19a6f688 100644 --- a/base/project.js +++ b/base/project.js @@ -1,254 +1,214 @@ +function add_gpu_backend(name) { + project.add_cfiles("sources/backends/" + name + "_gpu.*"); + project.add_define("BACKEND_GPU_H=\"backends/" + name + "_gpu.h\""); +} + +function add_sys_backend(name) { + project.add_cfiles("sources/backends/" + name + "_system.*"); + project.add_define("BACKEND_SYS_H=\"backends/" + name + "_system.h\""); +} + +function add_net_backend(name) { + project.add_cfiles("sources/backends/" + name + "_net.*"); + project.add_define("BACKEND_NET_H=\"backends/" + name + "_net.h\""); +} + +function add_thread_backend(name) { + project.add_cfiles("sources/backends/" + name + "_thread.*"); + project.add_define("BACKEND_THREAD_H=\"backends/" + name + "_thread.h\""); +} + +// flags: make.js/load_project let flags = globalThis.flags; -flags.embed = os_argv().indexOf("--embed") >= 0; // os_argv().indexOf("--debug") == -1; // clang 19 -flags.physics = true; -flags.with_d3dcompiler = true; -flags.with_nfd = true; -flags.with_compress = platform != "android"; -flags.with_image_write = true; -flags.with_iron = true; -flags.with_eval = true; -flags.with_plugins = true; - -let project = new Project("Base"); let dir = flags.name.substr(5).toLowerCase(); // ArmorPaint -> paint +let project = new Project("Base"); +project.add_include_dir("sources"); +project.add_include_dir("sources/libs"); +project.add_tsfiles("sources/ts"); +project.add_shaders("shaders/*.kong"); +project.add_assets("assets/*", { destination: "data/{name}" }); +project.add_assets("assets/licenses/**", { destination: "data/licenses/{name}" }); +project.add_assets("assets/themes/*.json", { destination: "data/themes/{name}" }); +project.add_cfiles("sources/*.c"); +// project.add_cfiles("sources/iron.c"); +project.add_cfiles("sources/libs/gc.c"); +project.add_cfiles("sources/libs/kong/dir.c"); +project.add_define("IRON_C_PATH=\"" + os_cwd() + "/build/iron.c" + "\""); +project.add_define("EMBED_H_PATH=\"" + os_cwd() + "/build/embed.h" + "\""); -if (!flags.lite) { - project.add_define("IDLE_SLEEP"); +if (platform == "windows") { + add_sys_backend("windows"); + add_net_backend("windows"); + add_thread_backend("windows"); + add_gpu_backend("direct3d12"); + project.add_define("_CRT_SECURE_NO_WARNINGS"); + project.add_define("_WINSOCK_DEPRECATED_NO_WARNINGS"); + project.add_define("IRON_DIRECT3D12"); + project.add_lib("dxguid"); + project.add_lib("Winhttp"); + project.add_lib("dxgi"); + project.add_lib("d3d12"); + project.add_lib("Dwmapi"); // DWMWA_USE_IMMERSIVE_DARK_MODE + if (flags.with_audio) { + project.add_lib("dsound"); + } + if (flags.with_gamepad) { + project.add_lib("dinput8"); + } + if (flags.with_d3dcompiler) { + project.add_define("WITH_D3DCOMPILER"); + project.add_lib("d3d11"); + project.add_lib("d3dcompiler"); + } +} +else if (platform == "linux") { + add_sys_backend("linux"); + add_thread_backend("posix"); + add_gpu_backend("vulkan"); + project.add_define("IRON_VULKAN"); + project.add_define("_POSIX_C_SOURCE=200112L"); + project.add_define("_XOPEN_SOURCE=600"); + project.add_lib("dl"); + project.add_lib("vulkan"); + if (flags.with_audio) { + project.add_lib("asound"); + } + if (flags.with_gamepad) { + project.add_lib("udev"); + } +} +else if (platform == "macos") { + add_sys_backend("macos"); + add_net_backend("apple"); + add_thread_backend("apple"); + add_gpu_backend("metal"); + project.add_cfiles("sources/backends/data/mac.plist"); + project.add_define("IRON_METAL"); +} +else if (platform == "ios") { + add_sys_backend("ios"); + add_net_backend("apple"); + add_thread_backend("apple"); + add_gpu_backend("metal"); + project.add_cfiles("sources/backends/data/ios.plist"); + project.add_cfiles("sources/backends/ios_file_dialog.m"); + project.add_define("IRON_METAL"); +} +else if (platform == "android") { + add_sys_backend("android"); + add_net_backend("posix"); + add_thread_backend("posix"); + add_gpu_backend("vulkan"); + project.add_cfiles("sources/backends/android_file_dialog.c"); + project.add_cfiles("sources/backends/android_http_request.c"); + project.add_cfiles("sources/backends/android_native_app_glue.c"); + project.add_define("IRON_ANDROID"); + project.add_define("IRON_VULKAN"); + project.add_define("VK_USE_PLATFORM_ANDROID_KHR"); + project.add_define("arm_android_rmb"); + project.add_lib("vulkan"); + project.add_lib("log"); + project.add_lib("android"); + if (flags.with_audio) { + project.add_lib("OpenSLES"); + } + project.target_options.android.package = flags.package; + project.target_options.android.permissions = ["android.permission.READ_MEDIA_IMAGES", "android.permission.INTERNET"]; + project.target_options.android.screenOrientation = ["sensorLandscape"]; + project.target_options.android.minSdkVersion = 33; // android 13 + project.target_options.android.targetSdkVersion = 36; + function get_version_code() { + const now = new Date(); + const year = now.getFullYear().toString().slice(-2); + const month = (now.getMonth() + 1).toString().padStart(2, '0'); + const day = now.getDate().toString().padStart(2, '0'); + return parseInt(year + month + day, 10); + } + project.target_options.android.versionCode = get_version_code(); + project.target_options.android.versionName = "1.0 alpha"; +} +else if (platform == "wasm") { + add_sys_backend("wasm"); + add_thread_backend("wasm"); + add_gpu_backend("webgpu"); + project.add_cfiles("sources/libs/miniclib/**"); + project.add_define("IRON_WASM"); + project.add_define("IRON_WEBGPU"); + project.add_include_dir("miniclib"); +} + +if (graphics == "metal" || (graphics == "vulkan" && platform != "android")) { + project.add_define("IRON_BGRA"); +} + +if (flags.with_kong) { + project.add_define("WITH_KONG"); project.add_cfiles("sources/libs/kong/libs/*.c"); project.add_cfiles("sources/libs/kong/*.c"); project.add_cfiles("sources/libs/kong/backends/*.c"); - project.add_define("WITH_KONG"); +} - if (platform === "windows") { - project.add_define("_CRT_SECURE_NO_WARNINGS"); - project.add_lib("d3dcompiler"); +if (flags.with_plugins) { + project.add_define("WITH_PLUGINS"); + project.add_project("../" + dir + "/plugins"); + project.add_cfiles("sources/plugins/plugin_api.c"); +} + +if (flags.embed) { + project.add_define("WITH_EMBED"); + project.add_define("arm_embed"); +} +else { + project.add_assets("assets/extra/*", { destination: "data/{name}" }); +} + +if (flags.with_physics) { + project.add_define("arm_physics"); + project.add_cfiles("sources/libs/asim.c"); +} + +if (flags.with_raytrace) { + project.add_assets("assets/raytrace/*", { destination: "data/{name}" }); + if (graphics == "direct3d12") { + project.add_assets("shaders/raytrace/*.cso", { destination: "data/{name}" }); } - - if (flags.with_onnx) { - project.add_define("WITH_ONNX"); - project.add_include_dir("../" + dir + "/onnx/include"); - if (platform === "windows") { - project.add_lib("../" + dir + "/onnx/win32/onnxruntime"); - } - else if (platform === "linux") { - // patchelf --set-rpath . ArmorLab - project.add_lib("onnxruntime -L" + flags.dirname + "/../" + dir + "/onnx/linux"); - // project.add_lib("onnxruntime_providers_cuda"); - // project.add_lib("onnxruntime_providers_shared"); - // project.add_lib("cublasLt"); - // project.add_lib("cublas"); - // project.add_lib("cudart"); - // project.add_lib("cudnn"); - // project.add_lib("cufft"); - // project.add_lib("curand"); - } - else if (platform === "macos") { - project.add_lib("../" + dir + "/onnx/macos/libonnxruntime.1.14.1.dylib"); - } + else if (graphics == "vulkan") { + project.add_assets("shaders/raytrace/*.spirv", { destination: "data/{name}" }); } - - if (flags.with_plugins) { - project.add_define("WITH_PLUGINS"); - project.add_project("../" + dir + "/plugins"); - project.add_project("plugins"); - } - - project.add_tsfiles("sources/ts"); - project.add_shaders("shaders/draw/*.kong"); - project.add_assets("assets/*", { destination: "data/{name}" }); - project.add_assets("assets/locale/*", { destination: "data/locale/{name}" }); - project.add_assets("assets/licenses/**", { destination: "data/licenses/{name}" }); - project.add_assets("assets/themes/*.json", { destination: "data/themes/{name}" }); - - if (platform === "linux" && fs_exists(os_cwd() + "/icon.png")) { - project.add_assets("../" + dir + "/icon.png", { destination: "{name}", noprocessing: true, noembed: true }); - } - - if (flags.embed) { - project.add_define("WITH_EMBED"); - project.add_define("arm_embed"); - } - else { - project.add_assets("assets/extra/*", { destination: "data/{name}" }); - } - - if (flags.physics) { - project.add_cfiles("sources/libs/asim.c"); - project.add_define("arm_physics"); - } - - // project.add_define("arm_audio"); - - if (platform === "android") { - project.add_define("arm_android_rmb"); - } - - let raytrace = true; - if (raytrace) { - project.add_assets("assets/raytrace/*", { destination: "data/{name}" }); - - if (graphics === "direct3d12") { - project.add_assets("shaders/raytrace/*.cso", { destination: "data/{name}" }); - } - else if (graphics === "vulkan") { - project.add_assets("shaders/raytrace/*.spirv", { destination: "data/{name}" }); - } - else if (graphics === "metal") { - project.add_assets("shaders/raytrace/*.metal", { destination: "data/{name}" }); - } - } - - let export_version_info = true; - if (export_version_info) { - let dir = "../" + flags.name.substr(5).toLowerCase() + "/build"; - let sha = os_popen(`git log --pretty=format:"%h" -n 1`).stdout.substr(1, 7); - let date = new Date().toISOString().split("T")[0]; - let data = `{ "sha": "${sha}", "date": "${date}" }`; - fs_ensuredir(dir); - fs_writefile(dir + "/version.json", data); - // Adds version.json to embed.txt list - project.add_assets(dir + "/version.json", { destination: "data/{name}" }); - } - - let export_data_list = platform === "android"; // .apk contents - if (export_data_list) { - let root = "../" + flags.name.substr(5).toLowerCase(); - let data_list = { - "/data/plugins": fs_readdir(root + "/assets/plugins").join(","), - "/data/export_presets": fs_readdir(root + "/assets/export_presets").join(","), - "/data/keymap_presets": fs_readdir(root + "/assets/keymap_presets").join(","), - "/data/locale": fs_readdir("../base/assets/locale").join(","), - "/data/meshes": fs_readdir(root + "/assets/meshes").join(","), - "/data/themes": fs_readdir("../base/assets/themes").join(","), - }; - let dir = "../" + flags.name.substr(5).toLowerCase() + "/build"; - fs_ensuredir(dir); - fs_writefile(dir + "/data_list.json", JSON.stringify(data_list)); - project.add_assets(dir + "/data_list.json", { destination: "data/{name}" }); + else if (graphics == "metal") { + project.add_assets("shaders/raytrace/*.metal", { destination: "data/{name}" }); } } -{ - project.add_include_dir("sources"); - - function add_gpu_backend(name) { - project.add_cfiles("sources/backends/" + name + "_gpu.*"); - project.add_define("BACKEND_GPU_H=\"backends/" + name + "_gpu.h\""); - } - - function add_sys_backend(name) { - project.add_cfiles("sources/backends/" + name + "_system.*"); - project.add_define("BACKEND_SYS_H=\"backends/" + name + "_system.h\""); - } - - function add_net_backend(name) { - project.add_cfiles("sources/backends/" + name + "_net.*"); - project.add_define("BACKEND_NET_H=\"backends/" + name + "_net.h\""); - } - - function add_thread_backend(name) { - project.add_cfiles("sources/backends/" + name + "_thread.*"); - project.add_define("BACKEND_THREAD_H=\"backends/" + name + "_thread.h\""); - } - - if (platform === "windows") { - add_sys_backend("windows"); - add_net_backend("windows"); - add_thread_backend("windows"); - add_gpu_backend("direct3d12"); - project.add_define("_CRT_SECURE_NO_WARNINGS"); - project.add_define("_WINSOCK_DEPRECATED_NO_WARNINGS"); - project.add_define("IRON_DIRECT3D12"); - project.add_lib("dxguid"); - project.add_lib("Winhttp"); - project.add_lib("dxgi"); - project.add_lib("d3d12"); - if (flags.with_audio) { - project.add_lib("dsound"); - } - if (flags.with_gamepad) { - project.add_lib("dinput8"); - } - } - else if (platform === "macos") { - add_sys_backend("macos"); - add_net_backend("apple"); - add_thread_backend("apple"); - add_gpu_backend("metal"); - project.add_cfiles("sources/backends/data/mac.plist"); - project.add_define("IRON_METAL"); - } - else if (platform === "ios") { - add_sys_backend("ios"); - add_net_backend("apple"); - add_thread_backend("apple"); - add_gpu_backend("metal"); - project.add_cfiles("sources/backends/data/ios.plist"); - project.add_cfiles("sources/backends/ios_file_dialog.m"); - project.add_define("IRON_METAL"); - } - else if (platform === "android") { - add_sys_backend("android"); - add_net_backend("posix"); - add_thread_backend("posix"); - add_gpu_backend("vulkan"); - project.add_cfiles("sources/backends/android_file_dialog.c"); - project.add_cfiles("sources/backends/android_http_request.c"); - project.add_cfiles("sources/backends/android_native_app_glue.c"); - project.add_define("IRON_ANDROID"); - project.add_define("IRON_VULKAN"); - project.add_define("VK_USE_PLATFORM_ANDROID_KHR"); - project.add_lib("vulkan"); - project.add_lib("log"); - project.add_lib("android"); - if (flags.with_audio) { - project.add_lib("OpenSLES"); - } - } - else if (platform === "wasm") { - add_sys_backend("wasm"); - add_thread_backend("wasm"); - add_gpu_backend("webgpu"); - project.add_cfiles("sources/libs/miniclib/**"); - project.add_define("IRON_WASM"); - project.add_define("IRON_WEBGPU"); - project.add_include_dir("miniclib"); - } - else if (platform === "linux") { - add_sys_backend("linux"); - add_thread_backend("posix"); - add_gpu_backend("vulkan"); - project.add_define("IRON_VULKAN"); - project.add_define("_POSIX_C_SOURCE=200112L"); - project.add_define("_XOPEN_SOURCE=600"); - project.add_lib("dl"); - project.add_lib("vulkan"); - if (flags.with_audio) { - project.add_lib("asound"); - } - if (flags.with_gamepad) { - project.add_lib("udev"); - } - } +if (flags.export_version_info) { + let dir = "../" + flags.name.substr(5).toLowerCase() + "/build"; + let sha = os_popen(`git log --pretty=format:"%h" -n 1`).stdout.substr(1, 7); + let date = new Date().toISOString().split("T")[0]; + let data = `{ "sha": "${sha}", "date": "${date}" }`; + fs_ensuredir(dir); + fs_writefile(dir + "/version.json", data); + // Adds version.json to embed.txt list + project.add_assets(dir + "/version.json", { destination: "data/{name}" }); } -if (fs_exists(os_cwd() + "/icon.png")) { - project.icon = "icon.png"; - if (platform === "macos" && fs_exists(os_cwd() + "/icon_macos.png")) { - project.icon = "icon_macos.png"; - } +if (flags.export_data_list) { + let root = "../" + flags.name.substr(5).toLowerCase(); + let data_list = { + "/data/plugins": fs_readdir(root + "/assets/plugins").join(","), + "/data/export_presets": fs_readdir(root + "/assets/export_presets").join(","), + "/data/keymap_presets": fs_readdir(root + "/assets/keymap_presets").join(","), + "/data/locale": fs_readdir(root + "/assets/locale").join(","), + "/data/meshes": fs_readdir(root + "/assets/meshes").join(","), + "/data/themes": fs_readdir("../base/assets/themes").join(","), + }; + let dir = "../" + flags.name.substr(5).toLowerCase() + "/build"; + fs_ensuredir(dir); + fs_writefile(dir + "/data_list.json", JSON.stringify(data_list)); + project.add_assets(dir + "/data_list.json", { destination: "data/{name}" }); } -project.add_include_dir("sources/libs"); -project.add_cfiles("sources/libs/gc.c"); -project.add_cfiles("sources/libs/kong/dir.c"); -project.add_include_dir("sources"); -project.add_cfiles("sources/iron.c"); -project.add_define("IRON_C_PATH=\"" + os_cwd() + "/build/iron.c" + "\""); -project.add_define("EMBED_H_PATH=\"" + os_cwd() + "/build/embed.h" + "\""); - if (flags.with_audio) { project.add_define("IRON_A1"); project.add_define("IRON_A2"); @@ -269,44 +229,24 @@ if (flags.with_gamepad) { project.add_define("WITH_GAMEPAD"); } -if (flags.with_iron) { - project.add_define("WITH_IRON"); - project.add_cfiles("sources/*.c"); -} - -if (platform === "windows") { - project.add_lib("Dwmapi"); // DWMWA_USE_IMMERSIVE_DARK_MODE - if (flags.with_d3dcompiler) { - project.add_define("WITH_D3DCOMPILER"); - project.add_lib("d3d11"); - project.add_lib("d3dcompiler"); - } -} -else if (platform === "android") { - project.add_define("IDLE_SLEEP"); - project.target_options.android.package = flags.package; - project.target_options.android.permissions = ["android.permission.READ_MEDIA_IMAGES", "android.permission.INTERNET"]; - project.target_options.android.screenOrientation = ["sensorLandscape"]; - project.target_options.android.minSdkVersion = 33; // android 13 - project.target_options.android.targetSdkVersion = 36; - function get_version_code() { - const now = new Date(); - const year = now.getFullYear().toString().slice(-2); - const month = (now.getMonth() + 1).toString().padStart(2, '0'); - const day = now.getDate().toString().padStart(2, '0'); - return parseInt(year + month + day, 10); - } - project.target_options.android.versionCode = get_version_code(); - project.target_options.android.versionName = "1.0 alpha"; -} -else if (platform === "ios") { +if (flags.idle_sleep) { project.add_define("IDLE_SLEEP"); } -if (flags.with_nfd && (platform === "windows" || platform === "linux" || platform === "macos")) { +if (fs_exists(os_cwd() + "/icon.png")) { + project.icon = "icon.png"; + if (platform == "macos" && fs_exists(os_cwd() + "/icon_macos.png")) { + project.icon = "icon_macos.png"; + } + else if (platform == "linux") { + project.add_assets("../" + dir + "/icon.png", { destination: "{name}", noprocessing: true, noembed: true }); + } +} + +if (flags.with_nfd && (platform == "windows" || platform == "linux" || platform == "macos")) { project.add_define("WITH_NFD"); project.add_cfiles("sources/libs/nfd.c"); - if (platform === "linux") { + if (platform == "linux") { project.add_include_dir("/usr/include/gtk-3.0"); project.add_include_dir("/usr/include/glib-2.0"); project.add_include_dir("/usr/lib/x86_64-linux-gnu/glib-2.0/include"); @@ -340,9 +280,5 @@ if (flags.with_video_write) { project.add_cfiles("sources/libs/minih264e.c"); } -if (graphics === "metal" || (graphics === "vulkan" && platform != "android")) { - project.add_define("IRON_BGRA"); -} - project.flatten(); return project; diff --git a/base/shaders/draw/draw_image.kong b/base/shaders/draw_image.kong similarity index 100% rename from base/shaders/draw/draw_image.kong rename to base/shaders/draw_image.kong diff --git a/base/shaders/draw/draw_image_transform.kong b/base/shaders/draw_image_transform.kong similarity index 100% rename from base/shaders/draw/draw_image_transform.kong rename to base/shaders/draw_image_transform.kong diff --git a/base/shaders/draw/draw_rect.kong b/base/shaders/draw_rect.kong similarity index 100% rename from base/shaders/draw/draw_rect.kong rename to base/shaders/draw_rect.kong diff --git a/base/shaders/draw/draw_text.kong b/base/shaders/draw_text.kong similarity index 100% rename from base/shaders/draw/draw_text.kong rename to base/shaders/draw_text.kong diff --git a/base/shaders/draw/draw_tris.kong b/base/shaders/draw_tris.kong similarity index 100% rename from base/shaders/draw/draw_tris.kong rename to base/shaders/draw_tris.kong diff --git a/base/sources/iron.h b/base/sources/iron.h index dbbba5b2..0e3061b1 100644 --- a/base/sources/iron.h +++ b/base/sources/iron.h @@ -35,18 +35,6 @@ #ifdef WITH_EMBED #include EMBED_H_PATH #endif -#ifdef WITH_ONNX -#include -#ifdef IRON_WINDOWS -#include -#elif defined(IRON_MACOS) -#include -#endif -const OrtApi *ort = NULL; -OrtEnv *ort_env; -OrtSessionOptions *ort_session_options; -OrtSession *session = NULL; -#endif int _argc; char **_argv; @@ -132,7 +120,7 @@ char *js_call(void *p) { void js_init() {} float js_eval(const char *js) { return 0.0; } -void js_call_arg(void *p, int argc, void *argv) { return NULL; } +void js_call_arg(void *p, int argc, void *argv) { } char *js_call_ptr(void *p, void *arg) { return NULL; } char *js_call_ptr_str(void *p, void *arg0, char *arg1) { return NULL; } void *js_pcall_str(void *p, char *arg0) { return NULL; } @@ -296,12 +284,7 @@ int kickstart(int argc, char **argv) { #ifdef WITH_AUDIO iron_a2_shutdown(); #endif - #ifdef WITH_ONNX - if (ort != NULL) { - ort->ReleaseEnv(ort_env); - ort->ReleaseSessionOptions(ort_session_options); - } - #endif + gc_stop(); return 0; } @@ -1851,146 +1834,6 @@ void iron_mp4_encode(buffer_t *pixels) { } #endif -#ifdef WITH_ONNX -buffer_t *iron_ml_inference(buffer_t *model, any_array_t *tensors, any_array_t *input_shape, i32_array_t *output_shape, bool use_gpu) { - OrtStatus *onnx_status = NULL; - static bool use_gpu_last = false; - if (ort == NULL || use_gpu_last != use_gpu) { - use_gpu_last = use_gpu; - ort = OrtGetApiBase()->GetApi(ORT_API_VERSION); - ort->CreateEnv(ORT_LOGGING_LEVEL_WARNING, "iron", &ort_env); - - ort->CreateSessionOptions(&ort_session_options); - ort->SetIntraOpNumThreads(ort_session_options, 8); - ort->SetInterOpNumThreads(ort_session_options, 8); - - if (use_gpu) { - #ifdef IRON_WINDOWS - ort->SetSessionExecutionMode(ort_session_options, ORT_SEQUENTIAL); - ort->DisableMemPattern(ort_session_options); - onnx_status = OrtSessionOptionsAppendExecutionProvider_DML(ort_session_options, 0); - #elif defined(IRON_LINUX) - // onnx_status = OrtSessionOptionsAppendExecutionProvider_CUDA(ort_session_options, 0); - #elif defined(IRON_MACOS) - onnx_status = OrtSessionOptionsAppendExecutionProvider_CoreML(ort_session_options, 0); - #endif - if (onnx_status != NULL) { - const char *msg = ort->GetErrorMessage(onnx_status); - iron_error("%s", msg); - ort->ReleaseStatus(onnx_status); - } - } - } - - static void *content_last = 0; - if (content_last != model->buffer || session == NULL) { - if (session != NULL) { - ort->ReleaseSession(session); - session = NULL; - } - onnx_status = ort->CreateSessionFromArray(ort_env, model->buffer, (int)model->length, ort_session_options, &session); - if (onnx_status != NULL) { - const char* msg = ort->GetErrorMessage(onnx_status); - iron_error("%s", msg); - ort->ReleaseStatus(onnx_status); - } - } - content_last = model->buffer; - - OrtAllocator *allocator; - ort->GetAllocatorWithDefaultOptions(&allocator); - OrtMemoryInfo *memory_info; - ort->CreateCpuMemoryInfo(OrtArenaAllocator, OrtMemTypeDefault, &memory_info); - - int32_t length = tensors->length; - if (length > 4) { - length = 4; - } - char *input_node_names[4]; - OrtValue *input_tensors[4]; - for (int32_t i = 0; i < length; ++i) { - ort->SessionGetInputName(session, i, allocator, &input_node_names[i]); - - OrtTypeInfo *input_type_info; - ort->SessionGetInputTypeInfo(session, i, &input_type_info); - const OrtTensorTypeAndShapeInfo *input_tensor_info; - ort->CastTypeInfoToTensorInfo(input_type_info, &input_tensor_info); - size_t num_input_dims; - ort->GetDimensionsCount(input_tensor_info, &num_input_dims); - int64_t input_node_dims[32]; - - if (input_shape != NULL) { - for (int32_t j = 0; j < num_input_dims; ++j) { - i32_array_t *a = input_shape->buffer[i]; - input_node_dims[j] = a->buffer[j]; - } - } - else { - ort->GetDimensions(input_tensor_info, (int64_t *)input_node_dims, num_input_dims); - } - ONNXTensorElementDataType tensor_element_type; - ort->GetTensorElementType(input_tensor_info, &tensor_element_type); - - buffer_t *b = tensors->buffer[i]; - ort->CreateTensorWithDataAsOrtValue(memory_info, b->buffer, (int)b->length, input_node_dims, num_input_dims, tensor_element_type, &input_tensors[i]); - ort->ReleaseTypeInfo(input_type_info); - } - - char *output_node_name; - ort->SessionGetOutputName(session, 0, allocator, &output_node_name); - OrtValue *output_tensor = NULL; - onnx_status = ort->Run(session, NULL, input_node_names, input_tensors, length, &output_node_name, 1, &output_tensor); - if (onnx_status != NULL) { - const char* msg = ort->GetErrorMessage(onnx_status); - iron_error("%s", msg); - ort->ReleaseStatus(onnx_status); - } - float *float_array; - ort->GetTensorMutableData(output_tensor, (void **)&float_array); - - size_t output_byte_length = 4; - if (output_shape != NULL) { - int32_t length = output_shape->length; - for (int i = 0; i < length; ++i) { - output_byte_length *= output_shape->buffer[i]; - } - } - else { - OrtTypeInfo *output_type_info; - ort->SessionGetOutputTypeInfo(session, 0, &output_type_info); - const OrtTensorTypeAndShapeInfo *output_tensor_info; - ort->CastTypeInfoToTensorInfo(output_type_info, &output_tensor_info); - size_t num_output_dims; - ort->GetDimensionsCount(output_tensor_info, &num_output_dims); - int64_t output_node_dims[32]; - ort->GetDimensions(output_tensor_info, (int64_t *)output_node_dims, num_output_dims); - ort->ReleaseTypeInfo(output_type_info); - for (int i = 0; i < num_output_dims; ++i) { - if (output_node_dims[i] > 1) { - output_byte_length *= output_node_dims[i]; - } - } - } - - buffer_t *output = buffer_create(output_byte_length); - memcpy(output->buffer, float_array, output_byte_length); - - ort->ReleaseMemoryInfo(memory_info); - ort->ReleaseValue(output_tensor); - for (int i = 0; i < length; ++i) { - ort->ReleaseValue(input_tensors[i]); - } - return output; -} - -void iron_ml_unload() { - if (session != NULL) { - ort->ReleaseSession(session); - session = NULL; - } -} -#endif - void iron_raytrace_init(buffer_t *shader) { if (rt_created) { gpu_buffer_destroy(&rt_constant_buffer); diff --git a/base/plugins/plugin_api.c b/base/sources/plugins/plugin_api.c similarity index 65% rename from base/plugins/plugin_api.c rename to base/sources/plugins/plugin_api.c index bcfeb35f..acf918ac 100644 --- a/base/plugins/plugin_api.c +++ b/base/sources/plugins/plugin_api.c @@ -374,41 +374,6 @@ void gc_run(); // These could be auto-generated by alang VOID_FN(gc_run) -VOID_FN_STR(console_log) -VOID_FN_STR(console_info) -PTR_FN(plugin_create) -VOID_FN_PTR_CB(plugin_notify_on_ui) -VOID_FN_PTR_CB(plugin_notify_on_update) -VOID_FN_PTR_CB(plugin_notify_on_delete) - -static JSObject *ui_files_cb; -static void ui_files_done(char *path) { - JSValue path_val = JS_NewString(js_ctx, path); - JSValue argv[] = { path_val }; - js_call_arg(ui_files_cb, 1, argv); -} - -void ui_files_show(char *s, bool b0, bool b1, void(*f)(char *)); -FN(ui_files_show) { - char *filters = (char *)JS_ToCString(ctx, argv[0]); - bool is_save = JS_ToBool(ctx, argv[1]); - bool open_multiple = JS_ToBool(ctx, argv[2]); - ui_files_cb = malloc(sizeof(JSValue)); - JSValue dup = JS_DupValue(ctx, argv[3]); - memcpy(ui_files_cb, &dup, sizeof(JSValue)); - ui_files_show(filters, is_save, open_multiple, ui_files_done); - return JS_UNDEFINED; -} - -void ui_box_show_message(char *s0, char *s1, bool b); -extern bool ui_box_click_to_hide; -FN(ui_box_show_message) { - char *title = (char *)JS_ToCString(ctx, argv[0]); - char *message = (char *)JS_ToCString(ctx, argv[1]); - ui_box_show_message(title, message, true); - ui_box_click_to_hide = false; - return JS_UNDEFINED; -} void *data_get_blob(char *s); FN(data_get_blob) { @@ -435,20 +400,6 @@ FN(iron_file_save_bytes) { return JS_UNDEFINED; } -VOID_FN_CB(context_set_viewport_shader) - -void node_shader_add_constant(void *p, char *s0, char *s1, bool b); -FN(node_shader_add_constant) { - uint64_t p; - JS_ToBigUint64(ctx, &p, argv[0]); - char *s0 = (char *)JS_ToCString(ctx, argv[1]); - char *s1 = (char *)JS_ToCString(ctx, argv[2]); - node_shader_add_constant((void *)p, s0, s1, false); - return JS_UNDEFINED; -} - -VOID_FN_PTR_STR(node_shader_write_frag) - void *gpu_create_texture_from_bytes(void *p, int w, int h, int format); FN(gpu_create_texture_from_bytes) { size_t len; @@ -462,17 +413,6 @@ FN(gpu_create_texture_from_bytes) { return JS_NewBigUint64(ctx, result); } -extern char *project_filepath; -FN(project_filepath_get) { - return JS_NewString(ctx, project_filepath); -} - -void project_save(bool b); -FN(project_save) { - project_save(false); - return JS_UNDEFINED; -} - FN(ui_handle_create) { uint64_t result = (uint64_t)ui_handle_create(); any_array_push(plugin_gc, (void *)result); @@ -601,149 +541,6 @@ FN(ui_combo) { return JS_UNDEFINED; } -extern any_array_t *nodes_material_categories; -extern any_array_t *nodes_material_list; -FN(nodes_material_category_add) { - char *category_name = (char *)JS_ToCString(ctx, argv[0]); - any_array_push(nodes_material_categories, category_name); - size_t len; - void *ab = JS_GetArrayBuffer(ctx, &len, argv[1]); - buffer_t b = { .buffer = ab, .length = len, .capacity = len }; - any_array_push(nodes_material_list, armpack_decode(&b)); - return JS_UNDEFINED; -} - -FN(nodes_material_category_remove) { - char *category_name = (char *)JS_ToCString(ctx, argv[0]); - int i = array_index_of(nodes_material_categories, category_name); - array_splice(nodes_material_list, i, 1); - array_splice(nodes_material_categories, i, 1); - return JS_UNDEFINED; -} - -extern any_map_t *parser_material_custom_nodes; -FN(parser_material_custom_nodes_set) { - char *node_type = (char *)JS_ToCString(ctx, argv[0]); - JSValue *p = malloc(sizeof(JSValue));\ - JSValue dup = JS_DupValue(ctx, argv[1]);\ - memcpy(p, &dup, sizeof(JSValue));\ - any_map_set(parser_material_custom_nodes, node_type, p); - return JS_UNDEFINED; -} - -FN(parser_material_custom_nodes_delete) { - char *node_type = (char *)JS_ToCString(ctx, argv[0]); - map_delete(parser_material_custom_nodes, node_type); - return JS_UNDEFINED; -} - -extern void *parser_material_kong; -FN(parser_material_kong_get) { - return JS_NewBigUint64(ctx, (uint64_t)parser_material_kong); -} - -char *parser_material_parse_value_input(void *inp, bool vector_as_grayscale); -FN(parser_material_parse_value_input) { - uint64_t *node; - JS_ToBigUint64(ctx, &node, argv[0]); - int64_t i; - JS_ToInt64(ctx, &i, argv[1]); - char *s = parser_material_parse_value_input(((ui_node_t *)node)->inputs->buffer[i], false); - return JS_NewString(ctx, s); -} - -extern any_array_t *nodes_brush_categories; -extern any_array_t *nodes_brush_list; -void nodes_brush_list_init(); -FN(nodes_brush_category_add) { - char *category_name = (char *)JS_ToCString(ctx, argv[0]); - any_array_push(nodes_brush_categories, category_name); - size_t len; - void *ab = JS_GetArrayBuffer(ctx, &len, argv[1]); - buffer_t b = { .buffer = ab, .length = len, .capacity = len }; - nodes_brush_list_init(); - any_array_push(nodes_brush_list, armpack_decode(&b)); - return JS_UNDEFINED; -} - -FN(nodes_brush_category_remove) { - char *category_name = (char *)JS_ToCString(ctx, argv[0]); - int i = array_index_of(nodes_brush_categories, category_name); - array_splice(nodes_brush_list, i, 1); - array_splice(nodes_brush_categories, i, 1); - return JS_UNDEFINED; -} - -extern any_map_t *parser_logic_custom_nodes; -FN(parser_logic_custom_nodes_set) { - char *node_type = (char *)JS_ToCString(ctx, argv[0]); - JSValue *p = malloc(sizeof(JSValue));\ - JSValue dup = JS_DupValue(ctx, argv[1]);\ - memcpy(p, &dup, sizeof(JSValue));\ - any_map_set(parser_logic_custom_nodes, node_type, p); - return JS_UNDEFINED; -} - -FN(parser_logic_custom_nodes_delete) { - char *node_type = (char *)JS_ToCString(ctx, argv[0]); - map_delete(parser_logic_custom_nodes, node_type); - return JS_UNDEFINED; -} - -extern any_map_t *util_mesh_unwrappers; -FN(util_mesh_unwrappers_set) { - char *plugin_name = (char *)JS_ToCString(ctx, argv[0]); - JSValue *p = malloc(sizeof(JSValue));\ - JSValue dup = JS_DupValue(ctx, argv[1]);\ - memcpy(p, &dup, sizeof(JSValue));\ - any_map_set(util_mesh_unwrappers, plugin_name, p); - return JS_UNDEFINED; -} - -FN(util_mesh_unwrappers_delete) { - char *plugin_name = (char *)JS_ToCString(ctx, argv[0]); - map_delete(util_mesh_unwrappers, plugin_name); - return JS_UNDEFINED; -} - -extern any_map_t *path_mesh_importers; -extern char_ptr_array_t *path_mesh_formats; -FN(path_mesh_importers_set) { - char *format_name = (char *)JS_ToCString(ctx, argv[0]); - JSValue *p = malloc(sizeof(JSValue));\ - JSValue dup = JS_DupValue(ctx, argv[1]);\ - memcpy(p, &dup, sizeof(JSValue));\ - any_map_set(path_mesh_importers, format_name, p); - any_array_push(path_mesh_formats, format_name); - return JS_UNDEFINED; -} - -FN(path_mesh_importers_delete) { - char *format_name = (char *)JS_ToCString(ctx, argv[0]); - map_delete(path_mesh_importers, format_name); - array_splice(path_mesh_formats, char_ptr_array_index_of(path_mesh_formats, format_name), 1); - return JS_UNDEFINED; -} - -extern any_map_t *path_texture_importers; -extern char_ptr_array_t *path_texture_formats; -FN(path_texture_importers_set) { - char *format_name = (char *)JS_ToCString(ctx, argv[0]); - JSValue *p = malloc(sizeof(JSValue));\ - JSValue dup = JS_DupValue(ctx, argv[1]);\ - memcpy(p, &dup, sizeof(JSValue));\ - any_map_set(path_texture_importers, format_name, p); - any_array_push(path_texture_formats, format_name); - return JS_UNDEFINED; -} - -FN(path_texture_importers_delete) { - char *format_name = (char *)JS_ToCString(ctx, argv[0]); - map_delete(path_texture_importers, format_name); - array_splice(path_texture_formats, char_ptr_array_index_of(path_texture_formats, format_name), 1); - return JS_UNDEFINED; -} - FN(plugin_api_make_raw_mesh) { raw_mesh_t *mesh = calloc(sizeof(raw_mesh_t), 1); mesh->name = (char *)JS_ToCString(ctx, argv[0]); @@ -796,23 +593,10 @@ void plugin_api_init() { gc_root(plugin_gc); BIND(gc_run, 0); - BIND(console_log, 1); - BIND(console_info, 1); - BIND(plugin_create, 0); - BIND(plugin_notify_on_ui, 2); - BIND(plugin_notify_on_update, 2); - BIND(plugin_notify_on_delete, 2); - BIND(ui_files_show, 4); - BIND(ui_box_show_message, 2); BIND(data_get_blob, 1); BIND(data_delete_blob, 1); BIND(iron_file_save_bytes, 3); - BIND(context_set_viewport_shader, 1); - BIND(node_shader_add_constant, 3); - BIND(node_shader_write_frag, 2); BIND(gpu_create_texture_from_bytes, 3); - BIND(project_filepath_get, 0); - BIND(project_save, 0); BIND(ui_handle_create, 0); BIND(ui_handle_set_value, 2); @@ -827,25 +611,6 @@ void plugin_api_init() { BIND(ui_row, 1); BIND(ui_combo, 3); - BIND(nodes_material_category_add, 2); - BIND(nodes_material_category_remove, 1); - BIND(parser_material_custom_nodes_set, 2); - BIND(parser_material_custom_nodes_delete, 1); - BIND(parser_material_kong_get, 0); - BIND(parser_material_parse_value_input, 2); - - BIND(nodes_brush_category_add, 2); - BIND(nodes_brush_category_remove, 1); - BIND(parser_logic_custom_nodes_set, 2); - BIND(parser_logic_custom_nodes_delete, 1); - - BIND(util_mesh_unwrappers_set, 2); - BIND(util_mesh_unwrappers_delete, 1); - BIND(path_mesh_importers_set, 2); - BIND(path_mesh_importers_delete, 1); - BIND(path_texture_importers_set, 2); - BIND(path_texture_importers_delete, 1); - BIND(plugin_api_make_raw_mesh, 5); BIND(transform_rotate, 3); diff --git a/base/plugins/plugin_api.h b/base/sources/plugins/plugin_api.h similarity index 100% rename from base/plugins/plugin_api.h rename to base/sources/plugins/plugin_api.h diff --git a/paint/sources/file.ts b/base/sources/ts/file.ts similarity index 100% rename from paint/sources/file.ts rename to base/sources/ts/file.ts diff --git a/paint/sources/path.ts b/base/sources/ts/path.ts similarity index 100% rename from paint/sources/path.ts rename to base/sources/ts/path.ts diff --git a/base/tests/cube/project.js b/base/tests/cube/project.js index 91098546..b700b0a8 100644 --- a/base/tests/cube/project.js +++ b/base/tests/cube/project.js @@ -1,14 +1,9 @@ let flags = globalThis.flags; -flags.with_iron = true; -flags.lite = true; -flags.with_eval = false; let project = new Project("test"); project.add_project("../../"); project.add_tsfiles("sources"); -project.add_tsfiles("../../sources/ts"); -project.add_shaders("../../shaders/draw/*.kong"); project.add_shaders("shaders/*.kong"); project.add_assets("assets/*", { destination: "data/{name}" }); diff --git a/base/tests/fall/project.js b/base/tests/fall/project.js index a03c7869..84480804 100644 --- a/base/tests/fall/project.js +++ b/base/tests/fall/project.js @@ -1,15 +1,10 @@ let flags = globalThis.flags; -flags.with_iron = true; -flags.lite = true; -flags.with_eval = false; +flags.with_physics = true; let project = new Project("test"); project.add_project("../../"); project.add_tsfiles("sources"); -project.add_cfiles("../../sources/libs/asim.c"); -project.add_tsfiles("../../sources/ts"); -project.add_shaders("../../shaders/draw/*.kong"); project.add_shaders("shaders/*.kong"); project.add_assets("assets/*", { destination: "data/{name}" }); diff --git a/base/tests/triangle/project.js b/base/tests/triangle/project.js index 567f36f4..f67bff24 100644 --- a/base/tests/triangle/project.js +++ b/base/tests/triangle/project.js @@ -1,12 +1,8 @@ let flags = globalThis.flags; -flags.with_iron = true; -flags.lite = true; -flags.with_eval = false; let project = new Project("test"); project.add_project("../../"); project.add_tsfiles("./"); -project.add_tsfiles("../../sources/ts"); project.add_shaders("./*.kong"); return project; diff --git a/base/tools/amake/project.js b/base/tools/amake/project.js index f8cfe488..b5c33be0 100644 --- a/base/tools/amake/project.js +++ b/base/tools/amake/project.js @@ -1,22 +1,20 @@ let project = new Project("amake"); -{ - // alang - project.add_define("NO_GC"); - project.add_define("NO_IRON_API"); - project.add_define("NO_IRON_START"); - project.add_tsfiles("./"); // alang.ts - project.add_include_dir("./"); // iron.h - project.add_cfiles("build/iron.c"); - project.add_include_dir("../../sources"); - project.add_cfiles("../../sources/iron_string.c"); - project.add_cfiles("../../sources/iron_array.c"); - project.add_cfiles("../../sources/iron_map.c"); - project.add_cfiles("../../sources/iron_armpack.c"); - project.add_cfiles("../../sources/iron_json.c"); - project.add_cfiles("../../sources/iron_gc.c"); -} +// alang +project.add_define("NO_GC"); +project.add_define("NO_IRON_API"); +project.add_define("NO_IRON_START"); +project.add_tsfiles("./"); // alang.ts +project.add_include_dir("./"); // iron.h +project.add_cfiles("build/iron.c"); +project.add_include_dir("../../sources"); +project.add_cfiles("../../sources/iron_string.c"); +project.add_cfiles("../../sources/iron_array.c"); +project.add_cfiles("../../sources/iron_map.c"); +project.add_cfiles("../../sources/iron_armpack.c"); +project.add_cfiles("../../sources/iron_json.c"); +project.add_cfiles("../../sources/iron_gc.c"); project.add_include_dir("../../sources/libs"); project.add_cfiles("../../sources/libs/quickjs-amalgam.c"); @@ -25,22 +23,17 @@ project.add_define("QJS_BUILD_LIBC"); project.add_cfiles("main.c"); project.add_cfiles("aimage.c"); -{ - project.add_cfiles("ashader.c"); - - project.add_cfiles('../../sources/libs/kong/libs/*.c'); - project.add_cfiles('../../sources/libs/kong/*.c'); - project.add_cfiles('../../sources/libs/kong/backends/*.c'); - // project.add_cfiles('../../sources/libs/kong/backends/*.cpp'); // d3d12.cpp - if (platform === "windows") { - project.add_define('_CRT_SECURE_NO_WARNINGS'); - project.add_lib('d3dcompiler'); - // project.add_include_dir('../../sources/libs/kong/libs/dxc/inc'); - // project.add_lib('../../sources/libs/kong/libs/dxc/lib/x64/dxcompiler'); - } -} +project.add_cfiles("ashader.c"); +project.add_cfiles('../../sources/libs/kong/libs/*.c'); +project.add_cfiles('../../sources/libs/kong/*.c'); +project.add_cfiles('../../sources/libs/kong/backends/*.c'); +// project.add_cfiles('../../sources/libs/kong/backends/*.cpp'); // d3d12.cpp if (platform === "windows") { + project.add_define('_CRT_SECURE_NO_WARNINGS'); + project.add_lib('d3dcompiler'); + // project.add_include_dir('../../sources/libs/kong/libs/dxc/inc'); + // project.add_lib('../../sources/libs/kong/libs/dxc/lib/x64/dxcompiler'); // hlslbin project.add_lib("dxguid"); } diff --git a/base/tools/extract_locales.js b/base/tools/extract_locales.js index 1ff8baff..4082806e 100644 --- a/base/tools/extract_locales.js +++ b/base/tools/extract_locales.js @@ -2,7 +2,7 @@ // This script can create new translations or update existing ones. // Usage: // `../make --js extract_locales.js ` -// Generates a `base/assets/locale/.json` file +// Generates a `paint/assets/locale/.json` file let locale = scriptArgs[4]; @@ -11,7 +11,7 @@ if (!locale) { std.exit(); } -let locale_path = "./base/assets/locale/" + locale + ".json"; +let locale_path = "./paint/assets/locale/" + locale + ".json"; let out = {}; let old = {}; @@ -20,8 +20,7 @@ if (fs_exists(locale_path)) { } let source_paths = [ - "base/sources", "base/sources/nodes", - "paint/sources", "paint/sources/nodes" + "paint/sources", "paint/sources/brush_nodes", "paint/sources/neural_nodes" ]; for (let path of source_paths) { diff --git a/base/tools/make.js b/base/tools/make.js index 4f90f25f..3fd86f62 100644 --- a/base/tools/make.js +++ b/base/tools/make.js @@ -2214,16 +2214,20 @@ function load_project(directory, is_root_project) { package: "org.armory3d", dirname: __dirname, release: os_argv().indexOf("--debug") == -1, + embed: false, + with_physics: false, with_d3dcompiler: false, with_nfd: false, with_compress: false, with_image_write: false, with_video_write: false, - with_audio: false, - with_iron: false, with_eval: false, - with_gamepad: false, - embed: false + with_plugins: false, + with_kong: false, + with_raytrace: false, + idle_sleep: false, + export_version_info: false, + export_data_list: false }; } diff --git a/base/tools/pad/project.js b/base/tools/pad/project.js index 863fe8a2..d22ae9e5 100644 --- a/base/tools/pad/project.js +++ b/base/tools/pad/project.js @@ -2,22 +2,9 @@ let flags = globalThis.flags; flags.name = "ArmorPad"; flags.package = "org.armorpad"; -flags.with_nfd = true; -flags.with_iron = true; -flags.lite = true; let project = new Project("ArmorPad"); -project.add_tsfiles("sources"); - -project.add_shaders("../../shaders/draw/*.kong"); -project.add_assets("../../assets/font_mono.ttf", { destination: "data/{name}" }); -project.add_assets("../../assets/text_coloring.json", { destination: "data/{name}" }); -project.add_tsfiles("../../sources/ts/iron"); -project.add_tsfiles("../../sources/ts/file.ts"); -project.add_tsfiles("../../sources/ts/path.ts"); - -project.add_define("IDLE_SLEEP"); project.add_project("../.."); - +project.add_tsfiles("sources"); project.flatten(); return project; diff --git a/base/assets/cursor.png b/paint/assets/cursor.png similarity index 100% rename from base/assets/cursor.png rename to paint/assets/cursor.png diff --git a/base/assets/cursor4x.png b/paint/assets/cursor4x.png similarity index 100% rename from base/assets/cursor4x.png rename to paint/assets/cursor4x.png diff --git a/base/assets/icons.png b/paint/assets/icons.png similarity index 100% rename from base/assets/icons.png rename to paint/assets/icons.png diff --git a/base/assets/icons2x.png b/paint/assets/icons2x.png similarity index 100% rename from base/assets/icons2x.png rename to paint/assets/icons2x.png diff --git a/base/assets/locale/de.json b/paint/assets/locale/de.json similarity index 100% rename from base/assets/locale/de.json rename to paint/assets/locale/de.json diff --git a/base/assets/locale/el.json b/paint/assets/locale/el.json similarity index 100% rename from base/assets/locale/el.json rename to paint/assets/locale/el.json diff --git a/base/assets/locale/es.json b/paint/assets/locale/es.json similarity index 100% rename from base/assets/locale/es.json rename to paint/assets/locale/es.json diff --git a/base/assets/locale/fr.json b/paint/assets/locale/fr.json similarity index 100% rename from base/assets/locale/fr.json rename to paint/assets/locale/fr.json diff --git a/base/assets/locale/ja.json b/paint/assets/locale/ja.json similarity index 100% rename from base/assets/locale/ja.json rename to paint/assets/locale/ja.json diff --git a/base/assets/locale/pl.json b/paint/assets/locale/pl.json similarity index 100% rename from base/assets/locale/pl.json rename to paint/assets/locale/pl.json diff --git a/base/assets/locale/pt_br.json b/paint/assets/locale/pt_br.json similarity index 100% rename from base/assets/locale/pt_br.json rename to paint/assets/locale/pt_br.json diff --git a/base/assets/locale/ru.json b/paint/assets/locale/ru.json similarity index 100% rename from base/assets/locale/ru.json rename to paint/assets/locale/ru.json diff --git a/base/assets/locale/zh_cn.json b/paint/assets/locale/zh_cn.json similarity index 100% rename from base/assets/locale/zh_cn.json rename to paint/assets/locale/zh_cn.json diff --git a/paint/plugins/plugins.c b/paint/plugins/plugins.c index fad6514c..9ad9091b 100644 --- a/paint/plugins/plugins.c +++ b/paint/plugins/plugins.c @@ -1,5 +1,9 @@ -#include "../../../base/plugins/plugin_api.h" +#include "../../../base/sources/plugins/plugin_api.h" +#include "iron_array.h" +#include "iron_map.h" +#include "iron_ui.h" +#include "iron_ui_nodes.h" void proc_xatlas_unwrap(void *mesh); FN(proc_xatlas_unwrap) { @@ -44,6 +48,210 @@ FN(io_fbx_parse) { return JS_NewBigUint64(ctx, (uint64_t)io_fbx_parse(ab, len)); } +VOID_FN_STR(console_log) +VOID_FN_STR(console_info) +PTR_FN(plugin_create) +VOID_FN_PTR_CB(plugin_notify_on_ui) +VOID_FN_PTR_CB(plugin_notify_on_update) +VOID_FN_PTR_CB(plugin_notify_on_delete) + +static JSObject *ui_files_cb; +static void ui_files_done(char *path) { + JSValue path_val = JS_NewString(js_ctx, path); + JSValue argv[] = { path_val }; + js_call_arg(ui_files_cb, 1, argv); +} + +void ui_files_show(char *s, bool b0, bool b1, void(*f)(char *)); +FN(ui_files_show) { + char *filters = (char *)JS_ToCString(ctx, argv[0]); + bool is_save = JS_ToBool(ctx, argv[1]); + bool open_multiple = JS_ToBool(ctx, argv[2]); + ui_files_cb = malloc(sizeof(JSValue)); + JSValue dup = JS_DupValue(ctx, argv[3]); + memcpy(ui_files_cb, &dup, sizeof(JSValue)); + ui_files_show(filters, is_save, open_multiple, ui_files_done); + return JS_UNDEFINED; +} + +void ui_box_show_message(char *s0, char *s1, bool b); +extern bool ui_box_click_to_hide; +FN(ui_box_show_message) { + char *title = (char *)JS_ToCString(ctx, argv[0]); + char *message = (char *)JS_ToCString(ctx, argv[1]); + ui_box_show_message(title, message, true); + ui_box_click_to_hide = false; + return JS_UNDEFINED; +} + +VOID_FN_CB(context_set_viewport_shader) + +void node_shader_add_constant(void *p, char *s0, char *s1, bool b); +FN(node_shader_add_constant) { + uint64_t p; + JS_ToBigUint64(ctx, &p, argv[0]); + char *s0 = (char *)JS_ToCString(ctx, argv[1]); + char *s1 = (char *)JS_ToCString(ctx, argv[2]); + node_shader_add_constant((void *)p, s0, s1, false); + return JS_UNDEFINED; +} + +VOID_FN_PTR_STR(node_shader_write_frag) + +extern char *project_filepath; +FN(project_filepath_get) { + return JS_NewString(ctx, project_filepath); +} + +void project_save(bool b); +FN(project_save) { + project_save(false); + return JS_UNDEFINED; +} + +extern any_array_t *nodes_material_categories; +extern any_array_t *nodes_material_list; +FN(nodes_material_category_add) { + char *category_name = (char *)JS_ToCString(ctx, argv[0]); + any_array_push(nodes_material_categories, category_name); + size_t len; + void *ab = JS_GetArrayBuffer(ctx, &len, argv[1]); + buffer_t b = { .buffer = ab, .length = len, .capacity = len }; + any_array_push(nodes_material_list, armpack_decode(&b)); + return JS_UNDEFINED; +} + +FN(nodes_material_category_remove) { + char *category_name = (char *)JS_ToCString(ctx, argv[0]); + int i = array_index_of(nodes_material_categories, category_name); + array_splice(nodes_material_list, i, 1); + array_splice(nodes_material_categories, i, 1); + return JS_UNDEFINED; +} + +extern any_map_t *parser_material_custom_nodes; +FN(parser_material_custom_nodes_set) { + char *node_type = (char *)JS_ToCString(ctx, argv[0]); + JSValue *p = malloc(sizeof(JSValue));\ + JSValue dup = JS_DupValue(ctx, argv[1]);\ + memcpy(p, &dup, sizeof(JSValue));\ + any_map_set(parser_material_custom_nodes, node_type, p); + return JS_UNDEFINED; +} + +FN(parser_material_custom_nodes_delete) { + char *node_type = (char *)JS_ToCString(ctx, argv[0]); + map_delete(parser_material_custom_nodes, node_type); + return JS_UNDEFINED; +} + +extern void *parser_material_kong; +FN(parser_material_kong_get) { + return JS_NewBigUint64(ctx, (uint64_t)parser_material_kong); +} + +char *parser_material_parse_value_input(void *inp, bool vector_as_grayscale); +FN(parser_material_parse_value_input) { + uint64_t *node; + JS_ToBigUint64(ctx, &node, argv[0]); + int64_t i; + JS_ToInt64(ctx, &i, argv[1]); + char *s = parser_material_parse_value_input(((ui_node_t *)node)->inputs->buffer[i], false); + return JS_NewString(ctx, s); +} + +extern any_array_t *nodes_brush_categories; +extern any_array_t *nodes_brush_list; +void nodes_brush_list_init(); +FN(nodes_brush_category_add) { + char *category_name = (char *)JS_ToCString(ctx, argv[0]); + any_array_push(nodes_brush_categories, category_name); + size_t len; + void *ab = JS_GetArrayBuffer(ctx, &len, argv[1]); + buffer_t b = { .buffer = ab, .length = len, .capacity = len }; + nodes_brush_list_init(); + any_array_push(nodes_brush_list, armpack_decode(&b)); + return JS_UNDEFINED; +} + +FN(nodes_brush_category_remove) { + char *category_name = (char *)JS_ToCString(ctx, argv[0]); + int i = array_index_of(nodes_brush_categories, category_name); + array_splice(nodes_brush_list, i, 1); + array_splice(nodes_brush_categories, i, 1); + return JS_UNDEFINED; +} + +extern any_map_t *parser_logic_custom_nodes; +FN(parser_logic_custom_nodes_set) { + char *node_type = (char *)JS_ToCString(ctx, argv[0]); + JSValue *p = malloc(sizeof(JSValue));\ + JSValue dup = JS_DupValue(ctx, argv[1]);\ + memcpy(p, &dup, sizeof(JSValue));\ + any_map_set(parser_logic_custom_nodes, node_type, p); + return JS_UNDEFINED; +} + +FN(parser_logic_custom_nodes_delete) { + char *node_type = (char *)JS_ToCString(ctx, argv[0]); + map_delete(parser_logic_custom_nodes, node_type); + return JS_UNDEFINED; +} + +extern any_map_t *util_mesh_unwrappers; +FN(util_mesh_unwrappers_set) { + char *plugin_name = (char *)JS_ToCString(ctx, argv[0]); + JSValue *p = malloc(sizeof(JSValue));\ + JSValue dup = JS_DupValue(ctx, argv[1]);\ + memcpy(p, &dup, sizeof(JSValue));\ + any_map_set(util_mesh_unwrappers, plugin_name, p); + return JS_UNDEFINED; +} + +FN(util_mesh_unwrappers_delete) { + char *plugin_name = (char *)JS_ToCString(ctx, argv[0]); + map_delete(util_mesh_unwrappers, plugin_name); + return JS_UNDEFINED; +} + +extern any_map_t *path_mesh_importers; +extern char_ptr_array_t *path_mesh_formats; +FN(path_mesh_importers_set) { + char *format_name = (char *)JS_ToCString(ctx, argv[0]); + JSValue *p = malloc(sizeof(JSValue));\ + JSValue dup = JS_DupValue(ctx, argv[1]);\ + memcpy(p, &dup, sizeof(JSValue));\ + any_map_set(path_mesh_importers, format_name, p); + any_array_push(path_mesh_formats, format_name); + return JS_UNDEFINED; +} + +FN(path_mesh_importers_delete) { + char *format_name = (char *)JS_ToCString(ctx, argv[0]); + map_delete(path_mesh_importers, format_name); + array_splice(path_mesh_formats, char_ptr_array_index_of(path_mesh_formats, format_name), 1); + return JS_UNDEFINED; +} + +extern any_map_t *path_texture_importers; +extern char_ptr_array_t *path_texture_formats; +FN(path_texture_importers_set) { + char *format_name = (char *)JS_ToCString(ctx, argv[0]); + JSValue *p = malloc(sizeof(JSValue));\ + JSValue dup = JS_DupValue(ctx, argv[1]);\ + memcpy(p, &dup, sizeof(JSValue));\ + any_map_set(path_texture_importers, format_name, p); + any_array_push(path_texture_formats, format_name); + return JS_UNDEFINED; +} + +FN(path_texture_importers_delete) { + char *format_name = (char *)JS_ToCString(ctx, argv[0]); + map_delete(path_texture_importers, format_name); + array_splice(path_texture_formats, char_ptr_array_index_of(path_texture_formats, format_name), 1); + return JS_UNDEFINED; +} + void plugin_embed() { JSValue global_obj = JS_GetGlobalObject(js_ctx); @@ -54,5 +262,38 @@ void plugin_embed() { BIND(io_gltf_parse, 2); BIND(io_fbx_parse, 1); + BIND(console_log, 1); + BIND(console_info, 1); + BIND(plugin_create, 0); + BIND(plugin_notify_on_ui, 2); + BIND(plugin_notify_on_update, 2); + BIND(plugin_notify_on_delete, 2); + BIND(ui_files_show, 4); + BIND(ui_box_show_message, 2); + BIND(context_set_viewport_shader, 1); + BIND(node_shader_add_constant, 3); + BIND(node_shader_write_frag, 2); + BIND(project_filepath_get, 0); + BIND(project_save, 0); + + BIND(nodes_material_category_add, 2); + BIND(nodes_material_category_remove, 1); + BIND(parser_material_custom_nodes_set, 2); + BIND(parser_material_custom_nodes_delete, 1); + BIND(parser_material_kong_get, 0); + BIND(parser_material_parse_value_input, 2); + + BIND(nodes_brush_category_add, 2); + BIND(nodes_brush_category_remove, 1); + BIND(parser_logic_custom_nodes_set, 2); + BIND(parser_logic_custom_nodes_delete, 1); + + BIND(util_mesh_unwrappers_set, 2); + BIND(util_mesh_unwrappers_delete, 1); + BIND(path_mesh_importers_set, 2); + BIND(path_mesh_importers_delete, 1); + BIND(path_texture_importers_set, 2); + BIND(path_texture_importers_delete, 1); + JS_FreeValue(js_ctx, global_obj); } diff --git a/paint/project.js b/paint/project.js index fb278362..b5c9b704 100644 --- a/paint/project.js +++ b/paint/project.js @@ -2,11 +2,23 @@ let flags = globalThis.flags; flags.name = "ArmorPaint"; flags.package = "org.armorpaint"; +flags.embed = os_argv().indexOf("--embed") >= 0; // os_argv().indexOf("--debug") == -1; // clang 19 +flags.with_physics = true; +flags.with_d3dcompiler = true; +flags.with_nfd = true; +flags.with_compress = platform != "android"; +flags.with_image_write = true; flags.with_video_write = true; +flags.with_eval = true; +flags.with_plugins = true; +flags.with_kong = true; +flags.with_raytrace = true; +flags.idle_sleep = true; +flags.export_version_info = true; +flags.export_data_list = platform == "android"; // .apk contents let project = new Project(flags.name); project.add_project("../base"); - project.add_tsfiles("sources"); project.add_tsfiles("sources/brush_nodes"); project.add_shaders("shaders/*.kong"); @@ -16,7 +28,7 @@ project.add_assets("assets/keymap_presets/*", { destination: "data/keymap_preset project.add_assets("assets/licenses/**", { destination: "data/licenses/{name}" }); project.add_assets("assets/plugins/*", { destination: "data/plugins/{name}" }); project.add_assets("assets/meshes/*", { destination: "data/meshes/{name}", noembed: true }); +project.add_assets("assets/locale/*", { destination: "data/locale/{name}" }); project.add_assets("assets/readme/readme.txt", { destination: "{name}" }); - project.flatten(); return project; diff --git a/readme.md b/readme.md index 12961a37..13526b32 100644 --- a/readme.md +++ b/readme.md @@ -10,7 +10,7 @@ armortools **Generating a locale file** ```bash ./base/make --js base/tools/extract_locales.js -# Generates a `base/assets/locale/.json` file +# Generates a `paint/assets/locale/.json` file ``` **Embedding data files**