luboslenco 1 week ago
parent
commit
ba0f21fb80

+ 0 - 1
.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

+ 0 - 8
base/plugins/plugins.c

@@ -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);
-}

+ 0 - 6
base/plugins/project.js

@@ -1,6 +0,0 @@
-let project = new Project("plugins");
-
-project.add_cfiles("plugin_api.c");
-project.add_cfiles("plugins.c");
-
-return project;

+ 192 - 256
base/project.js

@@ -1,253 +1,213 @@
 
-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
-
-if (!flags.lite) {
-	project.add_define("IDLE_SLEEP");
-
-	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");
-	}
+function add_gpu_backend(name) {
+	project.add_cfiles("sources/backends/" + name + "_gpu.*");
+	project.add_define("BACKEND_GPU_H=\"backends/" + name + "_gpu.h\"");
+}
 
-	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");
-		}
-	}
+function add_sys_backend(name) {
+	project.add_cfiles("sources/backends/" + name + "_system.*");
+	project.add_define("BACKEND_SYS_H=\"backends/" + name + "_system.h\"");
+}
 
-	if (flags.with_plugins) {
-		project.add_define("WITH_PLUGINS");
-		project.add_project("../" + dir + "/plugins");
-		project.add_project("plugins");
-	}
+function add_net_backend(name) {
+	project.add_cfiles("sources/backends/" + name + "_net.*");
+	project.add_define("BACKEND_NET_H=\"backends/" + name + "_net.h\"");
+}
 
-	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}" });
+function add_thread_backend(name) {
+	project.add_cfiles("sources/backends/" + name + "_thread.*");
+	project.add_define("BACKEND_THREAD_H=\"backends/" + name + "_thread.h\"");
+}
 
-	if (platform === "linux" && fs_exists(os_cwd() + "/icon.png")) {
-		project.add_assets("../" + dir + "/icon.png", { destination: "{name}", noprocessing: true, noembed: true });
-	}
+// flags: make.js/load_project
+let flags = globalThis.flags;
+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.embed) {
-		project.add_define("WITH_EMBED");
-		project.add_define("arm_embed");
+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");
 	}
-	else {
-		project.add_assets("assets/extra/*", { destination: "data/{name}" });
+	if (flags.with_gamepad) {
+		project.add_lib("dinput8");
 	}
-
-	if (flags.physics) {
-		project.add_cfiles("sources/libs/asim.c");
-		project.add_define("arm_physics");
+	if (flags.with_d3dcompiler) {
+		project.add_define("WITH_D3DCOMPILER");
+		project.add_lib("d3d11");
+		project.add_lib("d3dcompiler");
 	}
-
-	// project.add_define("arm_audio");
-
-	if (platform === "android") {
-		project.add_define("arm_android_rmb");
+}
+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");
 	}
-
-	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}" });
-		}
+	if (flags.with_gamepad) {
+		project.add_lib("udev");
 	}
-
-	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}" });
+}
+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");
 	}
 
-	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}" });
+	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");
 }
 
-{
-	project.add_include_dir("sources");
+if (graphics == "metal" || (graphics == "vulkan" && platform != "android")) {
+	project.add_define("IRON_BGRA");
+}
 
-	function add_gpu_backend(name) {
-		project.add_cfiles("sources/backends/" + name + "_gpu.*");
-		project.add_define("BACKEND_GPU_H=\"backends/" + name + "_gpu.h\"");
-	}
+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");
+}
 
-	function add_sys_backend(name) {
-		project.add_cfiles("sources/backends/" + name + "_system.*");
-		project.add_define("BACKEND_SYS_H=\"backends/" + name + "_system.h\"");
-	}
+if (flags.with_plugins) {
+	project.add_define("WITH_PLUGINS");
+	project.add_project("../" + dir + "/plugins");
+	project.add_cfiles("sources/plugins/plugin_api.c");
+}
 
-	function add_net_backend(name) {
-		project.add_cfiles("sources/backends/" + name + "_net.*");
-		project.add_define("BACKEND_NET_H=\"backends/" + name + "_net.h\"");
-	}
+if (flags.embed) {
+	project.add_define("WITH_EMBED");
+	project.add_define("arm_embed");
+}
+else {
+	project.add_assets("assets/extra/*", { destination: "data/{name}" });
+}
 
-	function add_thread_backend(name) {
-		project.add_cfiles("sources/backends/" + name + "_thread.*");
-		project.add_define("BACKEND_THREAD_H=\"backends/" + name + "_thread.h\"");
-	}
+if (flags.with_physics) {
+	project.add_define("arm_physics");
+	project.add_cfiles("sources/libs/asim.c");
+}
 
-	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");
-		}
+if (flags.with_raytrace) {
+	project.add_assets("assets/raytrace/*", { destination: "data/{name}" });
+	if (graphics == "direct3d12") {
+		project.add_assets("shaders/raytrace/*.cso", { destination: "data/{name}" });
 	}
-	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 (graphics == "vulkan") {
+		project.add_assets("shaders/raytrace/*.spirv", { destination: "data/{name}" });
 	}
-	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");
-		}
+	else if (graphics == "metal") {
+		project.add_assets("shaders/raytrace/*.metal", { 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_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}" });
 }
 
-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.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}" });
+}
 
 if (flags.with_audio) {
 	project.add_define("IRON_A1");
@@ -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 (flags.idle_sleep) {
+	project.add_define("IDLE_SLEEP");
 }
 
-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");
+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 === "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);
+	else if (platform == "linux") {
+		project.add_assets("../" + dir + "/icon.png", { destination: "{name}", noprocessing: true, noembed: true });
 	}
-	project.target_options.android.versionCode = get_version_code();
-	project.target_options.android.versionName = "1.0 alpha";
-}
-else if (platform === "ios") {
-	project.add_define("IDLE_SLEEP");
 }
 
-if (flags.with_nfd && (platform === "windows" || platform === "linux" || platform === "macos")) {
+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;

+ 0 - 0
base/shaders/draw/draw_image.kong → base/shaders/draw_image.kong


+ 0 - 0
base/shaders/draw/draw_image_transform.kong → base/shaders/draw_image_transform.kong


+ 0 - 0
base/shaders/draw/draw_rect.kong → base/shaders/draw_rect.kong


+ 0 - 0
base/shaders/draw/draw_text.kong → base/shaders/draw_text.kong


+ 0 - 0
base/shaders/draw/draw_tris.kong → base/shaders/draw_tris.kong


+ 2 - 159
base/sources/iron.h

@@ -35,18 +35,6 @@
 #ifdef WITH_EMBED
 #include EMBED_H_PATH
 #endif
-#ifdef WITH_ONNX
-#include <onnxruntime_c_api.h>
-#ifdef IRON_WINDOWS
-#include <dml_provider_factory.h>
-#elif defined(IRON_MACOS)
-#include <coreml_provider_factory.h>
-#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);

+ 0 - 235
base/plugins/plugin_api.c → 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);

+ 0 - 0
base/plugins/plugin_api.h → base/sources/plugins/plugin_api.h


+ 0 - 0
paint/sources/file.ts → base/sources/ts/file.ts


+ 0 - 0
paint/sources/path.ts → base/sources/ts/path.ts


+ 0 - 5
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}" });
 

+ 1 - 6
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}" });
 

+ 0 - 4
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;

+ 23 - 30
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");
 }

+ 3 - 4
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 <locale code>`
-// Generates a `base/assets/locale/<locale code>.json` file
+// Generates a `paint/assets/locale/<locale code>.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) {

+ 8 - 4
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
 		};
 	}
 

+ 1 - 14
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;

+ 0 - 0
base/assets/cursor.png → paint/assets/cursor.png


+ 0 - 0
base/assets/cursor4x.png → paint/assets/cursor4x.png


+ 0 - 0
base/assets/icons.png → paint/assets/icons.png


+ 0 - 0
base/assets/icons2x.png → paint/assets/icons2x.png


+ 0 - 0
base/assets/locale/de.json → paint/assets/locale/de.json


+ 0 - 0
base/assets/locale/el.json → paint/assets/locale/el.json


+ 0 - 0
base/assets/locale/es.json → paint/assets/locale/es.json


+ 0 - 0
base/assets/locale/fr.json → paint/assets/locale/fr.json


+ 0 - 0
base/assets/locale/ja.json → paint/assets/locale/ja.json


+ 0 - 0
base/assets/locale/pl.json → paint/assets/locale/pl.json


+ 0 - 0
base/assets/locale/pt_br.json → paint/assets/locale/pt_br.json


+ 0 - 0
base/assets/locale/ru.json → paint/assets/locale/ru.json


+ 0 - 0
base/assets/locale/zh_cn.json → paint/assets/locale/zh_cn.json


+ 242 - 1
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);
 }

+ 14 - 2
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;

+ 1 - 1
readme.md

@@ -10,7 +10,7 @@ armortools
 **Generating a locale file**
 ```bash
 ./base/make --js base/tools/extract_locales.js <locale code>
-# Generates a `base/assets/locale/<locale code>.json` file
+# Generates a `paint/assets/locale/<locale code>.json` file
 ```
 
 **Embedding data files**