luboslenco 1 år sedan
förälder
incheckning
ae67dc52ec
100 ändrade filer med 3292 tillägg och 3298 borttagningar
  1. 15 15
      armorforge/Assets/plugins/hello_world.js
  2. 59 59
      armorforge/Sources/TabObjects.ts
  3. 15 15
      armorlab/Assets/plugins/dev/texture_breakdown.js
  4. 15 15
      armorlab/Assets/plugins/hello_world.js
  5. 21 21
      armorlab/Sources/MakeMaterial.ts
  6. 1 1
      armorlab/Sources/MakePaint.ts
  7. 89 89
      armorlab/Sources/RenderPathPaint.ts
  8. 35 35
      armorlab/Sources/UINodesExt.ts
  9. 16 16
      armorlab/Sources/nodes/BrushOutputNode.ts
  10. 4 4
      armorlab/Sources/nodes/ImageTextureNode.ts
  11. 45 45
      armorlab/Sources/nodes/InpaintNode.ts
  12. 24 24
      armorlab/Sources/nodes/PhotoToPBRNode.ts
  13. 6 6
      armorlab/Sources/nodes/RGBNode.ts
  14. 11 11
      armorlab/Sources/nodes/TextToPhotoNode.ts
  15. 22 22
      armorlab/Sources/nodes/TilingNode.ts
  16. 33 33
      armorlab/Sources/nodes/UpscaleNode.ts
  17. 13 13
      armorlab/Sources/nodes/VarianceNode.ts
  18. 4 4
      armorpaint/Assets/plugins/dev/converter.js
  19. 15 15
      armorpaint/Assets/plugins/hello_world.js
  20. 15 15
      armorpaint/Assets/plugins/texture_breakdown.js
  21. 2 2
      armorpaint/Assets/plugins/uv_unwrap.js
  22. 3 3
      armorpaint/Sources/ImportFolder.ts
  23. 52 52
      armorpaint/Sources/MakeMaterial.ts
  24. 1 1
      armorpaint/Sources/MakeMeshPreview.ts
  25. 2 2
      armorpaint/Sources/MakeNodePreview.ts
  26. 1 1
      armorpaint/Sources/MakePaint.ts
  27. 242 242
      armorpaint/Sources/RenderPathPaint.ts
  28. 57 57
      armorpaint/Sources/RenderPathPreview.ts
  29. 4 4
      armorpaint/Sources/SlotBrush.ts
  30. 3 3
      armorpaint/Sources/SlotFont.ts
  31. 83 83
      armorpaint/Sources/SlotLayer.ts
  32. 10 10
      armorpaint/Sources/SlotMaterial.ts
  33. 131 131
      armorpaint/Sources/TabLayers.ts
  34. 1 1
      armorpaint/Sources/nodes/BrushOutputNode.ts
  35. 28 28
      armorpaint/Sources/nodes/InputNode.ts
  36. 15 15
      armorsculpt/Assets/plugins/hello_world.js
  37. 1 1
      armorsculpt/Sources/ExportObj.ts
  38. 9 9
      armorsculpt/Sources/ImportMesh.ts
  39. 47 47
      armorsculpt/Sources/MakeMaterial.ts
  40. 2 2
      armorsculpt/Sources/MakeMeshPreview.ts
  41. 1 1
      armorsculpt/Sources/MakeSculpt.ts
  42. 65 65
      armorsculpt/Sources/TabLayers.ts
  43. 1 1
      armorsculpt/Sources/nodes/BrushOutputNode.ts
  44. 2 2
      base/Assets/plugins/autosave.js
  45. 2 2
      base/Sources/Args.ts
  46. 307 307
      base/Sources/Base.ts
  47. 97 97
      base/Sources/BoxExport.ts
  48. 147 147
      base/Sources/BoxPreferences.ts
  49. 53 53
      base/Sources/BoxProjects.ts
  50. 95 95
      base/Sources/Camera.ts
  51. 16 16
      base/Sources/Config.ts
  52. 11 11
      base/Sources/Console.ts
  53. 40 40
      base/Sources/Context.ts
  54. 38 38
      base/Sources/ContextFormat.ts
  55. 43 43
      base/Sources/ExportArm.ts
  56. 1 1
      base/Sources/ExportGpl.ts
  57. 60 60
      base/Sources/ExportTexture.ts
  58. 1 1
      base/Sources/File.ts
  59. 2 2
      base/Sources/Geom.ts
  60. 60 60
      base/Sources/Gizmo.ts
  61. 11 15
      base/Sources/History.ts
  62. 58 58
      base/Sources/ImportArm.ts
  63. 2 2
      base/Sources/ImportBlendMaterial.ts
  64. 40 40
      base/Sources/ImportBlendMesh.ts
  65. 49 49
      base/Sources/ImportEnvmap.ts
  66. 4 4
      base/Sources/ImportFont.ts
  67. 1 1
      base/Sources/ImportGpl.ts
  68. 6 6
      base/Sources/ImportMesh.ts
  69. 3 3
      base/Sources/ImportTexture.ts
  70. 85 85
      base/Sources/LineDraw.ts
  71. 3 3
      base/Sources/LogicNode.ts
  72. 10 10
      base/Sources/MakeVoxel.ts
  73. 7 7
      base/Sources/NodeShaderContext.ts
  74. 47 47
      base/Sources/NodesMaterial.ts
  75. 6 6
      base/Sources/Operator.ts
  76. 5 5
      base/Sources/ParserMaterial.ts
  77. 2 2
      base/Sources/Path.ts
  78. 29 29
      base/Sources/PhysicsBody.ts
  79. 22 22
      base/Sources/PhysicsWorld.ts
  80. 3 3
      base/Sources/Plugin.ts
  81. 62 62
      base/Sources/Project.ts
  82. 2 2
      base/Sources/ProjectFormat.ts
  83. 181 181
      base/Sources/RenderPathBase.ts
  84. 47 47
      base/Sources/RenderPathDeferred.ts
  85. 10 10
      base/Sources/RenderPathForward.ts
  86. 42 42
      base/Sources/RenderPathRaytrace.ts
  87. 28 28
      base/Sources/RenderPathRaytraceBake.ts
  88. 7 7
      base/Sources/Res.ts
  89. 23 23
      base/Sources/TabBrowser.ts
  90. 33 33
      base/Sources/TabBrushes.ts
  91. 16 16
      base/Sources/TabConsole.ts
  92. 33 33
      base/Sources/TabFonts.ts
  93. 5 5
      base/Sources/TabHistory.ts
  94. 70 71
      base/Sources/TabMaterials.ts
  95. 30 30
      base/Sources/TabMeshes.ts
  96. 8 9
      base/Sources/TabParticles.ts
  97. 7 7
      base/Sources/TabPlugins.ts
  98. 18 18
      base/Sources/TabScript.ts
  99. 43 43
      base/Sources/TabSwatches.ts
  100. 40 40
      base/Sources/TabTextures.ts

+ 15 - 15
armorforge/Assets/plugins/hello_world.js

@@ -10,22 +10,22 @@ let h6 = new zui.Handle();
 let h7 = new zui.Handle();
 
 plugin.drawUI = function(ui) {
-	if (ui.panel(h1, "My Plugin")) {
-		ui.text("Label");
-		ui.textInput(h7, "Text Input");
-		if (ui.button("Button")) {
+	if (Zui.panel(h1, "My Plugin")) {
+		Zui.text("Label");
+		Zui.textInput(h7, "Text Input");
+		if (Zui.button("Button")) {
 			console.error("Hello");
 		}
-		ui.row([1/2, 1/2]);
-		ui.button("Button A");
-		ui.button("Button B");
-		ui.combo(h5, ["Item 1", "Item 2"], "Combo");
-		ui.row([1/2, 1/2]);
-		ui.slider(h2, "Slider", 0, 1, true);
-		ui.slider(h3, "Slider", 0, 1, true);
-		ui.check(h4, "Check");
-		ui.radio(h6, 0, "Radio 1");
-		ui.radio(h6, 1, "Radio 2");
-		ui.radio(h6, 2, "Radio 3");
+		Zui.row([1/2, 1/2]);
+		Zui.button("Button A");
+		Zui.button("Button B");
+		Zui.combo(h5, ["Item 1", "Item 2"], "Combo");
+		Zui.row([1/2, 1/2]);
+		Zui.slider(h2, "Slider", 0, 1, true);
+		Zui.slider(h3, "Slider", 0, 1, true);
+		Zui.check(h4, "Check");
+		Zui.radio(h6, 0, "Radio 1");
+		Zui.radio(h6, 1, "Radio 2");
+		Zui.radio(h6, 2, "Radio 3");
 	}
 }

+ 59 - 59
armorforge/Sources/TabObjects.ts

@@ -8,94 +8,94 @@ class TabObjects {
 		return Math.round(f) / Math.pow(10, precision);
 	}
 
-	static draw = (htab: Handle) => {
+	static draw = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
-		if (ui.tab(htab, tr("Objects"))) {
-			ui.beginSticky();
-			ui.row([1 / 4]);
-			if (ui.button("Import")) {
+		if (Zui.tab(htab, tr("Objects"))) {
+			Zui.beginSticky();
+			Zui.row([1 / 4]);
+			if (Zui.button("Import")) {
 				Project.importMesh(false, () => {
 					BaseObject.setParent(Project.paintObjects.pop().base, null);
 				});
 			}
-			ui.endSticky();
+			Zui.endSticky();
 
-			if (ui.panel(Zui.handle("tabobjects_0", {selected: true}), "Outliner")) {
+			if (Zui.panel(Zui.handle("tabobjects_0", {selected: true}), "Outliner")) {
 				// ui.indent();
-				ui._y -= ui.ELEMENT_OFFSET();
+				ui._y -= Zui.ELEMENT_OFFSET(ui);
 
 				let listX = ui._x;
 				let listW = ui._w;
 
 				let lineCounter = 0;
-				let drawList = (listHandle: Handle, currentObject: TBaseObject) => {
+				let drawList = (listHandle: HandleRaw, currentObject: TBaseObject) => {
 					if (currentObject.name.charAt(0) == ".") return; // Hidden
 					let b = false;
 
 					// Highlight every other line
 					if (lineCounter % 2 == 0) {
 						ui.g.color = ui.t.SEPARATOR_COL;
-						Graphics2.fillRect(0, ui._y, ui._windowW, ui.ELEMENT_H());
+						g2_fill_rect(0, ui._y, ui._windowW, Zui.ELEMENT_H(ui));
 						ui.g.color = 0xffffffff;
 					}
 
 					// Highlight selected line
 					if (currentObject == Context.raw.selectedObject) {
 						ui.g.color = 0xff205d9c;
-						Graphics2.fillRect(0, ui._y, ui._windowW, ui.ELEMENT_H());
+						g2_fill_rect(0, ui._y, ui._windowW, Zui.ELEMENT_H(ui));
 						ui.g.color = 0xffffffff;
 					}
 
 					if (currentObject.children.length > 0) {
-						ui.row([1 / 13, 12 / 13]);
-						b = ui.panel(listHandle.nest(lineCounter, {selected: true}), "", true, false, false);
-						ui.text(currentObject.name);
+						Zui.row([1 / 13, 12 / 13]);
+						b = Zui.panel(Zui.nest(listHandle, lineCounter, {selected: true}), "", true, false, false);
+						Zui.text(currentObject.name);
 					}
 					else {
 						ui._x += 18; // Sign offset
 
 						// Draw line that shows parent relations
 						ui.g.color = ui.t.ACCENT_COL;
-						Graphics2.drawLine(ui._x - 10, ui._y + ui.ELEMENT_H() / 2, ui._x, ui._y + ui.ELEMENT_H() / 2);
+						g2_draw_line(ui._x - 10, ui._y + Zui.ELEMENT_H(ui) / 2, ui._x, ui._y + Zui.ELEMENT_H(ui) / 2);
 						ui.g.color = 0xffffffff;
 
-						ui.text(currentObject.name);
+						Zui.text(currentObject.name);
 						ui._x -= 18;
 					}
 
 					lineCounter++;
 					// Undo applied offset for row drawing caused by endElement() in Zui.hx
-					ui._y -= ui.ELEMENT_OFFSET();
+					ui._y -= Zui.ELEMENT_OFFSET(ui);
 
 					if (ui.isReleased) {
 						Context.raw.selectedObject = currentObject;
 					}
 
 					if (ui.isHovered && ui.inputReleasedR) {
-						UIMenu.draw((ui: Zui) => {
+						UIMenu.draw((ui: ZuiRaw) => {
 							if (UIMenu.menuButton(ui, "Assign Material")) {
 								TabObjects.materialId++;
 
-								for (let sh of Scene.raw.shader_datas) {
+								for (let sh of _scene_raw.shader_datas) {
 									if (sh.name == "Material_data") {
-										let s: TShaderData = JSON.parse(JSON.stringify(sh));
+										let s: shader_data_t = JSON.parse(JSON.stringify(sh));
 										s.name = "TempMaterial_data" + TabObjects.materialId;
-										Scene.raw.shader_datas.push(s);
+										_scene_raw.shader_datas.push(s);
 										break;
 									}
 								}
 
-								for (let mat of Scene.raw.material_datas) {
+								for (let mat of _scene_raw.material_datas) {
 									if (mat.name == "Material") {
-										let m: TMaterialData = JSON.parse(JSON.stringify(mat));
+										let m: material_data_t = JSON.parse(JSON.stringify(mat));
 										m.name = "TempMaterial" + TabObjects.materialId;
 										m.shader = "TempMaterial_data" + TabObjects.materialId;
-										Scene.raw.material_datas.push(m);
+										_scene_raw.material_datas.push(m);
 										break;
 									}
 								}
 
-								Data.getMaterial("Scene", "TempMaterial" + TabObjects.materialId, (md: TMaterialData) => {
+								Data.getMaterial("Scene", "TempMaterial" + TabObjects.materialId, (md: material_data_t) => {
 									let mo: TMeshObject = currentObject.ext;
 									mo.materials = [md];
 									MakeMaterial.parseMeshPreviewMaterial(md);
@@ -114,133 +114,133 @@ class TabObjects {
 
 						// Draw line that shows parent relations
 						ui.g.color = ui.t.ACCENT_COL;
-						Graphics2.drawLine(ui._x + 14, currentY, ui._x + 14, ui._y - ui.ELEMENT_H() / 2);
+						g2_draw_line(ui._x + 14, currentY, ui._x + 14, ui._y - Zui.ELEMENT_H(ui) / 2);
 						ui.g.color = 0xffffffff;
 					}
 				}
-				for (let c of Scene.root.children) {
+				for (let c of _scene_root.children) {
 					drawList(Zui.handle("tabobjects_1"), c);
 				}
 
 				// ui.unindent();
 			}
 
-			if (ui.panel(Zui.handle("tabobjects_2", {selected: true}), 'Properties')) {
+			if (Zui.panel(Zui.handle("tabobjects_2", {selected: true}), 'Properties')) {
 				// ui.indent();
 
 				if (Context.raw.selectedObject != null) {
 					let h = Zui.handle("tabobjects_3");
 					h.selected = Context.raw.selectedObject.visible;
-					Context.raw.selectedObject.visible = ui.check(h, "Visible");
+					Context.raw.selectedObject.visible = Zui.check(h, "Visible");
 
 					let t = Context.raw.selectedObject.transform;
 					let localPos = t.loc;
-					let worldPos = Vec4.create(Transform.worldx(t), Transform.worldy(t), Transform.worldz(t), 1.0);
+					let worldPos = vec4_create(transform_world_x(t), transform_world_y(t), transform_world_z(t), 1.0);
 					let scale = t.scale;
-					let rot = Quat.getEuler(t.rot);
+					let rot = quat_get_euler(t.rot);
 					let dim = t.dim;
-					Vec4.mult(rot, 180 / 3.141592);
+					vec4_mult(rot, 180 / 3.141592);
 					let f = 0.0;
 
-					ui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
-					ui.text("Loc");
+					Zui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
+					Zui.text("Loc");
 
 					h = Zui.handle("tabobjects_4");
 					h.text = TabObjects.roundfp(localPos.x) + "";
-					f = parseFloat(ui.textInput(h, "X"));
+					f = parseFloat(Zui.textInput(h, "X"));
 					if (h.changed) localPos.x = f;
 
 					h = Zui.handle("tabobjects_5");
 					h.text = TabObjects.roundfp(localPos.y) + "";
-					f = parseFloat(ui.textInput(h, "Y"));
+					f = parseFloat(Zui.textInput(h, "Y"));
 					if (h.changed) localPos.y = f;
 
 					h = Zui.handle("tabobjects_6");
 					h.text = TabObjects.roundfp(localPos.z) + "";
-					f = parseFloat(ui.textInput(h, "Z"));
+					f = parseFloat(Zui.textInput(h, "Z"));
 					if (h.changed) localPos.z = f;
 
-					ui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
-					ui.text("Rotation");
+					Zui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
+					Zui.text("Rotation");
 
 					h = Zui.handle("tabobjects_7");
 					h.text = TabObjects.roundfp(rot.x) + "";
-					f = parseFloat(ui.textInput(h, "X"));
+					f = parseFloat(Zui.textInput(h, "X"));
 					let changed = false;
 					if (h.changed) { changed = true; rot.x = f; }
 
 					h = Zui.handle("tabobjects_8");
 					h.text = TabObjects.roundfp(rot.y) + "";
-					f = parseFloat(ui.textInput(h, "Y"));
+					f = parseFloat(Zui.textInput(h, "Y"));
 					if (h.changed) { changed = true; rot.y = f; }
 
 					h = Zui.handle("tabobjects_9");
 					h.text = TabObjects.roundfp(rot.z) + "";
-					f = parseFloat(ui.textInput(h, "Z"));
+					f = parseFloat(Zui.textInput(h, "Z"));
 					if (h.changed) { changed = true; rot.z = f; }
 
 					if (changed && Context.raw.selectedObject.name != "Scene") {
-						Vec4.mult(rot, 3.141592 / 180);
-						Quat.fromEuler(Context.raw.selectedObject.transform.rot, rot.x, rot.y, rot.z);
-						Transform.buildMatrix(Context.raw.selectedObject.transform);
+						vec4_mult(rot, 3.141592 / 180);
+						quat_from_euler(Context.raw.selectedObject.transform.rot, rot.x, rot.y, rot.z);
+						transform_build_matrix(Context.raw.selectedObject.transform);
 						// ///if arm_physics
 						// if (rb != null) rb.syncTransform();
 						// ///end
 					}
 
-					ui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
-					ui.text("Scale");
+					Zui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
+					Zui.text("Scale");
 
 					h = Zui.handle("tabobjects_10");
 					h.text = TabObjects.roundfp(scale.x) + "";
-					f = parseFloat(ui.textInput(h, "X"));
+					f = parseFloat(Zui.textInput(h, "X"));
 					if (h.changed) scale.x = f;
 
 					h = Zui.handle("tabobjects_11");
 					h.text = TabObjects.roundfp(scale.y) + "";
-					f = parseFloat(ui.textInput(h, "Y"));
+					f = parseFloat(Zui.textInput(h, "Y"));
 					if (h.changed) scale.y = f;
 
 					h = Zui.handle("tabobjects_12");
 					h.text = TabObjects.roundfp(scale.z) + "";
-					f = parseFloat(ui.textInput(h, "Z"));
+					f = parseFloat(Zui.textInput(h, "Z"));
 					if (h.changed) scale.z = f;
 
-					ui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
-					ui.text("Dimensions");
+					Zui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
+					Zui.text("Dimensions");
 
 					h = Zui.handle("tabobjects_13");
 					h.text = TabObjects.roundfp(dim.x) + "";
-					f = parseFloat(ui.textInput(h, "X"));
+					f = parseFloat(Zui.textInput(h, "X"));
 					if (h.changed) dim.x = f;
 
 					h = Zui.handle("tabobjects_14");
 					h.text = TabObjects.roundfp(dim.y) + "";
-					f = parseFloat(ui.textInput(h, "Y"));
+					f = parseFloat(Zui.textInput(h, "Y"));
 					if (h.changed) dim.y = f;
 
 					h = Zui.handle("tabobjects_15");
 					h.text = TabObjects.roundfp(dim.z) + "";
-					f = parseFloat(ui.textInput(h, "Z"));
+					f = parseFloat(Zui.textInput(h, "Z"));
 					if (h.changed) dim.z = f;
 
 					Context.raw.selectedObject.transform.dirty = true;
 
 					if (Context.raw.selectedObject.name == "Scene") {
-						let p = Scene.world;
-						p.strength = ui.slider(Zui.handle("tabobjects_16", {value: p.strength}), "Environment", 0.0, 5.0, true);
+						let p = scene_world;
+						p.strength = Zui.slider(Zui.handle("tabobjects_16", {value: p.strength}), "Environment", 0.0, 5.0, true);
 					}
 					else if (Context.raw.selectedObject.ext.constructor == TLightObject) {
 						let light = Context.raw.selectedObject.ext;
 						let lightHandle = Zui.handle("tabobjects_17");
 						lightHandle.value = light.data.strength / 10;
-						light.data.strength = ui.slider(lightHandle, "Strength", 0.0, 5.0, true) * 10;
+						light.data.strength = Zui.slider(lightHandle, "Strength", 0.0, 5.0, true) * 10;
 					}
 					else if (Context.raw.selectedObject.ext.constructor == TCameraObject) {
 						let cam = Context.raw.selectedObject.ext;
 						let fovHandle = Zui.handle("tabobjects_18");
 						fovHandle.value = Math.floor(cam.data.fov * 100) / 100;
-						cam.data.fov = ui.slider(fovHandle, "FoV", 0.3, 2.0, true);
+						cam.data.fov = Zui.slider(fovHandle, "FoV", 0.3, 2.0, true);
 						if (fovHandle.changed) {
 							CameraObject.buildProjection(cam);
 						}

+ 15 - 15
armorlab/Assets/plugins/dev/texture_breakdown.js

@@ -7,42 +7,42 @@ let slots = ["base", "occ", "rough", "nor"];
 let breakdown = null;
 
 plugin.drawUI = function(ui) {
-	if (ui.panel(h1, "Texture Breakdown")) {
+	if (Zui.panel(h1, "Texture Breakdown")) {
 
 		ui.g.end();
 		drawBreakdown();
 		ui.g.begin(false);
 
-		// ui.row([1 / 4]);
-		// ui.combo(h2, ["Material", "Viewport"], "Type");
+		// Zui.row([1 / 4]);
+		// Zui.combo(h2, ["Material", "Viewport"], "Type");
 
-		ui.image(breakdown);
+		Zui.image(breakdown);
 		if (ui.isHovered && ui.inputReleasedR) {
 			let x = ui.inputX - ui._windowX;
 			let w = ui._windowW / slots.length;
 			let i = (x / w) | 0;
 			arm.UIMenu.draw(function(ui) {
-				ui.text(slots[i], 2, ui.t.HIGHLIGHT_COL);
-				if (ui.button("Delete", 0)) {
+				Zui.text(slots[i], 2, ui.t.HIGHLIGHT_COL);
+				if (Zui.button("Delete", 0)) {
 					slots.splice(i, 1);
 				}
 			}, 2);
 		}
 
-		ui.row([1 / 4, 1 / 4]);
+		Zui.row([1 / 4, 1 / 4]);
 
-		if (ui.button("Add")) {
+		if (Zui.button("Add")) {
 			arm.UIMenu.draw(function(ui) {
-				ui.text("Channel", 2, ui.t.HIGHLIGHT_COL);
-				if (ui.button("Base Color", 0)) { slots.push("base"); }
-				if (ui.button("Occlusion", 0)) { slots.push("occ"); }
-				if (ui.button("Roughness", 0)) { slots.push("rough"); }
-				if (ui.button("Metallic", 0)) { slots.push("metal"); }
-				if (ui.button("Normal Map", 0)) { slots.push("nor"); }
+				Zui.text("Channel", 2, ui.t.HIGHLIGHT_COL);
+				if (Zui.button("Base Color", 0)) { slots.push("base"); }
+				if (Zui.button("Occlusion", 0)) { slots.push("occ"); }
+				if (Zui.button("Roughness", 0)) { slots.push("rough"); }
+				if (Zui.button("Metallic", 0)) { slots.push("metal"); }
+				if (Zui.button("Normal Map", 0)) { slots.push("nor"); }
 			}, 6);
 		}
 
-		if (ui.button("Export")) {
+		if (Zui.button("Export")) {
 			arm.UIFiles.show("png", true, false, function(path) {
 				Base.notifyOnNextFrame(function() {
 					var f = arm.UIFiles.filename;

+ 15 - 15
armorlab/Assets/plugins/hello_world.js

@@ -10,22 +10,22 @@ let h6 = new zui.Handle();
 let h7 = new zui.Handle();
 
 plugin.drawUI = function(ui) {
-	if (ui.panel(h1, "My Plugin")) {
-		ui.text("Label");
-		ui.textInput(h7, "Text Input");
-		if (ui.button("Button")) {
+	if (Zui.panel(h1, "My Plugin")) {
+		Zui.text("Label");
+		Zui.textInput(h7, "Text Input");
+		if (Zui.button("Button")) {
 			console.error("Hello");
 		}
-		ui.row([1/2, 1/2]);
-		ui.button("Button A");
-		ui.button("Button B");
-		ui.combo(h5, ["Item 1", "Item 2"], "Combo");
-		ui.row([1/2, 1/2]);
-		ui.slider(h2, "Slider", 0, 1, true);
-		ui.slider(h3, "Slider", 0, 1, true);
-		ui.check(h4, "Check");
-		ui.radio(h6, 0, "Radio 1");
-		ui.radio(h6, 1, "Radio 2");
-		ui.radio(h6, 2, "Radio 3");
+		Zui.row([1/2, 1/2]);
+		Zui.button("Button A");
+		Zui.button("Button B");
+		Zui.combo(h5, ["Item 1", "Item 2"], "Combo");
+		Zui.row([1/2, 1/2]);
+		Zui.slider(h2, "Slider", 0, 1, true);
+		Zui.slider(h3, "Slider", 0, 1, true);
+		Zui.check(h4, "Check");
+		Zui.radio(h6, 0, "Radio 1");
+		Zui.radio(h6, 1, "Radio 2");
+		Zui.radio(h6, 2, "Radio 3");
 	}
 }

+ 21 - 21
armorlab/Sources/MakeMaterial.ts

@@ -1,8 +1,8 @@
 
 class MakeMaterial {
 
-	static defaultScon: TShaderContext = null;
-	static defaultMcon: TMaterialContext = null;
+	static defaultScon: shader_context_t = null;
+	static defaultMcon: material_context_t = null;
 	static heightUsed = false;
 
 	static parseMeshMaterial = () => {
@@ -18,17 +18,17 @@ class MakeMaterial {
 		}
 
 		let con = MakeMesh.run({ name: "Material", canvas: null });
-		let scon: TShaderContext;
-		ShaderContext.create(con.data, (_scon: TShaderContext) => { scon = _scon; });
-		scon._overrideContext = {};
+		let scon: shader_context_t;
+		shader_context_create(con.data, (_scon: shader_context_t) => { scon = _scon; });
+		scon._override_context = {};
 		if (con.frag.sharedSamplers.length > 0) {
 			let sampler = con.frag.sharedSamplers[0];
-			scon._overrideContext.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
+			scon._override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
 		}
 		if (!Context.raw.textureFilter) {
-			scon._overrideContext.filter = "point";
+			scon._override_context.filter = "point";
 		}
-		scon._overrideContext.addressing = "repeat";
+		scon._override_context.addressing = "repeat";
 		m._shader.contexts.push(scon);
 		m._shader._contexts.push(scon);
 
@@ -44,10 +44,10 @@ class MakeMaterial {
 	}
 
 	///if arm_voxels
-	static makeVoxel = (m: TMaterialData) => {
+	static makeVoxel = (m: material_data_t) => {
 		let rebuild = true; // heightUsed;
 		if (Config.raw.rp_gi != false && rebuild) {
-			let scon: TShaderContext = null;
+			let scon: shader_context_t = null;
 			for (let c of m._shader._contexts) {
 				if (c.name == "voxel") {
 					scon = c;
@@ -61,8 +61,8 @@ class MakeMaterial {
 
 	static parsePaintMaterial = () => {
 		let m = Project.materialData;
-		let scon: TShaderContext = null;
-		let mcon: TMaterialContext = null;
+		let scon: shader_context_t = null;
+		let mcon: material_context_t = null;
 		for (let c of m._shader.contexts) {
 			if (c.name == "paint") {
 				array_remove(m._shader.contexts, c);
@@ -80,20 +80,20 @@ class MakeMaterial {
 		}
 
 		let sdata: TMaterial = { name: "Material", canvas: null };
-		let mcon2: TMaterialContext = { name: "paint", bind_textures: [] };
+		let mcon2: material_context_t = { name: "paint", bind_textures: [] };
 		let con = MakePaint.run(sdata, mcon2);
 
 		let compileError = false;
-		let scon2: TShaderContext;
-		ShaderContext.create(con.data, (_scon: TShaderContext) => {
+		let scon2: shader_context_t;
+		shader_context_create(con.data, (_scon: shader_context_t) => {
 			if (_scon == null) compileError = true;
 			scon2 = _scon;
 		});
 		if (compileError) return;
-		scon2._overrideContext = {};
-		scon2._overrideContext.addressing = "repeat";
-		let mcon3: TMaterialContext;
-		MaterialContext.create(mcon2, (_mcon: TMaterialContext) => { mcon3 = _mcon; });
+		scon2._override_context = {};
+		scon2._override_context.addressing = "repeat";
+		let mcon3: material_context_t;
+		MaterialContext.create(mcon2, (_mcon: material_context_t) => { mcon3 = _mcon; });
 
 		m._shader.contexts.push(scon2);
 		m._shader._contexts.push(scon2);
@@ -114,9 +114,9 @@ class MakeMaterial {
 		return `const vec3 voxelgiHalfExtents = vec3(${ext}, ${ext}, ${ext});`;
 	}
 
-	static deleteContext = (c: TShaderContext) => {
+	static deleteContext = (c: shader_context_t) => {
 		Base.notifyOnNextFrame(() => { // Ensure pipeline is no longer in use
-			ShaderContext.delete(c);
+			shader_context_delete(c);
 		});
 	}
 }

+ 1 - 1
armorlab/Sources/MakePaint.ts

@@ -1,7 +1,7 @@
 
 class MakePaint {
 
-	static run = (data: TMaterial, matcon: TMaterialContext): NodeShaderContextRaw => {
+	static run = (data: TMaterial, matcon: material_context_t): NodeShaderContextRaw => {
 		let con_paint = NodeShaderContext.create(data, {
 			name: "paint",
 			depth_write: false,

+ 89 - 89
armorlab/Sources/RenderPathPaint.ts

@@ -6,55 +6,55 @@ class RenderPathPaint {
 	static init = () => {
 
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_blend0";
 			t.width = Config.getTextureResX();
 			t.height = Config.getTextureResY();
 			t.format = "R8";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_blend1";
 			t.width = Config.getTextureResX();
 			t.height = Config.getTextureResY();
 			t.format = "R8";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_picker";
 			t.width = 1;
 			t.height = 1;
 			t.format = "RGBA32";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_nor_picker";
 			t.width = 1;
 			t.height = 1;
 			t.format = "RGBA32";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_pack_picker";
 			t.width = 1;
 			t.height = 1;
 			t.format = "RGBA32";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_uv_picker";
 			t.width = 1;
 			t.height = 1;
 			t.format = "RGBA32";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 
-		RenderPath.loadShader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
+		render_path_load_shader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
 	}
 
 	static commandsPaint = (dilation = true) => {
@@ -65,33 +65,33 @@ class RenderPathPaint {
 			if (Context.raw.tool == WorkspaceTool.ToolPicker) {
 
 					///if krom_metal
-					//RenderPath.setTarget("texpaint_picker");
-					//RenderPath.clearTarget(0xff000000);
-					//RenderPath.setTarget("texpaint_nor_picker");
-					//RenderPath.clearTarget(0xff000000);
-					//RenderPath.setTarget("texpaint_pack_picker");
-					//RenderPath.clearTarget(0xff000000);
-					RenderPath.setTarget("texpaint_picker", ["texpaint_nor_picker", "texpaint_pack_picker", "texpaint_uv_picker"]);
+					// render_path_set_target("texpaint_picker");
+					// render_path_clear_target(0xff000000);
+					// render_path_set_target("texpaint_nor_picker");
+					// render_path_clear_target(0xff000000);
+					// render_path_set_target("texpaint_pack_picker");
+					// render_path_clear_target(0xff000000);
+					render_path_set_target("texpaint_picker", ["texpaint_nor_picker", "texpaint_pack_picker", "texpaint_uv_picker"]);
 					///else
-					RenderPath.setTarget("texpaint_picker", ["texpaint_nor_picker", "texpaint_pack_picker", "texpaint_uv_picker"]);
-					//RenderPath.clearTarget(0xff000000);
+					render_path_set_target("texpaint_picker", ["texpaint_nor_picker", "texpaint_pack_picker", "texpaint_uv_picker"]);
+					// render_path_clear_target(0xff000000);
 					///end
-					RenderPath.bindTarget("gbuffer2", "gbuffer2");
+					render_path_bind_target("gbuffer2", "gbuffer2");
 					// tid = Context.raw.layer.id;
-					RenderPath.bindTarget("texpaint" + tid, "texpaint");
-					RenderPath.bindTarget("texpaint_nor" + tid, "texpaint_nor");
-					RenderPath.bindTarget("texpaint_pack" + tid, "texpaint_pack");
-					RenderPath.drawMeshes("paint");
+					render_path_bind_target("texpaint" + tid, "texpaint");
+					render_path_bind_target("texpaint_nor" + tid, "texpaint_nor");
+					render_path_bind_target("texpaint_pack" + tid, "texpaint_pack");
+					render_path_draw_meshes("paint");
 					UIHeader.headerHandle.redraws = 2;
 
-					let texpaint_picker = RenderPath.renderTargets.get("texpaint_picker").image;
-					let texpaint_nor_picker = RenderPath.renderTargets.get("texpaint_nor_picker").image;
-					let texpaint_pack_picker = RenderPath.renderTargets.get("texpaint_pack_picker").image;
-					let texpaint_uv_picker = RenderPath.renderTargets.get("texpaint_uv_picker").image;
-					let a = Image.getPixels(texpaint_picker);
-					let b = Image.getPixels(texpaint_nor_picker);
-					let c = Image.getPixels(texpaint_pack_picker);
-					let d = Image.getPixels(texpaint_uv_picker);
+					let texpaint_picker = render_path_render_targets.get("texpaint_picker").image;
+					let texpaint_nor_picker = render_path_render_targets.get("texpaint_nor_picker").image;
+					let texpaint_pack_picker = render_path_render_targets.get("texpaint_pack_picker").image;
+					let texpaint_uv_picker = render_path_render_targets.get("texpaint_uv_picker").image;
+					let a = image_get_pixels(texpaint_picker);
+					let b = image_get_pixels(texpaint_nor_picker);
+					let c = image_get_pixels(texpaint_pack_picker);
+					let d = image_get_pixels(texpaint_uv_picker);
 
 					if (Context.raw.colorPickerCallback != null) {
 						Context.raw.colorPickerCallback(Context.raw.pickedColor);
@@ -131,25 +131,25 @@ class RenderPathPaint {
 			else {
 				let texpaint = "texpaint_node_target";
 
-				RenderPath.setTarget("texpaint_blend1");
-				RenderPath.bindTarget("texpaint_blend0", "tex");
-				RenderPath.drawShader("shader_datas/copy_pass/copyR8_pass");
+				render_path_set_target("texpaint_blend1");
+				render_path_bind_target("texpaint_blend0", "tex");
+				render_path_draw_shader("shader_datas/copy_pass/copyR8_pass");
 
-				RenderPath.setTarget(texpaint, ["texpaint_nor" + tid, "texpaint_pack" + tid, "texpaint_blend0"]);
+				render_path_set_target(texpaint, ["texpaint_nor" + tid, "texpaint_pack" + tid, "texpaint_blend0"]);
 
-				RenderPath.bindTarget("_main", "gbufferD");
+				render_path_bind_target("_main", "gbufferD");
 
-				RenderPath.bindTarget("texpaint_blend1", "paintmask");
+				render_path_bind_target("texpaint_blend1", "paintmask");
 
 				// Read texcoords from gbuffer
 				let readTC = Context.raw.tool == WorkspaceTool.ToolClone ||
 							 Context.raw.tool == WorkspaceTool.ToolBlur ||
 							 Context.raw.tool == WorkspaceTool.ToolSmudge;
 				if (readTC) {
-					RenderPath.bindTarget("gbuffer2", "gbuffer2");
+					render_path_bind_target("gbuffer2", "gbuffer2");
 				}
 
-				RenderPath.drawMeshes("paint");
+				render_path_draw_meshes("paint");
 			}
 		}
 	}
@@ -165,7 +165,7 @@ class RenderPathPaint {
 
 		let nodes = UINodes.getNodes();
 		let canvas = UINodes.getCanvas(true);
-		let inpaint = nodes.nodesSelectedId.length > 0 && nodes.getNode(canvas.nodes, nodes.nodesSelectedId[0]).type == "InpaintNode";
+		let inpaint = nodes.nodesSelectedId.length > 0 && Nodes.getNode(canvas.nodes, nodes.nodesSelectedId[0]).type == "InpaintNode";
 
 		if (!Base.uiEnabled || Base.isDragging || !inpaint) {
 			return;
@@ -182,36 +182,36 @@ class RenderPathPaint {
 	}
 
 	static drawCursor = (mx: f32, my: f32, radius: f32, tintR = 1.0, tintG = 1.0, tintB = 1.0) => {
-		let plane = Scene.getChild(".Plane").ext;
+		let plane = scene_get_child(".Plane").ext;
 		let geom = plane.data;
 		if (Base.pipeCursor == null) Base.makeCursorPipe();
 
-		RenderPath.setTarget("");
-		Graphics4.setPipeline(Base.pipeCursor);
+		render_path_set_target("");
+		g4_set_pipeline(Base.pipeCursor);
 		let img = Res.get("cursor.k");
-		Graphics4.setTexture(Base.cursorTex, img);
-		let gbuffer0 = RenderPath.renderTargets.get("gbuffer0").image;
-		Graphics4.setTextureDepth(Base.cursorGbufferD, gbuffer0);
-		Graphics4.setFloat2(Base.cursorMouse, mx, my);
-		Graphics4.setFloat2(Base.cursorTexStep, 1 / gbuffer0.width, 1 / gbuffer0.height);
-		Graphics4.setFloat(Base.cursorRadius, radius);
-		let right = Vec4.normalize(CameraObject.rightWorld(Scene.camera));
-		Graphics4.setFloat3(Base.cursorCameraRight, right.x, right.y, right.z);
-		Graphics4.setFloat3(Base.cursorTint, tintR, tintG, tintB);
-		Graphics4.setMatrix(Base.cursorVP, Scene.camera.VP);
-		let helpMat = Mat4.identity();
-		Mat4.getInverse(helpMat, Scene.camera.VP);
-		Graphics4.setMatrix(Base.cursorInvVP, helpMat);
+		g4_set_tex(Base.cursorTex, img);
+		let gbuffer0 = render_path_render_targets.get("gbuffer0").image;
+		g4_set_tex_depth(Base.cursorGbufferD, gbuffer0);
+		g4_set_float2(Base.cursorMouse, mx, my);
+		g4_set_float2(Base.cursorTexStep, 1 / gbuffer0.width, 1 / gbuffer0.height);
+		g4_set_float(Base.cursorRadius, radius);
+		let right = vec4_normalize(CameraObject.rightWorld(scene_camera));
+		g4_set_float3(Base.cursorCameraRight, right.x, right.y, right.z);
+		g4_set_float3(Base.cursorTint, tintR, tintG, tintB);
+		g4_set_mat(Base.cursorVP, scene_camera.VP);
+		let helpMat = mat4_identity();
+		mat4_get_inv(helpMat, scene_camera.VP);
+		g4_set_mat(Base.cursorInvVP, helpMat);
 		///if (krom_metal || krom_vulkan)
-		Graphics4.setVertexBuffer(MeshData.get(geom, [{name: "tex", data: "short2norm"}]));
+		g4_set_vertex_buffer(MeshData.get(geom, [{name: "tex", data: "short2norm"}]));
 		///else
-		Graphics4.setVertexBuffer(geom._vertexBuffer);
+		g4_set_vertex_buffer(geom._vertexBuffer);
 		///end
-		Graphics4.setIndexBuffer(geom._indexBuffers[0]);
-		Graphics4.drawIndexedVertices();
+		g4_set_index_buffer(geom._indexBuffers[0]);
+		g4_draw();
 
-		Graphics4.disableScissor();
-		RenderPath.end();
+		g4_disable_scissor();
+		render_path_end();
 	}
 
 	static paintEnabled = (): bool => {
@@ -239,63 +239,63 @@ class RenderPathPaint {
 		if (Context.raw.brushBlendDirty) {
 			Context.raw.brushBlendDirty = false;
 			///if krom_metal
-			RenderPath.setTarget("texpaint_blend0");
-			RenderPath.clearTarget(0x00000000);
-			RenderPath.setTarget("texpaint_blend1");
-			RenderPath.clearTarget(0x00000000);
+			render_path_set_target("texpaint_blend0");
+			render_path_clear_target(0x00000000);
+			render_path_set_target("texpaint_blend1");
+			render_path_clear_target(0x00000000);
 			///else
-			RenderPath.setTarget("texpaint_blend0", ["texpaint_blend1"]);
-			RenderPath.clearTarget(0x00000000);
+			render_path_set_target("texpaint_blend0", ["texpaint_blend1"]);
+			render_path_clear_target(0x00000000);
 			///end
 		}
 	}
 
 	static bindLayers = () => {
-		let image: ImageRaw = null;
+		let image: image_t = null;
 		let nodes = UINodes.getNodes();
 		let canvas = UINodes.getCanvas(true);
 		if (nodes.nodesSelectedId.length > 0) {
-			let node = nodes.getNode(canvas.nodes, nodes.nodesSelectedId[0]);
+			let node = Nodes.getNode(canvas.nodes, nodes.nodesSelectedId[0]);
 			let brushNode = ParserLogic.getLogicNode(node);
 			if (brushNode != null) {
 				image = brushNode.getCachedImage();
 			}
 		}
 		if (image != null) {
-			if (RenderPath.renderTargets.get("texpaint_node") == null) {
-				let t = RenderTarget.create();
+			if (render_path_render_targets.get("texpaint_node") == null) {
+				let t = render_target_create();
 				t.name = "texpaint_node";
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = "RGBA32";
-				RenderPath.renderTargets.set(t.name, t);
+				render_path_render_targets.set(t.name, t);
 			}
-			if (RenderPath.renderTargets.get("texpaint_node_target") == null) {
-				let t = RenderTarget.create();
+			if (render_path_render_targets.get("texpaint_node_target") == null) {
+				let t = render_target_create();
 				t.name = "texpaint_node_target";
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = "RGBA32";
-				RenderPath.renderTargets.set(t.name, t);
+				render_path_render_targets.set(t.name, t);
 			}
-			RenderPath.renderTargets.get("texpaint_node").image = image;
-			RenderPath.bindTarget("texpaint_node", "texpaint");
-			RenderPath.bindTarget("texpaint_nor_empty", "texpaint_nor");
-			RenderPath.bindTarget("texpaint_pack_empty", "texpaint_pack");
+			render_path_render_targets.get("texpaint_node").image = image;
+			render_path_bind_target("texpaint_node", "texpaint");
+			render_path_bind_target("texpaint_nor_empty", "texpaint_nor");
+			render_path_bind_target("texpaint_pack_empty", "texpaint_pack");
 
 			let nodes = UINodes.getNodes();
 			let canvas = UINodes.getCanvas(true);
-			let node = nodes.getNode(canvas.nodes, nodes.nodesSelectedId[0]);
+			let node = Nodes.getNode(canvas.nodes, nodes.nodesSelectedId[0]);
 			let inpaint = node.type == "InpaintNode";
 			if (inpaint) {
 				let brushNode = ParserLogic.getLogicNode(node);
-				RenderPath.renderTargets.get("texpaint_node_target").image = (brushNode as InpaintNode).getTarget();
+				render_path_render_targets.get("texpaint_node_target").image = (brushNode as InpaintNode).getTarget();
 			}
 		}
 		else {
-			RenderPath.bindTarget("texpaint", "texpaint");
-			RenderPath.bindTarget("texpaint_nor", "texpaint_nor");
-			RenderPath.bindTarget("texpaint_pack", "texpaint_pack");
+			render_path_bind_target("texpaint", "texpaint");
+			render_path_bind_target("texpaint_nor", "texpaint_nor");
+			render_path_bind_target("texpaint_pack", "texpaint_pack");
 		}
 	}
 

+ 35 - 35
armorlab/Sources/UINodesExt.ts

@@ -5,7 +5,7 @@ class UINodesExt {
 
 	static drawButtons = (ew: f32, startY: f32) => {
 		let ui = UINodes.ui;
-		if (ui.button(tr("Run"))) {
+		if (Zui.button(tr("Run"))) {
 			Console.progress(tr("Processing"));
 
 			let delayIdleSleep = (_: any) => {
@@ -29,60 +29,60 @@ class UINodesExt {
 			}
 
 			Base.notifyOnNextFrame(() => {
-				let timer = Time.time();
+				let timer = time_time();
 				ParserLogic.parse(Project.canvas);
 
 				PhotoToPBRNode.cachedSource = null;
-				BrushOutputNode.inst.getAsImage(ChannelType.ChannelBaseColor, (texbase: ImageRaw) => {
-				BrushOutputNode.inst.getAsImage(ChannelType.ChannelOcclusion, (texocc: ImageRaw) => {
-				BrushOutputNode.inst.getAsImage(ChannelType.ChannelRoughness, (texrough: ImageRaw) => {
-				BrushOutputNode.inst.getAsImage(ChannelType.ChannelNormalMap, (texnor: ImageRaw) => {
-				BrushOutputNode.inst.getAsImage(ChannelType.ChannelHeight, (texheight: ImageRaw) => {
+				BrushOutputNode.inst.getAsImage(ChannelType.ChannelBaseColor, (texbase: image_t) => {
+				BrushOutputNode.inst.getAsImage(ChannelType.ChannelOcclusion, (texocc: image_t) => {
+				BrushOutputNode.inst.getAsImage(ChannelType.ChannelRoughness, (texrough: image_t) => {
+				BrushOutputNode.inst.getAsImage(ChannelType.ChannelNormalMap, (texnor: image_t) => {
+				BrushOutputNode.inst.getAsImage(ChannelType.ChannelHeight, (texheight: image_t) => {
 
 					if (texbase != null) {
-						let texpaint = RenderPath.renderTargets.get("texpaint").image;
-						Graphics2.begin(texpaint.g2, false);
-						Graphics2.drawScaledImage(texbase, 0, 0, Config.getTextureResX(), Config.getTextureResY());
-						Graphics2.end(texpaint.g2);
+						let texpaint = render_path_render_targets.get("texpaint").image;
+						g2_begin(texpaint.g2, false);
+						g2_draw_scaled_image(texbase, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+						g2_end(texpaint.g2);
 					}
 
 					if (texnor != null) {
-						let texpaint_nor = RenderPath.renderTargets.get("texpaint_nor").image;
-						Graphics2.begin(texpaint_nor.g2, false);
-						Graphics2.drawScaledImage(texnor, 0, 0, Config.getTextureResX(), Config.getTextureResY());
-						Graphics2.end(texpaint_nor.g2);
+						let texpaint_nor = render_path_render_targets.get("texpaint_nor").image;
+						g2_begin(texpaint_nor.g2, false);
+						g2_draw_scaled_image(texnor, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+						g2_end(texpaint_nor.g2);
 					}
 
 					if (Base.pipeCopy == null) Base.makePipe();
 					if (Base.pipeCopyA == null) Base.makePipeCopyA();
 					if (ConstData.screenAlignedVB == null) ConstData.createScreenAlignedData();
 
-					let texpaint_pack = RenderPath.renderTargets.get("texpaint_pack").image;
+					let texpaint_pack = render_path_render_targets.get("texpaint_pack").image;
 
 					if (texocc != null) {
-						Graphics2.begin(texpaint_pack.g2, false);
+						g2_begin(texpaint_pack.g2, false);
 						texpaint_pack.g2.pipeline = Base.pipeCopyR;
-						Graphics2.drawScaledImage(texocc, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+						g2_draw_scaled_image(texocc, 0, 0, Config.getTextureResX(), Config.getTextureResY());
 						texpaint_pack.g2.pipeline = null;
-						Graphics2.end(texpaint_pack.g2);
+						g2_end(texpaint_pack.g2);
 					}
 
 					if (texrough != null) {
-						Graphics2.begin(texpaint_pack.g2, false);
+						g2_begin(texpaint_pack.g2, false);
 						texpaint_pack.g2.pipeline = Base.pipeCopyG;
-						Graphics2.drawScaledImage(texrough, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+						g2_draw_scaled_image(texrough, 0, 0, Config.getTextureResX(), Config.getTextureResY());
 						texpaint_pack.g2.pipeline = null;
-						Graphics2.end(texpaint_pack.g2);
+						g2_end(texpaint_pack.g2);
 					}
 
 					if (texheight != null) {
-						Graphics4.begin(texpaint_pack.g4);
-						Graphics4.setPipeline(Base.pipeCopyA);
-						Graphics4.setTexture(Base.pipeCopyATex, texheight);
-						Graphics4.setVertexBuffer(ConstData.screenAlignedVB);
-						Graphics4.setIndexBuffer(ConstData.screenAlignedIB);
-						Graphics4.drawIndexedVertices();
-						Graphics4.end();
+						g4_begin(texpaint_pack.g4);
+						g4_set_pipeline(Base.pipeCopyA);
+						g4_set_tex(Base.pipeCopyATex, texheight);
+						g4_set_vertex_buffer(ConstData.screenAlignedVB);
+						g4_set_index_buffer(ConstData.screenAlignedIB);
+						g4_draw();
+						g4_end();
 
 						if (UIHeader.worktab.position == SpaceType.Space3D &&
 							BrushOutputNode.inst.inputs[ChannelType.ChannelHeight].node.constructor != FloatNode) {
@@ -90,7 +90,7 @@ class UINodesExt {
 							// Make copy of vertices before displacement
 							let o = Project.paintObjects[0];
 							let g = o.data;
-							let vertices = VertexBuffer.lock(g._vertexBuffer);
+							let vertices = vertex_buffer_lock(g._vertex_buffer);
 							if (UINodesExt.lastVertices == null || UINodesExt.lastVertices.byteLength != vertices.byteLength) {
 								UINodesExt.lastVertices = new DataView(new ArrayBuffer(vertices.byteLength));
 								for (let i = 0; i < Math.floor(vertices.byteLength / 2); ++i) {
@@ -102,7 +102,7 @@ class UINodesExt {
 									vertices.setInt16(i * 2, UINodesExt.lastVertices.getInt16(i * 2, true), true);
 								}
 							}
-							VertexBuffer.unlock(g._vertexBuffer);
+							vertex_buffer_unlock(g._vertex_buffer);
 
 							// Apply displacement
 							if (Config.raw.displace_strength > 0) {
@@ -110,7 +110,7 @@ class UINodesExt {
 								Base.notifyOnNextFrame(() => {
 									Console.progress(tr("Apply Displacement"));
 									Base.notifyOnNextFrame(() => {
-										let uv_scale = Scene.meshes[0].data.scale_tex * Context.raw.brushScale;
+										let uv_scale = scene_meshes[0].data.scale_tex * Context.raw.brushScale;
 										UtilMesh.applyDisplacement(texpaint_pack, 0.05 * Config.raw.displace_strength, uv_scale);
 										UtilMesh.calcNormals();
 										taskDone();
@@ -120,7 +120,7 @@ class UINodesExt {
 						}
 					}
 
-					Console.log("Processing finished in " + (Time.time() - timer));
+					Console.log("Processing finished in " + (time_time() - timer));
 					Krom.mlUnload();
 
 					taskDone();
@@ -135,9 +135,9 @@ class UINodesExt {
 		ui._y = 2 + startY;
 
 		///if (krom_android || krom_ios)
-		ui.combo(Base.resHandle, ["2K", "4K"], tr("Resolution"));
+		Zui.combo(Base.resHandle, ["2K", "4K"], tr("Resolution"));
 		///else
-		ui.combo(Base.resHandle, ["2K", "4K", "8K", "16K"], tr("Resolution"));
+		Zui.combo(Base.resHandle, ["2K", "4K", "8K", "16K"], tr("Resolution"));
 		///end
 		if (Base.resHandle.changed) {
 			Base.onLayersResized();

+ 16 - 16
armorlab/Sources/nodes/BrushOutputNode.ts

@@ -2,11 +2,11 @@
 class BrushOutputNode extends LogicNode {
 
 	id = 0;
-	texpaint: ImageRaw = null;
-	texpaint_nor: ImageRaw = null;
-	texpaint_pack: ImageRaw = null;
-	texpaint_nor_empty: ImageRaw = null;
-	texpaint_pack_empty: ImageRaw = null;
+	texpaint: image_t = null;
+	texpaint_nor: image_t = null;
+	texpaint_pack: image_t = null;
+	texpaint_nor_empty: image_t = null;
+	texpaint_pack_empty: image_t = null;
 
 	static inst: BrushOutputNode = null;
 
@@ -15,44 +15,44 @@ class BrushOutputNode extends LogicNode {
 
 		if (BrushOutputNode.inst == null) {
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "texpaint";
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = "RGBA32";
-				this.texpaint = RenderPath.createRenderTarget(t).image;
+				this.texpaint = render_path_create_render_target(t).image;
 			}
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "texpaint_nor";
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = "RGBA32";
-				this.texpaint_nor = RenderPath.createRenderTarget(t).image;
+				this.texpaint_nor = render_path_create_render_target(t).image;
 			}
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "texpaint_pack";
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = "RGBA32";
-				this.texpaint_pack = RenderPath.createRenderTarget(t).image;
+				this.texpaint_pack = render_path_create_render_target(t).image;
 			}
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "texpaint_nor_empty";
 				t.width = 1;
 				t.height = 1;
 				t.format = "RGBA32";
-				this.texpaint_nor_empty = RenderPath.createRenderTarget(t).image;
+				this.texpaint_nor_empty = render_path_create_render_target(t).image;
 			}
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "texpaint_pack_empty";
 				t.width = 1;
 				t.height = 1;
 				t.format = "RGBA32";
-				this.texpaint_pack_empty = RenderPath.createRenderTarget(t).image;
+				this.texpaint_pack_empty = render_path_create_render_target(t).image;
 			}
 		}
 		else {
@@ -64,7 +64,7 @@ class BrushOutputNode extends LogicNode {
 		BrushOutputNode.inst = this;
 	}
 
-	override getAsImage = (from: i32, done: (img: ImageRaw)=>void) => {
+	override getAsImage = (from: i32, done: (img: image_t)=>void) => {
 		this.inputs[from].getAsImage(done);
 	}
 }

+ 4 - 4
armorlab/Sources/nodes/ImageTextureNode.ts

@@ -8,15 +8,15 @@ class ImageTextureNode extends LogicNode {
 		super();
 	}
 
-	override getAsImage = (from: i32, done: (img: ImageRaw)=>void) => {
+	override getAsImage = (from: i32, done: (img: image_t)=>void) => {
 		let index = Project.assetNames.indexOf(this.file);
 		let asset = Project.assets[index];
 		done(Project.getImage(asset));
 	}
 
-	override getCachedImage = (): ImageRaw => {
-		let image: ImageRaw;
-		this.getAsImage(0, (img: ImageRaw) => { image = img; });
+	override getCachedImage = (): image_t => {
+		let image: image_t;
+		this.getAsImage(0, (img: image_t) => { image = img; });
 		return image;
 	}
 

+ 45 - 45
armorlab/Sources/nodes/InpaintNode.ts

@@ -3,11 +3,11 @@ declare let Krom_texsynth: any;
 
 class InpaintNode extends LogicNode {
 
-	static image: ImageRaw = null;
-	static mask: ImageRaw = null;
-	static result: ImageRaw = null;
+	static image: image_t = null;
+	static mask: image_t = null;
+	static result: image_t = null;
 
-	static temp: ImageRaw = null;
+	static temp: image_t = null;
 	static prompt = "";
 	static strength = 0.5;
 	static auto = true;
@@ -19,90 +19,90 @@ class InpaintNode extends LogicNode {
 
 	static init = () => {
 		if (InpaintNode.image == null) {
-			InpaintNode.image = Image.createRenderTarget(Config.getTextureResX(), Config.getTextureResY());
+			InpaintNode.image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
 		}
 
 		if (InpaintNode.mask == null) {
-			InpaintNode.mask = Image.createRenderTarget(Config.getTextureResX(), Config.getTextureResY(), TextureFormat.R8);
+			InpaintNode.mask = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), TextureFormat.R8);
 			Base.notifyOnNextFrame(() => {
-				Graphics4.begin(InpaintNode.mask.g4);
-				Graphics4.clear(color_from_floats(1.0, 1.0, 1.0, 1.0));
-				Graphics4.end();
+				g4_begin(InpaintNode.mask.g4);
+				g4_clear(color_from_floats(1.0, 1.0, 1.0, 1.0));
+				g4_end();
 			});
 		}
 
 		if (InpaintNode.temp == null) {
-			InpaintNode.temp = Image.createRenderTarget(512, 512);
+			InpaintNode.temp = image_create_render_target(512, 512);
 		}
 
 		if (InpaintNode.result == null) {
-			InpaintNode.result = Image.createRenderTarget(Config.getTextureResX(), Config.getTextureResY());
+			InpaintNode.result = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
 		}
 	}
 
-	static buttons = (ui: Zui, nodes: Nodes, node: TNode) => {
+	static buttons = (ui: ZuiRaw, nodes: NodesRaw, node: TNode) => {
 		InpaintNode.auto = node.buttons[0].default_value == 0 ? false : true;
 		if (!InpaintNode.auto) {
-			InpaintNode.strength = ui.slider(Zui.handle("inpaintnode_0", {value: InpaintNode.strength}), tr("strength"), 0, 1, true);
-			InpaintNode.prompt = ui.textArea(Zui.handle("inpaintnode_1"), Align.Left, true, tr("prompt"), true);
+			InpaintNode.strength = Zui.slider(Zui.handle("inpaintnode_0", {value: InpaintNode.strength}), tr("strength"), 0, 1, true);
+			InpaintNode.prompt = Zui.textArea(Zui.handle("inpaintnode_1"), Align.Left, true, tr("prompt"), true);
 			node.buttons[1].height = 1 + InpaintNode.prompt.split("\n").length;
 		}
 		else node.buttons[1].height = 0;
 	}
 
-	override getAsImage = (from: i32, done: (img: ImageRaw)=>void) => {
-		this.inputs[0].getAsImage((source: ImageRaw) => {
+	override getAsImage = (from: i32, done: (img: image_t)=>void) => {
+		this.inputs[0].getAsImage((source: image_t) => {
 
 			Console.progress(tr("Processing") + " - " + tr("Inpaint"));
 			Base.notifyOnNextFrame(() => {
-				Graphics2.begin(InpaintNode.image.g2, false);
-				Graphics2.drawScaledImage(source, 0, 0, Config.getTextureResX(), Config.getTextureResY());
-				Graphics2.end(InpaintNode.image.g2);
+				g2_begin(InpaintNode.image.g2, false);
+				g2_draw_scaled_image(source, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+				g2_end(InpaintNode.image.g2);
 
 				InpaintNode.auto ? InpaintNode.texsynthInpaint(InpaintNode.image, false, InpaintNode.mask, done) : InpaintNode.sdInpaint(InpaintNode.image, InpaintNode.mask, done);
 			});
 		});
 	}
 
-	override getCachedImage = (): ImageRaw => {
+	override getCachedImage = (): image_t => {
 		Base.notifyOnNextFrame(() => {
-			this.inputs[0].getAsImage((source: ImageRaw) => {
+			this.inputs[0].getAsImage((source: image_t) => {
 				if (Base.pipeCopy == null) Base.makePipe();
 				if (ConstData.screenAlignedVB == null) ConstData.createScreenAlignedData();
-				Graphics4.begin(InpaintNode.image.g4);
-				Graphics4.setPipeline(Base.pipeInpaintPreview);
-				Graphics4.setTexture(Base.tex0InpaintPreview, source);
-				Graphics4.setTexture(Base.texaInpaintPreview, InpaintNode.mask);
-				Graphics4.setVertexBuffer(ConstData.screenAlignedVB);
-				Graphics4.setIndexBuffer(ConstData.screenAlignedIB);
-				Graphics4.drawIndexedVertices();
-				Graphics4.end();
+				g4_begin(InpaintNode.image.g4);
+				g4_set_pipeline(Base.pipeInpaintPreview);
+				g4_set_tex(Base.tex0InpaintPreview, source);
+				g4_set_tex(Base.texaInpaintPreview, InpaintNode.mask);
+				g4_set_vertex_buffer(ConstData.screenAlignedVB);
+				g4_set_index_buffer(ConstData.screenAlignedIB);
+				g4_draw();
+				g4_end();
 			});
 		});
 		return InpaintNode.image;
 	}
 
-	getTarget = (): ImageRaw => {
+	getTarget = (): image_t => {
 		return InpaintNode.mask;
 	}
 
-	static texsynthInpaint = (image: ImageRaw, tiling: bool, mask: ImageRaw/* = null*/, done: (img: ImageRaw)=>void) => {
+	static texsynthInpaint = (image: image_t, tiling: bool, mask: image_t/* = null*/, done: (img: image_t)=>void) => {
 		let w = Config.getTextureResX();
 		let h = Config.getTextureResY();
 
-		let bytes_img = Image.getPixels(image);
-		let bytes_mask = mask != null ? Image.getPixels(mask) : new ArrayBuffer(w * h);
+		let bytes_img = image_get_pixels(image);
+		let bytes_mask = mask != null ? image_get_pixels(mask) : new ArrayBuffer(w * h);
 		let bytes_out = new ArrayBuffer(w * h * 4);
 		Krom_texsynth.inpaint(w, h, bytes_out, bytes_img, bytes_mask, tiling);
 
-		InpaintNode.result = Image.fromBytes(bytes_out, w, h);
+		InpaintNode.result = image_from_bytes(bytes_out, w, h);
 		done(InpaintNode.result);
 	}
 
-	static sdInpaint = (image: ImageRaw, mask: ImageRaw, done: (img: ImageRaw)=>void) => {
+	static sdInpaint = (image: image_t, mask: image_t, done: (img: image_t)=>void) => {
 		InpaintNode.init();
 
-		let bytes_img = Image.getPixels(mask);
+		let bytes_img = image_get_pixels(mask);
 		let u8 = new Uint8Array(bytes_img);
 		let f32mask = new Float32Array(4 * 64 * 64);
 
@@ -127,12 +127,12 @@ class InpaintNode extends LogicNode {
 						}
 					}
 
-					Graphics2.begin(InpaintNode.temp.g2, false);
-					// Graphics2.drawImage(image, -x * 512, -y * 512);
-					Graphics2.drawScaledImage(image, 0, 0, 512, 512);
-					Graphics2.end(InpaintNode.temp.g2);
+					g2_begin(InpaintNode.temp.g2, false);
+					// g2_drawImage(image, -x * 512, -y * 512);
+					g2_draw_scaled_image(image, 0, 0, 512, 512);
+					g2_end(InpaintNode.temp.g2);
 
-					let bytes_img = Image.getPixels(InpaintNode.temp);
+					let bytes_img = image_get_pixels(InpaintNode.temp);
 					let u8a = new Uint8Array(bytes_img);
 					let f32a = new Float32Array(3 * 512 * 512);
 					for (let i = 0; i < (512 * 512); ++i) {
@@ -163,10 +163,10 @@ class InpaintNode extends LogicNode {
 
 					let start = num_inference_steps - init_timestep;
 
-					TextToPhotoNode.stableDiffusion(InpaintNode.prompt, (img: ImageRaw) => {
-						// result.g2.begin(false);
-						// result.g2.drawImage(img, x * 512, y * 512);
-						// result.g2.end();
+					TextToPhotoNode.stableDiffusion(InpaintNode.prompt, (img: image_t) => {
+						// result.g2_begin(false);
+						// result.g2_draw_image(img, x * 512, y * 512);
+						// result.g2_end();
 						InpaintNode.result = img;
 						done(img);
 					}, latents, start, true, f32mask, latents_orig);

+ 24 - 24
armorlab/Sources/nodes/PhotoToPBRNode.ts

@@ -1,11 +1,11 @@
 
 class PhotoToPBRNode extends LogicNode {
 
-	static temp: ImageRaw = null;
-	static images: ImageRaw[] = null;
+	static temp: image_t = null;
+	static images: image_t[] = null;
 	static modelNames = ["base", "occlusion", "roughness", "metallic", "normal", "height"];
 
-	static cachedSource: ImageRaw = null;
+	static cachedSource: image_t = null;
 	static borderW = 64;
 	static tileW = 2048;
 	static tileWithBorderW = PhotoToPBRNode.tileW + PhotoToPBRNode.borderW * 2;
@@ -14,7 +14,7 @@ class PhotoToPBRNode extends LogicNode {
 		super();
 
 		if (PhotoToPBRNode.temp == null) {
-			PhotoToPBRNode.temp = Image.createRenderTarget(PhotoToPBRNode.tileWithBorderW, PhotoToPBRNode.tileWithBorderW);
+			PhotoToPBRNode.temp = image_create_render_target(PhotoToPBRNode.tileWithBorderW, PhotoToPBRNode.tileWithBorderW);
 		}
 
 		PhotoToPBRNode.init();
@@ -24,18 +24,18 @@ class PhotoToPBRNode extends LogicNode {
 		if (PhotoToPBRNode.images == null) {
 			PhotoToPBRNode.images = [];
 			for (let i = 0; i < PhotoToPBRNode.modelNames.length; ++i) {
-				PhotoToPBRNode.images.push(Image.createRenderTarget(Config.getTextureResX(), Config.getTextureResY()));
+				PhotoToPBRNode.images.push(image_create_render_target(Config.getTextureResX(), Config.getTextureResY()));
 			}
 		}
 	}
 
-	override getAsImage = (from: i32, done: (img: ImageRaw)=>void) => {
-		let getSource = (done: (img: ImageRaw)=>void) => {
+	override getAsImage = (from: i32, done: (img: image_t)=>void) => {
+		let getSource = (done: (img: image_t)=>void) => {
 			if (PhotoToPBRNode.cachedSource != null) done(PhotoToPBRNode.cachedSource);
 			else this.inputs[0].getAsImage(done);
 		}
 
-		getSource((source: ImageRaw) => {
+		getSource((source: image_t) => {
 			PhotoToPBRNode.cachedSource = source;
 
 			Console.progress(tr("Processing") + " - " + tr("Photo to PBR"));
@@ -48,17 +48,17 @@ class PhotoToPBRNode extends LogicNode {
 					let x = i % tilesX;
 					let y = Math.floor(i / tilesX);
 
-					Graphics2.begin(PhotoToPBRNode.temp.g2, false);
-					Graphics2.drawScaledImage(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, -Config.getTextureResX(), Config.getTextureResY());
-					Graphics2.drawScaledImage(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, Config.getTextureResX(), -Config.getTextureResY());
-					Graphics2.drawScaledImage(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, -Config.getTextureResX(), -Config.getTextureResY());
-					Graphics2.drawScaledImage(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, Config.getTextureResX(), Config.getTextureResY());
-					Graphics2.drawScaledImage(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, -Config.getTextureResX(), Config.getTextureResY());
-					Graphics2.drawScaledImage(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, Config.getTextureResX(), -Config.getTextureResY());
-					Graphics2.drawScaledImage(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, Config.getTextureResX(), Config.getTextureResY());
-					Graphics2.end(PhotoToPBRNode.temp.g2);
-
-					let bytes_img = Image.getPixels(PhotoToPBRNode.temp);
+					g2_begin(PhotoToPBRNode.temp.g2, false);
+					g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, -Config.getTextureResX(), Config.getTextureResY());
+					g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, Config.getTextureResX(), -Config.getTextureResY());
+					g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, -Config.getTextureResX(), -Config.getTextureResY());
+					g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, Config.getTextureResX(), Config.getTextureResY());
+					g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, -Config.getTextureResX(), Config.getTextureResY());
+					g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW + PhotoToPBRNode.tileW, Config.getTextureResX(), -Config.getTextureResY());
+					g2_draw_scaled_image(source, PhotoToPBRNode.borderW - x * PhotoToPBRNode.tileW, PhotoToPBRNode.borderW - y * PhotoToPBRNode.tileW, Config.getTextureResX(), Config.getTextureResY());
+					g2_end(PhotoToPBRNode.temp.g2);
+
+					let bytes_img = image_get_pixels(PhotoToPBRNode.temp);
 					let u8a = new Uint8Array(bytes_img);
 					let f32a = new Float32Array(3 * PhotoToPBRNode.tileWithBorderW * PhotoToPBRNode.tileWithBorderW);
 					for (let i = 0; i < (PhotoToPBRNode.tileWithBorderW * PhotoToPBRNode.tileWithBorderW); ++i) {
@@ -141,12 +141,12 @@ class PhotoToPBRNode extends LogicNode {
 						if (from == ChannelType.ChannelBaseColor) PhotoToPBRNode.bgraSwap(u8a.buffer);
 						///end
 
-						let temp2 = Image.fromBytes(u8a.buffer, PhotoToPBRNode.tileW, PhotoToPBRNode.tileW);
-						Graphics2.begin(PhotoToPBRNode.images[from].g2, false);
-						Graphics2.drawImage(temp2, x * PhotoToPBRNode.tileW, y * PhotoToPBRNode.tileW);
-						Graphics2.end(PhotoToPBRNode.images[from].g2);
+						let temp2 = image_from_bytes(u8a.buffer, PhotoToPBRNode.tileW, PhotoToPBRNode.tileW);
+						g2_begin(PhotoToPBRNode.images[from].g2, false);
+						g2_draw_image(temp2, x * PhotoToPBRNode.tileW, y * PhotoToPBRNode.tileW);
+						g2_end(PhotoToPBRNode.images[from].g2);
 						Base.notifyOnNextFrame(() => {
-							Image.unload(temp2);
+							image_unload(temp2);
 						});
 					});
 				}

+ 6 - 6
armorlab/Sources/nodes/RGBNode.ts

@@ -1,16 +1,16 @@
 
 class RGBNode extends LogicNode {
 
-	image: ImageRaw = null;
+	image: image_t = null;
 
 	constructor() {
 		super();
 	}
 
-	override getAsImage = (from: i32, done: (img: ImageRaw)=>void) => {
+	override getAsImage = (from: i32, done: (img: image_t)=>void) => {
 		if (this.image != null) {
 			Base.notifyOnNextFrame(() => {
-				Image.unload(this.image);
+				image_unload(this.image);
 			});
 		}
 
@@ -21,12 +21,12 @@ class RGBNode extends LogicNode {
 		f32a[1] = default_value[1];
 		f32a[2] = default_value[2];
 		f32a[3] = default_value[3];
-		this.image = Image.fromBytes(f32a.buffer, 1, 1, TextureFormat.RGBA128);
+		this.image = image_from_bytes(f32a.buffer, 1, 1, TextureFormat.RGBA128);
 		done(this.image);
 	}
 
-	override getCachedImage = (): ImageRaw => {
-		this.getAsImage(0, (img: ImageRaw) => {});
+	override getCachedImage = (): image_t => {
+		this.getAsImage(0, (img: image_t) => {});
 		return this.image;
 	}
 

+ 11 - 11
armorlab/Sources/nodes/TextToPhotoNode.ts

@@ -2,7 +2,7 @@
 class TextToPhotoNode extends LogicNode {
 
 	static prompt = "";
-	static image: ImageRaw = null;
+	static image: image_t = null;
 	static tiling = false;
 	static text_encoder_blob : ArrayBuffer;
 	static unet_blob : ArrayBuffer;
@@ -12,24 +12,24 @@ class TextToPhotoNode extends LogicNode {
 		super();
 	}
 
-	override getAsImage = (from: i32, done: (img: ImageRaw)=>void) => {
-		TextToPhotoNode.stableDiffusion(TextToPhotoNode.prompt, (_image: ImageRaw) => {
+	override getAsImage = (from: i32, done: (img: image_t)=>void) => {
+		TextToPhotoNode.stableDiffusion(TextToPhotoNode.prompt, (_image: image_t) => {
 			TextToPhotoNode.image = _image;
 			done(TextToPhotoNode.image);
 		});
 	}
 
-	override getCachedImage = (): ImageRaw => {
+	override getCachedImage = (): image_t => {
 		return TextToPhotoNode.image;
 	}
 
-	static buttons = (ui: Zui, nodes: Nodes, node: TNode) => {
+	static buttons = (ui: ZuiRaw, nodes: NodesRaw, node: TNode) => {
 		TextToPhotoNode.tiling = node.buttons[0].default_value == 0 ? false : true;
-		TextToPhotoNode.prompt = ui.textArea(Zui.handle("texttophotonode_0"), Align.Left, true, tr("prompt"), true);
+		TextToPhotoNode.prompt = Zui.textArea(Zui.handle("texttophotonode_0"), Align.Left, true, tr("prompt"), true);
 		node.buttons[1].height = TextToPhotoNode.prompt.split("\n").length;
 	}
 
-	static stableDiffusion = (prompt: string, done: (img: ImageRaw)=>void, inpaintLatents: Float32Array = null, offset = 0, upscale = true, mask: Float32Array = null, latents_orig: Float32Array = null) => {
+	static stableDiffusion = (prompt: string, done: (img: image_t)=>void, inpaintLatents: Float32Array = null, offset = 0, upscale = true, mask: Float32Array = null, latents_orig: Float32Array = null) => {
 		Data.getBlob("models/sd_text_encoder.quant.onnx", (_text_encoder_blob: ArrayBuffer) => {
 		Data.getBlob("models/sd_unet.quant.onnx", (_unet_blob: ArrayBuffer) => {
 		Data.getBlob("models/sd_vae_decoder.quant.onnx", (_vae_decoder_blob: ArrayBuffer) => {
@@ -95,7 +95,7 @@ class TextToPhotoNode extends LogicNode {
 		let ets: Float32Array[] = [];
 		let counter = 0;
 
-		let processing = (g: Graphics2Raw) => {
+		let processing = (g: g2_t) => {
 			Console.progress(tr("Processing") + " - " + tr("Text to Photo") + " (" + (counter + 1) + "/" + (50 - offset) + ")");
 
 			let timestep = TextToPhotoNode.timesteps[counter + offset];
@@ -195,7 +195,7 @@ class TextToPhotoNode extends LogicNode {
 		App.notifyOnRender2D(processing);
 	}
 
-	static vaeDecoder = (latents: Float32Array, upscale: bool, done: (img: ImageRaw)=>void) => {
+	static vaeDecoder = (latents: Float32Array, upscale: bool, done: (img: image_t)=>void) => {
 		Console.progress(tr("Processing") + " - " + tr("Text to Photo"));
 		Base.notifyOnNextFrame(() => {
 			for (let i = 0; i < latents.length; ++i) {
@@ -218,7 +218,7 @@ class TextToPhotoNode extends LogicNode {
 				u8a[i * 4 + 2] = Math.floor(pyimage[i + 512 * 512 * 2] * 255);
 				u8a[i * 4 + 3] = 255;
 			}
-			let image = Image.fromBytes(u8a.buffer, 512, 512);
+			let image = image_from_bytes(u8a.buffer, 512, 512);
 
 			if (TextToPhotoNode.tiling) {
 				TilingNode.prompt = TextToPhotoNode.prompt;
@@ -231,7 +231,7 @@ class TextToPhotoNode extends LogicNode {
 						while (image.width < Config.getTextureResX()) {
 							let lastImage = image;
 							image = UpscaleNode.esrgan(image);
-							Image.unload(lastImage);
+							image_unload(lastImage);
 						}
 						done(image);
 					});

+ 22 - 22
armorlab/Sources/nodes/TilingNode.ts

@@ -1,8 +1,8 @@
 
 class TilingNode extends LogicNode {
 
-	result: ImageRaw = null;
-	static image: ImageRaw = null;
+	result: image_t = null;
+	static image: image_t = null;
 	static prompt = "";
 	static strength = 0.5;
 	static auto = true;
@@ -14,29 +14,29 @@ class TilingNode extends LogicNode {
 
 	static init = () => {
 		if (TilingNode.image == null) {
-			TilingNode.image = Image.createRenderTarget(Config.getTextureResX(), Config.getTextureResY());
+			TilingNode.image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
 		}
 	}
 
-	static buttons = (ui: Zui, nodes: Nodes, node: TNode) => {
+	static buttons = (ui: ZuiRaw, nodes: NodesRaw, node: TNode) => {
 		TilingNode.auto = node.buttons[0].default_value == 0 ? false : true;
 		if (!TilingNode.auto) {
-			TilingNode.strength = ui.slider(Zui.handle("tilingnode_0", {value: TilingNode.strength}), tr("strength"), 0, 1, true);
-			TilingNode.prompt = ui.textArea(Zui.handle("tilingnode_1"), Align.Left, true, tr("prompt"), true);
+			TilingNode.strength = Zui.slider(Zui.handle("tilingnode_0", {value: TilingNode.strength}), tr("strength"), 0, 1, true);
+			TilingNode.prompt = Zui.textArea(Zui.handle("tilingnode_1"), Align.Left, true, tr("prompt"), true);
 			node.buttons[1].height = 1 + TilingNode.prompt.split("\n").length;
 		}
 		else node.buttons[1].height = 0;
 	}
 
-	override getAsImage = (from: i32, done: (img: ImageRaw)=>void) => {
-		this.inputs[0].getAsImage((source: ImageRaw) => {
-			Graphics2.begin(TilingNode.image.g2, false);
-			Graphics2.drawScaledImage(source, 0, 0, Config.getTextureResX(), Config.getTextureResY());
-			Graphics2.end(TilingNode.image.g2);
+	override getAsImage = (from: i32, done: (img: image_t)=>void) => {
+		this.inputs[0].getAsImage((source: image_t) => {
+			g2_begin(TilingNode.image.g2, false);
+			g2_draw_scaled_image(source, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+			g2_end(TilingNode.image.g2);
 
 			Console.progress(tr("Processing") + " - " + tr("Tiling"));
 			Base.notifyOnNextFrame(() => {
-				let _done = (image: ImageRaw) => {
+				let _done = (image: image_t) => {
 					this.result = image;
 					done(image);
 				}
@@ -45,19 +45,19 @@ class TilingNode extends LogicNode {
 		});
 	}
 
-	override getCachedImage = (): ImageRaw => {
+	override getCachedImage = (): image_t => {
 		return this.result;
 	}
 
-	static sdTiling = (image: ImageRaw, seed: i32/* = -1*/, done: (img: ImageRaw)=>void) => {
+	static sdTiling = (image: image_t, seed: i32/* = -1*/, done: (img: image_t)=>void) => {
 		TextToPhotoNode.tiling = false;
-		let tile = Image.createRenderTarget(512, 512);
-		Graphics2.begin(tile.g2, false);
-		Graphics2.drawScaledImage(image, -256, -256, 512, 512);
-		Graphics2.drawScaledImage(image, 256, -256, 512, 512);
-		Graphics2.drawScaledImage(image, -256, 256, 512, 512);
-		Graphics2.drawScaledImage(image, 256, 256, 512, 512);
-		Graphics2.end(tile.g2);
+		let tile = image_create_render_target(512, 512);
+		g2_begin(tile.g2, false);
+		g2_draw_scaled_image(image, -256, -256, 512, 512);
+		g2_draw_scaled_image(image, 256, -256, 512, 512);
+		g2_draw_scaled_image(image, -256, 256, 512, 512);
+		g2_draw_scaled_image(image, 256, 256, 512, 512);
+		g2_end(tile.g2);
 
 		let u8a = new Uint8Array(512 * 512);
 		for (let i = 0; i < 512 * 512; ++i) {
@@ -77,7 +77,7 @@ class TilingNode extends LogicNode {
 		// 		u8a[y * 512 + x] = 0;
 		// 	}
 		// }
-		let mask = Image.fromBytes(u8a.buffer, 512, 512, TextureFormat.R8);
+		let mask = image_from_bytes(u8a.buffer, 512, 512, TextureFormat.R8);
 
 		InpaintNode.prompt = TilingNode.prompt;
 		InpaintNode.strength = TilingNode.strength;

+ 33 - 33
armorlab/Sources/nodes/UpscaleNode.ts

@@ -1,16 +1,16 @@
 
 class UpscaleNode extends LogicNode {
 
-	static temp: ImageRaw = null;
-	static image: ImageRaw = null;
+	static temp: image_t = null;
+	static image: image_t = null;
 	static esrgan_blob: ArrayBuffer;
 
 	constructor() {
 		super();
 	}
 
-	override getAsImage = (from: i32, done: (img: ImageRaw)=>void) => {
-		this.inputs[0].getAsImage((_image: ImageRaw) => {
+	override getAsImage = (from: i32, done: (img: image_t)=>void) => {
+		this.inputs[0].getAsImage((_image: image_t) => {
 			UpscaleNode.image = _image;
 
 			Console.progress(tr("Processing") + " - " + tr("Upscale"));
@@ -21,7 +21,7 @@ class UpscaleNode extends LogicNode {
 						while (UpscaleNode.image.width < Config.getTextureResX()) {
 							let lastImage = UpscaleNode.image;
 							UpscaleNode.image = UpscaleNode.esrgan(UpscaleNode.image);
-							Image.unload(lastImage);
+							image_unload(lastImage);
 						}
 					}
 					done(UpscaleNode.image);
@@ -37,25 +37,25 @@ class UpscaleNode extends LogicNode {
 		});
 	}
 
-	override getCachedImage = (): ImageRaw => {
+	override getCachedImage = (): image_t => {
 		return UpscaleNode.image;
 	}
 
-	static doTile = (source: ImageRaw) => {
-		let result: ImageRaw = null;
+	static doTile = (source: image_t) => {
+		let result: image_t = null;
 		let size1w = source.width;
 		let size1h = source.height;
 		let size2w = Math.floor(size1w * 2);
 		let size2h = Math.floor(size1h * 2);
 		if (UpscaleNode.temp != null) {
-			Image.unload(UpscaleNode.temp);
+			image_unload(UpscaleNode.temp);
 		}
-		UpscaleNode.temp = Image.createRenderTarget(size1w, size1h);
-		Graphics2.begin(UpscaleNode.temp.g2, false);
-		Graphics2.drawScaledImage(source, 0, 0, size1w, size1h);
-		Graphics2.end(UpscaleNode.temp.g2);
+		UpscaleNode.temp = image_create_render_target(size1w, size1h);
+		g2_begin(UpscaleNode.temp.g2, false);
+		g2_draw_scaled_image(source, 0, 0, size1w, size1h);
+		g2_end(UpscaleNode.temp.g2);
 
-		let bytes_img = Image.getPixels(UpscaleNode.temp);
+		let bytes_img = image_get_pixels(UpscaleNode.temp);
 		let u8a = new Uint8Array(bytes_img);
 		let f32a = new Float32Array(3 * size1w * size1h);
 		for (let i = 0; i < (size1w * size1h); ++i) {
@@ -79,12 +79,12 @@ class UpscaleNode extends LogicNode {
 			u8a[i * 4 + 3] = 255;
 		}
 
-		result = Image.fromBytes(u8a.buffer, size2w, size2h);
+		result = image_from_bytes(u8a.buffer, size2w, size2h);
 		return result;
 	}
 
-	static esrgan = (source: ImageRaw): ImageRaw => {
-		let result: ImageRaw = null;
+	static esrgan = (source: image_t): image_t => {
+		let result: image_t = null;
 		let size1w = source.width;
 		let size1h = source.height;
 		let tileSize = 512;
@@ -93,27 +93,27 @@ class UpscaleNode extends LogicNode {
 		if (size1w >= tileSize2x || size1h >= tileSize2x) { // Split into tiles
 			let size2w = Math.floor(size1w * 2);
 			let size2h = Math.floor(size1h * 2);
-			result = Image.createRenderTarget(size2w, size2h);
-			let tileSource = Image.createRenderTarget(tileSize + 32 * 2, tileSize + 32 * 2);
+			result = image_create_render_target(size2w, size2h);
+			let tileSource = image_create_render_target(tileSize + 32 * 2, tileSize + 32 * 2);
 			for (let x = 0; x < Math.floor(size1w / tileSize); ++x) {
 				for (let y = 0; y < Math.floor(size1h / tileSize); ++y) {
-					Graphics2.begin(tileSource.g2, false);
-					Graphics2.drawScaledImage(source, 32 - x * tileSize, 32 - y * tileSize, -source.width, source.height);
-					Graphics2.drawScaledImage(source, 32 - x * tileSize, 32 - y * tileSize, source.width, -source.height);
-					Graphics2.drawScaledImage(source, 32 - x * tileSize, 32 - y * tileSize, -source.width, -source.height);
-					Graphics2.drawScaledImage(source, 32 - x * tileSize + tileSize, 32 - y * tileSize + tileSize, source.width, source.height);
-					Graphics2.drawScaledImage(source, 32 - x * tileSize + tileSize, 32 - y * tileSize + tileSize, -source.width, source.height);
-					Graphics2.drawScaledImage(source, 32 - x * tileSize + tileSize, 32 - y * tileSize + tileSize, source.width, -source.height);
-					Graphics2.drawScaledImage(source, 32 - x * tileSize, 32 - y * tileSize, source.width, source.height);
-					Graphics2.end(tileSource.g2);
+					g2_begin(tileSource.g2, false);
+					g2_draw_scaled_image(source, 32 - x * tileSize, 32 - y * tileSize, -source.width, source.height);
+					g2_draw_scaled_image(source, 32 - x * tileSize, 32 - y * tileSize, source.width, -source.height);
+					g2_draw_scaled_image(source, 32 - x * tileSize, 32 - y * tileSize, -source.width, -source.height);
+					g2_draw_scaled_image(source, 32 - x * tileSize + tileSize, 32 - y * tileSize + tileSize, source.width, source.height);
+					g2_draw_scaled_image(source, 32 - x * tileSize + tileSize, 32 - y * tileSize + tileSize, -source.width, source.height);
+					g2_draw_scaled_image(source, 32 - x * tileSize + tileSize, 32 - y * tileSize + tileSize, source.width, -source.height);
+					g2_draw_scaled_image(source, 32 - x * tileSize, 32 - y * tileSize, source.width, source.height);
+					g2_end(tileSource.g2);
 					let tileResult = UpscaleNode.doTile(tileSource);
-					Graphics2.begin(result.g2, false);
-					Graphics2.drawSubImage(tileResult, x * tileSize2x, y * tileSize2x, 64, 64, tileSize2x, tileSize2x);
-					Graphics2.end(result.g2);
-					Image.unload(tileResult);
+					g2_begin(result.g2, false);
+					g2_draw_sub_image(tileResult, x * tileSize2x, y * tileSize2x, 64, 64, tileSize2x, tileSize2x);
+					g2_end(result.g2);
+					image_unload(tileResult);
 				}
 			}
-			Image.unload(tileSource);
+			image_unload(tileSource);
 		}
 		else result = UpscaleNode.doTile(source); // Single tile
 		return result;

+ 13 - 13
armorlab/Sources/nodes/VarianceNode.ts

@@ -1,8 +1,8 @@
 
 class VarianceNode extends LogicNode {
 
-	static temp: ImageRaw = null;
-	static image: ImageRaw = null;
+	static temp: image_t = null;
+	static image: image_t = null;
 	static inst: VarianceNode = null;
 	static prompt = "";
 
@@ -14,24 +14,24 @@ class VarianceNode extends LogicNode {
 
 	static init = () => {
 		if (VarianceNode.temp == null) {
-			VarianceNode.temp = Image.createRenderTarget(512, 512);
+			VarianceNode.temp = image_create_render_target(512, 512);
 		}
 	}
 
-	static buttons = (ui: Zui, nodes: Nodes, node: TNode) => {
-		VarianceNode.prompt = ui.textArea(Zui.handle("variancenode_0"), Align.Left, true, tr("prompt"), true);
+	static buttons = (ui: ZuiRaw, nodes: NodesRaw, node: TNode) => {
+		VarianceNode.prompt = Zui.textArea(Zui.handle("variancenode_0"), Align.Left, true, tr("prompt"), true);
 		node.buttons[0].height = VarianceNode.prompt.split("\n").length;
 	}
 
-	override getAsImage = (from: i32, done: (img: ImageRaw)=>void) => {
+	override getAsImage = (from: i32, done: (img: image_t)=>void) => {
 		let strength = (VarianceNode.inst.inputs[1].node as any).value;
 
-		VarianceNode.inst.inputs[0].getAsImage((source: ImageRaw) => {
-			Graphics2.begin(VarianceNode.temp.g2, false);
-			Graphics2.drawScaledImage(source, 0, 0, 512, 512);
-			Graphics2.end(VarianceNode.temp.g2);
+		VarianceNode.inst.inputs[0].getAsImage((source: image_t) => {
+			g2_begin(VarianceNode.temp.g2, false);
+			g2_draw_scaled_image(source, 0, 0, 512, 512);
+			g2_end(VarianceNode.temp.g2);
 
-			let bytes_img = Image.getPixels(VarianceNode.temp);
+			let bytes_img = image_get_pixels(VarianceNode.temp);
 			let u8a = new Uint8Array(bytes_img);
 			let f32a = new Float32Array(3 * 512 * 512);
 			for (let i = 0; i < (512 * 512); ++i) {
@@ -62,7 +62,7 @@ class VarianceNode extends LogicNode {
 					}
 					let t_start = num_inference_steps - init_timestep;
 
-					TextToPhotoNode.stableDiffusion(VarianceNode.prompt, (_image: ImageRaw) => {
+					TextToPhotoNode.stableDiffusion(VarianceNode.prompt, (_image: image_t) => {
 						VarianceNode.image = _image;
 						done(VarianceNode.image);
 					}, latents, t_start);
@@ -71,7 +71,7 @@ class VarianceNode extends LogicNode {
 		});
 	}
 
-	override getCachedImage = (): ImageRaw => {
+	override getCachedImage = (): image_t => {
 		return VarianceNode.image;
 	}
 

+ 4 - 4
armorpaint/Assets/plugins/dev/converter.js

@@ -4,9 +4,9 @@ let plugin = Plugin.create();
 let h1 = new Handle();
 
 plugin.drawUI = function(ui) {
-	if (ui.panel(h1, "Converter")) {
-		ui.row([1/2, 1/2]);
-		if (ui.button(".arm to .json")) {
+	if (Zui.panel(h1, "Converter")) {
+		Zui.row([1/2, 1/2]);
+		if (Zui.button(".arm to .json")) {
 			UIFiles.show("arm", false, true, function(path) {
 				Data.getBlob(path, function(b) {
 					let parsed = ArmPack.decode(b);
@@ -32,7 +32,7 @@ plugin.drawUI = function(ui) {
 				});
 			});
 		}
-		if (ui.button(".json to .arm")) {
+		if (Zui.button(".json to .arm")) {
 			UIFiles.show("json", false, true, function(path) {
 				Data.getBlob(path, function(b) {
 					let parsed = JSON.parse(System.bufferToString(b));

+ 15 - 15
armorpaint/Assets/plugins/hello_world.js

@@ -10,22 +10,22 @@ let h6 = new Handle();
 let h7 = new Handle();
 
 plugin.drawUI = function(ui) {
-	if (ui.panel(h1, "My Plugin")) {
-		ui.text("Label");
-		ui.textInput(h7, "Text Input");
-		if (ui.button("Button")) {
+	if (Zui.panel(h1, "My Plugin")) {
+		Zui.text("Label");
+		Zui.textInput(h7, "Text Input");
+		if (Zui.button("Button")) {
 			console.error("Hello");
 		}
-		ui.row([1/2, 1/2]);
-		ui.button("Button A");
-		ui.button("Button B");
-		ui.combo(h5, ["Item 1", "Item 2"], "Combo");
-		ui.row([1/2, 1/2]);
-		ui.slider(h2, "Slider", 0, 1, true);
-		ui.slider(h3, "Slider", 0, 1, true);
-		ui.check(h4, "Check");
-		ui.radio(h6, 0, "Radio 1");
-		ui.radio(h6, 1, "Radio 2");
-		ui.radio(h6, 2, "Radio 3");
+		Zui.row([1/2, 1/2]);
+		Zui.button("Button A");
+		Zui.button("Button B");
+		Zui.combo(h5, ["Item 1", "Item 2"], "Combo");
+		Zui.row([1/2, 1/2]);
+		Zui.slider(h2, "Slider", 0, 1, true);
+		Zui.slider(h3, "Slider", 0, 1, true);
+		Zui.check(h4, "Check");
+		Zui.radio(h6, 0, "Radio 1");
+		Zui.radio(h6, 1, "Radio 2");
+		Zui.radio(h6, 2, "Radio 3");
 	}
 }

+ 15 - 15
armorpaint/Assets/plugins/texture_breakdown.js

@@ -7,42 +7,42 @@ let slots = ["base", "occ", "rough", "nor"];
 let breakdown = null;
 
 plugin.drawUI = function(ui) {
-	if (ui.panel(h1, "Texture Breakdown")) {
+	if (Zui.panel(h1, "Texture Breakdown")) {
 
 		ui.g.end();
 		drawBreakdown();
 		ui.g.begin(false);
 
-		// ui.row([1 / 4]);
-		// ui.combo(h2, ["Material", "Viewport"], "Type");
+		// Zui.row([1 / 4]);
+		// Zui.combo(h2, ["Material", "Viewport"], "Type");
 
-		ui.image(breakdown);
+		Zui.image(breakdown);
 		if (ui.isHovered && ui.inputReleasedR) {
 			let x = ui.inputX - ui._windowX;
 			let w = ui._windowW / slots.length;
 			let i = (x / w) | 0;
 			UIMenu.draw(function(ui) {
-				ui.text(slots[i], 2, ui.t.HIGHLIGHT_COL);
-				if (ui.button("Delete", 0)) {
+				Zui.text(slots[i], 2, ui.t.HIGHLIGHT_COL);
+				if (Zui.button("Delete", 0)) {
 					slots.splice(i, 1);
 				}
 			}, 2);
 		}
 
-		ui.row([1 / 4, 1 / 4]);
+		Zui.row([1 / 4, 1 / 4]);
 
-		if (ui.button("Add")) {
+		if (Zui.button("Add")) {
 			UIMenu.draw(function(ui) {
-				ui.text("Channel", 2, ui.t.HIGHLIGHT_COL);
-				if (ui.button("Base Color", 0)) { slots.push("base"); }
-				if (ui.button("Occlusion", 0)) { slots.push("occ"); }
-				if (ui.button("Roughness", 0)) { slots.push("rough"); }
-				if (ui.button("Metallic", 0)) { slots.push("metal"); }
-				if (ui.button("Normal Map", 0)) { slots.push("nor"); }
+				Zui.text("Channel", 2, ui.t.HIGHLIGHT_COL);
+				if (Zui.button("Base Color", 0)) { slots.push("base"); }
+				if (Zui.button("Occlusion", 0)) { slots.push("occ"); }
+				if (Zui.button("Roughness", 0)) { slots.push("rough"); }
+				if (Zui.button("Metallic", 0)) { slots.push("metal"); }
+				if (Zui.button("Normal Map", 0)) { slots.push("nor"); }
 			}, 6);
 		}
 
-		if (ui.button("Export")) {
+		if (Zui.button("Export")) {
 			UIFiles.show("png", true, false, function(path) {
 				Base.notifyOnNextFrame(function() {
 					var f = UIFiles.filename;

+ 2 - 2
armorpaint/Assets/plugins/uv_unwrap.js

@@ -72,8 +72,8 @@ function unwrap_mesh(mesh) {
 let plugin = Plugin.create();
 let h1 = new Handle();
 plugin.drawUI = function(ui) {
-	if (ui.panel(h1, "UV Unwrap")) {
-		if (ui.button("Unwrap Mesh")) {
+	if (Zui.panel(h1, "UV Unwrap")) {
+		if (Zui.button("Unwrap Mesh")) {
 			for (const po of Project.paintObjects) {
 				let raw = po.data.raw;
 				var mesh = {

+ 3 - 3
armorpaint/Sources/ImportFolder.ts

@@ -76,7 +76,7 @@ class ImportFolder {
 		}
 		for (let n of canvas.nodes) {
 			if (n.name == "RGB") {
-				nodes.removeNode(n, canvas);
+				Nodes.removeNode(n, canvas);
 				break;
 			}
 		}
@@ -120,12 +120,12 @@ class ImportFolder {
 		History.newMaterial();
 	}
 
-	static placeImageNode = (nodes: Nodes, canvas: TNodeCanvas, asset: string, ny: i32, to_id: i32, to_socket: i32) => {
+	static placeImageNode = (nodes: NodesRaw, canvas: TNodeCanvas, asset: string, ny: i32, to_id: i32, to_socket: i32) => {
 		let n = NodesMaterial.createNode("TEX_IMAGE");
 		n.buttons[0].default_value = Base.getAssetIndex(asset);
 		n.x = 72;
 		n.y = ny;
-		let l: TNodeLink = { id: nodes.getLinkId(canvas.links), from_id: n.id, from_socket: 0, to_id: to_id, to_socket: to_socket };
+		let l: TNodeLink = { id: Nodes.getLinkId(canvas.links), from_id: n.id, from_socket: 0, to_id: to_id, to_socket: to_socket };
 		canvas.links.push(l);
 	}
 }

+ 52 - 52
armorpaint/Sources/MakeMaterial.ts

@@ -1,8 +1,8 @@
 
 class MakeMaterial {
 
-	static defaultScon: TShaderContext = null;
-	static defaultMcon: TMaterialContext = null;
+	static defaultScon: shader_context_t = null;
+	static defaultMcon: material_context_t = null;
 
 	static heightUsed = false;
 	static emisUsed = false;
@@ -57,36 +57,36 @@ class MakeMaterial {
 		}
 
 		let con = MakeMesh.run({ name: "Material", canvas: null });
-		let scon: TShaderContext;
-		ShaderContext.create(con.data, (_scon: TShaderContext) => { scon = _scon; });
-		scon._overrideContext = {};
+		let scon: shader_context_t;
+		shader_context_create(con.data, (_scon: shader_context_t) => { scon = _scon; });
+		scon._override_context = {};
 		if (con.frag.sharedSamplers.length > 0) {
 			let sampler = con.frag.sharedSamplers[0];
-			scon._overrideContext.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
+			scon._override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
 		}
 		if (!Context.raw.textureFilter) {
-			scon._overrideContext.filter = "point";
+			scon._override_context.filter = "point";
 		}
 		m._shader.contexts.push(scon);
 		m._shader._contexts.push(scon);
 
 		for (let i = 1; i < MakeMesh.layerPassCount; ++i) {
 			let con = MakeMesh.run({ name: "Material", canvas: null }, i);
-			let scon: TShaderContext;
-			ShaderContext.create(con.data, (_scon: TShaderContext) => { scon = _scon; });
-			scon._overrideContext = {};
+			let scon: shader_context_t;
+			shader_context_create(con.data, (_scon: shader_context_t) => { scon = _scon; });
+			scon._override_context = {};
 			if (con.frag.sharedSamplers.length > 0) {
 				let sampler = con.frag.sharedSamplers[0];
-				scon._overrideContext.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
+				scon._override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
 			}
 			if (!Context.raw.textureFilter) {
-				scon._overrideContext.filter = "point";
+				scon._override_context.filter = "point";
 			}
 			m._shader.contexts.push(scon);
 			m._shader._contexts.push(scon);
 
-			let mcon: TMaterialContext;
-			MaterialContext.create({ name: "mesh" + i, bind_textures: [] }, (self: TMaterialContext) => { mcon = self; });
+			let mcon: material_context_t;
+			MaterialContext.create({ name: "mesh" + i, bind_textures: [] }, (self: material_context_t) => { mcon = self; });
 			m.contexts.push(mcon);
 			m._contexts.push(mcon);
 		}
@@ -104,7 +104,7 @@ class MakeMaterial {
 
 	static parseParticleMaterial = () => {
 		let m = Context.raw.particleMaterial;
-		let sc: TShaderContext = null;
+		let sc: shader_context_t = null;
 		for (let c of m._shader._contexts) {
 			if (c.name == "mesh") {
 				sc = c;
@@ -117,16 +117,16 @@ class MakeMaterial {
 		}
 		let con = MakeParticle.run({ name: "MaterialParticle", canvas: null });
 		if (sc != null) MakeMaterial.deleteContext(sc);
-		ShaderContext.create(con.data, (_sc: TShaderContext) => { sc = _sc; });
+		shader_context_create(con.data, (_sc: shader_context_t) => { sc = _sc; });
 		m._shader.contexts.push(sc);
 		m._shader._contexts.push(sc);
 	}
 
-	static parseMeshPreviewMaterial = (md: TMaterialData = null) => {
+	static parseMeshPreviewMaterial = (md: material_data_t = null) => {
 		if (!MakeMaterial.getMOut()) return;
 
 		let m = md == null ? Project.materials[0].data : md;
-		let scon: TShaderContext = null;
+		let scon: shader_context_t = null;
 		for (let c of m._shader._contexts) {
 			if (c.name == "mesh") {
 				scon = c;
@@ -137,14 +137,14 @@ class MakeMaterial {
 		array_remove(m._shader.contexts, scon);
 		array_remove(m._shader._contexts, scon);
 
-		let mcon: TMaterialContext = { name: "mesh", bind_textures: [] };
+		let mcon: material_context_t = { name: "mesh", bind_textures: [] };
 
 		let sd: TMaterial = { name: "Material", canvas: null };
 		let con = MakeMeshPreview.run(sd, mcon);
 
 		for (let i = 0; i < m._contexts.length; ++i) {
 			if (m._contexts[i].name == "mesh") {
-				MaterialContext.create(mcon, (self: TMaterialContext) => { m._contexts[i] = self; });
+				MaterialContext.create(mcon, (self: material_context_t) => { m._contexts[i] = self; });
 				break;
 			}
 		}
@@ -152,7 +152,7 @@ class MakeMaterial {
 		if (scon != null) MakeMaterial.deleteContext(scon);
 
 		let compileError = false;
-		ShaderContext.create(con.data, (_scon: TShaderContext) => {
+		shader_context_create(con.data, (_scon: shader_context_t) => {
 			if (_scon == null) compileError = true;
 			scon = _scon;
 		});
@@ -163,10 +163,10 @@ class MakeMaterial {
 	}
 
 	///if arm_voxels
-	static makeVoxel = (m: TMaterialData) => {
+	static makeVoxel = (m: material_data_t) => {
 		let rebuild = MakeMaterial.heightUsed;
 		if (Config.raw.rp_gi != false && rebuild) {
-			let scon: TShaderContext = null;
+			let scon: shader_context_t = null;
 			for (let c of m._shader._contexts) {
 				if (c.name == "voxel") {
 					scon = c;
@@ -182,10 +182,10 @@ class MakeMaterial {
 		if (!MakeMaterial.getMOut()) return;
 
 		if (bakePreviews) {
-			let current = Graphics2.current;
-			if (current != null) Graphics2.end(current);
+			let current = _g2_current;
+			if (current != null) g2_end(current);
 			MakeMaterial.bakeNodePreviews();
-			if (current != null) Graphics2.begin(current, false);
+			if (current != null) g2_begin(current, false);
 		}
 
 		let m = Project.materials[0].data;
@@ -208,20 +208,20 @@ class MakeMaterial {
 		}
 
 		let sdata: TMaterial = { name: "Material", canvas: UINodes.getCanvasMaterial() };
-		let tmcon: TMaterialContext = { name: "paint", bind_textures: [] };
+		let tmcon: material_context_t = { name: "paint", bind_textures: [] };
 		let con = MakePaint.run(sdata, tmcon);
 
 		let compileError = false;
-		let scon: TShaderContext;
-		ShaderContext.create(con.data, (_scon: TShaderContext) => {
+		let scon: shader_context_t;
+		shader_context_create(con.data, (_scon: shader_context_t) => {
 			if (_scon == null) compileError = true;
 			scon = _scon;
 		});
 		if (compileError) return;
-		scon._overrideContext = {};
-		scon._overrideContext.addressing = "repeat";
-		let mcon: TMaterialContext;
-		MaterialContext.create(tmcon, (_mcon: TMaterialContext) => { mcon = _mcon; });
+		scon._override_context = {};
+		scon._override_context.addressing = "repeat";
+		let mcon: material_context_t;
+		MaterialContext.create(tmcon, (_mcon: material_context_t) => { mcon = _mcon; });
 
 		m._shader.contexts.push(scon);
 		m._shader._contexts.push(scon);
@@ -239,7 +239,7 @@ class MakeMaterial {
 		for (let key of Context.raw.nodePreviews.keys()) {
 			if (Context.raw.nodePreviewsUsed.indexOf(key) == -1) {
 				let image = Context.raw.nodePreviews.get(key);
-				Base.notifyOnNextFrame(function() { Image.unload(image); });
+				Base.notifyOnNextFrame(function() { image_unload(image); });
 				Context.raw.nodePreviews.delete(key);
 			}
 		}
@@ -269,8 +269,8 @@ class MakeMaterial {
 			let resX = Math.floor(Config.getTextureResX() / 4);
 			let resY = Math.floor(Config.getTextureResY() / 4);
 			if (image == null || image.width != resX || image.height != resY) {
-				if (image != null) Image.unload(image);
-				image = Image.createRenderTarget(resX, resY);
+				if (image != null) image_unload(image);
+				image = image_create_render_target(resX, resY);
 				Context.raw.nodePreviews.set(id, image);
 			}
 
@@ -285,8 +285,8 @@ class MakeMaterial {
 			let resX = Math.floor(Config.getTextureResX());
 			let resY = Math.floor(Config.getTextureResY());
 			if (image == null || image.width != resX || image.height != resY) {
-				if (image != null) Image.unload(image);
-				image = Image.createRenderTarget(resX, resY);
+				if (image != null) image_unload(image);
+				image = image_create_render_target(resX, resY);
 				Context.raw.nodePreviews.set(id, image);
 			}
 
@@ -301,8 +301,8 @@ class MakeMaterial {
 			let resX = Math.floor(Config.getTextureResX());
 			let resY = Math.floor(Config.getTextureResY());
 			if (image == null || image.width != resX || image.height != resY) {
-				if (image != null) Image.unload(image);
-				image = Image.createRenderTarget(resX, resY, TextureFormat.R8);
+				if (image != null) image_unload(image);
+				image = image_create_render_target(resX, resY, TextureFormat.R8);
 				Context.raw.nodePreviews.set(id, image);
 			}
 
@@ -338,29 +338,29 @@ class MakeMaterial {
 			Context.raw.bakeType = _bakeType;
 			MakeMaterial.parsePaintMaterial(false);
 
-			let rts = RenderPath.renderTargets;
+			let rts = render_path_render_targets;
 			let texpaint_live = rts.get("texpaint_live");
 
-			Graphics2.begin(image.g2, false);
-			Graphics2.drawImage(texpaint_live.image, 0, 0);
-			Graphics2.end(image.g2);
+			g2_begin(image.g2, false);
+			g2_draw_image(texpaint_live.image, 0, 0);
+			g2_end(image.g2);
 		}
 	}
 
-	static parseNodePreviewMaterial = (node: TNode, group: TNodeCanvas = null, parents: TNode[] = null): { scon: TShaderContext, mcon: TMaterialContext } => {
+	static parseNodePreviewMaterial = (node: TNode, group: TNodeCanvas = null, parents: TNode[] = null): { scon: shader_context_t, mcon: material_context_t } => {
 		if (node.outputs.length == 0) return null;
 		let sdata: TMaterial = { name: "Material", canvas: UINodes.getCanvasMaterial() };
-		let mcon_raw: TMaterialContext = { name: "mesh", bind_textures: [] };
+		let mcon_raw: material_context_t = { name: "mesh", bind_textures: [] };
 		let con = MakeNodePreview.run(sdata, mcon_raw, node, group, parents);
 		let compileError = false;
-		let scon: TShaderContext;
-		ShaderContext.create(con.data, (_scon: TShaderContext) => {
+		let scon: shader_context_t;
+		shader_context_create(con.data, (_scon: shader_context_t) => {
 			if (_scon == null) compileError = true;
 			scon = _scon;
 		});
 		if (compileError) return null;
-		let mcon: TMaterialContext;
-		MaterialContext.create(mcon_raw, (_mcon: TMaterialContext) => { mcon = _mcon; });
+		let mcon: material_context_t;
+		MaterialContext.create(mcon_raw, (_mcon: material_context_t) => { mcon = _mcon; });
 		return { scon: scon, mcon: mcon };
 	}
 
@@ -491,9 +491,9 @@ class MakeMaterial {
 		return `const vec3 voxelgiHalfExtents = vec3(${ext}, ${ext}, ${ext});`;
 	}
 
-	static deleteContext = (c: TShaderContext) => {
+	static deleteContext = (c: shader_context_t) => {
 		Base.notifyOnNextFrame(() => { // Ensure pipeline is no longer in use
-			ShaderContext.delete(c);
+			shader_context_delete(c);
 		});
 	}
 }

+ 1 - 1
armorpaint/Sources/MakeMeshPreview.ts

@@ -3,7 +3,7 @@ class MakeMeshPreview {
 
 	static opacityDiscardDecal = 0.05;
 
-	static run = (data: TMaterial, matcon: TMaterialContext): NodeShaderContextRaw => {
+	static run = (data: TMaterial, matcon: material_context_t): NodeShaderContextRaw => {
 		let context_id = "mesh";
 		let con_mesh = NodeShaderContext.create(data, {
 			name: context_id,

+ 2 - 2
armorpaint/Sources/MakeNodePreview.ts

@@ -1,7 +1,7 @@
 
 class MakeNodePreview {
 
-	static run = (data: TMaterial, matcon: TMaterialContext, node: TNode, group: TNodeCanvas, parents: TNode[]): NodeShaderContextRaw => {
+	static run = (data: TMaterial, matcon: material_context_t, node: TNode, group: TNodeCanvas, parents: TNode[]): NodeShaderContextRaw => {
 		let context_id = "mesh";
 		let con_mesh = NodeShaderContext.create(data, {
 			name: context_id,
@@ -36,7 +36,7 @@ class MakeNodePreview {
 		let links = ParserMaterial.links;
 		let nodes = Context.raw.material.nodes;
 
-		let link: TNodeLink = { id: nodes.getLinkId(links), from_id: node.id, from_socket: Context.raw.nodePreviewSocket, to_id: -1, to_socket: -1 };
+		let link: TNodeLink = { id: Nodes.getLinkId(links), from_id: node.id, from_socket: Context.raw.nodePreviewSocket, to_id: -1, to_socket: -1 };
 		links.push(link);
 
 		ParserMaterial.con = con_mesh;

+ 1 - 1
armorpaint/Sources/MakePaint.ts

@@ -11,7 +11,7 @@ class MakePaint {
 		///end
 	}
 
-	static run = (data: TMaterial, matcon: TMaterialContext): NodeShaderContextRaw => {
+	static run = (data: TMaterial, matcon: material_context_t): NodeShaderContextRaw => {
 		let context_id = "paint";
 
 		let con_paint = NodeShaderContext.create(data, {

+ 242 - 242
armorpaint/Sources/RenderPathPaint.ts

@@ -13,94 +13,94 @@ class RenderPathPaint {
 	static mergedObjectVisible = false;
 	static savedFov = 0.0;
 	static baking = false;
-	static _texpaint: RenderTargetRaw;
-	static _texpaint_nor: RenderTargetRaw;
-	static _texpaint_pack: RenderTargetRaw;
-	static _texpaint_undo: RenderTargetRaw;
-	static _texpaint_nor_undo: RenderTargetRaw;
-	static _texpaint_pack_undo: RenderTargetRaw;
+	static _texpaint: render_target_t;
+	static _texpaint_nor: render_target_t;
+	static _texpaint_pack: render_target_t;
+	static _texpaint_undo: render_target_t;
+	static _texpaint_nor_undo: render_target_t;
+	static _texpaint_pack_undo: render_target_t;
 	static lastX = -1.0;
 	static lastY = -1.0;
 
 	static init = () => {
 
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_blend0";
 			t.width = Config.getTextureResX();
 			t.height = Config.getTextureResY();
 			t.format = "R8";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_blend1";
 			t.width = Config.getTextureResX();
 			t.height = Config.getTextureResY();
 			t.format = "R8";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_colorid";
 			t.width = 1;
 			t.height = 1;
 			t.format = "RGBA32";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_picker";
 			t.width = 1;
 			t.height = 1;
 			t.format = "RGBA32";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_nor_picker";
 			t.width = 1;
 			t.height = 1;
 			t.format = "RGBA32";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_pack_picker";
 			t.width = 1;
 			t.height = 1;
 			t.format = "RGBA32";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_uv_picker";
 			t.width = 1;
 			t.height = 1;
 			t.format = "RGBA32";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_posnortex_picker0";
 			t.width = 1;
 			t.height = 1;
 			t.format = "RGBA128";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpaint_posnortex_picker1";
 			t.width = 1;
 			t.height = 1;
 			t.format = "RGBA128";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 
-		RenderPath.loadShader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
-		RenderPath.loadShader("shader_datas/copy_mrt3_pass/copy_mrt3RGBA64_pass");
+		render_path_load_shader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
+		render_path_load_shader("shader_datas/copy_mrt3_pass/copy_mrt3RGBA64_pass");
 		///if is_paint
-		RenderPath.loadShader("shader_datas/dilate_pass/dilate_pass");
+		render_path_load_shader("shader_datas/dilate_pass/dilate_pass");
 		///end
 	}
 
@@ -114,47 +114,47 @@ class RenderPathPaint {
 			let particlePhysics = false;
 			///end
 			if (Context.raw.tool == WorkspaceTool.ToolParticle && !particlePhysics) {
-				RenderPath.setTarget("texparticle");
-				RenderPath.clearTarget(0x00000000);
-				RenderPath.bindTarget("_main", "gbufferD");
+				render_path_set_target("texparticle");
+				render_path_clear_target(0x00000000);
+				render_path_bind_target("_main", "gbufferD");
 				if ((Context.raw.xray || Config.raw.brush_angle_reject) && Config.raw.brush_3d) {
-					RenderPath.bindTarget("gbuffer0", "gbuffer0");
+					render_path_bind_target("gbuffer0", "gbuffer0");
 				}
 
-				let mo: TMeshObject = Scene.getChild(".ParticleEmitter").ext;
+				let mo: TMeshObject = scene_get_child(".ParticleEmitter").ext;
 				mo.base.visible = true;
-				MeshObject.render(mo, RenderPath.currentG, "mesh", RenderPath.bindParams);
+				MeshObject.render(mo,_render_path_current_g, "mesh",render_path_bind_params);
 				mo.base.visible = false;
 
-				mo = Scene.getChild(".Particle").ext;
+				mo = scene_get_child(".Particle").ext;
 				mo.base.visible = true;
-				MeshObject.render(mo, RenderPath.currentG, "mesh", RenderPath.bindParams);
+				MeshObject.render(mo,_render_path_current_g, "mesh",render_path_bind_params);
 				mo.base.visible = false;
-				RenderPath.end();
+				render_path_end();
 			}
 
 			///if is_paint
 			if (Context.raw.tool == WorkspaceTool.ToolColorId) {
-				RenderPath.setTarget("texpaint_colorid");
-				RenderPath.clearTarget(0xff000000);
-				RenderPath.bindTarget("gbuffer2", "gbuffer2");
-				RenderPath.drawMeshes("paint");
+				render_path_set_target("texpaint_colorid");
+				render_path_clear_target(0xff000000);
+				render_path_bind_target("gbuffer2", "gbuffer2");
+				render_path_draw_meshes("paint");
 				UIHeader.headerHandle.redraws = 2;
 			}
 			else if (Context.raw.tool == WorkspaceTool.ToolPicker || Context.raw.tool == WorkspaceTool.ToolMaterial) {
 				if (Context.raw.pickPosNorTex) {
 					if (Context.raw.paint2d) {
-						RenderPath.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]);
-						RenderPath.drawMeshes("mesh");
+						render_path_set_target("gbuffer0", ["gbuffer1", "gbuffer2"]);
+						render_path_draw_meshes("mesh");
 					}
-					RenderPath.setTarget("texpaint_posnortex_picker0", ["texpaint_posnortex_picker1"]);
-					RenderPath.bindTarget("gbuffer2", "gbuffer2");
-					RenderPath.bindTarget("_main", "gbufferD");
-					RenderPath.drawMeshes("paint");
-					let texpaint_posnortex_picker0 = RenderPath.renderTargets.get("texpaint_posnortex_picker0").image;
-					let texpaint_posnortex_picker1 = RenderPath.renderTargets.get("texpaint_posnortex_picker1").image;
-					let a = new DataView(Image.getPixels(texpaint_posnortex_picker0));
-					let b = new DataView(Image.getPixels(texpaint_posnortex_picker1));
+					render_path_set_target("texpaint_posnortex_picker0", ["texpaint_posnortex_picker1"]);
+					render_path_bind_target("gbuffer2", "gbuffer2");
+					render_path_bind_target("_main", "gbufferD");
+					render_path_draw_meshes("paint");
+					let texpaint_posnortex_picker0 = render_path_render_targets.get("texpaint_posnortex_picker0").image;
+					let texpaint_posnortex_picker1 = render_path_render_targets.get("texpaint_posnortex_picker1").image;
+					let a = new DataView(image_get_pixels(texpaint_posnortex_picker0));
+					let b = new DataView(image_get_pixels(texpaint_posnortex_picker1));
 					Context.raw.posXPicked = a.getFloat32(0, true);
 					Context.raw.posYPicked = a.getFloat32(4, true);
 					Context.raw.posZPicked = a.getFloat32(8, true);
@@ -165,27 +165,27 @@ class RenderPathPaint {
 					Context.raw.uvyPicked = b.getFloat32(12, true);
 				}
 				else {
-					RenderPath.setTarget("texpaint_picker", ["texpaint_nor_picker", "texpaint_pack_picker", "texpaint_uv_picker"]);
-					RenderPath.bindTarget("gbuffer2", "gbuffer2");
+					render_path_set_target("texpaint_picker", ["texpaint_nor_picker", "texpaint_pack_picker", "texpaint_uv_picker"]);
+					render_path_bind_target("gbuffer2", "gbuffer2");
 					tid = Context.raw.layer.id;
 					let useLiveLayer = Context.raw.tool == WorkspaceTool.ToolMaterial;
 					if (useLiveLayer) RenderPathPaint.useLiveLayer(true);
-					RenderPath.bindTarget("texpaint" + tid, "texpaint");
-					RenderPath.bindTarget("texpaint_nor" + tid, "texpaint_nor");
-					RenderPath.bindTarget("texpaint_pack" + tid, "texpaint_pack");
-					RenderPath.drawMeshes("paint");
+					render_path_bind_target("texpaint" + tid, "texpaint");
+					render_path_bind_target("texpaint_nor" + tid, "texpaint_nor");
+					render_path_bind_target("texpaint_pack" + tid, "texpaint_pack");
+					render_path_draw_meshes("paint");
 					if (useLiveLayer) RenderPathPaint.useLiveLayer(false);
 					UIHeader.headerHandle.redraws = 2;
 					UIBase.hwnds[2].redraws = 2;
 
-					let texpaint_picker = RenderPath.renderTargets.get("texpaint_picker").image;
-					let texpaint_nor_picker = RenderPath.renderTargets.get("texpaint_nor_picker").image;
-					let texpaint_pack_picker = RenderPath.renderTargets.get("texpaint_pack_picker").image;
-					let texpaint_uv_picker = RenderPath.renderTargets.get("texpaint_uv_picker").image;
-					let a = new DataView(Image.getPixels(texpaint_picker));
-					let b = new DataView(Image.getPixels(texpaint_nor_picker));
-					let c = new DataView(Image.getPixels(texpaint_pack_picker));
-					let d = new DataView(Image.getPixels(texpaint_uv_picker));
+					let texpaint_picker = render_path_render_targets.get("texpaint_picker").image;
+					let texpaint_nor_picker = render_path_render_targets.get("texpaint_nor_picker").image;
+					let texpaint_pack_picker = render_path_render_targets.get("texpaint_pack_picker").image;
+					let texpaint_uv_picker = render_path_render_targets.get("texpaint_uv_picker").image;
+					let a = new DataView(image_get_pixels(texpaint_picker));
+					let b = new DataView(image_get_pixels(texpaint_nor_picker));
+					let c = new DataView(image_get_pixels(texpaint_pack_picker));
+					let d = new DataView(image_get_pixels(texpaint_uv_picker));
 
 					if (Context.raw.colorPickerCallback != null) {
 						Context.raw.colorPickerCallback(Context.raw.pickedColor);
@@ -239,25 +239,25 @@ class RenderPathPaint {
 						RenderPathBase.initVoxels();
 						Config.raw.rp_gi = _rp_gi;
 					}
-					RenderPath.clearImage("voxels", 0x00000000);
-					RenderPath.setTarget("");
-					RenderPath.setViewport(256, 256);
-					RenderPath.bindTarget("voxels", "voxels");
-					RenderPath.drawMeshes("voxel");
-					RenderPath.generateMipmaps("voxels");
+					render_path_clear_image("voxels", 0x00000000);
+					render_path_set_target("");
+					render_path_set_viewport(256, 256);
+					render_path_bind_target("voxels", "voxels");
+					render_path_draw_meshes("voxel");
+					render_path_gen_mipmaps("voxels");
 				}
 				///end
 
 				let texpaint = "texpaint" + tid;
-				if (Context.raw.tool == WorkspaceTool.ToolBake && Context.raw.brushTime == Time.delta) {
+				if (Context.raw.tool == WorkspaceTool.ToolBake && Context.raw.brushTime == time_delta()) {
 					// Clear to black on bake start
-					RenderPath.setTarget(texpaint);
-					RenderPath.clearTarget(0xff000000);
+					render_path_set_target(texpaint);
+					render_path_clear_target(0xff000000);
 				}
 
-				RenderPath.setTarget("texpaint_blend1");
-				RenderPath.bindTarget("texpaint_blend0", "tex");
-				RenderPath.drawShader("shader_datas/copy_pass/copyR8_pass");
+				render_path_set_target("texpaint_blend1");
+				render_path_bind_target("texpaint_blend0", "tex");
+				render_path_draw_shader("shader_datas/copy_pass/copyR8_pass");
 				let isMask = SlotLayer.isMask(Context.raw.layer);
 				if (isMask) {
 					let ptid = Context.raw.layer.parent.id;
@@ -267,23 +267,23 @@ class RenderPathPaint {
 							break;
 						}
 					}
-					RenderPath.setTarget(texpaint, ["texpaint_nor" + ptid, "texpaint_pack" + ptid, "texpaint_blend0"]);
+					render_path_set_target(texpaint, ["texpaint_nor" + ptid, "texpaint_pack" + ptid, "texpaint_blend0"]);
 				}
 				else {
-					RenderPath.setTarget(texpaint, ["texpaint_nor" + tid, "texpaint_pack" + tid, "texpaint_blend0"]);
+					render_path_set_target(texpaint, ["texpaint_nor" + tid, "texpaint_pack" + tid, "texpaint_blend0"]);
 				}
-				RenderPath.bindTarget("_main", "gbufferD");
+				render_path_bind_target("_main", "gbufferD");
 				if ((Context.raw.xray || Config.raw.brush_angle_reject) && Config.raw.brush_3d) {
-					RenderPath.bindTarget("gbuffer0", "gbuffer0");
+					render_path_bind_target("gbuffer0", "gbuffer0");
 				}
-				RenderPath.bindTarget("texpaint_blend1", "paintmask");
+				render_path_bind_target("texpaint_blend1", "paintmask");
 				///if arm_voxels
 				if (Context.raw.tool == WorkspaceTool.ToolBake && Context.raw.bakeType == BakeType.BakeAO) {
-					RenderPath.bindTarget("voxels", "voxels");
+					render_path_bind_target("voxels", "voxels");
 				}
 				///end
 				if (Context.raw.colorIdPicked) {
-					RenderPath.bindTarget("texpaint_colorid", "texpaint_colorid");
+					render_path_bind_target("texpaint_colorid", "texpaint_colorid");
 				}
 
 				// Read texcoords from gbuffer
@@ -292,28 +292,28 @@ class RenderPathPaint {
 							  Context.raw.tool == WorkspaceTool.ToolBlur ||
 							  Context.raw.tool == WorkspaceTool.ToolSmudge;
 				if (readTC) {
-					RenderPath.bindTarget("gbuffer2", "gbuffer2");
+					render_path_bind_target("gbuffer2", "gbuffer2");
 				}
 
-				RenderPath.drawMeshes("paint");
+				render_path_draw_meshes("paint");
 
 				if (Context.raw.tool == WorkspaceTool.ToolBake && Context.raw.bakeType == BakeType.BakeCurvature && Context.raw.bakeCurvSmooth > 0) {
-					if (RenderPath.renderTargets.get("texpaint_blur") == null) {
-						let t = RenderTarget.create();
+					if (render_path_render_targets.get("texpaint_blur") == null) {
+						let t = render_target_create();
 						t.name = "texpaint_blur";
 						t.width = Math.floor(Config.getTextureResX() * 0.95);
 						t.height = Math.floor(Config.getTextureResY() * 0.95);
 						t.format = "RGBA32";
-						RenderPath.createRenderTarget(t);
+						render_path_create_render_target(t);
 					}
 					let blurs = Math.round(Context.raw.bakeCurvSmooth);
 					for (let i = 0; i < blurs; ++i) {
-						RenderPath.setTarget("texpaint_blur");
-						RenderPath.bindTarget(texpaint, "tex");
-						RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
-						RenderPath.setTarget(texpaint);
-						RenderPath.bindTarget("texpaint_blur", "tex");
-						RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
+						render_path_set_target("texpaint_blur");
+						render_path_bind_target(texpaint, "tex");
+						render_path_draw_shader("shader_datas/copy_pass/copy_pass");
+						render_path_set_target(texpaint);
+						render_path_bind_target("texpaint_blur", "tex");
+						render_path_draw_shader("shader_datas/copy_pass/copy_pass");
 					}
 				}
 
@@ -325,15 +325,15 @@ class RenderPathPaint {
 
 			///if is_sculpt
 			let texpaint = "texpaint" + tid;
-			RenderPath.setTarget("texpaint_blend1");
-			RenderPath.bindTarget("texpaint_blend0", "tex");
-			RenderPath.drawShader("shader_datas/copy_pass/copyR8_pass");
-			RenderPath.setTarget(texpaint, ["texpaint_blend0"]);
-			RenderPath.bindTarget("gbufferD_undo", "gbufferD");
+			render_path_set_target("texpaint_blend1");
+			render_path_bind_target("texpaint_blend0", "tex");
+			render_path_draw_shader("shader_datas/copy_pass/copyR8_pass");
+			render_path_set_target(texpaint, ["texpaint_blend0"]);
+			render_path_bind_target("gbufferD_undo", "gbufferD");
 			if ((Context.raw.xray || Config.raw.brush_angle_reject) && Config.raw.brush_3d) {
-				RenderPath.bindTarget("gbuffer0", "gbuffer0");
+				render_path_bind_target("gbuffer0", "gbuffer0");
 			}
-			RenderPath.bindTarget("texpaint_blend1", "paintmask");
+			render_path_bind_target("texpaint_blend1", "paintmask");
 
 			// Read texcoords from gbuffer
 			let readTC = (Context.raw.tool == WorkspaceTool.ToolFill && Context.raw.fillTypeHandle.position == FillType.FillFace) ||
@@ -341,25 +341,25 @@ class RenderPathPaint {
 						  Context.raw.tool == WorkspaceTool.ToolBlur ||
 						  Context.raw.tool == WorkspaceTool.ToolSmudge;
 			if (readTC) {
-				RenderPath.bindTarget("gbuffer2", "gbuffer2");
+				render_path_bind_target("gbuffer2", "gbuffer2");
 			}
-			RenderPath.bindTarget("gbuffer0_undo", "gbuffer0_undo");
+			render_path_bind_target("gbuffer0_undo", "gbuffer0_undo");
 
-			let materialContexts: TMaterialContext[] = [];
-			let shaderContexts: TShaderContext[] = [];
+			let materialContexts: material_context_t[] = [];
+			let shaderContexts: shader_context_t[] = [];
 			let mats = Project.paintObjects[0].materials;
 			MeshObject.getContexts(Project.paintObjects[0], "paint", mats, materialContexts, shaderContexts);
 
 			let cc_context = shaderContexts[0];
 			if (ConstData.screenAlignedVB == null) ConstData.createScreenAlignedData();
-			Graphics4.setPipeline(cc_context._pipeState);
-			Uniforms.setContextConstants(RenderPath.currentG, cc_context, RenderPath.bindParams);
-			Uniforms.setObjectConstants(RenderPath.currentG, cc_context, Project.paintObjects[0].base);
-			Uniforms.setMaterialConstants(RenderPath.currentG, cc_context, materialContexts[0]);
-			Graphics4.setVertexBuffer(ConstData.screenAlignedVB);
-			Graphics4.setIndexBuffer(ConstData.screenAlignedIB);
-			Graphics4.drawIndexedVertices();
-			RenderPath.end();
+			g4_set_pipeline(cc_context._pipe_state);
+			uniforms_set_context_consts(_render_path_current_g, cc_context,render_path_bind_params);
+			uniforms_set_obj_consts(_render_path_current_g, cc_context, Project.paintObjects[0].base);
+			uniforms_set_material_consts(_render_path_current_g, cc_context, materialContexts[0]);
+			g4_set_vertex_buffer(ConstData.screenAlignedVB);
+			g4_set_index_buffer(ConstData.screenAlignedIB);
+			g4_draw();
+			render_path_end();
 			///end
 		}
 	}
@@ -368,29 +368,29 @@ class RenderPathPaint {
 		let tid = Context.raw.layer.id;
 		let hid = History.undoI - 1 < 0 ? Config.raw.undo_steps - 1 : History.undoI - 1;
 		if (use) {
-			RenderPathPaint._texpaint = RenderPath.renderTargets.get("texpaint" + tid);
-			RenderPathPaint._texpaint_undo = RenderPath.renderTargets.get("texpaint_undo" + hid);
-			RenderPathPaint._texpaint_nor_undo = RenderPath.renderTargets.get("texpaint_nor_undo" + hid);
-			RenderPathPaint._texpaint_pack_undo = RenderPath.renderTargets.get("texpaint_pack_undo" + hid);
-			RenderPathPaint._texpaint_nor = RenderPath.renderTargets.get("texpaint_nor" + tid);
-			RenderPathPaint._texpaint_pack = RenderPath.renderTargets.get("texpaint_pack" + tid);
-			RenderPath.renderTargets.set("texpaint_undo" + hid, RenderPath.renderTargets.get("texpaint" + tid));
-			RenderPath.renderTargets.set("texpaint" + tid, RenderPath.renderTargets.get("texpaint_live"));
+			RenderPathPaint._texpaint = render_path_render_targets.get("texpaint" + tid);
+			RenderPathPaint._texpaint_undo = render_path_render_targets.get("texpaint_undo" + hid);
+			RenderPathPaint._texpaint_nor_undo = render_path_render_targets.get("texpaint_nor_undo" + hid);
+			RenderPathPaint._texpaint_pack_undo = render_path_render_targets.get("texpaint_pack_undo" + hid);
+			RenderPathPaint._texpaint_nor = render_path_render_targets.get("texpaint_nor" + tid);
+			RenderPathPaint._texpaint_pack = render_path_render_targets.get("texpaint_pack" + tid);
+			render_path_render_targets.set("texpaint_undo" + hid,render_path_render_targets.get("texpaint" + tid));
+			render_path_render_targets.set("texpaint" + tid,render_path_render_targets.get("texpaint_live"));
 			if (SlotLayer.isLayer(Context.raw.layer)) {
-				RenderPath.renderTargets.set("texpaint_nor_undo" + hid, RenderPath.renderTargets.get("texpaint_nor" + tid));
-				RenderPath.renderTargets.set("texpaint_pack_undo" + hid, RenderPath.renderTargets.get("texpaint_pack" + tid));
-				RenderPath.renderTargets.set("texpaint_nor" + tid, RenderPath.renderTargets.get("texpaint_nor_live"));
-				RenderPath.renderTargets.set("texpaint_pack" + tid, RenderPath.renderTargets.get("texpaint_pack_live"));
+				render_path_render_targets.set("texpaint_nor_undo" + hid,render_path_render_targets.get("texpaint_nor" + tid));
+				render_path_render_targets.set("texpaint_pack_undo" + hid,render_path_render_targets.get("texpaint_pack" + tid));
+				render_path_render_targets.set("texpaint_nor" + tid,render_path_render_targets.get("texpaint_nor_live"));
+				render_path_render_targets.set("texpaint_pack" + tid,render_path_render_targets.get("texpaint_pack_live"));
 			}
 		}
 		else {
-			RenderPath.renderTargets.set("texpaint" + tid, RenderPathPaint._texpaint);
-			RenderPath.renderTargets.set("texpaint_undo" + hid, RenderPathPaint._texpaint_undo);
+			render_path_render_targets.set("texpaint" + tid, RenderPathPaint._texpaint);
+			render_path_render_targets.set("texpaint_undo" + hid, RenderPathPaint._texpaint_undo);
 			if (SlotLayer.isLayer(Context.raw.layer)) {
-				RenderPath.renderTargets.set("texpaint_nor_undo" + hid, RenderPathPaint._texpaint_nor_undo);
-				RenderPath.renderTargets.set("texpaint_pack_undo" + hid, RenderPathPaint._texpaint_pack_undo);
-				RenderPath.renderTargets.set("texpaint_nor" + tid, RenderPathPaint._texpaint_nor);
-				RenderPath.renderTargets.set("texpaint_pack" + tid, RenderPathPaint._texpaint_pack);
+				render_path_render_targets.set("texpaint_nor_undo" + hid, RenderPathPaint._texpaint_nor_undo);
+				render_path_render_targets.set("texpaint_pack_undo" + hid, RenderPathPaint._texpaint_pack_undo);
+				render_path_render_targets.set("texpaint_nor" + tid, RenderPathPaint._texpaint_nor);
+				render_path_render_targets.set("texpaint_pack" + tid, RenderPathPaint._texpaint_pack);
 			}
 		}
 		RenderPathPaint.liveLayerLocked = use;
@@ -416,16 +416,16 @@ class RenderPathPaint {
 
 		let tid = Context.raw.layer.id;
 		if (SlotLayer.isMask(Context.raw.layer)) {
-			RenderPath.setTarget("texpaint_live");
-			RenderPath.bindTarget("texpaint" + tid, "tex");
-			RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
+			render_path_set_target("texpaint_live");
+			render_path_bind_target("texpaint" + tid, "tex");
+			render_path_draw_shader("shader_datas/copy_pass/copy_pass");
 		}
 		else {
-			RenderPath.setTarget("texpaint_live", ["texpaint_nor_live", "texpaint_pack_live"]);
-			RenderPath.bindTarget("texpaint" + tid, "tex0");
-			RenderPath.bindTarget("texpaint_nor" + tid, "tex1");
-			RenderPath.bindTarget("texpaint_pack" + tid, "tex2");
-			RenderPath.drawShader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
+			render_path_set_target("texpaint_live", ["texpaint_nor_live", "texpaint_pack_live"]);
+			render_path_bind_target("texpaint" + tid, "tex0");
+			render_path_bind_target("texpaint_nor" + tid, "tex1");
+			render_path_bind_target("texpaint_pack" + tid, "tex2");
+			render_path_draw_shader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
 		}
 
 		RenderPathPaint.useLiveLayer(true);
@@ -495,40 +495,40 @@ class RenderPathPaint {
 	}
 
 	static drawCursor = (mx: f32, my: f32, radius: f32, tintR = 1.0, tintG = 1.0, tintB = 1.0) => {
-		let plane: TMeshObject = Scene.getChild(".Plane").ext;
+		let plane: TMeshObject = scene_get_child(".Plane").ext;
 		let geom = plane.data;
 
-		let g = RenderPath.frameG;
+		let g =_render_path_frame_g;
 		if (Base.pipeCursor == null) Base.makeCursorPipe();
 
-		RenderPath.setTarget("");
-		Graphics4.setPipeline(Base.pipeCursor);
+		render_path_set_target("");
+		g4_set_pipeline(Base.pipeCursor);
 		let decal = Context.raw.tool == WorkspaceTool.ToolDecal || Context.raw.tool == WorkspaceTool.ToolText;
 		let decalMask = decal && Operator.shortcut(Config.keymap.decal_mask, ShortcutType.ShortcutDown);
 		let img = (decal && !decalMask) ? Context.raw.decalImage : Res.get("cursor.k");
-		Graphics4.setTexture(Base.cursorTex, img);
-		let gbuffer0 = RenderPath.renderTargets.get("gbuffer0").image;
-		Graphics4.setTextureDepth(Base.cursorGbufferD, gbuffer0);
-		Graphics4.setFloat2(Base.cursorMouse, mx, my);
-		Graphics4.setFloat2(Base.cursorTexStep, 1 / gbuffer0.width, 1 / gbuffer0.height);
-		Graphics4.setFloat(Base.cursorRadius, radius);
-		let right = Vec4.normalize(CameraObject.rightWorld(Scene.camera));
-		Graphics4.setFloat3(Base.cursorCameraRight, right.x, right.y, right.z);
-		Graphics4.setFloat3(Base.cursorTint, tintR, tintG, tintB);
-		Graphics4.setMatrix(Base.cursorVP, Scene.camera.VP);
-		let helpMat = Mat4.identity();
-		Mat4.getInverse(helpMat, Scene.camera.VP);
-		Graphics4.setMatrix(Base.cursorInvVP, helpMat);
+		g4_set_tex(Base.cursorTex, img);
+		let gbuffer0 = render_path_render_targets.get("gbuffer0").image;
+		g4_set_tex_depth(Base.cursorGbufferD, gbuffer0);
+		g4_set_float2(Base.cursorMouse, mx, my);
+		g4_set_float2(Base.cursorTexStep, 1 / gbuffer0.width, 1 / gbuffer0.height);
+		g4_set_float(Base.cursorRadius, radius);
+		let right = vec4_normalize(CameraObject.rightWorld(scene_camera));
+		g4_set_float3(Base.cursorCameraRight, right.x, right.y, right.z);
+		g4_set_float3(Base.cursorTint, tintR, tintG, tintB);
+		g4_set_mat(Base.cursorVP, scene_camera.VP);
+		let helpMat = mat4_identity();
+		mat4_get_inv(helpMat, scene_camera.VP);
+		g4_set_mat(Base.cursorInvVP, helpMat);
 		///if (krom_metal || krom_vulkan)
-		Graphics4.setVertexBuffer(MeshData.get(geom, [{name: "tex", data: "short2norm"}]));
+		g4_set_vertex_buffer(MeshData.get(geom, [{name: "tex", data: "short2norm"}]));
 		///else
-		Graphics4.setVertexBuffer(geom._vertexBuffer);
+		g4_set_vertex_buffer(geom._vertex_buffer);
 		///end
-		Graphics4.setIndexBuffer(geom._indexBuffers[0]);
-		Graphics4.drawIndexedVertices();
+		g4_set_index_buffer(geom._index_buffers[0]);
+		g4_draw();
 
-		Graphics4.disableScissor();
-		RenderPath.end();
+		g4_disable_scissor();
+		render_path_end();
 	}
 
 	static commandsSymmetry = () => {
@@ -539,42 +539,42 @@ class RenderPathPaint {
 			let sy = t.scale.y;
 			let sz = t.scale.z;
 			if (Context.raw.symX) {
-				Vec4.set(t.scale, -sx, sy, sz);
-				Transform.buildMatrix(t);
+				vec4_set(t.scale, -sx, sy, sz);
+				transform_build_matrix(t);
 				RenderPathPaint.commandsPaint(false);
 			}
 			if (Context.raw.symY) {
-				Vec4.set(t.scale, sx, -sy, sz);
-				Transform.buildMatrix(t);
+				vec4_set(t.scale, sx, -sy, sz);
+				transform_build_matrix(t);
 				RenderPathPaint.commandsPaint(false);
 			}
 			if (Context.raw.symZ) {
-				Vec4.set(t.scale, sx, sy, -sz);
-				Transform.buildMatrix(t);
+				vec4_set(t.scale, sx, sy, -sz);
+				transform_build_matrix(t);
 				RenderPathPaint.commandsPaint(false);
 			}
 			if (Context.raw.symX && Context.raw.symY) {
-				Vec4.set(t.scale, -sx, -sy, sz);
-				Transform.buildMatrix(t);
+				vec4_set(t.scale, -sx, -sy, sz);
+				transform_build_matrix(t);
 				RenderPathPaint.commandsPaint(false);
 			}
 			if (Context.raw.symX && Context.raw.symZ) {
-				Vec4.set(t.scale, -sx, sy, -sz);
-				Transform.buildMatrix(t);
+				vec4_set(t.scale, -sx, sy, -sz);
+				transform_build_matrix(t);
 				RenderPathPaint.commandsPaint(false);
 			}
 			if (Context.raw.symY && Context.raw.symZ) {
-				Vec4.set(t.scale, sx, -sy, -sz);
-				Transform.buildMatrix(t);
+				vec4_set(t.scale, sx, -sy, -sz);
+				transform_build_matrix(t);
 				RenderPathPaint.commandsPaint(false);
 			}
 			if (Context.raw.symX && Context.raw.symY && Context.raw.symZ) {
-				Vec4.set(t.scale, -sx, -sy, -sz);
-				Transform.buildMatrix(t);
+				vec4_set(t.scale, -sx, -sy, -sz);
+				transform_build_matrix(t);
 				RenderPathPaint.commandsPaint(false);
 			}
-			Vec4.set(t.scale, sx, sy, sz);
-			Transform.buildMatrix(t);
+			vec4_set(t.scale, sx, sy, sz);
+			transform_build_matrix(t);
 		}
 	}
 
@@ -594,8 +594,8 @@ class RenderPathPaint {
 	static liveBrushDirty = () => {
 		let mx = RenderPathPaint.lastX;
 		let my = RenderPathPaint.lastY;
-		RenderPathPaint.lastX = Mouse.viewX;
-		RenderPathPaint.lastY = Mouse.viewY;
+		RenderPathPaint.lastX = mouse_view_x();
+		RenderPathPaint.lastY = mouse_view_y();
 		if (Config.raw.brush_live && Context.raw.pdirty <= 0) {
 			let moved = (mx != RenderPathPaint.lastX || my != RenderPathPaint.lastY) && (Context.inViewport() || Context.in2dView());
 			if (moved || Context.raw.brushLocked) {
@@ -623,13 +623,13 @@ class RenderPathPaint {
 			History.paint();
 
 			///if is_sculpt
-			RenderPath.setTarget("gbuffer0_undo");
-			RenderPath.bindTarget("gbuffer0", "tex");
-			RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
+			render_path_set_target("gbuffer0_undo");
+			render_path_bind_target("gbuffer0", "tex");
+			render_path_draw_shader("shader_datas/copy_pass/copy_pass");
 
-			RenderPath.setTarget("gbufferD_undo");
-			RenderPath.bindTarget("_main", "tex");
-			RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
+			render_path_set_target("gbufferD_undo");
+			render_path_bind_target("_main", "tex");
+			render_path_draw_shader("shader_datas/copy_pass/copy_pass");
 			///end
 		}
 
@@ -765,13 +765,13 @@ class RenderPathPaint {
 		if (Context.raw.brushBlendDirty) {
 			Context.raw.brushBlendDirty = false;
 			///if krom_metal
-			RenderPath.setTarget("texpaint_blend0");
-			RenderPath.clearTarget(0x00000000);
-			RenderPath.setTarget("texpaint_blend1");
-			RenderPath.clearTarget(0x00000000);
+			render_path_set_target("texpaint_blend0");
+			render_path_clear_target(0x00000000);
+			render_path_set_target("texpaint_blend1");
+			render_path_clear_target(0x00000000);
 			///else
-			RenderPath.setTarget("texpaint_blend0", ["texpaint_blend1"]);
-			RenderPath.clearTarget(0x00000000);
+			render_path_set_target("texpaint_blend0", ["texpaint_blend1"]);
+			render_path_clear_target(0x00000000);
 			///end
 		}
 
@@ -793,13 +793,13 @@ class RenderPathPaint {
 			Context.raw.mergedObject.base.visible = false;
 		}
 
-		let cam = Scene.camera;
-		Mat4.setFrom(Context.raw.savedCamera, cam.base.transform.local);
+		let cam = scene_camera;
+		mat4_set_from(Context.raw.savedCamera, cam.base.transform.local);
 		RenderPathPaint.savedFov = cam.data.fov;
 		Viewport.updateCameraType(CameraType.CameraPerspective);
-		let m = Mat4.identity();
-		Mat4.translate(m, 0, 0, 0.5);
-		Transform.setMatrix(cam.base.transform, m);
+		let m = mat4_identity();
+		mat4_translate(m, 0, 0, 0.5);
+		transform_set_matrix(cam.base.transform, m);
 		cam.data.fov = Base.defaultFov;
 		CameraObject.buildProjection(cam);
 		CameraObject.buildMatrix(cam);
@@ -807,21 +807,21 @@ class RenderPathPaint {
 		let tw = 0.95 * UIView2D.panScale;
 		let tx = UIView2D.panX / UIView2D.ww;
 		let ty = UIView2D.panY / App.h();
-		Mat4.setIdentity(m);
-		Mat4.scale(m, Vec4.create(tw, tw, 1));
-		Mat4.setLoc(m, Vec4.create(tx, ty, 0));
-		let m2 = Mat4.identity();
-		Mat4.getInverse(m2, Scene.camera.VP);
-		Mat4.multmat(m, m2);
+		mat4_set_identity(m);
+		mat4_scale(m, vec4_create(tw, tw, 1));
+		mat4_set_loc(m, vec4_create(tx, ty, 0));
+		let m2 = mat4_identity();
+		mat4_get_inv(m2, scene_camera.VP);
+		mat4_mult_mat(m, m2);
 
 		let tiled = UIView2D.tiledShow;
-		if (tiled && Scene.getChild(".PlaneTiled") == null) {
+		if (tiled && scene_get_child(".PlaneTiled") == null) {
 			// 3x3 planes
 			let posa = [32767,0,-32767,0,10922,0,-10922,0,10922,0,-32767,0,10922,0,-10922,0,-10922,0,10922,0,-10922,0,-10922,0,-10922,0,10922,0,-32767,0,32767,0,-32767,0,10922,0,10922,0,10922,0,-10922,0,32767,0,-10922,0,10922,0,32767,0,10922,0,10922,0,32767,0,10922,0,10922,0,-10922,0,-10922,0,-32767,0,10922,0,-32767,0,-10922,0,32767,0,-10922,0,10922,0,10922,0,10922,0,-10922,0,-10922,0,-32767,0,-32767,0,-10922,0,-32767,0,-32767,0,10922,0,-32767,0,-10922,0,-10922,0,-10922,0,-32767,0,32767,0,-32767,0,32767,0,-10922,0,10922,0,-10922,0,10922,0,-10922,0,10922,0,10922,0,-10922,0,10922,0,-10922,0,10922,0,-10922,0,32767,0,-32767,0,32767,0,10922,0,10922,0,10922,0,32767,0,-10922,0,32767,0,32767,0,10922,0,32767,0,32767,0,10922,0,32767,0,-10922,0,-10922,0,-10922,0,10922,0,-32767,0,10922,0,32767,0,-10922,0,32767,0,10922,0,10922,0,10922,0,-10922,0,-32767,0,-10922,0,-10922,0,-32767,0,-10922,0,10922,0,-32767,0,10922,0,-10922,0,-10922,0,-10922,0];
 			let nora = [0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767,0,-32767];
 			let texa = [32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0,32767,32767,32767,0,0,0];
 			let inda = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53];
-			let raw: TMeshData = {
+			let raw: mesh_data_t = {
 				name: ".PlaneTiled",
 				vertex_arrays: [
 					{ attrib: "pos", values: new Int16Array(posa), data: "short4norm" },
@@ -834,30 +834,30 @@ class RenderPathPaint {
 				scale_pos: 1.5,
 				scale_tex: 1.0
 			};
-			MeshData.create(raw, (md: TMeshData) => {
-				let materials: TMaterialData[] = Scene.getChild(".Plane").ext.materials;
-				let o = Scene.addMeshObject(md, materials);
+			MeshData.create(raw, (md: mesh_data_t) => {
+				let materials: material_data_t[] = scene_get_child(".Plane").ext.materials;
+				let o = scene_add_mesh_object(md, materials);
 				o.base.name = ".PlaneTiled";
 			});
 		}
 
-		RenderPathPaint.planeo = Scene.getChild(tiled ? ".PlaneTiled" : ".Plane").ext;
+		RenderPathPaint.planeo = scene_get_child(tiled ? ".PlaneTiled" : ".Plane").ext;
 		RenderPathPaint.planeo.base.visible = true;
 		Context.raw.paintObject = RenderPathPaint.planeo;
 
-		let v = Vec4.create();
-		let sx = Vec4.vec4_length(Vec4.set(v, m._00, m._01, m._02));
-		Quat.fromEuler(RenderPathPaint.planeo.base.transform.rot, -Math.PI / 2, 0, 0);
-		Vec4.set(RenderPathPaint.planeo.base.transform.scale, sx, 1.0, sx);
+		let v = vec4_create();
+		let sx = vec4_len(vec4_set(v, m._00, m._01, m._02));
+		quat_from_euler(RenderPathPaint.planeo.base.transform.rot, -Math.PI / 2, 0, 0);
+		vec4_set(RenderPathPaint.planeo.base.transform.scale, sx, 1.0, sx);
 		RenderPathPaint.planeo.base.transform.scale.z *= Config.getTextureResY() / Config.getTextureResX();
-		Vec4.set(RenderPathPaint.planeo.base.transform.loc, m._30, -m._31, 0.0);
-		Transform.buildMatrix(RenderPathPaint.planeo.base.transform);
+		vec4_set(RenderPathPaint.planeo.base.transform.loc, m._30, -m._31, 0.0);
+		transform_build_matrix(RenderPathPaint.planeo.base.transform);
 	}
 
 	static restorePlaneMesh = () => {
 		Context.raw.paint2dView = false;
 		RenderPathPaint.planeo.base.visible = false;
-		Vec4.set(RenderPathPaint.planeo.base.transform.loc, 0.0, 0.0, 0.0);
+		vec4_set(RenderPathPaint.planeo.base.transform.loc, 0.0, 0.0, 0.0);
 		for (let i = 0; i < Project.paintObjects.length; ++i) {
 			Project.paintObjects[i].base.visible = RenderPathPaint.visibles[i];
 		}
@@ -865,11 +865,11 @@ class RenderPathPaint {
 			Context.raw.mergedObject.base.visible = RenderPathPaint.mergedObjectVisible;
 		}
 		Context.raw.paintObject = RenderPathPaint.painto;
-		Transform.setMatrix(Scene.camera.base.transform, Context.raw.savedCamera);
-		Scene.camera.data.fov = RenderPathPaint.savedFov;
+		transform_set_matrix(scene_camera.base.transform, Context.raw.savedCamera);
+		scene_camera.data.fov = RenderPathPaint.savedFov;
 		Viewport.updateCameraType(Context.raw.cameraType);
-		CameraObject.buildProjection(Scene.camera);
-		CameraObject.buildMatrix(Scene.camera);
+		CameraObject.buildProjection(scene_camera);
+		CameraObject.buildMatrix(scene_camera);
 
 		RenderPathBase.drawGbuffer();
 	}
@@ -883,12 +883,12 @@ class RenderPathPaint {
 
 		for (let i = 0; i < Project.layers.length; ++i) {
 			let l = Project.layers[i];
-			RenderPath.bindTarget("texpaint" + l.id, "texpaint" + l.id);
+			render_path_bind_target("texpaint" + l.id, "texpaint" + l.id);
 
 			///if is_paint
 			if (SlotLayer.isLayer(l)) {
-				RenderPath.bindTarget("texpaint_nor" + l.id, "texpaint_nor" + l.id);
-				RenderPath.bindTarget("texpaint_pack" + l.id, "texpaint_pack" + l.id);
+				render_path_bind_target("texpaint_nor" + l.id, "texpaint_nor" + l.id);
+				render_path_bind_target("texpaint_pack" + l.id, "texpaint_pack" + l.id);
 			}
 			///end
 		}
@@ -910,27 +910,27 @@ class RenderPathPaint {
 			let tid = Context.raw.layer.id;
 			if (base) {
 				let texpaint = "texpaint";
-				RenderPath.setTarget("temptex0");
-				RenderPath.bindTarget(texpaint + tid, "tex");
-				RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
-				RenderPath.setTarget(texpaint + tid);
-				RenderPath.bindTarget("temptex0", "tex");
-				RenderPath.drawShader("shader_datas/dilate_pass/dilate_pass");
+				render_path_set_target("temptex0");
+				render_path_bind_target(texpaint + tid, "tex");
+				render_path_draw_shader("shader_datas/copy_pass/copy_pass");
+				render_path_set_target(texpaint + tid);
+				render_path_bind_target("temptex0", "tex");
+				render_path_draw_shader("shader_datas/dilate_pass/dilate_pass");
 			}
 			if (nor_pack && !SlotLayer.isMask(Context.raw.layer)) {
-				RenderPath.setTarget("temptex0");
-				RenderPath.bindTarget("texpaint_nor" + tid, "tex");
-				RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
-				RenderPath.setTarget("texpaint_nor" + tid);
-				RenderPath.bindTarget("temptex0", "tex");
-				RenderPath.drawShader("shader_datas/dilate_pass/dilate_pass");
-
-				RenderPath.setTarget("temptex0");
-				RenderPath.bindTarget("texpaint_pack" + tid, "tex");
-				RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
-				RenderPath.setTarget("texpaint_pack" + tid);
-				RenderPath.bindTarget("temptex0", "tex");
-				RenderPath.drawShader("shader_datas/dilate_pass/dilate_pass");
+				render_path_set_target("temptex0");
+				render_path_bind_target("texpaint_nor" + tid, "tex");
+				render_path_draw_shader("shader_datas/copy_pass/copy_pass");
+				render_path_set_target("texpaint_nor" + tid);
+				render_path_bind_target("temptex0", "tex");
+				render_path_draw_shader("shader_datas/dilate_pass/dilate_pass");
+
+				render_path_set_target("temptex0");
+				render_path_bind_target("texpaint_pack" + tid, "tex");
+				render_path_draw_shader("shader_datas/copy_pass/copy_pass");
+				render_path_set_target("texpaint_pack" + tid);
+				render_path_bind_target("temptex0", "tex");
+				render_path_draw_shader("shader_datas/dilate_pass/dilate_pass");
 			}
 		}
 		///end

+ 57 - 57
armorpaint/Sources/RenderPathPreview.ts

@@ -4,26 +4,26 @@ class RenderPathPreview {
 	static init = () => {
 
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpreview";
 			t.width = 1;
 			t.height = 1;
 			t.format = "RGBA32";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "texpreview_icon";
 			t.width = 1;
 			t.height = 1;
 			t.format = "RGBA32";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 
-		RenderPath.createDepthBuffer("mmain", "DEPTH24");
+		render_path_create_depth_buffer("mmain", "DEPTH24");
 
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "mtex";
 			t.width = Math.floor(UtilRender.materialPreviewSize * 2.0);
 			t.height = Math.floor(UtilRender.materialPreviewSize * 2.0);
@@ -32,44 +32,44 @@ class RenderPathPreview {
 			///if krom_opengl
 			t.depth_buffer = "mmain";
 			///end
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "mgbuffer0";
 			t.width = Math.floor(UtilRender.materialPreviewSize * 2.0);
 			t.height = Math.floor(UtilRender.materialPreviewSize * 2.0);
 			t.format = "RGBA64";
 			t.scale = RenderPathBase.getSuperSampling();
 			t.depth_buffer = "mmain";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "mgbuffer1";
 			t.width = Math.floor(UtilRender.materialPreviewSize * 2.0);
 			t.height = Math.floor(UtilRender.materialPreviewSize * 2.0);
 			t.format = "RGBA64";
 			t.scale = RenderPathBase.getSuperSampling();
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "mgbuffer2";
 			t.width = Math.floor(UtilRender.materialPreviewSize * 2.0);
 			t.height = Math.floor(UtilRender.materialPreviewSize * 2.0);
 			t.format = "RGBA64";
 			t.scale = RenderPathBase.getSuperSampling();
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 	}
 
 	static commandsPreview = () => {
-		RenderPath.setTarget("mgbuffer2");
-		RenderPath.clearTarget(0xff000000);
+		render_path_set_target("mgbuffer2");
+		render_path_clear_target(0xff000000);
 
 		///if (krom_metal)
 		let clearColor = 0xffffffff;
@@ -77,49 +77,49 @@ class RenderPathPreview {
 		let clearColor: Null<i32> = null;
 		///end
 
-		RenderPath.setTarget("mgbuffer0");
-		RenderPath.clearTarget(clearColor, 1.0);
-		RenderPath.setTarget("mgbuffer0", ["mgbuffer1", "mgbuffer2"]);
-		RenderPath.drawMeshes("mesh");
+		render_path_set_target("mgbuffer0");
+		render_path_clear_target(clearColor, 1.0);
+		render_path_set_target("mgbuffer0", ["mgbuffer1", "mgbuffer2"]);
+		render_path_draw_meshes("mesh");
 
 		// Deferred light
-		RenderPath.setTarget("mtex");
-		RenderPath.bindTarget("_mmain", "gbufferD");
-		RenderPath.bindTarget("mgbuffer0", "gbuffer0");
-		RenderPath.bindTarget("mgbuffer1", "gbuffer1");
+		render_path_set_target("mtex");
+		render_path_bind_target("_mmain", "gbufferD");
+		render_path_bind_target("mgbuffer0", "gbuffer0");
+		render_path_bind_target("mgbuffer1", "gbuffer1");
 		{
-			RenderPath.bindTarget("empty_white", "ssaotex");
+			render_path_bind_target("empty_white", "ssaotex");
 		}
-		RenderPath.drawShader("shader_datas/deferred_light/deferred_light");
+		render_path_draw_shader("shader_datas/deferred_light/deferred_light");
 
 		///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
-		RenderPath.setDepthFrom("mtex", "mgbuffer0"); // Bind depth for world pass
+		render_path_set_depth_from("mtex", "mgbuffer0"); // Bind depth for world pass
 		///end
 
-		RenderPath.setTarget("mtex"); // Re-binds depth
-		RenderPath.drawSkydome("shader_datas/world_pass/world_pass");
+		render_path_set_target("mtex"); // Re-binds depth
+		render_path_draw_skydome("shader_datas/world_pass/world_pass");
 
 		///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
-		RenderPath.setDepthFrom("mtex", "mgbuffer1"); // Unbind depth
+		render_path_set_depth_from("mtex", "mgbuffer1"); // Unbind depth
 		///end
 
 		let framebuffer = "texpreview";
 		let selectedMat = Context.raw.material;
-		RenderPath.renderTargets.get("texpreview").image = selectedMat.image;
-		RenderPath.renderTargets.get("texpreview_icon").image = selectedMat.imageIcon;
+		render_path_render_targets.get("texpreview").image = selectedMat.image;
+		render_path_render_targets.get("texpreview_icon").image = selectedMat.imageIcon;
 
-		RenderPath.setTarget(framebuffer);
-		RenderPath.bindTarget("mtex", "tex");
-		RenderPath.drawShader("shader_datas/compositor_pass/compositor_pass");
+		render_path_set_target(framebuffer);
+		render_path_bind_target("mtex", "tex");
+		render_path_draw_shader("shader_datas/compositor_pass/compositor_pass");
 
-		RenderPath.setTarget("texpreview_icon");
-		RenderPath.bindTarget("texpreview", "tex");
-		RenderPath.drawShader("shader_datas/supersample_resolve/supersample_resolve");
+		render_path_set_target("texpreview_icon");
+		render_path_bind_target("texpreview", "tex");
+		render_path_draw_shader("shader_datas/supersample_resolve/supersample_resolve");
 	}
 
 	static commandsDecal = () => {
-		RenderPath.setTarget("gbuffer2");
-		RenderPath.clearTarget(0xff000000);
+		render_path_set_target("gbuffer2");
+		render_path_clear_target(0xff000000);
 
 		///if (krom_metal)
 		let clearColor = 0xffffffff;
@@ -127,38 +127,38 @@ class RenderPathPreview {
 		let clearColor: Null<i32> = null;
 		///end
 
-		RenderPath.setTarget("gbuffer0");
-		RenderPath.clearTarget(clearColor, 1.0);
-		RenderPath.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]);
-		RenderPath.drawMeshes("mesh");
+		render_path_set_target("gbuffer0");
+		render_path_clear_target(clearColor, 1.0);
+		render_path_set_target("gbuffer0", ["gbuffer1", "gbuffer2"]);
+		render_path_draw_meshes("mesh");
 
 		// Deferred light
-		RenderPath.setTarget("tex");
-		RenderPath.bindTarget("_main", "gbufferD");
-		RenderPath.bindTarget("gbuffer0", "gbuffer0");
-		RenderPath.bindTarget("gbuffer1", "gbuffer1");
+		render_path_set_target("tex");
+		render_path_bind_target("_main", "gbufferD");
+		render_path_bind_target("gbuffer0", "gbuffer0");
+		render_path_bind_target("gbuffer1", "gbuffer1");
 		{
-			RenderPath.bindTarget("empty_white", "ssaotex");
+			render_path_bind_target("empty_white", "ssaotex");
 		}
-		RenderPath.drawShader("shader_datas/deferred_light/deferred_light");
+		render_path_draw_shader("shader_datas/deferred_light/deferred_light");
 
 		///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
-		RenderPath.setDepthFrom("tex", "gbuffer0"); // Bind depth for world pass
+		render_path_set_depth_from("tex", "gbuffer0"); // Bind depth for world pass
 		///end
 
-		RenderPath.setTarget("tex");
-		RenderPath.drawSkydome("shader_datas/world_pass/world_pass");
+		render_path_set_target("tex");
+		render_path_draw_skydome("shader_datas/world_pass/world_pass");
 
 		///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
-		RenderPath.setDepthFrom("tex", "gbuffer1"); // Unbind depth
+		render_path_set_depth_from("tex", "gbuffer1"); // Unbind depth
 		///end
 
 		let framebuffer = "texpreview";
-		RenderPath.renderTargets.get("texpreview").image = Context.raw.decalImage;
+		render_path_render_targets.get("texpreview").image = Context.raw.decalImage;
 
-		RenderPath.setTarget(framebuffer);
+		render_path_set_target(framebuffer);
 
-		RenderPath.bindTarget("tex", "tex");
-		RenderPath.drawShader("shader_datas/compositor_pass/compositor_pass");
+		render_path_bind_target("tex", "tex");
+		render_path_draw_shader("shader_datas/compositor_pass/compositor_pass");
 	}
 }

+ 4 - 4
armorpaint/Sources/SlotBrush.ts

@@ -1,9 +1,9 @@
 
 class SlotBrushRaw {
-	nodes = new Nodes();
+	nodes = Nodes.create();
 	canvas: TNodeCanvas;
-	image: ImageRaw = null; // 200px
-	imageIcon: ImageRaw = null; // 50px
+	image: image_t = null; // 200px
+	imageIcon: image_t = null; // 50px
 	previewReady = false;
 	id = 0;
 }
@@ -21,7 +21,7 @@ class SlotBrush {
 					SlotBrush.defaultCanvas = b;
 				});
 			}
-			raw.canvas = ArmPack.decode(SlotBrush.defaultCanvas);
+			raw.canvas = armpack_decode(SlotBrush.defaultCanvas);
 			raw.canvas.name = "Brush " + (raw.id + 1);
 		}
 		else {

+ 3 - 3
armorpaint/Sources/SlotFont.ts

@@ -1,16 +1,16 @@
 
 class SlotFontRaw {
-	image: ImageRaw = null; // 200px
+	image: image_t = null; // 200px
 	previewReady = false;
 	id = 0;
-	font: FontRaw;
+	font: font_t;
 	name: string;
 	file: string;
 }
 
 class SlotFont {
 
-	static create(name: string, font: FontRaw, file = ""): SlotFontRaw {
+	static create(name: string, font: font_t, file = ""): SlotFontRaw {
 		let raw = new SlotFontRaw();
 		for (let slot of Project.fonts) if (slot.id >= raw.id) raw.id = slot.id + 1;
 		raw.name = name;

+ 83 - 83
armorpaint/Sources/SlotLayer.ts

@@ -6,11 +6,11 @@ class SlotLayerRaw {
 	visible = true;
 	parent: SlotLayerRaw = null; // Group (for layers) or layer (for masks)
 
-	texpaint: ImageRaw = null; // Base or mask
+	texpaint: image_t = null; // Base or mask
 	///if is_paint
-	texpaint_nor: ImageRaw = null;
-	texpaint_pack: ImageRaw = null;
-	texpaint_preview: ImageRaw = null; // Layer preview
+	texpaint_nor: image_t = null;
+	texpaint_pack: image_t = null;
+	texpaint_preview: image_t = null; // Layer preview
 	///end
 
 	maskOpacity = 1.0; // Opacity mask
@@ -32,7 +32,7 @@ class SlotLayerRaw {
 	paintHeightBlend = true;
 	paintEmis = true;
 	paintSubs = true;
-	decalMat = Mat4.identity(); // Decal layer
+	decalMat = mat4_identity(); // Decal layer
 }
 
 class SlotLayer {
@@ -63,33 +63,33 @@ class SlotLayer {
 			///end
 
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "texpaint" + ext;
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = format;
-				raw.texpaint = RenderPath.createRenderTarget(t).image;
+				raw.texpaint = render_path_create_render_target(t).image;
 			}
 
 			///if is_paint
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "texpaint_nor" + ext;
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = format;
-				raw.texpaint_nor = RenderPath.createRenderTarget(t).image;
+				raw.texpaint_nor = render_path_create_render_target(t).image;
 			}
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "texpaint_pack" + ext;
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = format;
-				raw.texpaint_pack = RenderPath.createRenderTarget(t).image;
+				raw.texpaint_pack = render_path_create_render_target(t).image;
 			}
 
-			raw.texpaint_preview = Image.createRenderTarget(UtilRender.layerPreviewSize, UtilRender.layerPreviewSize, TextureFormat.RGBA32);
+			raw.texpaint_preview = image_create_render_target(UtilRender.layerPreviewSize, UtilRender.layerPreviewSize, TextureFormat.RGBA32);
 			///end
 		}
 
@@ -100,15 +100,15 @@ class SlotLayer {
 			raw.blending = BlendType.BlendAdd;
 
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "texpaint" + ext;
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = format;
-				raw.texpaint = RenderPath.createRenderTarget(t).image;
+				raw.texpaint = render_path_create_render_target(t).image;
 			}
 
-			raw.texpaint_preview = Image.createRenderTarget(UtilRender.layerPreviewSize, UtilRender.layerPreviewSize, TextureFormat.RGBA32);
+			raw.texpaint_preview = image_create_render_target(UtilRender.layerPreviewSize, UtilRender.layerPreviewSize, TextureFormat.RGBA32);
 		}
 		///end
 
@@ -150,28 +150,28 @@ class SlotLayer {
 		///end
 
 		let _next = () => {
-			Image.unload(_texpaint);
+			image_unload(_texpaint);
 			///if is_paint
-			if (_texpaint_nor != null) Image.unload(_texpaint_nor);
-			if (_texpaint_pack != null) Image.unload(_texpaint_pack);
-			Image.unload(_texpaint_preview);
+			if (_texpaint_nor != null) image_unload(_texpaint_nor);
+			if (_texpaint_pack != null) image_unload(_texpaint_pack);
+			image_unload(_texpaint_preview);
 			///end
 		}
 		Base.notifyOnNextFrame(_next);
 
-		RenderPath.renderTargets.delete("texpaint" + raw.ext);
+		render_path_render_targets.delete("texpaint" + raw.ext);
 		///if is_paint
 		if (SlotLayer.isLayer(raw)) {
-			RenderPath.renderTargets.delete("texpaint_nor" + raw.ext);
-			RenderPath.renderTargets.delete("texpaint_pack" + raw.ext);
+			render_path_render_targets.delete("texpaint_nor" + raw.ext);
+			render_path_render_targets.delete("texpaint_pack" + raw.ext);
 		}
 		///end
 	}
 
 	static swap = (raw: SlotLayerRaw, other: SlotLayerRaw) => {
 		if ((SlotLayer.isLayer(raw) || SlotLayer.isMask(raw)) && (SlotLayer.isLayer(other) || SlotLayer.isMask(other))) {
-			RenderPath.renderTargets.get("texpaint" + raw.ext).image = other.texpaint;
-			RenderPath.renderTargets.get("texpaint" + other.ext).image = raw.texpaint;
+			render_path_render_targets.get("texpaint" + raw.ext).image = other.texpaint;
+			render_path_render_targets.get("texpaint" + other.ext).image = raw.texpaint;
 			let _texpaint = raw.texpaint;
 			raw.texpaint = other.texpaint;
 			other.texpaint = _texpaint;
@@ -185,10 +185,10 @@ class SlotLayer {
 
 		///if is_paint
 		if (SlotLayer.isLayer(raw) && SlotLayer.isLayer(other)) {
-			RenderPath.renderTargets.get("texpaint_nor" + raw.ext).image = other.texpaint_nor;
-			RenderPath.renderTargets.get("texpaint_pack" + raw.ext).image = other.texpaint_pack;
-			RenderPath.renderTargets.get("texpaint_nor" + other.ext).image = raw.texpaint_nor;
-			RenderPath.renderTargets.get("texpaint_pack" + other.ext).image = raw.texpaint_pack;
+			render_path_render_targets.get("texpaint_nor" + raw.ext).image = other.texpaint_nor;
+			render_path_render_targets.get("texpaint_pack" + raw.ext).image = other.texpaint_pack;
+			render_path_render_targets.get("texpaint_nor" + other.ext).image = raw.texpaint_nor;
+			render_path_render_targets.get("texpaint_pack" + other.ext).image = raw.texpaint_pack;
 			let _texpaint_nor = raw.texpaint_nor;
 			let _texpaint_pack = raw.texpaint_pack;
 			raw.texpaint_nor = other.texpaint_nor;
@@ -199,24 +199,24 @@ class SlotLayer {
 		///end
 	}
 
-	static clear = (raw: SlotLayerRaw, baseColor = 0x00000000, baseImage: ImageRaw = null, occlusion = 1.0, roughness = Base.defaultRough, metallic = 0.0) => {
-		Graphics4.begin(raw.texpaint.g4);
-		Graphics4.clear(baseColor); // Base
-		Graphics4.end();
+	static clear = (raw: SlotLayerRaw, baseColor = 0x00000000, baseImage: image_t = null, occlusion = 1.0, roughness = Base.defaultRough, metallic = 0.0) => {
+		g4_begin(raw.texpaint.g4);
+		g4_clear(baseColor); // Base
+		g4_end();
 		if (baseImage != null) {
-			Graphics2.begin(raw.texpaint.g2, false);
-			Graphics2.drawScaledImage(baseImage, 0, 0, raw.texpaint.width, raw.texpaint.height);
-			Graphics2.end(raw.texpaint.g2);
+			g2_begin(raw.texpaint.g2, false);
+			g2_draw_scaled_image(baseImage, 0, 0, raw.texpaint.width, raw.texpaint.height);
+			g2_end(raw.texpaint.g2);
 		}
 
 		///if is_paint
 		if (SlotLayer.isLayer(raw)) {
-			Graphics4.begin(raw.texpaint_nor.g4);
-			Graphics4.clear(color_from_floats(0.5, 0.5, 1.0, 0.0)); // Nor
-			Graphics4.end();
-			Graphics4.begin(raw.texpaint_pack.g4);
-			Graphics4.clear(color_from_floats(occlusion, roughness, metallic, 0.0)); // Occ, rough, met
-			Graphics4.end();
+			g4_begin(raw.texpaint_nor.g4);
+			g4_clear(color_from_floats(0.5, 0.5, 1.0, 0.0)); // Nor
+			g4_end();
+			g4_begin(raw.texpaint_pack.g4);
+			g4_clear(color_from_floats(occlusion, roughness, metallic, 0.0)); // Occ, rough, met
+			g4_end();
 		}
 		///end
 
@@ -226,18 +226,18 @@ class SlotLayer {
 
 	static invertMask = (raw: SlotLayerRaw) => {
 		if (Base.pipeInvert8 == null) Base.makePipe();
-		let inverted = Image.createRenderTarget(raw.texpaint.width, raw.texpaint.height, TextureFormat.RGBA32);
-		Graphics2.begin(inverted.g2, false);
+		let inverted = image_create_render_target(raw.texpaint.width, raw.texpaint.height, TextureFormat.RGBA32);
+		g2_begin(inverted.g2, false);
 		inverted.g2.pipeline = Base.pipeInvert8;
-		Graphics2.drawImage(raw.texpaint, 0, 0);
+		g2_draw_image(raw.texpaint, 0, 0);
 		inverted.g2.pipeline = null;
-		Graphics2.end(inverted.g2);
+		g2_end(inverted.g2);
 		let _texpaint = raw.texpaint;
 		let _next = () => {
-			Image.unload(_texpaint);
+			image_unload(_texpaint);
 		}
 		Base.notifyOnNextFrame(_next);
-		raw.texpaint = RenderPath.renderTargets.get("texpaint" + raw.id).image = inverted;
+		raw.texpaint = render_path_render_targets.get("texpaint" + raw.id).image = inverted;
 		Context.raw.layerPreviewDirty = true;
 		Context.raw.ddirty = 3;
 	}
@@ -265,38 +265,38 @@ class SlotLayer {
 
 		if (Base.pipeMerge == null) Base.makePipe();
 		if (SlotLayer.isLayer(raw)) {
-			Graphics2.begin(l.texpaint.g2, false);
+			g2_begin(l.texpaint.g2, false);
 			l.texpaint.g2.pipeline = Base.pipeCopy;
-			Graphics2.drawImage(raw.texpaint, 0, 0);
+			g2_draw_image(raw.texpaint, 0, 0);
 			l.texpaint.g2.pipeline = null;
-			Graphics2.end(l.texpaint.g2);
+			g2_end(l.texpaint.g2);
 			///if is_paint
-			Graphics2.begin(l.texpaint_nor.g2, false);
+			g2_begin(l.texpaint_nor.g2, false);
 			l.texpaint_nor.g2.pipeline = Base.pipeCopy;
-			Graphics2.drawImage(raw.texpaint_nor, 0, 0);
+			g2_draw_image(raw.texpaint_nor, 0, 0);
 			l.texpaint_nor.g2.pipeline = null;
-			Graphics2.end(l.texpaint_nor.g2);
-			Graphics2.begin(l.texpaint_pack.g2, false);
+			g2_end(l.texpaint_nor.g2);
+			g2_begin(l.texpaint_pack.g2, false);
 			l.texpaint_pack.g2.pipeline = Base.pipeCopy;
-			Graphics2.drawImage(raw.texpaint_pack, 0, 0);
+			g2_draw_image(raw.texpaint_pack, 0, 0);
 			l.texpaint_pack.g2.pipeline = null;
-			Graphics2.end(l.texpaint_pack.g2);
+			g2_end(l.texpaint_pack.g2);
 			///end
 		}
 		else if (SlotLayer.isMask(raw)) {
-			Graphics2.begin(l.texpaint.g2, false);
+			g2_begin(l.texpaint.g2, false);
 			l.texpaint.g2.pipeline = Base.pipeCopy8;
-			Graphics2.drawImage(raw.texpaint, 0, 0);
+			g2_draw_image(raw.texpaint, 0, 0);
 			l.texpaint.g2.pipeline = null;
-			Graphics2.end(l.texpaint.g2);
+			g2_end(l.texpaint.g2);
 		}
 
 		///if is_paint
-		Graphics2.begin(l.texpaint_preview.g2, true, 0x00000000);
+		g2_begin(l.texpaint_preview.g2, true, 0x00000000);
 		l.texpaint_preview.g2.pipeline = Base.pipeCopy;
-		Graphics2.drawScaledImage(raw.texpaint_preview, 0, 0, raw.texpaint_preview.width, raw.texpaint_preview.height);
+		g2_draw_scaled_image(raw.texpaint_preview, 0, 0, raw.texpaint_preview.width, raw.texpaint_preview.height);
 		l.texpaint_preview.g2.pipeline = null;
-		Graphics2.end(l.texpaint_preview.g2);
+		g2_end(l.texpaint_preview.g2);
 		///end
 
 		l.visible = raw.visible;
@@ -325,7 +325,7 @@ class SlotLayer {
 	static resizeAndSetBits = (raw: SlotLayerRaw) => {
 		let resX = Config.getTextureResX();
 		let resY = Config.getTextureResY();
-		let rts = RenderPath.renderTargets;
+		let rts = render_path_render_targets;
 		if (Base.pipeMerge == null) Base.makePipe();
 
 		if (SlotLayer.isLayer(raw)) {
@@ -340,37 +340,37 @@ class SlotLayer {
 			///end
 
 			let _texpaint = raw.texpaint;
-			raw.texpaint = Image.createRenderTarget(resX, resY, format);
-			Graphics2.begin(raw.texpaint.g2, false);
+			raw.texpaint = image_create_render_target(resX, resY, format);
+			g2_begin(raw.texpaint.g2, false);
 			raw.texpaint.g2.pipeline = Base.pipeCopy;
-			Graphics2.drawScaledImage(_texpaint, 0, 0, resX, resY);
+			g2_draw_scaled_image(_texpaint, 0, 0, resX, resY);
 			raw.texpaint.g2.pipeline = null;
-			Graphics2.end(raw.texpaint.g2);
+			g2_end(raw.texpaint.g2);
 
 			///if is_paint
 			let _texpaint_nor = raw.texpaint_nor;
 			let _texpaint_pack = raw.texpaint_pack;
-			raw.texpaint_nor = Image.createRenderTarget(resX, resY, format);
-			raw.texpaint_pack = Image.createRenderTarget(resX, resY, format);
+			raw.texpaint_nor = image_create_render_target(resX, resY, format);
+			raw.texpaint_pack = image_create_render_target(resX, resY, format);
 
-			Graphics2.begin(raw.texpaint_nor.g2, false);
+			g2_begin(raw.texpaint_nor.g2, false);
 			raw.texpaint_nor.g2.pipeline = Base.pipeCopy;
-			Graphics2.drawScaledImage(_texpaint_nor, 0, 0, resX, resY);
+			g2_draw_scaled_image(_texpaint_nor, 0, 0, resX, resY);
 			raw.texpaint_nor.g2.pipeline = null;
-			Graphics2.end(raw.texpaint_nor.g2);
+			g2_end(raw.texpaint_nor.g2);
 
-			Graphics2.begin(raw.texpaint_pack.g2, false);
+			g2_begin(raw.texpaint_pack.g2, false);
 			raw.texpaint_pack.g2.pipeline = Base.pipeCopy;
-			Graphics2.drawScaledImage(_texpaint_pack, 0, 0, resX, resY);
+			g2_draw_scaled_image(_texpaint_pack, 0, 0, resX, resY);
 			raw.texpaint_pack.g2.pipeline = null;
-			Graphics2.end(raw.texpaint_pack.g2);
+			g2_end(raw.texpaint_pack.g2);
 			///end
 
 			let _next = () => {
-				Image.unload(_texpaint);
+				image_unload(_texpaint);
 				///if is_paint
-				Image.unload(_texpaint_nor);
-				Image.unload(_texpaint_pack);
+				image_unload(_texpaint_nor);
+				image_unload(_texpaint_pack);
 				///end
 			}
 			Base.notifyOnNextFrame(_next);
@@ -383,16 +383,16 @@ class SlotLayer {
 		}
 		else if (SlotLayer.isMask(raw)) {
 			let _texpaint = raw.texpaint;
-			raw.texpaint = Image.createRenderTarget(resX, resY, TextureFormat.RGBA32);
+			raw.texpaint = image_create_render_target(resX, resY, TextureFormat.RGBA32);
 
-			Graphics2.begin(raw.texpaint.g2, false);
+			g2_begin(raw.texpaint.g2, false);
 			raw.texpaint.g2.pipeline = Base.pipeCopy8;
-			Graphics2.drawScaledImage(_texpaint, 0, 0, resX, resY);
+			g2_draw_scaled_image(_texpaint, 0, 0, resX, resY);
 			raw.texpaint.g2.pipeline = null;
-			Graphics2.end(raw.texpaint.g2);
+			g2_end(raw.texpaint.g2);
 
 			let _next = () => {
-				Image.unload(_texpaint);
+				image_unload(_texpaint);
 			}
 			Base.notifyOnNextFrame(_next);
 

+ 10 - 10
armorpaint/Sources/SlotMaterial.ts

@@ -1,11 +1,11 @@
 
 class SlotMaterialRaw {
-	nodes = new Nodes();
+	nodes = Nodes.create();
 	canvas: TNodeCanvas;
-	image: ImageRaw = null;
-	imageIcon: ImageRaw = null;
+	image: image_t = null;
+	imageIcon: image_t = null;
 	previewReady = false;
-	data: TMaterialData;
+	data: material_data_t;
 	id = 0;
 
 	paintBase = true;
@@ -22,15 +22,15 @@ class SlotMaterialRaw {
 class SlotMaterial {
 	static defaultCanvas: ArrayBuffer = null;
 
-	static create(m: TMaterialData = null, c: TNodeCanvas = null): SlotMaterialRaw {
+	static create(m: material_data_t = null, c: TNodeCanvas = null): SlotMaterialRaw {
 		let raw = new SlotMaterialRaw();
 		for (let mat of Project.materials) if (mat.id >= raw.id) raw.id = mat.id + 1;
 		raw.data = m;
 
 		let w = UtilRender.materialPreviewSize;
 		let wIcon = 50;
-		raw.image = Image.createRenderTarget(w, w);
-		raw.imageIcon = Image.createRenderTarget(wIcon, wIcon);
+		raw.image = image_create_render_target(w, w);
+		raw.imageIcon = image_create_render_target(wIcon, wIcon);
 
 		if (c == null) {
 			if (SlotMaterial.defaultCanvas == null) { // Synchronous
@@ -38,7 +38,7 @@ class SlotMaterial {
 					SlotMaterial.defaultCanvas = b;
 				});
 			}
-			raw.canvas = ArmPack.decode(SlotMaterial.defaultCanvas);
+			raw.canvas = armpack_decode(SlotMaterial.defaultCanvas);
 			raw.canvas.name = "Material " + (raw.id + 1);
 		}
 		else {
@@ -54,8 +54,8 @@ class SlotMaterial {
 
 	static unload = (raw: SlotMaterialRaw) => {
 		let _next = () => {
-			Image.unload(raw.image);
-			Image.unload(raw.imageIcon);
+			image_unload(raw.image);
+			image_unload(raw.imageIcon);
 		}
 		Base.notifyOnNextFrame(_next);
 	}

+ 131 - 131
armorpaint/Sources/TabLayers.ts

@@ -2,29 +2,29 @@
 class TabLayers {
 
 	static layerNameEdit = -1;
-	static layerNameHandle = new Handle();
+	static layerNameHandle = Handle.create();
 	static showContextMenu = false;
 
-	static draw = (htab: Handle) => {
+	static draw = (htab: HandleRaw) => {
 		let mini = Config.raw.layout[LayoutSize.LayoutSidebarW] <= UIBase.sidebarMiniW;
 		mini ? TabLayers.drawMini(htab) : TabLayers.drawFull(htab);
 	}
 
-	static drawMini = (htab: Handle) => {
+	static drawMini = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
-		ui.setHoveredTabName(tr("Layers"));
+		Zui.setHoveredTabName(tr("Layers"));
 
 		let _ELEMENT_H = ui.t.ELEMENT_H;
-		ui.t.ELEMENT_H = Math.floor(UIBase.sidebarMiniW / 2 / ui.SCALE());
+		ui.t.ELEMENT_H = Math.floor(UIBase.sidebarMiniW / 2 / Zui.SCALE(ui));
 
-		ui.beginSticky();
-		ui.separator(5);
+		Zui.beginSticky();
+		Zui.separator(5);
 
 		TabLayers.comboFilter();
 		TabLayers.button2dView();
 		TabLayers.buttonNew("+");
 
-		ui.endSticky();
+		Zui.endSticky();
 		ui._y += 2;
 
 		TabLayers.highlightOddLines();
@@ -33,17 +33,17 @@ class TabLayers {
 		ui.t.ELEMENT_H = _ELEMENT_H;
 	}
 
-	static drawFull = (htab: Handle) => {
+	static drawFull = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
-		if (ui.tab(htab, tr("Layers"))) {
-			ui.beginSticky();
-			ui.row([1 / 4, 1 / 4, 1 / 2]);
+		if (Zui.tab(htab, tr("Layers"))) {
+			Zui.beginSticky();
+			Zui.row([1 / 4, 1 / 4, 1 / 2]);
 
 			TabLayers.buttonNew(tr("New"));
 			TabLayers.button2dView();
 			TabLayers.comboFilter();
 
-			ui.endSticky();
+			Zui.endSticky();
 			ui._y += 2;
 
 			TabLayers.highlightOddLines();
@@ -53,10 +53,10 @@ class TabLayers {
 
 	static button2dView = () => {
 		let ui = UIBase.ui;
-		if (ui.button(tr("2D View"))) {
+		if (Zui.button(tr("2D View"))) {
 			UIBase.show2DView(View2DType.View2DLayer);
 		}
-		else if (ui.isHovered) ui.tooltip(tr("Show 2D View") + ` (${Config.keymap.toggle_2d_view})`);
+		else if (ui.isHovered) Zui.tooltip(tr("Show 2D View") + ` (${Config.keymap.toggle_2d_view})`);
 	}
 
 	static drawSlots = (mini: bool) => {
@@ -74,15 +74,15 @@ class TabLayers {
 		let fullH = ui._windowH - UIBase.hwnds[0].scrollOffset;
 		for (let i = 0; i < Math.floor(fullH / step); ++i) {
 			if (i % 2 == 0) {
-				ui.fill(0, i * step, (ui._w / ui.SCALE() - 2), step, ui.t.WINDOW_BG_COL - 0x00040404);
+				Zui.fill(0, i * step, (ui._w / Zui.SCALE(ui) - 2), step, ui.t.WINDOW_BG_COL - 0x00040404);
 			}
 		}
 	}
 
 	static buttonNew = (text: string) => {
 		let ui = UIBase.ui;
-		if (ui.button(text)) {
-			UIMenu.draw((ui: Zui) => {
+		if (Zui.button(text)) {
+			UIMenu.draw((ui: ZuiRaw) => {
 				let l = Context.raw.layer;
 				if (UIMenu.menuButton(ui, tr("Paint Layer"))) {
 					Base.newLayer();
@@ -162,7 +162,7 @@ class TabLayers {
 		if (atlases != null) for (let a of atlases) ar.push(a);
 		let filterHandle = Zui.handle("tablayers_0");
 		filterHandle.position = Context.raw.layerFilter;
-		Context.raw.layerFilter = ui.combo(filterHandle, ar, tr("Filter"), false, Align.Left);
+		Context.raw.layerFilter = Zui.combo(filterHandle, ar, tr("Filter"), false, Align.Left);
 		if (filterHandle.changed) {
 			for (let p of Project.paintObjects) {
 				p.base.visible = Context.raw.layerFilter == 0 || p.base.name == ar[Context.raw.layerFilter] || Project.isAtlasObject(p);
@@ -231,12 +231,12 @@ class TabLayers {
 		}
 
 		let step = ui.t.ELEMENT_H;
-		let checkw = (ui._windowW / 100 * 8) / ui.SCALE();
+		let checkw = (ui._windowW / 100 * 8) / Zui.SCALE(ui);
 
 		// Highlight drag destination
 		let absy = ui._windowY + ui._y;
 		if (Base.isDragging && Base.dragLayer != null && Context.inLayers()) {
-			if (Mouse.y > absy + step && Mouse.y < absy + step * 3) {
+			if (mouse_y > absy + step && mouse_y < absy + step * 3) {
 				let down = Project.layers.indexOf(Base.dragLayer) >= i;
 				Context.raw.dragDestination = down ? i : i - 1;
 
@@ -246,27 +246,27 @@ class TabLayers {
 				let nestedGroup = SlotLayer.isGroup(Base.dragLayer) && toGroup;
 				if (!nestedGroup) {
 					if (SlotLayer.canMove(Context.raw.layer, Context.raw.dragDestination)) {
-						ui.fill(checkw, step * 2, (ui._windowW / ui.SCALE() - 2) - checkw, 2 * ui.SCALE(), ui.t.HIGHLIGHT_COL);
+						Zui.fill(checkw, step * 2, (ui._windowW / Zui.SCALE(ui) - 2) - checkw, 2 * Zui.SCALE(ui), ui.t.HIGHLIGHT_COL);
 					}
 				}
 			}
-			else if (i == Project.layers.length - 1 && Mouse.y < absy + step) {
+			else if (i == Project.layers.length - 1 && mouse_y < absy + step) {
 				Context.raw.dragDestination = Project.layers.length - 1;
 				if (SlotLayer.canMove(Context.raw.layer, Context.raw.dragDestination)) {
-					ui.fill(checkw, 0, (ui._windowW / ui.SCALE() - 2) - checkw, 2 * ui.SCALE(), ui.t.HIGHLIGHT_COL);
+					Zui.fill(checkw, 0, (ui._windowW / Zui.SCALE(ui) - 2) - checkw, 2 * Zui.SCALE(ui), ui.t.HIGHLIGHT_COL);
 				}
 			}
 		}
 		if (Base.isDragging && (Base.dragMaterial != null || Base.dragSwatch != null) && Context.inLayers()) {
-			if (Mouse.y > absy + step && Mouse.y < absy + step * 3) {
+			if (mouse_y > absy + step && mouse_y < absy + step * 3) {
 				Context.raw.dragDestination = i;
 				if (TabLayers.canDropNewLayer(i))
-					ui.fill(checkw, 2 * step, (ui._windowW / ui.SCALE() - 2) - checkw, 2 * ui.SCALE(), ui.t.HIGHLIGHT_COL);
+					Zui.fill(checkw, 2 * step, (ui._windowW / Zui.SCALE(ui) - 2) - checkw, 2 * Zui.SCALE(ui), ui.t.HIGHLIGHT_COL);
 			}
-			else if (i == Project.layers.length - 1 && Mouse.y < absy + step) {
+			else if (i == Project.layers.length - 1 && mouse_y < absy + step) {
 				Context.raw.dragDestination = Project.layers.length;
 				if (TabLayers.canDropNewLayer(Project.layers.length))
-					ui.fill(checkw, 0, (ui._windowW / ui.SCALE() - 2) - checkw, 2 * ui.SCALE(), ui.t.HIGHLIGHT_COL);
+					Zui.fill(checkw, 0, (ui._windowW / Zui.SCALE(ui) - 2) - checkw, 2 * Zui.SCALE(ui), ui.t.HIGHLIGHT_COL);
 			}
 		}
 
@@ -282,15 +282,15 @@ class TabLayers {
 	static drawLayerSlotMini = (l: SlotLayerRaw, i: i32) => {
 		let ui = UIBase.ui;
 
-		ui.row([1, 1]);
+		Zui.row([1, 1]);
 		let uix = ui._x;
 		let uiy = ui._y;
 		let state = TabLayers.drawLayerIcon(l, i, uix, uiy, true);
 		TabLayers.handleLayerIconState(l, i, state, uix, uiy);
-		ui.endElement();
+		Zui.endElement();
 
-		ui._y += ui.ELEMENT_H();
-		ui._y -= ui.ELEMENT_OFFSET();
+		ui._y += Zui.ELEMENT_H(ui);
+		ui._y -= Zui.ELEMENT_OFFSET(ui);
 	}
 
 	static drawLayerSlotFull = (l: SlotLayerRaw, i: i32) => {
@@ -300,16 +300,16 @@ class TabLayers {
 
 		let hasPanel = SlotLayer.isGroup(l) || (SlotLayer.isLayer(l) && SlotLayer.getMasks(l, false) != null);
 		if (hasPanel) {
-			ui.row([8 / 100, 16 / 100, 36 / 100, 30 / 100, 10 / 100]);
+			Zui.row([8 / 100, 16 / 100, 36 / 100, 30 / 100, 10 / 100]);
 		}
 		else {
-			ui.row([8 / 100, 16 / 100, 36 / 100, 30 / 100]);
+			Zui.row([8 / 100, 16 / 100, 36 / 100, 30 / 100]);
 		}
 
 		// Draw eye icon
 		let icons = Res.get("icons.k");
 		let r = Res.tile18(icons, l.visible ? 0 : 1, 0);
-		let center = (step / 2) * ui.SCALE();
+		let center = (step / 2) * Zui.SCALE(ui);
 		ui._x += 2;
 		ui._y += 3;
 		ui._y += center;
@@ -317,7 +317,7 @@ class TabLayers {
 		let parentHidden = l.parent != null && (!l.parent.visible || (l.parent.parent != null && !l.parent.parent.visible));
 		if (parentHidden) col -= 0x99000000;
 
-		if (ui.image(icons, col, null, r.x, r.y, r.w, r.h) == State.Released) {
+		if (Zui.image(icons, col, null, r.x, r.y, r.w, r.h) == State.Released) {
 			TabLayers.layerToggleVisible(l);
 		}
 		ui._x -= 2;
@@ -333,8 +333,8 @@ class TabLayers {
 		ui._x += 2;
 		ui._y += 3;
 		if (l.parent != null) {
-			ui._x += 10 * ui.SCALE();
-			if (l.parent.parent != null) ui._x += 10 * ui.SCALE();
+			ui._x += 10 * Zui.SCALE(ui);
+			if (l.parent.parent != null) ui._x += 10 * Zui.SCALE(ui);
 		}
 
 		let state = TabLayers.drawLayerIcon(l, i, uix, uiy, false);
@@ -343,7 +343,7 @@ class TabLayers {
 		ui._y -= 3;
 
 		if (Config.raw.touch_ui) {
-			ui._x += 12 * ui.SCALE();
+			ui._x += 12 * Zui.SCALE(ui);
 		}
 
 		///if krom_opengl
@@ -356,16 +356,16 @@ class TabLayers {
 		ui._y += center;
 		if (TabLayers.layerNameEdit == l.id) {
 			TabLayers.layerNameHandle.text = l.name;
-			l.name = ui.textInput(TabLayers.layerNameHandle);
+			l.name = Zui.textInput(TabLayers.layerNameHandle);
 			if (ui.textSelectedHandle_ptr != TabLayers.layerNameHandle.ptr) TabLayers.layerNameEdit = -1;
 		}
 		else {
 			if (ui.enabled && ui.inputEnabled && ui.comboSelectedHandle_ptr == null &&
 				ui.inputX > ui._windowX + ui._x && ui.inputX < ui._windowX + ui._windowW &&
-				ui.inputY > ui._windowY + ui._y - center && ui.inputY < ui._windowY + ui._y - center + (step * ui.SCALE()) * 2) {
+				ui.inputY > ui._windowY + ui._y - center && ui.inputY < ui._windowY + ui._y - center + (step * Zui.SCALE(ui)) * 2) {
 				if (ui.inputStarted) {
 					Context.setLayer(l);
-					TabLayers.setDragLayer(Context.raw.layer, -(Mouse.x - uix - ui._windowX - 3), -(Mouse.y - uiy - ui._windowY + 1));
+					TabLayers.setDragLayer(Context.raw.layer, -(mouse_x - uix - ui._windowX - 3), -(mouse_y - uiy - ui._windowY + 1));
 				}
 				else if (ui.inputReleasedR) {
 					Context.setLayer(l);
@@ -373,14 +373,14 @@ class TabLayers {
 				}
 			}
 
-			let state = ui.text(l.name);
+			let state = Zui.text(l.name);
 			if (state == State.Released) {
-				if (Time.time() - Context.raw.selectTime < 0.25) {
+				if (time_time() - Context.raw.selectTime < 0.25) {
 					TabLayers.layerNameEdit = l.id;
 					TabLayers.layerNameHandle.text = l.name;
-					ui.startTextEdit(TabLayers.layerNameHandle);
+					Zui.startTextEdit(TabLayers.layerNameHandle);
 				}
-				Context.raw.selectTime = Time.time();
+				Context.raw.selectTime = time_time();
 			}
 
 			let inFocus = ui.inputX > ui._windowX && ui.inputX < ui._windowX + ui._windowW &&
@@ -396,12 +396,12 @@ class TabLayers {
 		ui._y -= center;
 
 		if (l.parent != null) {
-			ui._x -= 10 * ui.SCALE();
-			if (l.parent.parent != null) ui._x -= 10 * ui.SCALE();
+			ui._x -= 10 * Zui.SCALE(ui);
+			if (l.parent.parent != null) ui._x -= 10 * Zui.SCALE(ui);
 		}
 
 		if (SlotLayer.isGroup(l)) {
-			ui.endElement();
+			Zui.endElement();
 		}
 		else {
 			if (SlotLayer.isMask(l)) {
@@ -417,43 +417,43 @@ class TabLayers {
 
 		if (hasPanel) {
 			ui._y += center;
-			let layerPanel = Zui.handle("tablayers_1").nest(l.id);
+			let layerPanel = Zui.nest(Zui.handle("tablayers_1"), l.id);
 			layerPanel.selected = l.show_panel;
-			l.show_panel = ui.panel(layerPanel, "", true, false, false);
+			l.show_panel = Zui.panel(layerPanel, "", true, false, false);
 			ui._y -= center;
 		}
 
 		if (SlotLayer.isGroup(l) || SlotLayer.isMask(l)) {
-			ui._y -= ui.ELEMENT_OFFSET();
-			ui.endElement();
+			ui._y -= Zui.ELEMENT_OFFSET(ui);
+			Zui.endElement();
 		}
 		else {
-			ui._y -= ui.ELEMENT_OFFSET();
+			ui._y -= Zui.ELEMENT_OFFSET(ui);
 
-			ui.row([8 / 100, 16 / 100, 36 / 100, 30 / 100, 10 / 100]);
-			ui.endElement();
-			ui.endElement();
-			ui.endElement();
+			Zui.row([8 / 100, 16 / 100, 36 / 100, 30 / 100, 10 / 100]);
+			Zui.endElement();
+			Zui.endElement();
+			Zui.endElement();
 
 			if (Config.raw.touch_ui) {
-				ui._x += 12 * ui.SCALE();
+				ui._x += 12 * Zui.SCALE(ui);
 			}
 
 			TabLayers.comboObject(ui, l);
-			ui.endElement();
+			Zui.endElement();
 		}
 
-		ui._y -= ui.ELEMENT_OFFSET();
+		ui._y -= Zui.ELEMENT_OFFSET(ui);
 	}
 
-	static comboObject = (ui: Zui, l: SlotLayerRaw, label = false): Handle => {
+	static comboObject = (ui: ZuiRaw, l: SlotLayerRaw, label = false): HandleRaw => {
 		let ar = [tr("Shared")];
 		for (let p of Project.paintObjects) ar.push(p.base.name);
 		let atlases = Project.getUsedAtlases();
 		if (atlases != null) for (let a of atlases) ar.push(a);
-		let objectHandle = Zui.handle("tablayers_2").nest(l.id);
+		let objectHandle = Zui.nest(Zui.handle("tablayers_2"), l.id);
 		objectHandle.position = l.objectMask;
-		l.objectMask = ui.combo(objectHandle, ar, tr("Object"), label, Align.Left);
+		l.objectMask = Zui.combo(objectHandle, ar, tr("Object"), label, Align.Left);
 		if (objectHandle.changed) {
 			Context.setLayer(l);
 			MakeMaterial.parseMeshMaterial();
@@ -472,10 +472,10 @@ class TabLayers {
 		return objectHandle;
 	}
 
-	static comboBlending = (ui: Zui, l: SlotLayerRaw, label = false): Handle => {
-		let blendingHandle = Zui.handle("tablayers_3").nest(l.id);
+	static comboBlending = (ui: ZuiRaw, l: SlotLayerRaw, label = false): HandleRaw => {
+		let blendingHandle = Zui.nest(Zui.handle("tablayers_3"), l.id);
 		blendingHandle.position = l.blending;
-		ui.combo(blendingHandle, [
+		Zui.combo(blendingHandle, [
 			tr("Mix"),
 			tr("Darken"),
 			tr("Multiply"),
@@ -515,15 +515,15 @@ class TabLayers {
 		let step = ui.t.ELEMENT_H;
 
 		// Separator line
-		ui.fill(0, 0, (ui._w / ui.SCALE() - 2), 1 * ui.SCALE(), ui.t.SEPARATOR_COL);
+		Zui.fill(0, 0, (ui._w / Zui.SCALE(ui) - 2), 1 * Zui.SCALE(ui), ui.t.SEPARATOR_COL);
 
 		// Highlight selected
 		if (Context.raw.layer == l) {
 			if (mini) {
-				ui.rect(1, -step * 2, ui._w / ui.SCALE() - 1, step * 2 + (mini ? -1 : 1), ui.t.HIGHLIGHT_COL, 3);
+				Zui.rect(1, -step * 2, ui._w / Zui.SCALE(ui) - 1, step * 2 + (mini ? -1 : 1), ui.t.HIGHLIGHT_COL, 3);
 			}
 			else {
-				ui.rect(1, -step * 2 - 1, ui._w / ui.SCALE() - 2, step * 2 + (mini ? -2 : 1), ui.t.HIGHLIGHT_COL, 2);
+				Zui.rect(1, -step * 2 - 1, ui._w / Zui.SCALE(ui) - 2, step * 2 + (mini ? -2 : 1), ui.t.HIGHLIGHT_COL, 2);
 			}
 		}
 	}
@@ -544,13 +544,13 @@ class TabLayers {
 		if (ui.isHovered && texpaint_preview != null) {
 			if (SlotLayer.isMask(l)) {
 				TabLayers.makeMaskPreviewRgba32(l);
-				ui.tooltipImage(Context.raw.maskPreviewRgba32);
+				Zui.tooltipImage(Context.raw.maskPreviewRgba32);
 			}
 			else {
-				ui.tooltipImage(texpaint_preview);
+				Zui.tooltipImage(texpaint_preview);
 			}
-			if (i < 9) ui.tooltip(l.name + " - (" + Config.keymap.select_layer + " " + (i + 1) + ")");
-			else ui.tooltip(l.name);
+			if (i < 9) Zui.tooltip(l.name + " - (" + Config.keymap.select_layer + " " + (i + 1) + ")");
+			else Zui.tooltip(l.name);
 		}
 
 		// Show context menu
@@ -561,14 +561,14 @@ class TabLayers {
 
 		if (state == State.Started) {
 			Context.setLayer(l);
-			TabLayers.setDragLayer(Context.raw.layer, -(Mouse.x - uix - ui._windowX - 3), -(Mouse.y - uiy - ui._windowY + 1));
+			TabLayers.setDragLayer(Context.raw.layer, -(mouse_x - uix - ui._windowX - 3), -(mouse_y - uiy - ui._windowY + 1));
 		}
 		else if (state == State.Released) {
-			if (Time.time() - Context.raw.selectTime < 0.2) {
+			if (time_time() - Context.raw.selectTime < 0.2) {
 				UIBase.show2DView(View2DType.View2DLayer);
 			}
-			if (Time.time() - Context.raw.selectTime > 0.2) {
-				Context.raw.selectTime = Time.time();
+			if (time_time() - Context.raw.selectTime > 0.2) {
+				Context.raw.selectTime = time_time();
 			}
 			if (l.fill_layer != null) Context.setMaterial(l.fill_layer);
 		}
@@ -577,10 +577,10 @@ class TabLayers {
 	static drawLayerIcon = (l: SlotLayerRaw, i: i32, uix: f32, uiy: f32, mini: bool) => {
 		let ui = UIBase.ui;
 		let icons = Res.get("icons.k");
-		let iconH = (ui.ELEMENT_H() - (mini ? 2 : 3)) * 2;
+		let iconH = (Zui.ELEMENT_H(ui) - (mini ? 2 : 3)) * 2;
 
-		if (mini && ui.SCALE() > 1) {
-			ui._x -= 1 * ui.SCALE();
+		if (mini && Zui.SCALE(ui) > 1) {
+			ui._x -= 1 * Zui.SCALE(ui);
 		}
 
 		if (l.parent != null) {
@@ -607,7 +607,7 @@ class TabLayers {
 				let _x = ui._x;
 				let _y = ui._y;
 				let _w = ui._w;
-				ui.image(icons, 0xffffffff, iconH, r.x, r.y, r.w, r.h);
+				Zui.image(icons, 0xffffffff, iconH, r.x, r.y, r.w, r.h);
 				ui.curRatio--;
 				ui._x = _x;
 				ui._y = _y;
@@ -621,7 +621,7 @@ class TabLayers {
 				Krom.setInt(UIView2D.channelLocation, 1);
 			}
 
-			let state = ui.image(icon, 0xffffffff, iconH);
+			let state = Zui.image(icon, 0xffffffff, iconH);
 
 			if (l.fill_layer == null && SlotLayer.isMask(l)) {
 				ui.g.pipeline = null;
@@ -632,12 +632,12 @@ class TabLayers {
 			if (!isTyping) {
 				if (i < 9 && Operator.shortcut(Config.keymap.select_layer, ShortcutType.ShortcutDown)) {
 					let number = String(i + 1) ;
-					let width = Font.width(ui.font, ui.fontSize, number) + 10;
-					let height = Font.height(ui.font, ui.fontSize);
+					let width = font_width(ui.font, ui.fontSize, number) + 10;
+					let height = font_height(ui.font, ui.fontSize);
 					ui.g.color = ui.t.TEXT_COL;
-					Graphics2.fillRect(uix, uiy, width, height);
+					g2_fill_rect(uix, uiy, width, height);
 					ui.g.color = ui.t.ACCENT_COL;
-					Graphics2.drawString(number, uix + 5, uiy);
+					g2_draw_string(number, uix + 5, uiy);
 				}
 			}
 
@@ -647,7 +647,7 @@ class TabLayers {
 			let folderClosed = Res.tile50(icons, 2, 1);
 			let folderOpen = Res.tile50(icons, 8, 1);
 			let folder = l.show_panel ? folderOpen : folderClosed;
-			return ui.image(icons, ui.t.LABEL_COL - 0x00202020, iconH, folder.x, folder.y, folder.w, folder.h);
+			return Zui.image(icons, ui.t.LABEL_COL - 0x00202020, iconH, folder.x, folder.y, folder.w, folder.h);
 		}
 	}
 
@@ -678,13 +678,13 @@ class TabLayers {
 		}
 		let menuElements = SlotLayer.isGroup(l) ? 7 : (19 + add);
 
-		UIMenu.draw((ui: Zui) => {
+		UIMenu.draw((ui: ZuiRaw) => {
 
 			if (mini) {
 				let visibleHandle = Zui.handle("tablayers_4");
 				visibleHandle.selected = l.visible;
 				UIMenu.menuFill(ui);
-				ui.check(visibleHandle, tr("Visible"));
+				Zui.check(visibleHandle, tr("Visible"));
 				if (visibleHandle.changed) {
 					TabLayers.layerToggleVisible(l);
 					UIMenu.keepOpen = true;
@@ -710,7 +710,7 @@ class TabLayers {
 						let f = UIFiles.filename;
 						if (f == "") f = tr("untitled");
 						if (!f.endsWith(".png")) f += ".png";
-						Krom.writePng(path + Path.sep + f, Image.getPixels(l.texpaint), l.texpaint.width, l.texpaint.height, 3); // RRR1
+						Krom.writePng(path + Path.sep + f, image_get_pixels(l.texpaint), l.texpaint.width, l.texpaint.height, 3); // RRR1
 					});
 				}
 				else {
@@ -816,9 +816,9 @@ class TabLayers {
 
 			UIMenu.menuFill(ui);
 			UIMenu.menuAlign(ui);
-			let layerOpacHandle = Zui.handle("tablayers_5").nest(l.id);
+			let layerOpacHandle = Zui.nest(Zui.handle("tablayers_5"), l.id);
 			layerOpacHandle.value = l.maskOpacity;
-			ui.slider(layerOpacHandle, tr("Opacity"), 0.0, 1.0, true);
+			Zui.slider(layerOpacHandle, tr("Opacity"), 0.0, 1.0, true);
 			if (layerOpacHandle.changed) {
 				if (ui.inputStarted) History.layerOpacity();
 				l.maskOpacity = layerOpacHandle.value;
@@ -837,7 +837,7 @@ class TabLayers {
 				///end
 				let _y = ui._y;
 				Base.resHandle.value = Base.resHandle.position;
-				Base.resHandle.position = Math.floor(ui.slider(Base.resHandle, ar[Base.resHandle.position], 0, ar.length - 1, false, 1, false, Align.Left, false));
+				Base.resHandle.position = Math.floor(Zui.slider(Base.resHandle, ar[Base.resHandle.position], 0, ar.length - 1, false, 1, false, Align.Left, false));
 				if (Base.resHandle.changed) {
 					UIMenu.keepOpen = true;
 				}
@@ -845,15 +845,15 @@ class TabLayers {
 					Base.onLayersResized();
 				}
 				ui._y = _y;
-				ui.drawString(ui.g, tr("Res"), null, 0, Align.Right);
-				ui.endElement();
+				Zui.drawString(ui.g, tr("Res"), null, 0, Align.Right);
+				Zui.endElement();
 
 				UIMenu.menuFill(ui);
 				UIMenu.menuAlign(ui);
 				///if (krom_android || krom_ios)
-				ui.inlineRadio(Base.bitsHandle, ["8bit"]);
+				Zui.inlineRadio(Base.bitsHandle, ["8bit"]);
 				///else
-				ui.inlineRadio(Base.bitsHandle, ["8bit", "16bit", "32bit"]);
+				Zui.inlineRadio(Base.bitsHandle, ["8bit", "16bit", "32bit"]);
 				///end
 				if (Base.bitsHandle.changed) {
 					App.notifyOnInit(Base.setLayerBits);
@@ -864,9 +864,9 @@ class TabLayers {
 			if (l.fill_layer != null) {
 				UIMenu.menuFill(ui);
 				UIMenu.menuAlign(ui);
-				let scaleHandle = Zui.handle("tablayers_6").nest(l.id);
+				let scaleHandle = Zui.nest(Zui.handle("tablayers_6"), l.id);
 				scaleHandle.value = l.scale;
-				l.scale = ui.slider(scaleHandle, tr("UV Scale"), 0.0, 5.0, true);
+				l.scale = Zui.slider(scaleHandle, tr("UV Scale"), 0.0, 5.0, true);
 				if (scaleHandle.changed) {
 					Context.setMaterial(l.fill_layer);
 					Context.setLayer(l);
@@ -879,9 +879,9 @@ class TabLayers {
 
 				UIMenu.menuFill(ui);
 				UIMenu.menuAlign(ui);
-				let angleHandle = Zui.handle("tablayers_7").nest(l.id);
+				let angleHandle = Zui.nest(Zui.handle("tablayers_7"), l.id);
 				angleHandle.value = l.angle;
-				l.angle = ui.slider(angleHandle, tr("Angle"), 0.0, 360, true, 1);
+				l.angle = Zui.slider(angleHandle, tr("Angle"), 0.0, 360, true, 1);
 				if (angleHandle.changed) {
 					Context.setMaterial(l.fill_layer);
 					Context.setLayer(l);
@@ -895,9 +895,9 @@ class TabLayers {
 
 				UIMenu.menuFill(ui);
 				UIMenu.menuAlign(ui);
-				let uvTypeHandle = Zui.handle("tablayers_8").nest(l.id);
+				let uvTypeHandle = Zui.nest(Zui.handle("tablayers_8"), l.id);
 				uvTypeHandle.position = l.uvType;
-				l.uvType = ui.inlineRadio(uvTypeHandle, [tr("UV Map"), tr("Triplanar"), tr("Project")], Align.Left);
+				l.uvType = Zui.inlineRadio(uvTypeHandle, [tr("UV Map"), tr("Triplanar"), tr("Project")], Align.Left);
 				if (uvTypeHandle.changed) {
 					Context.setMaterial(l.fill_layer);
 					Context.setLayer(l);
@@ -911,17 +911,17 @@ class TabLayers {
 			}
 
 			if (!SlotLayer.isGroup(l)) {
-				let baseHandle = Zui.handle("tablayers_9").nest(l.id);
-				let opacHandle = Zui.handle("tablayers_10").nest(l.id);
-				let norHandle = Zui.handle("tablayers_11").nest(l.id);
-				let norBlendHandle = Zui.handle("tablayers_12").nest(l.id);
-				let occHandle = Zui.handle("tablayers_13").nest(l.id);
-				let roughHandle = Zui.handle("tablayers_14").nest(l.id);
-				let metHandle = Zui.handle("tablayers_15").nest(l.id);
-				let heightHandle = Zui.handle("tablayers_16").nest(l.id);
-				let heightBlendHandle = Zui.handle("tablayers_17").nest(l.id);
-				let emisHandle = Zui.handle("tablayers_18").nest(l.id);
-				let subsHandle = Zui.handle("tablayers_19").nest(l.id);
+				let baseHandle = Zui.nest(Zui.handle("tablayers_9"), l.id);
+				let opacHandle = Zui.nest(Zui.handle("tablayers_10"), l.id);
+				let norHandle = Zui.nest(Zui.handle("tablayers_11"), l.id);
+				let norBlendHandle = Zui.nest(Zui.handle("tablayers_12"), l.id);
+				let occHandle = Zui.nest(Zui.handle("tablayers_13"), l.id);
+				let roughHandle = Zui.nest(Zui.handle("tablayers_14"), l.id);
+				let metHandle = Zui.nest(Zui.handle("tablayers_15"), l.id);
+				let heightHandle = Zui.nest(Zui.handle("tablayers_16"), l.id);
+				let heightBlendHandle = Zui.nest(Zui.handle("tablayers_17"), l.id);
+				let emisHandle = Zui.nest(Zui.handle("tablayers_18"), l.id);
+				let subsHandle = Zui.nest(Zui.handle("tablayers_19"), l.id);
 				baseHandle.selected = l.paintBase;
 				opacHandle.selected = l.paintOpac;
 				norHandle.selected = l.paintNor;
@@ -934,27 +934,27 @@ class TabLayers {
 				emisHandle.selected = l.paintEmis;
 				subsHandle.selected = l.paintSubs;
 				UIMenu.menuFill(ui);
-				l.paintBase = ui.check(baseHandle, tr("Base Color"));
+				l.paintBase = Zui.check(baseHandle, tr("Base Color"));
 				UIMenu.menuFill(ui);
-				l.paintOpac = ui.check(opacHandle, tr("Opacity"));
+				l.paintOpac = Zui.check(opacHandle, tr("Opacity"));
 				UIMenu.menuFill(ui);
-				l.paintNor = ui.check(norHandle, tr("Normal"));
+				l.paintNor = Zui.check(norHandle, tr("Normal"));
 				UIMenu.menuFill(ui);
-				l.paintNorBlend = ui.check(norBlendHandle, tr("Normal Blending"));
+				l.paintNorBlend = Zui.check(norBlendHandle, tr("Normal Blending"));
 				UIMenu.menuFill(ui);
-				l.paintOcc = ui.check(occHandle, tr("Occlusion"));
+				l.paintOcc = Zui.check(occHandle, tr("Occlusion"));
 				UIMenu.menuFill(ui);
-				l.paintRough = ui.check(roughHandle, tr("Roughness"));
+				l.paintRough = Zui.check(roughHandle, tr("Roughness"));
 				UIMenu.menuFill(ui);
-				l.paintMet = ui.check(metHandle, tr("Metallic"));
+				l.paintMet = Zui.check(metHandle, tr("Metallic"));
 				UIMenu.menuFill(ui);
-				l.paintHeight = ui.check(heightHandle, tr("Height"));
+				l.paintHeight = Zui.check(heightHandle, tr("Height"));
 				UIMenu.menuFill(ui);
-				l.paintHeightBlend = ui.check(heightBlendHandle, tr("Height Blending"));
+				l.paintHeightBlend = Zui.check(heightBlendHandle, tr("Height Blending"));
 				UIMenu.menuFill(ui);
-				l.paintEmis = ui.check(emisHandle, tr("Emission"));
+				l.paintEmis = Zui.check(emisHandle, tr("Emission"));
 				UIMenu.menuFill(ui);
-				l.paintSubs = ui.check(subsHandle, tr("Subsurface"));
+				l.paintSubs = Zui.check(subsHandle, tr("Subsurface"));
 				if (baseHandle.changed ||
 					opacHandle.changed ||
 					norHandle.changed ||
@@ -976,17 +976,17 @@ class TabLayers {
 	static makeMaskPreviewRgba32 = (l: SlotLayerRaw) => {
 		///if is_paint
 		if (Context.raw.maskPreviewRgba32 == null) {
-			Context.raw.maskPreviewRgba32 = Image.createRenderTarget(UtilRender.layerPreviewSize, UtilRender.layerPreviewSize);
+			Context.raw.maskPreviewRgba32 = image_create_render_target(UtilRender.layerPreviewSize, UtilRender.layerPreviewSize);
 		}
 		// Convert from R8 to RGBA32 for tooltip display
 		if (Context.raw.maskPreviewLast != l) {
 			Context.raw.maskPreviewLast = l;
 			App.notifyOnInit(() => {
-				Graphics2.begin(Context.raw.maskPreviewRgba32.g2);
+				g2_begin(Context.raw.maskPreviewRgba32.g2);
 				Context.raw.maskPreviewRgba32.g2.pipeline = UIView2D.pipe;
-				Graphics4.setInt(UIView2D.channelLocation, 1);
-				Graphics2.drawImage(l.texpaint_preview, 0, 0);
-				Graphics2.end(Context.raw.maskPreviewRgba32.g2);
+				g4_set_int(UIView2D.channelLocation, 1);
+				g2_draw_image(l.texpaint_preview, 0, 0);
+				g2_end(Context.raw.maskPreviewRgba32.g2);
 				Context.raw.maskPreviewRgba32.g2.pipeline = null;
 			});
 		}

+ 1 - 1
armorpaint/Sources/nodes/BrushOutputNode.ts

@@ -111,7 +111,7 @@ class BrushOutputNode extends LogicNode {
 			!Base.isComboSelected()) {
 
 			// Set color pick
-			let down = Mouse.down() || Pen.down();
+			let down = mouse_down() || pen_down();
 			if (down && Context.raw.tool == WorkspaceTool.ToolColorId && Project.assets.length > 0) {
 				Context.raw.colorIdPicked = true;
 				UIToolbar.toolbarHandle.redraws = 1;

+ 28 - 28
armorpaint/Sources/nodes/InputNode.ts

@@ -1,7 +1,7 @@
 
 class InputNode extends LogicNode {
 
-	static coords = Vec4.create();
+	static coords = vec4_create();
 
 	static startX = 0.0;
 	static startY = 0.0;
@@ -26,7 +26,7 @@ class InputNode extends LogicNode {
 
 	update = () => {
 		if (Context.raw.splitView) {
-			Context.raw.viewIndex = Mouse.viewX > Base.w() / 2 ? 1 : 0;
+			Context.raw.viewIndex = mouse_view_x() > Base.w() / 2 ? 1 : 0;
 		}
 
 		let decal = Context.raw.tool == WorkspaceTool.ToolDecal || Context.raw.tool == WorkspaceTool.ToolText;
@@ -37,20 +37,20 @@ class InputNode extends LogicNode {
 			 Operator.shortcut(Config.keymap.brush_ruler + "+" + Config.keymap.action_paint, ShortcutType.ShortcutDown) ||
 			 decalMask);
 
-		let paintX = Mouse.viewX / App.w();
-		let paintY = Mouse.viewY / App.h();
-		if (Mouse.started()) {
-			InputNode.startX = Mouse.viewX / App.w();
-			InputNode.startY = Mouse.viewY / App.h();
+		let paintX = mouse_view_x() / App.w();
+		let paintY = mouse_view_y() / App.h();
+		if (mouse_started()) {
+			InputNode.startX = mouse_view_x() / App.w();
+			InputNode.startY = mouse_view_y() / App.h();
 		}
 
-		if (Pen.down()) {
-			paintX = Pen.viewX / App.w();
-			paintY = Pen.viewY / App.h();
+		if (pen_down()) {
+			paintX = pen_view_x() / App.w();
+			paintY = pen_view_y() / App.h();
 		}
-		if (Pen.started()) {
-			InputNode.startX = Pen.viewX / App.w();
-			InputNode.startY = Pen.viewY / App.h();
+		if (pen_started()) {
+			InputNode.startX = pen_view_x() / App.w();
+			InputNode.startY = pen_view_y() / App.h();
 		}
 
 		if (Operator.shortcut(Config.keymap.brush_ruler + "+" + Config.keymap.action_paint, ShortcutType.ShortcutDown)) {
@@ -72,35 +72,35 @@ class InputNode extends LogicNode {
 		}
 
 		if (InputNode.lockBegin) {
-			let dx = Math.abs(InputNode.lockStartX - Mouse.viewX);
-			let dy = Math.abs(InputNode.lockStartY - Mouse.viewY);
+			let dx = Math.abs(InputNode.lockStartX - mouse_view_x());
+			let dy = Math.abs(InputNode.lockStartY - mouse_view_y());
 			if (dx > 1 || dy > 1) {
 				InputNode.lockBegin = false;
 				dx > dy ? InputNode.lockY = true : InputNode.lockX = true;
 			}
 		}
 
-		if (Keyboard.started(Config.keymap.brush_ruler)) {
-			InputNode.lockStartX = Mouse.viewX;
-			InputNode.lockStartY = Mouse.viewY;
+		if (keyboard_started(Config.keymap.brush_ruler)) {
+			InputNode.lockStartX = mouse_view_x();
+			InputNode.lockStartY = mouse_view_y();
 			InputNode.lockBegin = true;
 		}
-		else if (Keyboard.released(Config.keymap.brush_ruler)) {
+		else if (keyboard_released(Config.keymap.brush_ruler)) {
 			InputNode.lockX = InputNode.lockY = InputNode.lockBegin = false;
 		}
 
 		if (Context.raw.brushLazyRadius > 0) {
-			let v1 = Vec4.create(Context.raw.brushLazyX * App.w(), Context.raw.brushLazyY * App.h(), 0.0);
-			let v2 = Vec4.create(InputNode.coords.x * App.w(), InputNode.coords.y * App.h(), 0.0);
-			let d = Vec4.distance(v1, v2);
+			let v1 = vec4_create(Context.raw.brushLazyX * App.w(), Context.raw.brushLazyY * App.h(), 0.0);
+			let v2 = vec4_create(InputNode.coords.x * App.w(), InputNode.coords.y * App.h(), 0.0);
+			let d = vec4_dist(v1, v2);
 			let r = Context.raw.brushLazyRadius * 85;
 			if (d > r) {
-				let v3 = Vec4.create();
-				Vec4.subvecs(v3, v2, v1);
-				Vec4.normalize(v3, );
-				Vec4.mult(v3, 1.0 - Context.raw.brushLazyStep);
-				Vec4.mult(v3, r);
-				Vec4.addvecs(v2, v1, v3);
+				let v3 = vec4_create();
+				vec4_sub_vecs(v3, v2, v1);
+				vec4_normalize(v3, );
+				vec4_mult(v3, 1.0 - Context.raw.brushLazyStep);
+				vec4_mult(v3, r);
+				vec4_add_vecs(v2, v1, v3);
 				InputNode.coords.x = v2.x / App.w();
 				InputNode.coords.y = v2.y / App.h();
 				// Parse brush inputs once on next draw

+ 15 - 15
armorsculpt/Assets/plugins/hello_world.js

@@ -10,22 +10,22 @@ let h6 = new Handle();
 let h7 = new Handle();
 
 plugin.drawUI = function(ui) {
-	if (ui.panel(h1, "My Plugin")) {
-		ui.text("Label");
-		ui.textInput(h7, "Text Input");
-		if (ui.button("Button")) {
+	if (Zui.panel(h1, "My Plugin")) {
+		Zui.text("Label");
+		Zui.textInput(h7, "Text Input");
+		if (Zui.button("Button")) {
 			console.error("Hello");
 		}
-		ui.row([1/2, 1/2]);
-		ui.button("Button A");
-		ui.button("Button B");
-		ui.combo(h5, ["Item 1", "Item 2"], "Combo");
-		ui.row([1/2, 1/2]);
-		ui.slider(h2, "Slider", 0, 1, true);
-		ui.slider(h3, "Slider", 0, 1, true);
-		ui.check(h4, "Check");
-		ui.radio(h6, 0, "Radio 1");
-		ui.radio(h6, 1, "Radio 2");
-		ui.radio(h6, 2, "Radio 3");
+		Zui.row([1/2, 1/2]);
+		Zui.button("Button A");
+		Zui.button("Button B");
+		Zui.combo(h5, ["Item 1", "Item 2"], "Combo");
+		Zui.row([1/2, 1/2]);
+		Zui.slider(h2, "Slider", 0, 1, true);
+		Zui.slider(h3, "Slider", 0, 1, true);
+		Zui.check(h4, "Check");
+		Zui.radio(h6, 0, "Radio 1");
+		Zui.radio(h6, 1, "Radio 2");
+		Zui.radio(h6, 2, "Radio 3");
 	}
 }

+ 1 - 1
armorsculpt/Sources/ExportObj.ts

@@ -12,7 +12,7 @@ class ExportObj {
 		ExportObj.writeString(o, "# armorsculpt.org\n");
 
 		let texpaint = Project.layers[0].texpaint;
-		let pixels = Image.getPixels(texpaint);
+		let pixels = image_get_pixels(texpaint);
 		let pixelsView = new DataView(pixels);
 		let mesh = paintObjects[0].data;
 		let inda = mesh.index_arrays[0].values;

+ 9 - 9
armorsculpt/Sources/ImportMesh.ts

@@ -28,7 +28,7 @@ class ImportMesh {
 		Project.meshAssets = [path];
 
 		///if (krom_android || krom_ios)
-		System.title = path.substring(path.lastIndexOf(Path.sep) + 1, path.lastIndexOf("."));
+		sys_title_set(path.substring(path.lastIndexOf(Path.sep) + 1, path.lastIndexOf(".")));
 		///end
 	}
 
@@ -79,7 +79,7 @@ class ImportMesh {
 			let raw = ImportMesh.rawMesh(mesh);
 			if (mesh.cola != null) raw.vertex_arrays.push({ values: mesh.cola, attrib: "col", data: "short4norm", padding: 1 });
 
-			MeshData.create(raw, (md: TMeshData) => {
+			MeshData.create(raw, (md: mesh_data_t) => {
 				Context.raw.paintObject = Context.mainObject();
 
 				Context.selectPaintObject(Context.mainObject());
@@ -127,13 +127,13 @@ class ImportMesh {
 						f32[i * 4 + 2] = mesh.posa[index * 4 + 2] / 32767;
 						f32[i * 4 + 3] = 1.0;
 					}
-					let imgmesh = Image.fromBytes(f32.buffer, Config.getTextureResX(), Config.getTextureResY(), TextureFormat.RGBA128);
+					let imgmesh = image_from_bytes(f32.buffer, Config.getTextureResX(), Config.getTextureResY(), TextureFormat.RGBA128);
 					let texpaint = Project.layers[0].texpaint;
-					Graphics2.begin(texpaint.g2, false);
+					g2_begin(texpaint.g2, false);
 					texpaint.g2.pipeline = Base.pipeCopy128;
-					Graphics2.drawScaledImage(imgmesh, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+					g2_draw_scaled_image(imgmesh, 0, 0, Config.getTextureResX(), Config.getTextureResY());
 					texpaint.g2.pipeline = null;
-					Graphics2.end(texpaint.g2);
+					g2_end(texpaint.g2);
 				});
 			});
 		}
@@ -147,9 +147,9 @@ class ImportMesh {
 			let raw = ImportMesh.rawMesh(mesh);
 			if (mesh.cola != null) raw.vertex_arrays.push({ values: mesh.cola, attrib: "col", data: "short4norm", padding: 1 });
 
-			MeshData.create(raw, (md: TMeshData) => {
+			MeshData.create(raw, (md: mesh_data_t) => {
 
-				let object = Scene.addMeshObject(md, Context.raw.paintObject.materials, Context.raw.paintObject.base);
+				let object = scene_add_mesh_object(md, Context.raw.paintObject.materials, Context.raw.paintObject.base);
 				object.base.name = mesh.base.name;
 				object.skip_context = "paint";
 
@@ -175,7 +175,7 @@ class ImportMesh {
 		_addMesh();
 	}
 
-	static rawMesh = (mesh: any): TMeshData => {
+	static rawMesh = (mesh: any): mesh_data_t => {
 		let posa = new Int16Array(Math.floor(mesh.inda.length * 4));
 		for (let i = 0; i < posa.length; ++i) posa[i] = 32767;
 		let inda = new Uint32Array(mesh.inda.length);

+ 47 - 47
armorsculpt/Sources/MakeMaterial.ts

@@ -1,8 +1,8 @@
 
 class MakeMaterial {
 
-	static defaultScon: TShaderContext = null;
-	static defaultMcon: TMaterialContext = null;
+	static defaultScon: shader_context_t = null;
+	static defaultMcon: material_context_t = null;
 
 	static heightUsed = false;
 	static emisUsed = false;
@@ -57,36 +57,36 @@ class MakeMaterial {
 		}
 
 		let con = MakeMesh.run({ name: "Material", canvas: null });
-		let scon: TShaderContext;
-		ShaderContext.create(con.data, (_scon: TShaderContext) => { scon = _scon; });
-		scon._overrideContext = {};
+		let scon: shader_context_t;
+		shader_context_create(con.data, (_scon: shader_context_t) => { scon = _scon; });
+		scon._override_context = {};
 		if (con.frag.sharedSamplers.length > 0) {
 			let sampler = con.frag.sharedSamplers[0];
-			scon._overrideContext.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
+			scon._override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
 		}
 		if (!Context.raw.textureFilter) {
-			scon._overrideContext.filter = "point";
+			scon._override_context.filter = "point";
 		}
 		m._shader.contexts.push(scon);
 		m._shader._contexts.push(scon);
 
 		for (let i = 1; i < MakeMesh.layerPassCount; ++i) {
 			let con = MakeMesh.run({ name: "Material", canvas: null }, i);
-			let scon: TShaderContext;
-			ShaderContext.create(con.data, (_scon: TShaderContext) => { scon = _scon; });
-			scon._overrideContext = {};
+			let scon: shader_context_t;
+			shader_context_create(con.data, (_scon: shader_context_t) => { scon = _scon; });
+			scon._override_context = {};
 			if (con.frag.sharedSamplers.length > 0) {
 				let sampler = con.frag.sharedSamplers[0];
-				scon._overrideContext.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
+				scon._override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
 			}
 			if (!Context.raw.textureFilter) {
-				scon._overrideContext.filter = "point";
+				scon._override_context.filter = "point";
 			}
 			m._shader.contexts.push(scon);
 			m._shader._contexts.push(scon);
 
-			let mcon: TMaterialContext;
-			MaterialContext.create({ name: "mesh" + i, bind_textures: [] }, (self: TMaterialContext) => { mcon = self; });
+			let mcon: material_context_t;
+			MaterialContext.create({ name: "mesh" + i, bind_textures: [] }, (self: material_context_t) => { mcon = self; });
 			m.contexts.push(mcon);
 			m._contexts.push(mcon);
 		}
@@ -100,7 +100,7 @@ class MakeMaterial {
 
 	static parseParticleMaterial = () => {
 		let m = Context.raw.particleMaterial;
-		let sc: TShaderContext = null;
+		let sc: shader_context_t = null;
 		for (let c of m._shader._contexts) {
 			if (c.name == "mesh") {
 				sc = c;
@@ -113,7 +113,7 @@ class MakeMaterial {
 		}
 		let con = MakeParticle.run({ name: "MaterialParticle", canvas: null });
 		if (sc != null) MakeMaterial.deleteContext(sc);
-		ShaderContext.create(con.data, (_sc: TShaderContext) => { sc = _sc; });
+		shader_context_create(con.data, (_sc: shader_context_t) => { sc = _sc; });
 		m._shader.contexts.push(sc);
 		m._shader._contexts.push(sc);
 	}
@@ -122,7 +122,7 @@ class MakeMaterial {
 		if (!MakeMaterial.getMOut()) return;
 
 		let m = Project.materials[0].data;
-		let scon: TShaderContext = null;
+		let scon: shader_context_t = null;
 		for (let c of m._shader._contexts) {
 			if (c.name == "mesh") {
 				scon = c;
@@ -132,14 +132,14 @@ class MakeMaterial {
 		array_remove(m._shader.contexts, scon);
 		array_remove(m._shader._contexts, scon);
 
-		let mcon: TMaterialContext = { name: "mesh", bind_textures: [] };
+		let mcon: material_context_t = { name: "mesh", bind_textures: [] };
 
 		let sd: TMaterial = { name: "Material", canvas: null };
 		let con = MakeMeshPreview.run(sd, mcon);
 
 		for (let i = 0; i < m.contexts.length; ++i) {
 			if (m.contexts[i].name == "mesh") {
-				MaterialContext.create(mcon, (self: TMaterialContext) => { m.contexts[i] = self; });
+				MaterialContext.create(mcon, (self: material_context_t) => { m.contexts[i] = self; });
 				break;
 			}
 		}
@@ -147,7 +147,7 @@ class MakeMaterial {
 		if (scon != null) MakeMaterial.deleteContext(scon);
 
 		let compileError = false;
-		ShaderContext.create(con.data, (_scon: TShaderContext) => {
+		shader_context_create(con.data, (_scon: shader_context_t) => {
 			if (_scon == null) compileError = true;
 			scon = _scon;
 		});
@@ -158,10 +158,10 @@ class MakeMaterial {
 	}
 
 	///if arm_voxels
-	static makeVoxel = (m: TMaterialData) => {
+	static makeVoxel = (m: material_data_t) => {
 		let rebuild = MakeMaterial.heightUsed;
 		if (Config.raw.rp_gi != false && rebuild) {
-			let scon: TShaderContext = null;
+			let scon: shader_context_t = null;
 			for (let c of m._shader._contexts) {
 				if (c.name == "voxel") {
 					scon = c;
@@ -177,15 +177,15 @@ class MakeMaterial {
 		if (!MakeMaterial.getMOut()) return;
 
 		if (bakePreviews) {
-			let current = Graphics2.current;
-			if (current != null) Graphics2.end(current);
+			let current = _g2_current;
+			if (current != null) g2_end(current);
 			MakeMaterial.bakeNodePreviews();
-			if (current != null) Graphics2.begin(current, false);
+			if (current != null) g2_begin(current, false);
 		}
 
 		let m = Project.materials[0].data;
-		let scon: TShaderContext = null;
-		let mcon: TMaterialContext = null;
+		let scon: shader_context_t = null;
+		let mcon: material_context_t = null;
 		for (let c of m._shader._contexts) {
 			if (c.name == "paint") {
 				array_remove(m._shader.contexts, c);
@@ -203,20 +203,20 @@ class MakeMaterial {
 		}
 
 		let sdata: TMaterial = { name: "Material", canvas: UINodes.getCanvasMaterial() };
-		let mcon2: TMaterialContext = { name: "paint", bind_textures: [] };
+		let mcon2: material_context_t = { name: "paint", bind_textures: [] };
 		let con = MakeSculpt.run(sdata, mcon2);
 
 		let compileError = false;
-		let scon2: TShaderContext;
-		ShaderContext.create(con.data, (_scon: TShaderContext) => {
+		let scon2: shader_context_t;
+		shader_context_create(con.data, (_scon: shader_context_t) => {
 			if (_scon == null) compileError = true;
 			scon2 = _scon;
 		});
 		if (compileError) return;
-		scon2._overrideContext = {};
-		scon2._overrideContext.addressing = "repeat";
-		let mcon3: TMaterialContext;
-		MaterialContext.create(mcon2, (_mcon: TMaterialContext) => { mcon3 = _mcon; });
+		scon2._override_context = {};
+		scon2._override_context.addressing = "repeat";
+		let mcon3: material_context_t;
+		MaterialContext.create(mcon2, (_mcon: material_context_t) => { mcon3 = _mcon; });
 
 		m._shader.contexts.push(scon2);
 		m._shader._contexts.push(scon2);
@@ -234,7 +234,7 @@ class MakeMaterial {
 		for (let key of Context.raw.nodePreviews.keys()) {
 			if (Context.raw.nodePreviewsUsed.indexOf(key) == -1) {
 				let image = Context.raw.nodePreviews.get(key);
-				Base.notifyOnNextFrame(function() { Image.unload(image); });
+				Base.notifyOnNextFrame(function() { image_unload(image); });
 				Context.raw.nodePreviews.delete(key);
 			}
 		}
@@ -264,8 +264,8 @@ class MakeMaterial {
 			let resX = Math.floor(Config.getTextureResX() / 4);
 			let resY = Math.floor(Config.getTextureResY() / 4);
 			if (image == null || image.width != resX || image.height != resY) {
-				if (image != null) Image.unload(image);
-				image = Image.createRenderTarget(resX, resY);
+				if (image != null) image_unload(image);
+				image = image_create_render_target(resX, resY);
 				Context.raw.nodePreviews.set(id, image);
 			}
 
@@ -280,8 +280,8 @@ class MakeMaterial {
 			let resX = Math.floor(Config.getTextureResX());
 			let resY = Math.floor(Config.getTextureResY());
 			if (image == null || image.width != resX || image.height != resY) {
-				if (image != null) Image.unload(image);
-				image = Image.createRenderTarget(resX, resY);
+				if (image != null) image_unload(image);
+				image = image_create_render_target(resX, resY);
 				Context.raw.nodePreviews.set(id, image);
 			}
 
@@ -291,20 +291,20 @@ class MakeMaterial {
 		}
 	}
 
-	static parseNodePreviewMaterial = (node: TNode, group: TNodeCanvas = null, parents: TNode[] = null): { scon: TShaderContext, mcon: TMaterialContext } => {
+	static parseNodePreviewMaterial = (node: TNode, group: TNodeCanvas = null, parents: TNode[] = null): { scon: shader_context_t, mcon: material_context_t } => {
 		if (node.outputs.length == 0) return null;
 		let sdata: TMaterial = { name: "Material", canvas: UINodes.getCanvasMaterial() };
-		let mcon_raw: TMaterialContext = { name: "mesh", bind_textures: [] };
+		let mcon_raw: material_context_t = { name: "mesh", bind_textures: [] };
 		let con = MakeNodePreview.run(sdata, mcon_raw, node, group, parents);
 		let compileError = false;
-		let scon: TShaderContext;
-		ShaderContext.create(con.data, (_scon: TShaderContext) => {
+		let scon: shader_context_t;
+		shader_context_create(con.data, (_scon: shader_context_t) => {
 			if (_scon == null) compileError = true;
 			scon = _scon;
 		});
 		if (compileError) return null;
-		let mcon: TMaterialContext;
-		MaterialContext.create(mcon_raw, (_mcon: TMaterialContext) => { mcon = _mcon; });
+		let mcon: material_context_t;
+		MaterialContext.create(mcon_raw, (_mcon: material_context_t) => { mcon = _mcon; });
 		return { scon: scon, mcon: mcon };
 	}
 
@@ -322,9 +322,9 @@ class MakeMaterial {
 		return `const vec3 voxelgiHalfExtents = vec3(${ext}, ${ext}, ${ext});`;
 	}
 
-	static deleteContext = (c: TShaderContext) => {
+	static deleteContext = (c: shader_context_t) => {
 		Base.notifyOnNextFrame(() => { // Ensure pipeline is no longer in use
-			ShaderContext.delete(c);
+			shader_context_delete(c);
 		});
 	}
 }

+ 2 - 2
armorsculpt/Sources/MakeMeshPreview.ts

@@ -3,7 +3,7 @@ class MakeMeshPreview {
 
 	static opacityDiscardDecal = 0.05;
 
-	static run = (data: TMaterial, matcon: TMaterialContext): NodeShaderContextRaw => {
+	static run = (data: TMaterial, matcon: material_context_t): NodeShaderContextRaw => {
 		let context_id = "mesh";
 		let con_mesh = NodeShaderContext.create(data, {
 			name: context_id,
@@ -21,7 +21,7 @@ class MakeMeshPreview {
 		let pos = "pos";
 
 		///if arm_skin
-		let skin = Context.raw.paintObject.data.getVArray("bone") != null;
+		let skin = MeshData.getVArray(Context.raw.paintObject.data, "bone") != null;
 		if (skin) {
 			pos = "spos";
 			NodeShaderContext.add_elem(con_mesh, "bone", 'short4norm');

+ 1 - 1
armorsculpt/Sources/MakeSculpt.ts

@@ -1,7 +1,7 @@
 
 class MakeSculpt {
 
-	static run = (data: TMaterial, matcon: TMaterialContext): NodeShaderContextRaw => {
+	static run = (data: TMaterial, matcon: material_context_t): NodeShaderContextRaw => {
 		let context_id = "paint";
 		let con_paint = NodeShaderContext.create(data, {
 			name: context_id,

+ 65 - 65
armorsculpt/Sources/TabLayers.ts

@@ -2,28 +2,28 @@
 class TabLayers {
 
 	static layerNameEdit = -1;
-	static layerNameHandle = new Handle();
+	static layerNameHandle = Handle.create();
 	static showContextMenu = false;
 
-	static draw = (htab: Handle) => {
+	static draw = (htab: HandleRaw) => {
 		let mini = Config.raw.layout[LayoutSize.LayoutSidebarW] <= UIBase.sidebarMiniW;
 		mini ? TabLayers.drawMini(htab) : TabLayers.drawFull(htab);
 	}
 
-	static drawMini = (htab: Handle) => {
+	static drawMini = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
-		ui.setHoveredTabName(tr("Layers"));
+		Zui.setHoveredTabName(tr("Layers"));
 
 		let _ELEMENT_H = ui.t.ELEMENT_H;
-		ui.t.ELEMENT_H = Math.floor(UIBase.sidebarMiniW / 2 / ui.SCALE());
+		ui.t.ELEMENT_H = Math.floor(UIBase.sidebarMiniW / 2 / Zui.SCALE(ui));
 
-		ui.beginSticky();
-		ui.separator(5);
+		Zui.beginSticky();
+		Zui.separator(5);
 
 		TabLayers.comboFilter();
 		TabLayers.buttonNew("+");
 
-		ui.endSticky();
+		Zui.endSticky();
 		ui._y += 2;
 
 		TabLayers.highlightOddLines();
@@ -32,16 +32,16 @@ class TabLayers {
 		ui.t.ELEMENT_H = _ELEMENT_H;
 	}
 
-	static drawFull = (htab: Handle) => {
+	static drawFull = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
-		if (ui.tab(htab, tr("Layers"))) {
-			ui.beginSticky();
-			ui.row([1 / 4, 3 / 4]);
+		if (Zui.tab(htab, tr("Layers"))) {
+			Zui.beginSticky();
+			Zui.row([1 / 4, 3 / 4]);
 
 			TabLayers.buttonNew(tr("New"));
 			TabLayers.comboFilter();
 
-			ui.endSticky();
+			Zui.endSticky();
 			ui._y += 2;
 
 			TabLayers.highlightOddLines();
@@ -64,15 +64,15 @@ class TabLayers {
 		let fullH = ui._windowH - UIBase.hwnds[0].scrollOffset;
 		for (let i = 0; i < Math.floor(fullH / step); ++i) {
 			if (i % 2 == 0) {
-				ui.fill(0, i * step, (ui._w / ui.SCALE() - 2), step, ui.t.WINDOW_BG_COL - 0x00040404);
+				Zui.fill(0, i * step, (ui._w / Zui.SCALE(ui) - 2), step, ui.t.WINDOW_BG_COL - 0x00040404);
 			}
 		}
 	}
 
 	static buttonNew = (text: string) => {
 		let ui = UIBase.ui;
-		if (ui.button(text)) {
-			UIMenu.draw((ui: Zui) => {
+		if (Zui.button(text)) {
+			UIMenu.draw((ui: ZuiRaw) => {
 				let l = Context.raw.layer;
 				if (UIMenu.menuButton(ui, tr("Paint Layer"))) {
 					Base.newLayer();
@@ -87,7 +87,7 @@ class TabLayers {
 		let ar = [tr("All")];
 		let filterHandle = Zui.handle("tablayers_0");
 		filterHandle.position = Context.raw.layerFilter;
-		Context.raw.layerFilter = ui.combo(filterHandle, ar, tr("Filter"), false, Align.Left);
+		Context.raw.layerFilter = Zui.combo(filterHandle, ar, tr("Filter"), false, Align.Left);
 	}
 
 	static remapLayerPointers = (nodes: TNode[], pointerMap: Map<i32, i32>) => {
@@ -137,12 +137,12 @@ class TabLayers {
 		}
 
 		let step = ui.t.ELEMENT_H;
-		let checkw = (ui._windowW / 100 * 8) / ui.SCALE();
+		let checkw = (ui._windowW / 100 * 8) / Zui.SCALE(ui);
 
 		// Highlight drag destination
 		let absy = ui._windowY + ui._y;
 		if (Base.isDragging && Base.dragLayer != null && Context.inLayers()) {
-			if (Mouse.y > absy + step && Mouse.y < absy + step * 3) {
+			if (mouse_y > absy + step && mouse_y < absy + step * 3) {
 				let down = Project.layers.indexOf(Base.dragLayer) >= i;
 				Context.raw.dragDestination = down ? i : i - 1;
 
@@ -152,27 +152,27 @@ class TabLayers {
 				let nestedGroup = SlotLayer.isGroup(Base.dragLayer) && toGroup;
 				if (!nestedGroup) {
 					if (SlotLayer.canMove(Context.raw.layer, Context.raw.dragDestination)) {
-						ui.fill(checkw, step * 2, (ui._windowW / ui.SCALE() - 2) - checkw, 2 * ui.SCALE(), ui.t.HIGHLIGHT_COL);
+						Zui.fill(checkw, step * 2, (ui._windowW / Zui.SCALE(ui) - 2) - checkw, 2 * Zui.SCALE(ui), ui.t.HIGHLIGHT_COL);
 					}
 				}
 			}
-			else if (i == Project.layers.length - 1 && Mouse.y < absy + step) {
+			else if (i == Project.layers.length - 1 && mouse_y < absy + step) {
 				Context.raw.dragDestination = Project.layers.length - 1;
 				if (SlotLayer.canMove(Context.raw.layer, Context.raw.dragDestination)) {
-					ui.fill(checkw, 0, (ui._windowW / ui.SCALE() - 2) - checkw, 2 * ui.SCALE(), ui.t.HIGHLIGHT_COL);
+					Zui.fill(checkw, 0, (ui._windowW / Zui.SCALE(ui) - 2) - checkw, 2 * Zui.SCALE(ui), ui.t.HIGHLIGHT_COL);
 				}
 			}
 		}
 		if (Base.isDragging && (Base.dragMaterial != null || Base.dragSwatch != null) && Context.inLayers()) {
-			if (Mouse.y > absy + step && Mouse.y < absy + step * 3) {
+			if (mouse_y > absy + step && mouse_y < absy + step * 3) {
 				Context.raw.dragDestination = i;
 				if (TabLayers.canDropNewLayer(i))
-					ui.fill(checkw, 2 * step, (ui._windowW / ui.SCALE() - 2) - checkw, 2 * ui.SCALE(), ui.t.HIGHLIGHT_COL);
+					Zui.fill(checkw, 2 * step, (ui._windowW / Zui.SCALE(ui) - 2) - checkw, 2 * Zui.SCALE(ui), ui.t.HIGHLIGHT_COL);
 			}
-			else if (i == Project.layers.length - 1 && Mouse.y < absy + step) {
+			else if (i == Project.layers.length - 1 && mouse_y < absy + step) {
 				Context.raw.dragDestination = Project.layers.length;
 				if (TabLayers.canDropNewLayer(Project.layers.length))
-					ui.fill(checkw, 0, (ui._windowW / ui.SCALE() - 2) - checkw, 2 * ui.SCALE(), ui.t.HIGHLIGHT_COL);
+					Zui.fill(checkw, 0, (ui._windowW / Zui.SCALE(ui) - 2) - checkw, 2 * Zui.SCALE(ui), ui.t.HIGHLIGHT_COL);
 			}
 		}
 
@@ -188,14 +188,14 @@ class TabLayers {
 	static drawLayerSlotMini = (l: SlotLayerRaw, i: i32) => {
 		let ui = UIBase.ui;
 
-		ui.row([1, 1]);
+		Zui.row([1, 1]);
 		let uix = ui._x;
 		let uiy = ui._y;
-		ui.endElement();
-		ui.endElement();
+		Zui.endElement();
+		Zui.endElement();
 
-		ui._y += ui.ELEMENT_H();
-		ui._y -= ui.ELEMENT_OFFSET();
+		ui._y += Zui.ELEMENT_H(ui);
+		ui._y -= Zui.ELEMENT_OFFSET(ui);
 	}
 
 	static drawLayerSlotFull = (l: SlotLayerRaw, i: i32) => {
@@ -205,16 +205,16 @@ class TabLayers {
 
 		let hasPanel = SlotLayer.isGroup(l) || (SlotLayer.isLayer(l) && SlotLayer.getMasks(l, false) != null);
 		if (hasPanel) {
-			ui.row([8 / 100, 52 / 100, 30 / 100, 10 / 100]);
+			Zui.row([8 / 100, 52 / 100, 30 / 100, 10 / 100]);
 		}
 		else {
-			ui.row([8 / 100, 52 / 100, 30 / 100]);
+			Zui.row([8 / 100, 52 / 100, 30 / 100]);
 		}
 
 		// Draw eye icon
 		let icons = Res.get("icons.k");
 		let r = Res.tile18(icons, l.visible ? 0 : 1, 0);
-		let center = (step / 2) * ui.SCALE();
+		let center = (step / 2) * Zui.SCALE(ui);
 		ui._x += 2;
 		ui._y += 3;
 		ui._y += center;
@@ -222,7 +222,7 @@ class TabLayers {
 		let parentHidden = l.parent != null && (!l.parent.visible || (l.parent.parent != null && !l.parent.parent.visible));
 		if (parentHidden) col -= 0x99000000;
 
-		if (ui.image(icons, col, null, r.x, r.y, r.w, r.h) == State.Released) {
+		if (Zui.image(icons, col, null, r.x, r.y, r.w, r.h) == State.Released) {
 			TabLayers.layerToggleVisible(l);
 		}
 		ui._x -= 2;
@@ -236,20 +236,20 @@ class TabLayers {
 		ui._y += center;
 		if (TabLayers.layerNameEdit == l.id) {
 			TabLayers.layerNameHandle.text = l.name;
-			l.name = ui.textInput(TabLayers.layerNameHandle);
+			l.name = Zui.textInput(TabLayers.layerNameHandle);
 			if (ui.textSelectedHandle_ptr != TabLayers.layerNameHandle.ptr) TabLayers.layerNameEdit = -1;
 		}
 		else {
 			if (ui.enabled && ui.inputEnabled && ui.comboSelectedHandle_ptr == null &&
 				ui.inputX > ui._windowX + ui._x && ui.inputX < ui._windowX + ui._windowW &&
-				ui.inputY > ui._windowY + ui._y - center && ui.inputY < ui._windowY + ui._y - center + (step * ui.SCALE()) * 2) {
+				ui.inputY > ui._windowY + ui._y - center && ui.inputY < ui._windowY + ui._y - center + (step * Zui.SCALE(ui)) * 2) {
 				if (ui.inputStarted) {
 					Context.setLayer(l);
-					TabLayers.setDragLayer(Context.raw.layer, -(Mouse.x - uix - ui._windowX - 3), -(Mouse.y - uiy - ui._windowY + 1));
+					TabLayers.setDragLayer(Context.raw.layer, -(mouse_x - uix - ui._windowX - 3), -(mouse_y - uiy - ui._windowY + 1));
 				}
 				else if (ui.inputReleased) {
-					if (Time.time() - Context.raw.selectTime > 0.2) {
-						Context.raw.selectTime = Time.time();
+					if (time_time() - Context.raw.selectTime > 0.2) {
+						Context.raw.selectTime = time_time();
 					}
 				}
 				else if (ui.inputReleasedR) {
@@ -258,13 +258,13 @@ class TabLayers {
 				}
 			}
 
-			let state = ui.text(l.name);
+			let state = Zui.text(l.name);
 			if (state == State.Released) {
-				let td = Time.time() - Context.raw.selectTime;
+				let td = time_time() - Context.raw.selectTime;
 				if (td < 0.2 && td > 0.0) {
 					TabLayers.layerNameEdit = l.id;
 					TabLayers.layerNameHandle.text = l.name;
-					ui.startTextEdit(TabLayers.layerNameHandle);
+					Zui.startTextEdit(TabLayers.layerNameHandle);
 				}
 			}
 
@@ -281,12 +281,12 @@ class TabLayers {
 		ui._y -= center;
 
 		if (l.parent != null) {
-			ui._x -= 10 * ui.SCALE();
-			if (l.parent.parent != null) ui._x -= 10 * ui.SCALE();
+			ui._x -= 10 * Zui.SCALE(ui);
+			if (l.parent.parent != null) ui._x -= 10 * Zui.SCALE(ui);
 		}
 
 		if (SlotLayer.isGroup(l)) {
-			ui.endElement();
+			Zui.endElement();
 		}
 		else {
 			if (SlotLayer.isMask(l)) {
@@ -294,7 +294,7 @@ class TabLayers {
 			}
 
 			// comboBlending(ui, l);
-			ui.endElement();
+			Zui.endElement();
 
 			if (SlotLayer.isMask(l)) {
 				ui._y -= center;
@@ -303,43 +303,43 @@ class TabLayers {
 
 		if (hasPanel) {
 			ui._y += center;
-			let layerPanel = Zui.handle("tablayers_1").nest(l.id);
+			let layerPanel = Zui.nest(Zui.handle("tablayers_1"), l.id);
 			layerPanel.selected = l.show_panel;
-			l.show_panel = ui.panel(layerPanel, "", true, false, false);
+			l.show_panel = Zui.panel(layerPanel, "", true, false, false);
 			ui._y -= center;
 		}
 
 		if (SlotLayer.isGroup(l) || SlotLayer.isMask(l)) {
-			ui._y -= ui.ELEMENT_OFFSET();
-			ui.endElement();
+			ui._y -= Zui.ELEMENT_OFFSET(ui);
+			Zui.endElement();
 		}
 		else {
-			ui._y -= ui.ELEMENT_OFFSET();
+			ui._y -= Zui.ELEMENT_OFFSET(ui);
 
-			ui.row([8 / 100, 16 / 100, 36 / 100, 30 / 100, 10 / 100]);
-			ui.endElement();
-			ui.endElement();
-			ui.endElement();
+			Zui.row([8 / 100, 16 / 100, 36 / 100, 30 / 100, 10 / 100]);
+			Zui.endElement();
+			Zui.endElement();
+			Zui.endElement();
 
 			if (Config.raw.touch_ui) {
-				ui._x += 12 * ui.SCALE();
+				ui._x += 12 * Zui.SCALE(ui);
 			}
 
 			ui._y -= center;
 			TabLayers.comboObject(ui, l);
 			ui._y += center;
 
-			ui.endElement();
+			Zui.endElement();
 		}
 
-		ui._y -= ui.ELEMENT_OFFSET();
+		ui._y -= Zui.ELEMENT_OFFSET(ui);
 	}
 
-	static comboObject = (ui: Zui, l: SlotLayerRaw, label = false): Handle => {
+	static comboObject = (ui: ZuiRaw, l: SlotLayerRaw, label = false): HandleRaw => {
 		let ar = [tr("Shared")];
-		let objectHandle = Zui.handle("tablayers_2").nest(l.id);
+		let objectHandle = Zui.nest(Zui.handle("tablayers_2"), l.id);
 		objectHandle.position = l.objectMask;
-		l.objectMask = ui.combo(objectHandle, ar, tr("Object"), label, Align.Left);
+		l.objectMask = Zui.combo(objectHandle, ar, tr("Object"), label, Align.Left);
 		return objectHandle;
 	}
 
@@ -354,15 +354,15 @@ class TabLayers {
 		let step = ui.t.ELEMENT_H;
 
 		// Separator line
-		ui.fill(0, 0, (ui._w / ui.SCALE() - 2), 1 * ui.SCALE(), ui.t.SEPARATOR_COL);
+		Zui.fill(0, 0, (ui._w / Zui.SCALE(ui) - 2), 1 * Zui.SCALE(ui), ui.t.SEPARATOR_COL);
 
 		// Highlight selected
 		if (Context.raw.layer == l) {
 			if (mini) {
-				ui.rect(1, -step * 2, ui._w / ui.SCALE() - 1, step * 2 + (mini ? -1 : 1), ui.t.HIGHLIGHT_COL, 3);
+				Zui.rect(1, -step * 2, ui._w / Zui.SCALE(ui) - 1, step * 2 + (mini ? -1 : 1), ui.t.HIGHLIGHT_COL, 3);
 			}
 			else {
-				ui.rect(1, -step * 2 - 1, ui._w / ui.SCALE() - 2, step * 2 + (mini ? -2 : 1), ui.t.HIGHLIGHT_COL, 2);
+				Zui.rect(1, -step * 2 - 1, ui._w / Zui.SCALE(ui) - 2, step * 2 + (mini ? -2 : 1), ui.t.HIGHLIGHT_COL, 2);
 			}
 		}
 	}

+ 1 - 1
armorsculpt/Sources/nodes/BrushOutputNode.ts

@@ -104,7 +104,7 @@ class BrushOutputNode extends LogicNode {
 			!Base.isScrolling() &&
 			!Base.isComboSelected()) {
 
-			let down = Mouse.down() || Pen.down();
+			let down = mouse_down() || pen_down();
 
 			// Prevent painting the same spot
 			let sameSpot = Context.raw.paintVec.x == Context.raw.lastPaintX && Context.raw.paintVec.y == Context.raw.lastPaintY;

+ 2 - 2
base/Assets/plugins/autosave.js

@@ -6,8 +6,8 @@ let h2 = new Handle({value: 5});
 let timer = 0.0;
 
 plugin.drawUI = function(ui) {
-	if (ui.panel(h1, "Auto Save")) {
-		ui.slider(h2, "min", 1, 15, false, 1);
+	if (Zui.panel(h1, "Auto Save")) {
+		Zui.slider(h2, "min", 1, 15, false, 1);
 	}
 }
 

+ 2 - 2
base/Sources/Args.ts

@@ -146,7 +146,7 @@ class Args {
 							}
 
 							Data.getBlob(file, (blob: ArrayBuffer) => {
-								BoxExport.preset = JSON.parse(System.bufferToString(blob));
+								BoxExport.preset = JSON.parse(sys_buffer_to_string(blob));
 								Data.deleteBlob("export_presets/" + file);
 							});
 
@@ -185,7 +185,7 @@ class Args {
 				}
 				///end
 
-				if (Args.background) System.stop();
+				if (Args.background) sys_stop();
 			});
 		}
 	}

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 307 - 307
base/Sources/Base.ts


+ 97 - 97
base/Sources/BoxExport.ts

@@ -1,12 +1,12 @@
 
 class BoxExport {
 
-	static htab = new Handle();
+	static htab = Handle.create();
 	static files: string[] = null;
-	static exportMeshHandle = new Handle();
+	static exportMeshHandle = Handle.create();
 
 	///if (is_paint || is_lab)
-	static hpreset = new Handle();
+	static hpreset = Handle.create();
 	static preset: TExportPreset = null;
 	static channels = ["base_r", "base_g", "base_b", "height", "metal", "nor_r", "nor_g", "nor_g_directx", "nor_b", "occ", "opac", "rough", "smooth", "emis", "subs", "0.0", "1.0"];
 	static colorSpaces = ["linear", "srgb"];
@@ -14,7 +14,7 @@ class BoxExport {
 
 	///if (is_paint || is_lab)
 	static showTextures = () => {
-		UIBox.showCustom((ui: Zui) => {
+		UIBox.showCustom((ui: ZuiRaw) => {
 
 			if (BoxExport.files == null) {
 				BoxExport.fetchPresets();
@@ -41,7 +41,7 @@ class BoxExport {
 
 	///if is_paint
 	static showBakeMaterial = () => {
-		UIBox.showCustom((ui: Zui) => {
+		UIBox.showCustom((ui: ZuiRaw) => {
 
 			if (BoxExport.files == null) {
 				BoxExport.fetchPresets();
@@ -60,25 +60,25 @@ class BoxExport {
 	///end
 
 	///if (is_paint || is_lab)
-	static tabExportTextures = (ui: Zui, title: string, bakeMaterial = false) => {
+	static tabExportTextures = (ui: ZuiRaw, title: string, bakeMaterial = false) => {
 		let tabVertical = Config.raw.touch_ui;
-		if (ui.tab(BoxExport.htab, title, tabVertical)) {
+		if (Zui.tab(BoxExport.htab, title, tabVertical)) {
 
-			ui.row([0.5, 0.5]);
+			Zui.row([0.5, 0.5]);
 
 			///if is_paint
 			///if (krom_android || krom_ios)
-			ui.combo(Base.resHandle, ["128", "256", "512", "1K", "2K", "4K"], tr("Resolution"), true);
+			Zui.combo(Base.resHandle, ["128", "256", "512", "1K", "2K", "4K"], tr("Resolution"), true);
 			///else
-			ui.combo(Base.resHandle, ["128", "256", "512", "1K", "2K", "4K", "8K", "16K"], tr("Resolution"), true);
+			Zui.combo(Base.resHandle, ["128", "256", "512", "1K", "2K", "4K", "8K", "16K"], tr("Resolution"), true);
 			///end
 			///end
 
 			///if is_lab
 			///if (krom_android || krom_ios)
-			ui.combo(Base.resHandle, ["2K", "4K"], tr("Resolution"), true);
+			Zui.combo(Base.resHandle, ["2K", "4K"], tr("Resolution"), true);
 			///else
-			ui.combo(Base.resHandle, ["2K", "4K", "8K", "16K"], tr("Resolution"), true);
+			Zui.combo(Base.resHandle, ["2K", "4K", "8K", "16K"], tr("Resolution"), true);
 			///end
 			///end
 
@@ -87,9 +87,9 @@ class BoxExport {
 			}
 
 			///if (is_lab || krom_android || krom_ios)
-			ui.combo(Base.bitsHandle, ["8bit"], tr("Color"), true);
+			Zui.combo(Base.bitsHandle, ["8bit"], tr("Color"), true);
 			///else
-			ui.combo(Base.bitsHandle, ["8bit", "16bit", "32bit"], tr("Color"), true);
+			Zui.combo(Base.bitsHandle, ["8bit", "16bit", "32bit"], tr("Color"), true);
 			///end
 
 			///if is_paint
@@ -98,41 +98,41 @@ class BoxExport {
 			}
 			///end
 
-			ui.row([0.5, 0.5]);
+			Zui.row([0.5, 0.5]);
 			if (Base.bitsHandle.position == TextureBits.Bits8) {
-				Context.raw.formatType = ui.combo(Zui.handle("boxexport_0", { position: Context.raw.formatType }), ["png", "jpg"], tr("Format"), true);
+				Context.raw.formatType = Zui.combo(Zui.handle("boxexport_0", { position: Context.raw.formatType }), ["png", "jpg"], tr("Format"), true);
 			}
 			else {
-				Context.raw.formatType = ui.combo(Zui.handle("boxexport_1", { position: Context.raw.formatType }), ["exr"], tr("Format"), true);
+				Context.raw.formatType = Zui.combo(Zui.handle("boxexport_1", { position: Context.raw.formatType }), ["exr"], tr("Format"), true);
 			}
 
 			ui.enabled = Context.raw.formatType == TextureLdrFormat.FormatJpg && Base.bitsHandle.position == TextureBits.Bits8;
-			Context.raw.formatQuality = ui.slider(Zui.handle("boxexport_2", { value: Context.raw.formatQuality }), tr("Quality"), 0.0, 100.0, true, 1);
+			Context.raw.formatQuality = Zui.slider(Zui.handle("boxexport_2", { value: Context.raw.formatQuality }), tr("Quality"), 0.0, 100.0, true, 1);
 			ui.enabled = true;
 
 			///if is_paint
-			ui.row([0.5, 0.5]);
+			Zui.row([0.5, 0.5]);
 			ui.enabled = !bakeMaterial;
 			let layersExportHandle = Zui.handle("boxexport_3");
 			layersExportHandle.position = Context.raw.layersExport;
-			Context.raw.layersExport = ui.combo(layersExportHandle, [tr("Visible"), tr("Selected"), tr("Per Object"), tr("Per Udim Tile")], tr("Layers"), true);
+			Context.raw.layersExport = Zui.combo(layersExportHandle, [tr("Visible"), tr("Selected"), tr("Per Object"), tr("Per Udim Tile")], tr("Layers"), true);
 			ui.enabled = true;
 			///end
 
-			ui.combo(BoxExport.hpreset, BoxExport.files, tr("Preset"), true);
+			Zui.combo(BoxExport.hpreset, BoxExport.files, tr("Preset"), true);
 			if (BoxExport.hpreset.changed) BoxExport.preset = null;
 
 			let layersDestinationHandle = Zui.handle("boxexport_4");
 			layersDestinationHandle.position = Context.raw.layersDestination;
-			Context.raw.layersDestination = ui.combo(layersDestinationHandle, [tr("Disk"), tr("Packed")], tr("Destination"), true);
+			Context.raw.layersDestination = Zui.combo(layersDestinationHandle, [tr("Disk"), tr("Packed")], tr("Destination"), true);
 
-			ui.endElement();
+			Zui.endElement();
 
-			ui.row([0.5, 0.5]);
-			if (ui.button(tr("Cancel"))) {
+			Zui.row([0.5, 0.5]);
+			if (Zui.button(tr("Cancel"))) {
 				UIBox.hide();
 			}
-			if (ui.button(tr("Export"))) {
+			if (Zui.button(tr("Export"))) {
 				UIBox.hide();
 				if (Context.raw.layersDestination == ExportDestination.DestinationPacked) {
 					Context.raw.textureExportPath = "/";
@@ -172,25 +172,25 @@ class BoxExport {
 					});
 				}
 			}
-			if (ui.isHovered) ui.tooltip(tr("Export texture files") + ` (${Config.keymap.file_export_textures})`);
+			if (ui.isHovered) Zui.tooltip(tr("Export texture files") + ` (${Config.keymap.file_export_textures})`);
 		}
 	}
 
-	static tabPresets = (ui: Zui) => {
+	static tabPresets = (ui: ZuiRaw) => {
 		let tabVertical = Config.raw.touch_ui;
-		if (ui.tab(BoxExport.htab, tr("Presets"), tabVertical)) {
-			ui.row([3 / 5, 1 / 5, 1 / 5]);
+		if (Zui.tab(BoxExport.htab, tr("Presets"), tabVertical)) {
+			Zui.row([3 / 5, 1 / 5, 1 / 5]);
 
-			ui.combo(BoxExport.hpreset, BoxExport.files, tr("Preset"));
+			Zui.combo(BoxExport.hpreset, BoxExport.files, tr("Preset"));
 			if (BoxExport.hpreset.changed) BoxExport.preset = null;
 
-			if (ui.button(tr("New"))) {
-				UIBox.showCustom((ui: Zui) => {
+			if (Zui.button(tr("New"))) {
+				UIBox.showCustom((ui: ZuiRaw) => {
 					let tabVertical = Config.raw.touch_ui;
-					if (ui.tab(Zui.handle("boxexport_5"), tr("New Preset"), tabVertical)) {
-						ui.row([0.5, 0.5]);
-						let presetName = ui.textInput(Zui.handle("boxexport_6", { text: "new_preset" }), tr("Name"));
-						if (ui.button(tr("OK")) || ui.isReturnDown) {
+					if (Zui.tab(Zui.handle("boxexport_5"), tr("New Preset"), tabVertical)) {
+						Zui.row([0.5, 0.5]);
+						let presetName = Zui.textInput(Zui.handle("boxexport_6", { text: "new_preset" }), tr("Name"));
+						if (Zui.button(tr("OK")) || ui.isReturnDown) {
 							BoxExport.newPreset(presetName);
 							BoxExport.fetchPresets();
 							BoxExport.preset = null;
@@ -203,7 +203,7 @@ class BoxExport {
 				});
 			}
 
-			if (ui.button(tr("Import"))) {
+			if (Zui.button(tr("Import"))) {
 				UIFiles.show("json", false, false, (path: string) => {
 					path = path.toLowerCase();
 					if (path.endsWith(".json")) {
@@ -225,24 +225,24 @@ class BoxExport {
 			}
 
 			// Texture list
-			ui.separator(10, false);
-			ui.row([1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6]);
-			ui.text(tr("Texture"));
-			ui.text(tr("R"));
-			ui.text(tr("G"));
-			ui.text(tr("B"));
-			ui.text(tr("A"));
-			ui.text(tr("Color Space"));
+			Zui.separator(10, false);
+			Zui.row([1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6]);
+			Zui.text(tr("Texture"));
+			Zui.text(tr("R"));
+			Zui.text(tr("G"));
+			Zui.text(tr("B"));
+			Zui.text(tr("A"));
+			Zui.text(tr("Color Space"));
 			ui.changed = false;
 			for (let i = 0; i < BoxExport.preset.textures.length; ++i) {
 				let t = BoxExport.preset.textures[i];
-				ui.row([1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6]);
-				let htex = BoxExport.hpreset.nest(i);
+				Zui.row([1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6]);
+				let htex = Zui.nest(BoxExport.hpreset, i);
 				htex.text = t.name;
-				t.name = ui.textInput(htex);
+				t.name = Zui.textInput(htex);
 
 				if (ui.isHovered && ui.inputReleasedR) {
-					UIMenu.draw((ui: Zui) => {
+					UIMenu.draw((ui: ZuiRaw) => {
 						if (UIMenu.menuButton(ui, tr("Delete"))) {
 							array_remove(BoxExport.preset.textures, t);
 							BoxExport.savePreset();
@@ -250,27 +250,27 @@ class BoxExport {
 					}, 1);
 				}
 
-				let hr = htex.nest(0);
+				let hr = Zui.nest(htex, 0);
 				hr.position = BoxExport.channels.indexOf(t.channels[0]);
-				let hg = htex.nest(1);
+				let hg = Zui.nest(htex, 1);
 				hg.position = BoxExport.channels.indexOf(t.channels[1]);
-				let hb = htex.nest(2);
+				let hb = Zui.nest(htex, 2);
 				hb.position = BoxExport.channels.indexOf(t.channels[2]);
-				let ha = htex.nest(3);
+				let ha = Zui.nest(htex, 3);
 				ha.position = BoxExport.channels.indexOf(t.channels[3]);
 
-				ui.combo(hr, BoxExport.channels, tr("R"));
+				Zui.combo(hr, BoxExport.channels, tr("R"));
 				if (hr.changed) t.channels[0] = BoxExport.channels[hr.position];
-				ui.combo(hg, BoxExport.channels, tr("G"));
+				Zui.combo(hg, BoxExport.channels, tr("G"));
 				if (hg.changed) t.channels[1] = BoxExport.channels[hg.position];
-				ui.combo(hb, BoxExport.channels, tr("B"));
+				Zui.combo(hb, BoxExport.channels, tr("B"));
 				if (hb.changed) t.channels[2] = BoxExport.channels[hb.position];
-				ui.combo(ha, BoxExport.channels, tr("A"));
+				Zui.combo(ha, BoxExport.channels, tr("A"));
 				if (ha.changed) t.channels[3] = BoxExport.channels[ha.position];
 
-				let hspace = htex.nest(4);
+				let hspace = Zui.nest(htex, 4);
 				hspace.position = BoxExport.colorSpaces.indexOf(t.color_space);
-				ui.combo(hspace, BoxExport.colorSpaces, tr("Color Space"));
+				Zui.combo(hspace, BoxExport.colorSpaces, tr("Color Space"));
 				if (hspace.changed) t.color_space = BoxExport.colorSpaces[hspace.position];
 			}
 
@@ -278,8 +278,8 @@ class BoxExport {
 				BoxExport.savePreset();
 			}
 
-			ui.row([1 / 8]);
-			if (ui.button(tr("Add"))) {
+			Zui.row([1 / 8]);
+			if (Zui.button(tr("Add"))) {
 				BoxExport.preset.textures.push({ name: "base", channels: ["base_r", "base_g", "base_b", "1.0"], color_space: "linear" });
 				BoxExport.hpreset.children = null;
 				BoxExport.savePreset();
@@ -289,9 +289,9 @@ class BoxExport {
 	///end
 
 	///if is_paint
-	static tabAtlases = (ui: Zui) => {
+	static tabAtlases = (ui: ZuiRaw) => {
 		let tabVertical = Config.raw.touch_ui;
-		if (ui.tab(BoxExport.htab, tr("Atlases"), tabVertical)) {
+		if (Zui.tab(BoxExport.htab, tr("Atlases"), tabVertical)) {
 			if (Project.atlasObjects == null || Project.atlasObjects.length != Project.paintObjects.length) {
 				Project.atlasObjects = [];
 				Project.atlasNames = [];
@@ -301,11 +301,11 @@ class BoxExport {
 				}
 			}
 			for (let i = 0; i < Project.paintObjects.length; ++i) {
-				ui.row([1 / 2, 1 / 2]);
-				ui.text(Project.paintObjects[i].base.name);
-				let hatlas = Zui.handle("boxexport_7").nest(i);
+				Zui.row([1 / 2, 1 / 2]);
+				Zui.text(Project.paintObjects[i].base.name);
+				let hatlas = Zui.nest(Zui.handle("boxexport_7"), i);
 				hatlas.position = Project.atlasObjects[i];
-				Project.atlasObjects[i] = ui.combo(hatlas, Project.atlasNames, tr("Atlas"));
+				Project.atlasObjects[i] = Zui.combo(hatlas, Project.atlasNames, tr("Atlas"));
 			}
 		}
 	}
@@ -313,25 +313,25 @@ class BoxExport {
 
 	static showMesh = () => {
 		BoxExport.exportMeshHandle.position = Context.raw.exportMeshIndex;
-		UIBox.showCustom((ui: Zui) => {
+		UIBox.showCustom((ui: ZuiRaw) => {
 			let htab = Zui.handle("boxexport_8");
 			BoxExport.tabExportMesh(ui, htab);
 		});
 	}
 
-	static tabExportMesh = (ui: Zui, htab: Handle) => {
+	static tabExportMesh = (ui: ZuiRaw, htab: HandleRaw) => {
 		let tabVertical = Config.raw.touch_ui;
-		if (ui.tab(htab, tr("Export Mesh"), tabVertical)) {
+		if (Zui.tab(htab, tr("Export Mesh"), tabVertical)) {
 
-			ui.row([1 / 2, 1 / 2]);
+			Zui.row([1 / 2, 1 / 2]);
 
-			Context.raw.exportMeshFormat = ui.combo(Zui.handle("boxexport_9", { position: Context.raw.exportMeshFormat }), ["obj", "arm"], tr("Format"), true);
+			Context.raw.exportMeshFormat = Zui.combo(Zui.handle("boxexport_9", { position: Context.raw.exportMeshFormat }), ["obj", "arm"], tr("Format"), true);
 
 			let ar = [tr("All")];
 			for (let p of Project.paintObjects) ar.push(p.base.name);
-			ui.combo(BoxExport.exportMeshHandle, ar, tr("Meshes"), true);
+			Zui.combo(BoxExport.exportMeshHandle, ar, tr("Meshes"), true);
 
-			let applyDisplacement = ui.check(Zui.handle("boxexport_10"), tr("Apply Displacement"));
+			let applyDisplacement = Zui.check(Zui.handle("boxexport_10"), tr("Apply Displacement"));
 
 			let tris = 0;
 			let pos = BoxExport.exportMeshHandle.position;
@@ -341,17 +341,17 @@ class BoxExport {
 					tris += Math.floor(inda.values.length / 3);
 				}
 			}
-			ui.text(tris + " " + tr("triangles"));
+			Zui.text(tris + " " + tr("triangles"));
 
-			ui.row([0.5, 0.5]);
-			if (ui.button(tr("Cancel"))) {
+			Zui.row([0.5, 0.5]);
+			if (Zui.button(tr("Cancel"))) {
 				UIBox.hide();
 			}
-			if (ui.button(tr("Export"))) {
+			if (Zui.button(tr("Export"))) {
 				UIBox.hide();
 				UIFiles.show(Context.raw.exportMeshFormat == MeshFormat.FormatObj ? "obj" : "arm", true, false, (path: string) => {
 					///if (krom_android || krom_ios)
-					let f = System.title;
+					let f = sys_title();
 					///else
 					let f = UIFiles.filename;
 					///end
@@ -374,21 +374,21 @@ class BoxExport {
 
 	///if (is_paint || is_sculpt)
 	static showMaterial = () => {
-		UIBox.showCustom((ui: Zui) => {
+		UIBox.showCustom((ui: ZuiRaw) => {
 			let htab = Zui.handle("boxexport_11");
 			let tabVertical = Config.raw.touch_ui;
-			if (ui.tab(htab, tr("Export Material"), tabVertical)) {
+			if (Zui.tab(htab, tr("Export Material"), tabVertical)) {
 				let h1 = Zui.handle("boxexport_12");
 				let h2 = Zui.handle("boxexport_13");
 				h1.selected = Context.raw.packAssetsOnExport;
 				h2.selected = Context.raw.writeIconOnExport;
-				Context.raw.packAssetsOnExport = ui.check(h1, tr("Pack Assets"));
-				Context.raw.writeIconOnExport = ui.check(h2, tr("Export Icon"));
-				ui.row([0.5, 0.5]);
-				if (ui.button(tr("Cancel"))) {
+				Context.raw.packAssetsOnExport = Zui.check(h1, tr("Pack Assets"));
+				Context.raw.writeIconOnExport = Zui.check(h2, tr("Export Icon"));
+				Zui.row([0.5, 0.5]);
+				if (Zui.button(tr("Cancel"))) {
 					UIBox.hide();
 				}
-				if (ui.button(tr("Export"))) {
+				if (Zui.button(tr("Export"))) {
 					UIBox.hide();
 					UIFiles.show("arm", true, false, (path: string) => {
 						let f = UIFiles.filename;
@@ -403,21 +403,21 @@ class BoxExport {
 	}
 
 	static showBrush = () => {
-		UIBox.showCustom((ui: Zui) => {
+		UIBox.showCustom((ui: ZuiRaw) => {
 			let htab = Zui.handle("boxexport_14");
 			let tabVertical = Config.raw.touch_ui;
-			if (ui.tab(htab, tr("Export Brush"), tabVertical)) {
+			if (Zui.tab(htab, tr("Export Brush"), tabVertical)) {
 				let h1 = Zui.handle("boxexport_15");
 				let h2 = Zui.handle("boxexport_16");
 				h1.selected = Context.raw.packAssetsOnExport;
 				h2.selected = Context.raw.writeIconOnExport;
-				Context.raw.packAssetsOnExport = ui.check(h1, tr("Pack Assets"));
-				Context.raw.writeIconOnExport = ui.check(h2, tr("Export Icon"));
-				ui.row([0.5, 0.5]);
-				if (ui.button(tr("Cancel"))) {
+				Context.raw.packAssetsOnExport = Zui.check(h1, tr("Pack Assets"));
+				Context.raw.writeIconOnExport = Zui.check(h2, tr("Export Icon"));
+				Zui.row([0.5, 0.5]);
+				if (Zui.button(tr("Cancel"))) {
 					UIBox.hide();
 				}
-				if (ui.button(tr("Export"))) {
+				if (Zui.button(tr("Export"))) {
 					UIBox.hide();
 					UIFiles.show("arm", true, false, (path: string) => {
 						let f = UIFiles.filename;
@@ -443,7 +443,7 @@ class BoxExport {
 	static parsePreset = () => {
 		let file = "export_presets/" + BoxExport.files[BoxExport.hpreset.position] + ".json";
 		Data.getBlob(file, (blob: ArrayBuffer) => {
-			BoxExport.preset = JSON.parse(System.bufferToString(blob));
+			BoxExport.preset = JSON.parse(sys_buffer_to_string(blob));
 			Data.deleteBlob("export_presets/" + file);
 		});
 	}
@@ -458,14 +458,14 @@ class BoxExport {
 `;
 		if (!name.endsWith(".json")) name += ".json";
 		let path = Path.data() + Path.sep + "export_presets" + Path.sep + name;
-		Krom.fileSaveBytes(path, System.stringToBuffer(template));
+		Krom.fileSaveBytes(path, sys_string_to_buffer(template));
 	}
 
 	static savePreset = () => {
 		let name = BoxExport.files[BoxExport.hpreset.position];
 		if (name == "generic") return; // generic is const
 		let path = Path.data() + Path.sep + "export_presets" + Path.sep + name + ".json";
-		Krom.fileSaveBytes(path, System.stringToBuffer(JSON.stringify(BoxExport.preset)));
+		Krom.fileSaveBytes(path, sys_string_to_buffer(JSON.stringify(BoxExport.preset)));
 	}
 	///end
 }

+ 147 - 147
base/Sources/BoxPreferences.ts

@@ -1,26 +1,26 @@
 
 class BoxPreferences {
 
-	static htab = new Handle();
+	static htab = Handle.create();
 	static filesPlugin: string[] = null;
 	static filesKeymap: string[] = null;
-	static themeHandle: Handle;
-	static presetHandle: Handle;
+	static themeHandle: HandleRaw;
+	static presetHandle: HandleRaw;
 	static locales: string[] = null;
 	static themes: string[] = null;
 	static worldColor = 0xff080808;
 
 	static show = () => {
 
-		UIBox.showCustom((ui: Zui) => {
-			if (ui.tab(BoxPreferences.htab, tr("Interface"), true)) {
+		UIBox.showCustom((ui: ZuiRaw) => {
+			if (Zui.tab(BoxPreferences.htab, tr("Interface"), true)) {
 
 				if (BoxPreferences.locales == null) {
 					BoxPreferences.locales = Translator.getSupportedLocales();
 				}
 
 				let localeHandle = Zui.handle("boxpreferences_0", { position: BoxPreferences.locales.indexOf(Config.raw.locale) });
-				ui.combo(localeHandle, BoxPreferences.locales, tr("Language"), true);
+				Zui.combo(localeHandle, BoxPreferences.locales, tr("Language"), true);
 				if (localeHandle.changed) {
 					let localeCode = BoxPreferences.locales[localeHandle.position];
 					Config.raw.locale = localeCode;
@@ -29,7 +29,7 @@ class BoxPreferences {
 				}
 
 				let hscale = Zui.handle("boxpreferences_1", { value: Config.raw.window_scale });
-				ui.slider(hscale, tr("UI Scale"), 1.0, 4.0, true, 10);
+				Zui.slider(hscale, tr("UI Scale"), 1.0, 4.0, true, 10);
 				if (Context.raw.hscaleWasChanged && !ui.inputDown) {
 					Context.raw.hscaleWasChanged = false;
 					if (hscale.value == null || isNaN(hscale.value)) hscale.value = 1.0;
@@ -39,34 +39,34 @@ class BoxPreferences {
 				if (hscale.changed) Context.raw.hscaleWasChanged = true;
 
 				let hspeed = Zui.handle("boxpreferences_2", { value: Config.raw.camera_zoom_speed });
-				Config.raw.camera_zoom_speed = ui.slider(hspeed, tr("Camera Zoom Speed"), 0.1, 4.0, true);
+				Config.raw.camera_zoom_speed = Zui.slider(hspeed, tr("Camera Zoom Speed"), 0.1, 4.0, true);
 
 				hspeed = Zui.handle("boxpreferences_3", { value: Config.raw.camera_rotation_speed });
-				Config.raw.camera_rotation_speed = ui.slider(hspeed, tr("Camera Rotation Speed"), 0.1, 4.0, true);
+				Config.raw.camera_rotation_speed = Zui.slider(hspeed, tr("Camera Rotation Speed"), 0.1, 4.0, true);
 
 				hspeed = Zui.handle("boxpreferences_4", { value: Config.raw.camera_pan_speed });
-				Config.raw.camera_pan_speed = ui.slider(hspeed, tr("Camera Pan Speed"), 0.1, 4.0, true);
+				Config.raw.camera_pan_speed = Zui.slider(hspeed, tr("Camera Pan Speed"), 0.1, 4.0, true);
 
 				let zoomDirectionHandle = Zui.handle("boxpreferences_5", { position: Config.raw.zoom_direction });
-				ui.combo(zoomDirectionHandle, [tr("Vertical"), tr("Vertical Inverted"), tr("Horizontal"), tr("Horizontal Inverted"), tr("Vertical and Horizontal"), tr("Vertical and Horizontal Inverted")], tr("Direction to Zoom"), true);
+				Zui.combo(zoomDirectionHandle, [tr("Vertical"), tr("Vertical Inverted"), tr("Horizontal"), tr("Horizontal Inverted"), tr("Vertical and Horizontal"), tr("Vertical and Horizontal Inverted")], tr("Direction to Zoom"), true);
 				if (zoomDirectionHandle.changed) {
 					Config.raw.zoom_direction = zoomDirectionHandle.position;
 				}
 
-				Config.raw.wrap_mouse = ui.check(Zui.handle("boxpreferences_6", { selected: Config.raw.wrap_mouse }), tr("Wrap Mouse"));
-				if (ui.isHovered) ui.tooltip(tr("Wrap mouse around view boundaries during camera control"));
+				Config.raw.wrap_mouse = Zui.check(Zui.handle("boxpreferences_6", { selected: Config.raw.wrap_mouse }), tr("Wrap Mouse"));
+				if (ui.isHovered) Zui.tooltip(tr("Wrap mouse around view boundaries during camera control"));
 
-				Config.raw.node_preview = ui.check(Zui.handle("boxpreferences_7", { selected: Config.raw.node_preview }), tr("Show Node Preview"));
+				Config.raw.node_preview = Zui.check(Zui.handle("boxpreferences_7", { selected: Config.raw.node_preview }), tr("Show Node Preview"));
 
 				ui.changed = false;
-				Config.raw.show_asset_names = ui.check(Zui.handle("boxpreferences_8", { selected: Config.raw.show_asset_names }), tr("Show Asset Names"));
+				Config.raw.show_asset_names = Zui.check(Zui.handle("boxpreferences_8", { selected: Config.raw.show_asset_names }), tr("Show Asset Names"));
 				if (ui.changed) {
 					UIBase.tagUIRedraw();
 				}
 
 				///if !(krom_android || krom_ios)
 				ui.changed = false;
-				Config.raw.touch_ui = ui.check(Zui.handle("boxpreferences_9", { selected: Config.raw.touch_ui }), tr("Touch UI"));
+				Config.raw.touch_ui = Zui.check(Zui.handle("boxpreferences_9", { selected: Config.raw.touch_ui }), tr("Touch UI"));
 				if (ui.changed) {
 					Zui.touchScroll = Zui.touchHold = Zui.touchTooltip = Config.raw.touch_ui;
 					Config.loadTheme(Config.raw.theme);
@@ -75,15 +75,15 @@ class BoxPreferences {
 				}
 				///end
 
-				Config.raw.splash_screen = ui.check(Zui.handle("boxpreferences_10", { selected: Config.raw.splash_screen }), tr("Splash Screen"));
+				Config.raw.splash_screen = Zui.check(Zui.handle("boxpreferences_10", { selected: Config.raw.splash_screen }), tr("Splash Screen"));
 
-				// ui.text("Node Editor");
-				// let gridSnap = ui.check(Zui.handle("boxpreferences_11", { selected: false }), "Grid Snap");
+				// Zui.text("Node Editor");
+				// let gridSnap = Zui.check(Zui.handle("boxpreferences_11", { selected: false }), "Grid Snap");
 
-				ui.endElement();
-				ui.row([0.5, 0.5]);
-				if (ui.button(tr("Restore")) && !UIMenu.show) {
-					UIMenu.draw((ui: Zui) => {
+				Zui.endElement();
+				Zui.row([0.5, 0.5]);
+				if (Zui.button(tr("Restore")) && !UIMenu.show) {
+					UIMenu.draw((ui: ZuiRaw) => {
 						if (UIMenu.menuButton(ui, tr("Confirm"))) {
 							App.notifyOnInit(() => {
 								ui.t.ELEMENT_H = Base.defaultElementH;
@@ -99,7 +99,7 @@ class BoxPreferences {
 						if (UIMenu.menuButton(ui, tr("Import..."))) {
 							UIFiles.show("json", false, false, (path: string) => {
 								Data.getBlob(path, (b: ArrayBuffer) => {
-									let raw = JSON.parse(System.bufferToString(b));
+									let raw = JSON.parse(sys_buffer_to_string(b));
 									App.notifyOnInit(() => {
 										ui.t.ELEMENT_H = Base.defaultElementH;
 										Config.importFrom(raw);
@@ -112,8 +112,8 @@ class BoxPreferences {
 						}
 					}, 2);
 				}
-				if (ui.button(tr("Reset Layout")) && !UIMenu.show) {
-					UIMenu.draw((ui: Zui) => {
+				if (Zui.button(tr("Reset Layout")) && !UIMenu.show) {
+					UIMenu.draw((ui: ZuiRaw) => {
 						if (UIMenu.menuButton(ui, tr("Confirm"))) {
 							Base.initLayout();
 							Config.save();
@@ -122,32 +122,32 @@ class BoxPreferences {
 				}
 			}
 
-			if (ui.tab(BoxPreferences.htab, tr("Theme"), true)) {
+			if (Zui.tab(BoxPreferences.htab, tr("Theme"), true)) {
 
 				if (BoxPreferences.themes == null) {
 					BoxPreferences.fetchThemes();
 				}
 				BoxPreferences.themeHandle = Zui.handle("boxpreferences_12", { position: BoxPreferences.getThemeIndex() });
 
-				ui.beginSticky();
-				ui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
+				Zui.beginSticky();
+				Zui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
 
-				ui.combo(BoxPreferences.themeHandle, BoxPreferences.themes, tr("Theme"));
+				Zui.combo(BoxPreferences.themeHandle, BoxPreferences.themes, tr("Theme"));
 				if (BoxPreferences.themeHandle.changed) {
 					Config.raw.theme = BoxPreferences.themes[BoxPreferences.themeHandle.position] + ".json";
 					Config.loadTheme(Config.raw.theme);
 				}
 
-				if (ui.button(tr("New"))) {
-					UIBox.showCustom((ui: Zui) => {
-						if (ui.tab(Zui.handle("boxpreferences_13"), tr("New Theme"))) {
-							ui.row([0.5, 0.5]);
-							let themeName = ui.textInput(Zui.handle("boxpreferences_14", { text: "new_theme" }), tr("Name"));
-							if (ui.button(tr("OK")) || ui.isReturnDown) {
+				if (Zui.button(tr("New"))) {
+					UIBox.showCustom((ui: ZuiRaw) => {
+						if (Zui.tab(Zui.handle("boxpreferences_13"), tr("New Theme"))) {
+							Zui.row([0.5, 0.5]);
+							let themeName = Zui.textInput(Zui.handle("boxpreferences_14", { text: "new_theme" }), tr("Name"));
+							if (Zui.button(tr("OK")) || ui.isReturnDown) {
 								let template = JSON.stringify(Base.theme);
 								if (!themeName.endsWith(".json")) themeName += ".json";
 								let path = Path.data() + Path.sep + "themes" + Path.sep + themeName;
-								Krom.fileSaveBytes(path, System.stringToBuffer(template));
+								Krom.fileSaveBytes(path, sys_string_to_buffer(template));
 								BoxPreferences.fetchThemes(); // Refresh file list
 								Config.raw.theme = themeName;
 								BoxPreferences.themeHandle.position = BoxPreferences.getThemeIndex();
@@ -159,41 +159,41 @@ class BoxPreferences {
 					});
 				}
 
-				if (ui.button(tr("Import"))) {
+				if (Zui.button(tr("Import"))) {
 					UIFiles.show("json", false, false, (path: string) => {
 						ImportTheme.run(path);
 					});
 				}
 
-				if (ui.button(tr("Export"))) {
+				if (Zui.button(tr("Export"))) {
 					UIFiles.show("json", true, false, (path: string) => {
 						path += Path.sep + UIFiles.filename;
 						if (!path.endsWith(".json")) path += ".json";
-						Krom.fileSaveBytes(path, System.stringToBuffer(JSON.stringify(Base.theme)));
+						Krom.fileSaveBytes(path, sys_string_to_buffer(JSON.stringify(Base.theme)));
 					});
 				}
 
-				ui.endSticky();
+				Zui.endSticky();
 
 				let i = 0;
 				let theme: any = Base.theme;
 				let hlist = Zui.handle("boxpreferences_15");
 
 				// Viewport color
-				let h = hlist.nest(i++, { color: BoxPreferences.worldColor });
-				ui.row([1 / 8, 7 / 8]);
-				ui.text("", 0, h.color);
+				let h = Zui.nest(hlist, i++, { color: BoxPreferences.worldColor });
+				Zui.row([1 / 8, 7 / 8]);
+				Zui.text("", 0, h.color);
 				if (ui.isHovered && ui.inputReleased) {
 					UIMenu.draw((ui) => {
 						ui.changed = false;
-						ui.colorWheel(h, false, null, 11 * ui.t.ELEMENT_H * ui.SCALE(), true);
+						Zui.colorWheel(h, false, null, 11 * ui.t.ELEMENT_H * Zui.SCALE(ui), true);
 						if (ui.changed) UIMenu.keepOpen = true;
 					}, 11);
 				}
 				let val = h.color;
 				if (val < 0) val += 4294967296;
 				h.text = val.toString(16);
-				ui.textInput(h, "VIEWPORT_COL");
+				Zui.textInput(h, "VIEWPORT_COL");
 				h.color = parseInt(h.text, 16);
 
 				if (BoxPreferences.worldColor != h.color) {
@@ -203,10 +203,10 @@ class BoxPreferences {
 					b[1] = color_get_gb(BoxPreferences.worldColor);
 					b[2] = color_get_bb(BoxPreferences.worldColor);
 					b[3] = 255;
-					Context.raw.emptyEnvmap = Image.fromBytes(b.buffer, 1, 1);
+					Context.raw.emptyEnvmap = image_from_bytes(b.buffer, 1, 1);
 					Context.raw.ddirty = 2;
 					if (!Context.raw.showEnvmap) {
-						Scene.world._envmap = Context.raw.emptyEnvmap;
+						scene_world._envmap = Context.raw.emptyEnvmap;
 					}
 				}
 
@@ -214,20 +214,20 @@ class BoxPreferences {
 				for (let key of Object.getOwnPropertyNames(Theme.prototype)) {
 					if (key == "constructor") continue;
 
-					let h = hlist.nest(i++);
+					let h = Zui.nest(hlist, i++);
 					let val: any = theme[key];
 
 					let isHex = key.endsWith("_COL");
 					if (isHex && val < 0) val += 4294967296;
 
 					if (isHex) {
-						ui.row([1 / 8, 7 / 8]);
-						ui.text("", 0, val);
+						Zui.row([1 / 8, 7 / 8]);
+						Zui.text("", 0, val);
 						if (ui.isHovered && ui.inputReleased) {
 							h.color = theme[key];
 							UIMenu.draw((ui) => {
 								ui.changed = false;
-								let color = ui.colorWheel(h, false, null, 11 * ui.t.ELEMENT_H * ui.SCALE(), true);
+								let color = Zui.colorWheel(h, false, null, 11 * ui.t.ELEMENT_H * Zui.SCALE(ui), true);
 								theme[key] = color;
 								if (ui.changed) UIMenu.keepOpen = true;
 							}, 11);
@@ -238,18 +238,18 @@ class BoxPreferences {
 
 					if (typeof val == "boolean") {
 						h.selected = val;
-						let b = ui.check(h, key);
+						let b = Zui.check(h, key);
 						theme[key] = b;
 					}
 					else if (key == "LINK_STYLE") {
 						let styles = [tr("Straight"), tr("Curved")];
 						h.position = val;
-						let i = ui.combo(h, styles, key, true);
+						let i = Zui.combo(h, styles, key, true);
 						theme[key] = i;
 					}
 					else {
 						h.text = isHex ? val.toString(16) : val.toString();
-						let res = ui.textInput(h, key);
+						let res = Zui.textInput(h, key);
 						if (isHex) theme[key] = parseInt(h.text, 16);
 						else theme[key] = parseInt(h.text);
 					}
@@ -262,14 +262,14 @@ class BoxPreferences {
 				}
 			}
 
-			if (ui.tab(BoxPreferences.htab, tr("Usage"), true)) {
+			if (Zui.tab(BoxPreferences.htab, tr("Usage"), true)) {
 				Context.raw.undoHandle = Zui.handle("boxpreferences_16", { value: Config.raw.undo_steps });
-				Config.raw.undo_steps = Math.floor(ui.slider(Context.raw.undoHandle, tr("Undo Steps"), 1, 64, false, 1));
+				Config.raw.undo_steps = Math.floor(Zui.slider(Context.raw.undoHandle, tr("Undo Steps"), 1, 64, false, 1));
 				if (Config.raw.undo_steps < 1) {
 					Config.raw.undo_steps = Math.floor(Context.raw.undoHandle.value = 1);
 				}
 				if (Context.raw.undoHandle.changed) {
-					Graphics2.end(ui.g);
+					g2_end(ui.g);
 
 					///if (is_paint || is_sculpt)
 					while (History.undoLayers.length < Config.raw.undo_steps) {
@@ -283,15 +283,15 @@ class BoxPreferences {
 					///end
 
 					History.reset();
-					Graphics2.begin(ui.g, false);
+					g2_begin(ui.g, false);
 				}
 
 				///if is_paint
-				Config.raw.dilate_radius = Math.floor(ui.slider(Zui.handle("boxpreferences_17", { value: Config.raw.dilate_radius }), tr("Dilate Radius"), 0.0, 16.0, true, 1));
-				if (ui.isHovered) ui.tooltip(tr("Dilate painted textures to prevent seams"));
+				Config.raw.dilate_radius = Math.floor(Zui.slider(Zui.handle("boxpreferences_17", { value: Config.raw.dilate_radius }), tr("Dilate Radius"), 0.0, 16.0, true, 1));
+				if (ui.isHovered) Zui.tooltip(tr("Dilate painted textures to prevent seams"));
 
 				let dilateHandle = Zui.handle("boxpreferences_18", { position: Config.raw.dilate });
-				ui.combo(dilateHandle, [tr("Instant"), tr("Delayed")], tr("Dilate"), true);
+				Zui.combo(dilateHandle, [tr("Instant"), tr("Delayed")], tr("Dilate"), true);
 				if (dilateHandle.changed) {
 					Config.raw.dilate = dilateHandle.position;
 				}
@@ -299,14 +299,14 @@ class BoxPreferences {
 
 				///if is_lab
 				let workspaceHandle = Zui.handle("boxpreferences_19", { position: Config.raw.workspace });
-				ui.combo(workspaceHandle, [tr("3D View"), tr("2D View")], tr("Default Workspace"), true);
+				Zui.combo(workspaceHandle, [tr("3D View"), tr("2D View")], tr("Default Workspace"), true);
 				if (workspaceHandle.changed) {
 					Config.raw.workspace = workspaceHandle.position;
 				}
 				///end
 
 				let cameraControlsHandle = Zui.handle("boxpreferences_20", { position: Config.raw.camera_controls });
-				ui.combo(cameraControlsHandle, [tr("Orbit"), tr("Rotate"), tr("Fly")], tr("Default Camera Controls"), true);
+				Zui.combo(cameraControlsHandle, [tr("Orbit"), tr("Rotate"), tr("Fly")], tr("Default Camera Controls"), true);
 				if (cameraControlsHandle.changed) {
 					Config.raw.camera_controls = cameraControlsHandle.position;
 				}
@@ -315,17 +315,17 @@ class BoxPreferences {
 
 				///if is_paint
 				///if (krom_android || krom_ios)
-				ui.combo(layerResHandle, ["128", "256", "512", "1K", "2K", "4K"], tr("Default Layer Resolution"), true);
+				Zui.combo(layerResHandle, ["128", "256", "512", "1K", "2K", "4K"], tr("Default Layer Resolution"), true);
 				///else
-				ui.combo(layerResHandle, ["128", "256", "512", "1K", "2K", "4K", "8K"], tr("Default Layer Resolution"), true);
+				Zui.combo(layerResHandle, ["128", "256", "512", "1K", "2K", "4K", "8K"], tr("Default Layer Resolution"), true);
 				///end
 				///end
 
 				///if is_lab
 				///if (krom_android || krom_ios)
-				ui.combo(layerResHandle, ["2K", "4K"], tr("Default Layer Resolution"), true);
+				Zui.combo(layerResHandle, ["2K", "4K"], tr("Default Layer Resolution"), true);
 				///else
-				ui.combo(layerResHandle, ["2K", "4K", "8K", "16K"], tr("Default Layer Resolution"), true);
+				Zui.combo(layerResHandle, ["2K", "4K", "8K", "16K"], tr("Default Layer Resolution"), true);
 				///end
 				///end
 
@@ -334,36 +334,36 @@ class BoxPreferences {
 				}
 
 				let serverHandle = Zui.handle("boxpreferences_22", { text: Config.raw.server });
-				Config.raw.server = ui.textInput(serverHandle, tr("Cloud Server"));
+				Config.raw.server = Zui.textInput(serverHandle, tr("Cloud Server"));
 
 				///if (is_paint || is_sculpt)
 				let materialLiveHandle = Zui.handle("boxpreferences_23", {selected: Config.raw.material_live });
-				Config.raw.material_live = ui.check(materialLiveHandle, tr("Live Material Preview"));
-				if (ui.isHovered) ui.tooltip(tr("Instantly update material preview on node change"));
+				Config.raw.material_live = Zui.check(materialLiveHandle, tr("Live Material Preview"));
+				if (ui.isHovered) Zui.tooltip(tr("Instantly update material preview on node change"));
 
 				let brushLiveHandle = Zui.handle("boxpreferences_24", { selected: Config.raw.brush_live });
-				Config.raw.brush_live = ui.check(brushLiveHandle, tr("Live Brush Preview"));
-				if (ui.isHovered) ui.tooltip(tr("Draw live brush preview in viewport"));
+				Config.raw.brush_live = Zui.check(brushLiveHandle, tr("Live Brush Preview"));
+				if (ui.isHovered) Zui.tooltip(tr("Draw live brush preview in viewport"));
 				if (brushLiveHandle.changed) Context.raw.ddirty = 2;
 
 				let brush3dHandle = Zui.handle("boxpreferences_25", { selected: Config.raw.brush_3d });
-				Config.raw.brush_3d = ui.check(brush3dHandle, tr("3D Cursor"));
+				Config.raw.brush_3d = Zui.check(brush3dHandle, tr("3D Cursor"));
 				if (brush3dHandle.changed) MakeMaterial.parsePaintMaterial();
 
 				ui.enabled = Config.raw.brush_3d;
 				let brushDepthRejectHandle = Zui.handle("boxpreferences_26", { selected: Config.raw.brush_depth_reject });
-				Config.raw.brush_depth_reject = ui.check(brushDepthRejectHandle, tr("Depth Reject"));
+				Config.raw.brush_depth_reject = Zui.check(brushDepthRejectHandle, tr("Depth Reject"));
 				if (brushDepthRejectHandle.changed) MakeMaterial.parsePaintMaterial();
 
-				ui.row([0.5, 0.5]);
+				Zui.row([0.5, 0.5]);
 
 				let brushAngleRejectHandle = Zui.handle("boxpreferences_27", { selected: Config.raw.brush_angle_reject });
-				Config.raw.brush_angle_reject = ui.check(brushAngleRejectHandle, tr("Angle Reject"));
+				Config.raw.brush_angle_reject = Zui.check(brushAngleRejectHandle, tr("Angle Reject"));
 				if (brushAngleRejectHandle.changed) MakeMaterial.parsePaintMaterial();
 
 				if (!Config.raw.brush_angle_reject) ui.enabled = false;
 				let angleDotHandle = Zui.handle("boxpreferences_28", { value: Context.raw.brushAngleRejectDot });
-				Context.raw.brushAngleRejectDot = ui.slider(angleDotHandle, tr("Angle"), 0.0, 1.0, true);
+				Context.raw.brushAngleRejectDot = Zui.slider(angleDotHandle, tr("Angle"), 0.0, 1.0, true);
 				if (angleDotHandle.changed) {
 					MakeMaterial.parsePaintMaterial();
 				}
@@ -371,8 +371,8 @@ class BoxPreferences {
 				///end
 
 				///if is_lab
-				Config.raw.gpu_inference = ui.check(Zui.handle("boxpreferences_29", { selected: Config.raw.gpu_inference }), tr("Use GPU"));
-				if (ui.isHovered) ui.tooltip(tr("Use GPU to accelerate node graph processing"));
+				Config.raw.gpu_inference = Zui.check(Zui.handle("boxpreferences_29", { selected: Config.raw.gpu_inference }), tr("Use GPU"));
+				if (ui.isHovered) Zui.tooltip(tr("Use GPU to accelerate node graph processing"));
 				///end
 			}
 
@@ -383,19 +383,19 @@ class BoxPreferences {
 			penName = tr("Pen");
 			///end
 
-			if (ui.tab(BoxPreferences.htab, penName, true)) {
-				ui.text(tr("Pressure controls"));
-				Config.raw.pressure_radius = ui.check(Zui.handle("boxpreferences_30", { selected: Config.raw.pressure_radius }), tr("Brush Radius"));
-				Config.raw.pressure_sensitivity = ui.slider(Zui.handle("boxpreferences_31", { value: Config.raw.pressure_sensitivity }), tr("Sensitivity"), 0.0, 10.0, true);
+			if (Zui.tab(BoxPreferences.htab, penName, true)) {
+				Zui.text(tr("Pressure controls"));
+				Config.raw.pressure_radius = Zui.check(Zui.handle("boxpreferences_30", { selected: Config.raw.pressure_radius }), tr("Brush Radius"));
+				Config.raw.pressure_sensitivity = Zui.slider(Zui.handle("boxpreferences_31", { value: Config.raw.pressure_sensitivity }), tr("Sensitivity"), 0.0, 10.0, true);
 				///if (is_paint || is_sculpt)
-				Config.raw.pressure_hardness = ui.check(Zui.handle("boxpreferences_32", { selected: Config.raw.pressure_hardness }), tr("Brush Hardness"));
-				Config.raw.pressure_opacity = ui.check(Zui.handle("boxpreferences_33", { selected: Config.raw.pressure_opacity }), tr("Brush Opacity"));
-				Config.raw.pressure_angle = ui.check(Zui.handle("boxpreferences_34", { selected: Config.raw.pressure_angle }), tr("Brush Angle"));
+				Config.raw.pressure_hardness = Zui.check(Zui.handle("boxpreferences_32", { selected: Config.raw.pressure_hardness }), tr("Brush Hardness"));
+				Config.raw.pressure_opacity = Zui.check(Zui.handle("boxpreferences_33", { selected: Config.raw.pressure_opacity }), tr("Brush Opacity"));
+				Config.raw.pressure_angle = Zui.check(Zui.handle("boxpreferences_34", { selected: Config.raw.pressure_angle }), tr("Brush Angle"));
 				///end
 
-				ui.endElement();
-				ui.row([0.5]);
-				if (ui.button(tr("Help"))) {
+				Zui.endElement();
+				Zui.row([0.5]);
+				if (Zui.button(tr("Help"))) {
 					///if (is_paint || is_sculpt)
 					File.loadUrl("https://github.com/armory3d/armorpaint_docs///pen");
 					///end
@@ -410,11 +410,11 @@ class BoxPreferences {
 			Context.raw.hbloom = Zui.handle("boxpreferences_37", { selected: Config.raw.rp_bloom });
 			Context.raw.hsupersample = Zui.handle("boxpreferences_38", { position: Config.getSuperSampleQuality(Config.raw.rp_supersample) });
 			Context.raw.hvxao = Zui.handle("boxpreferences_39", { selected: Config.raw.rp_gi });
-			if (ui.tab(BoxPreferences.htab, tr("Viewport"), true)) {
+			if (Zui.tab(BoxPreferences.htab, tr("Viewport"), true)) {
 				///if (krom_direct3d12 || krom_vulkan || krom_metal)
 
 				let hpathtracemode = Zui.handle("boxpreferences_40", { position: Context.raw.pathTraceMode });
-				Context.raw.pathTraceMode = ui.combo(hpathtracemode, [tr("Core"), tr("Full")], tr("Path Tracer"), true);
+				Context.raw.pathTraceMode = Zui.combo(hpathtracemode, [tr("Core"), tr("Full")], tr("Path Tracer"), true);
 				if (hpathtracemode.changed) {
 					RenderPathRaytrace.ready = false;
 				}
@@ -422,98 +422,98 @@ class BoxPreferences {
 				///end
 
 				let hrendermode = Zui.handle("boxpreferences_41", { position: Context.raw.renderMode });
-				Context.raw.renderMode = ui.combo(hrendermode, [tr("Full"), tr("Mobile")], tr("Renderer"), true);
+				Context.raw.renderMode = Zui.combo(hrendermode, [tr("Full"), tr("Mobile")], tr("Renderer"), true);
 				if (hrendermode.changed) {
 					Context.setRenderPath();
 				}
 
-				ui.combo(Context.raw.hsupersample, ["0.25x", "0.5x", "1.0x", "1.5x", "2.0x", "4.0x"], tr("Super Sample"), true);
+				Zui.combo(Context.raw.hsupersample, ["0.25x", "0.5x", "1.0x", "1.5x", "2.0x", "4.0x"], tr("Super Sample"), true);
 				if (Context.raw.hsupersample.changed) Config.applyConfig();
 
 				if (Context.raw.renderMode == RenderMode.RenderDeferred) {
 					///if arm_voxels
-					ui.check(Context.raw.hvxao, tr("Voxel AO"));
-					if (ui.isHovered) ui.tooltip(tr("Cone-traced AO and shadows"));
+					Zui.check(Context.raw.hvxao, tr("Voxel AO"));
+					if (ui.isHovered) Zui.tooltip(tr("Cone-traced AO and shadows"));
 					if (Context.raw.hvxao.changed) {
 						Config.applyConfig();
 					}
 
 					ui.enabled = Context.raw.hvxao.selected;
 					let h = Zui.handle("boxpreferences_42", { value: Context.raw.vxaoOffset });
-					Context.raw.vxaoOffset = ui.slider(h, tr("Cone Offset"), 1.0, 4.0, true);
+					Context.raw.vxaoOffset = Zui.slider(h, tr("Cone Offset"), 1.0, 4.0, true);
 					if (h.changed) Context.raw.ddirty = 2;
 					h = Zui.handle("boxpreferences_43", { value: Context.raw.vxaoAperture });
-					Context.raw.vxaoAperture = ui.slider(h, tr("Aperture"), 1.0, 4.0, true);
+					Context.raw.vxaoAperture = Zui.slider(h, tr("Aperture"), 1.0, 4.0, true);
 					if (h.changed) Context.raw.ddirty = 2;
 					ui.enabled = true;
 					///end
 
-					ui.check(Context.raw.hssao, tr("SSAO"));
+					Zui.check(Context.raw.hssao, tr("SSAO"));
 					if (Context.raw.hssao.changed) Config.applyConfig();
-					ui.check(Context.raw.hssr, tr("SSR"));
+					Zui.check(Context.raw.hssr, tr("SSR"));
 					if (Context.raw.hssr.changed) Config.applyConfig();
-					ui.check(Context.raw.hbloom, tr("Bloom"));
+					Zui.check(Context.raw.hbloom, tr("Bloom"));
 					if (Context.raw.hbloom.changed) Config.applyConfig();
 				}
 
 				let h = Zui.handle("boxpreferences_44", { value: Config.raw.rp_vignette });
-				Config.raw.rp_vignette = ui.slider(h, tr("Vignette"), 0.0, 1.0, true);
+				Config.raw.rp_vignette = Zui.slider(h, tr("Vignette"), 0.0, 1.0, true);
 				if (h.changed) Context.raw.ddirty = 2;
 
 				h = Zui.handle("boxpreferences_45", { value: Config.raw.rp_grain });
-				Config.raw.rp_grain = ui.slider(h, tr("Noise Grain"), 0.0, 1.0, true);
+				Config.raw.rp_grain = Zui.slider(h, tr("Noise Grain"), 0.0, 1.0, true);
 				if (h.changed) Context.raw.ddirty = 2;
 
 				// let h = Zui.handle("boxpreferences_46", { value: Context.raw.autoExposureStrength });
-				// Context.raw.autoExposureStrength = ui.slider(h, "Auto Exposure", 0.0, 2.0, true);
+				// Context.raw.autoExposureStrength = Zui.slider(h, "Auto Exposure", 0.0, 2.0, true);
 				// if (h.changed) Context.raw.ddirty = 2;
 
-				let cam = Scene.camera;
+				let cam = scene_camera;
 				let camRaw = cam.data;
 				let near_handle = Zui.handle("boxpreferences_47");
 				let far_handle = Zui.handle("boxpreferences_48");
 				near_handle.value = Math.floor(camRaw.near_plane * 1000) / 1000;
 				far_handle.value = Math.floor(camRaw.far_plane * 100) / 100;
-				camRaw.near_plane = ui.slider(near_handle, tr("Clip Start"), 0.001, 1.0, true);
-				camRaw.far_plane = ui.slider(far_handle, tr("Clip End"), 50.0, 100.0, true);
+				camRaw.near_plane = Zui.slider(near_handle, tr("Clip Start"), 0.001, 1.0, true);
+				camRaw.far_plane = Zui.slider(far_handle, tr("Clip End"), 50.0, 100.0, true);
 				if (near_handle.changed || far_handle.changed) {
 					CameraObject.buildProjection(cam);
 				}
 
 				let dispHandle = Zui.handle("boxpreferences_49", { value: Config.raw.displace_strength });
-				Config.raw.displace_strength = ui.slider(dispHandle, tr("Displacement Strength"), 0.0, 10.0, true);
+				Config.raw.displace_strength = Zui.slider(dispHandle, tr("Displacement Strength"), 0.0, 10.0, true);
 				if (dispHandle.changed) {
 					Context.raw.ddirty = 2;
 					MakeMaterial.parseMeshMaterial();
 				}
 			}
-			if (ui.tab(BoxPreferences.htab, tr("Keymap"), true)) {
+			if (Zui.tab(BoxPreferences.htab, tr("Keymap"), true)) {
 
 				if (BoxPreferences.filesKeymap == null) {
 					BoxPreferences.fetchKeymaps();
 				}
 
-				ui.beginSticky();
-				ui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
+				Zui.beginSticky();
+				Zui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
 
 				BoxPreferences.presetHandle = Zui.handle("boxpreferences_50", { position: BoxPreferences.getPresetIndex() });
-				ui.combo(BoxPreferences.presetHandle, BoxPreferences.filesKeymap, tr("Preset"));
+				Zui.combo(BoxPreferences.presetHandle, BoxPreferences.filesKeymap, tr("Preset"));
 				if (BoxPreferences.presetHandle.changed) {
 					Config.raw.keymap = BoxPreferences.filesKeymap[BoxPreferences.presetHandle.position] + ".json";
 					Config.applyConfig();
 					Config.loadKeymap();
 				}
 
-				if (ui.button(tr("New"))) {
-					UIBox.showCustom((ui: Zui) => {
-						if (ui.tab(Zui.handle("boxpreferences_51"), tr("New Keymap"))) {
-							ui.row([0.5, 0.5]);
-							let keymapName = ui.textInput(Zui.handle("boxpreferences_52", { text: "new_keymap" }), tr("Name"));
-							if (ui.button(tr("OK")) || ui.isReturnDown) {
+				if (Zui.button(tr("New"))) {
+					UIBox.showCustom((ui: ZuiRaw) => {
+						if (Zui.tab(Zui.handle("boxpreferences_51"), tr("New Keymap"))) {
+							Zui.row([0.5, 0.5]);
+							let keymapName = Zui.textInput(Zui.handle("boxpreferences_52", { text: "new_keymap" }), tr("Name"));
+							if (Zui.button(tr("OK")) || ui.isReturnDown) {
 								let template = JSON.stringify(Base.defaultKeymap);
 								if (!keymapName.endsWith(".json")) keymapName += ".json";
 								let path = Path.data() + Path.sep + "keymap_presets" + Path.sep + keymapName;
-								Krom.fileSaveBytes(path, System.stringToBuffer(template));
+								Krom.fileSaveBytes(path, sys_string_to_buffer(template));
 								BoxPreferences.fetchKeymaps(); // Refresh file list
 								Config.raw.keymap = keymapName;
 								BoxPreferences.presetHandle.position = BoxPreferences.getPresetIndex();
@@ -525,12 +525,12 @@ class BoxPreferences {
 					});
 				}
 
-				if (ui.button(tr("Import"))) {
+				if (Zui.button(tr("Import"))) {
 					UIFiles.show("json", false, false, (path: string) => {
 						ImportKeymap.run(path);
 					});
 				}
-				if (ui.button(tr("Export"))) {
+				if (Zui.button(tr("Export"))) {
 					UIFiles.show("json", true, false, (dest: string) => {
 						if (!UIFiles.filename.endsWith(".json")) UIFiles.filename += ".json";
 						let path = Path.data() + Path.sep + "keymap_presets" + Path.sep + Config.raw.keymap;
@@ -538,16 +538,16 @@ class BoxPreferences {
 					});
 				}
 
-				ui.endSticky();
+				Zui.endSticky();
 
-				ui.separator(8, false);
+				Zui.separator(8, false);
 
 				let i = 0;
 				ui.changed = false;
 				for (let key in Config.keymap) {
-					let h = Zui.handle("boxpreferences_53").nest(i++);
+					let h = Zui.nest(Zui.handle("boxpreferences_53"), i++);
 					h.text = Config.keymap[key];
-					let text = ui.textInput(h, key, Align.Left);
+					let text = Zui.textInput(h, key, Align.Left);
 					Config.keymap[key] = text;
 				}
 				if (ui.changed) {
@@ -555,21 +555,21 @@ class BoxPreferences {
 					Config.saveKeymap();
 				}
 			}
-			if (ui.tab(BoxPreferences.htab, tr("Plugins"), true)) {
-				ui.beginSticky();
-				ui.row([1 / 4, 1 / 4]);
-				if (ui.button(tr("New"))) {
-					UIBox.showCustom((ui: Zui) => {
-						if (ui.tab(Zui.handle("boxpreferences_54"), tr("New Plugin"))) {
-							ui.row([0.5, 0.5]);
-							let pluginName = ui.textInput(Zui.handle("boxpreferences_55", { text: "new_plugin" }), tr("Name"));
-							if (ui.button(tr("OK")) || ui.isReturnDown) {
+			if (Zui.tab(BoxPreferences.htab, tr("Plugins"), true)) {
+				Zui.beginSticky();
+				Zui.row([1 / 4, 1 / 4]);
+				if (Zui.button(tr("New"))) {
+					UIBox.showCustom((ui: ZuiRaw) => {
+						if (Zui.tab(Zui.handle("boxpreferences_54"), tr("New Plugin"))) {
+							Zui.row([0.5, 0.5]);
+							let pluginName = Zui.textInput(Zui.handle("boxpreferences_55", { text: "new_plugin" }), tr("Name"));
+							if (Zui.button(tr("OK")) || ui.isReturnDown) {
 								let template =
 `let plugin = Plugin.create();
 let h1 = new Handle();
 plugin.drawUI = (ui) { =>
-	if (ui.panel(h1, 'New Plugin')) {
-		if (ui.button('Button')) {
+	if (Zui.panel(h1, 'New Plugin')) {
+		if (Zui.button('Button')) {
 			console.error('Hello');
 		}
 	}
@@ -577,7 +577,7 @@ plugin.drawUI = (ui) { =>
 `;
 								if (!pluginName.endsWith(".js")) pluginName += ".js";
 								let path = Path.data() + Path.sep + "plugins" + Path.sep + pluginName;
-								Krom.fileSaveBytes(path, System.stringToBuffer(template));
+								Krom.fileSaveBytes(path, sys_string_to_buffer(template));
 								BoxPreferences.filesPlugin = null; // Refresh file list
 								UIBox.hide();
 								BoxPreferences.htab.position = 6; // Plugins
@@ -586,12 +586,12 @@ plugin.drawUI = (ui) { =>
 						}
 					});
 				}
-				if (ui.button(tr("Import"))) {
+				if (Zui.button(tr("Import"))) {
 					UIFiles.show("js,zip", false, false, (path: string) => {
 						ImportPlugin.run(path);
 					});
 				}
-				ui.endSticky();
+				Zui.endSticky();
 
 				if (BoxPreferences.filesPlugin == null) {
 					BoxPreferences.fetchPlugins();
@@ -605,20 +605,20 @@ plugin.drawUI = (ui) { =>
 					let enabled = Config.raw.plugins.indexOf(f) >= 0;
 					h.selected = enabled;
 					let tag = isJs ? f.split(".")[0] : f;
-					ui.check(h, tag);
+					Zui.check(h, tag);
 					if (h.changed && h.selected != enabled) {
 						h.selected ? Config.enablePlugin(f) : Config.disablePlugin(f);
 						Base.redrawUI();
 					}
 					if (ui.isHovered && ui.inputReleasedR) {
-						UIMenu.draw((ui: Zui) => {
+						UIMenu.draw((ui: ZuiRaw) => {
 							let path = Path.data() + Path.sep + "plugins" + Path.sep + f;
 							if (UIMenu.menuButton(ui, tr("Edit in Text Editor"))) {
 								File.start(path);
 							}
 							if (UIMenu.menuButton(ui, tr("Edit in Script Tab"))) {
 								Data.getBlob("plugins/" + f, (blob: ArrayBuffer) => {
-									TabScript.hscript.text = System.bufferToString(blob);
+									TabScript.hscript.text = sys_buffer_to_string(blob);
 									Data.deleteBlob("plugins/" + f);
 									Console.info(tr("Script opened"));
 								});
@@ -674,15 +674,15 @@ plugin.drawUI = (ui) { =>
 
 	static setScale = () => {
 		let scale = Config.raw.window_scale;
-		UIBase.ui.setScale(scale);
+		Zui.setScale(UIBase.ui, scale);
 		UIHeader.headerh = Math.floor(UIHeader.defaultHeaderH * scale);
 		Config.raw.layout[LayoutSize.LayoutStatusH] = Math.floor(UIStatus.defaultStatusH * scale);
 		UIMenubar.menubarw = Math.floor(UIMenubar.defaultMenubarW * scale);
 		UIBase.setIconScale();
-		UINodes.ui.setScale(scale);
-		UIView2D.ui.setScale(scale);
-		Base.uiBox.setScale(scale);
-		Base.uiMenu.setScale(scale);
+		Zui.setScale(UINodes.ui, scale);
+		Zui.setScale(UIView2D.ui, scale);
+		Zui.setScale(Base.uiBox, scale);
+		Zui.setScale(Base.uiMenu, scale);
 		Base.resize();
 		///if (is_paint || is_sculpt)
 		Config.raw.layout[LayoutSize.LayoutSidebarW] = Math.floor(UIBase.defaultSidebarW * scale);

+ 53 - 53
base/Sources/BoxProjects.ts

@@ -1,9 +1,9 @@
 
 class BoxProjects {
 
-	static htab = new Handle();
-	static hsearch = new Handle();
-	static iconMap: Map<string, ImageRaw> = null;
+	static htab = Handle.create();
+	static hsearch = Handle.create();
+	static iconMap: Map<string, image_t> = null;
 
 	static show = () => {
 		if (BoxProjects.iconMap != null) {
@@ -20,7 +20,7 @@ class BoxProjects {
 		draggable = true;
 		///end
 
-		UIBox.showCustom((ui: Zui) => {
+		UIBox.showCustom((ui: ZuiRaw) => {
 			///if (krom_android || krom_ios)
 			BoxProjects.alignToFullScreen();
 			///end
@@ -35,13 +35,13 @@ class BoxProjects {
 		}, 600, 400, null, draggable);
 	}
 
-	static projectsTab = (ui: Zui) => {
-		if (ui.tab(BoxProjects.htab, tr("Projects"), true)) {
-			ui.beginSticky();
+	static projectsTab = (ui: ZuiRaw) => {
+		if (Zui.tab(BoxProjects.htab, tr("Projects"), true)) {
+			Zui.beginSticky();
 
 			BoxProjects.drawBadge(ui);
 
-			if (ui.button(tr("New"))) {
+			if (Zui.button(tr("New"))) {
 				Project.projectNew();
 				Viewport.scaleToBounds();
 				UIBox.hide();
@@ -59,13 +59,13 @@ class BoxProjects {
 						j = 0;
 					}
 				}
-				System.title = title;
+				sys_title_set(title);
 			}
-			ui.endSticky();
-			ui.separator(3, false);
+			Zui.endSticky();
+			Zui.separator(3, false);
 
-			let slotw = Math.floor(150 * ui.SCALE());
-			let num = Math.floor(System.width / slotw);
+			let slotw = Math.floor(150 * Zui.SCALE(ui));
+			let num = Math.floor(sys_width() / slotw);
 			let recent_projects = Config.raw.recent_projects;
 			let show_asset_names = true;
 
@@ -73,18 +73,18 @@ class BoxProjects {
 				let mult = show_asset_names ? 2 : 1;
 				let ar = [];
 				for (let i = 0; i < num * mult; ++i) ar.push(1 / num);
-				ui.row(ar);
+				Zui.row(ar);
 
 				ui._x += 2;
-				let off = show_asset_names ? ui.ELEMENT_OFFSET() * 16.0 : 6;
+				let off = show_asset_names ? Zui.ELEMENT_OFFSET(ui) * 16.0 : 6;
 				if (row > 0) ui._y += off;
 
 				for (let j = 0; j < num; ++j) {
-					let imgw = Math.floor(128 * ui.SCALE());
+					let imgw = Math.floor(128 * Zui.SCALE(ui));
 					let i = j + row * num;
 					if (i >= recent_projects.length) {
-						ui.endElement(imgw);
-						if (show_asset_names) ui.endElement(0);
+						Zui.endElement(imgw);
+						if (show_asset_names) Zui.endElement(0);
 						continue;
 					}
 
@@ -100,7 +100,7 @@ class BoxProjects {
 					if (BoxProjects.iconMap == null) BoxProjects.iconMap = new Map();
 					let icon = BoxProjects.iconMap.get(iconPath);
 					if (icon == null) {
-						Data.getImage(iconPath, (image: ImageRaw) => {
+						Data.getImage(iconPath, (image: image_t) => {
 							icon = image;
 							BoxProjects.iconMap.set(iconPath, icon);
 						});
@@ -108,13 +108,13 @@ class BoxProjects {
 
 					let uix = ui._x;
 					if (icon != null) {
-						ui.fill(0, 0, 128, 128, ui.t.SEPARATOR_COL);
+						Zui.fill(0, 0, 128, 128, ui.t.SEPARATOR_COL);
 
-						let state = ui.image(icon, 0xffffffff, 128  * ui.SCALE());
+						let state = Zui.image(icon, 0xffffffff, 128  * Zui.SCALE(ui));
 						if (state == State.Released) {
 							let _uix = ui._x;
 							ui._x = uix;
-							ui.fill(0, 0, 128, 128, 0x66000000);
+							Zui.fill(0, 0, 128, 128, 0x66000000);
 							ui._x = _uix;
 							let doImport = () => {
 								App.notifyOnInit(() => {
@@ -135,7 +135,7 @@ class BoxProjects {
 
 						let name = path.substring(path.lastIndexOf(Path.sep) + 1, path.lastIndexOf("."));
 						if (ui.isHovered && ui.inputReleasedR) {
-							UIMenu.draw((ui: Zui) => {
+							UIMenu.draw((ui: ZuiRaw) => {
 								// if (UIMenu.menuButton(ui, tr("Duplicate"))) {}
 								if (UIMenu.menuButton(ui, tr("Delete"))) {
 									App.notifyOnInit(() => {
@@ -152,17 +152,17 @@ class BoxProjects {
 						if (show_asset_names) {
 							ui._x = uix - (150 - 128) / 2;
 							ui._y += slotw * 0.9;
-							ui.text(name, Align.Center);
-							if (ui.isHovered) ui.tooltip(name);
+							Zui.text(name, Align.Center);
+							if (ui.isHovered) Zui.tooltip(name);
 							ui._y -= slotw * 0.9;
 							if (i == recent_projects.length - 1) {
-								ui._y += j == num - 1 ? imgw : imgw + ui.ELEMENT_H() + ui.ELEMENT_OFFSET();
+								ui._y += j == num - 1 ? imgw : imgw + Zui.ELEMENT_H(ui) + Zui.ELEMENT_OFFSET(ui);
 							}
 						}
 					}
 					else {
-						ui.endElement(0);
-						if (show_asset_names) ui.endElement(0);
+						Zui.endElement(0);
+						if (show_asset_names) Zui.endElement(0);
 						ui._x = uix;
 					}
 				}
@@ -172,13 +172,13 @@ class BoxProjects {
 		}
 	}
 
-	static recentProjectsTab = (ui: Zui) => {
-		if (ui.tab(BoxProjects.htab, tr("Recent"), true)) {
+	static recentProjectsTab = (ui: ZuiRaw) => {
+		if (Zui.tab(BoxProjects.htab, tr("Recent"), true)) {
 
 			BoxProjects.drawBadge(ui);
 
 			ui.enabled = Config.raw.recent_projects.length > 0;
-			BoxProjects.hsearch.text = ui.textInput(BoxProjects.hsearch, tr("Search"), Align.Left, true, true);
+			BoxProjects.hsearch.text = Zui.textInput(BoxProjects.hsearch, tr("Search"), Align.Left, true, true);
 			ui.enabled = true;
 
 			for (let path of Config.raw.recent_projects) {
@@ -192,57 +192,57 @@ class BoxProjects {
 
 				if (file.toLowerCase().indexOf(BoxProjects.hsearch.text.toLowerCase()) < 0) continue; // Search filter
 
-				if (ui.button(file, Align.Left) && File.exists(path)) {
-					let current = Graphics2.current;
-					if (current != null) Graphics2.end(current);
+				if (Zui.button(file, Align.Left) && File.exists(path)) {
+					let current = _g2_current;
+					if (current != null) g2_end(current);
 
 					ImportArm.runProject(path);
 
-					if (current != null) Graphics2.begin(current, false);
+					if (current != null) g2_begin(current, false);
 					UIBox.hide();
 				}
-				if (ui.isHovered) ui.tooltip(path);
+				if (ui.isHovered) Zui.tooltip(path);
 			}
 
 			ui.enabled = Config.raw.recent_projects.length > 0;
-			if (ui.button(tr("Clear"), Align.Left)) {
+			if (Zui.button(tr("Clear"), Align.Left)) {
 				Config.raw.recent_projects = [];
 				Config.save();
 			}
 			ui.enabled = true;
 
-			ui.endElement();
-			if (ui.button(tr("New Project..."), Align.Left)) Project.projectNewBox();
-			if (ui.button(tr("Open..."), Align.Left)) Project.projectOpen();
+			Zui.endElement();
+			if (Zui.button(tr("New Project..."), Align.Left)) Project.projectNewBox();
+			if (Zui.button(tr("Open..."), Align.Left)) Project.projectOpen();
 		}
 	}
 
-	static drawBadge = (ui: Zui) => {
-		Data.getImage("badge.k", (img: ImageRaw) => {
-			ui.image(img);
-			ui.endElement();
+	static drawBadge = (ui: ZuiRaw) => {
+		Data.getImage("badge.k", (img: image_t) => {
+			Zui.image(img);
+			Zui.endElement();
 		});
 	}
 
-	static getStartedTab = (ui: Zui) => {
-		if (ui.tab(BoxProjects.htab, tr("Get Started"), true)) {
-			if (ui.button(tr("Manual"))) {
+	static getStartedTab = (ui: ZuiRaw) => {
+		if (Zui.tab(BoxProjects.htab, tr("Get Started"), true)) {
+			if (Zui.button(tr("Manual"))) {
 				File.loadUrl(manifest_url + "/manual");
 			}
-			if (ui.button(tr("How To"))) {
+			if (Zui.button(tr("How To"))) {
 				File.loadUrl(manifest_url + "/howto");
 			}
-			if (ui.button(tr("What's New"))) {
+			if (Zui.button(tr("What's New"))) {
 				File.loadUrl(manifest_url + "/notes");
 			}
 		}
 	}
 
 	static alignToFullScreen = () => {
-		UIBox.modalW = Math.floor(System.width / Base.uiBox.SCALE());
-		UIBox.modalH = Math.floor(System.height / Base.uiBox.SCALE());
-		let appw = System.width;
-		let apph = System.height;
+		UIBox.modalW = Math.floor(sys_width() / Zui.SCALE(Base.uiBox));
+		UIBox.modalH = Math.floor(sys_height() / Zui.SCALE(Base.uiBox));
+		let appw = sys_width();
+		let apph = sys_height();
 		let mw = appw;
 		let mh = apph;
 		UIBox.hwnd.dragX = Math.floor(-appw / 2 + mw / 2);

+ 95 - 95
base/Sources/Camera.ts

@@ -1,10 +1,10 @@
 
 class Camera {
 
-	static origins: TVec4[];
-	static views: TMat4[];
+	static origins: vec4_t[];
+	static views: mat4_t[];
 	static redraws = 0;
-	static dir = Vec4.create();
+	static dir = vec4_create();
 	static ease = 1.0;
 	static controlsDown = false;
 
@@ -13,29 +13,29 @@ class Camera {
 	}
 
 	static update = () => {
-		let camera = Scene.camera;
+		let camera = scene_camera;
 
-		if (Mouse.viewX < 0 ||
-			Mouse.viewX > App.w() ||
-			Mouse.viewY < 0 ||
-			Mouse.viewY > App.h()) {
+		if (mouse_view_x() < 0 ||
+			mouse_view_x() > App.w() ||
+			mouse_view_y() < 0 ||
+			mouse_view_y() > App.h()) {
 
 			if (Config.raw.wrap_mouse && Camera.controlsDown) {
-				if (Mouse.viewX < 0) {
-					Mouse.x = Mouse.lastX = App.x() + App.w();
-					Krom.setMousePosition(Math.floor(Mouse.x), Math.floor(Mouse.y));
+				if (mouse_view_x() < 0) {
+					mouse_x = mouse_last_x = App.x() + App.w();
+					Krom.setMousePosition(Math.floor(mouse_x), Math.floor(mouse_y));
 				}
-				else if (Mouse.viewX > App.w()) {
-					Mouse.x = Mouse.lastX = App.x();
-					Krom.setMousePosition(Math.floor(Mouse.x), Math.floor(Mouse.y));
+				else if (mouse_view_x() > App.w()) {
+					mouse_x = mouse_last_x = App.x();
+					Krom.setMousePosition(Math.floor(mouse_x), Math.floor(mouse_y));
 				}
-				else if (Mouse.viewY < 0) {
-					Mouse.y = Mouse.lastY = App.y() + App.h();
-					Krom.setMousePosition(Math.floor(Mouse.x), Math.floor(Mouse.y));
+				else if (mouse_view_y() < 0) {
+					mouse_y = mouse_last_y = App.y() + App.h();
+					Krom.setMousePosition(Math.floor(mouse_x), Math.floor(mouse_y));
 				}
-				else if (Mouse.viewY > App.h()) {
-					Mouse.y = Mouse.lastY = App.y();
-					Krom.setMousePosition(Math.floor(Mouse.x), Math.floor(Mouse.y));
+				else if (mouse_view_y() > App.h()) {
+					mouse_y = mouse_last_y = App.y();
+					Krom.setMousePosition(Math.floor(mouse_x), Math.floor(mouse_y));
 				}
 			}
 			else {
@@ -43,7 +43,7 @@ class Camera {
 			}
 		}
 
-		let modifKey = Keyboard.down("alt") || Keyboard.down("shift") || Keyboard.down("control");
+		let modifKey = keyboard_down("alt") || keyboard_down("shift") || keyboard_down("control");
 		let modif = modifKey || Config.keymap.action_rotate == "middle";
 		let defaultKeymap = Config.raw.keymap == "default.json";
 
@@ -52,9 +52,9 @@ class Camera {
 			Operator.shortcut(Config.keymap.action_pan, ShortcutType.ShortcutStarted) ||
 			Operator.shortcut(Config.keymap.rotate_envmap, ShortcutType.ShortcutStarted) ||
 			Operator.shortcut(Config.keymap.rotate_light, ShortcutType.ShortcutStarted) ||
-			(Mouse.started("right") && !modif) ||
-			(Mouse.started("middle") && !modif) ||
-			(Mouse.wheelDelta != 0 && !modifKey)) {
+			(mouse_started("right") && !modif) ||
+			(mouse_started("middle") && !modif) ||
+			(mouse_wheel_delta != 0 && !modifKey)) {
 			Camera.controlsDown = true;
 		}
 		else if (!Operator.shortcut(Config.keymap.action_rotate, ShortcutType.ShortcutDown) &&
@@ -62,13 +62,13 @@ class Camera {
 			!Operator.shortcut(Config.keymap.action_pan, ShortcutType.ShortcutDown) &&
 			!Operator.shortcut(Config.keymap.rotate_envmap, ShortcutType.ShortcutDown) &&
 			!Operator.shortcut(Config.keymap.rotate_light, ShortcutType.ShortcutDown) &&
-			!(Mouse.down("right") && !modif) &&
-			!(Mouse.down("middle") && !modif) &&
-			(Mouse.wheelDelta == 0 && !modifKey)) {
+			!(mouse_down("right") && !modif) &&
+			!(mouse_down("middle") && !modif) &&
+			(mouse_wheel_delta == 0 && !modifKey)) {
 			Camera.controlsDown = false;
 		}
 
-		if (Input.occupied ||
+		if (_input_occupied ||
 			!Base.uiEnabled ||
 			Base.isDragging ||
 			Base.isScrolling() ||
@@ -78,27 +78,27 @@ class Camera {
 		}
 
 		let controls = Context.raw.cameraControls;
-		if (controls == CameraControls.ControlsOrbit && (Operator.shortcut(Config.keymap.action_rotate, ShortcutType.ShortcutDown) || (Mouse.down("right") && !modif && defaultKeymap))) {
+		if (controls == CameraControls.ControlsOrbit && (Operator.shortcut(Config.keymap.action_rotate, ShortcutType.ShortcutDown) || (mouse_down("right") && !modif && defaultKeymap))) {
 			Camera.redraws = 2;
 			let dist = Camera.distance();
-			Transform.move(camera.base.transform, CameraObject.lookWorld(camera), dist);
-			Transform.rotate(camera.base.transform, Vec4.zAxis(), -Mouse.movementX / 100 * Config.raw.camera_rotation_speed);
-			Transform.rotate(camera.base.transform, CameraObject.rightWorld(camera), -Mouse.movementY / 100 * Config.raw.camera_rotation_speed);
+			transform_move(camera.base.transform, CameraObject.lookWorld(camera), dist);
+			transform_rotate(camera.base.transform, vec4_z_axis(), -mouse_movement_x / 100 * Config.raw.camera_rotation_speed);
+			transform_rotate(camera.base.transform, CameraObject.rightWorld(camera), -mouse_movement_y / 100 * Config.raw.camera_rotation_speed);
 			if (CameraObject.upWorld(camera).z < 0) {
-				Transform.rotate(camera.base.transform, CameraObject.rightWorld(camera), Mouse.movementY / 100 * Config.raw.camera_rotation_speed);
+				transform_rotate(camera.base.transform, CameraObject.rightWorld(camera), mouse_movement_y / 100 * Config.raw.camera_rotation_speed);
 			}
-			Transform.move(camera.base.transform, CameraObject.lookWorld(camera), -dist);
+			transform_move(camera.base.transform, CameraObject.lookWorld(camera), -dist);
 		}
-		else if (controls == CameraControls.ControlsRotate && (Operator.shortcut(Config.keymap.action_rotate, ShortcutType.ShortcutDown) || (Mouse.down("right") && !modif && defaultKeymap))) {
+		else if (controls == CameraControls.ControlsRotate && (Operator.shortcut(Config.keymap.action_rotate, ShortcutType.ShortcutDown) || (mouse_down("right") && !modif && defaultKeymap))) {
 			Camera.redraws = 2;
 			let t = Context.mainObject().base.transform;
-			let up = Vec4.normalize(Transform.up(t));
-			Transform.rotate(t, up, Mouse.movementX / 100 * Config.raw.camera_rotation_speed);
-			let right = Vec4.normalize(CameraObject.rightWorld(camera));
-			Transform.rotate(t, right, Mouse.movementY / 100 * Config.raw.camera_rotation_speed);
-			Transform.buildMatrix(t);
-			if (Transform.up(t).z < 0) {
-				Transform.rotate(t, right, -Mouse.movementY / 100 * Config.raw.camera_rotation_speed);
+			let up = vec4_normalize(transform_up(t));
+			transform_rotate(t, up, mouse_movement_x / 100 * Config.raw.camera_rotation_speed);
+			let right = vec4_normalize(CameraObject.rightWorld(camera));
+			transform_rotate(t, right, mouse_movement_y / 100 * Config.raw.camera_rotation_speed);
+			transform_build_matrix(t);
+			if (transform_up(t).z < 0) {
+				transform_rotate(t, right, -mouse_movement_y / 100 * Config.raw.camera_rotation_speed);
 			}
 		}
 
@@ -109,70 +109,70 @@ class Camera {
 				Camera.redraws = 2;
 				let f = Camera.getZoomDelta() / 150;
 				f *= Camera.getCameraZoomSpeed();
-				Transform.move(camera.base.transform, CameraObject.look(camera), f);
+				transform_move(camera.base.transform, CameraObject.look(camera), f);
 			}
 
-			if (Mouse.wheelDelta != 0 && !modifKey) {
+			if (mouse_wheel_delta != 0 && !modifKey) {
 				Camera.redraws = 2;
-				let f = Mouse.wheelDelta * (-0.1);
+				let f = mouse_wheel_delta * (-0.1);
 				f *= Camera.getCameraZoomSpeed();
-				Transform.move(camera.base.transform, CameraObject.look(camera), f);
+				transform_move(camera.base.transform, CameraObject.look(camera), f);
 			}
 		}
-		else if (controls == CameraControls.ControlsFly && Mouse.down("right")) {
-			let moveForward = Keyboard.down("w") || Keyboard.down("up") || Mouse.wheelDelta < 0;
-			let moveBackward = Keyboard.down("s") || Keyboard.down("down") || Mouse.wheelDelta > 0;
-			let strafeLeft = Keyboard.down("a") || Keyboard.down("left");
-			let strafeRight = Keyboard.down("d") || Keyboard.down("right");
-			let strafeUp = Keyboard.down("e");
-			let strafeDown = Keyboard.down("q");
-			let fast = Keyboard.down("shift") ? 2.0 : (Keyboard.down("alt") ? 0.5 : 1.0);
-			if (Mouse.wheelDelta != 0) {
-				fast *= Math.abs(Mouse.wheelDelta) * 4.0;
+		else if (controls == CameraControls.ControlsFly && mouse_down("right")) {
+			let moveForward = keyboard_down("w") || keyboard_down("up") || mouse_wheel_delta < 0;
+			let moveBackward = keyboard_down("s") || keyboard_down("down") || mouse_wheel_delta > 0;
+			let strafeLeft = keyboard_down("a") || keyboard_down("left");
+			let strafeRight = keyboard_down("d") || keyboard_down("right");
+			let strafeUp = keyboard_down("e");
+			let strafeDown = keyboard_down("q");
+			let fast = keyboard_down("shift") ? 2.0 : (keyboard_down("alt") ? 0.5 : 1.0);
+			if (mouse_wheel_delta != 0) {
+				fast *= Math.abs(mouse_wheel_delta) * 4.0;
 			}
 
 			if (moveForward || moveBackward || strafeRight || strafeLeft || strafeUp || strafeDown) {
-				Camera.ease += Time.delta * 15;
+				Camera.ease += time_delta() * 15;
 				if (Camera.ease > 1.0) Camera.ease = 1.0;
-				Vec4.set(Camera.dir, 0, 0, 0);
-				if (moveForward) Vec4.addf(Camera.dir, CameraObject.look(camera).x, CameraObject.look(camera).y, CameraObject.look(camera).z);
-				if (moveBackward) Vec4.addf(Camera.dir, -CameraObject.look(camera).x, -CameraObject.look(camera).y, -CameraObject.look(camera).z);
-				if (strafeRight) Vec4.addf(Camera.dir, CameraObject.right(camera).x, CameraObject.right(camera).y, CameraObject.right(camera).z);
-				if (strafeLeft) Vec4.addf(Camera.dir, -CameraObject.right(camera).x, -CameraObject.right(camera).y, -CameraObject.right(camera).z);
-				if (strafeUp) Vec4.addf(Camera.dir, 0, 0, 1);
-				if (strafeDown) Vec4.addf(Camera.dir, 0, 0, -1);
+				vec4_set(Camera.dir, 0, 0, 0);
+				if (moveForward) vec4_add_f(Camera.dir, CameraObject.look(camera).x, CameraObject.look(camera).y, CameraObject.look(camera).z);
+				if (moveBackward) vec4_add_f(Camera.dir, -CameraObject.look(camera).x, -CameraObject.look(camera).y, -CameraObject.look(camera).z);
+				if (strafeRight) vec4_add_f(Camera.dir, CameraObject.right(camera).x, CameraObject.right(camera).y, CameraObject.right(camera).z);
+				if (strafeLeft) vec4_add_f(Camera.dir, -CameraObject.right(camera).x, -CameraObject.right(camera).y, -CameraObject.right(camera).z);
+				if (strafeUp) vec4_add_f(Camera.dir, 0, 0, 1);
+				if (strafeDown) vec4_add_f(Camera.dir, 0, 0, -1);
 			}
 			else {
-				Camera.ease -= Time.delta * 20.0 * Camera.ease;
+				Camera.ease -= time_delta() * 20.0 * Camera.ease;
 				if (Camera.ease < 0.0) Camera.ease = 0.0;
 			}
 
 
-			let d = Time.delta * fast * Camera.ease * 2.0 * ((moveForward || moveBackward) ? Config.raw.camera_zoom_speed : Config.raw.camera_pan_speed);
+			let d = time_delta() * fast * Camera.ease * 2.0 * ((moveForward || moveBackward) ? Config.raw.camera_zoom_speed : Config.raw.camera_pan_speed);
 			if (d > 0.0) {
-				Transform.move(camera.base.transform, Camera.dir, d);
+				transform_move(camera.base.transform, Camera.dir, d);
 				if (Context.raw.cameraType == CameraType.CameraOrthographic) {
 					Viewport.updateCameraType(Context.raw.cameraType);
 				}
 			}
 
 			Camera.redraws = 2;
-			Transform.rotate(camera.base.transform, Vec4.zAxis(), -Mouse.movementX / 200 * Config.raw.camera_rotation_speed);
-			Transform.rotate(camera.base.transform, CameraObject.right(camera), -Mouse.movementY / 200 * Config.raw.camera_rotation_speed);
+			transform_rotate(camera.base.transform, vec4_z_axis(), -mouse_movement_x / 200 * Config.raw.camera_rotation_speed);
+			transform_rotate(camera.base.transform, CameraObject.right(camera), -mouse_movement_y / 200 * Config.raw.camera_rotation_speed);
 		}
 
 		if (Operator.shortcut(Config.keymap.rotate_light, ShortcutType.ShortcutDown)) {
 			Camera.redraws = 2;
-			let light = Scene.lights[0];
-			Context.raw.lightAngle = (Context.raw.lightAngle + ((Mouse.movementX / 100) % (2 * Math.PI) + 2 * Math.PI)) % (2 * Math.PI);
-			let m = Mat4.rotationZ(Mouse.movementX / 100);
-			Mat4.multmat(light.base.transform.local, m);
-			Transform.decompose(light.base.transform);
+			let light = scene_lights[0];
+			Context.raw.lightAngle = (Context.raw.lightAngle + ((mouse_movement_x / 100) % (2 * Math.PI) + 2 * Math.PI)) % (2 * Math.PI);
+			let m = mat4_rot_z(mouse_movement_x / 100);
+			mat4_mult_mat(light.base.transform.local, m);
+			transform_decompose(light.base.transform);
 		}
 
 		if (Operator.shortcut(Config.keymap.rotate_envmap, ShortcutType.ShortcutDown)) {
 			Camera.redraws = 2;
-			Context.raw.envmapAngle -= Mouse.movementX / 100;
+			Context.raw.envmapAngle -= mouse_movement_x / 100;
 		}
 
 		if (Camera.redraws > 0) {
@@ -186,8 +186,8 @@ class Camera {
 	}
 
 	static distance = (): f32 => {
-		let camera = Scene.camera;
-		return Vec4.distance(Camera.origins[Camera.index()], camera.base.transform.loc);
+		let camera = scene_camera;
+		return vec4_dist(Camera.origins[Camera.index()], camera.base.transform.loc);
 	}
 
 	static index = (): i32 => {
@@ -202,36 +202,36 @@ class Camera {
 	}
 
 	static reset = (viewIndex = -1) => {
-		let camera = Scene.camera;
+		let camera = scene_camera;
 		if (viewIndex == -1) {
-			Camera.origins = [Vec4.create(0, 0, 0), Vec4.create(0, 0, 0)];
-			Camera.views = [Mat4.clone(camera.base.transform.local), Mat4.clone(camera.base.transform.local)];
+			Camera.origins = [vec4_create(0, 0, 0), vec4_create(0, 0, 0)];
+			Camera.views = [mat4_clone(camera.base.transform.local), mat4_clone(camera.base.transform.local)];
 		}
 		else {
-			Camera.origins[viewIndex] = Vec4.create(0, 0, 0);
-			Camera.views[viewIndex] = Mat4.clone(camera.base.transform.local);
+			Camera.origins[viewIndex] = vec4_create(0, 0, 0);
+			Camera.views[viewIndex] = mat4_clone(camera.base.transform.local);
 		}
 	}
 
 	static panAction = (modif: bool, defaultKeymap: bool) => {
-		let camera = Scene.camera;
-		if (Operator.shortcut(Config.keymap.action_pan, ShortcutType.ShortcutDown) || (Mouse.down("middle") && !modif && defaultKeymap)) {
+		let camera = scene_camera;
+		if (Operator.shortcut(Config.keymap.action_pan, ShortcutType.ShortcutDown) || (mouse_down("middle") && !modif && defaultKeymap)) {
 			Camera.redraws = 2;
-			let look = Vec4.mult(Vec4.normalize(Transform.look(camera.base.transform)), Mouse.movementY / 150 * Config.raw.camera_pan_speed);
-			let right = Vec4.mult(Vec4.normalize(Transform.right(camera.base.transform)), -Mouse.movementX / 150 * Config.raw.camera_pan_speed);
-			Vec4.add(camera.base.transform.loc, look);
-			Vec4.add(camera.base.transform.loc, right);
-			Vec4.add(Camera.origins[Camera.index()], look);
-			Vec4.add(Camera.origins[Camera.index()], right);
+			let look = vec4_mult(vec4_normalize(transform_look(camera.base.transform)), mouse_movement_y / 150 * Config.raw.camera_pan_speed);
+			let right = vec4_mult(vec4_normalize(transform_right(camera.base.transform)), -mouse_movement_x / 150 * Config.raw.camera_pan_speed);
+			vec4_add(camera.base.transform.loc, look);
+			vec4_add(camera.base.transform.loc, right);
+			vec4_add(Camera.origins[Camera.index()], look);
+			vec4_add(Camera.origins[Camera.index()], right);
 			CameraObject.buildMatrix(camera);
 		}
 	}
 
 	static getZoomDelta = (): f32 => {
-		return Config.raw.zoom_direction == ZoomDirection.ZoomVertical ? -Mouse.movementY :
-			   Config.raw.zoom_direction == ZoomDirection.ZoomVerticalInverted ? -Mouse.movementY :
-			   Config.raw.zoom_direction == ZoomDirection.ZoomHorizontal ? Mouse.movementX :
-			   Config.raw.zoom_direction == ZoomDirection.ZoomHorizontalInverted ? Mouse.movementX :
-			   -(Mouse.movementY - Mouse.movementX);
+		return Config.raw.zoom_direction == ZoomDirection.ZoomVertical ? -mouse_movement_y :
+			   Config.raw.zoom_direction == ZoomDirection.ZoomVerticalInverted ? -mouse_movement_y :
+			   Config.raw.zoom_direction == ZoomDirection.ZoomHorizontal ? mouse_movement_x :
+			   Config.raw.zoom_direction == ZoomDirection.ZoomHorizontalInverted ? mouse_movement_x :
+			   -(mouse_movement_y - mouse_movement_x);
 	}
 }

+ 16 - 16
base/Sources/Config.ts

@@ -12,7 +12,7 @@ class Config {
 		try {
 			Data.getBlob((Path.isProtected() ? Krom.savePath() : "") + "config.json", (blob: ArrayBuffer) => {
 				Config.configLoaded = true;
-				Config.raw = JSON.parse(System.bufferToString(blob));
+				Config.raw = JSON.parse(sys_buffer_to_string(blob));
 
 				done();
 			});
@@ -22,7 +22,7 @@ class Config {
 			try { // Protected directory
 				Data.getBlob(Krom.savePath() + "config.json", (blob: ArrayBuffer) => {
 					Config.configLoaded = true;
-					Config.raw = JSON.parse(System.bufferToString(blob));
+					Config.raw = JSON.parse(sys_buffer_to_string(blob));
 					done();
 				});
 			}
@@ -39,7 +39,7 @@ class Config {
 		// Use system application data folder
 		// when running from protected path like "Program Files"
 		let path = (Path.isProtected() ? Krom.savePath() : Path.data() + Path.sep) + "config.json";
-		let buffer = System.stringToBuffer(JSON.stringify(Config.raw));
+		let buffer = sys_string_to_buffer(JSON.stringify(Config.raw));
 		Krom.fileSaveBytes(path, buffer);
 
 		///if krom_linux // Protected directory
@@ -64,14 +64,14 @@ class Config {
 			Config.raw.window_x = -1;
 			Config.raw.window_y = -1;
 			Config.raw.window_scale = 1.0;
-			if (System.displayWidth() >= 2560 && System.displayHeight() >= 1600) {
+			if (sys_display_width() >= 2560 && sys_display_height() >= 1600) {
 				Config.raw.window_scale = 2.0;
 			}
 			///if (krom_android || krom_ios || krom_darwin)
 			Config.raw.window_scale = 2.0;
 			///end
 			Config.raw.window_vsync = true;
-			Config.raw.window_frequency = System.displayFrequency();
+			Config.raw.window_frequency = sys_display_frequency();
 			Config.raw.rp_bloom = false;
 			Config.raw.rp_gi = false;
 			Config.raw.rp_vignette = 0.2;
@@ -109,7 +109,7 @@ class Config {
 	static getSha = (): string => {
 		let sha = "";
 		Data.getBlob("version.json", (blob: ArrayBuffer) => {
-			sha = JSON.parse(System.bufferToString(blob)).sha;
+			sha = JSON.parse(sys_buffer_to_string(blob)).sha;
 		});
 		return sha;
 	}
@@ -117,12 +117,12 @@ class Config {
 	static getDate = (): string => {
 		let date = "";
 		Data.getBlob("version.json", (blob: ArrayBuffer) => {
-			date = JSON.parse(System.bufferToString(blob)).date;
+			date = JSON.parse(sys_buffer_to_string(blob)).date;
 		});
 		return date;
 	}
 
-	static getOptions = (): SystemOptions => {
+	static getOptions = (): kinc_sys_ops_t => {
 		let windowMode = Config.raw.window_mode == 0 ? WindowMode.Windowed : WindowMode.Fullscreen;
 		let windowFeatures = WindowFeatures.FeatureNone;
 		if (Config.raw.window_resizable) windowFeatures |= WindowFeatures.FeatureResizable;
@@ -177,10 +177,10 @@ class Config {
 		Config.save();
 		Context.raw.ddirty = 2;
 
-		let current = Graphics2.current;
-		if (current != null) Graphics2.end(current);
+		let current = _g2_current;
+		if (current != null) g2_end(current);
 		RenderPathBase.applyConfig();
-		if (current != null) Graphics2.begin(current, false);
+		if (current != null) g2_begin(current, false);
 	}
 
 	static loadKeymap = () => {
@@ -189,7 +189,7 @@ class Config {
 		}
 		else {
 			Data.getBlob("keymap_presets/" + Config.raw.keymap, (blob: ArrayBuffer) => {
-				Config.keymap = JSON.parse(System.bufferToString(blob));
+				Config.keymap = JSON.parse(sys_buffer_to_string(blob));
 				// Fill in undefined keys with defaults
 				for (let field in Base.defaultKeymap) {
 					if (!(field in Config.keymap)) {
@@ -204,7 +204,7 @@ class Config {
 	static saveKeymap = () => {
 		if (Config.raw.keymap == "default.json") return;
 		let path = Data.dataPath + "keymap_presets/" + Config.raw.keymap;
-		let buffer = System.stringToBuffer(JSON.stringify(Config.keymap));
+		let buffer = sys_string_to_buffer(JSON.stringify(Config.keymap));
 		Krom.fileSaveBytes(path, buffer);
 	}
 
@@ -269,12 +269,12 @@ class Config {
 
 	static loadTheme = (theme: string, tagRedraw = true) => {
 		if (theme == "default.json") { // Built-in default
-			Base.theme = new Theme();
+			Base.theme = Theme.create();
 		}
 		else {
 			Data.getBlob("themes/" + theme, (b: ArrayBuffer) => {
-				let parsed = JSON.parse(System.bufferToString(b));
-				Base.theme = new Theme();
+				let parsed = JSON.parse(sys_buffer_to_string(b));
+				Base.theme = Theme.create();
 				for (let key in Base.theme) {
 					if (key == "theme_") continue;
 					if (key.startsWith("set_")) continue;

+ 11 - 11
base/Sources/Console.ts

@@ -7,22 +7,22 @@ class Console {
 	static lastTraces: string[] = [""];
 	static progressText: string = null;
 
-	static drawToast = (s: string, g: Graphics2Raw) => {
+	static drawToast = (s: string, g: g2_t) => {
 		g.color = 0x55000000;
-		Graphics2.fillRect(0, 0, System.width, System.height);
-		let scale = Base.getUIs()[0].SCALE();
-		let x = System.width / 2;
-		let y = System.height - 200 * scale;
-		Graphics2.fillRect(x - 200 * scale, y, 400 * scale, 80 * scale);
+		g2_fill_rect(0, 0, sys_width(), sys_height());
+		let scale = Zui.SCALE(Base.getUIs()[0]);
+		let x = sys_width() / 2;
+		let y = sys_height() - 200 * scale;
+		g2_fill_rect(x - 200 * scale, y, 400 * scale, 80 * scale);
 		g.font = Base.font;
-		g.fontSize = Math.floor(22 * scale);
+		g.font_size = Math.floor(22 * scale);
 		g.color = 0xffffffff;
-		Graphics2.drawString(s, x - Font.width(g.font, g.fontSize, s) / 2, y + 40 * scale - Font.height(g.font, g.fontSize) / 2);
+		g2_draw_string(s, x - font_width(g.font, g.font_size, s) / 2, y + 40 * scale - font_height(g.font, g.font_size) / 2);
 	}
 
-	static toast = (s: string, g2: Graphics2Raw = null) => {
+	static toast = (s: string, g2: g2_t = null) => {
 		// Show a popup message
-		let _render = (g: Graphics2Raw) => {
+		let _render = (g: g2_t) => {
 			Console.drawToast(s, g);
 			if (g2 == null) {
 				Base.notifyOnNextFrame(() => {
@@ -34,7 +34,7 @@ class Console {
 		Console.consoleTrace(s);
 	}
 
-	static drawProgress = (g: Graphics2Raw) => {
+	static drawProgress = (g: g2_t) => {
 		Console.drawToast(Console.progressText, g);
 	}
 

+ 40 - 40
base/Sources/Context.ts

@@ -75,14 +75,14 @@ class Context {
 		Context.raw.layer = l;
 		UIHeader.headerHandle.redraws = 2;
 
-		let current = Graphics2.current;
-		if (current != null) Graphics2.end(current);
+		let current = _g2_current;
+		if (current != null) g2_end(current);
 
 		Base.setObjectMask();
 		MakeMaterial.parseMeshMaterial();
 		MakeMaterial.parsePaintMaterial();
 
-		if (current != null) Graphics2.begin(current, false);
+		if (current != null) g2_begin(current, false);
 
 		UIBase.hwnds[TabArea.TabSidebar0].redraws = 2;
 		UIView2D.hwnd.redraws = 2;
@@ -203,8 +203,8 @@ class Context {
 		///if (is_paint || is_sculpt)
 		let right = App.w();
 		if (UIView2D.show) right += UIView2D.ww;
-		return Mouse.viewX > 0 && Mouse.viewX < right &&
-			   Mouse.viewY > 0 && Mouse.viewY < App.h();
+		return mouse_view_x() > 0 && mouse_view_x() < right &&
+			   mouse_view_y() > 0 && mouse_view_y() < App.h();
 		///end
 
 		///if is_lab
@@ -213,33 +213,33 @@ class Context {
 	}
 
 	static inLayers = (): bool => {
-		return UIBase.ui.getHoveredTabName() == tr("Layers");
+		return Zui.getHoveredTabName() == tr("Layers");
 	}
 
 	static inMaterials = (): bool => {
-		return UIBase.ui.getHoveredTabName() == tr("Materials");
+		return Zui.getHoveredTabName() == tr("Materials");
 	}
 
 	///if (is_paint || is_sculpt)
 	static in2dView = (type = View2DType.View2DLayer): bool => {
 		return UIView2D.show && UIView2D.type == type &&
-			   Mouse.x > UIView2D.wx && Mouse.x < UIView2D.wx + UIView2D.ww &&
-			   Mouse.y > UIView2D.wy && Mouse.y < UIView2D.wy + UIView2D.wh;
+			   mouse_x > UIView2D.wx && mouse_x < UIView2D.wx + UIView2D.ww &&
+			   mouse_y > UIView2D.wy && mouse_y < UIView2D.wy + UIView2D.wh;
 	}
 	///end
 
 	static inNodes = (): bool => {
 		return UINodes.show &&
-			   Mouse.x > UINodes.wx && Mouse.x < UINodes.wx + UINodes.ww &&
-			   Mouse.y > UINodes.wy && Mouse.y < UINodes.wy + UINodes.wh;
+			   mouse_x > UINodes.wx && mouse_x < UINodes.wx + UINodes.ww &&
+			   mouse_y > UINodes.wy && mouse_y < UINodes.wy + UINodes.wh;
 	}
 
 	static inSwatches = (): bool => {
-		return UIBase.ui.getHoveredTabName() == tr("Swatches");
+		return Zui.getHoveredTabName() == tr("Swatches");
 	}
 
 	static inBrowser = (): bool => {
-		return UIBase.ui.getHoveredTabName() == tr("Browser");
+		return Zui.getHoveredTabName() == tr("Browser");
 	}
 
 	static getAreaType = (): AreaType => {
@@ -259,10 +259,10 @@ class Context {
 
 		Context.raw.viewportMode = mode;
 		if (Context.useDeferred()) {
-			RenderPath.commands = RenderPathDeferred.commands;
+			render_path_commands = RenderPathDeferred.commands;
 		}
 		else {
-			RenderPath.commands = RenderPathForward.commands;
+			render_path_commands = RenderPathForward.commands;
 		}
 		let _workspace = UIHeader.worktab.position;
 		UIHeader.worktab.position = 0;
@@ -276,16 +276,16 @@ class Context {
 			Context.raw.envmapLoaded = true;
 			Data.cachedImages.delete("World_radiance.k");
 		}
-		WorldData.loadEnvmap(Scene.world, (_) => {});
-		if (Context.raw.savedEnvmap == null) Context.raw.savedEnvmap = Scene.world._envmap;
+		world_data_load_envmap(scene_world, (_) => {});
+		if (Context.raw.savedEnvmap == null) Context.raw.savedEnvmap = scene_world._envmap;
 	}
 
 	static updateEnvmap = () => {
 		if (Context.raw.showEnvmap) {
-			Scene.world._envmap = Context.raw.showEnvmapBlur ? Scene.world._radianceMipmaps[0] : Context.raw.savedEnvmap;
+			scene_world._envmap = Context.raw.showEnvmapBlur ? scene_world._radianceMipmaps[0] : Context.raw.savedEnvmap;
 		}
 		else {
-			Scene.world._envmap = Context.raw.emptyEnvmap;
+			scene_world._envmap = Context.raw.emptyEnvmap;
 		}
 	}
 
@@ -296,10 +296,10 @@ class Context {
 
 	static setRenderPath = () => {
 		if (Context.raw.renderMode == RenderMode.RenderForward || Context.raw.viewportShader != null) {
-			RenderPath.commands = RenderPathForward.commands;
+			render_path_commands = RenderPathForward.commands;
 		}
 		else {
-			RenderPath.commands = RenderPathDeferred.commands;
+			render_path_commands = RenderPathDeferred.commands;
 		}
 		App.notifyOnInit(() => {
 			MakeMaterial.parseMeshMaterial();
@@ -339,7 +339,7 @@ class Context {
 
 		let nodes = UINodes.getNodes();
 		let canvas = UINodes.getCanvas(true);
-		let inpaint = nodes.nodesSelectedId.length > 0 && nodes.getNode(canvas.nodes, nodes.nodesSelectedId[0]).type == "InpaintNode";
+		let inpaint = nodes.nodesSelectedId.length > 0 && Nodes.getNode(canvas.nodes, nodes.nodesSelectedId[0]).type == "InpaintNode";
 
 		// Paint bounds
 		if (inpaint &&
@@ -352,7 +352,7 @@ class Context {
 			!Base.isScrolling() &&
 			!Base.isComboSelected()) {
 
-			let down = Mouse.down() || Pen.down();
+			let down = mouse_down() || pen_down();
 
 			// Prevent painting the same spot
 			let sameSpot = Context.raw.paintVec.x == Context.raw.lastPaintX && Context.raw.paintVec.y == Context.raw.lastPaintY;
@@ -386,20 +386,20 @@ class Context {
 	}
 
 	static update = () => {
-		let paintX = Mouse.viewX / App.w();
-		let paintY = Mouse.viewY / App.h();
-		if (Mouse.started()) {
-			Context.raw.startX = Mouse.viewX / App.w();
-			Context.raw.startY = Mouse.viewY / App.h();
+		let paintX = mouse_view_x() / App.w();
+		let paintY = mouse_view_y() / App.h();
+		if (mouse_started()) {
+			Context.raw.startX = mouse_view_x() / App.w();
+			Context.raw.startY = mouse_view_y() / App.h();
 		}
 
-		if (Pen.down()) {
-			paintX = Pen.viewX / App.w();
-			paintY = Pen.viewY / App.h();
+		if (pen_down()) {
+			paintX = pen_view_x() / App.w();
+			paintY = pen_view_y() / App.h();
 		}
-		if (Pen.started()) {
-			Context.raw.startX = Pen.viewX / App.w();
-			Context.raw.startY = Pen.viewY / App.h();
+		if (pen_started()) {
+			Context.raw.startX = pen_view_x() / App.w();
+			Context.raw.startY = pen_view_y() / App.h();
 		}
 
 		if (Operator.shortcut(Config.keymap.brush_ruler + "+" + Config.keymap.action_paint, ShortcutType.ShortcutDown)) {
@@ -411,20 +411,20 @@ class Context {
 		Context.raw.coords.y = paintY;
 
 		if (Context.raw.lockBegin) {
-			let dx = Math.abs(Context.raw.lockStartX - Mouse.viewX);
-			let dy = Math.abs(Context.raw.lockStartY - Mouse.viewY);
+			let dx = Math.abs(Context.raw.lockStartX - mouse_view_x());
+			let dy = Math.abs(Context.raw.lockStartY - mouse_view_y());
 			if (dx > 1 || dy > 1) {
 				Context.raw.lockBegin = false;
 				dx > dy ? Context.raw.lockY = true : Context.raw.lockX = true;
 			}
 		}
 
-		if (Keyboard.started(Config.keymap.brush_ruler)) {
-			Context.raw.lockStartX = Mouse.viewX;
-			Context.raw.lockStartY = Mouse.viewY;
+		if (keyboard_started(Config.keymap.brush_ruler)) {
+			Context.raw.lockStartX = mouse_view_x();
+			Context.raw.lockStartY = mouse_view_y();
 			Context.raw.lockBegin = true;
 		}
-		else if (Keyboard.released(Config.keymap.brush_ruler)) {
+		else if (keyboard_released(Config.keymap.brush_ruler)) {
 			Context.raw.lockX = Context.raw.lockY = Context.raw.lockBegin = false;
 		}
 

+ 38 - 38
base/Sources/ContextFormat.ts

@@ -23,16 +23,16 @@ class TContext {
 	colorPickerCallback?: (sc: TSwatchColor)=>void = null;
 
 	defaultIrradiance?: Float32Array = null;
-	defaultRadiance?: ImageRaw = null;
-	defaultRadianceMipmaps?: ImageRaw[] = null;
-	savedEnvmap?: ImageRaw = null;
-	emptyEnvmap?: ImageRaw = null;
-	previewEnvmap?: ImageRaw = null;
+	defaultRadiance?: image_t = null;
+	defaultRadianceMipmaps?: image_t[] = null;
+	savedEnvmap?: image_t = null;
+	emptyEnvmap?: image_t = null;
+	previewEnvmap?: image_t = null;
 	envmapLoaded? = false;
 	showEnvmap? = false;
-	showEnvmapHandle? = new Handle({ selected: false });
+	showEnvmapHandle? = Handle.create({ selected: false });
 	showEnvmapBlur? = false;
-	showEnvmapBlurHandle? = new Handle({ selected: false });
+	showEnvmapBlurHandle? = Handle.create({ selected: false });
 	envmapAngle? = 0.0;
 	lightAngle? = 0.0;
 	cullBackfaces? = true;
@@ -66,7 +66,7 @@ class TContext {
 	exportMeshIndex? = 0;
 	packAssetsOnExport? = true;
 
-	paintVec? = Vec4.create();
+	paintVec? = vec4_create();
 	lastPaintX? = -1.0;
 	lastPaintY? = -1.0;
 	foregroundEvent? = false;
@@ -95,14 +95,14 @@ class TContext {
 	brushCanLock? = false;
 	brushCanUnlock? = false;
 	cameraType? = CameraType.CameraPerspective;
-	camHandle? = new Handle();
-	fovHandle?: Handle = null;
-	undoHandle?: Handle = null;
-	hssao?: Handle = null;
-	hssr?: Handle = null;
-	hbloom?: Handle = null;
-	hsupersample?: Handle = null;
-	hvxao?: Handle = null;
+	camHandle? = Handle.create();
+	fovHandle?: HandleRaw = null;
+	undoHandle?: HandleRaw = null;
+	hssao?: HandleRaw = null;
+	hssr?: HandleRaw = null;
+	hbloom?: HandleRaw = null;
+	hsupersample?: HandleRaw = null;
+	hvxao?: HandleRaw = null;
 	///if is_forge
 	vxaoExt? = 2.0;
 	///else
@@ -125,23 +125,23 @@ class TContext {
 	layerPreviewDirty? = true;
 	layersPreviewDirty? = false;
 	nodePreviewDirty? = false;
-	nodePreview?: ImageRaw = null;
-	nodePreviews?: Map<string, ImageRaw> = null;
+	nodePreview?: image_t = null;
+	nodePreviews?: Map<string, image_t> = null;
 	nodePreviewsUsed?: string[] = null;
 	nodePreviewName? = "";
-	maskPreviewRgba32?: ImageRaw = null;
+	maskPreviewRgba32?: image_t = null;
 	maskPreviewLast?: SlotLayerRaw = null;
 
 	colorIdPicked? = false;
 	materialPreview? = false; // Drawing material previews
-	savedCamera? = Mat4.identity();
+	savedCamera? = mat4_identity();
 
 	colorPickerPreviousTool? = WorkspaceTool.ToolBrush;
 	materialIdPicked? = 0;
 	uvxPicked? = 0.0;
 	uvyPicked? = 0.0;
 	pickerSelectMaterial? = true;
-	pickerMaskHandle? = new Handle();
+	pickerMaskHandle? = Handle.create();
 	pickPosNorTex? = false;
 	posXPicked? = 0.0;
 	posYPicked? = 0.0;
@@ -151,14 +151,14 @@ class TContext {
 	norZPicked? = 0.0;
 
 	drawWireframe? = false;
-	wireframeHandle? = new Handle({ selected: false });
+	wireframeHandle? = Handle.create({ selected: false });
 	drawTexels? = false;
-	texelsHandle? = new Handle({ selected: false });
+	texelsHandle? = Handle.create({ selected: false });
 
-	colorIdHandle? = new Handle();
+	colorIdHandle? = Handle.create();
 	layersExport? = ExportMode.ExportVisible;
 
-	decalImage?: ImageRaw = null;
+	decalImage?: image_t = null;
 	decalPreview? = false;
 	decalX? = 0.0;
 	decalY? = 0.0;
@@ -166,9 +166,9 @@ class TContext {
 	cacheDraws? = false;
 	writeIconOnExport? = false;
 
-	textToolImage?: ImageRaw = null;
+	textToolImage?: image_t = null;
 	textToolText?: string;
-	particleMaterial?: TMaterialData = null;
+	particleMaterial?: material_data_t = null;
 	///if arm_physics
 	particlePhysics? = false;
 	particleHitX? = 0.0;
@@ -177,7 +177,7 @@ class TContext {
 	lastParticleHitX? = 0.0;
 	lastParticleHitY? = 0.0;
 	lastParticleHitZ? = 0.0;
-	particleTimer?: TAnim = null;
+	particleTimer?: tween_anim_t = null;
 	paintBody?: PhysicsBodyRaw = null;
 	///end
 
@@ -211,9 +211,9 @@ class TContext {
 
 	brushNodesRadius? = 1.0;
 	brushNodesOpacity? = 1.0;
-	brushMaskImage?: ImageRaw = null;
+	brushMaskImage?: image_t = null;
 	brushMaskImageIsAlpha? = false;
-	brushStencilImage?: ImageRaw = null;
+	brushStencilImage?: image_t = null;
 	brushStencilImageIsAlpha? = false;
 	brushStencilX? = 0.02;
 	brushStencilY? = 0.02;
@@ -227,17 +227,17 @@ class TContext {
 	brushDirectional? = false;
 
 	brushRadius? = 0.5;
-	brushRadiusHandle? = new Handle({ value: 0.5 });
+	brushRadiusHandle? = Handle.create({ value: 0.5 });
 	brushScaleX? = 1.0;
 	brushDecalMaskRadius? = 0.5;
-	brushDecalMaskRadiusHandle? = new Handle({ value: 0.5 });
-	brushScaleXHandle? = new Handle({ value: 1.0 });
+	brushDecalMaskRadiusHandle? = Handle.create({ value: 0.5 });
+	brushScaleXHandle? = Handle.create({ value: 1.0 });
 	brushBlending? = BlendType.BlendMix;
 	brushOpacity? = 1.0;
-	brushOpacityHandle? = new Handle({ value: 1.0 });
+	brushOpacityHandle? = Handle.create({ value: 1.0 });
 	brushScale? = 1.0;
 	brushAngle? = 0.0;
-	brushAngleHandle? = new Handle({ value: 0.0 });
+	brushAngleHandle? = Handle.create({ value: 0.0 });
 	///if is_paint
 	brushHardness? = 0.8;
 	///end
@@ -267,7 +267,7 @@ class TContext {
 	symX? = false;
 	symY? = false;
 	symZ? = false;
-	fillTypeHandle? = new Handle();
+	fillTypeHandle? = Handle.create();
 
 	paint2d? = false;
 
@@ -284,10 +284,10 @@ class TContext {
 	colorPickerPreviousTool? = WorkspaceTool.ToolEraser;
 
 	brushRadius? = 0.25;
-	brushRadiusHandle? = new Handle({ value: 0.25 });
+	brushRadiusHandle? = Handle.create({ value: 0.25 });
 	brushScale? = 1.0;
 
-	coords? = Vec4.create();
+	coords? = vec4_create();
 	startX? = 0.0;
 	startY? = 0.0;
 

+ 43 - 43
base/Sources/ExportArm.ts

@@ -2,10 +2,10 @@
 class ExportArm {
 
 	static runMesh = (path: string, paintObjects: TMeshObject[]) => {
-		let mesh_datas: TMeshData[] = [];
+		let mesh_datas: mesh_data_t[] = [];
 		for (let p of paintObjects) mesh_datas.push(p.data);
-		let raw: TSceneFormat = { mesh_datas: mesh_datas };
-		let b = ArmPack.encode(raw);
+		let raw: scene_t = { mesh_datas: mesh_datas };
+		let b = armpack_encode(raw);
 		if (!path.endsWith(".arm")) path += ".arm";
 		Krom.fileSaveBytes(path, b, b.byteLength + 1);
 	}
@@ -39,7 +39,7 @@ class ExportArm {
 		}
 
 		///if (is_paint || is_sculpt)
-		let md: TMeshData[] = [];
+		let md: mesh_data_t[] = [];
 		for (let p of Project.paintObjects) md.push(p.data);
 		///end
 
@@ -62,11 +62,11 @@ class ExportArm {
 				name: l.name,
 				res: l.texpaint != null ? l.texpaint.width : Project.layers[0].texpaint.width,
 				bpp: bpp,
-				texpaint: l.texpaint != null ? Lz4.encode(Image.getPixels(l.texpaint)) : null,
+				texpaint: l.texpaint != null ? lz4_encode(image_get_pixels(l.texpaint)) : null,
 				uv_scale: l.scale,
 				uv_rot: l.angle,
 				uv_type: l.uvType,
-				decal_mat: l.uvType == UVType.UVProject ? Mat4.toFloat32Array(l.decalMat) : null,
+				decal_mat: l.uvType == UVType.UVProject ? mat4_to_f32_array(l.decalMat) : null,
 				opacity_mask: l.maskOpacity,
 				fill_layer: l.fill_layer != null ? Project.materials.indexOf(l.fill_layer) : -1,
 				object_mask: l.objectMask,
@@ -74,8 +74,8 @@ class ExportArm {
 				parent: l.parent != null ? Project.layers.indexOf(l.parent) : -1,
 				visible: l.visible,
 				///if is_paint
-				texpaint_nor: l.texpaint_nor != null ? Lz4.encode(Image.getPixels(l.texpaint_nor)) : null,
-				texpaint_pack: l.texpaint_pack != null ? Lz4.encode(Image.getPixels(l.texpaint_pack)) : null,
+				texpaint_nor: l.texpaint_nor != null ? lz4_encode(image_get_pixels(l.texpaint_nor)) : null,
+				texpaint_pack: l.texpaint_pack != null ? lz4_encode(image_get_pixels(l.texpaint_pack)) : null,
 				paint_base: l.paintBase,
 				paint_opac: l.paintOpac,
 				paint_occ: l.paintOcc,
@@ -106,10 +106,10 @@ class ExportArm {
 			packed_assets: packed_assets,
 			swatches: Project.raw.swatches,
 			envmap: Project.raw.envmap != null ? (sameDrive ? Path.toRelative(Project.filepath, Project.raw.envmap) : Project.raw.envmap) : null,
-			envmap_strength: Scene.world.strength,
-			camera_world: Mat4.toFloat32Array(Scene.camera.base.transform.local),
+			envmap_strength: scene_world.strength,
+			camera_world: mat4_to_f32_array(scene_camera.base.transform.local),
 			camera_origin: ExportArm.vec3f32(Camera.origins[0]),
-			camera_fov: Scene.camera.data.fov,
+			camera_fov: scene_camera.data.fov,
 
 			///if (is_paint || is_sculpt)
 			mesh_datas: md,
@@ -138,22 +138,22 @@ class ExportArm {
 		};
 
 		///if (krom_android || krom_ios)
-		let tex = RenderPath.renderTargets.get(Context.raw.renderMode == RenderMode.RenderForward ? "buf" : "tex").image;
-		let mesh_icon = Image.createRenderTarget(256, 256);
+		let tex = render_path_render_targets.get(Context.raw.renderMode == RenderMode.RenderForward ? "buf" : "tex").image;
+		let mesh_icon = image_create_render_target(256, 256);
 		let r = App.w() / App.h();
-		mesh_icon.g2.begin(false);
+		g2_begin(mesh_icon.g2, false);
 		///if krom_opengl
-		mesh_icon.g2.drawScaledImage(tex, -(256 * r - 256) / 2, 256, 256 * r, -256);
+		g2_draw_scaled_image(tex, -(256 * r - 256) / 2, 256, 256 * r, -256);
 		///else
-		mesh_icon.g2.drawScaledImage(tex, -(256 * r - 256) / 2, 0, 256 * r, 256);
+		g2_draw_scaled_image(tex, -(256 * r - 256) / 2, 0, 256 * r, 256);
 		///end
-		mesh_icon.g2.end();
+		g2_end(mesh_icon.g2);
 		///if krom_metal
 		// Flush command list
-		mesh_icon.g2.begin(false);
-		mesh_icon.g2.end();
+		g2_begin(mesh_icon.g2, false);
+		g2_end(mesh_icon.g2);
 		///end
-		let mesh_icon_pixels = Image.getPixels(mesh_icon);
+		let mesh_icon_pixels = image_get_pixels(mesh_icon);
 		let u8a = new Uint8Array(mesh_icon_pixels);
 		for (let i = 0; i < 256 * 256 * 4; ++i) {
 			u8a[i] = Math.floor(Math.pow(u8a[i] / 255, 1.0 / 2.2) * 255);
@@ -162,13 +162,13 @@ class ExportArm {
 		ExportArm.bgraSwap(mesh_icon_pixels);
 		///end
 		Base.notifyOnNextFrame(() => {
-			Image.unload(mesh_icon);
+			image_unload(mesh_icon);
 		});
 		// Project.raw.mesh_icons =
 		// 	///if (krom_metal || krom_vulkan)
-		// 	[Lz4.encode(bgraSwap(mesh_icon_pixels)];
+		// 	[encode(bgraSwap(mesh_icon_pixels)];
 		// 	///else
-		// 	[Lz4.encode(mesh_icon_pixels)];
+		// 	[encode(mesh_icon_pixels)];
 		// 	///end
 		Krom.writePng(Project.filepath.substr(0, Project.filepath.length - 4) + "_icon.png", mesh_icon_pixels, 256, 256, 0);
 		///end
@@ -180,7 +180,7 @@ class ExportArm {
 		}
 		///end
 
-		let buffer = ArmPack.encode(Project.raw);
+		let buffer = armpack_encode(Project.raw);
 		Krom.fileSaveBytes(Project.filepath, buffer, buffer.byteLength + 1);
 
 		// Save to recent
@@ -253,18 +253,18 @@ class ExportArm {
 			material_groups: mgroups,
 			material_icons: isCloud ? null :
 				///if (krom_metal || krom_vulkan)
-				[Lz4.encode(ExportArm.bgraSwap(Image.getPixels(m.image)))],
+				[lz4_encode(ExportArm.bgraSwap(image_get_pixels(m.image)))],
 				///else
-				[Lz4.encode(Image.getPixels(m.image))],
+				[lz4_encode(image_get_pixels(m.image))],
 				///end
 			assets: texture_files,
 			packed_assets: packed_assets
 		};
 
 		if (Context.raw.writeIconOnExport) { // Separate icon files
-			Krom.writePng(path.substr(0, path.length - 4) + "_icon.png", Image.getPixels(m.image), m.image.width, m.image.height, 0);
+			Krom.writePng(path.substr(0, path.length - 4) + "_icon.png", image_get_pixels(m.image), m.image.width, m.image.height, 0);
 			if (isCloud) {
-				Krom.writeJpg(path.substr(0, path.length - 4) + "_icon.jpg", Image.getPixels(m.image), m.image.width, m.image.height, 0, 50);
+				Krom.writeJpg(path.substr(0, path.length - 4) + "_icon.jpg", image_get_pixels(m.image), m.image.width, m.image.height, 0, 50);
 			}
 		}
 
@@ -272,7 +272,7 @@ class ExportArm {
 			ExportArm.packAssets(raw, assets);
 		}
 
-		let buffer = ArmPack.encode(raw);
+		let buffer = armpack_encode(raw);
 		Krom.fileSaveBytes(path, buffer, buffer.byteLength + 1);
 	}
 	///end
@@ -312,23 +312,23 @@ class ExportArm {
 			brush_nodes: bnodes,
 			brush_icons: isCloud ? null :
 			///if (krom_metal || krom_vulkan)
-			[Lz4.encode(ExportArm.bgraSwap(Image.getPixels(b.image)))],
+			[lz4_encode(ExportArm.bgraSwap(image_get_pixels(b.image)))],
 			///else
-			[Lz4.encode(Image.getPixels(b.image))],
+			[lz4_encode(image_get_pixels(b.image))],
 			///end
 			assets: texture_files,
 			packed_assets: packed_assets
 		};
 
 		if (Context.raw.writeIconOnExport) { // Separate icon file
-			Krom.writePng(path.substr(0, path.length - 4) + "_icon.png", Image.getPixels(b.image), b.image.width, b.image.height, 0);
+			Krom.writePng(path.substr(0, path.length - 4) + "_icon.png", image_get_pixels(b.image), b.image.width, b.image.height, 0);
 		}
 
 		if (Context.raw.packAssetsOnExport) { // Pack textures
 			ExportArm.packAssets(raw, assets);
 		}
 
-		let buffer = ArmPack.encode(raw);
+		let buffer = armpack_encode(raw);
 		Krom.fileSaveBytes(path, buffer, buffer.byteLength + 1);
 	}
 	///end
@@ -422,25 +422,25 @@ class ExportArm {
 		if (raw.packed_assets == null) {
 			raw.packed_assets = [];
 		}
-		let tempImages: ImageRaw[] = [];
+		let tempImages: image_t[] = [];
 		for (let i = 0; i < assets.length; ++i) {
 			if (!Project.packedAssetExists(raw.packed_assets, assets[i].file)) {
 				let image = Project.getImage(assets[i]);
-				let temp = Image.createRenderTarget(image.width, image.height);
-				Graphics2.begin(temp.g2, false);
-				Graphics2.drawImage(image, 0, 0);
-				Graphics2.end(temp.g2);
+				let temp = image_create_render_target(image.width, image.height);
+				g2_begin(temp.g2, false);
+				g2_draw_image(image, 0, 0);
+				g2_end(temp.g2);
 				tempImages.push(temp);
 				raw.packed_assets.push({
 					name: assets[i].file,
 					bytes: assets[i].file.endsWith(".jpg") ?
-						Krom.encodeJpg(Image.getPixels(temp), temp.width, temp.height, 0, 80) :
-						Krom.encodePng(Image.getPixels(temp), temp.width, temp.height, 0)
+						Krom.encodeJpg(image_get_pixels(temp), temp.width, temp.height, 0, 80) :
+						Krom.encodePng(image_get_pixels(temp), temp.width, temp.height, 0)
 				});
 			}
 		}
 		Base.notifyOnNextFrame(() => {
-			for (let image of tempImages) Image.unload(image);
+			for (let image of tempImages) image_unload(image);
 		});
 	}
 
@@ -450,11 +450,11 @@ class ExportArm {
 			version: manifest_version,
 			swatches: Project.raw.swatches
 		};
-		let buffer = ArmPack.encode(raw);
+		let buffer = armpack_encode(raw);
 		Krom.fileSaveBytes(path, buffer, buffer.byteLength + 1);
 	}
 
-	static vec3f32 = (v: TVec4): Float32Array => {
+	static vec3f32 = (v: vec4_t): Float32Array => {
 		let res = new Float32Array(3);
 		res[0] = v.x;
 		res[1] = v.y;

+ 1 - 1
base/Sources/ExportGpl.ts

@@ -12,6 +12,6 @@ class ExportGpl {
 			o += String(color_get_rb(swatch.base)) + " " + String(color_get_gb(swatch.base)) + " " + String(color_get_bb(swatch.base)) + "\n";
 		}
 
-		Krom.fileSaveBytes(path, System.stringToBuffer(o), o.length);
+		Krom.fileSaveBytes(path, sys_string_to_buffer(o), o.length);
 	}
 }

+ 60 - 60
base/Sources/ExportTexture.ts

@@ -94,7 +94,7 @@ class ExportTexture {
 		Context.raw.tool = WorkspaceTool.ToolFill;
 		MakeMaterial.parsePaintMaterial();
 		let _paintObject = Context.raw.paintObject;
-		let planeo: TMeshObject = Scene.getChild(".Plane").ext;
+		let planeo: TMeshObject = scene_get_child(".Plane").ext;
 		planeo.base.visible = true;
 		Context.raw.paintObject = planeo;
 		Context.raw.pdirty = 1;
@@ -123,7 +123,7 @@ class ExportTexture {
 		let textureSizeY = Config.getTextureResY();
 		let formatQuality = Context.raw.formatQuality;
 		///if (krom_android || krom_ios)
-		let f = System.title;
+		let f = sys_title();
 		///else
 		let f = UIFiles.filename;
 		///end
@@ -141,7 +141,7 @@ class ExportTexture {
 		Base.makeExportImg();
 		if (Base.pipeMerge == null) Base.makePipe();
 		if (ConstData.screenAlignedVB == null) ConstData.createScreenAlignedData();
-		let empty = RenderPath.renderTargets.get("empty_white").image;
+		let empty = render_path_render_targets.get("empty_white").image;
 
 		// Append object mask name
 		let exportSelected = Context.raw.layersExport == ExportMode.ExportSelected;
@@ -153,15 +153,15 @@ class ExportTexture {
 		}
 
 		// Clear export layer
-		Graphics4.begin(Base.expa.g4);
-		Graphics4.clear(color_from_floats(0.0, 0.0, 0.0, 0.0));
-		Graphics4.end();
-		Graphics4.begin(Base.expb.g4);
-		Graphics4.clear(color_from_floats(0.5, 0.5, 1.0, 0.0));
-		Graphics4.end();
-		Graphics4.begin(Base.expc.g4);
-		Graphics4.clear(color_from_floats(1.0, 0.0, 0.0, 0.0));
-		Graphics4.end();
+		g4_begin(Base.expa.g4);
+		g4_clear(color_from_floats(0.0, 0.0, 0.0, 0.0));
+		g4_end();
+		g4_begin(Base.expb.g4);
+		g4_clear(color_from_floats(0.5, 0.5, 1.0, 0.0));
+		g4_end();
+		g4_begin(Base.expc.g4);
+		g4_clear(color_from_floats(1.0, 0.0, 0.0, 0.0));
+		g4_end();
 
 		// Flatten layers
 		for (let l1 of layers) {
@@ -179,8 +179,8 @@ class ExportTexture {
 			if (l1masks != null && !bakeMaterial) {
 				if (l1masks.length > 1) {
 					Base.makeTempMaskImg();
-					Graphics2.begin(Base.tempMaskImage.g2, true, 0x00000000);
-					Graphics2.end(Base.tempMaskImage.g2);
+					g2_begin(Base.tempMaskImage.g2, true, 0x00000000);
+					g2_end(Base.tempMaskImage.g2);
 					let l1: any = { texpaint: Base.tempMaskImage };
 					for (let i = 0; i < l1masks.length; ++i) {
 						Base.mergeLayer(l1, l1masks[i]);
@@ -191,53 +191,53 @@ class ExportTexture {
 			}
 
 			if (l1.paintBase) {
-				Graphics2.begin(Base.tempImage.g2, false); // Copy to temp
+				g2_begin(Base.tempImage.g2, false); // Copy to temp
 				Base.tempImage.g2.pipeline = Base.pipeCopy;
-				Graphics2.drawImage(Base.expa, 0, 0);
+				g2_draw_image(Base.expa, 0, 0);
 				Base.tempImage.g2.pipeline = null;
-				Graphics2.end(Base.tempImage.g2);
-
-				Graphics4.begin(Base.expa.g4);
-				Graphics4.setPipeline(Base.pipeMerge);
-				Graphics4.setTexture(Base.tex0, l1.texpaint);
-				Graphics4.setTexture(Base.tex1, empty);
-				Graphics4.setTexture(Base.texmask, mask);
-				Graphics4.setTexture(Base.texa, Base.tempImage);
-				Graphics4.setFloat(Base.opac, SlotLayer.getOpacity(l1));
-				Graphics4.setInt(Base.blending, layers.length > 1 ? l1.blending : 0);
-				Graphics4.setVertexBuffer(ConstData.screenAlignedVB);
-				Graphics4.setIndexBuffer(ConstData.screenAlignedIB);
-				Graphics4.drawIndexedVertices();
-				Graphics4.end();
+				g2_end(Base.tempImage.g2);
+
+				g4_begin(Base.expa.g4);
+				g4_set_pipeline(Base.pipeMerge);
+				g4_set_tex(Base.tex0, l1.texpaint);
+				g4_set_tex(Base.tex1, empty);
+				g4_set_tex(Base.texmask, mask);
+				g4_set_tex(Base.texa, Base.tempImage);
+				g4_set_float(Base.opac, SlotLayer.getOpacity(l1));
+				g4_set_int(Base.blending, layers.length > 1 ? l1.blending : 0);
+				g4_set_vertex_buffer(ConstData.screenAlignedVB);
+				g4_set_index_buffer(ConstData.screenAlignedIB);
+				g4_draw();
+				g4_end();
 			}
 
 			if (l1.paintNor) {
-				Graphics2.begin(Base.tempImage.g2, false);
+				g2_begin(Base.tempImage.g2, false);
 				Base.tempImage.g2.pipeline = Base.pipeCopy;
-				Graphics2.drawImage(Base.expb, 0, 0);
+				g2_draw_image(Base.expb, 0, 0);
 				Base.tempImage.g2.pipeline = null;
-				Graphics2.end(Base.tempImage.g2);
-
-				Graphics4.begin(Base.expb.g4);
-				Graphics4.setPipeline(Base.pipeMerge);
-				Graphics4.setTexture(Base.tex0, l1.texpaint);
-				Graphics4.setTexture(Base.tex1, l1.texpaint_nor);
-				Graphics4.setTexture(Base.texmask, mask);
-				Graphics4.setTexture(Base.texa, Base.tempImage);
-				Graphics4.setFloat(Base.opac, SlotLayer.getOpacity(l1));
-				Graphics4.setInt(Base.blending, l1.paintNorBlend ? -2 : -1);
-				Graphics4.setVertexBuffer(ConstData.screenAlignedVB);
-				Graphics4.setIndexBuffer(ConstData.screenAlignedIB);
-				Graphics4.drawIndexedVertices();
-				Graphics4.end();
+				g2_end(Base.tempImage.g2);
+
+				g4_begin(Base.expb.g4);
+				g4_set_pipeline(Base.pipeMerge);
+				g4_set_tex(Base.tex0, l1.texpaint);
+				g4_set_tex(Base.tex1, l1.texpaint_nor);
+				g4_set_tex(Base.texmask, mask);
+				g4_set_tex(Base.texa, Base.tempImage);
+				g4_set_float(Base.opac, SlotLayer.getOpacity(l1));
+				g4_set_int(Base.blending, l1.paintNorBlend ? -2 : -1);
+				g4_set_vertex_buffer(ConstData.screenAlignedVB);
+				g4_set_index_buffer(ConstData.screenAlignedIB);
+				g4_draw();
+				g4_end();
 			}
 
 			if (l1.paintOcc || l1.paintRough || l1.paintMet || l1.paintHeight) {
-				Graphics2.begin(Base.tempImage.g2, false);
+				g2_begin(Base.tempImage.g2, false);
 				Base.tempImage.g2.pipeline = Base.pipeCopy;
-				Graphics2.drawImage(Base.expc, 0, 0);
+				g2_draw_image(Base.expc, 0, 0);
 				Base.tempImage.g2.pipeline = null;
-				Graphics2.end(Base.tempImage.g2);
+				g2_end(Base.tempImage.g2);
 
 				if (l1.paintOcc && l1.paintRough && l1.paintMet && l1.paintHeight) {
 					Base.commandsMergePack(Base.pipeMerge, Base.expc, l1.texpaint, l1.texpaint_pack, SlotLayer.getOpacity(l1), mask, l1.paintHeightBlend ? -3 : -1);
@@ -252,12 +252,12 @@ class ExportTexture {
 
 		///if krom_metal
 		// Flush command list
-		Graphics2.begin(Base.expa.g2, false);
-		Graphics2.end(Base.expa.g2);
-		Graphics2.begin(Base.expb.g2, false);
-		Graphics2.end(Base.expb.g2);
-		Graphics2.begin(Base.expc.g2, false);
-		Graphics2.end(Base.expc.g2);
+		g2_begin(Base.expa.g2, false);
+		g2_end(Base.expa.g2);
+		g2_begin(Base.expb.g2, false);
+		g2_end(Base.expb.g2);
+		g2_begin(Base.expc.g2, false);
+		g2_end(Base.expc.g2);
 		///end
 		///end
 
@@ -281,9 +281,9 @@ class ExportTexture {
 
 		for (let t of preset.textures) {
 			for (let c of t.channels) {
-				if      ((c == "base_r" || c == "base_g" || c == "base_b" || c == "opac") && pixpaint == null) pixpaint = Image.getPixels(texpaint);
-				else if ((c == "nor_r" || c == "nor_g" || c == "nor_g_directx" || c == "nor_b" || c == "emis" || c == "subs") && pixpaint_nor == null) pixpaint_nor = Image.getPixels(texpaint_nor);
-				else if ((c == "occ" || c == "rough" || c == "metal" || c == "height" || c == "smooth") && pixpaint_pack == null) pixpaint_pack = Image.getPixels(texpaint_pack);
+				if      ((c == "base_r" || c == "base_g" || c == "base_b" || c == "opac") && pixpaint == null) pixpaint = image_get_pixels(texpaint);
+				else if ((c == "nor_r" || c == "nor_g" || c == "nor_g_directx" || c == "nor_b" || c == "emis" || c == "subs") && pixpaint_nor == null) pixpaint_nor = image_get_pixels(texpaint_nor);
+				else if ((c == "occ" || c == "rough" || c == "metal" || c == "height" || c == "smooth") && pixpaint_pack == null) pixpaint_pack = image_get_pixels(texpaint_pack);
 			}
 		}
 
@@ -341,7 +341,7 @@ class ExportTexture {
 			}
 		}
 
-		// Release staging memory allocated in Image.getPixels()
+		// Release staging memory allocated in image_get_pixels()
 		texpaint.pixels = null;
 		texpaint_nor.pixels = null;
 		texpaint_pack.pixels = null;
@@ -360,7 +360,7 @@ class ExportTexture {
 		if (type == 2 && off == 3) format = 6; // AAA1
 
 		if (Context.raw.layersDestination == ExportDestination.DestinationPacked) {
-			let image = Image.fromBytes(pixels, resX, resY);
+			let image = image_from_bytes(pixels, resX, resY);
 			Data.cachedImages.set(file, image);
 			let ar = file.split(Path.sep);
 			let name = ar[ar.length - 1];

+ 1 - 1
base/Sources/File.ts

@@ -142,7 +142,7 @@ class File {
 			let files: string[] = [];
 			let sizes: i32[] = [];
 
-			let str = System.bufferToString(buffer);
+			let str = sys_buffer_to_string(buffer);
 			let pos_start = 0;
 			let pos_end = 0;
 

+ 2 - 2
base/Sources/Geom.ts

@@ -70,7 +70,7 @@ class Geom {
 		mesh.texa = new Int16Array(widthVerts * heightVerts * 2);
 		mesh.inda = new Uint32Array(widthSegments * heightSegments * 6 - widthSegments * 6);
 
-		let nor = Vec4.create();
+		let nor = vec4_create();
 		let pos = 0;
 		for (let y = 0; y < heightVerts; ++y) {
 			let v = y / heightSegments;
@@ -90,7 +90,7 @@ class Geom {
 				mesh.posa[i4    ] = Math.floor(vx * inv);
 				mesh.posa[i4 + 1] = Math.floor(vy * inv);
 				mesh.posa[i4 + 2] = Math.floor(vz * inv);
-				Vec4.normalize(Vec4.set(nor, vx, vy, vz));
+				vec4_normalize(vec4_set(nor, vx, vy, vz));
 				mesh.posa[i4 + 3] = Math.floor(nor.z * 32767);
 				mesh.nora[i2    ] = Math.floor(nor.x * 32767);
 				mesh.nora[i2 + 1] = Math.floor(nor.y * 32767);

+ 60 - 60
base/Sources/Gizmo.ts

@@ -3,10 +3,10 @@
 
 class Gizmo {
 
-	static v = Vec4.create();
-	static v0 = Vec4.create();
-	static q = Quat.create();
-	static q0 = Quat.create();
+	static v = vec4_create();
+	static v0 = vec4_create();
+	static q = quat_create();
+	static q0 = quat_create();
 
 	static update = () => {
 		let isObject = Context.raw.tool == WorkspaceTool.ToolGizmo;
@@ -25,25 +25,25 @@ class Gizmo {
 		///end
 
 		if (isObject) {
-			Vec4.setFrom(gizmo.transform.loc, paintObject.transform.loc);
+			vec4_set_from(gizmo.transform.loc, paintObject.transform.loc);
 		}
 		else if (isDecal) {
-			Vec4.set(gizmo.transform.loc, Context.raw.layer.decalMat._30, Context.raw.layer.decalMat._31, Context.raw.layer.decalMat._32);
+			vec4_set(gizmo.transform.loc, Context.raw.layer.decalMat._30, Context.raw.layer.decalMat._31, Context.raw.layer.decalMat._32);
 		}
-		let cam = Scene.camera;
+		let cam = scene_camera;
 		let fov = cam.data.fov;
-		let dist = Vec4.distance(cam.base.transform.loc, gizmo.transform.loc) / 8 * fov;
-		Vec4.set(gizmo.transform.scale, dist, dist, dist);
-		Vec4.set(Context.raw.gizmoTranslateX.transform.scale, dist, dist, dist);
-		Vec4.set(Context.raw.gizmoTranslateY.transform.scale, dist, dist, dist);
-		Vec4.set(Context.raw.gizmoTranslateZ.transform.scale, dist, dist, dist);
-		Vec4.set(Context.raw.gizmoScaleX.transform.scale, dist, dist, dist);
-		Vec4.set(Context.raw.gizmoScaleY.transform.scale, dist, dist, dist);
-		Vec4.set(Context.raw.gizmoScaleZ.transform.scale, dist, dist, dist);
-		Vec4.set(Context.raw.gizmoRotateX.transform.scale, dist, dist, dist);
-		Vec4.set(Context.raw.gizmoRotateY.transform.scale, dist, dist, dist);
-		Vec4.set(Context.raw.gizmoRotateZ.transform.scale, dist, dist, dist);
-		Transform.buildMatrix(gizmo.transform);
+		let dist = vec4_dist(cam.base.transform.loc, gizmo.transform.loc) / 8 * fov;
+		vec4_set(gizmo.transform.scale, dist, dist, dist);
+		vec4_set(Context.raw.gizmoTranslateX.transform.scale, dist, dist, dist);
+		vec4_set(Context.raw.gizmoTranslateY.transform.scale, dist, dist, dist);
+		vec4_set(Context.raw.gizmoTranslateZ.transform.scale, dist, dist, dist);
+		vec4_set(Context.raw.gizmoScaleX.transform.scale, dist, dist, dist);
+		vec4_set(Context.raw.gizmoScaleY.transform.scale, dist, dist, dist);
+		vec4_set(Context.raw.gizmoScaleZ.transform.scale, dist, dist, dist);
+		vec4_set(Context.raw.gizmoRotateX.transform.scale, dist, dist, dist);
+		vec4_set(Context.raw.gizmoRotateY.transform.scale, dist, dist, dist);
+		vec4_set(Context.raw.gizmoRotateZ.transform.scale, dist, dist, dist);
+		transform_build_matrix(gizmo.transform);
 
 		// Scene control
 		if (isObject) {
@@ -67,20 +67,20 @@ class Gizmo {
 					paintObject.transform.scale.z += Context.raw.gizmoDrag - Context.raw.gizmoDragLast;
 				}
 				else if (Context.raw.rotateX) {
-					Quat.fromAxisAngle(Gizmo.q0, Vec4.xAxis(), Context.raw.gizmoDrag - Context.raw.gizmoDragLast);
-					Quat.mult(paintObject.transform.rot, Gizmo.q0);
+					quat_from_axis_angle(Gizmo.q0, vec4_x_axis(), Context.raw.gizmoDrag - Context.raw.gizmoDragLast);
+					quat_mult(paintObject.transform.rot, Gizmo.q0);
 				}
 				else if (Context.raw.rotateY) {
-					Quat.fromAxisAngle(Gizmo.q0, Vec4.yAxis(), Context.raw.gizmoDrag - Context.raw.gizmoDragLast);
-					Quat.mult(paintObject.transform.rot, Gizmo.q0);
+					quat_from_axis_angle(Gizmo.q0, vec4_y_axis(), Context.raw.gizmoDrag - Context.raw.gizmoDragLast);
+					quat_mult(paintObject.transform.rot, Gizmo.q0);
 				}
 				else if (Context.raw.rotateZ) {
-					Quat.fromAxisAngle(Gizmo.q0, Vec4.zAxis(), Context.raw.gizmoDrag - Context.raw.gizmoDragLast);
-					Quat.mult(paintObject.transform.rot, Gizmo.q0);
+					quat_from_axis_angle(Gizmo.q0, vec4_z_axis(), Context.raw.gizmoDrag - Context.raw.gizmoDragLast);
+					quat_mult(paintObject.transform.rot, Gizmo.q0);
 				}
 				Context.raw.gizmoDragLast = Context.raw.gizmoDrag;
 
-				Transform.buildMatrix(paintObject.transform);
+				transform_build_matrix(paintObject.transform);
 				///if arm_physics
 				let pb = (paintObject as any).physicsBody;
 				if (pb != null) pb.syncTransform();
@@ -100,37 +100,37 @@ class Gizmo {
 					Context.raw.layer.decalMat._32 = Context.raw.gizmoDrag;
 				}
 				else if (Context.raw.scaleX) {
-					Mat4.decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+					mat4_decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
 					Gizmo.v0.x += Context.raw.gizmoDrag - Context.raw.gizmoDragLast;
-					Mat4.compose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+					mat4_compose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
 				}
 				else if (Context.raw.scaleY) {
-					Mat4.decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+					mat4_decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
 					Gizmo.v0.y += Context.raw.gizmoDrag - Context.raw.gizmoDragLast;
-					Mat4.compose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+					mat4_compose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
 				}
 				else if (Context.raw.scaleZ) {
-					Mat4.decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+					mat4_decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
 					Gizmo.v0.z += Context.raw.gizmoDrag - Context.raw.gizmoDragLast;
-					Mat4.compose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+					mat4_compose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
 				}
 				else if (Context.raw.rotateX) {
-					Mat4.decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
-					Quat.fromAxisAngle(Gizmo.q0, Vec4.xAxis(), -Context.raw.gizmoDrag + Context.raw.gizmoDragLast);
-					Quat.multquats(Gizmo.q, Gizmo.q0, Gizmo.q);
-					Mat4.compose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+					mat4_decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+					quat_from_axis_angle(Gizmo.q0, vec4_x_axis(), -Context.raw.gizmoDrag + Context.raw.gizmoDragLast);
+					quat_mult_quats(Gizmo.q, Gizmo.q0, Gizmo.q);
+					mat4_compose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
 				}
 				else if (Context.raw.rotateY) {
-					Mat4.decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
-					Quat.fromAxisAngle(Gizmo.q0, Vec4.yAxis(), -Context.raw.gizmoDrag + Context.raw.gizmoDragLast);
-					Quat.multquats(Gizmo.q, Gizmo.q0, Gizmo.q);
-					Mat4.compose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+					mat4_decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+					quat_from_axis_angle(Gizmo.q0, vec4_y_axis(), -Context.raw.gizmoDrag + Context.raw.gizmoDragLast);
+					quat_mult_quats(Gizmo.q, Gizmo.q0, Gizmo.q);
+					mat4_compose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
 				}
 				else if (Context.raw.rotateZ) {
-					Mat4.decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
-					Quat.fromAxisAngle(Gizmo.q0, Vec4.zAxis(), Context.raw.gizmoDrag - Context.raw.gizmoDragLast);
-					Quat.multquats(Gizmo.q, Gizmo.q0, Gizmo.q);
-					Mat4.compose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+					mat4_decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+					quat_from_axis_angle(Gizmo.q0, vec4_z_axis(), Context.raw.gizmoDrag - Context.raw.gizmoDragLast);
+					quat_mult_quats(Gizmo.q, Gizmo.q0, Gizmo.q);
+					mat4_compose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
 				}
 				Context.raw.gizmoDragLast = Context.raw.gizmoDrag;
 
@@ -142,11 +142,11 @@ class Gizmo {
 		}
 
 		Context.raw.gizmoStarted = false;
-		if (Mouse.started("left") && paintObject.name != "Scene") {
+		if (mouse_started("left") && paintObject.name != "Scene") {
 			// Translate, scale
 			let trs = [Context.raw.gizmoTranslateX.transform, Context.raw.gizmoTranslateY.transform, Context.raw.gizmoTranslateZ.transform,
 					   Context.raw.gizmoScaleX.transform, Context.raw.gizmoScaleY.transform, Context.raw.gizmoScaleZ.transform];
-			let hit = RayCaster.closestBoxIntersect(trs, Mouse.viewX, Mouse.viewY, Scene.camera);
+			let hit = raycast_closest_box_intersect(trs, mouse_view_x(), mouse_view_y(), scene_camera);
 			if (hit != null) {
 				if (hit.object == Context.raw.gizmoTranslateX) Context.raw.translateX = true;
 				else if (hit.object == Context.raw.gizmoTranslateY) Context.raw.translateY = true;
@@ -162,7 +162,7 @@ class Gizmo {
 			else {
 				// Rotate
 				let trs = [Context.raw.gizmoRotateX.transform, Context.raw.gizmoRotateY.transform, Context.raw.gizmoRotateZ.transform];
-				let hit = RayCaster.closestBoxIntersect(trs, Mouse.viewX, Mouse.viewY, Scene.camera);
+				let hit = raycast_closest_box_intersect(trs, mouse_view_x(), mouse_view_y(), scene_camera);
 				if (hit != null) {
 					if (hit.object == Context.raw.gizmoRotateX) Context.raw.rotateX = true;
 					else if (hit.object == Context.raw.gizmoRotateY) Context.raw.rotateY = true;
@@ -174,7 +174,7 @@ class Gizmo {
 				}
 			}
 		}
-		else if (Mouse.released("left")) {
+		else if (mouse_released("left")) {
 			Context.raw.translateX = Context.raw.translateY = Context.raw.translateZ = false;
 			Context.raw.scaleX = Context.raw.scaleY = Context.raw.scaleZ = false;
 			Context.raw.rotateX = Context.raw.rotateY = Context.raw.rotateZ = false;
@@ -185,58 +185,58 @@ class Gizmo {
 
 			if (isObject) {
 				let t = paintObject.transform;
-				Vec4.set(Gizmo.v, Transform.worldx(t), Transform.worldy(t), Transform.worldz(t));
+				vec4_set(Gizmo.v, transform_world_x(t), transform_world_y(t), transform_world_z(t));
 			}
 			else if (isDecal) {
-				Vec4.set(Gizmo.v, Context.raw.layer.decalMat._30, Context.raw.layer.decalMat._31, Context.raw.layer.decalMat._32);
+				vec4_set(Gizmo.v, Context.raw.layer.decalMat._30, Context.raw.layer.decalMat._31, Context.raw.layer.decalMat._32);
 			}
 
 			if (Context.raw.translateX || Context.raw.scaleX) {
-				let hit = RayCaster.planeIntersect(Vec4.yAxis(), Gizmo.v, Mouse.viewX, Mouse.viewY, Scene.camera);
+				let hit = raycast_plane_intersect(vec4_y_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
 				if (hit != null) {
 					if (Context.raw.gizmoStarted) Context.raw.gizmoOffset = hit.x - Gizmo.v.x;
 					Context.raw.gizmoDrag = hit.x - Context.raw.gizmoOffset;
 				}
 			}
 			else if (Context.raw.translateY || Context.raw.scaleY) {
-				let hit = RayCaster.planeIntersect(Vec4.xAxis(), Gizmo.v, Mouse.viewX, Mouse.viewY, Scene.camera);
+				let hit = raycast_plane_intersect(vec4_x_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
 				if (hit != null) {
 					if (Context.raw.gizmoStarted) Context.raw.gizmoOffset = hit.y - Gizmo.v.y;
 					Context.raw.gizmoDrag = hit.y - Context.raw.gizmoOffset;
 				}
 			}
 			else if (Context.raw.translateZ || Context.raw.scaleZ) {
-				let hit = RayCaster.planeIntersect(Vec4.xAxis(), Gizmo.v, Mouse.viewX, Mouse.viewY, Scene.camera);
+				let hit = raycast_plane_intersect(vec4_x_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
 				if (hit != null) {
 					if (Context.raw.gizmoStarted) Context.raw.gizmoOffset = hit.z - Gizmo.v.z;
 					Context.raw.gizmoDrag = hit.z - Context.raw.gizmoOffset;
 				}
 			}
 			else if (Context.raw.rotateX) {
-				let hit = RayCaster.planeIntersect(Vec4.xAxis(), Gizmo.v, Mouse.viewX, Mouse.viewY, Scene.camera);
+				let hit = raycast_plane_intersect(vec4_x_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
 				if (hit != null) {
 					if (Context.raw.gizmoStarted) {
-						Mat4.decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+						mat4_decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
 						Context.raw.gizmoOffset = Math.atan2(hit.y - Gizmo.v.y, hit.z - Gizmo.v.z);
 					}
 					Context.raw.gizmoDrag = Math.atan2(hit.y - Gizmo.v.y, hit.z - Gizmo.v.z) - Context.raw.gizmoOffset;
 				}
 			}
 			else if (Context.raw.rotateY) {
-				let hit = RayCaster.planeIntersect(Vec4.yAxis(), Gizmo.v, Mouse.viewX, Mouse.viewY, Scene.camera);
+				let hit = raycast_plane_intersect(vec4_y_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
 				if (hit != null) {
 					if (Context.raw.gizmoStarted) {
-						Mat4.decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+						mat4_decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
 						Context.raw.gizmoOffset = Math.atan2(hit.z - Gizmo.v.z, hit.x - Gizmo.v.x);
 					}
 					Context.raw.gizmoDrag = Math.atan2(hit.z - Gizmo.v.z, hit.x - Gizmo.v.x) - Context.raw.gizmoOffset;
 				}
 			}
 			else if (Context.raw.rotateZ) {
-				let hit = RayCaster.planeIntersect(Vec4.zAxis(), Gizmo.v, Mouse.viewX, Mouse.viewY, Scene.camera);
+				let hit = raycast_plane_intersect(vec4_z_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
 				if (hit != null) {
 					if (Context.raw.gizmoStarted) {
-						Mat4.decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
+						mat4_decompose(Context.raw.layer.decalMat, Gizmo.v, Gizmo.q, Gizmo.v0);
 						Context.raw.gizmoOffset = Math.atan2(hit.y - Gizmo.v.y, hit.x - Gizmo.v.x);
 					}
 					Context.raw.gizmoDrag = Math.atan2(hit.y - Gizmo.v.y, hit.x - Gizmo.v.x) - Context.raw.gizmoOffset;
@@ -251,7 +251,7 @@ class Gizmo {
 			///end
 		}
 
-		Input.occupied = (Context.raw.translateX || Context.raw.translateY || Context.raw.translateZ || Context.raw.scaleX || Context.raw.scaleY || Context.raw.scaleZ || Context.raw.rotateX || Context.raw.rotateY || Context.raw.rotateZ) && Mouse.viewX < Base.w();
+		_input_occupied = (Context.raw.translateX || Context.raw.translateY || Context.raw.translateZ || Context.raw.scaleX || Context.raw.scaleY || Context.raw.scaleZ || Context.raw.rotateX || Context.raw.rotateY || Context.raw.rotateZ) && mouse_view_x() < Base.w();
 	}
 }
 

+ 11 - 15
base/Sources/History.ts

@@ -181,7 +181,7 @@ class History {
 				MakeMaterial.parseMeshMaterial();
 			}
 			else if (step.name == tr("Delete Node Group")) {
-				Project.materialGroups.splice(step.canvas_group, 0, { canvas: null, nodes: new Nodes() });
+				Project.materialGroups.splice(step.canvas_group, 0, { canvas: null, nodes: Nodes.create() });
 				History.swapCanvas(step);
 			}
 			else if (step.name == tr("New Material")) {
@@ -194,7 +194,6 @@ class History {
 				Project.materials.splice(step.material, 0, Context.raw.material);
 				Context.raw.material.canvas = step.canvas;
 				UINodes.canvasChanged();
-				UINodes.getNodes().handle = new Handle();
 				UINodes.hwnd.redraws = 2;
 			}
 			else if (step.name == tr("Duplicate Material")) {
@@ -380,7 +379,6 @@ class History {
 				Project.materials.splice(step.material, 0, Context.raw.material);
 				Context.raw.material.canvas = step.canvas;
 				UINodes.canvasChanged();
-				UINodes.getNodes().handle = new Handle();
 				UINodes.hwnd.redraws = 2;
 			}
 			else if (step.name == tr("Delete Material")) {
@@ -393,7 +391,6 @@ class History {
 				Project.materials.splice(step.material, 0, Context.raw.material);
 				Context.raw.material.canvas = step.canvas;
 				UINodes.canvasChanged();
-				UINodes.getNodes().handle = new Handle();
 				UINodes.hwnd.redraws = 2;
 			}
 			else { // Paint operation
@@ -593,7 +590,7 @@ class History {
 	static push = (name: string): TStep => {
 		///if (krom_windows || krom_linux || krom_darwin)
 		let filename = Project.filepath == "" ? UIFiles.filename : Project.filepath.substring(Project.filepath.lastIndexOf(Path.sep) + 1, Project.filepath.length - 4);
-		System.title = filename + "* - " + manifest_title;
+		sys_title_set(filename + "* - " + manifest_title);
 		///end
 
 		if (Config.raw.touch_ui) {
@@ -669,17 +666,17 @@ class History {
 		///end
 
 		if (isMask) {
-			RenderPath.setTarget("texpaint_undo" + toId);
-			RenderPath.bindTarget("texpaint" + fromId, "tex");
-			// RenderPath.drawShader("shader_datas/copy_pass/copyR8_pass");
-			RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
+			render_path_set_target("texpaint_undo" + toId);
+			render_path_bind_target("texpaint" + fromId, "tex");
+			// render_path_draw_shader("shader_datas/copy_pass/copyR8_pass");
+			render_path_draw_shader("shader_datas/copy_pass/copy_pass");
 		}
 		else {
-			RenderPath.setTarget("texpaint_undo" + toId, ["texpaint_nor_undo" + toId, "texpaint_pack_undo" + toId]);
-			RenderPath.bindTarget("texpaint" + fromId, "tex0");
-			RenderPath.bindTarget("texpaint_nor" + fromId, "tex1");
-			RenderPath.bindTarget("texpaint_pack" + fromId, "tex2");
-			RenderPath.drawShader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
+			render_path_set_target("texpaint_undo" + toId, ["texpaint_nor_undo" + toId, "texpaint_pack_undo" + toId]);
+			render_path_bind_target("texpaint" + fromId, "tex0");
+			render_path_bind_target("texpaint_nor" + fromId, "tex1");
+			render_path_bind_target("texpaint_pack" + fromId, "tex2");
+			render_path_draw_shader("shader_datas/copy_mrt3_pass/copy_mrt3_pass");
 		}
 		History.undoI = (History.undoI + 1) % Config.raw.undo_steps;
 	}
@@ -720,7 +717,6 @@ class History {
 		///end
 
 		UINodes.canvasChanged();
-		UINodes.getNodes().handle = new Handle();
 		UINodes.hwnd.redraws = 2;
 	}
 }

+ 58 - 58
base/Sources/ImportArm.ts

@@ -3,7 +3,7 @@ class ImportArm {
 
 	static runProject = (path: string) => {
 		Data.getBlob(path, (b: ArrayBuffer) => {
-			let project: TProjectFormat = ArmPack.decode(b);
+			let project: TProjectFormat = armpack_decode(b);
 
 			///if (is_paint || is_sculpt)
 			if (project.version != null && project.layer_datas == null) {
@@ -35,9 +35,9 @@ class ImportArm {
 			Project.filepath = path;
 			UIFiles.filename = path.substring(path.lastIndexOf(Path.sep) + 1, path.lastIndexOf("."));
 			///if (krom_android || krom_ios)
-			System.title = UIFiles.filename;
+			sys_title_set(UIFiles.filename);
 			///else
-			System.title = UIFiles.filename + " - " + manifest_title;
+			sys_title_set(UIFiles.filename + " - " + manifest_title);
 			///end
 
 			///if (is_paint || is_sculpt)
@@ -75,13 +75,13 @@ class ImportArm {
 				Project.raw.envmap = Data.isAbsolute(Project.raw.envmap) ? Project.raw.envmap : base + Project.raw.envmap;
 			}
 			if (Project.raw.envmap_strength != null) {
-				Scene.world.strength = Project.raw.envmap_strength;
+				scene_world.strength = Project.raw.envmap_strength;
 			}
 			if (Project.raw.camera_world != null) {
-				Scene.camera.base.transform.local = Mat4.fromFloat32Array(Project.raw.camera_world);
-				Transform.decompose(Scene.camera.base.transform);
-				Scene.camera.data.fov = Project.raw.camera_fov;
-				CameraObject.buildProjection(Scene.camera);
+				scene_camera.base.transform.local = mat4_from_f32_array(Project.raw.camera_world);
+				transform_decompose(scene_camera.base.transform);
+				scene_camera.data.fov = Project.raw.camera_fov;
+				CameraObject.buildProjection(scene_camera);
 				let origin = Project.raw.camera_origin;
 				Camera.origins[0].x = origin[0];
 				Camera.origins[0].y = origin[1];
@@ -126,16 +126,16 @@ class ImportArm {
 
 			// Synchronous for now
 			///if (is_paint || is_sculpt)
-			MeshData.create(project.mesh_datas[0], (md: TMeshData) => {
+			MeshData.create(project.mesh_datas[0], (md: mesh_data_t) => {
 			///end
 
 			///if is_lab
-			MeshData.create(project.mesh_data, (md: TMeshData) => {
+			MeshData.create(project.mesh_data, (md: mesh_data_t) => {
 			///end
 
 				MeshObject.setData(Context.raw.paintObject, md);
-				Vec4.set(Context.raw.paintObject.base.transform.scale, 1, 1, 1);
-				Transform.buildMatrix(Context.raw.paintObject.base.transform);
+				vec4_set(Context.raw.paintObject.base.transform.scale, 1, 1, 1);
+				transform_build_matrix(Context.raw.paintObject.base.transform);
 				Context.raw.paintObject.base.name = md.name;
 				Project.paintObjects = [Context.raw.paintObject];
 			});
@@ -143,8 +143,8 @@ class ImportArm {
 			///if (is_paint || is_sculpt)
 			for (let i = 1; i < project.mesh_datas.length; ++i) {
 				let raw = project.mesh_datas[i];
-				MeshData.create(raw, (md: TMeshData) => {
-					let object = Scene.addMeshObject(md, Context.raw.paintObject.materials, Context.raw.paintObject.base);
+				MeshData.create(raw, (md: mesh_data_t) => {
+					let object = scene_add_mesh_object(md, Context.raw.paintObject.materials, Context.raw.paintObject.base);
 					object.base.name = md.name;
 					object.skip_context = "paint";
 					Project.paintObjects.push(object);
@@ -175,21 +175,21 @@ class ImportArm {
 			let tex = Project.layers[0].texpaint;
 			if (tex.width != Config.getTextureResX() || tex.height != Config.getTextureResY()) {
 				if (History.undoLayers != null) for (let l of History.undoLayers) SlotLayer.resizeAndSetBits(l);
-				let rts = RenderPath.renderTargets;
+				let rts = render_path_render_targets;
 				let _texpaint_blend0 = rts.get("texpaint_blend0").image;
 				Base.notifyOnNextFrame(() => {
-					Image.unload(_texpaint_blend0);
+					image_unload(_texpaint_blend0);
 				});
 				rts.get("texpaint_blend0").width = Config.getTextureResX();
 				rts.get("texpaint_blend0").height = Config.getTextureResY();
-				rts.get("texpaint_blend0").image = Image.createRenderTarget(Config.getTextureResX(), Config.getTextureResY(), TextureFormat.R8, DepthStencilFormat.NoDepthAndStencil);
+				rts.get("texpaint_blend0").image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), TextureFormat.R8, DepthFormat.NoDepthAndStencil);
 				let _texpaint_blend1 = rts.get("texpaint_blend1").image;
 				Base.notifyOnNextFrame(() => {
-					Image.unload(_texpaint_blend1);
+					image_unload(_texpaint_blend1);
 				});
 				rts.get("texpaint_blend1").width = Config.getTextureResX();
 				rts.get("texpaint_blend1").height = Config.getTextureResY();
-				rts.get("texpaint_blend1").image = Image.createRenderTarget(Config.getTextureResX(), Config.getTextureResY(), TextureFormat.R8, DepthStencilFormat.NoDepthAndStencil);
+				rts.get("texpaint_blend1").image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), TextureFormat.R8, DepthFormat.NoDepthAndStencil);
 				Context.raw.brushBlendDirty = true;
 			}
 
@@ -214,52 +214,52 @@ class ImportArm {
 				if (!isGroup) {
 					if (Base.pipeMerge == null) Base.makePipe();
 
-					let _texpaint: ImageRaw = null;
+					let _texpaint: image_t = null;
 
 					///if is_paint
-					let _texpaint_nor: ImageRaw = null;
-					let _texpaint_pack: ImageRaw = null;
+					let _texpaint_nor: image_t = null;
+					let _texpaint_pack: image_t = null;
 					///end
 
 					if (isMask) {
-						_texpaint = Image.fromBytes(Lz4.decode(ld.texpaint, ld.res * ld.res * 4), ld.res, ld.res, TextureFormat.RGBA32);
-						Graphics2.begin(l.texpaint.g2, false);
+						_texpaint = image_from_bytes(lz4_decode(ld.texpaint, ld.res * ld.res * 4), ld.res, ld.res, TextureFormat.RGBA32);
+						g2_begin(l.texpaint.g2, false);
 						// l.texpaint.g2.pipeline = Base.pipeCopy8;
 						l.texpaint.g2.pipeline = project.is_bgra ? Base.pipeCopyBGRA : Base.pipeCopy; // Full bits for undo support, R8 is used
-						Graphics2.drawImage(_texpaint, 0, 0);
+						g2_draw_image(_texpaint, 0, 0);
 						l.texpaint.g2.pipeline = null;
-						Graphics2.end(l.texpaint.g2);
+						g2_end(l.texpaint.g2);
 					}
 					else { // Layer
 						// TODO: create render target from bytes
-						_texpaint = Image.fromBytes(Lz4.decode(ld.texpaint, ld.res * ld.res * 4 * bytesPerPixel), ld.res, ld.res, format);
-						Graphics2.begin(l.texpaint.g2, false);
+						_texpaint = image_from_bytes(lz4_decode(ld.texpaint, ld.res * ld.res * 4 * bytesPerPixel), ld.res, ld.res, format);
+						g2_begin(l.texpaint.g2, false);
 						l.texpaint.g2.pipeline = project.is_bgra ? Base.pipeCopyBGRA : Base.pipeCopy;
-						Graphics2.drawImage(_texpaint, 0, 0);
+						g2_draw_image(_texpaint, 0, 0);
 						l.texpaint.g2.pipeline = null;
-						Graphics2.end(l.texpaint.g2);
+						g2_end(l.texpaint.g2);
 
 						///if is_paint
-						_texpaint_nor = Image.fromBytes(Lz4.decode(ld.texpaint_nor, ld.res * ld.res * 4 * bytesPerPixel), ld.res, ld.res, format);
-						Graphics2.begin(l.texpaint_nor.g2, false);
+						_texpaint_nor = image_from_bytes(lz4_decode(ld.texpaint_nor, ld.res * ld.res * 4 * bytesPerPixel), ld.res, ld.res, format);
+						g2_begin(l.texpaint_nor.g2, false);
 						l.texpaint_nor.g2.pipeline = project.is_bgra ? Base.pipeCopyBGRA : Base.pipeCopy;
-						Graphics2.drawImage(_texpaint_nor, 0, 0);
+						g2_draw_image(_texpaint_nor, 0, 0);
 						l.texpaint_nor.g2.pipeline = null;
-						Graphics2.end(l.texpaint_nor.g2);
+						g2_end(l.texpaint_nor.g2);
 
-						_texpaint_pack = Image.fromBytes(Lz4.decode(ld.texpaint_pack, ld.res * ld.res * 4 * bytesPerPixel), ld.res, ld.res, format);
-						Graphics2.begin(l.texpaint_pack.g2, false);
+						_texpaint_pack = image_from_bytes(lz4_decode(ld.texpaint_pack, ld.res * ld.res * 4 * bytesPerPixel), ld.res, ld.res, format);
+						g2_begin(l.texpaint_pack.g2, false);
 						l.texpaint_pack.g2.pipeline = project.is_bgra ? Base.pipeCopyBGRA : Base.pipeCopy;
-						Graphics2.drawImage(_texpaint_pack, 0, 0);
+						g2_draw_image(_texpaint_pack, 0, 0);
 						l.texpaint_pack.g2.pipeline = null;
-						Graphics2.end(l.texpaint_pack.g2);
+						g2_end(l.texpaint_pack.g2);
 						///end
 					}
 
 					l.scale = ld.uv_scale;
 					l.angle = ld.uv_rot;
 					l.uvType = ld.uv_type;
-					if (ld.decal_mat != null) l.decalMat = Mat4.fromFloat32Array(ld.decal_mat);
+					if (ld.decal_mat != null) l.decalMat = mat4_from_f32_array(ld.decal_mat);
 					l.maskOpacity = ld.opacity_mask;
 					l.objectMask = ld.object_mask;
 					l.blending = ld.blending;
@@ -279,10 +279,10 @@ class ImportArm {
 					///end
 
 					Base.notifyOnNextFrame(() => {
-						Image.unload(_texpaint);
+						image_unload(_texpaint);
 						///if is_paint
-						if (_texpaint_nor != null) Image.unload(_texpaint_nor);
-						if (_texpaint_pack != null) Image.unload(_texpaint_pack);
+						if (_texpaint_nor != null) image_unload(_texpaint_nor);
+						if (_texpaint_pack != null) image_unload(_texpaint_pack);
 						///end
 					});
 				}
@@ -299,8 +299,8 @@ class ImportArm {
 			Context.setLayer(Project.layers[0]);
 
 			// Materials
-			let m0: TMaterialData = null;
-			Data.getMaterial("Scene", "Material", (m: TMaterialData) => {
+			let m0: material_data_t = null;
+			Data.getMaterial("Scene", "Material", (m: material_data_t) => {
 				m0 = m;
 			});
 
@@ -316,7 +316,7 @@ class ImportArm {
 			UINodes.groupStack = [];
 			Project.materialGroups = [];
 			if (project.material_groups != null) {
-				for (let g of project.material_groups) Project.materialGroups.push({ canvas: g, nodes: new Nodes() });
+				for (let g of project.material_groups) Project.materialGroups.push({ canvas: g, nodes: Nodes.create() });
 			}
 
 			///if (is_paint || is_sculpt)
@@ -361,24 +361,24 @@ class ImportArm {
 	}
 
 	///if (is_paint || is_sculpt)
-	static runMesh = (raw: TSceneFormat) => {
+	static runMesh = (raw: scene_t) => {
 		Project.paintObjects = [];
 		for (let i = 0; i < raw.mesh_datas.length; ++i) {
-			MeshData.create(raw.mesh_datas[i], (md: TMeshData) => {
+			MeshData.create(raw.mesh_datas[i], (md: mesh_data_t) => {
 				let object: TMeshObject = null;
 				if (i == 0) {
 					MeshObject.setData(Context.raw.paintObject, md);
 					object = Context.raw.paintObject;
 				}
 				else {
-					object = Scene.addMeshObject(md, Context.raw.paintObject.materials, Context.raw.paintObject.base);
+					object = scene_add_mesh_object(md, Context.raw.paintObject.materials, Context.raw.paintObject.base);
 					object.base.name = md.name;
 					object.skip_context = "paint";
 					md._handle = md.name;
 					Data.cachedMeshes.set(md._handle, md);
 				}
-				Vec4.set(object.base.transform.scale, 1, 1, 1);
-				Transform.buildMatrix(object.base.transform);
+				vec4_set(object.base.transform.scale, 1, 1, 1);
+				transform_build_matrix(object.base.transform);
 				object.base.name = md.name;
 				Project.paintObjects.push(object);
 				UtilMesh.mergeMesh();
@@ -391,7 +391,7 @@ class ImportArm {
 
 	static runMaterial = (path: string) => {
 		Data.getBlob(path, (b: ArrayBuffer) => {
-			let project: TProjectFormat = ArmPack.decode(b);
+			let project: TProjectFormat = armpack_decode(b);
 			if (project.version == null) { Data.deleteBlob(path); return; }
 			ImportArm.runMaterialFromProject(project, path);
 		});
@@ -417,8 +417,8 @@ class ImportArm {
 			ImportTexture.run(abs);
 		}
 
-		let m0: TMaterialData = null;
-		Data.getMaterial("Scene", "Material", (m: TMaterialData) => {
+		let m0: material_data_t = null;
+		Data.getMaterial("Scene", "Material", (m: material_data_t) => {
 			m0 = m;
 		});
 
@@ -436,7 +436,7 @@ class ImportArm {
 			for (let c of project.material_groups) {
 				while (ImportArm.groupExists(c)) ImportArm.renameGroup(c.name, imported, project.material_groups); // Ensure unique group name
 				ImportArm.initNodes(c.nodes);
-				Project.materialGroups.push({ canvas: c, nodes: new Nodes() });
+				Project.materialGroups.push({ canvas: c, nodes: Nodes.create() });
 			}
 		}
 
@@ -477,7 +477,7 @@ class ImportArm {
 
 	static runBrush = (path: string) => {
 		Data.getBlob(path, (b: ArrayBuffer) => {
-			let project: TProjectFormat = ArmPack.decode(b);
+			let project: TProjectFormat = armpack_decode(b);
 			if (project.version == null) { Data.deleteBlob(path); return; }
 			ImportArm.runBrushFromProject(project, path);
 		});
@@ -527,7 +527,7 @@ class ImportArm {
 
 	static runSwatches = (path: string, replaceExisting = false) => {
 		Data.getBlob(path, (b: ArrayBuffer) => {
-			let project: TProjectFormat = ArmPack.decode(b);
+			let project: TProjectFormat = armpack_decode(b);
 			if (project.version == null) { Data.deleteBlob(path); return; }
 			ImportArm.runSwatchesFromProject(project, path, replaceExisting);
 		});
@@ -558,7 +558,7 @@ class ImportArm {
 		b[1] = 0;
 		b[2] = 255;
 		b[3] = 255;
-		let pink = Image.fromBytes(b.buffer, 1, 1);
+		let pink = image_from_bytes(b.buffer, 1, 1);
 		Data.cachedImages.set(abs, pink);
 	}
 
@@ -595,7 +595,7 @@ class ImportArm {
 				if (!Project.packedAssetExists(Project.raw.packed_assets, pa.name)) {
 					Project.raw.packed_assets.push(pa);
 				}
-				Image.fromEncodedBytes(pa.bytes, pa.name.endsWith(".jpg") ? ".jpg" : ".png", (image: ImageRaw) => {
+				image_from_encoded_bytes(pa.bytes, pa.name.endsWith(".jpg") ? ".jpg" : ".png", (image: image_t) => {
 					Data.cachedImages.set(abs, image);
 				}, null, false);
 				break;

+ 2 - 2
base/Sources/ImportBlendMaterial.ts

@@ -36,7 +36,7 @@ class ImportBlendMaterial {
 				}
 				for (let n of canvas.nodes) {
 					if (n.name == "RGB") {
-						nodes.removeNode(n, canvas);
+						Nodes.removeNode(n, canvas);
 						break;
 					}
 				}
@@ -226,7 +226,7 @@ class ImportBlendMaterial {
 
 						if (valid) {
 							let raw: TNodeLink = {
-								id: nodes.getLinkId(canvas.links),
+								id: Nodes.getLinkId(canvas.links),
 								from_id: from_id,
 								from_socket: from_socket,
 								to_id: to_id,

+ 40 - 40
base/Sources/ImportBlendMesh.ts

@@ -80,9 +80,9 @@ class ImportBlendMesh {
 				let cola = hascol ? new Int16Array(numtri * 3 * 3) : null;
 
 				let tri = 0;
-				let vec0 = Vec4.create();
-				let vec1 = Vec4.create();
-				let vec2 = Vec4.create();
+				let vec0 = vec4_create();
+				let vec1 = vec4_create();
+				let vec2 = vec4_create();
 				for (let i = 0; i < totpoly; ++i) {
 					let poly = BlHandle.get(m, "mpoly", i);
 					// let smooth = BlHandle.get(poly, "flag") & 1 == 1; // ME_SMOOTH
@@ -97,8 +97,8 @@ class ImportBlendMesh {
 						let no0 = BlHandle.get(v0, "no");
 						let no1 = BlHandle.get(v1, "no");
 						if (smooth) {
-							Vec4.normalize(Vec4.set(vec0, no0[0] / 32767, no0[1] / 32767, no0[2] / 32767)); // shortmax
-							Vec4.normalize(Vec4.set(vec1, no1[0] / 32767, no1[1] / 32767, no1[2] / 32767));
+							vec4_normalize(vec4_set(vec0, no0[0] / 32767, no0[1] / 32767, no0[2] / 32767)); // shortmax
+							vec4_normalize(vec4_set(vec1, no1[0] / 32767, no1[1] / 32767, no1[2] / 32767));
 						}
 						let uv0: Float32Array = null;
 						let uv1: Float32Array = null;
@@ -137,16 +137,16 @@ class ImportBlendMesh {
 							let co2 = BlHandle.get(v2, "co");
 							let no2 = BlHandle.get(v2, "no");
 							if (smooth) {
-								Vec4.normalize(Vec4.set(vec2, no2[0] / 32767, no2[1] / 32767, no2[2] / 32767));
+								vec4_normalize(vec4_set(vec2, no2[0] / 32767, no2[1] / 32767, no2[2] / 32767));
 							}
 							else {
-								Vec4.set(vec2, co2[0], co2[1], co2[2]);
-								Vec4.set(vec1, co1[0], co1[1], co1[2]);
-								Vec4.subvecs(vec0, vec2, vec1);
-								Vec4.set(vec2, co0[0], co0[1], co0[2]);
-								Vec4.subvecs(vec1, vec2, vec1);
-								Vec4.cross(vec0, vec1);
-								Vec4.normalize(vec0);
+								vec4_set(vec2, co2[0], co2[1], co2[2]);
+								vec4_set(vec1, co1[0], co1[1], co1[2]);
+								vec4_sub_vecs(vec0, vec2, vec1);
+								vec4_set(vec2, co0[0], co0[1], co0[2]);
+								vec4_sub_vecs(vec1, vec2, vec1);
+								vec4_cross(vec0, vec1);
+								vec4_normalize(vec0);
 							}
 							posa32[tri * 9    ] = co0[0];
 							posa32[tri * 9 + 1] = co0[1];
@@ -168,7 +168,7 @@ class ImportBlendMesh {
 							nora[tri * 6 + 5] = Math.floor((smooth ? vec2.y : vec0.y) * 32767);
 							co1 = co2;
 							no1 = no2;
-							Vec4.setFrom(vec1, vec2);
+							vec4_set_from(vec1, vec2);
 							if (hasuv) {
 								bl.pos = uvdata_pos + (loopstart + j + 1) * 4 * 3;
 								uv2 = ParserBlend.readf32array(bl, 2);
@@ -212,13 +212,13 @@ class ImportBlendMesh {
 						let co0 = BlHandle.get(v0, "co");
 						let co1 = BlHandle.get(v1, "co");
 						let co2 = BlHandle.get(v2, "co");
-						Vec4.set(vec2, co2[0], co2[1], co2[2]);
-						Vec4.set(vec1, co1[0], co1[1], co1[2]);
-						Vec4.subvecs(vec0, vec2, vec1);
-						Vec4.set(vec2, co0[0], co0[1], co0[2]);
-						Vec4.subvecs(vec1, vec2, vec1);
-						Vec4.cross(vec0, vec1);
-						Vec4.normalize(vec0, );
+						vec4_set(vec2, co2[0], co2[1], co2[2]);
+						vec4_set(vec1, co1[0], co1[1], co1[2]);
+						vec4_sub_vecs(vec0, vec2, vec1);
+						vec4_set(vec2, co0[0], co0[1], co0[2]);
+						vec4_sub_vecs(vec1, vec2, vec1);
+						vec4_cross(vec0, vec1);
+						vec4_normalize(vec0, );
 
 						let nx = vec0.x;
 						let ny = vec0.y;
@@ -291,18 +291,18 @@ class ImportBlendMesh {
 								let no1 = BlHandle.get(v1, "no");
 								let no2 = BlHandle.get(v2, "no");
 								if (smooth) {
-									Vec4.normalize(Vec4.set(vec0, no0[0] / 32767, no0[1] / 32767, no0[2] / 32767)); // shortmax
-									Vec4.normalize(Vec4.set(vec1, no1[0] / 32767, no1[1] / 32767, no1[2] / 32767));
-									Vec4.normalize(Vec4.set(vec2, no2[0] / 32767, no2[1] / 32767, no2[2] / 32767));
+									vec4_normalize(vec4_set(vec0, no0[0] / 32767, no0[1] / 32767, no0[2] / 32767)); // shortmax
+									vec4_normalize(vec4_set(vec1, no1[0] / 32767, no1[1] / 32767, no1[2] / 32767));
+									vec4_normalize(vec4_set(vec2, no2[0] / 32767, no2[1] / 32767, no2[2] / 32767));
 								}
 								else {
-									Vec4.set(vec2, co2[0], co2[1], co2[2]);
-									Vec4.set(vec1, co1[0], co1[1], co1[2]);
-									Vec4.subvecs(vec0, vec2, vec1);
-									Vec4.set(vec2, co0[0], co0[1], co0[2]);
-									Vec4.subvecs(vec1, vec2, vec1);
-									Vec4.cross(vec0, vec1);
-									Vec4.normalize(vec0, );
+									vec4_set(vec2, co2[0], co2[1], co2[2]);
+									vec4_set(vec1, co1[0], co1[1], co1[2]);
+									vec4_sub_vecs(vec0, vec2, vec1);
+									vec4_set(vec2, co0[0], co0[1], co0[2]);
+									vec4_sub_vecs(vec1, vec2, vec1);
+									vec4_cross(vec0, vec1);
+									vec4_normalize(vec0, );
 								}
 								let uv0: Float32Array = null;
 								let uv1: Float32Array = null;
@@ -396,22 +396,22 @@ class ImportBlendMesh {
 
 				// Apply world matrix
 				let obmat = BlHandle.get(ob, "obmat", 0, "float", 16);
-				let mat = Mat4.transpose(Mat4.fromFloat32Array(obmat));
-				let v = Vec4.create();
+				let mat = mat4_transpose(mat4_from_f32_array(obmat));
+				let v = vec4_create();
 				for (let i = 0; i < Math.floor(posa32.length / 3); ++i) {
-					Vec4.set(v, posa32[i * 3], posa32[i * 3 + 1], posa32[i * 3 + 2]);
-					Vec4.applymat4(v, mat);
+					vec4_set(v, posa32[i * 3], posa32[i * 3 + 1], posa32[i * 3 + 2]);
+					vec4_apply_mat4(v, mat);
 					posa32[i * 3    ] = v.x;
 					posa32[i * 3 + 1] = v.y;
 					posa32[i * 3 + 2] = v.z;
 				}
-				Mat4.getInverse(mat, mat);
-				Mat4.transpose3x3(mat);
+				mat4_get_inv(mat, mat);
+				mat4_transpose3x3(mat);
 				mat._30 = mat._31 = mat._32 = mat._33 = 0;
 				for (let i = 0; i < Math.floor(nora.length / 2); ++i) {
-					Vec4.set(v, nora[i * 2] / 32767, nora[i * 2 + 1] / 32767, posa[i * 4 + 3] / 32767);
-					Vec4.applymat(v, mat);
-					Vec4.normalize(v);
+					vec4_set(v, nora[i * 2] / 32767, nora[i * 2 + 1] / 32767, posa[i * 4 + 3] / 32767);
+					vec4_apply_mat(v, mat);
+					vec4_normalize(v);
 					nora[i * 2    ] = Math.floor(v.x * 32767);
 					nora[i * 2 + 1] = Math.floor(v.y * 32767);
 					posa[i * 4 + 3] = Math.floor(v.z * 32767);

+ 49 - 49
base/Sources/ImportEnvmap.ts

@@ -1,38 +1,38 @@
 
 class ImportEnvmap {
 
-	static pipeline: PipelineStateRaw = null;
-	static paramsLocation: ConstantLocation;
-	static params = Vec4.create();
-	static n = Vec4.create();
-	static radianceLocation: TextureUnit;
-	static radiance: ImageRaw = null;
-	static radianceCpu: ImageRaw = null;
-	static mips: ImageRaw[] = null;
-	static mipsCpu: ImageRaw[] = null;
-
-	static run = (path: string, image: ImageRaw) => {
+	static pipeline: pipeline_t = null;
+	static paramsLocation: kinc_const_loc_t;
+	static params = vec4_create();
+	static n = vec4_create();
+	static radianceLocation: kinc_tex_unit_t;
+	static radiance: image_t = null;
+	static radianceCpu: image_t = null;
+	static mips: image_t[] = null;
+	static mipsCpu: image_t[] = null;
+
+	static run = (path: string, image: image_t) => {
 
 		// Init
 		if (ImportEnvmap.pipeline == null) {
-			ImportEnvmap.pipeline = PipelineState.create();
-			ImportEnvmap.pipeline.vertexShader = System.getShader("pass.vert");
-			ImportEnvmap.pipeline.fragmentShader = System.getShader("prefilter_envmap.frag");
-			let vs = VertexStructure.create();
-			VertexStructure.add(vs, "pos", VertexData.F32_2X);
+			ImportEnvmap.pipeline = pipeline_create();
+			ImportEnvmap.pipeline.vertexShader = sys_get_shader("pass.vert");
+			ImportEnvmap.pipeline.fragmentShader = sys_get_shader("prefilter_envmap.frag");
+			let vs = vertex_struct_create();
+			vertex_struct_add(vs, "pos", VertexData.F32_2X);
 			ImportEnvmap.pipeline.inputLayout = [vs];
 			ImportEnvmap.pipeline.colorAttachmentCount = 1;
 			ImportEnvmap.pipeline.colorAttachments[0] = TextureFormat.RGBA128;
-			PipelineState.compile(ImportEnvmap.pipeline);
-			ImportEnvmap.paramsLocation = PipelineState.getConstantLocation(ImportEnvmap.pipeline, "params");
-			ImportEnvmap.radianceLocation = PipelineState.getTextureUnit(ImportEnvmap.pipeline, "radiance");
+			pipeline_compile(ImportEnvmap.pipeline);
+			ImportEnvmap.paramsLocation = pipeline_get_const_loc(ImportEnvmap.pipeline, "params");
+			ImportEnvmap.radianceLocation = pipeline_get_tex_unit(ImportEnvmap.pipeline, "radiance");
 
-			ImportEnvmap.radiance = Image.createRenderTarget(1024, 512, TextureFormat.RGBA128);
+			ImportEnvmap.radiance = image_create_render_target(1024, 512, TextureFormat.RGBA128);
 
 			ImportEnvmap.mips = [];
 			let w = 512;
 			for (let i = 0; i < 10; ++i) {
-				ImportEnvmap.mips.push(Image.createRenderTarget(w, w > 1 ? Math.floor(w / 2) : 1, TextureFormat.RGBA128));
+				ImportEnvmap.mips.push(image_create_render_target(w, w > 1 ? Math.floor(w / 2) : 1, TextureFormat.RGBA128));
 				w = Math.floor(w / 2);
 			}
 
@@ -40,20 +40,20 @@ class ImportEnvmap {
 		}
 
 		// Down-scale to 1024x512
-		Graphics2.begin(ImportEnvmap.radiance.g2, false);
+		g2_begin(ImportEnvmap.radiance.g2, false);
 		ImportEnvmap.radiance.g2.pipeline = Base.pipeCopy128;
-		Graphics2.drawScaledImage(image, 0, 0, 1024, 512);
+		g2_draw_scaled_image(image, 0, 0, 1024, 512);
 		ImportEnvmap.radiance.g2.pipeline = null;
-		Graphics2.end(ImportEnvmap.radiance.g2);
+		g2_end(ImportEnvmap.radiance.g2);
 
-		let radiancePixels = Image.getPixels(ImportEnvmap.radiance);
+		let radiancePixels = image_get_pixels(ImportEnvmap.radiance);
 		if (ImportEnvmap.radianceCpu != null) {
 			let _radianceCpu = ImportEnvmap.radianceCpu;
 			Base.notifyOnNextFrame(() => {
-				Image.unload(_radianceCpu);
+				image_unload(_radianceCpu);
 			});
 		}
-		ImportEnvmap.radianceCpu = Image.fromBytes(radiancePixels, ImportEnvmap.radiance.width, ImportEnvmap.radiance.height, TextureFormat.RGBA128, Usage.DynamicUsage);
+		ImportEnvmap.radianceCpu = image_from_bytes(radiancePixels, ImportEnvmap.radiance.width, ImportEnvmap.radiance.height, TextureFormat.RGBA128, Usage.DynamicUsage);
 
 		// Radiance
 		if (ImportEnvmap.mipsCpu != null) {
@@ -61,7 +61,7 @@ class ImportEnvmap {
 				let _mip = mip;
 				Base.notifyOnNextFrame(() => {
 					///if (!krom_direct3d12) // TODO: crashes after 50+ imports
-					Image.unload(_mip);
+					image_unload(_mip);
 					///end
 				});
 			}
@@ -69,45 +69,45 @@ class ImportEnvmap {
 		ImportEnvmap.mipsCpu = [];
 		for (let i = 0; i < ImportEnvmap.mips.length; ++i) {
 			ImportEnvmap.getRadianceMip(ImportEnvmap.mips[i], i, ImportEnvmap.radiance);
-			ImportEnvmap.mipsCpu.push(Image.fromBytes(Image.getPixels(ImportEnvmap.mips[i]), ImportEnvmap.mips[i].width, ImportEnvmap.mips[i].height, TextureFormat.RGBA128, Usage.DynamicUsage));
+			ImportEnvmap.mipsCpu.push(image_from_bytes(image_get_pixels(ImportEnvmap.mips[i]), ImportEnvmap.mips[i].width, ImportEnvmap.mips[i].height, TextureFormat.RGBA128, Usage.DynamicUsage));
 		}
-		Image.setMipmaps(ImportEnvmap.radianceCpu, ImportEnvmap.mipsCpu);
+		image_set_mipmaps(ImportEnvmap.radianceCpu, ImportEnvmap.mipsCpu);
 
 		// Irradiance
-		Scene.world._irradiance = ImportEnvmap.getSphericalHarmonics(radiancePixels, ImportEnvmap.radiance.width, ImportEnvmap.radiance.height);
+		scene_world._irradiance = ImportEnvmap.getSphericalHarmonics(radiancePixels, ImportEnvmap.radiance.width, ImportEnvmap.radiance.height);
 
 		// World
-		Scene.world.strength = 1.0;
-		Scene.world.radiance_mipmaps = ImportEnvmap.mipsCpu.length - 2;
-		Scene.world._envmap = image;
-		Scene.world.envmap = path;
-		Scene.world._radiance = ImportEnvmap.radianceCpu;
-		Scene.world._radianceMipmaps = ImportEnvmap.mipsCpu;
+		scene_world.strength = 1.0;
+		scene_world.radiance_mipmaps = ImportEnvmap.mipsCpu.length - 2;
+		scene_world._envmap = image;
+		scene_world.envmap = path;
+		scene_world._radiance = ImportEnvmap.radianceCpu;
+		scene_world._radianceMipmaps = ImportEnvmap.mipsCpu;
 		Context.raw.savedEnvmap = image;
 		if (Context.raw.showEnvmapBlur) {
-			Scene.world._envmap = Scene.world._radianceMipmaps[0];
+			scene_world._envmap = scene_world._radianceMipmaps[0];
 		}
 		Context.raw.ddirty = 2;
 		Project.raw.envmap = path;
 	}
 
-	static getRadianceMip = (mip: ImageRaw, level: i32, radiance: ImageRaw) => {
-		Graphics4.begin(mip.g4);
-		Graphics4.setVertexBuffer(ConstData.screenAlignedVB);
-		Graphics4.setIndexBuffer(ConstData.screenAlignedIB);
-		Graphics4.setPipeline(ImportEnvmap.pipeline);
+	static getRadianceMip = (mip: image_t, level: i32, radiance: image_t) => {
+		g4_begin(mip.g4);
+		g4_set_vertex_buffer(ConstData.screenAlignedVB);
+		g4_set_index_buffer(ConstData.screenAlignedIB);
+		g4_set_pipeline(ImportEnvmap.pipeline);
 		ImportEnvmap.params.x = 0.1 + level / 8;
-		Graphics4.setFloat4(ImportEnvmap.paramsLocation, ImportEnvmap.params.x, ImportEnvmap.params.y, ImportEnvmap.params.z, ImportEnvmap.params.w);
-		Graphics4.setTexture(ImportEnvmap.radianceLocation, radiance);
-		Graphics4.drawIndexedVertices();
-		Graphics4.end();
+		g4_set_float4(ImportEnvmap.paramsLocation, ImportEnvmap.params.x, ImportEnvmap.params.y, ImportEnvmap.params.z, ImportEnvmap.params.w);
+		g4_set_tex(ImportEnvmap.radianceLocation, radiance);
+		g4_draw();
+		g4_end();
 	}
 
-	static reverseEquirect = (x: f32, y: f32): TVec4 => {
+	static reverseEquirect = (x: f32, y: f32): vec4_t => {
 		let theta = x * Math.PI * 2 - Math.PI;
 		let phi = y * Math.PI;
 		// return n.set(Math.sin(phi) * Math.cos(theta), -(Math.sin(phi) * Math.sin(theta)), Math.cos(phi));
-		return Vec4.set(ImportEnvmap.n, -Math.cos(phi), Math.sin(phi) * Math.cos(theta), -(Math.sin(phi) * Math.sin(theta)));
+		return vec4_set(ImportEnvmap.n, -Math.cos(phi), Math.sin(phi) * Math.cos(theta), -(Math.sin(phi) * Math.sin(theta)));
 	}
 
 	// https://ndotl.wordpress.com/2015/03/07/pbr-cubemap-filtering

+ 4 - 4
base/Sources/ImportFont.ts

@@ -10,15 +10,15 @@ class ImportFont {
 				return;
 			}
 		}
-		Data.getFont(path, (font: FontRaw) => {
-			Font.init(font); // Make sure font_ is ready
+		Data.getFont(path, (font: font_t) => {
+			font_init(font); // Make sure font_ is ready
 			let count = Krom.g2_font_count(font.font_);
 			let fontSlots: SlotFontRaw[] = [];
 			for (let i = 0; i < count; ++i) {
 				let ar = path.split(Path.sep);
 				let name = ar[ar.length - 1];
-				let f = Font.clone(font);
-				Font.setFontIndex(f, i);
+				let f = font_clone(font);
+				font_set_font_index(f, i);
 				let fontSlot = SlotFont.create(name, f, path);
 				fontSlots.push(fontSlot);
 			}

+ 1 - 1
base/Sources/ImportGpl.ts

@@ -5,7 +5,7 @@ class ImportGpl {
 		Data.getBlob(path, (b: ArrayBuffer) => {
 			// let swatches = [];
 
-			// let str = System.bufferToString(b);
+			// let str = sys_buffer_to_string(b);
 			// let lines = str.split("\n");
 
 			// let view = new DataView(b);

+ 6 - 6
base/Sources/ImportMesh.ts

@@ -44,7 +44,7 @@ class ImportMesh {
 						has_next = mesh.has_next;
 						ImportMesh.addMesh(mesh);
 
-						// let m = Mat4.fromFloat32Array(mesh.transform);
+						// let m = fromFloat32Array(mesh.transform);
 						// Project.paintObjects[Project.paintObjects.length - 1].transform.localOnly = true;
 						// Project.paintObjects[Project.paintObjects.length - 1].transform.setMatrix(m);
 					});
@@ -55,7 +55,7 @@ class ImportMesh {
 		Project.meshAssets = [path];
 
 		///if (krom_android || krom_ios)
-		System.title = path.substring(path.lastIndexOf(Path.sep) + 1, path.lastIndexOf("."));
+		sys_title_set(path.substring(path.lastIndexOf(Path.sep) + 1, path.lastIndexOf(".")));
 		///end
 	}
 
@@ -106,7 +106,7 @@ class ImportMesh {
 		let raw = ImportMesh.rawMesh(mesh);
 		if (mesh.cola != null) raw.vertex_arrays.push({ values: mesh.cola, attrib: "col", data: "short4norm", padding: 1 });
 
-		MeshData.create(raw, (md: TMeshData) => {
+		MeshData.create(raw, (md: mesh_data_t) => {
 			Context.raw.paintObject = Context.mainObject();
 
 			Context.selectPaintObject(Context.mainObject());
@@ -185,9 +185,9 @@ class ImportMesh {
 		let raw = ImportMesh.rawMesh(mesh);
 		if (mesh.cola != null) raw.vertex_arrays.push({ values: mesh.cola, attrib: "col", data: "short4norm", padding: 1 });
 
-		MeshData.create(raw, (md: TMeshData) => {
+		MeshData.create(raw, (md: mesh_data_t) => {
 
-			let object = Scene.addMeshObject(md, Context.raw.paintObject.materials, Context.raw.paintObject.base);
+			let object = scene_add_mesh_object(md, Context.raw.paintObject.materials, Context.raw.paintObject.base);
 			object.base.name = mesh.name;
 			object.skip_context = "paint";
 
@@ -226,7 +226,7 @@ class ImportMesh {
 		}
 	}
 
-	static rawMesh = (mesh: any): TMeshData => {
+	static rawMesh = (mesh: any): mesh_data_t => {
 		return {
 			name: mesh.name,
 			vertex_arrays: [

+ 3 - 3
base/Sources/ImportTexture.ts

@@ -14,7 +14,7 @@ class ImportTexture {
 			if (a.file == path) {
 				// Set as envmap
 				if (hdrAsEnvmap && path.toLowerCase().endsWith(".hdr")) {
-					Data.getImage(path, (image: ImageRaw) => {
+					Data.getImage(path, (image: image_t) => {
 						Base.notifyOnNextFrame(() => { // Make sure file browser process did finish
 							ImportEnvmap.run(path, image);
 						});
@@ -30,7 +30,7 @@ class ImportTexture {
 		let cached = Data.cachedImages.get(path) != null; // Already loaded or pink texture for missing file
 		if (importer == null || cached) importer = ImportTexture.defaultImporter;
 
-		importer(path, (image: ImageRaw) => {
+		importer(path, (image: image_t) => {
 			Data.cachedImages.set(path, image);
 			let ar = path.split(Path.sep);
 			let name = ar[ar.length - 1];
@@ -51,7 +51,7 @@ class ImportTexture {
 		});
 	}
 
-	static defaultImporter = (path: string, done: (img: ImageRaw)=>void) => {
+	static defaultImporter = (path: string, done: (img: image_t)=>void) => {
 		Data.getImage(path, done);
 	}
 }

+ 85 - 85
base/Sources/LineDraw.ts

@@ -3,15 +3,15 @@ class LineDraw {
 
 	static color: Color = 0xffff0000;
 	static strength = 0.005;
-	static mat: TMat4 = null;
-	static dim: TVec4 = null;
+	static mat: mat4_t = null;
+	static dim: vec4_t = null;
 
-	static vertexBuffer: VertexBufferRaw;
-	static indexBuffer: IndexBufferRaw;
-	static pipeline: PipelineStateRaw = null;
+	static vertexBuffer: vertex_buffer_t;
+	static indexBuffer: index_buffer_t;
+	static pipeline: pipeline_t = null;
 
-	static vp: TMat4;
-	static vpID: ConstantLocation;
+	static vp: mat4_t;
+	static vpID: kinc_const_loc_t;
 
 	static vbData: DataView;
 	static ibData: Uint32Array;
@@ -21,21 +21,21 @@ class LineDraw {
 	static maxIndices = LineDraw.maxLines * 6;
 	static lines = 0;
 
-	static g: Graphics4Raw;
+	static g: g4_t;
 
-	static render = (g4: Graphics4Raw, matrix: TMat4) => {
+	static render = (g4: g4_t, matrix: mat4_t) => {
 		LineDraw.g = g4;
 		LineDraw.mat = matrix;
-		LineDraw.dim = Mat4.getScale(matrix);
+		LineDraw.dim = mat4_get_scale(matrix);
 
 		if (LineDraw.pipeline == null) {
-			let structure = VertexStructure.create();
-			VertexStructure.add(structure, "pos", VertexData.F32_3X);
-			VertexStructure.add(structure, "col", VertexData.F32_3X);
-			LineDraw.pipeline = PipelineState.create();
+			let structure = vertex_struct_create();
+			vertex_struct_add(structure, "pos", VertexData.F32_3X);
+			vertex_struct_add(structure, "col", VertexData.F32_3X);
+			LineDraw.pipeline = pipeline_create();
 			LineDraw.pipeline.inputLayout = [structure];
-			LineDraw.pipeline.fragmentShader = System.getShader("line.frag");
-			LineDraw.pipeline.vertexShader = System.getShader("line.vert");
+			LineDraw.pipeline.fragmentShader = sys_get_shader("line.frag");
+			LineDraw.pipeline.vertexShader = sys_get_shader("line.vert");
 			LineDraw.pipeline.depthWrite = true;
 			LineDraw.pipeline.depthMode = CompareMode.Less;
 			LineDraw.pipeline.cullMode = CullMode.None;
@@ -43,12 +43,12 @@ class LineDraw {
 			LineDraw.pipeline.colorAttachments[0] = TextureFormat.RGBA64;
 			LineDraw.pipeline.colorAttachments[1] = TextureFormat.RGBA64;
 			LineDraw.pipeline.colorAttachments[2] = TextureFormat.RGBA64;
-			LineDraw.pipeline.depthStencilAttachment = DepthStencilFormat.DepthOnly;
-			PipelineState.compile(LineDraw.pipeline);
-			LineDraw.vpID = PipelineState.getConstantLocation(LineDraw.pipeline, "VP");
-			LineDraw.vp = Mat4.identity();
-			LineDraw.vertexBuffer = VertexBuffer.create(LineDraw.maxVertices, structure, Usage.DynamicUsage);
-			LineDraw.indexBuffer = IndexBuffer.create(LineDraw.maxIndices, Usage.DynamicUsage);
+			LineDraw.pipeline.depthStencilAttachment = DepthFormat.DepthOnly;
+			pipeline_compile(LineDraw.pipeline);
+			LineDraw.vpID = pipeline_get_const_loc(LineDraw.pipeline, "VP");
+			LineDraw.vp = mat4_identity();
+			LineDraw.vertexBuffer = vertex_buffer_create(LineDraw.maxVertices, structure, Usage.DynamicUsage);
+			LineDraw.indexBuffer = index_buffer_create(LineDraw.maxIndices);
 		}
 
 		LineDraw.begin();
@@ -56,30 +56,30 @@ class LineDraw {
 		LineDraw.end();
 	}
 
-	static wpos: TVec4;
-	static vx = Vec4.create();
-	static vy = Vec4.create();
-	static vz = Vec4.create();
+	static wpos: vec4_t;
+	static vx = vec4_create();
+	static vy = vec4_create();
+	static vz = vec4_create();
 
-	static bounds = (mat: TMat4, dim: TVec4) => {
-		LineDraw.wpos = Mat4.getLoc(mat);
+	static bounds = (mat: mat4_t, dim: vec4_t) => {
+		LineDraw.wpos = mat4_get_loc(mat);
 		let dx = dim.x / 2;
 		let dy = dim.y / 2;
 		let dz = dim.z / 2;
 
-		let up = Mat4.up(mat);
-		let look = Mat4.look(mat);
-		let right = Mat4.right(mat);
-		Vec4.normalize(up);
-		Vec4.normalize(look);
-		Vec4.normalize(right);
+		let up = mat4_up(mat);
+		let look = mat4_look(mat);
+		let right = mat4_right(mat);
+		vec4_normalize(up);
+		vec4_normalize(look);
+		vec4_normalize(right);
 
-		Vec4.setFrom(LineDraw.vx, right);
-		Vec4.mult(LineDraw.vx, dx);
-		Vec4.setFrom(LineDraw.vy, look);
-		Vec4.mult(LineDraw.vy, dy);
-		Vec4.setFrom(LineDraw.vz, up);
-		Vec4.mult(LineDraw.vz, dz);
+		vec4_set_from(LineDraw.vx, right);
+		vec4_mult(LineDraw.vx, dx);
+		vec4_set_from(LineDraw.vy, look);
+		vec4_mult(LineDraw.vy, dy);
+		vec4_set_from(LineDraw.vz, up);
+		vec4_mult(LineDraw.vz, dz);
 
 		LineDraw.lineb(-1, -1, -1,  1, -1, -1);
 		LineDraw.lineb(-1,  1, -1,  1,  1, -1);
@@ -97,31 +97,31 @@ class LineDraw {
 		LineDraw.lineb( 1,  1, -1,  1,  1,  1);
 	}
 
-	static v1 = Vec4.create();
-	static v2 = Vec4.create();
-	static t = Vec4.create();
+	static v1 = vec4_create();
+	static v2 = vec4_create();
+	static t = vec4_create();
 
 	static lineb = (a: i32, b: i32, c: i32, d: i32, e: i32, f: i32) => {
-		Vec4.setFrom(LineDraw.v1, LineDraw.wpos);
-		Vec4.setFrom(LineDraw.t, LineDraw.vx); Vec4.mult(LineDraw.t, a); Vec4.add(LineDraw.v1, LineDraw.t);
-		Vec4.setFrom(LineDraw.t, LineDraw.vy); Vec4.mult(LineDraw.t, b); Vec4.add(LineDraw.v1, LineDraw.t);
-		Vec4.setFrom(LineDraw.t, LineDraw.vz); Vec4.mult(LineDraw.t, c); Vec4.add(LineDraw.v1, LineDraw.t);
+		vec4_set_from(LineDraw.v1, LineDraw.wpos);
+		vec4_set_from(LineDraw.t, LineDraw.vx); vec4_mult(LineDraw.t, a); vec4_add(LineDraw.v1, LineDraw.t);
+		vec4_set_from(LineDraw.t, LineDraw.vy); vec4_mult(LineDraw.t, b); vec4_add(LineDraw.v1, LineDraw.t);
+		vec4_set_from(LineDraw.t, LineDraw.vz); vec4_mult(LineDraw.t, c); vec4_add(LineDraw.v1, LineDraw.t);
 
-		Vec4.setFrom(LineDraw.v2, LineDraw.wpos);
-		Vec4.setFrom(LineDraw.t, LineDraw.vx); Vec4.mult(LineDraw.t, d); Vec4.add(LineDraw.v2, LineDraw.t);
-		Vec4.setFrom(LineDraw.t, LineDraw.vy); Vec4.mult(LineDraw.t, e); Vec4.add(LineDraw.v2, LineDraw.t);
-		Vec4.setFrom(LineDraw.t, LineDraw.vz); Vec4.mult(LineDraw.t, f); Vec4.add(LineDraw.v2, LineDraw.t);
+		vec4_set_from(LineDraw.v2, LineDraw.wpos);
+		vec4_set_from(LineDraw.t, LineDraw.vx); vec4_mult(LineDraw.t, d); vec4_add(LineDraw.v2, LineDraw.t);
+		vec4_set_from(LineDraw.t, LineDraw.vy); vec4_mult(LineDraw.t, e); vec4_add(LineDraw.v2, LineDraw.t);
+		vec4_set_from(LineDraw.t, LineDraw.vz); vec4_mult(LineDraw.t, f); vec4_add(LineDraw.v2, LineDraw.t);
 
 		LineDraw.line(LineDraw.v1.x, LineDraw.v1.y, LineDraw.v1.z, LineDraw.v2.x, LineDraw.v2.y, LineDraw.v2.z);
 	}
 
-	static midPoint = Vec4.create();
-	static midLine = Vec4.create();
-	static corner1 = Vec4.create();
-	static corner2 = Vec4.create();
-	static corner3 = Vec4.create();
-	static corner4 = Vec4.create();
-	static cameraLook = Vec4.create();
+	static midPoint = vec4_create();
+	static midLine = vec4_create();
+	static corner1 = vec4_create();
+	static corner2 = vec4_create();
+	static corner3 = vec4_create();
+	static corner4 = vec4_create();
+	static cameraLook = vec4_create();
 
 	static line = (x1: f32, y1: f32, z1: f32, x2: f32, y2: f32, z2: f32) => {
 		if (LineDraw.lines >= LineDraw.maxLines) {
@@ -129,24 +129,24 @@ class LineDraw {
 			LineDraw.begin();
 		}
 
-		Vec4.set(LineDraw.midPoint, x1 + x2, y1 + y2, z1 + z2);
-		Vec4.mult(LineDraw.midPoint, 0.5);
+		vec4_set(LineDraw.midPoint, x1 + x2, y1 + y2, z1 + z2);
+		vec4_mult(LineDraw.midPoint, 0.5);
 
-		Vec4.set(LineDraw.midLine, x1, y1, z1);
-		Vec4.sub(LineDraw.midLine, LineDraw.midPoint);
+		vec4_set(LineDraw.midLine, x1, y1, z1);
+		vec4_sub(LineDraw.midLine, LineDraw.midPoint);
 
-		let camera = Scene.camera;
-		LineDraw.cameraLook = Mat4.getLoc(camera.base.transform.world);
-		Vec4.sub(LineDraw.cameraLook, LineDraw.midPoint);
+		let camera = scene_camera;
+		LineDraw.cameraLook = mat4_get_loc(camera.base.transform.world);
+		vec4_sub(LineDraw.cameraLook, LineDraw.midPoint);
 
-		let lineWidth = Vec4.cross(LineDraw.cameraLook, LineDraw.midLine);
-		Vec4.normalize(lineWidth, );
-		Vec4.mult(lineWidth, LineDraw.strength);
+		let lineWidth = vec4_cross(LineDraw.cameraLook, LineDraw.midLine);
+		vec4_normalize(lineWidth, );
+		vec4_mult(lineWidth, LineDraw.strength);
 
-		Vec4.add(Vec4.set(LineDraw.corner1, x1, y1, z1), lineWidth);
-		Vec4.sub(Vec4.set(LineDraw.corner2, x1, y1, z1), lineWidth);
-		Vec4.sub(Vec4.set(LineDraw.corner3, x2, y2, z2), lineWidth);
-		Vec4.add(Vec4.set(LineDraw.corner4, x2, y2, z2), lineWidth);
+		vec4_add(vec4_set(LineDraw.corner1, x1, y1, z1), lineWidth);
+		vec4_sub(vec4_set(LineDraw.corner2, x1, y1, z1), lineWidth);
+		vec4_sub(vec4_set(LineDraw.corner3, x2, y2, z2), lineWidth);
+		vec4_add(vec4_set(LineDraw.corner4, x2, y2, z2), lineWidth);
 
 		let i = LineDraw.lines * 24; // 4 * 6 (structure len)
 		LineDraw.addVbData(i, [LineDraw.corner1.x, LineDraw.corner1.y, LineDraw.corner1.z, color_get_rb(LineDraw.color) / 255, color_get_gb(LineDraw.color) / 255, color_get_ab(LineDraw.color) / 255]);
@@ -170,22 +170,22 @@ class LineDraw {
 
 	static begin = () => {
 		LineDraw.lines = 0;
-		LineDraw.vbData = VertexBuffer.lock(LineDraw.vertexBuffer);
-		LineDraw.ibData = IndexBuffer.lock(LineDraw.indexBuffer);
+		LineDraw.vbData = vertex_buffer_lock(LineDraw.vertexBuffer);
+		LineDraw.ibData = index_buffer_lock(LineDraw.indexBuffer);
 	}
 
 	static end = () => {
-		VertexBuffer.unlock(LineDraw.vertexBuffer);
-		IndexBuffer.unlock(LineDraw.indexBuffer);
-
-		Graphics4.setVertexBuffer(LineDraw.vertexBuffer);
-		Graphics4.setIndexBuffer(LineDraw.indexBuffer);
-		Graphics4.setPipeline(LineDraw.pipeline);
-		let camera = Scene.camera;
-		Mat4.setFrom(LineDraw.vp, camera.V);
-		Mat4.multmat(LineDraw.vp, camera.P);
-		Graphics4.setMatrix(LineDraw.vpID, LineDraw.vp);
-		Graphics4.drawIndexedVertices(0, LineDraw.lines * 6);
+		vertex_buffer_unlock(LineDraw.vertexBuffer);
+		index_buffer_unlock(LineDraw.indexBuffer);
+
+		g4_set_vertex_buffer(LineDraw.vertexBuffer);
+		g4_set_index_buffer(LineDraw.indexBuffer);
+		g4_set_pipeline(LineDraw.pipeline);
+		let camera = scene_camera;
+		mat4_set_from(LineDraw.vp, camera.V);
+		mat4_mult_mat(LineDraw.vp, camera.P);
+		g4_set_mat(LineDraw.vpID, LineDraw.vp);
+		g4_draw(0, LineDraw.lines * 6);
 	}
 
 	static addVbData = (i: i32, data: f32[]) => {

+ 3 - 3
base/Sources/LogicNode.ts

@@ -17,11 +17,11 @@ class LogicNode {
 		done(null);
 	}
 
-	getAsImage = (from: i32, done: (img: ImageRaw)=>void) => {
+	getAsImage = (from: i32, done: (img: image_t)=>void) => {
 		done(null);
 	}
 
-	getCachedImage = (): ImageRaw => {
+	getCachedImage = (): image_t => {
 		return null;
 	}
 
@@ -41,7 +41,7 @@ class LogicNodeInput {
 		this.node.get(this.from, done);
 	}
 
-	getAsImage = (done: (img: ImageRaw)=>void) => {
+	getAsImage = (done: (img: image_t)=>void) => {
 		this.node.getAsImage(this.from, done);
 	}
 

+ 10 - 10
base/Sources/MakeVoxel.ts

@@ -2,13 +2,13 @@
 class MakeVoxel {
 
 	///if arm_voxels
-	static run = (data: TShaderContext) => {
-		let structure = VertexStructure.create();
-		VertexStructure.add(structure, "pos", VertexData.I16_4X_Normalized);
-		VertexStructure.add(structure, "nor", VertexData.I16_2X_Normalized);
-		VertexStructure.add(structure, "tex", VertexData.I16_2X_Normalized);
+	static run = (data: shader_context_t) => {
+		let structure = vertex_struct_create();
+		vertex_struct_add(structure, "pos", VertexData.I16_4X_Normalized);
+		vertex_struct_add(structure, "nor", VertexData.I16_2X_Normalized);
+		vertex_struct_add(structure, "tex", VertexData.I16_2X_Normalized);
 
-		let pipeState = data._pipeState;
+		let pipeState = data._pipe_state;
 		pipeState.inputLayout = [structure];
 		data.vertex_elements = [{name: "pos", data: "short4norm"}, {name: "nor", data: "short2norm"}, {name: "tex", data: "short2norm"}];
 
@@ -24,13 +24,13 @@ class MakeVoxel {
 		// ///end
 
 		let ds = MakeMaterial.getDisplaceStrength();
-		pipeState.vertexShader = Shader.fromSource(MakeVoxel.voxelSource(), ShaderType.Vertex);
+		pipeState.vertexShader = shader_from_source(MakeVoxel.voxelSource(), ShaderType.Vertex);
 
-		PipelineState.compile(pipeState);
+		pipeline_compile(pipeState);
 		data.constants = [{ name: "W", type: "mat4", link: "_worldMatrix" }, { name: "N", type: "mat3", link: "_normalMatrix" }];
-		data._constants = [PipelineState.getConstantLocation(pipeState, "W"), PipelineState.getConstantLocation(pipeState, "N")];
+		data._constants = [pipeline_get_const_loc(pipeState, "W"), pipeline_get_const_loc(pipeState, "N")];
 		data.texture_units = [{ name: "texpaint_pack" }, { name: "voxels", is_image: true }];
-		data._textureUnits = [PipelineState.getTextureUnit(pipeState, "texpaint_pack"), PipelineState.getTextureUnit(pipeState, "voxels")];
+		data._tex_units = [pipeline_get_tex_unit(pipeState, "texpaint_pack"), pipeline_get_tex_unit(pipeState, "voxels")];
 	}
 
 	static voxelSource = (): string => {

+ 7 - 7
base/Sources/NodeShaderContext.ts

@@ -2,11 +2,11 @@
 class NodeShaderContextRaw {
 	vert: NodeShaderRaw;
 	frag: NodeShaderRaw;
-	data: TShaderContext;
+	data: shader_context_t;
 	allow_vcols = false;
 	material: TMaterial;
-	constants: TShaderConstant[];
-	tunits: TTextureUnit[];
+	constants: shader_const_t[];
+	tunits: tex_unit_t[];
 }
 
 class NodeShaderContext {
@@ -54,7 +54,7 @@ class NodeShaderContext {
 		for (let e of raw.data.vertex_elements) {
 			if (e.name == name) return;
 		}
-		let elem: TVertexElement = { name: name, data: data_type };
+		let elem: vertex_element_t = { name: name, data: data_type };
 		raw.data.vertex_elements.push(elem);
 	}
 
@@ -67,7 +67,7 @@ class NodeShaderContext {
 		return false;
 	}
 
-	static get_elem = (raw: NodeShaderContextRaw, name: string): TVertexElement => {
+	static get_elem = (raw: NodeShaderContextRaw, name: string): vertex_element_t => {
 		for (let elem of raw.data.vertex_elements) {
 			if (elem.name == name) {
 				return elem;
@@ -83,7 +83,7 @@ class NodeShaderContext {
 			}
 		}
 
-		let c: TShaderConstant = { name: name, type: ctype };
+		let c: shader_const_t = { name: name, type: ctype };
 		if (link != null) {
 			c.link = link;
 		}
@@ -97,7 +97,7 @@ class NodeShaderContext {
 			}
 		}
 
-		let c: TTextureUnit = { name: name };
+		let c: tex_unit_t = { name: name };
 		if (link != null) {
 			c.link = link;
 		}

+ 47 - 47
base/Sources/NodesMaterial.ts

@@ -2779,58 +2779,58 @@ class NodesMaterial {
 		]
 	];
 
-	static vectorCurvesButton = (ui: Zui, nodes: Nodes, node: TNode) => {
+	static vectorCurvesButton = (ui: ZuiRaw, nodes: NodesRaw, node: TNode) => {
 		let but = node.buttons[0];
-		let nhandle = Zui.handle("nodesmaterial_0").nest(node.id);
-		ui.row([1 / 3, 1 / 3, 1 / 3]);
-		ui.radio(nhandle.nest(0).nest(1), 0, "X");
-		ui.radio(nhandle.nest(0).nest(1), 1, "Y");
-		ui.radio(nhandle.nest(0).nest(1), 2, "Z");
+		let nhandle = Zui.nest(Zui.handle("nodesmaterial_0"), node.id);
+		Zui.row([1 / 3, 1 / 3, 1 / 3]);
+		Zui.radio(Zui.nest(Zui.nest(nhandle, 0), 1), 0, "X");
+		Zui.radio(Zui.nest(Zui.nest(nhandle, 0), 1), 1, "Y");
+		Zui.radio(Zui.nest(Zui.nest(nhandle, 0), 1), 2, "Z");
 		// Preview
-		let axis = nhandle.nest(0).nest(1).position;
+		let axis = Zui.nest(Zui.nest(nhandle, 0), 1).position;
 		let val: Float32Array[] = but.default_value[axis]; // [ [[x, y], [x, y], ..], [[x, y]], ..]
 		let num = val.length;
 		// for (let i = 0; i < num; ++i) { ui.line(); }
-		ui._y += nodes.LINE_H() * 5;
+		ui._y += Nodes.LINE_H() * 5;
 		// Edit
-		ui.row([1 / 5, 1 / 5, 3 / 5]);
-		if (ui.button("+")) {
+		Zui.row([1 / 5, 1 / 5, 3 / 5]);
+		if (Zui.button("+")) {
 			let f32a = new Float32Array(2);
 			f32a[0] = 0; f32a[1] = 0;
 			val.push(f32a);
 		}
-		if (ui.button("-")) {
+		if (Zui.button("-")) {
 			if (val.length > 2) val.pop();
 		}
-		let ihandle = nhandle.nest(0).nest(2).nest(axis, {position: 0});
-		let i = Math.floor(ui.slider(ihandle, "Index", 0, num - 1, false, 1, true, Align.Left));
+		let ihandle = Zui.nest(Zui.nest(Zui.nest(nhandle, 0), 2), axis, {position: 0});
+		let i = Math.floor(Zui.slider(ihandle, "Index", 0, num - 1, false, 1, true, Align.Left));
 		if (i >= val.length || i < 0) ihandle.value = i = val.length - 1; // Stay in bounds
-		ui.row([1 / 2, 1 / 2]);
-		nhandle.nest(0).nest(3).value = val[i][0];
-		nhandle.nest(0).nest(4).value = val[i][1];
-		val[i][0] = ui.slider(nhandle.nest(0).nest(3, {value: 0}), "X", -1, 1, true, 100, true, Align.Left);
-		val[i][1] = ui.slider(nhandle.nest(0).nest(4, {value: 0}), "Y", -1, 1, true, 100, true, Align.Left);
+		Zui.row([1 / 2, 1 / 2]);
+		Zui.nest(Zui.nest(nhandle, 0), 3).value = val[i][0];
+		Zui.nest(Zui.nest(nhandle, 0), 4).value = val[i][1];
+		val[i][0] = Zui.slider(Zui.nest(Zui.nest(nhandle, 0), 3, {value: 0}), "X", -1, 1, true, 100, true, Align.Left);
+		val[i][1] = Zui.slider(Zui.nest(Zui.nest(nhandle, 0), 4, {value: 0}), "Y", -1, 1, true, 100, true, Align.Left);
 	}
 
-	static colorRampButton = (ui: Zui, nodes: Nodes, node: TNode) => {
+	static colorRampButton = (ui: ZuiRaw, nodes: NodesRaw, node: TNode) => {
 		let but = node.buttons[0];
-		let nhandle = Zui.handle("nodesmaterial_1").nest(node.id);
+		let nhandle = Zui.nest(Zui.handle("nodesmaterial_1"), node.id);
 		let nx = ui._x;
 		let ny = ui._y;
 
 		// Preview
 		let vals: Float32Array[] = but.default_value; // [[r, g, b, a, pos], ..]
-		let sw = ui._w / nodes.SCALE();
+		let sw = ui._w / Nodes.SCALE();
 		for (let val of vals) {
 			let pos = val[4];
 			let col = color_from_floats(val[0], val[1], val[2]);
-			ui.fill(pos * sw, 0, (1.0 - pos) * sw, nodes.LINE_H() - 2 * nodes.SCALE(), col);
+			Zui.fill(pos * sw, 0, (1.0 - pos) * sw, Nodes.LINE_H() - 2 * Nodes.SCALE(), col);
 		}
-		ui._y += nodes.LINE_H();
+		ui._y += Nodes.LINE_H();
 		// Edit
-		let ihandle = nhandle.nest(0).nest(2);
-		ui.row([1 / 4, 1 / 4, 2 / 4]);
-		if (ui.button("+")) {
+		let ihandle = Zui.nest(Zui.nest(nhandle, 0), 2);
+		Zui.row([1 / 4, 1 / 4, 2 / 4]);
+		if (Zui.button("+")) {
 			let last = vals[vals.length - 1];
 			let f32a = new Float32Array(5);
 			f32a[0] = last[0];
@@ -2841,36 +2841,36 @@ class NodesMaterial {
 			vals.push(f32a);
 			ihandle.value += 1;
 		}
-		if (ui.button("-") && vals.length > 1) {
+		if (Zui.button("-") && vals.length > 1) {
 			vals.pop();
 			ihandle.value -= 1;
 		}
-		but.data = ui.combo(nhandle.nest(0).nest(1, {position: but.data}), [tr("Linear"), tr("Constant")], tr("Interpolate"));
+		but.data = Zui.combo(Zui.nest(Zui.nest(nhandle, 0), 1, {position: but.data}), [tr("Linear"), tr("Constant")], tr("Interpolate"));
 
-		ui.row([1 / 2, 1 / 2]);
-		let i = Math.floor(ui.slider(ihandle, "Index", 0, vals.length - 1, false, 1, true, Align.Left));
+		Zui.row([1 / 2, 1 / 2]);
+		let i = Math.floor(Zui.slider(ihandle, "Index", 0, vals.length - 1, false, 1, true, Align.Left));
 		if (i >= vals.length || i < 0) ihandle.value = i = vals.length - 1; // Stay in bounds
 
 		let val = vals[i];
-		nhandle.nest(0).nest(3).value = val[4];
-		val[4] = ui.slider(nhandle.nest(0).nest(3), "Pos", 0, 1, true, 100, true, Align.Left);
+		Zui.nest(Zui.nest(nhandle, 0), 3).value = val[4];
+		val[4] = Zui.slider(Zui.nest(Zui.nest(nhandle, 0), 3), "Pos", 0, 1, true, 100, true, Align.Left);
 		if (val[4] > 1.0) val[4] = 1.0; // Stay in bounds
 		else if (val[4] < 0.0) val[4] = 0.0;
 
-		let chandle = nhandle.nest(0).nest(4);
+		let chandle = Zui.nest(Zui.nest(nhandle, 0), 4);
 		chandle.color = color_from_floats(val[0], val[1], val[2]);
-		if (ui.text("", Align.Right, chandle.color) == State.Started) {
-			let rx = nx + ui._w - nodes.p(37);
-			let ry = ny - nodes.p(5);
+		if (Zui.text("", Align.Right, chandle.color) == State.Started) {
+			let rx = nx + ui._w - Nodes.p(37);
+			let ry = ny - Nodes.p(5);
 			nodes._inputStarted = ui.inputStarted = false;
-			nodes.rgbaPopup(ui, chandle, val, Math.floor(rx), Math.floor(ry + ui.ELEMENT_H()));
+			Nodes.rgbaPopup(ui, chandle, val, Math.floor(rx), Math.floor(ry + Zui.ELEMENT_H(ui)));
 		}
 		val[0] = color_get_rb(chandle.color) / 255;
 		val[1] = color_get_gb(chandle.color) / 255;
 		val[2] = color_get_bb(chandle.color) / 255;
 	}
 
-	static newGroupButton = (ui: Zui, nodes: Nodes, node: TNode) => {
+	static newGroupButton = (ui: ZuiRaw, nodes: NodesRaw, node: TNode) => {
 		if (node.name == "New Group") {
 			for (let i = 1; i < 999; ++i) {
 				node.name = tr("Group") + " " + i;
@@ -2927,7 +2927,7 @@ class NodesMaterial {
 				],
 				links: []
 			};
-			Project.materialGroups.push({ canvas: canvas, nodes: new Nodes() });
+			Project.materialGroups.push({ canvas: canvas, nodes: Nodes.create() });
 		}
 
 		let group: TNodeGroup = null;
@@ -2938,22 +2938,22 @@ class NodesMaterial {
 			}
 		}
 
-		if (ui.button(tr("Nodes"))) {
+		if (Zui.button(tr("Nodes"))) {
 			UINodes.groupStack.push(group);
 		}
 	}
 
-	static groupInputButton = (ui: Zui, nodes: Nodes, node: TNode) => {
+	static groupInputButton = (ui: ZuiRaw, nodes: NodesRaw, node: TNode) => {
 		NodesMaterial.addSocketButton(ui, nodes, node, node.outputs);
 	}
 
-	static groupOutputButton = (ui: Zui, nodes: Nodes, node: TNode) => {
+	static groupOutputButton = (ui: ZuiRaw, nodes: NodesRaw, node: TNode) => {
 		NodesMaterial.addSocketButton(ui, nodes, node, node.inputs);
 	}
 
-	static addSocketButton = (ui: Zui, nodes: Nodes, node: TNode, sockets: TNodeSocket[]) => {
-		if (ui.button(tr("Add"))) {
-			UIMenu.draw((ui: Zui) => {
+	static addSocketButton = (ui: ZuiRaw, nodes: NodesRaw, node: TNode, sockets: TNodeSocket[]) => {
+		if (Zui.button(tr("Add"))) {
+			UIMenu.draw((ui: ZuiRaw) => {
 				let groupStack = UINodes.groupStack;
 				let c = groupStack[groupStack.length - 1].canvas;
 				if (UIMenu.menuButton(ui, tr("RGBA"))) {
@@ -3010,9 +3010,9 @@ class NodesMaterial {
 		return type == "RGBA" ? _tr("Color") : type == "VECTOR" ? _tr("Vector") : _tr("Value");
 	}
 
-	static createSocket = (nodes: Nodes, node: TNode, name: string, type: string, canvas: TNodeCanvas, min = 0.0, max = 1.0, default_value: any = null): TNodeSocket => {
+	static createSocket = (nodes: NodesRaw, node: TNode, name: string, type: string, canvas: TNodeCanvas, min = 0.0, max = 1.0, default_value: any = null): TNodeSocket => {
 		return {
-			id: nodes.getSocketId(canvas.nodes),
+			id: Nodes.getSocketId(canvas.nodes),
 			node_id: node.id,
 			name: name == null ? NodesMaterial.get_socket_name(type) : name,
 			type: type,

+ 6 - 6
base/Sources/Operator.ts

@@ -12,7 +12,7 @@ class Operator {
 	}
 
 	static update = () => {
-		if (Mouse.startedAny() || Keyboard.startedAny()) {
+		if (mouse_started_any() || keyboard_started_any()) {
 			for (let op in Config.keymap) {
 				if (Operator.shortcut(Config.keymap[op])) Operator.run(op);
 			}
@@ -24,9 +24,9 @@ class Operator {
 		let shift = s.indexOf("shift") >= 0;
 		let ctrl = s.indexOf("ctrl") >= 0;
 		let alt = s.indexOf("alt") >= 0;
-		let flag = shift == Keyboard.down("shift") &&
-				   ctrl == Keyboard.down("control") &&
-				   alt == Keyboard.down("alt");
+		let flag = shift == keyboard_down("shift") &&
+				   ctrl == keyboard_down("control") &&
+				   alt == keyboard_down("alt");
 		if (s.indexOf("+") > 0) {
 			s = s.substr(s.lastIndexOf("+") + 1);
 			if (s == "number") return flag;
@@ -34,9 +34,9 @@ class Operator {
 		else if (shift || ctrl || alt) return flag;
 		let key = (s == "left" || s == "right" || s == "middle") ?
 			// Mouse
-			(type == ShortcutType.ShortcutDown ? Mouse.down(s) : Mouse.started(s)) :
+			(type == ShortcutType.ShortcutDown ? mouse_down(s) : mouse_started(s)) :
 			// Keyboard
-			(type == ShortcutType.ShortcutRepeat ? Keyboard.repeat(s) : type == ShortcutType.ShortcutDown ? Keyboard.down(s) : type == ShortcutType.ShortcutReleased ? Keyboard.released(s) : Keyboard.started(s));
+			(type == ShortcutType.ShortcutRepeat ? keyboard_repeat(s) : type == ShortcutType.ShortcutDown ? keyboard_down(s) : type == ShortcutType.ShortcutReleased ? keyboard_released(s) : keyboard_started(s));
 		return flag && key;
 	}
 }

+ 5 - 5
base/Sources/ParserMaterial.ts

@@ -21,7 +21,7 @@ class ParserMaterial {
 	static vert: NodeShaderRaw;
 	static frag: NodeShaderRaw;
 	static curshader: NodeShaderRaw;
-	static matcon: TMaterialContext;
+	static matcon: material_context_t;
 	static parsed: string[];
 	static parents: TNode[];
 
@@ -106,7 +106,7 @@ class ParserMaterial {
 		ParserMaterial.parsing_basecolor = false;
 	}
 
-	static parse = (canvas: TNodeCanvas, _con: NodeShaderContextRaw, _vert: NodeShaderRaw, _frag: NodeShaderRaw, _matcon: TMaterialContext): TShaderOut => {
+	static parse = (canvas: TNodeCanvas, _con: NodeShaderContextRaw, _vert: NodeShaderRaw, _frag: NodeShaderRaw, _matcon: material_context_t): TShaderOut => {
 		Nodes.updateCanvasFormat(canvas);
 		ParserMaterial.init();
 		ParserMaterial.canvases = [canvas];
@@ -1750,7 +1750,7 @@ class ParserMaterial {
 		return ParserMaterial.node_name(node) + "_store";
 	}
 
-	static texture_store = (node: TNode, tex: TBindTexture, tex_name: string, color_space: i32): string => {
+	static texture_store = (node: TNode, tex: bind_tex_t, tex_name: string, color_space: i32): string => {
 		ParserMaterial.matcon.bind_textures.push(tex);
 		NodeShaderContext.add_elem(ParserMaterial.curshader.context, "tex", "short2norm");
 		NodeShader.add_uniform(ParserMaterial.curshader, "sampler2D " + tex_name);
@@ -1869,14 +1869,14 @@ class ParserMaterial {
 		return "";
 	}
 
-	static make_texture = (image_node: TNode, tex_name: string, matname: string = null): TBindTexture => {
+	static make_texture = (image_node: TNode, tex_name: string, matname: string = null): bind_tex_t => {
 
 		let filepath = ParserMaterial.enumData(Base.enumTexts(image_node.type)[image_node.buttons[0].default_value]);
 		if (filepath == "" || filepath.indexOf(".") == -1) {
 			return null;
 		}
 
-		let tex: TBindTexture = {
+		let tex: bind_tex_t = {
 			name: tex_name,
 			file: filepath
 		};

+ 2 - 2
base/Sources/Path.ts

@@ -13,7 +13,7 @@ class Path {
 	static textureFormats = ["jpg", "jpeg", "png", "tga", "bmp", "psd", "gif", "hdr", "k"];
 
 	static meshImporters = new Map<string, (s: string, f: (a: any)=>void)=>void>();
-	static textureImporters = new Map<string, (s: string, f: (img: ImageRaw)=>void)=>void>();
+	static textureImporters = new Map<string, (s: string, f: (img: image_t)=>void)=>void>();
 
 	static baseColorExt = ["albedo", "alb", "basecol", "basecolor", "diffuse", "diff", "base", "bc", "d", "color", "col"];
 	static opacityExt = ["opac", "opacity", "alpha"];
@@ -73,7 +73,7 @@ class Path {
 			let cmd = Path.pwd;
 			let save = (Path.isProtected() ? Krom.savePath() : Path.data() + Path.sep) + "working_dir.txt";
 			Krom.sysCommand(cmd + ' > "' + save + '"');
-			Path.workingDirCache = trim_end(System.bufferToString(Krom.loadBlob(save)));
+			Path.workingDirCache = trim_end(sys_buffer_to_string(Krom.loadBlob(save)));
 		}
 		return Path.workingDirCache;
 	}

+ 29 - 29
base/Sources/PhysicsBody.ts

@@ -62,11 +62,11 @@ class PhysicsBody {
 	static quat1: Ammo.btQuaternion;
 	static trans1: Ammo.btTransform;
 	static trans2: Ammo.btTransform;
-	static quat = Quat.create();
+	static quat = quat_create();
 
-	static convexHullCache = new Map<TMeshData, Ammo.btConvexHullShape>();
-	static triangleMeshCache = new Map<TMeshData, Ammo.btTriangleMesh>();
-	static usersCache = new Map<TMeshData, i32>();
+	static convexHullCache = new Map<mesh_data_t, Ammo.btConvexHullShape>();
+	static triangleMeshCache = new Map<mesh_data_t, Ammo.btTriangleMesh>();
+	static usersCache = new Map<mesh_data_t, i32>();
 
 	static create(): PhysicsBodyRaw {
 		if (PhysicsBody.first) {
@@ -170,11 +170,11 @@ class PhysicsBody {
 		}
 
 		PhysicsBody.trans1.setIdentity();
-		PhysicsBody.vec1.setX(Transform.worldx(transform));
-		PhysicsBody.vec1.setY(Transform.worldy(transform));
-		PhysicsBody.vec1.setZ(Transform.worldz(transform));
+		PhysicsBody.vec1.setX(transform_world_x(transform));
+		PhysicsBody.vec1.setY(transform_world_y(transform));
+		PhysicsBody.vec1.setZ(transform_world_z(transform));
 		PhysicsBody.trans1.setOrigin(PhysicsBody.vec1);
-		Quat.fromMat(PhysicsBody.quat, transform.world);
+		quat_from_mat(PhysicsBody.quat, transform.world);
 		PhysicsBody.quat1.setValue(PhysicsBody.quat.x, PhysicsBody.quat.y, PhysicsBody.quat.z, PhysicsBody.quat.w);
 		PhysicsBody.trans1.setRotation(PhysicsBody.quat1);
 		PhysicsBody.trans2.setIdentity();
@@ -226,15 +226,15 @@ class PhysicsBody {
 		let qw: Ammo.btQuadWord = q;
 
 		let transform = pb.object.transform;
-		Vec4.set(transform.loc, p.x(), p.y(), p.z());
-		Quat.set(transform.rot, qw.x(), qw.y(), qw.z(), qw.w());
+		vec4_set(transform.loc, p.x(), p.y(), p.z());
+		quat_set(transform.rot, qw.x(), qw.y(), qw.z(), qw.w());
 		if (pb.object.parent != null) {
 			let ptransform = pb.object.parent.transform;
-			transform.loc.x -= Transform.worldx(ptransform);
-			transform.loc.y -= Transform.worldy(ptransform);
-			transform.loc.z -= Transform.worldz(ptransform);
+			transform.loc.x -= transform_world_x(ptransform);
+			transform.loc.y -= transform_world_y(ptransform);
+			transform.loc.z -= transform_world_z(ptransform);
 		}
-		Transform.buildMatrix(transform);
+		transform_build_matrix(transform);
 	}
 
 	static removeFromWorld = (pb: PhysicsBodyRaw) => {
@@ -245,12 +245,12 @@ class PhysicsBody {
 		pb.body.activate(false);
 	}
 
-	static setGravity = (pb: PhysicsBodyRaw, v: TVec4) => {
+	static setGravity = (pb: PhysicsBodyRaw, v: vec4_t) => {
 		PhysicsBody.vec1.setValue(v.x, v.y, v.z);
 		pb.body.setGravity(PhysicsBody.vec1);
 	}
 
-	static applyForce = (pb: PhysicsBodyRaw, force: TVec4, loc: TVec4 = null) => {
+	static applyForce = (pb: PhysicsBodyRaw, force: vec4_t, loc: vec4_t = null) => {
 		PhysicsBody.activate(pb);
 		PhysicsBody.vec1.setValue(force.x, force.y, force.z);
 		if (loc == null) {
@@ -262,7 +262,7 @@ class PhysicsBody {
 		}
 	}
 
-	static applyImpulse = (pb: PhysicsBodyRaw, impulse: TVec4, loc: TVec4 = null) => {
+	static applyImpulse = (pb: PhysicsBodyRaw, impulse: vec4_t, loc: vec4_t = null) => {
 		PhysicsBody.activate(pb);
 		PhysicsBody.vec1.setValue(impulse.x, impulse.y, impulse.z);
 		if (loc == null) {
@@ -274,13 +274,13 @@ class PhysicsBody {
 		}
 	}
 
-	static applyTorque = (pb: PhysicsBodyRaw, torque: TVec4) => {
+	static applyTorque = (pb: PhysicsBodyRaw, torque: vec4_t) => {
 		PhysicsBody.activate(pb);
 		PhysicsBody.vec1.setValue(torque.x, torque.y, torque.z);
 		pb.body.applyTorque(PhysicsBody.vec1);
 	}
 
-	static applyTorqueImpulse = (pb: PhysicsBodyRaw, torque: TVec4) => {
+	static applyTorqueImpulse = (pb: PhysicsBodyRaw, torque: vec4_t) => {
 		PhysicsBody.activate(pb);
 		PhysicsBody.vec1.setValue(torque.x, torque.y, torque.z);
 		pb.body.applyTorqueImpulse(PhysicsBody.vec1);
@@ -296,9 +296,9 @@ class PhysicsBody {
 		pb.body.setAngularFactor(PhysicsBody.vec1);
 	}
 
-	static getLinearVelocity = (pb: PhysicsBodyRaw): TVec4 => {
+	static getLinearVelocity = (pb: PhysicsBodyRaw): vec4_t => {
 		let v = pb.body.getLinearVelocity();
-		return Vec4.create(v.x(), v.y(), v.z());
+		return vec4_create(v.x(), v.y(), v.z());
 	}
 
 	static setLinearVelocity = (pb: PhysicsBodyRaw, x: f32, y: f32, z: f32) => {
@@ -306,9 +306,9 @@ class PhysicsBody {
 		pb.body.setLinearVelocity(PhysicsBody.vec1);
 	}
 
-	static getAngularVelocity = (pb: PhysicsBodyRaw): TVec4 => {
+	static getAngularVelocity = (pb: PhysicsBodyRaw): vec4_t => {
 		let v = pb.body.getAngularVelocity();
-		return Vec4.create(v.x(), v.y(), v.z());
+		return vec4_create(v.x(), v.y(), v.z());
 	}
 
 	static setAngularVelocity = (pb: PhysicsBodyRaw, x: f32, y: f32, z: f32) => {
@@ -321,7 +321,7 @@ class PhysicsBody {
 		pb.friction = f;
 	}
 
-	static setScale = (pb: PhysicsBodyRaw, v: TVec4) => {
+	static setScale = (pb: PhysicsBodyRaw, v: vec4_t) => {
 		pb.currentScaleX = v.x;
 		pb.currentScaleY = v.y;
 		pb.currentScaleZ = v.z;
@@ -336,10 +336,10 @@ class PhysicsBody {
 
 	static syncTransform = (pb: PhysicsBodyRaw) => {
 		let t = pb.object.transform;
-		Transform.buildMatrix(t);
-		PhysicsBody.vec1.setValue(Transform.worldx(t), Transform.worldy(t), Transform.worldz(t));
+		transform_build_matrix(t);
+		PhysicsBody.vec1.setValue(transform_world_x(t), transform_world_y(t), transform_world_z(t));
 		PhysicsBody.trans1.setOrigin(PhysicsBody.vec1);
-		Quat.fromMat(PhysicsBody.quat, t.world);
+		quat_from_mat(PhysicsBody.quat, t.world);
 		PhysicsBody.quat1.setValue(PhysicsBody.quat.x, PhysicsBody.quat.y, PhysicsBody.quat.z, PhysicsBody.quat.w);
 		PhysicsBody.trans1.setRotation(PhysicsBody.quat1);
 		pb.body.setWorldTransform(PhysicsBody.trans1);
@@ -352,7 +352,7 @@ class PhysicsBody {
 		pb.body.setCcdMotionThreshold(motionThreshold);
 	}
 
-	static fillConvexHull = (pb: PhysicsBodyRaw, scale: TVec4, margin: f32): Ammo.btConvexHullShape => {
+	static fillConvexHull = (pb: PhysicsBodyRaw, scale: vec4_t, margin: f32): Ammo.btConvexHullShape => {
 		// Check whether shape already exists
 		let data = pb.object.ext.data;
 		let shape = PhysicsBody.convexHullCache.get(data);
@@ -384,7 +384,7 @@ class PhysicsBody {
 		return shape;
 	}
 
-	static fillTriangleMesh = (pb: PhysicsBodyRaw, scale: TVec4): Ammo.btTriangleMesh => {
+	static fillTriangleMesh = (pb: PhysicsBodyRaw, scale: vec4_t): Ammo.btTriangleMesh => {
 		// Check whether shape already exists
 		let data = pb.object.ext.data;
 		let triangleMesh = PhysicsBody.triangleMeshCache.get(data);

+ 22 - 22
base/Sources/PhysicsWorld.ts

@@ -16,12 +16,12 @@ class PhysicsWorld {
 	static active: PhysicsWorldRaw = null;
 	static vec1: Ammo.btVector3 = null;
 	static vec2: Ammo.btVector3 = null;
-	static v1 = Vec4.create();
-	static v2 = Vec4.create();
+	static v1 = vec4_create();
+	static v2 = vec4_create();
 
 	static load = (done: ()=>void) => {
 		let b = Krom.loadBlob("data/plugins/ammo.js");
-		globalThis.eval(System.bufferToString(b));
+		globalThis.eval(sys_buffer_to_string(b));
 		let print = (s: string) => { Krom.log(s); };
 		Ammo({print: print}).then(done);
 	}
@@ -45,10 +45,10 @@ class PhysicsWorld {
 		pw.dispatcher = new Ammo.btCollisionDispatcher(collisionConfiguration);
 		let solver = new Ammo.btSequentialImpulseConstraintSolver();
 		pw.world = new Ammo.btDiscreteDynamicsWorld(pw.dispatcher, broadphase, solver, collisionConfiguration);
-		PhysicsWorld.setGravity(pw, Vec4.create(0, 0, -9.81));
+		PhysicsWorld.setGravity(pw, vec4_create(0, 0, -9.81));
 	}
 
-	static setGravity = (pw: PhysicsWorldRaw, v: TVec4) => {
+	static setGravity = (pw: PhysicsWorldRaw, v: vec4_t) => {
 		PhysicsWorld.vec1.setValue(v.x, v.y, v.z);
 		pw.world.setGravity(PhysicsWorld.vec1);
 	}
@@ -91,7 +91,7 @@ class PhysicsWorld {
 	}
 
 	static lateUpdate = (pw: PhysicsWorldRaw) => {
-		let t = Time.delta * pw.timeScale;
+		let t = time_delta() * pw.timeScale;
 		if (t == 0.0) return; // Simulation paused
 
 		pw.world.stepSimulation(pw.timeStep, pw.maxSteps, t);
@@ -122,9 +122,9 @@ class PhysicsWorld {
 				let cp: TPair = {
 					a: body0.userIndex,
 					b: body1.userIndex,
-					posA: Vec4.create(posA.x(), posA.y(), posA.z()),
-					posB: Vec4.create(posB.x(), posB.y(), posB.z()),
-					normOnB: Vec4.create(nor.x(), nor.y(), nor.z()),
+					posA: vec4_create(posA.x(), posA.y(), posA.z()),
+					posB: vec4_create(posB.x(), posB.y(), posB.z()),
+					normOnB: vec4_create(nor.x(), nor.y(), nor.z()),
 					impulse: pt.getAppliedImpulse(),
 					distance: pt.getDistance()
 				};
@@ -134,16 +134,16 @@ class PhysicsWorld {
 	}
 
 	static pickClosest = (pw: PhysicsWorldRaw, inputX: f32, inputY: f32): PhysicsBodyRaw => {
-		let camera = Scene.camera;
-		let start = Vec4.create();
-		let end = Vec4.create();
-		RayCaster.getDirection(start, end, inputX, inputY, camera);
-		let hit = PhysicsWorld.rayCast(pw, Mat4.getLoc(camera.base.transform.world), end);
+		let camera = scene_camera;
+		let start = vec4_create();
+		let end = vec4_create();
+		raycast_get_dir(start, end, inputX, inputY, camera);
+		let hit = PhysicsWorld.rayCast(pw, mat4_get_loc(camera.base.transform.world), end);
 		let body = (hit != null) ? hit.body : null;
 		return body;
 	}
 
-	static rayCast = (pw: PhysicsWorldRaw, from: TVec4, to: TVec4, group: i32 = 0x00000001, mask = 0xffffffff): THit => {
+	static rayCast = (pw: PhysicsWorldRaw, from: vec4_t, to: vec4_t, group: i32 = 0x00000001, mask = 0xffffffff): THit => {
 		let rayFrom = PhysicsWorld.vec1;
 		let rayTo = PhysicsWorld.vec2;
 		rayFrom.setValue(from.x, from.y, from.z);
@@ -165,9 +165,9 @@ class PhysicsWorld {
 			let co = rayCallback.get_m_collisionObject();
 			let body = Ammo.btRigidBody.prototype.upcast(co);
 			let hit = rayCallback.get_m_hitPointWorld();
-			Vec4.set(PhysicsWorld.v1, hit.x(), hit.y(), hit.z());
+			vec4_set(PhysicsWorld.v1, hit.x(), hit.y(), hit.z());
 			let norm = rayCallback.get_m_hitNormalWorld();
-			Vec4.set(PhysicsWorld.v2, norm.x(), norm.y(), norm.z());
+			vec4_set(PhysicsWorld.v2, norm.x(), norm.y(), norm.z());
 			pb = pw.bodyMap.get(body.userIndex);
 			hitInfo = {
 				body: pb,
@@ -183,16 +183,16 @@ class PhysicsWorld {
 
 type THit = {
 	body: PhysicsBodyRaw;
-	pos: TVec4;
-	normal: TVec4;
+	pos: vec4_t;
+	normal: vec4_t;
 }
 
 type TPair = {
 	a: i32;
 	b: i32;
-	posA: TVec4;
-	posB: TVec4;
-	normOnB: TVec4;
+	posA: vec4_t;
+	posB: vec4_t;
+	normOnB: vec4_t;
 	impulse: f32;
 	distance: f32;
 }

+ 3 - 3
base/Sources/Plugin.ts

@@ -1,6 +1,6 @@
 
 class PluginRaw {
-	drawUI: (ui: Zui)=>void = null;
+	drawUI: (ui: ZuiRaw)=>void = null;
 	draw: ()=>void = null;
 	update: ()=>void = null;
 	delete: ()=>void = null;
@@ -25,8 +25,8 @@ class Plugin {
 		try {
 			Data.getBlob("plugins/" + plugin, (blob: ArrayBuffer) => {
 				Plugin.pluginName = plugin;
-				// (1, eval)(System.bufferToString(blob)); // Global scope
-				eval(System.bufferToString(blob)); // Local scope
+				// (1, eval)(sys_buffer_to_string(blob)); // Global scope
+				eval(sys_buffer_to_string(blob)); // Local scope
 				Data.deleteBlob("plugins/" + plugin);
 			});
 		}

+ 62 - 62
base/Sources/Project.ts

@@ -20,9 +20,9 @@ class Project {
 	static atlasNames: string[] = null;
 	///end
 	///if is_lab
-	static materialData: TMaterialData = null; ////
+	static materialData: material_data_t = null; ////
 	static materials: any[] = null; ////
-	static nodes: Nodes;
+	static nodes: NodesRaw;
 	static canvas: TNodeCanvas;
 	static defaultCanvas: ArrayBuffer = null;
 	///end
@@ -34,12 +34,12 @@ class Project {
 				return;
 			}
 
-			let current = Graphics2.current;
-			if (current != null) Graphics2.end(current);
+			let current = _g2_current;
+			if (current != null) g2_end(current);
 
 			ImportArm.runProject(path);
 
-			if (current != null) Graphics2.begin(current, false);
+			if (current != null) g2_begin(current, false);
 		});
 	}
 
@@ -48,9 +48,9 @@ class Project {
 			///if krom_ios
 			let documentDirectory = Krom.saveDialog("", "");
 			documentDirectory = documentDirectory.substr(0, documentDirectory.length - 8); // Strip /'untitled'
-			Project.filepath = documentDirectory + "/" + System.title + ".arm";
+			Project.filepath = documentDirectory + "/" + sys_title() + ".arm";
 			///elseif krom_android
-			Project.filepath = Krom.savePath() + "/" + System.title + ".arm";
+			Project.filepath = Krom.savePath() + "/" + sys_title() + ".arm";
 			///else
 			Project.projectSaveAs(saveAndQuit);
 			return;
@@ -59,12 +59,12 @@ class Project {
 
 		///if (krom_windows || krom_linux || krom_darwin)
 		let filename = Project.filepath.substring(Project.filepath.lastIndexOf(Path.sep) + 1, Project.filepath.length - 4);
-		System.title = filename + " - " + manifest_title;
+		sys_title_set(filename + " - " + manifest_title);
 		///end
 
 		let _init = () => {
 			ExportArm.runProject();
-			if (saveAndQuit) System.stop();
+			if (saveAndQuit) sys_stop();
 		}
 		App.notifyOnInit(_init);
 	}
@@ -81,8 +81,8 @@ class Project {
 
 	static projectNewBox = () => {
 		///if (is_paint || is_sculpt)
-		UIBox.showCustom((ui: Zui) => {
-			if (ui.tab(Zui.handle("project_0"), tr("New Project"))) {
+		UIBox.showCustom((ui: ZuiRaw) => {
+			if (Zui.tab(Zui.handle("project_0"), tr("New Project"))) {
 				if (Project.meshList == null) {
 					Project.meshList = File.readDirectory(Path.data() + Path.sep + "meshes");
 					for (let i = 0; i < Project.meshList.length; ++i) Project.meshList[i] = Project.meshList[i].substr(0, Project.meshList[i].length - 4); // Trim .arm
@@ -91,16 +91,16 @@ class Project {
 					Project.meshList.unshift("rounded_cube");
 				}
 
-				ui.row([0.5, 0.5]);
-				Context.raw.projectType = ui.combo(Zui.handle("project_1", { position: Context.raw.projectType }), Project.meshList, tr("Template"), true);
-				Context.raw.projectAspectRatio = ui.combo(Zui.handle("project_2", { position: Context.raw.projectAspectRatio }), ["1:1", "2:1", "1:2"], tr("Aspect Ratio"), true);
+				Zui.row([0.5, 0.5]);
+				Context.raw.projectType = Zui.combo(Zui.handle("project_1", { position: Context.raw.projectType }), Project.meshList, tr("Template"), true);
+				Context.raw.projectAspectRatio = Zui.combo(Zui.handle("project_2", { position: Context.raw.projectAspectRatio }), ["1:1", "2:1", "1:2"], tr("Aspect Ratio"), true);
 
-				ui.endElement();
-				ui.row([0.5, 0.5]);
-				if (ui.button(tr("Cancel"))) {
+				Zui.endElement();
+				Zui.row([0.5, 0.5]);
+				if (Zui.button(tr("Cancel"))) {
 					UIBox.hide();
 				}
-				if (ui.button(tr("OK")) || ui.isReturnDown) {
+				if (Zui.button(tr("OK")) || ui.isReturnDown) {
 					Project.projectNew();
 					Viewport.scaleToBounds();
 					UIBox.hide();
@@ -117,7 +117,7 @@ class Project {
 
 	static projectNew = (resetLayers = true) => {
 		///if (krom_windows || krom_linux || krom_darwin)
-		System.title = manifest_title;
+		sys_title_set(manifest_title);
 		///end
 		Project.filepath = "";
 
@@ -142,7 +142,7 @@ class Project {
 			Data.deleteMesh(p.data._handle);
 			MeshObject.remove(p);
 		}
-		let meshes = Scene.meshes;
+		let meshes = scene_meshes;
 		let len = meshes.length;
 		for (let i = 0; i < len; ++i) {
 			let m = meshes[len - i - 1];
@@ -159,7 +159,7 @@ class Project {
 		}
 
 		if (Context.raw.projectType != ProjectModel.ModelRoundedCube) {
-			let raw: TMeshData = null;
+			let raw: mesh_data_t = null;
 			if (Context.raw.projectType == ProjectModel.ModelSphere || Context.raw.projectType == ProjectModel.ModelTessellatedPlane) {
 				let mesh: any = Context.raw.projectType == ProjectModel.ModelSphere ?
 					Geom.make_uv_sphere(1, 512, 256) :
@@ -178,24 +178,24 @@ class Project {
 						f32a[i * 4 + 3] = 1.0;
 					}
 
-					let imgmesh = Image.fromBytes(f32a.buffer, Config.getTextureResX(), Config.getTextureResY(), TextureFormat.RGBA128);
+					let imgmesh = image_from_bytes(f32a.buffer, Config.getTextureResX(), Config.getTextureResY(), TextureFormat.RGBA128);
 					let texpaint = Project.layers[0].texpaint;
-					Graphics2.begin(texpaint.g2, false);
+					g2_begin(texpaint.g2, false);
 					texpaint.g2.pipeline = Base.pipeCopy128;
-					Graphics2.drawScaledImage(imgmesh, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+					g2_draw_scaled_image(imgmesh, 0, 0, Config.getTextureResX(), Config.getTextureResY());
 					texpaint.g2.pipeline = null;
-					Graphics2.end(texpaint.g2);
+					g2_end(texpaint.g2);
 				});
 				///end
 			}
 			else {
 				Data.getBlob("meshes/" + Project.meshList[Context.raw.projectType] + ".arm", (b: ArrayBuffer) => {
-					raw = ArmPack.decode(b).mesh_datas[0];
+					raw = armpack_decode(b).mesh_datas[0];
 				});
 			}
 
-			let md: TMeshData;
-			MeshData.create(raw, (mdata: TMeshData) => { md = mdata; });
+			let md: mesh_data_t;
+			MeshData.create(raw, (mdata: mesh_data_t) => { md = mdata; });
 			Data.cachedMeshes.set("SceneTessellated", md);
 
 			if (Context.raw.projectType == ProjectModel.ModelTessellatedPlane) {
@@ -204,24 +204,24 @@ class Project {
 		}
 
 		let n = Context.raw.projectType == ProjectModel.ModelRoundedCube ? ".Cube" : "Tessellated";
-		Data.getMesh("Scene", n, (md: TMeshData) => {
+		Data.getMesh("Scene", n, (md: mesh_data_t) => {
 
-			let current = Graphics2.current;
-			if (current != null) Graphics2.end(current);
+			let current = _g2_current;
+			if (current != null) g2_end(current);
 
 			///if is_paint
 			Context.raw.pickerMaskHandle.position = PickerMask.MaskNone;
 			///end
 
 			MeshObject.setData(Context.raw.paintObject, md);
-			Vec4.set(Context.raw.paintObject.base.transform.scale, 1, 1, 1);
-			Transform.buildMatrix(Context.raw.paintObject.base.transform);
+			vec4_set(Context.raw.paintObject.base.transform.scale, 1, 1, 1);
+			transform_build_matrix(Context.raw.paintObject.base.transform);
 			Context.raw.paintObject.base.name = n;
 			Project.paintObjects = [Context.raw.paintObject];
 			///if (is_paint || is_sculpt)
 			while (Project.materials.length > 0) SlotMaterial.unload(Project.materials.pop());
 			///end
-			Data.getMaterial("Scene", "Material", (m: TMaterialData) => {
+			Data.getMaterial("Scene", "Material", (m: material_data_t) => {
 				///if (is_paint || is_sculpt)
 				Project.materials.push(SlotMaterial.create(m));
 				///end
@@ -288,17 +288,17 @@ class Project {
 				App.notifyOnInit(Base.initLayers);
 			}
 
-			if (current != null) Graphics2.begin(current, false);
+			if (current != null) g2_begin(current, false);
 
 			Context.raw.savedEnvmap = null;
 			Context.raw.envmapLoaded = false;
-			Scene.world._envmap = Context.raw.emptyEnvmap;
-			Scene.world.envmap = "World_radiance.k";
+			scene_world._envmap = Context.raw.emptyEnvmap;
+			scene_world.envmap = "World_radiance.k";
 			Context.raw.showEnvmapHandle.selected = Context.raw.showEnvmap = false;
-			Scene.world._radiance = Context.raw.defaultRadiance;
-			Scene.world._radianceMipmaps = Context.raw.defaultRadianceMipmaps;
-			Scene.world._irradiance = Context.raw.defaultIrradiance;
-			Scene.world.strength = 4.0;
+			scene_world._radiance = Context.raw.defaultRadiance;
+			scene_world._radianceMipmaps = Context.raw.defaultRadianceMipmaps;
+			scene_world._irradiance = Context.raw.defaultIrradiance;
+			scene_world.strength = 4.0;
 
 			///if (is_paint || is_sculpt)
 			Context.initTool();
@@ -344,7 +344,7 @@ class Project {
 				n.buttons[0].default_value = assetIndex;
 				let links = Context.raw.brush.canvas.links;
 				links.push({
-					id: Context.raw.brush.nodes.getLinkId(links),
+					id: Nodes.getLinkId(links),
 					from_id: n.id,
 					from_socket: 0,
 					to_id: 0,
@@ -380,38 +380,38 @@ class Project {
 		// Data.getBlob(path, (b: Blob) => {});
 		///end
 
-		UIBox.showCustom((ui: Zui) => {
+		UIBox.showCustom((ui: ZuiRaw) => {
 			let tabVertical = Config.raw.touch_ui;
-			if (ui.tab(Zui.handle("project_3"), tr("Import Mesh"), tabVertical)) {
+			if (Zui.tab(Zui.handle("project_3"), tr("Import Mesh"), tabVertical)) {
 
 				if (path.toLowerCase().endsWith(".obj")) {
-					Context.raw.splitBy = ui.combo(Zui.handle("project_4"), [
+					Context.raw.splitBy = Zui.combo(Zui.handle("project_4"), [
 						tr("Object"),
 						tr("Group"),
 						tr("Material"),
 						tr("UDIM Tile"),
 					], tr("Split By"), true);
-					if (ui.isHovered) ui.tooltip(tr("Split .obj mesh into objects"));
+					if (ui.isHovered) Zui.tooltip(tr("Split .obj mesh into objects"));
 				}
 
 				// if (path.toLowerCase().endsWith(".fbx")) {
-				// 	Context.raw.parseTransform = ui.check(Zui.handle("project_5", { selected: Context.raw.parseTransform }), tr("Parse Transforms"));
-				// 	if (ui.isHovered) ui.tooltip(tr("Load per-object transforms from .fbx"));
+				// 	Context.raw.parseTransform = Zui.check(Zui.handle("project_5", { selected: Context.raw.parseTransform }), tr("Parse Transforms"));
+				// 	if (ui.isHovered) Zui.tooltip(tr("Load per-object transforms from .fbx"));
 				// }
 
 				///if (is_paint || is_sculpt)
 				// if (path.toLowerCase().endsWith(".fbx") || path.toLowerCase().endsWith(".blend")) {
 				if (path.toLowerCase().endsWith(".blend")) {
-					Context.raw.parseVCols = ui.check(Zui.handle("project_6", { selected: Context.raw.parseVCols }), tr("Parse Vertex Colors"));
-					if (ui.isHovered) ui.tooltip(tr("Import vertex color data"));
+					Context.raw.parseVCols = Zui.check(Zui.handle("project_6", { selected: Context.raw.parseVCols }), tr("Parse Vertex Colors"));
+					if (ui.isHovered) Zui.tooltip(tr("Import vertex color data"));
 				}
 				///end
 
-				ui.row([0.45, 0.45, 0.1]);
-				if (ui.button(tr("Cancel"))) {
+				Zui.row([0.45, 0.45, 0.1]);
+				if (Zui.button(tr("Cancel"))) {
 					UIBox.hide();
 				}
-				if (ui.button(tr("Import")) || ui.isReturnDown) {
+				if (Zui.button(tr("Import")) || ui.isReturnDown) {
 					UIBox.hide();
 					let doImport = () => {
 						///if (is_paint || is_sculpt)
@@ -431,7 +431,7 @@ class Project {
 					doImport();
 					///end
 				}
-				if (ui.button(tr("?"))) {
+				if (Zui.button(tr("?"))) {
 					File.loadUrl("https://github.com/armory3d/armorpaint_docs/blob/master/faq.md");
 				}
 			}
@@ -447,9 +447,9 @@ class Project {
 	}
 
 	static unwrapMeshBox = (mesh: any, done: (a: any)=>void, skipUI = false) => {
-		UIBox.showCustom((ui: Zui) => {
+		UIBox.showCustom((ui: ZuiRaw) => {
 			let tabVertical = Config.raw.touch_ui;
-			if (ui.tab(Zui.handle("project_7"), tr("Unwrap Mesh"), tabVertical)) {
+			if (Zui.tab(Zui.handle("project_7"), tr("Unwrap Mesh"), tabVertical)) {
 
 				let unwrapPlugins: string[] = [];
 				if (BoxPreferences.filesPlugin == null) {
@@ -462,13 +462,13 @@ class Project {
 				}
 				unwrapPlugins.push("equirect");
 
-				let unwrapBy = ui.combo(Zui.handle("project_8"), unwrapPlugins, tr("Plugin"), true);
+				let unwrapBy = Zui.combo(Zui.handle("project_8"), unwrapPlugins, tr("Plugin"), true);
 
-				ui.row([0.5, 0.5]);
-				if (ui.button(tr("Cancel"))) {
+				Zui.row([0.5, 0.5]);
+				if (Zui.button(tr("Cancel"))) {
 					UIBox.hide();
 				}
-				if (ui.button(tr("Unwrap")) || ui.isReturnDown || skipUI) {
+				if (Zui.button(tr("Unwrap")) || ui.isReturnDown || skipUI) {
 					UIBox.hide();
 					let doUnwrap = () => {
 						if (unwrapBy == unwrapPlugins.length - 1) {
@@ -553,7 +553,7 @@ class Project {
 		else load(asset.file);
 	}
 
-	static getImage = (asset: TAsset): ImageRaw => {
+	static getImage = (asset: TAsset): image_t => {
 		return asset != null ? Project.assetMap.get(asset.id) : null;
 	}
 
@@ -639,6 +639,6 @@ class Project {
 }
 
 type TNodeGroup = {
-	nodes: Nodes;
+	nodes: NodesRaw;
 	canvas: TNodeCanvas;
 }

+ 2 - 2
base/Sources/ProjectFormat.ts

@@ -19,7 +19,7 @@ type TProjectFormat = {
 	material_icons?: ArrayBuffer[];
 	font_assets?: string[];
 	layer_datas?: TLayerData[];
-	mesh_datas?: TMeshData[];
+	mesh_datas?: mesh_data_t[];
 	mesh_assets?: string[];
 	mesh_icons?: ArrayBuffer[];
 	///end
@@ -32,7 +32,7 @@ type TProjectFormat = {
 	///if is_lab
 	material?: TNodeCanvas;
 	material_groups?: TNodeCanvas[];
-	mesh_data?: TMeshData;
+	mesh_data?: mesh_data_t;
 	mesh_icon?: ArrayBuffer;
 	///end
 }

+ 181 - 181
base/Sources/RenderPathBase.ts

@@ -5,7 +5,7 @@ class RenderPathBase {
 	static superSample = 1.0;
 	static lastX = -1.0;
 	static lastY = -1.0;
-	static bloomMipmaps: RenderTargetRaw[];
+	static bloomMipmaps: render_target_t[];
 	static bloomCurrentMip = 0;
 	static bloomSampleScale: f32;
 	///if arm_voxels
@@ -23,7 +23,7 @@ class RenderPathBase {
 		RenderPathBase.voxelsCreated = true;
 
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = targetName;
 			t.format = "R8";
 			t.width = RenderPathBase.voxelsRes;
@@ -31,7 +31,7 @@ class RenderPathBase {
 			t.depth = RenderPathBase.voxelsRes;
 			t.is_image = true;
 			t.mipmaps = true;
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 	}
 	///end
@@ -39,12 +39,12 @@ class RenderPathBase {
 	static applyConfig = () => {
 		if (RenderPathBase.superSample != Config.raw.rp_supersample) {
 			RenderPathBase.superSample = Config.raw.rp_supersample;
-			for (let rt of RenderPath.renderTargets.values()) {
+			for (let rt of render_path_render_targets.values()) {
 				if (rt.width == 0 && rt.scale != null) {
 					rt.scale = RenderPathBase.superSample;
 				}
 			}
-			RenderPath.resize();
+			render_path_resize();
 		}
 		///if arm_voxels
 		if (!RenderPathBase.voxelsCreated) RenderPathBase.initVoxels();
@@ -55,10 +55,10 @@ class RenderPathBase {
 		return RenderPathBase.superSample;
 	}
 
-	static drawCompass = (currentG: Graphics4Raw) => {
+	static drawCompass = (currentG: g4_t) => {
 		if (Context.raw.showCompass) {
-			let cam = Scene.camera;
-			let compass: TMeshObject = Scene.getChild(".Compass").ext;
+			let cam = scene_camera;
+			let compass: TMeshObject = scene_get_child(".Compass").ext;
 
 			let _visible = compass.base.visible;
 			let _parent = compass.base.parent;
@@ -67,13 +67,13 @@ class RenderPathBase {
 			let crot = cam.base.transform.rot;
 			let ratio = App.w() / App.h();
 			let _P = cam.P;
-			cam.P = Mat4.ortho(-8 * ratio, 8 * ratio, -8, 8, -2, 2);
+			cam.P = mat4_ortho(-8 * ratio, 8 * ratio, -8, 8, -2, 2);
 			compass.base.visible = true;
 			compass.base.parent = cam.base;
-			compass.base.transform.loc = Vec4.create(7.4 * ratio, 7.0, -1);
-			compass.base.transform.rot = Quat.create(-crot.x, -crot.y, -crot.z, crot.w);
-			Vec4.set(compass.base.transform.scale, 0.4, 0.4, 0.4);
-			Transform.buildMatrix(compass.base.transform);
+			compass.base.transform.loc = vec4_create(7.4 * ratio, 7.0, -1);
+			compass.base.transform.rot = quat_create(-crot.x, -crot.y, -crot.z, crot.w);
+			vec4_set(compass.base.transform.scale, 0.4, 0.4, 0.4);
+			transform_build_matrix(compass.base.transform);
 			compass.frustumCulling = false;
 			MeshObject.render(compass, currentG, "overlay", []);
 
@@ -82,7 +82,7 @@ class RenderPathBase {
 			compass.base.parent = _parent;
 			compass.base.transform.loc = _loc;
 			compass.base.transform.rot = _rot;
-			Transform.buildMatrix(compass.base.transform);
+			transform_build_matrix(compass.base.transform);
 		}
 	}
 
@@ -95,13 +95,13 @@ class RenderPathBase {
 			}
 			else {
 				// Set current viewport
-				Context.raw.viewIndex = Mouse.viewX > Base.w() / 2 ? 1 : 0;
+				Context.raw.viewIndex = mouse_view_x() > Base.w() / 2 ? 1 : 0;
 			}
 
-			let cam = Scene.camera;
+			let cam = scene_camera;
 			if (Context.raw.viewIndexLast > -1) {
 				// Save current viewport camera
-				Mat4.setFrom(Camera.views[Context.raw.viewIndexLast], cam.base.transform.local);
+				mat4_set_from(Camera.views[Context.raw.viewIndexLast], cam.base.transform.local);
 			}
 
 			let decal = Context.raw.tool == WorkspaceTool.ToolDecal || Context.raw.tool == WorkspaceTool.ToolText;
@@ -111,16 +111,16 @@ class RenderPathBase {
 				Context.raw.ddirty = 1;
 			}
 
-			Transform.setMatrix(cam.base.transform, Camera.views[Context.raw.viewIndex]);
+			transform_set_matrix(cam.base.transform, Camera.views[Context.raw.viewIndex]);
 			CameraObject.buildMatrix(cam);
 			CameraObject.buildProjection(cam);
 		}
 
 		// Match projection matrix jitter
 		let skipTaa = Context.raw.splitView || ((Context.raw.tool == WorkspaceTool.ToolClone || Context.raw.tool == WorkspaceTool.ToolBlur || Context.raw.tool == WorkspaceTool.ToolSmudge) && Context.raw.pdirty > 0);
-		Scene.camera.frame = skipTaa ? 0 : RenderPathBase.taaFrame;
-		CameraObject.projectionJitter(Scene.camera);
-		CameraObject.buildMatrix(Scene.camera);
+		scene_camera.frame = skipTaa ? 0 : RenderPathBase.taaFrame;
+		CameraObject.projectionJitter(scene_camera);
+		CameraObject.buildMatrix(scene_camera);
 	}
 
 	static end = () => {
@@ -128,7 +128,7 @@ class RenderPathBase {
 		Context.raw.viewIndexLast = Context.raw.viewIndex;
 		Context.raw.viewIndex = -1;
 
-		if (Context.raw.foregroundEvent && !Mouse.down()) {
+		if (Context.raw.foregroundEvent && !mouse_down()) {
 			Context.raw.foregroundEvent = false;
 			Context.raw.pdirty = 0;
 		}
@@ -141,25 +141,25 @@ class RenderPathBase {
 	}
 
 	static isCached = (): bool => {
-		if (System.width == 0 || System.height == 0) return true;
+		if (sys_width() == 0 || sys_height() == 0) return true;
 
 		let mx = RenderPathBase.lastX;
 		let my = RenderPathBase.lastY;
-		RenderPathBase.lastX = Mouse.viewX;
-		RenderPathBase.lastY = Mouse.viewY;
+		RenderPathBase.lastX = mouse_view_x();
+		RenderPathBase.lastY = mouse_view_y();
 
 		if (Context.raw.ddirty <= 0 && Context.raw.rdirty <= 0 && Context.raw.pdirty <= 0) {
-			if (mx != RenderPathBase.lastX || my != RenderPathBase.lastY || Mouse.locked) Context.raw.ddirty = 0;
+			if (mx != RenderPathBase.lastX || my != RenderPathBase.lastY || mouse_locked) Context.raw.ddirty = 0;
 			///if (krom_metal || krom_android)
 			if (Context.raw.ddirty > -6) {
 			///else
 			if (Context.raw.ddirty > -2) {
 			///end
-				RenderPath.setTarget("");
-				RenderPath.bindTarget("taa", "tex");
+				render_path_set_target("");
+				render_path_bind_target("taa", "tex");
 				RenderPathBase.ssaa4() ?
-					RenderPath.drawShader("shader_datas/supersample_resolve/supersample_resolve") :
-					RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
+					render_path_draw_shader("shader_datas/supersample_resolve/supersample_resolve") :
+					render_path_draw_shader("shader_datas/copy_pass/copy_pass");
 				RenderPathPaint.commandsCursor();
 				if (Context.raw.ddirty <= 0) Context.raw.ddirty--;
 			}
@@ -202,47 +202,47 @@ class RenderPathBase {
 
 				let prevScale = 1.0;
 				for (let i = 0; i < 10; ++i) {
-					let t = RenderTarget.create();
+					let t = render_target_create();
 					t.name = "bloom_mip_" + i;
 					t.width = 0;
 					t.height = 0;
 					t.scale = (prevScale *= 0.5);
 					t.format = "RGBA64";
-					RenderPathBase.bloomMipmaps.push(RenderPath.createRenderTarget(t));
+					RenderPathBase.bloomMipmaps.push(render_path_create_render_target(t));
 				}
 
-				RenderPath.loadShader("shader_datas/bloom_pass/bloom_downsample_pass");
-				RenderPath.loadShader("shader_datas/bloom_pass/bloom_upsample_pass");
+				render_path_load_shader("shader_datas/bloom_pass/bloom_downsample_pass");
+				render_path_load_shader("shader_datas/bloom_pass/bloom_upsample_pass");
 
-				Uniforms.externalIntLinks.push((_: any, __: any, link: string) => {
+				uniforms_i32_links.push((_: any, __: any, link: string) => {
 					if (link == "_bloomCurrentMip") return RenderPathBase.bloomCurrentMip;
 					return null;
 				});
-				Uniforms.externalFloatLinks.push((_: any, __: any, link: string) => {
+				uniforms_f32_links.push((_: any, __: any, link: string) => {
 					if (link == "_bloomSampleScale") return RenderPathBase.bloomSampleScale;
 					return null;
 				});
 			}
 
 			let bloomRadius = 6.5;
-			let minDim = Math.min(RenderPath.currentW, RenderPath.currentH);
+			let minDim = Math.min(render_path_current_w,render_path_current_h);
 			let logMinDim = Math.max(1.0, Math.log2(minDim) + (bloomRadius - 8.0));
 			let numMips = Math.floor(logMinDim);
 			RenderPathBase.bloomSampleScale = 0.5 + logMinDim - numMips;
 
 			for (let i = 0; i < numMips; ++i) {
 				RenderPathBase.bloomCurrentMip = i;
-				RenderPath.setTarget(RenderPathBase.bloomMipmaps[i].name);
-				RenderPath.clearTarget();
-				RenderPath.bindTarget(i == 0 ? tex : RenderPathBase.bloomMipmaps[i - 1].name, "tex");
-				RenderPath.drawShader("shader_datas/bloom_pass/bloom_downsample_pass");
+				render_path_set_target(RenderPathBase.bloomMipmaps[i].name);
+				render_path_clear_target();
+				render_path_bind_target(i == 0 ? tex : RenderPathBase.bloomMipmaps[i - 1].name, "tex");
+				render_path_draw_shader("shader_datas/bloom_pass/bloom_downsample_pass");
 			}
 			for (let i = 0; i < numMips; ++i) {
 				let mipLevel = numMips - 1 - i;
 				RenderPathBase.bloomCurrentMip = mipLevel;
-				RenderPath.setTarget(mipLevel == 0 ? tex : RenderPathBase.bloomMipmaps[mipLevel - 1].name);
-				RenderPath.bindTarget(RenderPathBase.bloomMipmaps[mipLevel].name, "tex");
-				RenderPath.drawShader("shader_datas/bloom_pass/bloom_upsample_pass");
+				render_path_set_target(mipLevel == 0 ? tex : RenderPathBase.bloomMipmaps[mipLevel - 1].name);
+				render_path_bind_target(RenderPathBase.bloomMipmaps[mipLevel].name, "tex");
+				render_path_draw_shader("shader_datas/bloom_pass/bloom_upsample_pass");
 			}
 		}
 	}
@@ -250,10 +250,10 @@ class RenderPathBase {
 	static drawSplit = (drawCommands: ()=>void) => {
 		if (Context.raw.splitView && !Context.raw.paint2dView) {
 			Context.raw.ddirty = 2;
-			let cam = Scene.camera;
+			let cam = scene_camera;
 
 			Context.raw.viewIndex = Context.raw.viewIndex == 0 ? 1 : 0;
-			Transform.setMatrix(cam.base.transform, Camera.views[Context.raw.viewIndex]);
+			transform_set_matrix(cam.base.transform, Camera.views[Context.raw.viewIndex]);
 			CameraObject.buildMatrix(cam);
 			CameraObject.buildProjection(cam);
 
@@ -271,7 +271,7 @@ class RenderPathBase {
 			///end
 
 			Context.raw.viewIndex = Context.raw.viewIndex == 0 ? 1 : 0;
-			Transform.setMatrix(cam.base.transform, Camera.views[Context.raw.viewIndex]);
+			transform_set_matrix(cam.base.transform, Camera.views[Context.raw.viewIndex]);
 			CameraObject.buildMatrix(cam);
 			CameraObject.buildProjection(cam);
 		}
@@ -282,16 +282,16 @@ class RenderPathBase {
 		if (Config.raw.rp_gi != false) {
 			let voxelize = Context.raw.ddirty > 0 && RenderPathBase.taaFrame > 0;
 			if (voxelize) {
-				RenderPath.clearImage("voxels", 0x00000000);
-				RenderPath.setTarget("");
-				RenderPath.setViewport(RenderPathBase.voxelsRes, RenderPathBase.voxelsRes);
-				RenderPath.bindTarget("voxels", "voxels");
+				render_path_clear_image("voxels", 0x00000000);
+				render_path_set_target("");
+				render_path_set_viewport(RenderPathBase.voxelsRes, RenderPathBase.voxelsRes);
+				render_path_bind_target("voxels", "voxels");
 				if (MakeMaterial.heightUsed) {
 					let tid = 0; // Project.layers[0].id;
-					RenderPath.bindTarget("texpaint_pack" + tid, "texpaint_pack");
+					render_path_bind_target("texpaint_pack" + tid, "texpaint_pack");
 				}
-				RenderPath.drawMeshes("voxel");
-				RenderPath.generateMipmaps("voxels");
+				render_path_draw_meshes("voxel");
+				render_path_gen_mipmaps("voxels");
 			}
 		}
 	}
@@ -299,145 +299,145 @@ class RenderPathBase {
 
 	static initSSAO = () => {
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "singlea";
 			t.width = 0;
 			t.height = 0;
 			t.format = "R8";
 			t.scale = RenderPathBase.getSuperSampling();
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "singleb";
 			t.width = 0;
 			t.height = 0;
 			t.format = "R8";
 			t.scale = RenderPathBase.getSuperSampling();
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
-		RenderPath.loadShader("shader_datas/ssao_pass/ssao_pass");
-		RenderPath.loadShader("shader_datas/ssao_blur_pass/ssao_blur_pass_x");
-		RenderPath.loadShader("shader_datas/ssao_blur_pass/ssao_blur_pass_y");
+		render_path_load_shader("shader_datas/ssao_pass/ssao_pass");
+		render_path_load_shader("shader_datas/ssao_blur_pass/ssao_blur_pass_x");
+		render_path_load_shader("shader_datas/ssao_blur_pass/ssao_blur_pass_y");
 	}
 
 	static drawSSAO = () => {
 		let ssao = Config.raw.rp_ssao != false && Context.raw.cameraType == CameraType.CameraPerspective;
 		if (ssao && Context.raw.ddirty > 0 && RenderPathBase.taaFrame > 0) {
-			if (RenderPath.renderTargets.get("singlea") == null) {
+			if (render_path_render_targets.get("singlea") == null) {
 				RenderPathBase.initSSAO();
 			}
 
-			RenderPath.setTarget("singlea");
-			RenderPath.bindTarget("_main", "gbufferD");
-			RenderPath.bindTarget("gbuffer0", "gbuffer0");
-			RenderPath.drawShader("shader_datas/ssao_pass/ssao_pass");
+			render_path_set_target("singlea");
+			render_path_bind_target("_main", "gbufferD");
+			render_path_bind_target("gbuffer0", "gbuffer0");
+			render_path_draw_shader("shader_datas/ssao_pass/ssao_pass");
 
-			RenderPath.setTarget("singleb");
-			RenderPath.bindTarget("singlea", "tex");
-			RenderPath.bindTarget("gbuffer0", "gbuffer0");
-			RenderPath.drawShader("shader_datas/ssao_blur_pass/ssao_blur_pass_x");
+			render_path_set_target("singleb");
+			render_path_bind_target("singlea", "tex");
+			render_path_bind_target("gbuffer0", "gbuffer0");
+			render_path_draw_shader("shader_datas/ssao_blur_pass/ssao_blur_pass_x");
 
-			RenderPath.setTarget("singlea");
-			RenderPath.bindTarget("singleb", "tex");
-			RenderPath.bindTarget("gbuffer0", "gbuffer0");
-			RenderPath.drawShader("shader_datas/ssao_blur_pass/ssao_blur_pass_y");
+			render_path_set_target("singlea");
+			render_path_bind_target("singleb", "tex");
+			render_path_bind_target("gbuffer0", "gbuffer0");
+			render_path_draw_shader("shader_datas/ssao_blur_pass/ssao_blur_pass_y");
 		}
 	}
 
 	static drawDeferredLight = () => {
-		RenderPath.setTarget("tex");
-		RenderPath.bindTarget("_main", "gbufferD");
-		RenderPath.bindTarget("gbuffer0", "gbuffer0");
-		RenderPath.bindTarget("gbuffer1", "gbuffer1");
+		render_path_set_target("tex");
+		render_path_bind_target("_main", "gbufferD");
+		render_path_bind_target("gbuffer0", "gbuffer0");
+		render_path_bind_target("gbuffer1", "gbuffer1");
 		let ssao = Config.raw.rp_ssao != false && Context.raw.cameraType == CameraType.CameraPerspective;
 		if (ssao && RenderPathBase.taaFrame > 0) {
-			RenderPath.bindTarget("singlea", "ssaotex");
+			render_path_bind_target("singlea", "ssaotex");
 		}
 		else {
-			RenderPath.bindTarget("empty_white", "ssaotex");
+			render_path_bind_target("empty_white", "ssaotex");
 		}
 
 		let voxelao_pass = false;
 		///if arm_voxels
 		if (Config.raw.rp_gi != false) {
 			voxelao_pass = true;
-			RenderPath.bindTarget("voxels", "voxels");
+			render_path_bind_target("voxels", "voxels");
 		}
 		///end
 
 		voxelao_pass ?
-			RenderPath.drawShader("shader_datas/deferred_light/deferred_light_voxel") :
-			RenderPath.drawShader("shader_datas/deferred_light/deferred_light");
+			render_path_draw_shader("shader_datas/deferred_light/deferred_light_voxel") :
+			render_path_draw_shader("shader_datas/deferred_light/deferred_light");
 
 		///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
-		RenderPath.setDepthFrom("tex", "gbuffer0"); // Bind depth for world pass
+		render_path_set_depth_from("tex", "gbuffer0"); // Bind depth for world pass
 		///end
 
-		RenderPath.setTarget("tex");
-		RenderPath.drawSkydome("shader_datas/world_pass/world_pass");
+		render_path_set_target("tex");
+		render_path_draw_skydome("shader_datas/world_pass/world_pass");
 
 		///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
-		RenderPath.setDepthFrom("tex", "gbuffer1"); // Unbind depth
+		render_path_set_depth_from("tex", "gbuffer1"); // Unbind depth
 		///end
 	}
 
 	static drawSSR = () => {
 		if (Config.raw.rp_ssr != false) {
-			if (RenderPath.cachedShaderContexts.get("shader_datas/ssr_pass/ssr_pass") == null) {
+			if (render_path_cached_shader_contexts.get("shader_datas/ssr_pass/ssr_pass") == null) {
 				{
-					let t = RenderTarget.create();
+					let t = render_target_create();
 					t.name = "bufb";
 					t.width = 0;
 					t.height = 0;
 					t.format = "RGBA64";
-					RenderPath.createRenderTarget(t);
+					render_path_create_render_target(t);
 				}
-				RenderPath.loadShader("shader_datas/ssr_pass/ssr_pass");
-				RenderPath.loadShader("shader_datas/ssr_blur_pass/ssr_blur_pass_x");
-				RenderPath.loadShader("shader_datas/ssr_blur_pass/ssr_blur_pass_y3_blend");
+				render_path_load_shader("shader_datas/ssr_pass/ssr_pass");
+				render_path_load_shader("shader_datas/ssr_blur_pass/ssr_blur_pass_x");
+				render_path_load_shader("shader_datas/ssr_blur_pass/ssr_blur_pass_y3_blend");
 			}
 			let targeta = "bufb";
 			let targetb = "gbuffer1";
 
-			RenderPath.setTarget(targeta);
-			RenderPath.bindTarget("tex", "tex");
-			RenderPath.bindTarget("_main", "gbufferD");
-			RenderPath.bindTarget("gbuffer0", "gbuffer0");
-			RenderPath.bindTarget("gbuffer1", "gbuffer1");
-			RenderPath.drawShader("shader_datas/ssr_pass/ssr_pass");
-
-			RenderPath.setTarget(targetb);
-			RenderPath.bindTarget(targeta, "tex");
-			RenderPath.bindTarget("gbuffer0", "gbuffer0");
-			RenderPath.drawShader("shader_datas/ssr_blur_pass/ssr_blur_pass_x");
-
-			RenderPath.setTarget("tex");
-			RenderPath.bindTarget(targetb, "tex");
-			RenderPath.bindTarget("gbuffer0", "gbuffer0");
-			RenderPath.drawShader("shader_datas/ssr_blur_pass/ssr_blur_pass_y3_blend");
+			render_path_set_target(targeta);
+			render_path_bind_target("tex", "tex");
+			render_path_bind_target("_main", "gbufferD");
+			render_path_bind_target("gbuffer0", "gbuffer0");
+			render_path_bind_target("gbuffer1", "gbuffer1");
+			render_path_draw_shader("shader_datas/ssr_pass/ssr_pass");
+
+			render_path_set_target(targetb);
+			render_path_bind_target(targeta, "tex");
+			render_path_bind_target("gbuffer0", "gbuffer0");
+			render_path_draw_shader("shader_datas/ssr_blur_pass/ssr_blur_pass_x");
+
+			render_path_set_target("tex");
+			render_path_bind_target(targetb, "tex");
+			render_path_bind_target("gbuffer0", "gbuffer0");
+			render_path_draw_shader("shader_datas/ssr_blur_pass/ssr_blur_pass_y3_blend");
 		}
 	}
 
 	// static drawMotionBlur = () => {
 	// 	if (Config.raw.rp_motionblur != false) {
-	// 		RenderPath.setTarget("buf");
-	// 		RenderPath.bindTarget("tex", "tex");
-	// 		RenderPath.bindTarget("gbuffer0", "gbuffer0");
+	// 		render_path_set_target("buf");
+	// 		render_path_bind_target("tex", "tex");
+	// 		render_path_bind_target("gbuffer0", "gbuffer0");
 	// 		///if (rp_motionblur == "Camera")
 	// 		{
-	// 			RenderPath.bindTarget("_main", "gbufferD");
-	// 			RenderPath.drawShader("shader_datas/motion_blur_pass/motion_blur_pass");
+	// 			render_path_bind_target("_main", "gbufferD");
+	// 			render_path_draw_shader("shader_datas/motion_blur_pass/motion_blur_pass");
 	// 		}
 	// 		///else
 	// 		{
-	// 			RenderPath.bindTarget("gbuffer2", "sveloc");
-	// 			RenderPath.drawShader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
+	// 			render_path_bind_target("gbuffer2", "sveloc");
+	// 			render_path_draw_shader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
 	// 		}
 	// 		///end
-	// 		RenderPath.setTarget("tex");
-	// 		RenderPath.bindTarget("buf", "tex");
-	// 		RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
+	// 		render_path_set_target("tex");
+	// 		render_path_bind_target("buf", "tex");
+	// 		render_path_draw_shader("shader_datas/copy_pass/copy_pass");
 	// 	}
 	// }
 
@@ -448,77 +448,77 @@ class RenderPathBase {
 	// 		t.width = 1;
 	// 		t.height = 1;
 	// 		t.format = "RGBA64";
-	// 		RenderPath.createRenderTarget(t);
+	// 		render_path_create_render_target(t);
 
-	// 		RenderPath.loadShader("shader_datas/histogram_pass/histogram_pass");
+	// 		render_path_load_shader("shader_datas/histogram_pass/histogram_pass");
 	// 	}
 
-	// 	RenderPath.setTarget("histogram");
-	// 	RenderPath.bindTarget("taa", "tex");
-	// 	RenderPath.drawShader("shader_datas/histogram_pass/histogram_pass");
+	// 	render_path_set_target("histogram");
+	// 	render_path_bind_target("taa", "tex");
+	// 	render_path_draw_shader("shader_datas/histogram_pass/histogram_pass");
 	// }
 
 	static drawTAA = () => {
 		let current = RenderPathBase.taaFrame % 2 == 0 ? "buf2" : "taa2";
 		let last = RenderPathBase.taaFrame % 2 == 0 ? "taa2" : "buf2";
 
-		RenderPath.setTarget(current);
-		RenderPath.clearTarget(0x00000000);
-		RenderPath.bindTarget("buf", "colorTex");
-		RenderPath.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
+		render_path_set_target(current);
+		render_path_clear_target(0x00000000);
+		render_path_bind_target("buf", "colorTex");
+		render_path_draw_shader("shader_datas/smaa_edge_detect/smaa_edge_detect");
 
-		RenderPath.setTarget("taa");
-		RenderPath.clearTarget(0x00000000);
-		RenderPath.bindTarget(current, "edgesTex");
-		RenderPath.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
+		render_path_set_target("taa");
+		render_path_clear_target(0x00000000);
+		render_path_bind_target(current, "edgesTex");
+		render_path_draw_shader("shader_datas/smaa_blend_weight/smaa_blend_weight");
 
-		RenderPath.setTarget(current);
-		RenderPath.bindTarget("buf", "colorTex");
-		RenderPath.bindTarget("taa", "blendTex");
-		RenderPath.bindTarget("gbuffer2", "sveloc");
-		RenderPath.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
+		render_path_set_target(current);
+		render_path_bind_target("buf", "colorTex");
+		render_path_bind_target("taa", "blendTex");
+		render_path_bind_target("gbuffer2", "sveloc");
+		render_path_draw_shader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
 
 		let skipTaa = Context.raw.splitView;
 		if (skipTaa) {
-			RenderPath.setTarget("taa");
-			RenderPath.bindTarget(current, "tex");
-			RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
+			render_path_set_target("taa");
+			render_path_bind_target(current, "tex");
+			render_path_draw_shader("shader_datas/copy_pass/copy_pass");
 		}
 		else {
-			RenderPath.setTarget("taa");
-			RenderPath.bindTarget(current, "tex");
-			RenderPath.bindTarget(last, "tex2");
-			RenderPath.bindTarget("gbuffer2", "sveloc");
-			RenderPath.drawShader("shader_datas/taa_pass/taa_pass");
+			render_path_set_target("taa");
+			render_path_bind_target(current, "tex");
+			render_path_bind_target(last, "tex2");
+			render_path_bind_target("gbuffer2", "sveloc");
+			render_path_draw_shader("shader_datas/taa_pass/taa_pass");
 		}
 
 		if (RenderPathBase.ssaa4()) {
-			RenderPath.setTarget("");
-			RenderPath.bindTarget(RenderPathBase.taaFrame % 2 == 0 ? "taa2" : "taa", "tex");
-			RenderPath.drawShader("shader_datas/supersample_resolve/supersample_resolve");
+			render_path_set_target("");
+			render_path_bind_target(RenderPathBase.taaFrame % 2 == 0 ? "taa2" : "taa", "tex");
+			render_path_draw_shader("shader_datas/supersample_resolve/supersample_resolve");
 		}
 		else {
-			RenderPath.setTarget("");
-			RenderPath.bindTarget(RenderPathBase.taaFrame == 0 ? current : "taa", "tex");
-			RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
+			render_path_set_target("");
+			render_path_bind_target(RenderPathBase.taaFrame == 0 ? current : "taa", "tex");
+			render_path_draw_shader("shader_datas/copy_pass/copy_pass");
 		}
 	}
 
 	static drawGbuffer = () => {
-		RenderPath.setTarget("gbuffer0"); // Only clear gbuffer0
+		render_path_set_target("gbuffer0"); // Only clear gbuffer0
 		///if krom_metal
-		RenderPath.clearTarget(0x00000000, 1.0);
+		render_path_clear_target(0x00000000, 1.0);
 		///else
-		RenderPath.clearTarget(null, 1.0);
+		render_path_clear_target(null, 1.0);
 		///end
 		if (MakeMesh.layerPassCount == 1) {
-			RenderPath.setTarget("gbuffer2");
-			RenderPath.clearTarget(0xff000000);
+			render_path_set_target("gbuffer2");
+			render_path_clear_target(0xff000000);
 		}
-		RenderPath.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]);
-		let currentG = RenderPath.currentG;
+		render_path_set_target("gbuffer0", ["gbuffer1", "gbuffer2"]);
+		let currentG =_render_path_current_g;
 		RenderPathPaint.bindLayers();
-		RenderPath.drawMeshes("mesh");
+		render_path_draw_meshes("mesh");
 		RenderPathPaint.unbindLayers();
 		if (MakeMesh.layerPassCount > 1) {
 			RenderPathBase.makeGbufferCopyTextures();
@@ -526,15 +526,15 @@ class RenderPathBase {
 				let ping = i % 2 == 1 ? "_copy" : "";
 				let pong = i % 2 == 1 ? "" : "_copy";
 				if (i == MakeMesh.layerPassCount - 1) {
-					RenderPath.setTarget("gbuffer2" + ping);
-					RenderPath.clearTarget(0xff000000);
+					render_path_set_target("gbuffer2" + ping);
+					render_path_clear_target(0xff000000);
 				}
-				RenderPath.setTarget("gbuffer0" + ping, ["gbuffer1" + ping, "gbuffer2" + ping]);
-				RenderPath.bindTarget("gbuffer0" + pong, "gbuffer0");
-				RenderPath.bindTarget("gbuffer1" + pong, "gbuffer1");
-				RenderPath.bindTarget("gbuffer2" + pong, "gbuffer2");
+				render_path_set_target("gbuffer0" + ping, ["gbuffer1" + ping, "gbuffer2" + ping]);
+				render_path_bind_target("gbuffer0" + pong, "gbuffer0");
+				render_path_bind_target("gbuffer1" + pong, "gbuffer1");
+				render_path_bind_target("gbuffer2" + pong, "gbuffer2");
 				RenderPathPaint.bindLayers();
-				RenderPath.drawMeshes("mesh" + i);
+				render_path_draw_meshes("mesh" + i);
 				RenderPathPaint.unbindLayers();
 			}
 			if (MakeMesh.layerPassCount % 2 == 0) {
@@ -542,56 +542,56 @@ class RenderPathBase {
 			}
 		}
 
-		let hide = Operator.shortcut(Config.keymap.stencil_hide, ShortcutType.ShortcutDown) || Keyboard.down("control");
+		let hide = Operator.shortcut(Config.keymap.stencil_hide, ShortcutType.ShortcutDown) || keyboard_down("control");
 		let isDecal = Base.isDecalLayer();
 		if (isDecal && !hide) LineDraw.render(currentG, Context.raw.layer.decalMat);
 	}
 
 	static makeGbufferCopyTextures = () => {
-		let copy = RenderPath.renderTargets.get("gbuffer0_copy");
-		if (copy == null || copy.image.width != RenderPath.renderTargets.get("gbuffer0").image.width || copy.image.height != RenderPath.renderTargets.get("gbuffer0").image.height) {
+		let copy = render_path_render_targets.get("gbuffer0_copy");
+		if (copy == null || copy.image.width != render_path_render_targets.get("gbuffer0").image.width || copy.image.height != render_path_render_targets.get("gbuffer0").image.height) {
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "gbuffer0_copy";
 				t.width = 0;
 				t.height = 0;
 				t.format = "RGBA64";
 				t.scale = RenderPathBase.getSuperSampling();
 				t.depth_buffer = "main";
-				RenderPath.createRenderTarget(t);
+				render_path_create_render_target(t);
 			}
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "gbuffer1_copy";
 				t.width = 0;
 				t.height = 0;
 				t.format = "RGBA64";
 				t.scale = RenderPathBase.getSuperSampling();
-				RenderPath.createRenderTarget(t);
+				render_path_create_render_target(t);
 			}
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "gbuffer2_copy";
 				t.width = 0;
 				t.height = 0;
 				t.format = "RGBA64";
 				t.scale = RenderPathBase.getSuperSampling();
-				RenderPath.createRenderTarget(t);
+				render_path_create_render_target(t);
 			}
 
 			///if krom_metal
 			// TODO: Fix depth attach for gbuffer0_copy on metal
 			// Use resize to re-create buffers from scratch for now
-			RenderPath.resize();
+			render_path_resize();
 			///end
 		}
 	}
 
 	static copyToGbuffer = () => {
-		RenderPath.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]);
-		RenderPath.bindTarget("gbuffer0_copy", "tex0");
-		RenderPath.bindTarget("gbuffer1_copy", "tex1");
-		RenderPath.bindTarget("gbuffer2_copy", "tex2");
-		RenderPath.drawShader("shader_datas/copy_mrt3_pass/copy_mrt3RGBA64_pass");
+		render_path_set_target("gbuffer0", ["gbuffer1", "gbuffer2"]);
+		render_path_bind_target("gbuffer0_copy", "tex0");
+		render_path_bind_target("gbuffer1_copy", "tex1");
+		render_path_bind_target("gbuffer2_copy", "tex2");
+		render_path_draw_shader("shader_datas/copy_mrt3_pass/copy_mrt3RGBA64_pass");
 	}
 }

+ 47 - 47
base/Sources/RenderPathDeferred.ts

@@ -2,38 +2,38 @@
 class RenderPathDeferred {
 
 	static init = () => {
-		RenderPath.createDepthBuffer("main", "DEPTH24");
+		render_path_create_depth_buffer("main", "DEPTH24");
 
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "gbuffer0";
 			t.width = 0;
 			t.height = 0;
 			t.format = "RGBA64";
 			t.scale = RenderPathBase.getSuperSampling();
 			t.depth_buffer = "main";
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "gbuffer1";
 			t.width = 0;
 			t.height = 0;
 			t.format = "RGBA64";
 			t.scale = RenderPathBase.getSuperSampling();
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "gbuffer2";
 			t.width = 0;
 			t.height = 0;
 			t.format = "RGBA64";
 			t.scale = RenderPathBase.getSuperSampling();
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "tex";
 			t.width = 0;
 			t.height = 0;
@@ -42,10 +42,10 @@ class RenderPathDeferred {
 			///if krom_opengl
 			t.depth_buffer = "main";
 			///end
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "buf";
 			t.width = 0;
 			t.height = 0;
@@ -57,37 +57,37 @@ class RenderPathDeferred {
 			t.format = "RGBA32";
 			///end
 			t.scale = RenderPathBase.getSuperSampling();
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "buf2";
 			t.width = 0;
 			t.height = 0;
 			t.format = "RGBA32";
 			t.scale = RenderPathBase.getSuperSampling();
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "taa";
 			t.width = 0;
 			t.height = 0;
 			t.format = "RGBA32";
 			t.scale = RenderPathBase.getSuperSampling();
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "taa2";
 			t.width = 0;
 			t.height = 0;
 			t.format = "RGBA32";
 			t.scale = RenderPathBase.getSuperSampling();
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "empty_white";
 			t.width = 1;
 			t.height = 1;
@@ -95,11 +95,11 @@ class RenderPathDeferred {
 			let b = new ArrayBuffer(1);
 			let v = new DataView(b);
 			v.setUint8(0, 255);
-			t.image = Image.fromBytes(b, t.width, t.height, TextureFormat.R8);
-			RenderPath.renderTargets.set(t.name, t);
+			t.image = image_from_bytes(b, t.width, t.height, TextureFormat.R8);
+			render_path_render_targets.set(t.name, t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "empty_black";
 			t.width = 1;
 			t.height = 1;
@@ -110,28 +110,28 @@ class RenderPathDeferred {
 			v.setUint8(1, 0);
 			v.setUint8(2, 0);
 			v.setUint8(3, 0);
-			t.image = Image.fromBytes(b, t.width, t.height, TextureFormat.RGBA32);
-			RenderPath.renderTargets.set(t.name, t);
+			t.image = image_from_bytes(b, t.width, t.height, TextureFormat.RGBA32);
+			render_path_render_targets.set(t.name, t);
 		}
 
 		///if is_sculpt
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "gbuffer0_undo";
 			t.width = 0;
 			t.height = 0;
 			t.format = "RGBA64";
 			t.scale = RenderPathBase.getSuperSampling();
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		{
-			let t = RenderTarget.create();
+			let t = render_target_create();
 			t.name = "gbufferD_undo";
 			t.width = 0;
 			t.height = 0;
 			t.format = "R32";
 			t.scale = RenderPathBase.getSuperSampling();
-			RenderPath.createRenderTarget(t);
+			render_path_create_render_target(t);
 		}
 		///end
 
@@ -139,22 +139,22 @@ class RenderPathDeferred {
 			RenderPathBase.initSSAO();
 		}
 
-		RenderPath.loadShader("shader_datas/world_pass/world_pass");
-		RenderPath.loadShader("shader_datas/deferred_light/deferred_light");
-		RenderPath.loadShader("shader_datas/compositor_pass/compositor_pass");
-		RenderPath.loadShader("shader_datas/copy_pass/copy_pass");
-		RenderPath.loadShader("shader_datas/copy_pass/copyR8_pass");
-		RenderPath.loadShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
-		RenderPath.loadShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
-		RenderPath.loadShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
-		RenderPath.loadShader("shader_datas/taa_pass/taa_pass");
-		RenderPath.loadShader("shader_datas/supersample_resolve/supersample_resolve");
-		// RenderPath.loadShader("shader_datas/motion_blur_pass/motion_blur_pass");
-		// RenderPath.loadShader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
+		render_path_load_shader("shader_datas/world_pass/world_pass");
+		render_path_load_shader("shader_datas/deferred_light/deferred_light");
+		render_path_load_shader("shader_datas/compositor_pass/compositor_pass");
+		render_path_load_shader("shader_datas/copy_pass/copy_pass");
+		render_path_load_shader("shader_datas/copy_pass/copyR8_pass");
+		render_path_load_shader("shader_datas/smaa_edge_detect/smaa_edge_detect");
+		render_path_load_shader("shader_datas/smaa_blend_weight/smaa_blend_weight");
+		render_path_load_shader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
+		render_path_load_shader("shader_datas/taa_pass/taa_pass");
+		render_path_load_shader("shader_datas/supersample_resolve/supersample_resolve");
+		// render_path_load_shader("shader_datas/motion_blur_pass/motion_blur_pass");
+		// render_path_load_shader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
 		///if arm_voxels
 		{
 			RenderPathBase.initVoxels();
-			RenderPath.loadShader("shader_datas/deferred_light/deferred_light_voxel");
+			render_path_load_shader("shader_datas/deferred_light/deferred_light_voxel");
 		}
 		///end
 
@@ -187,14 +187,14 @@ class RenderPathDeferred {
 		// RenderPathBase.drawMotionBlur();
 		// RenderPathBase.drawHistogram();
 
-		RenderPath.setTarget("buf");
-		RenderPath.bindTarget("tex", "tex");
-		// RenderPath.bindTarget("histogram", "histogram");
-		RenderPath.drawShader("shader_datas/compositor_pass/compositor_pass");
+		render_path_set_target("buf");
+		render_path_bind_target("tex", "tex");
+		// render_path_bind_target("histogram", "histogram");
+		render_path_draw_shader("shader_datas/compositor_pass/compositor_pass");
 
-		RenderPath.setTarget("buf");
-		RenderPathBase.drawCompass(RenderPath.currentG);
-		RenderPath.drawMeshes("overlay");
+		render_path_set_target("buf");
+		RenderPathBase.drawCompass(_render_path_current_g);
+		render_path_draw_meshes("overlay");
 
 		RenderPathBase.drawTAA();
 	}

+ 10 - 10
base/Sources/RenderPathForward.ts

@@ -12,18 +12,18 @@ class RenderPathForward {
 	}
 
 	static drawForward = () => {
-		RenderPath.setDepthFrom("gbuffer1", "gbuffer0");
-		RenderPath.setTarget("gbuffer1");
-		RenderPath.drawSkydome("shader_datas/world_pass/world_pass");
-		RenderPath.setDepthFrom("gbuffer1", "gbuffer2");
+		render_path_set_depth_from("gbuffer1", "gbuffer0");
+		render_path_set_target("gbuffer1");
+		render_path_draw_skydome("shader_datas/world_pass/world_pass");
+		render_path_set_depth_from("gbuffer1", "gbuffer2");
 
-		RenderPath.setTarget("buf");
-		RenderPath.bindTarget("gbuffer1", "tex");
-		RenderPath.drawShader("shader_datas/compositor_pass/compositor_pass");
+		render_path_set_target("buf");
+		render_path_bind_target("gbuffer1", "tex");
+		render_path_draw_shader("shader_datas/compositor_pass/compositor_pass");
 
-		RenderPath.setTarget("buf");
-		RenderPathBase.drawCompass(RenderPath.currentG);
-		RenderPath.drawMeshes("overlay");
+		render_path_set_target("buf");
+		RenderPathBase.drawCompass(_render_path_current_g);
+		render_path_draw_meshes("overlay");
 
 		RenderPathBase.drawTAA();
 	}

+ 42 - 42
base/Sources/RenderPathRaytrace.ts

@@ -9,12 +9,12 @@ class RenderPathRaytrace {
 	static uvScale = 1.0;
 	static first = true;
 	static f32a = new Float32Array(24);
-	static helpMat = Mat4.identity();
+	static helpMat = mat4_identity();
 	static vb_scale = 1.0;
-	static vb: VertexBufferRaw;
-	static ib: IndexBufferRaw;
+	static vb: vertex_buffer_t;
+	static ib: index_buffer_t;
 
-	static lastEnvmap: ImageRaw = null;
+	static lastEnvmap: image_t = null;
 	static isBake = false;
 
 	///if krom_direct3d12
@@ -26,7 +26,7 @@ class RenderPathRaytrace {
 	///end
 
 	///if is_lab
-	static lastTexpaint: ImageRaw = null;
+	static lastTexpaint: image_t = null;
 	///end
 
 	static init = () => {
@@ -46,15 +46,15 @@ class RenderPathRaytrace {
 			Context.updateEnvmap();
 		}
 
-		let probe = Scene.world;
+		let probe = scene_world;
 		let savedEnvmap = Context.raw.showEnvmapBlur ? probe._radianceMipmaps[0] : Context.raw.savedEnvmap;
 
 		if (RenderPathRaytrace.lastEnvmap != savedEnvmap) {
 			RenderPathRaytrace.lastEnvmap = savedEnvmap;
 
-			let bnoise_sobol = Scene.embedded.get("bnoise_sobol.k");
-			let bnoise_scramble = Scene.embedded.get("bnoise_scramble.k");
-			let bnoise_rank = Scene.embedded.get("bnoise_rank.k");
+			let bnoise_sobol = scene_embedded.get("bnoise_sobol.k");
+			let bnoise_scramble = scene_embedded.get("bnoise_scramble.k");
+			let bnoise_rank = scene_embedded.get("bnoise_rank.k");
 
 			let l = Base.flatten(true);
 			Krom.raytraceSetTextures(l.texpaint, l.texpaint_nor, l.texpaint_pack, savedEnvmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
@@ -65,9 +65,9 @@ class RenderPathRaytrace {
 		if (l.texpaint != RenderPathRaytrace.lastTexpaint) {
 			RenderPathRaytrace.lastTexpaint = l.texpaint;
 
-			let bnoise_sobol = Scene.embedded.get("bnoise_sobol.k");
-			let bnoise_scramble = Scene.embedded.get("bnoise_scramble.k");
-			let bnoise_rank = Scene.embedded.get("bnoise_rank.k");
+			let bnoise_sobol = scene_embedded.get("bnoise_sobol.k");
+			let bnoise_scramble = scene_embedded.get("bnoise_scramble.k");
+			let bnoise_rank = scene_embedded.get("bnoise_rank.k");
 
 			Krom.raytraceSetTextures(l.texpaint, l.texpaint_nor, l.texpaint_pack, savedEnvmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
 		}
@@ -77,14 +77,14 @@ class RenderPathRaytrace {
 			Base.flatten(true);
 		}
 
-		let cam = Scene.camera;
+		let cam = scene_camera;
 		let ct = cam.base.transform;
-		Mat4.setFrom(RenderPathRaytrace.helpMat, cam.V);
-		Mat4.multmat(RenderPathRaytrace.helpMat, cam.P);
-		Mat4.getInverse(RenderPathRaytrace.helpMat, RenderPathRaytrace.helpMat);
-		RenderPathRaytrace.f32a[0] = Transform.worldx(ct);
-		RenderPathRaytrace.f32a[1] = Transform.worldy(ct);
-		RenderPathRaytrace.f32a[2] = Transform.worldz(ct);
+		mat4_set_from(RenderPathRaytrace.helpMat, cam.V);
+		mat4_mult_mat(RenderPathRaytrace.helpMat, cam.P);
+		mat4_get_inv(RenderPathRaytrace.helpMat, RenderPathRaytrace.helpMat);
+		RenderPathRaytrace.f32a[0] = transform_world_x(ct);
+		RenderPathRaytrace.f32a[1] = transform_world_y(ct);
+		RenderPathRaytrace.f32a[2] = transform_world_z(ct);
 		RenderPathRaytrace.f32a[3] = RenderPathRaytrace.frame;
 		///if krom_metal
 		// frame = (frame % (16)) + 1; // _PAINT
@@ -109,15 +109,15 @@ class RenderPathRaytrace {
 		RenderPathRaytrace.f32a[17] = RenderPathRaytrace.helpMat._31;
 		RenderPathRaytrace.f32a[18] = RenderPathRaytrace.helpMat._32;
 		RenderPathRaytrace.f32a[19] = RenderPathRaytrace.helpMat._33;
-		RenderPathRaytrace.f32a[20] = Scene.world.strength * 1.5;
+		RenderPathRaytrace.f32a[20] = scene_world.strength * 1.5;
 		if (!Context.raw.showEnvmap) RenderPathRaytrace.f32a[20] = -RenderPathRaytrace.f32a[20];
 		RenderPathRaytrace.f32a[21] = Context.raw.envmapAngle;
 		RenderPathRaytrace.f32a[22] = RenderPathRaytrace.uvScale;
 		///if is_lab
-		RenderPathRaytrace.f32a[22] *= Scene.meshes[0].data.scale_tex;
+		RenderPathRaytrace.f32a[22] *= scene_meshes[0].data.scale_tex;
 		///end
 
-		let framebuffer = RenderPath.renderTargets.get("buf").image;
+		let framebuffer = render_path_render_targets.get("buf").image;
 		Krom.raytraceDispatchRays(framebuffer.renderTarget_, RenderPathRaytrace.f32a.buffer);
 
 		if (Context.raw.ddirty == 1 || Context.raw.pdirty == 1) {
@@ -137,16 +137,16 @@ class RenderPathRaytrace {
 	static raytraceInit = (shaderName: string, build = true) => {
 		if (RenderPathRaytrace.first) {
 			RenderPathRaytrace.first = false;
-			Scene.embedData("bnoise_sobol.k", () => {});
-			Scene.embedData("bnoise_scramble.k", () => {});
-			Scene.embedData("bnoise_rank.k", () => {});
+			scene_embed_data("bnoise_sobol.k", () => {});
+			scene_embed_data("bnoise_scramble.k", () => {});
+			scene_embed_data("bnoise_rank.k", () => {});
 		}
 
 		Data.getBlob(shaderName, (shader: ArrayBuffer) => {
 			if (build) RenderPathRaytrace.buildData();
-			let bnoise_sobol = Scene.embedded.get("bnoise_sobol.k");
-			let bnoise_scramble = Scene.embedded.get("bnoise_scramble.k");
-			let bnoise_rank = Scene.embedded.get("bnoise_rank.k");
+			let bnoise_sobol = scene_embedded.get("bnoise_sobol.k");
+			let bnoise_scramble = scene_embedded.get("bnoise_scramble.k");
+			let bnoise_rank = scene_embedded.get("bnoise_rank.k");
 			Krom.raytraceInit(shader, RenderPathRaytrace.vb.buffer_, RenderPathRaytrace.ib.buffer_, RenderPathRaytrace.vb_scale);
 		});
 	}
@@ -156,14 +156,14 @@ class RenderPathRaytrace {
 		///if is_paint
 		let mo = !Context.layerFilterUsed() ? Context.raw.mergedObject : Context.raw.paintObject;
 		///else
-		let mo = Scene.meshes[0];
+		let mo = scene_meshes[0];
 		///end
 		let md = mo.data;
 		let mo_scale = mo.base.transform.scale.x; // Uniform scale only
 		RenderPathRaytrace.vb_scale = md.scale_pos * mo_scale;
 		if (mo.base.parent != null) RenderPathRaytrace.vb_scale *= mo.base.parent.transform.scale.x;
-		RenderPathRaytrace.vb = md._vertexBuffer;
-		RenderPathRaytrace.ib = md._indexBuffers[0];
+		RenderPathRaytrace.vb = md._vertex_buffer;
+		RenderPathRaytrace.ib = md._index_buffers[0];
 	}
 
 	static draw = (useLiveLayer: bool) => {
@@ -172,7 +172,7 @@ class RenderPathRaytrace {
 
 		///if krom_metal
 		// Delay path tracing additional samples while painting
-		let down = Mouse.down() || Pen.down();
+		let down = mouse_down() || pen_down();
 		if (Context.inViewport() && down) RenderPathRaytrace.frame = 0;
 		///end
 
@@ -181,16 +181,16 @@ class RenderPathRaytrace {
 		if (Config.raw.rp_bloom != false) {
 			RenderPathBase.drawBloom("buf");
 		}
-		RenderPath.setTarget("buf");
-		RenderPath.drawMeshes("overlay");
-		RenderPath.setTarget("buf");
-		RenderPathBase.drawCompass(RenderPath.currentG);
-		RenderPath.setTarget("taa");
-		RenderPath.bindTarget("buf", "tex");
-		RenderPath.drawShader("shader_datas/compositor_pass/compositor_pass");
-		RenderPath.setTarget("");
-		RenderPath.bindTarget("taa", "tex");
-		RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
+		render_path_set_target("buf");
+		render_path_draw_meshes("overlay");
+		render_path_set_target("buf");
+		RenderPathBase.drawCompass(_render_path_current_g);
+		render_path_set_target("taa");
+		render_path_bind_target("buf", "tex");
+		render_path_draw_shader("shader_datas/compositor_pass/compositor_pass");
+		render_path_set_target("");
+		render_path_bind_target("taa", "tex");
+		render_path_draw_shader("shader_datas/copy_pass/copy_pass");
 		if (Config.raw.brush_3d) {
 			RenderPathPaint.commandsCursor();
 		}

+ 28 - 28
base/Sources/RenderPathRaytraceBake.ts

@@ -8,7 +8,7 @@ class RenderPathRaytraceBake {
 	static currentSample = 0;
 	static raysTimer = 0.0;
 	static raysCounter = 0;
-	static lastLayer: ImageRaw = null;
+	static lastLayer: image_t = null;
 	static lastBake = 0;
 
 	static commands = (parsePaintMaterial: (b?: bool)=>void): bool => {
@@ -21,44 +21,44 @@ class RenderPathRaytraceBake {
 			RenderPathRaytrace.lastEnvmap = null;
 			RenderPathRaytraceBake.lastLayer = null;
 
-			if (RenderPath.renderTargets.get("baketex0") != null) {
-				Image.unload(RenderPath.renderTargets.get("baketex0").image);
-				Image.unload(RenderPath.renderTargets.get("baketex1").image);
-				Image.unload(RenderPath.renderTargets.get("baketex2").image);
+			if (render_path_render_targets.get("baketex0") != null) {
+				image_unload(render_path_render_targets.get("baketex0").image);
+				image_unload(render_path_render_targets.get("baketex1").image);
+				image_unload(render_path_render_targets.get("baketex2").image);
 			}
 
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "baketex0";
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = "RGBA64";
-				RenderPath.createRenderTarget(t);
+				render_path_create_render_target(t);
 			}
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "baketex1";
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = "RGBA64";
-				RenderPath.createRenderTarget(t);
+				render_path_create_render_target(t);
 			}
 			{
-				let t = RenderTarget.create();
+				let t = render_target_create();
 				t.name = "baketex2";
 				t.width = Config.getTextureResX();
 				t.height = Config.getTextureResY();
 				t.format = "RGBA64"; // Match raytrace_target format
-				RenderPath.createRenderTarget(t);
+				render_path_create_render_target(t);
 			}
 
 			let _bakeType = Context.raw.bakeType;
 			Context.raw.bakeType = BakeType.BakeInit;
 			parsePaintMaterial();
-			RenderPath.setTarget("baketex0");
-			RenderPath.clearTarget(0x00000000); // Pixels with alpha of 0.0 are skipped during raytracing
-			RenderPath.setTarget("baketex0", ["baketex1"]);
-			RenderPath.drawMeshes("paint");
+			render_path_set_target("baketex0");
+			render_path_clear_target(0x00000000); // Pixels with alpha of 0.0 are skipped during raytracing
+			render_path_set_target("baketex0", ["baketex1"]);
+			render_path_draw_meshes("paint");
 			Context.raw.bakeType = _bakeType;
 			let _next = () => {
 				parsePaintMaterial();
@@ -74,18 +74,18 @@ class RenderPathRaytraceBake {
 			Context.loadEnvmap();
 			Context.updateEnvmap();
 		}
-		let probe = Scene.world;
+		let probe = scene_world;
 		let savedEnvmap = Context.raw.showEnvmapBlur ? probe._radianceMipmaps[0] : Context.raw.savedEnvmap;
 		if (RenderPathRaytrace.lastEnvmap != savedEnvmap || RenderPathRaytraceBake.lastLayer != Context.raw.layer.texpaint) {
 			RenderPathRaytrace.lastEnvmap = savedEnvmap;
 			RenderPathRaytraceBake.lastLayer = Context.raw.layer.texpaint;
 
-			let baketex0 = RenderPath.renderTargets.get("baketex0").image;
-			let baketex1 = RenderPath.renderTargets.get("baketex1").image;
-			let bnoise_sobol = Scene.embedded.get("bnoise_sobol.k");
-			let bnoise_scramble = Scene.embedded.get("bnoise_scramble.k");
-			let bnoise_rank = Scene.embedded.get("bnoise_rank.k");
-			let texpaint_undo = RenderPath.renderTargets.get("texpaint_undo" + History.undoI).image;
+			let baketex0 = render_path_render_targets.get("baketex0").image;
+			let baketex1 = render_path_render_targets.get("baketex1").image;
+			let bnoise_sobol = scene_embedded.get("bnoise_sobol.k");
+			let bnoise_scramble = scene_embedded.get("bnoise_scramble.k");
+			let bnoise_rank = scene_embedded.get("bnoise_rank.k");
+			let texpaint_undo = render_path_render_targets.get("texpaint_undo" + History.undoI).image;
 			Krom.raytraceSetTextures(baketex0, baketex1, texpaint_undo, savedEnvmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
 		}
 
@@ -100,16 +100,16 @@ class RenderPathRaytraceBake {
 			f32a[1] = Context.raw.bakeAoStrength;
 			f32a[2] = Context.raw.bakeAoRadius;
 			f32a[3] = Context.raw.bakeAoOffset;
-			f32a[4] = Scene.world.strength;
+			f32a[4] = scene_world.strength;
 			f32a[5] = Context.raw.bakeUpAxis;
 			f32a[6] = Context.raw.envmapAngle;
 
-			let framebuffer = RenderPath.renderTargets.get("baketex2").image;
+			let framebuffer = render_path_render_targets.get("baketex2").image;
 			Krom.raytraceDispatchRays(framebuffer.renderTarget_, f32a.buffer);
 
-			RenderPath.setTarget("texpaint" + Context.raw.layer.id);
-			RenderPath.bindTarget("baketex2", "tex");
-			RenderPath.drawShader("shader_datas/copy_pass/copy_pass");
+			render_path_set_target("texpaint" + Context.raw.layer.id);
+			render_path_bind_target("baketex2", "tex");
+			render_path_draw_shader("shader_datas/copy_pass/copy_pass");
 
 			///if krom_metal
 			let samplesPerFrame = 4;
@@ -119,7 +119,7 @@ class RenderPathRaytraceBake {
 
 			RenderPathRaytraceBake.raysPix = RenderPathRaytrace.frame * samplesPerFrame;
 			RenderPathRaytraceBake.raysCounter += samplesPerFrame;
-			RenderPathRaytraceBake.raysTimer += Time.realDelta;
+			RenderPathRaytraceBake.raysTimer += time_real_delta();
 			if (RenderPathRaytraceBake.raysTimer >= 1) {
 				RenderPathRaytraceBake.raysSec = RenderPathRaytraceBake.raysCounter;
 				RenderPathRaytraceBake.raysTimer = 0;

+ 7 - 7
base/Sources/Res.ts

@@ -1,12 +1,12 @@
 
 class Res {
 
-	static bundled: Map<string, ImageRaw> = new Map();
+	static bundled: Map<string, image_t> = new Map();
 
 	static load = (names: string[], done: ()=>void) => {
 		let loaded = 0;
 		for (let s of names) {
-			Data.getImage(s, (image: ImageRaw) => {
+			Data.getImage(s, (image: image_t) => {
 				Res.bundled.set(s, image);
 				loaded++;
 				if (loaded == names.length) done();
@@ -14,21 +14,21 @@ class Res {
 		}
 	}
 
-	static get = (name: string): ImageRaw => {
+	static get = (name: string): image_t => {
 		return Res.bundled.get(name);
 	}
 
-	static tile50 = (img: ImageRaw, x: i32, y: i32): TRect => {
+	static tile50 = (img: image_t, x: i32, y: i32): TRect => {
 		let size = Config.raw.window_scale > 1 ? 100 : 50;
 		return { x: x * size, y: y * size, w: size, h: size };
 	}
 
-	static tile25 = (img: ImageRaw, x: i32, y: i32): TRect => {
+	static tile25 = (img: image_t, x: i32, y: i32): TRect => {
 		let size = Config.raw.window_scale > 1 ? 50 : 25;
 		return { x: x * size, y: y * size, w: size, h: size };
 	}
 
-	static tile18 = (img: ImageRaw, x: i32, y: i32): TRect => {
+	static tile18 = (img: image_t, x: i32, y: i32): TRect => {
 		let size = Config.raw.window_scale > 1 ? 36 : 18;
 		return { x: x * size, y: img.height - (y + 1) * size, w: size, h: size };
 	}
@@ -45,7 +45,7 @@ class Res {
 	}
 
 	static embedFont = (name: string, file: ArrayBuffer) => {
-		Data.cachedFonts.set(name, Font.create(file));
+		Data.cachedFonts.set(name, font_create(file));
 	}
 	///end
 }

+ 23 - 23
base/Sources/TabBrowser.ts

@@ -1,8 +1,8 @@
 
 class TabBrowser {
 
-	static hpath = new Handle();
-	static hsearch = new Handle();
+	static hpath = Handle.create();
+	static hsearch = Handle.create();
 	static known = false;
 	static lastPath =  "";
 
@@ -12,35 +12,35 @@ class TabBrowser {
 		UIBase.htabs[TabArea.TabStatus].position = 0;
 	}
 
-	static draw = (htab: Handle) => {
+	static draw = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
 		let statush = Config.raw.layout[LayoutSize.LayoutStatusH];
-		if (ui.tab(htab, tr("Browser")) && statush > UIStatus.defaultStatusH * ui.SCALE()) {
+		if (Zui.tab(htab, tr("Browser")) && statush > UIStatus.defaultStatusH * Zui.SCALE(ui)) {
 
 			if (Config.raw.bookmarks == null) {
 				Config.raw.bookmarks = [];
 			}
 
-			let bookmarksW = Math.floor(100 * ui.SCALE());
+			let bookmarksW = Math.floor(100 * Zui.SCALE(ui));
 
 			if (TabBrowser.hpath.text == "" && Config.raw.bookmarks.length > 0) { // Init to first bookmark
 				TabBrowser.hpath.text = Config.raw.bookmarks[0];
 			}
 
-			ui.beginSticky();
+			Zui.beginSticky();
 			let step = (1 - bookmarksW / ui._w);
 			if (TabBrowser.hsearch.text != "") {
-				ui.row([bookmarksW / ui._w, step * 0.73, step * 0.07, step * 0.17, step * 0.03]);
+				Zui.row([bookmarksW / ui._w, step * 0.73, step * 0.07, step * 0.17, step * 0.03]);
 			}
 			else {
-				ui.row([bookmarksW / ui._w, step * 0.73, step * 0.07, step * 0.2]);
+				Zui.row([bookmarksW / ui._w, step * 0.73, step * 0.07, step * 0.2]);
 			}
 
-			if (ui.button("+")) {
+			if (Zui.button("+")) {
 				Config.raw.bookmarks.push(TabBrowser.hpath.text);
 				Config.save();
 			}
-			if (ui.isHovered) ui.tooltip(tr("Add bookmark"));
+			if (ui.isHovered) Zui.tooltip(tr("Add bookmark"));
 
 			///if krom_android
 			let stripped = false;
@@ -51,7 +51,7 @@ class TabBrowser {
 			}
 			///end
 
-			TabBrowser.hpath.text = ui.textInput(TabBrowser.hpath, tr("Path"));
+			TabBrowser.hpath.text = Zui.textInput(TabBrowser.hpath, tr("Path"));
 
 			///if krom_android
 			if (stripped) {
@@ -62,18 +62,18 @@ class TabBrowser {
 			let refresh = false;
 			let inFocus = ui.inputX > ui._windowX && ui.inputX < ui._windowX + ui._windowW &&
 						  ui.inputY > ui._windowY && ui.inputY < ui._windowY + ui._windowH;
-			if (ui.button(tr("Refresh")) || (inFocus && ui.isKeyPressed && ui.key == KeyCode.F5)) {
+			if (Zui.button(tr("Refresh")) || (inFocus && ui.isKeyPressed && ui.key == KeyCode.F5)) {
 				refresh = true;
 			}
-			TabBrowser.hsearch.text = ui.textInput(TabBrowser.hsearch, tr("Search"), Align.Left, true, true);
-			if (ui.isHovered) ui.tooltip(tr("ctrl+f to search") + "\n" + tr("esc to cancel"));
+			TabBrowser.hsearch.text = Zui.textInput(TabBrowser.hsearch, tr("Search"), Align.Left, true, true);
+			if (ui.isHovered) Zui.tooltip(tr("ctrl+f to search") + "\n" + tr("esc to cancel"));
 			if (ui.isCtrlDown && ui.isKeyPressed && ui.key == KeyCode.F) { // Start searching via ctrl+f
-				ui.startTextEdit(TabBrowser.hsearch);
+				Zui.startTextEdit(TabBrowser.hsearch);
 			}
-			if (TabBrowser.hsearch.text != "" && (ui.button(tr("X")) || ui.isEscapeDown)) {
+			if (TabBrowser.hsearch.text != "" && (Zui.button(tr("X")) || ui.isEscapeDown)) {
 				TabBrowser.hsearch.text = "";
 			}
-			ui.endSticky();
+			Zui.endSticky();
 
 			if (TabBrowser.lastPath != TabBrowser.hpath.text) {
 				TabBrowser.hsearch.text = "";
@@ -86,7 +86,7 @@ class TabBrowser {
 			UIFiles.fileBrowser(ui, TabBrowser.hpath, false, true, TabBrowser.hsearch.text, refresh, (file: string) => {
 				let fileName = file.substr(file.lastIndexOf(Path.sep) + 1);
 				if (fileName != "..") {
-					UIMenu.draw((ui: Zui) => {
+					UIMenu.draw((ui: ZuiRaw) => {
 						if (UIMenu.menuButton(ui, tr("Import"))) {
 							ImportAsset.run(file);
 						}
@@ -176,13 +176,13 @@ class TabBrowser {
 			ui._y = _y;
 			ui._w = bookmarksW;
 
-			if (ui.button(tr("Cloud"), Align.Left)) {
+			if (Zui.button(tr("Cloud"), Align.Left)) {
 				TabBrowser.hpath.text = "cloud";
 			}
 
-			if (ui.button(tr("Disk"), Align.Left)) {
+			if (Zui.button(tr("Disk"), Align.Left)) {
 				///if krom_android
-				UIMenu.draw((ui: Zui) => {
+				UIMenu.draw((ui: ZuiRaw) => {
 					if (UIMenu.menuButton(ui, tr("Download"))) {
 						TabBrowser.hpath.text = UIFiles.defaultPath;
 					}
@@ -204,12 +204,12 @@ class TabBrowser {
 			for (let b of Config.raw.bookmarks) {
 				let folder = b.substr(b.lastIndexOf(Path.sep) + 1);
 
-				if (ui.button(folder, Align.Left)) {
+				if (Zui.button(folder, Align.Left)) {
 					TabBrowser.hpath.text = b;
 				}
 
 				if (ui.isHovered && ui.inputReleasedR) {
-					UIMenu.draw((ui: Zui) => {
+					UIMenu.draw((ui: ZuiRaw) => {
 						if (UIMenu.menuButton(ui, tr("Delete"))) {
 							array_remove(Config.raw.bookmarks, b);
 							Config.save();

+ 33 - 33
base/Sources/TabBrushes.ts

@@ -3,77 +3,77 @@
 
 class TabBrushes {
 
-	static draw = (htab: Handle) => {
+	static draw = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
-		if (ui.tab(htab, tr("Brushes"))) {
-			ui.beginSticky();
-			ui.row([1 / 4, 1 / 4, 1 / 4]);
-			if (ui.button(tr("New"))) {
+		if (Zui.tab(htab, tr("Brushes"))) {
+			Zui.beginSticky();
+			Zui.row([1 / 4, 1 / 4, 1 / 4]);
+			if (Zui.button(tr("New"))) {
 				Context.raw.brush = SlotBrush.create();
 				Project.brushes.push(Context.raw.brush);
 				MakeMaterial.parseBrush();
 				UINodes.hwnd.redraws = 2;
 			}
-			if (ui.button(tr("Import"))) {
+			if (Zui.button(tr("Import"))) {
 				Project.importBrush();
 			}
-			if (ui.button(tr("Nodes"))) {
+			if (Zui.button(tr("Nodes"))) {
 				UIBase.showBrushNodes();
 			}
-			ui.endSticky();
-			ui.separator(3, false);
+			Zui.endSticky();
+			Zui.separator(3, false);
 
-			let slotw = Math.floor(51 * ui.SCALE());
+			let slotw = Math.floor(51 * Zui.SCALE(ui));
 			let num = Math.floor(Config.raw.layout[LayoutSize.LayoutSidebarW] / slotw);
 
 			for (let row = 0; row < Math.floor(Math.ceil(Project.brushes.length / num)); ++row) {
 				let mult = Config.raw.show_asset_names ? 2 : 1;
 				let ar = [];
 				for (let i = 0; i < num * mult; ++i) ar.push(1 / num);
-				ui.row(ar);
+				Zui.row(ar);
 
 				ui._x += 2;
-				let off = Config.raw.show_asset_names ? ui.ELEMENT_OFFSET() * 10.0 : 6;
+				let off = Config.raw.show_asset_names ? Zui.ELEMENT_OFFSET(ui) * 10.0 : 6;
 				if (row > 0) ui._y += off;
 
 				for (let j = 0; j < num; ++j) {
-					let imgw = Math.floor(50 * ui.SCALE());
+					let imgw = Math.floor(50 * Zui.SCALE(ui));
 					let i = j + row * num;
 					if (i >= Project.brushes.length) {
-						ui.endElement(imgw);
-						if (Config.raw.show_asset_names) ui.endElement(0);
+						Zui.endElement(imgw);
+						if (Config.raw.show_asset_names) Zui.endElement(0);
 						continue;
 					}
-					let img = ui.SCALE() > 1 ? Project.brushes[i].image : Project.brushes[i].imageIcon;
+					let img = Zui.SCALE(ui) > 1 ? Project.brushes[i].image : Project.brushes[i].imageIcon;
 					let imgFull = Project.brushes[i].image;
 
 					if (Context.raw.brush == Project.brushes[i]) {
-						// ui.fill(1, -2, img.width + 3, img.height + 3, ui.t.HIGHLIGHT_COL); // TODO
+						// Zui.fill(1, -2, img.width + 3, img.height + 3, ui.t.HIGHLIGHT_COL); // TODO
 						let off = row % 2 == 1 ? 1 : 0;
 						let w = 50;
 						if (Config.raw.window_scale > 1) w += Math.floor(Config.raw.window_scale * 2);
-						ui.fill(-1,         -2, w + 3,       2, ui.t.HIGHLIGHT_COL);
-						ui.fill(-1,    w - off, w + 3, 2 + off, ui.t.HIGHLIGHT_COL);
-						ui.fill(-1,         -2,     2,   w + 3, ui.t.HIGHLIGHT_COL);
-						ui.fill(w + 1,      -2,     2,   w + 4, ui.t.HIGHLIGHT_COL);
+						Zui.fill(-1,         -2, w + 3,       2, ui.t.HIGHLIGHT_COL);
+						Zui.fill(-1,    w - off, w + 3, 2 + off, ui.t.HIGHLIGHT_COL);
+						Zui.fill(-1,         -2,     2,   w + 3, ui.t.HIGHLIGHT_COL);
+						Zui.fill(w + 1,      -2,     2,   w + 4, ui.t.HIGHLIGHT_COL);
 					}
 
 					let uix = ui._x;
 					//let uiy = ui._y;
-					let tile = ui.SCALE() > 1 ? 100 : 50;
-					let state = Project.brushes[i].previewReady ? ui.image(img) : ui.image(Res.get("icons.k"), -1, null, tile * 5, tile, tile, tile);
+					let tile = Zui.SCALE(ui) > 1 ? 100 : 50;
+					let state = Project.brushes[i].previewReady ? Zui.image(img) : Zui.image(Res.get("icons.k"), -1, null, tile * 5, tile, tile, tile);
 					if (state == State.Started) {
 						if (Context.raw.brush != Project.brushes[i]) Context.selectBrush(i);
-						if (Time.time() - Context.raw.selectTime < 0.25) UIBase.showBrushNodes();
-						Context.raw.selectTime = Time.time();
-						// App.dragOffX = -(Mouse.x - uix - ui._windowX - 3);
-						// App.dragOffY = -(Mouse.y - uiy - ui._windowY + 1);
+						if (time_time() - Context.raw.selectTime < 0.25) UIBase.showBrushNodes();
+						Context.raw.selectTime = time_time();
+						// App.dragOffX = -(mouse_x - uix - ui._windowX - 3);
+						// App.dragOffY = -(mouse_y - uiy - ui._windowY + 1);
 						// App.dragBrush = Context.raw.brush;
 					}
 					if (ui.isHovered && ui.inputReleasedR) {
 						Context.selectBrush(i);
 						let add = Project.brushes.length > 1 ? 1 : 0;
-						UIMenu.draw((ui: Zui) => {
+						UIMenu.draw((ui: ZuiRaw) => {
 							//let b = Project.brushes[i];
 
 							if (UIMenu.menuButton(ui, tr("Export"))) {
@@ -110,19 +110,19 @@ class TabBrushes {
 							});
 						}
 						else {
-							ui.tooltipImage(imgFull);
-							ui.tooltip(Project.brushes[i].canvas.name);
+							Zui.tooltipImage(imgFull);
+							Zui.tooltip(Project.brushes[i].canvas.name);
 						}
 					}
 
 					if (Config.raw.show_asset_names) {
 						ui._x = uix;
 						ui._y += slotw * 0.9;
-						ui.text(Project.brushes[i].canvas.name, Align.Center);
-						if (ui.isHovered) ui.tooltip(Project.brushes[i].canvas.name);
+						Zui.text(Project.brushes[i].canvas.name, Align.Center);
+						if (ui.isHovered) Zui.tooltip(Project.brushes[i].canvas.name);
 						ui._y -= slotw * 0.9;
 						if (i == Project.brushes.length - 1) {
-							ui._y += j == num - 1 ? imgw : imgw + ui.ELEMENT_H() + ui.ELEMENT_OFFSET();
+							ui._y += j == num - 1 ? imgw : imgw + Zui.ELEMENT_H(ui) + Zui.ELEMENT_OFFSET(ui);
 						}
 					}
 				}

+ 16 - 16
base/Sources/TabConsole.ts

@@ -1,62 +1,62 @@
 
 class TabConsole {
 
-	static draw = (htab: Handle) => {
+	static draw = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
 
 		let title = Console.messageTimer > 0 ? Console.message + "        " : tr("Console");
 		let color = Console.messageTimer > 0 ? Console.messageColor : -1;
 
 		let statush = Config.raw.layout[LayoutSize.LayoutStatusH];
-		if (ui.tab(htab, title, false, color) && statush > UIStatus.defaultStatusH * ui.SCALE()) {
+		if (Zui.tab(htab, title, false, color) && statush > UIStatus.defaultStatusH * Zui.SCALE(ui)) {
 
-			ui.beginSticky();
+			Zui.beginSticky();
 			///if (krom_windows || krom_linux || krom_darwin) // Copy
 			if (Config.raw.touch_ui) {
-				ui.row([1 / 4, 1 / 4, 1 / 4]);
+				Zui.row([1 / 4, 1 / 4, 1 / 4]);
 			}
 			else {
-				ui.row([1 / 14, 1 / 14, 1 / 14]);
+				Zui.row([1 / 14, 1 / 14, 1 / 14]);
 			}
 			///else
 			if (Config.raw.touch_ui) {
-				ui.row([1 / 4, 1 / 4]);
+				Zui.row([1 / 4, 1 / 4]);
 			}
 			else {
-				ui.row([1 / 14, 1 / 14]);
+				Zui.row([1 / 14, 1 / 14]);
 			}
 			///end
 
-			if (ui.button(tr("Clear"))) {
+			if (Zui.button(tr("Clear"))) {
 				Console.lastTraces = [];
 			}
-			if (ui.button(tr("Export"))) {
+			if (Zui.button(tr("Export"))) {
 				let str = Console.lastTraces.join("\n");
 				UIFiles.show("txt", true, false, (path: string) => {
 					let f = UIFiles.filename;
 					if (f == "") f = tr("untitled");
 					path = path + Path.sep + f;
 					if (!path.endsWith(".txt")) path += ".txt";
-					Krom.fileSaveBytes(path, System.stringToBuffer(str));
+					Krom.fileSaveBytes(path, sys_string_to_buffer(str));
 				});
 			}
 			///if (krom_windows || krom_linux || krom_darwin)
-			if (ui.button(tr("Copy"))) {
+			if (Zui.button(tr("Copy"))) {
 				let str = Console.lastTraces.join("\n");
 				Krom.copyToClipboard(str);
 			}
 			///end
 
-			ui.endSticky();
+			Zui.endSticky();
 
 			let _font = ui.font;
 			let _fontSize = ui.fontSize;
-			Data.getFont("font_mono.ttf", (f: FontRaw) => { ui.setFont(f); }); // Sync
-			ui.fontSize = Math.floor(15 * ui.SCALE());
+			Data.getFont("font_mono.ttf", (f: font_t) => { Zui.setFont(ui, f); }); // Sync
+			ui.fontSize = Math.floor(15 * Zui.SCALE(ui));
 			for (let t of Console.lastTraces) {
-				ui.text(t);
+				Zui.text(t);
 			}
-			ui.setFont(_font);
+			Zui.setFont(ui, _font);
 			ui.fontSize = _fontSize;
 		}
 	}

+ 33 - 33
base/Sources/TabFonts.ts

@@ -3,65 +3,65 @@
 
 class TabFonts {
 
-	static draw = (htab: Handle) => {
+	static draw = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
 		let statush = Config.raw.layout[LayoutSize.LayoutStatusH];
-		if (ui.tab(htab, tr("Fonts")) && statush > UIStatus.defaultStatusH * ui.SCALE()) {
+		if (Zui.tab(htab, tr("Fonts")) && statush > UIStatus.defaultStatusH * Zui.SCALE(ui)) {
 
-			ui.beginSticky();
+			Zui.beginSticky();
 			if (Config.raw.touch_ui) {
-				ui.row([1 / 4, 1 / 4]);
+				Zui.row([1 / 4, 1 / 4]);
 			}
 			else {
-				ui.row([1 / 14, 1 / 14]);
+				Zui.row([1 / 14, 1 / 14]);
 			}
 
-			if (ui.button(tr("Import"))) Project.importAsset("ttf,ttc,otf");
-			if (ui.isHovered) ui.tooltip(tr("Import font file"));
+			if (Zui.button(tr("Import"))) Project.importAsset("ttf,ttc,otf");
+			if (ui.isHovered) Zui.tooltip(tr("Import font file"));
 
-			if (ui.button(tr("2D View"))) {
+			if (Zui.button(tr("2D View"))) {
 				UIBase.show2DView(View2DType.View2DFont);
 			}
-			ui.endSticky();
-			ui.separator(3, false);
+			Zui.endSticky();
+			Zui.separator(3, false);
 
-			let statusw = System.width - UIToolbar.toolbarw - Config.raw.layout[LayoutSize.LayoutSidebarW];
-			let slotw = Math.floor(51 * ui.SCALE());
+			let statusw = sys_width() - UIToolbar.toolbarw - Config.raw.layout[LayoutSize.LayoutSidebarW];
+			let slotw = Math.floor(51 * Zui.SCALE(ui));
 			let num = Math.floor(statusw / slotw);
 
 			for (let row = 0; row < Math.floor(Math.ceil(Project.fonts.length / num)); ++row) {
 				let mult = Config.raw.show_asset_names ? 2 : 1;
 				let ar = [];
 				for (let i = 0; i < num * mult; ++i) ar.push(1 / num);
-				ui.row(ar);
+				Zui.row(ar);
 
 				ui._x += 2;
-				let off = Config.raw.show_asset_names ? ui.ELEMENT_OFFSET() * 10.0 : 6;
+				let off = Config.raw.show_asset_names ? Zui.ELEMENT_OFFSET(ui) * 10.0 : 6;
 				if (row > 0) ui._y += off;
 
 				for (let j = 0; j < num; ++j) {
-					let imgw = Math.floor(50 * ui.SCALE());
+					let imgw = Math.floor(50 * Zui.SCALE(ui));
 					let i = j + row * num;
 					if (i >= Project.fonts.length) {
-						ui.endElement(imgw);
-						if (Config.raw.show_asset_names) ui.endElement(0);
+						Zui.endElement(imgw);
+						if (Config.raw.show_asset_names) Zui.endElement(0);
 						continue;
 					}
 					let img = Project.fonts[i].image;
 
 					if (Context.raw.font == Project.fonts[i]) {
-						// ui.fill(1, -2, img.width + 3, img.height + 3, ui.t.HIGHLIGHT_COL); // TODO
+						// Zui.fill(1, -2, img.width + 3, img.height + 3, ui.t.HIGHLIGHT_COL); // TODO
 						let off = row % 2 == 1 ? 1 : 0;
 						let w = 50;
 						if (Config.raw.window_scale > 1) w += Math.floor(Config.raw.window_scale * 2);
-						ui.fill(-1,         -2, w + 3,       2, ui.t.HIGHLIGHT_COL);
-						ui.fill(-1,    w - off, w + 3, 2 + off, ui.t.HIGHLIGHT_COL);
-						ui.fill(-1,         -2,     2,   w + 3, ui.t.HIGHLIGHT_COL);
-						ui.fill(w + 1,      -2,     2,   w + 4, ui.t.HIGHLIGHT_COL);
+						Zui.fill(-1,         -2, w + 3,       2, ui.t.HIGHLIGHT_COL);
+						Zui.fill(-1,    w - off, w + 3, 2 + off, ui.t.HIGHLIGHT_COL);
+						Zui.fill(-1,         -2,     2,   w + 3, ui.t.HIGHLIGHT_COL);
+						Zui.fill(w + 1,      -2,     2,   w + 4, ui.t.HIGHLIGHT_COL);
 					}
 
 					let uix = ui._x;
-					let tile = ui.SCALE() > 1 ? 100 : 50;
+					let tile = Zui.SCALE(ui) > 1 ? 100 : 50;
 					let state = State.Idle;
 					if (Project.fonts[i].previewReady) {
 						// ui.g.pipeline = UIView2D.pipe; // L8
@@ -69,11 +69,11 @@ class TabFonts {
 						// ui.currentWindow.texture.g4.setPipeline(UIView2D.pipe);
 						// ///end
 						// ui.currentWindow.texture.g4.setInt(UIView2D.channelLocation, 1);
-						state = ui.image(img);
+						state = Zui.image(img);
 						// ui.g.pipeline = null;
 					}
 					else {
-						state = ui.image(Res.get("icons.k"), -1, null, tile * 6, tile, tile, tile);
+						state = Zui.image(Res.get("icons.k"), -1, null, tile * 6, tile, tile, tile);
 					}
 
 					if (state == State.Started) {
@@ -83,14 +83,14 @@ class TabFonts {
 							}
 							App.notifyOnInit(_init);
 						}
-						if (Time.time() - Context.raw.selectTime < 0.25) UIBase.show2DView(View2DType.View2DFont);
-						Context.raw.selectTime = Time.time();
+						if (time_time() - Context.raw.selectTime < 0.25) UIBase.show2DView(View2DType.View2DFont);
+						Context.raw.selectTime = time_time();
 					}
 					if (ui.isHovered && ui.inputReleasedR) {
 						Context.selectFont(i);
 						let add = Project.fonts.length > 1 ? 1 : 0;
 						let fontName = Project.fonts[i].name;
-						UIMenu.draw((ui: Zui) => {
+						UIMenu.draw((ui: ZuiRaw) => {
 							if (Project.fonts.length > 1 && UIMenu.menuButton(ui, tr("Delete"), "delete") && Project.fonts[i].file != "") {
 								TabFonts.deleteFont(Project.fonts[i]);
 							}
@@ -106,19 +106,19 @@ class TabFonts {
 							});
 						}
 						else {
-							ui.tooltipImage(img);
-							ui.tooltip(Project.fonts[i].name);
+							Zui.tooltipImage(img);
+							Zui.tooltip(Project.fonts[i].name);
 						}
 					}
 
 					if (Config.raw.show_asset_names) {
 						ui._x = uix;
 						ui._y += slotw * 0.9;
-						ui.text(Project.fonts[i].name, Align.Center);
-						if (ui.isHovered) ui.tooltip(Project.fonts[i].name);
+						Zui.text(Project.fonts[i].name, Align.Center);
+						if (ui.isHovered) Zui.tooltip(Project.fonts[i].name);
 						ui._y -= slotw * 0.9;
 						if (i == Project.fonts.length - 1) {
-							ui._y += j == num - 1 ? imgw : imgw + ui.ELEMENT_H() + ui.ELEMENT_OFFSET();
+							ui._y += j == num - 1 ? imgw : imgw + Zui.ELEMENT_H(ui) + Zui.ELEMENT_OFFSET(ui);
 						}
 					}
 				}

+ 5 - 5
base/Sources/TabHistory.ts

@@ -3,15 +3,15 @@
 
 class TabHistory {
 
-	static draw = (htab: Handle) => {
+	static draw = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
-		if (ui.tab(htab, tr("History"))) {
+		if (Zui.tab(htab, tr("History"))) {
 			for (let i = 0; i < History.steps.length; ++i) {
 				let active = History.steps.length - 1 - History.redos;
 				if (i == active) {
-					ui.fill(0, 0, ui._windowW, ui.t.ELEMENT_H, ui.t.HIGHLIGHT_COL);
+					Zui.fill(0, 0, ui._windowW, ui.t.ELEMENT_H, ui.t.HIGHLIGHT_COL);
 				}
-				ui.text(History.steps[i].name);
+				Zui.text(History.steps[i].name);
 				if (ui.isReleased) { // Jump to undo step
 					let diff = i - active;
 					while (diff > 0) {
@@ -23,7 +23,7 @@ class TabHistory {
 						History.undo();
 					}
 				}
-				ui.fill(0, 0, (ui._windowW / ui.SCALE() - 2), 1 * ui.SCALE(), ui.t.SEPARATOR_COL);
+				Zui.fill(0, 0, (ui._windowW / Zui.SCALE(ui) - 2), 1 * Zui.SCALE(ui), ui.t.SEPARATOR_COL);
 			}
 		}
 	}

+ 70 - 71
base/Sources/TabMaterials.ts

@@ -3,92 +3,92 @@
 
 class TabMaterials {
 
-	static draw = (htab: Handle) => {
+	static draw = (htab: HandleRaw) => {
 		let mini = Config.raw.layout[LayoutSize.LayoutSidebarW] <= UIBase.sidebarMiniW;
 		mini ? TabMaterials.drawMini(htab) : TabMaterials.drawFull(htab);
 	}
 
-	static drawMini = (htab: Handle) => {
+	static drawMini = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
-		ui.setHoveredTabName(tr("Materials"));
+		Zui.setHoveredTabName(tr("Materials"));
 
-		ui.beginSticky();
-		ui.separator(5);
+		Zui.beginSticky();
+		Zui.separator(5);
 
 		TabMaterials.buttonNodes();
 		TabMaterials.buttonNew("+");
 
-		ui.endSticky();
-		ui.separator(3, false);
+		Zui.endSticky();
+		Zui.separator(3, false);
 		TabMaterials.drawSlots(true);
 	}
 
-	static drawFull = (htab: Handle) => {
+	static drawFull = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
-		if (ui.tab(htab, tr("Materials"))) {
-			ui.beginSticky();
-			ui.row([1 / 4, 1 / 4, 1 / 4]);
+		if (Zui.tab(htab, tr("Materials"))) {
+			Zui.beginSticky();
+			Zui.row([1 / 4, 1 / 4, 1 / 4]);
 
 			TabMaterials.buttonNew(tr("New"));
-			if (ui.button(tr("Import"))) {
+			if (Zui.button(tr("Import"))) {
 				Project.importMaterial();
 			}
 			TabMaterials.buttonNodes();
 
-			ui.endSticky();
-			ui.separator(3, false);
+			Zui.endSticky();
+			Zui.separator(3, false);
 			TabMaterials.drawSlots(false);
 		}
 	}
 
 	static buttonNodes = () => {
 		let ui = UIBase.ui;
-		if (ui.button(tr("Nodes"))) {
+		if (Zui.button(tr("Nodes"))) {
 			UIBase.showMaterialNodes();
 		}
-		else if (ui.isHovered) ui.tooltip(tr("Show Node Editor") + ` (${Config.keymap.toggle_node_editor})`);
+		else if (ui.isHovered) Zui.tooltip(tr("Show Node Editor") + ` (${Config.keymap.toggle_node_editor})`);
 	}
 
 	static drawSlots = (mini: bool) => {
 		let ui = UIBase.ui;
-		let slotw = Math.floor(51 * ui.SCALE());
+		let slotw = Math.floor(51 * Zui.SCALE(ui));
 		let num = Math.floor(Config.raw.layout[LayoutSize.LayoutSidebarW] / slotw);
 
 		for (let row = 0; row < Math.floor(Math.ceil(Project.materials.length / num)); ++row) {
 			let mult = Config.raw.show_asset_names ? 2 : 1;
 			let ar = [];
 			for (let i = 0; i < num * mult; ++i) ar.push(1 / num);
-			ui.row(ar);
+			Zui.row(ar);
 
 			ui._x += 2;
-			let off = Config.raw.show_asset_names ? ui.ELEMENT_OFFSET() * 10.0 : 6;
+			let off = Config.raw.show_asset_names ? Zui.ELEMENT_OFFSET(ui) * 10.0 : 6;
 			if (row > 0) ui._y += off;
 
 			for (let j = 0; j < num; ++j) {
-				let imgw = Math.floor(50 * ui.SCALE());
+				let imgw = Math.floor(50 * Zui.SCALE(ui));
 				let i = j + row * num;
 				if (i >= Project.materials.length) {
-					ui.endElement(imgw);
-					if (Config.raw.show_asset_names) ui.endElement(0);
+					Zui.endElement(imgw);
+					if (Config.raw.show_asset_names) Zui.endElement(0);
 					continue;
 				}
-				let img = ui.SCALE() > 1 ? Project.materials[i].image : Project.materials[i].imageIcon;
+				let img = Zui.SCALE(ui) > 1 ? Project.materials[i].image : Project.materials[i].imageIcon;
 				let imgFull = Project.materials[i].image;
 
 				// Highligh selected
 				if (Context.raw.material == Project.materials[i]) {
 					if (mini) {
-						let w = ui._w / ui.SCALE();
-						ui.rect(0, -2, w - 2, w - 4, ui.t.HIGHLIGHT_COL, 3);
+						let w = ui._w / Zui.SCALE(ui);
+						Zui.rect(0, -2, w - 2, w - 4, ui.t.HIGHLIGHT_COL, 3);
 					}
 					else {
 						let off = row % 2 == 1 ? 1 : 0;
 						let w = 50;
 						if (Config.raw.window_scale > 1) w += Math.floor(Config.raw.window_scale * 2);
-						ui.fill(-1,         -2, w + 3,       2, ui.t.HIGHLIGHT_COL);
-						ui.fill(-1,    w - off, w + 3, 2 + off, ui.t.HIGHLIGHT_COL);
-						ui.fill(-1,         -2,     2,   w + 3, ui.t.HIGHLIGHT_COL);
-						ui.fill(w + 1,      -2,     2,   w + 4, ui.t.HIGHLIGHT_COL);
+						Zui.fill(-1,         -2, w + 3,       2, ui.t.HIGHLIGHT_COL);
+						Zui.fill(-1,    w - off, w + 3, 2 + off, ui.t.HIGHLIGHT_COL);
+						Zui.fill(-1,         -2,     2,   w + 3, ui.t.HIGHLIGHT_COL);
+						Zui.fill(w + 1,      -2,     2,   w + 4, ui.t.HIGHLIGHT_COL);
 					}
 				}
 
@@ -99,23 +99,23 @@ class TabMaterials {
 				// Draw material icon
 				let uix = ui._x;
 				let uiy = ui._y;
-				let tile = ui.SCALE() > 1 ? 100 : 50;
-				let imgh: Null<f32> = mini ? UIBase.defaultSidebarMiniW * 0.85 * ui.SCALE() : null;
+				let tile = Zui.SCALE(ui) > 1 ? 100 : 50;
+				let imgh: Null<f32> = mini ? UIBase.defaultSidebarMiniW * 0.85 * Zui.SCALE(ui) : null;
 				let state = Project.materials[i].previewReady ?
-					ui.image(img, 0xffffffff, imgh) :
-					ui.image(Res.get("icons.k"), 0xffffffff, null, tile, tile, tile, tile);
+					Zui.image(img, 0xffffffff, imgh) :
+					Zui.image(Res.get("icons.k"), 0xffffffff, null, tile, tile, tile, tile);
 
 				// Draw material numbers when selecting a material via keyboard shortcut
 				let isTyping = ui.isTyping || UIView2D.ui.isTyping || UINodes.ui.isTyping;
 				if (!isTyping) {
 					if (i < 9 && Operator.shortcut(Config.keymap.select_material, ShortcutType.ShortcutDown)) {
 						let number = String(i + 1);
-						let width = Font.width(ui.font, ui.fontSize, number) + 10;
-						let height = Font.height(ui.font, ui.fontSize);
+						let width = font_width(ui.font, ui.fontSize, number) + 10;
+						let height = font_height(ui.font, ui.fontSize);
 						ui.g.color = ui.t.TEXT_COL;
-						Graphics2.fillRect(uix, uiy, width, height);
+						g2_fill_rect(uix, uiy, width, height);
 						ui.g.color = ui.t.ACCENT_COL;
-						Graphics2.drawString(number, uix + 5, uiy);
+						g2_draw_string(number, uix + 5, uiy);
 					}
 				}
 
@@ -132,16 +132,16 @@ class TabMaterials {
 						}
 						///end
 					}
-					Base.dragOffX = -(Mouse.x - uix - ui._windowX - 3);
-					Base.dragOffY = -(Mouse.y - uiy - ui._windowY + 1);
+					Base.dragOffX = -(mouse_x - uix - ui._windowX - 3);
+					Base.dragOffY = -(mouse_y - uiy - ui._windowY + 1);
 					Base.dragMaterial = Context.raw.material;
 					// Double click to show nodes
-					if (Time.time() - Context.raw.selectTime < 0.25) {
+					if (time_time() - Context.raw.selectTime < 0.25) {
 						UIBase.showMaterialNodes();
 						Base.dragMaterial = null;
 						Base.isDragging = false;
 					}
-					Context.raw.selectTime = Time.time();
+					Context.raw.selectTime = time_time();
 				}
 
 				// Context menu
@@ -149,7 +149,7 @@ class TabMaterials {
 					Context.selectMaterial(i);
 					let add = Project.materials.length > 1 ? 1 : 0;
 
-					UIMenu.draw((ui: Zui) => {
+					UIMenu.draw((ui: ZuiRaw) => {
 						let m = Project.materials[i];
 
 						if (UIMenu.menuButton(ui, tr("To Fill Layer"))) {
@@ -185,33 +185,33 @@ class TabMaterials {
 							TabMaterials.deleteMaterial(m);
 						}
 
-						let baseHandle = Zui.handle("tabmaterials_0").nest(m.id, {selected: m.paintBase});
-						let opacHandle = Zui.handle("tabmaterials_1").nest(m.id, {selected: m.paintOpac});
-						let norHandle = Zui.handle("tabmaterials_2").nest(m.id, {selected: m.paintNor});
-						let occHandle = Zui.handle("tabmaterials_3").nest(m.id, {selected: m.paintOcc});
-						let roughHandle = Zui.handle("tabmaterials_4").nest(m.id, {selected: m.paintRough});
-						let metHandle = Zui.handle("tabmaterials_5").nest(m.id, {selected: m.paintMet});
-						let heightHandle = Zui.handle("tabmaterials_6").nest(m.id, {selected: m.paintHeight});
-						let emisHandle = Zui.handle("tabmaterials_7").nest(m.id, {selected: m.paintEmis});
-						let subsHandle = Zui.handle("tabmaterials_8").nest(m.id, {selected: m.paintSubs});
+						let baseHandle = Zui.nest(Zui.handle("tabmaterials_0"), m.id, {selected: m.paintBase});
+						let opacHandle = Zui.nest(Zui.handle("tabmaterials_1"), m.id, {selected: m.paintOpac});
+						let norHandle = Zui.nest(Zui.handle("tabmaterials_2"), m.id, {selected: m.paintNor});
+						let occHandle = Zui.nest(Zui.handle("tabmaterials_3"), m.id, {selected: m.paintOcc});
+						let roughHandle = Zui.nest(Zui.handle("tabmaterials_4"), m.id, {selected: m.paintRough});
+						let metHandle = Zui.nest(Zui.handle("tabmaterials_5"), m.id, {selected: m.paintMet});
+						let heightHandle = Zui.nest(Zui.handle("tabmaterials_6"), m.id, {selected: m.paintHeight});
+						let emisHandle = Zui.nest(Zui.handle("tabmaterials_7"), m.id, {selected: m.paintEmis});
+						let subsHandle = Zui.nest(Zui.handle("tabmaterials_8"), m.id, {selected: m.paintSubs});
 						UIMenu.menuFill(ui);
-						m.paintBase = ui.check(baseHandle, tr("Base Color"));
+						m.paintBase = Zui.check(baseHandle, tr("Base Color"));
 						UIMenu.menuFill(ui);
-						m.paintOpac = ui.check(opacHandle, tr("Opacity"));
+						m.paintOpac = Zui.check(opacHandle, tr("Opacity"));
 						UIMenu.menuFill(ui);
-						m.paintNor = ui.check(norHandle, tr("Normal"));
+						m.paintNor = Zui.check(norHandle, tr("Normal"));
 						UIMenu.menuFill(ui);
-						m.paintOcc = ui.check(occHandle, tr("Occlusion"));
+						m.paintOcc = Zui.check(occHandle, tr("Occlusion"));
 						UIMenu.menuFill(ui);
-						m.paintRough = ui.check(roughHandle, tr("Roughness"));
+						m.paintRough = Zui.check(roughHandle, tr("Roughness"));
 						UIMenu.menuFill(ui);
-						m.paintMet = ui.check(metHandle, tr("Metallic"));
+						m.paintMet = Zui.check(metHandle, tr("Metallic"));
 						UIMenu.menuFill(ui);
-						m.paintHeight = ui.check(heightHandle, tr("Height"));
+						m.paintHeight = Zui.check(heightHandle, tr("Height"));
 						UIMenu.menuFill(ui);
-						m.paintEmis = ui.check(emisHandle, tr("Emission"));
+						m.paintEmis = Zui.check(emisHandle, tr("Emission"));
 						UIMenu.menuFill(ui);
-						m.paintSubs = ui.check(subsHandle, tr("Subsurface"));
+						m.paintSubs = Zui.check(subsHandle, tr("Subsurface"));
 						if (baseHandle.changed ||
 							opacHandle.changed ||
 							norHandle.changed ||
@@ -227,22 +227,22 @@ class TabMaterials {
 					}, 13 + add);
 				}
 				if (ui.isHovered) {
-					ui.tooltipImage(imgFull);
-					if (i < 9) ui.tooltip(Project.materials[i].canvas.name + " - (" + Config.keymap.select_material + " " + (i + 1) + ")");
-					else ui.tooltip(Project.materials[i].canvas.name);
+					Zui.tooltipImage(imgFull);
+					if (i < 9) Zui.tooltip(Project.materials[i].canvas.name + " - (" + Config.keymap.select_material + " " + (i + 1) + ")");
+					else Zui.tooltip(Project.materials[i].canvas.name);
 				}
 
 				if (Config.raw.show_asset_names) {
 					ui._x = uix;
 					ui._y += slotw * 0.9;
-					ui.text(Project.materials[i].canvas.name, Align.Center);
+					Zui.text(Project.materials[i].canvas.name, Align.Center);
 					if (ui.isHovered) {
-						if (i < 9) ui.tooltip(Project.materials[i].canvas.name + " - (" + Config.keymap.select_material + " " + (i + 1) + ")");
-						else ui.tooltip(Project.materials[i].canvas.name);
+						if (i < 9) Zui.tooltip(Project.materials[i].canvas.name + " - (" + Config.keymap.select_material + " " + (i + 1) + ")");
+						else Zui.tooltip(Project.materials[i].canvas.name);
 					}
 					ui._y -= slotw * 0.9;
 					if (i == Project.materials.length - 1) {
-						ui._y += j == num - 1 ? imgw : imgw + ui.ELEMENT_H() + ui.ELEMENT_OFFSET();
+						ui._y += j == num - 1 ? imgw : imgw + Zui.ELEMENT_H(ui) + Zui.ELEMENT_OFFSET(ui);
 					}
 				}
 			}
@@ -264,12 +264,12 @@ class TabMaterials {
 
 	static buttonNew = (text: string) => {
 		let ui = UIBase.ui;
-		if (ui.button(text)) {
-			Graphics2.end(ui.g);
+		if (Zui.button(text)) {
+			g2_end(ui.g);
 			Context.raw.material = SlotMaterial.create(Project.materials[0].data);
 			Project.materials.push(Context.raw.material);
 			TabMaterials.updateMaterial();
-			Graphics2.begin(ui.g, false);
+			g2_begin(ui.g, false);
 			History.newMaterial();
 		}
 	}
@@ -329,7 +329,6 @@ class TabMaterials {
 		Project.materials.splice(i, 1);
 		UIBase.hwnds[1].redraws = 2;
 		for (let m of Project.materials) TabMaterials.updateMaterialPointers(m.canvas.nodes, i);
-		// for (let n of m.canvas.nodes) UINodes.onNodeRemove(n);
 	}
 }
 

+ 30 - 30
base/Sources/TabMeshes.ts

@@ -1,33 +1,33 @@
 
 class TabMeshes {
 
-	static draw = (htab: Handle) => {
+	static draw = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
 		let statush = Config.raw.layout[LayoutSize.LayoutStatusH];
-		if (ui.tab(htab, tr("Meshes")) && statush > UIStatus.defaultStatusH * ui.SCALE()) {
+		if (Zui.tab(htab, tr("Meshes")) && statush > UIStatus.defaultStatusH * Zui.SCALE(ui)) {
 
-			ui.beginSticky();
+			Zui.beginSticky();
 
 			///if (is_paint || is_sculpt)
 			if (Config.raw.touch_ui) {
-				ui.row([1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6]);
+				Zui.row([1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6]);
 			}
 			else {
-				ui.row([1 / 14, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 14]);
+				Zui.row([1 / 14, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 14]);
 			}
 			///end
 
 			///if is_lab
 			if (Config.raw.touch_ui) {
-				ui.row([1 / 7, 1 / 7, 1 / 7, 1 / 7, 1 / 7, 1 / 7, 1 / 7]);
+				Zui.row([1 / 7, 1 / 7, 1 / 7, 1 / 7, 1 / 7, 1 / 7, 1 / 7]);
 			}
 			else {
-				ui.row([1 / 14, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 14]);
+				Zui.row([1 / 14, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 14]);
 			}
 			///end
 
-			if (ui.button(tr("Import"))) {
-				UIMenu.draw((ui: Zui) => {
+			if (Zui.button(tr("Import"))) {
+				UIMenu.draw((ui: ZuiRaw) => {
 					if (UIMenu.menuButton(ui, tr("Replace Existing"), `${Config.keymap.file_import_assets}`)) {
 						Project.importMesh(true);
 					}
@@ -36,11 +36,11 @@ class TabMeshes {
 					}
 				}, 2);
 			}
-			if (ui.isHovered) ui.tooltip(tr("Import mesh file"));
+			if (ui.isHovered) Zui.tooltip(tr("Import mesh file"));
 
 			///if is_lab
-			if (ui.button(tr("Set Default"))) {
-				UIMenu.draw((ui: Zui) => {
+			if (Zui.button(tr("Set Default"))) {
+				UIMenu.draw((ui: ZuiRaw) => {
 					if (UIMenu.menuButton(ui, tr("Cube"))) TabMeshes.setDefaultMesh(".Cube");
 					if (UIMenu.menuButton(ui, tr("Plane"))) TabMeshes.setDefaultMesh(".Plane");
 					if (UIMenu.menuButton(ui, tr("Sphere"))) TabMeshes.setDefaultMesh(".Sphere");
@@ -49,30 +49,30 @@ class TabMeshes {
 			}
 			///end
 
-			if (ui.button(tr("Flip Normals"))) {
+			if (Zui.button(tr("Flip Normals"))) {
 				UtilMesh.flipNormals();
 				Context.raw.ddirty = 2;
 			}
 
-			if (ui.button(tr("Calculate Normals"))) {
-				UIMenu.draw((ui: Zui) => {
+			if (Zui.button(tr("Calculate Normals"))) {
+				UIMenu.draw((ui: ZuiRaw) => {
 					if (UIMenu.menuButton(ui, tr("Smooth"))) { UtilMesh.calcNormals(true); Context.raw.ddirty = 2; }
 					if (UIMenu.menuButton(ui, tr("Flat"))) { UtilMesh.calcNormals(false); Context.raw.ddirty = 2; }
 				}, 2);
 			}
 
-			if (ui.button(tr("Geometry to Origin"))) {
+			if (Zui.button(tr("Geometry to Origin"))) {
 				UtilMesh.toOrigin();
 				Context.raw.ddirty = 2;
 			}
 
-			if (ui.button(tr("Apply Displacement"))) {
+			if (Zui.button(tr("Apply Displacement"))) {
 				///if is_paint
 				UtilMesh.applyDisplacement(Project.layers[0].texpaint_pack);
 				///end
 				///if is_lab
 				let displace_strength = Config.raw.displace_strength > 0 ? Config.raw.displace_strength : 1.0;
-				let uv_scale = Scene.meshes[0].data.scale_tex * Context.raw.brushScale;
+				let uv_scale = scene_meshes[0].data.scale_tex * Context.raw.brushScale;
 				UtilMesh.applyDisplacement(BrushOutputNode.inst.texpaint_pack, 0.05 * displace_strength, uv_scale);
 				///end
 
@@ -80,8 +80,8 @@ class TabMeshes {
 				Context.raw.ddirty = 2;
 			}
 
-			if (ui.button(tr("Rotate"))) {
-				UIMenu.draw((ui: Zui) => {
+			if (Zui.button(tr("Rotate"))) {
+				UIMenu.draw((ui: ZuiRaw) => {
 					if (UIMenu.menuButton(ui, tr("Rotate X"))) {
 						UtilMesh.swapAxis(1, 2);
 						Context.raw.ddirty = 2;
@@ -99,15 +99,15 @@ class TabMeshes {
 				}, 3);
 			}
 
-			ui.endSticky();
+			Zui.endSticky();
 
 			for (let i = 0; i < Project.paintObjects.length; ++i) {
 				let o = Project.paintObjects[i];
 				let h = Zui.handle("tabmeshes_0");
 				h.selected = o.base.visible;
-				o.base.visible = ui.check(h, o.base.name);
+				o.base.visible = Zui.check(h, o.base.name);
 				if (ui.isHovered && ui.inputReleasedR) {
-					UIMenu.draw((ui: Zui) => {
+					UIMenu.draw((ui: ZuiRaw) => {
 						if (UIMenu.menuButton(ui, tr("Export"))) {
 							Context.raw.exportMeshIndex = i + 1;
 							BoxExport.showMesh();
@@ -121,8 +121,8 @@ class TabMeshes {
 									BaseObject.setParent(child, Project.paintObjects[0].base);
 								}
 								if (o.base.children.length == 0) {
-									Vec4.setFrom(Project.paintObjects[0].base.transform.scale, o.base.transform.scale);
-									Transform.buildMatrix(Project.paintObjects[0].base.transform);
+									vec4_set_from(Project.paintObjects[0].base.transform.scale, o.base.transform.scale);
+									transform_build_matrix(Project.paintObjects[0].base.transform);
 								}
 							}
 							Data.deleteMesh(o.data._handle);
@@ -162,14 +162,14 @@ class TabMeshes {
 				scale_pos: mesh.scalePos,
 				scale_tex: mesh.scaleTex
 			};
-			let md: TMeshData;
-			MeshData.create(raw, (_md: TMeshData) => { md = _md; });
+			let md: mesh_data_t;
+			MeshData.create(raw, (_md: mesh_data_t) => { md = _md; });
 			mo = MeshObject.create(md, Context.raw.paintObject.materials);
-			array_remove(Scene.meshes, mo);
+			array_remove(scene_meshes, mo);
 			mo.base.name = "Tessellated";
 		}
 		else {
-			mo = Scene.getChild(name).ext;
+			mo = scene_get_child(name).ext;
 		}
 
 		mo.base.visible = true;
@@ -177,7 +177,7 @@ class TabMeshes {
 		Context.raw.paintObject = mo;
 		Project.paintObjects[0] = mo;
 		if (UIHeader.worktab.position == SpaceType.Space3D) {
-			Scene.meshes = [mo];
+			scene_meshes = [mo];
 		}
 
 		///if (krom_direct3d12 || krom_vulkan || krom_metal)

+ 8 - 9
base/Sources/TabParticles.ts

@@ -3,15 +3,14 @@
 
 class TabParticles {
 
-	static draw = (htab: Handle) => {
-		let ui = UIBase.ui;
-		if (ui.tab(htab, tr("Particles"))) {
-			ui.beginSticky();
-			ui.row([1 / 4, 1 / 4, 1 / 4]);
-			if (ui.button(tr("New"))) {}
-			if (ui.button(tr("Import"))) {}
-			if (ui.button(tr("Nodes"))) {}
-			ui.endSticky();
+	static draw = (htab: HandleRaw) => {
+		if (Zui.tab(htab, tr("Particles"))) {
+			Zui.beginSticky();
+			Zui.row([1 / 4, 1 / 4, 1 / 4]);
+			if (Zui.button(tr("New"))) {}
+			if (Zui.button(tr("Import"))) {}
+			if (Zui.button(tr("Nodes"))) {}
+			Zui.endSticky();
 		}
 	}
 }

+ 7 - 7
base/Sources/TabPlugins.ts

@@ -1,24 +1,24 @@
 
 class TabPlugins {
 
-	static draw = (htab: Handle) => {
+	static draw = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
-		if (ui.tab(htab, tr("Plugins"))) {
+		if (Zui.tab(htab, tr("Plugins"))) {
 
-			ui.beginSticky();
+			Zui.beginSticky();
 
 			///if (is_paint || is_sculpt)
-			ui.row([1 / 4]);
+			Zui.row([1 / 4]);
 			///end
 			///if is_lab
-			ui.row([1 / 14]);
+			Zui.row([1 / 14]);
 			///end
 
-			if (ui.button(tr("Manager"))) {
+			if (Zui.button(tr("Manager"))) {
 				BoxPreferences.htab.position = 6; // Plugins
 				BoxPreferences.show();
 			}
-			ui.endSticky();
+			Zui.endSticky();
 
 			// Draw plugins
 			for (let p of Plugin.plugins.values()) if (p.drawUI != null) p.drawUI(ui);

+ 18 - 18
base/Sources/TabScript.ts

@@ -1,22 +1,22 @@
 
 class TabScript {
 
-	static hscript = new Handle();
+	static hscript = Handle.create();
 	static textColoring: TTextColoring = null;
 
-	static draw = (htab: Handle) => {
+	static draw = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
 		let statush = Config.raw.layout[LayoutSize.LayoutStatusH];
-		if (ui.tab(htab, tr("Script")) && statush > UIStatus.defaultStatusH * ui.SCALE()) {
+		if (Zui.tab(htab, tr("Script")) && statush > UIStatus.defaultStatusH * Zui.SCALE(ui)) {
 
-			ui.beginSticky();
+			Zui.beginSticky();
 			if (Config.raw.touch_ui) {
-				ui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
+				Zui.row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
 			}
 			else {
-				ui.row([1 / 14, 1 / 14, 1 / 14, 1 / 14]);
+				Zui.row([1 / 14, 1 / 14, 1 / 14, 1 / 14]);
 			}
-			if (ui.button(tr("Run"))) {
+			if (Zui.button(tr("Run"))) {
 				try {
 					eval(TabScript.hscript.text);
 				}
@@ -24,41 +24,41 @@ class TabScript {
 					Console.log(e);
 				}
 			}
-			if (ui.button(tr("Clear"))) {
+			if (Zui.button(tr("Clear"))) {
 				TabScript.hscript.text = "";
 			}
-			if (ui.button(tr("Import"))) {
+			if (Zui.button(tr("Import"))) {
 				UIFiles.show("js", false, false, (path: string) => {
 					Data.getBlob(path, (b: ArrayBuffer) => {
-						TabScript.hscript.text = System.bufferToString(b);
+						TabScript.hscript.text = sys_buffer_to_string(b);
 						Data.deleteBlob(path);
 					});
 				});
 			}
-			if (ui.button(tr("Export"))) {
+			if (Zui.button(tr("Export"))) {
 				let str = TabScript.hscript.text;
 				UIFiles.show("js", true, false, (path: string) => {
 					let f = UIFiles.filename;
 					if (f == "") f = tr("untitled");
 					path = path + Path.sep + f;
 					if (!path.endsWith(".js")) path += ".js";
-					Krom.fileSaveBytes(path, System.stringToBuffer(str));
+					Krom.fileSaveBytes(path, sys_string_to_buffer(str));
 				});
 			}
-			ui.endSticky();
+			Zui.endSticky();
 
 			let _font = ui.font;
 			let _fontSize = ui.fontSize;
-			Data.getFont("font_mono.ttf", (f: FontRaw) => { ui.setFont(f); }); // Sync
-			ui.fontSize = Math.floor(15 * ui.SCALE());
+			Data.getFont("font_mono.ttf", (f: font_t) => { Zui.setFont(ui, f); }); // Sync
+			ui.fontSize = Math.floor(15 * Zui.SCALE(ui));
 			Zui.textAreaLineNumbers = true;
 			Zui.textAreaScrollPastEnd = true;
 			Zui.textAreaColoring = TabScript.getTextColoring();
-			ui.textArea(TabScript.hscript);
+			Zui.textArea(TabScript.hscript);
 			Zui.textAreaLineNumbers = false;
 			Zui.textAreaScrollPastEnd = false;
 			Zui.textAreaColoring = null;
-			ui.setFont(_font);
+			Zui.setFont(ui, _font);
 			ui.fontSize = _fontSize;
 		}
 	}
@@ -66,7 +66,7 @@ class TabScript {
 	static getTextColoring = (): TTextColoring => {
 		if (TabScript.textColoring == null) {
 			Data.getBlob("text_coloring.json", (blob: ArrayBuffer) => {
-				TabScript.textColoring = JSON.parse(System.bufferToString(blob));
+				TabScript.textColoring = JSON.parse(sys_buffer_to_string(blob));
 				TabScript.textColoring.default_color = Math.floor(TabScript.textColoring.default_color);
 				for (let coloring of TabScript.textColoring.colorings) coloring.color = Math.floor(coloring.color);
 			});

+ 43 - 43
base/Sources/TabSwatches.ts

@@ -1,47 +1,47 @@
 
 class TabSwatches {
 
-	static _empty: ImageRaw;
+	static _empty: image_t;
 
-	static set empty(image: ImageRaw) {
+	static set empty(image: image_t) {
 		TabSwatches._empty = image;
 	}
 
-	static get empty(): ImageRaw {
+	static get empty(): image_t {
 		if (TabSwatches._empty == null) {
 			let b = new Uint8Array(4);
 			b[0] = 255;
 			b[1] = 255;
 			b[2] = 255;
 			b[3] = 255;
-			TabSwatches._empty = Image.fromBytes(b.buffer, 1, 1);
+			TabSwatches._empty = image_from_bytes(b.buffer, 1, 1);
 		}
 		return TabSwatches._empty;
 	}
 
 	static dragPosition: i32 = -1;
 
-	static draw = (htab: Handle) => {
+	static draw = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
 		let statush = Config.raw.layout[LayoutSize.LayoutStatusH];
-		if (ui.tab(htab, tr("Swatches")) && statush > UIStatus.defaultStatusH * ui.SCALE()) {
+		if (Zui.tab(htab, tr("Swatches")) && statush > UIStatus.defaultStatusH * Zui.SCALE(ui)) {
 
-			ui.beginSticky();
+			Zui.beginSticky();
 			if (Config.raw.touch_ui) {
-				ui.row([1 / 5, 1 / 5, 1 / 5, 1 / 5, 1 / 5]);
+				Zui.row([1 / 5, 1 / 5, 1 / 5, 1 / 5, 1 / 5]);
 			}
 			else {
-				ui.row([1 / 14, 1 / 14, 1 / 14, 1 / 14, 1 / 14]);
+				Zui.row([1 / 14, 1 / 14, 1 / 14, 1 / 14, 1 / 14]);
 			}
 
-			if (ui.button(tr("New"))) {
+			if (Zui.button(tr("New"))) {
 				Context.setSwatch(Project.makeSwatch());
 				Project.raw.swatches.push(Context.raw.swatch);
 			}
-			if (ui.isHovered) ui.tooltip(tr("Add new swatch"));
+			if (ui.isHovered) Zui.tooltip(tr("Add new swatch"));
 
-			if (ui.button(tr("Import"))) {
-				UIMenu.draw((ui: Zui) => {
+			if (Zui.button(tr("Import"))) {
+				UIMenu.draw((ui: ZuiRaw) => {
 					if (UIMenu.menuButton(ui, tr("Replace Existing"))) {
 						Project.importSwatches(true);
 						Context.setSwatch(Project.raw.swatches[0]);
@@ -51,26 +51,26 @@ class TabSwatches {
 					}
 				}, 2);
 			}
-			if (ui.isHovered) ui.tooltip(tr("Import swatches"));
+			if (ui.isHovered) Zui.tooltip(tr("Import swatches"));
 
-			if (ui.button(tr("Export"))) Project.exportSwatches();
-			if (ui.isHovered) ui.tooltip(tr("Export swatches"));
+			if (Zui.button(tr("Export"))) Project.exportSwatches();
+			if (ui.isHovered) Zui.tooltip(tr("Export swatches"));
 
-			if (ui.button(tr("Clear"))) {
+			if (Zui.button(tr("Clear"))) {
 				Context.setSwatch(Project.makeSwatch());
 				Project.raw.swatches = [Context.raw.swatch];
 			}
 
-			if (ui.button(tr("Restore"))) {
+			if (Zui.button(tr("Restore"))) {
 				Project.setDefaultSwatches();
 				Context.setSwatch(Project.raw.swatches[0]);
 			}
-			if (ui.isHovered) ui.tooltip(tr("Restore default swatches"));
+			if (ui.isHovered) Zui.tooltip(tr("Restore default swatches"));
 
-			ui.endSticky();
-			ui.separator(3, false);
+			Zui.endSticky();
+			Zui.separator(3, false);
 
-			let slotw = Math.floor(26 * ui.SCALE());
+			let slotw = Math.floor(26 * Zui.SCALE(ui));
 			let num = Math.floor(ui._w / (slotw + 3));
 			let dragPositionSet = false;
 
@@ -79,7 +79,7 @@ class TabSwatches {
 			for (let row = 0; row < Math.floor(Math.ceil(Project.raw.swatches.length / num)); ++row) {
 				let ar = [];
 				for (let i = 0; i < num; ++i) ar.push(1 / num);
-				ui.row(ar);
+				Zui.row(ar);
 
 				ui._x += 2;
 				if (row > 0) ui._y += 6;
@@ -87,14 +87,14 @@ class TabSwatches {
 				for (let j = 0; j < num; ++j) {
 					let i = j + row * num;
 					if (i >= Project.raw.swatches.length) {
-						ui.endElement(slotw);
+						Zui.endElement(slotw);
 						continue;
 					}
 
 					if (Context.raw.swatch == Project.raw.swatches[i]) {
 						let off = row % 2 == 1 ? 1 : 0;
 						let w = 32;
-						ui.fill(-2, -2, w, w, ui.t.HIGHLIGHT_COL);
+						Zui.fill(-2, -2, w, w, ui.t.HIGHLIGHT_COL);
 					}
 
 					uix = ui._x;
@@ -102,30 +102,30 @@ class TabSwatches {
 
 					// Draw the drag position indicator
 					if (Base.dragSwatch != null && TabSwatches.dragPosition == i) {
-						ui.fill(-1, -2 , 2, 32, ui.t.HIGHLIGHT_COL);
+						Zui.fill(-1, -2 , 2, 32, ui.t.HIGHLIGHT_COL);
 					}
 
-					let state = ui.image(TabSwatches.empty, Project.raw.swatches[i].base, slotw);
+					let state = Zui.image(TabSwatches.empty, Project.raw.swatches[i].base, slotw);
 
 					if (state == State.Started) {
 						Context.setSwatch(Project.raw.swatches[i]);
 
-						Base.dragOffX = -(Mouse.x - uix - ui._windowX - 2 * slotw);
-						Base.dragOffY = -(Mouse.y - uiy - ui._windowY + 1);
+						Base.dragOffX = -(mouse_x - uix - ui._windowX - 2 * slotw);
+						Base.dragOffY = -(mouse_y - uiy - ui._windowY + 1);
 						Base.dragSwatch = Context.raw.swatch;
 					}
 					else if (state == State.Hovered) {
-						TabSwatches.dragPosition = (Mouse.x > uix + ui._windowX + slotw / 2) ? i + 1 : i; // Switch to the next position if the mouse crosses the swatch rectangle center
+						TabSwatches.dragPosition = (mouse_x > uix + ui._windowX + slotw / 2) ? i + 1 : i; // Switch to the next position if the mouse crosses the swatch rectangle center
 						dragPositionSet = true;
 					}
 					else if (state == State.Released) {
-						if (Time.time() - Context.raw.selectTime < 0.25) {
-							UIMenu.draw((ui: Zui) => {
+						if (time_time() - Context.raw.selectTime < 0.25) {
+							UIMenu.draw((ui: ZuiRaw) => {
 								ui.changed = false;
 								let h = Zui.handle("tabswatches_0");
 								h.color = Context.raw.swatch.base;
 
-								Context.raw.swatch.base = ui.colorWheel(h, false, null, 11 * ui.t.ELEMENT_H * ui.SCALE(), true, () => {
+								Context.raw.swatch.base = Zui.colorWheel(h, false, null, 11 * ui.t.ELEMENT_H * Zui.SCALE(ui), true, () => {
 									Context.raw.colorPickerPreviousTool = Context.raw.tool;
 									Context.selectTool(WorkspaceTool.ToolPicker);
 									Context.raw.colorPickerCallback = (color: TSwatchColor) => {
@@ -134,26 +134,26 @@ class TabSwatches {
 								});
 								let hopacity = Zui.handle("tabswatches_1");
 								hopacity.value = Context.raw.swatch.opacity;
-								Context.raw.swatch.opacity = ui.slider(hopacity, "Opacity", 0, 1, true);
+								Context.raw.swatch.opacity = Zui.slider(hopacity, "Opacity", 0, 1, true);
 								let hocclusion = Zui.handle("tabswatches_2");
 								hocclusion.value = Context.raw.swatch.occlusion;
-								Context.raw.swatch.occlusion = ui.slider(hocclusion, "Occlusion", 0, 1, true);
+								Context.raw.swatch.occlusion = Zui.slider(hocclusion, "Occlusion", 0, 1, true);
 								let hroughness = Zui.handle("tabswatches_3");
 								hroughness.value = Context.raw.swatch.roughness;
-								Context.raw.swatch.roughness = ui.slider(hroughness, "Roughness", 0, 1, true);
+								Context.raw.swatch.roughness = Zui.slider(hroughness, "Roughness", 0, 1, true);
 								let hmetallic = Zui.handle("tabswatches_4");
 								hmetallic.value = Context.raw.swatch.metallic;
-								Context.raw.swatch.metallic = ui.slider(hmetallic, "Metallic", 0, 1, true);
+								Context.raw.swatch.metallic = Zui.slider(hmetallic, "Metallic", 0, 1, true);
 								let hheight = Zui.handle("tabswatches_5");
 								hheight.value = Context.raw.swatch.height;
-								Context.raw.swatch.height = ui.slider(hheight, "Height", 0, 1, true);
+								Context.raw.swatch.height = Zui.slider(hheight, "Height", 0, 1, true);
 
 								if (ui.changed || ui.isTyping) UIMenu.keepOpen = true;
 								if (ui.inputReleased) Context.setSwatch(Context.raw.swatch); // Trigger material preview update
-							}, 16, Math.floor(Mouse.x - 200 * ui.SCALE()), Math.floor(Mouse.y - 250 * ui.SCALE()));
+							}, 16, Math.floor(mouse_x - 200 * Zui.SCALE(ui)), Math.floor(mouse_y - 250 * Zui.SCALE(ui)));
 						}
 
-						Context.raw.selectTime = Time.time();
+						Context.raw.selectTime = time_time();
 					}
 					if (ui.isHovered && ui.inputReleasedR) {
 						Context.setSwatch(Project.raw.swatches[i]);
@@ -169,7 +169,7 @@ class TabSwatches {
 						add += 1;
 						///end
 
-						UIMenu.draw((ui: Zui) => {
+						UIMenu.draw((ui: ZuiRaw) => {
 							if (UIMenu.menuButton(ui, tr("Duplicate"))) {
 								Context.setSwatch(Project.cloneSwatch(Context.raw.swatch));
 								Project.raw.swatches.push(Context.raw.swatch);
@@ -203,7 +203,7 @@ class TabSwatches {
 						color = color_set_ab(color, Project.raw.swatches[i].opacity * 255);
 						let val = color;
 						if (val < 0) val += 4294967296;
-						ui.tooltip("#" + val.toString(16));
+						Zui.tooltip("#" + val.toString(16));
 					}
 				}
 			}
@@ -212,7 +212,7 @@ class TabSwatches {
 			if (Base.dragSwatch != null && TabSwatches.dragPosition == Project.raw.swatches.length) {
 				ui._x = uix; // Reset the position because otherwise it would start in the row below
 				ui._y = uiy;
-				ui.fill(28, -2, 2, 32, ui.t.HIGHLIGHT_COL);
+				Zui.fill(28, -2, 2, 32, ui.t.HIGHLIGHT_COL);
 			}
 
 			// Currently there is no valid dragPosition so reset it

+ 40 - 40
base/Sources/TabTextures.ts

@@ -1,60 +1,60 @@
 
 class TabTextures {
 
-	static draw = (htab: Handle) => {
+	static draw = (htab: HandleRaw) => {
 		let ui = UIBase.ui;
 		let statush = Config.raw.layout[LayoutSize.LayoutStatusH];
-		if (ui.tab(htab, tr("Textures")) && statush > UIStatus.defaultStatusH * ui.SCALE()) {
+		if (Zui.tab(htab, tr("Textures")) && statush > UIStatus.defaultStatusH * Zui.SCALE(ui)) {
 
-			ui.beginSticky();
+			Zui.beginSticky();
 
 			if (Config.raw.touch_ui) {
-				ui.row([1 / 4, 1 / 4]);
+				Zui.row([1 / 4, 1 / 4]);
 			}
 			else {
-				ui.row([1 / 14, 1 / 14]);
+				Zui.row([1 / 14, 1 / 14]);
 			}
 
-			if (ui.button(tr("Import"))) {
+			if (Zui.button(tr("Import"))) {
 				UIFiles.show(Path.textureFormats.join(","), false, true, (path: string) => {
 					ImportAsset.run(path, -1.0, -1.0, true, false);
 					UIBase.hwnds[TabArea.TabStatus].redraws = 2;
 				});
 			}
-			if (ui.isHovered) ui.tooltip(tr("Import texture file") + ` (${Config.keymap.file_import_assets})`);
+			if (ui.isHovered) Zui.tooltip(tr("Import texture file") + ` (${Config.keymap.file_import_assets})`);
 
-			if (ui.button(tr("2D View"))) UIBase.show2DView(View2DType.View2DAsset);
+			if (Zui.button(tr("2D View"))) UIBase.show2DView(View2DType.View2DAsset);
 
-			ui.endSticky();
+			Zui.endSticky();
 
 			if (Project.assets.length > 0) {
 
 				///if (is_paint || is_sculpt)
-				let statusw = System.width - UIToolbar.toolbarw - Config.raw.layout[LayoutSize.LayoutSidebarW];
+				let statusw = sys_width() - UIToolbar.toolbarw - Config.raw.layout[LayoutSize.LayoutSidebarW];
 				///end
 				///if is_lab
-				let statusw = System.width;
+				let statusw = sys_width();
 				///end
 
-				let slotw = Math.floor(52 * ui.SCALE());
+				let slotw = Math.floor(52 * Zui.SCALE(ui));
 				let num = Math.floor(statusw / slotw);
 
 				for (let row = 0; row < Math.floor(Math.ceil(Project.assets.length / num)); ++row) {
 					let mult = Config.raw.show_asset_names ? 2 : 1;
 					let ar = [];
 					for (let i = 0; i < num * mult; ++i) ar.push(1 / num);
-					ui.row(ar);
+					Zui.row(ar);
 
 					ui._x += 2;
-					let off = Config.raw.show_asset_names ? ui.ELEMENT_OFFSET() * 10.0 : 6;
+					let off = Config.raw.show_asset_names ? Zui.ELEMENT_OFFSET(ui) * 10.0 : 6;
 					if (row > 0) ui._y += off;
 
 					for (let j = 0; j < num; ++j) {
-						let imgw = Math.floor(50 * ui.SCALE());
+						let imgw = Math.floor(50 * Zui.SCALE(ui));
 						let i = j + row * num;
 						if (i >= Project.assets.length) {
-							ui.endElement(imgw);
-							if (Config.raw.show_asset_names) ui.endElement(0);
+							Zui.endElement(imgw);
+							if (Config.raw.show_asset_names) Zui.endElement(0);
 							continue;
 						}
 
@@ -63,14 +63,14 @@ class TabTextures {
 						let uix = ui._x;
 						let uiy = ui._y;
 						let sw = img.height < img.width ? img.height : 0;
-						if (ui.image(img, 0xffffffff, slotw, 0, 0, sw, sw) == State.Started && ui.inputY > ui._windowY) {
-							Base.dragOffX = -(Mouse.x - uix - ui._windowX - 3);
-							Base.dragOffY = -(Mouse.y - uiy - ui._windowY + 1);
+						if (Zui.image(img, 0xffffffff, slotw, 0, 0, sw, sw) == State.Started && ui.inputY > ui._windowY) {
+							Base.dragOffX = -(mouse_x - uix - ui._windowX - 3);
+							Base.dragOffY = -(mouse_y - uiy - ui._windowY + 1);
 							Base.dragAsset = asset;
 							Context.raw.texture = asset;
 
-							if (Time.time() - Context.raw.selectTime < 0.25) UIBase.show2DView(View2DType.View2DAsset);
-							Context.raw.selectTime = Time.time();
+							if (time_time() - Context.raw.selectTime < 0.25) UIBase.show2DView(View2DType.View2DAsset);
+							Context.raw.selectTime = time_time();
 							UIView2D.hwnd.redraws = 2;
 						}
 
@@ -81,10 +81,10 @@ class TabTextures {
 							ui._y = uiy;
 							let off = i % 2 == 1 ? 1 : 0;
 							let w = 50;
-							ui.fill(0,               0, w + 3,       2, ui.t.HIGHLIGHT_COL);
-							ui.fill(0,     w - off + 2, w + 3, 2 + off, ui.t.HIGHLIGHT_COL);
-							ui.fill(0,               0,     2,   w + 3, ui.t.HIGHLIGHT_COL);
-							ui.fill(w + 2,           0,     2,   w + 4, ui.t.HIGHLIGHT_COL);
+							Zui.fill(0,               0, w + 3,       2, ui.t.HIGHLIGHT_COL);
+							Zui.fill(0,     w - off + 2, w + 3, 2 + off, ui.t.HIGHLIGHT_COL);
+							Zui.fill(0,               0,     2,   w + 3, ui.t.HIGHLIGHT_COL);
+							Zui.fill(w + 2,           0,     2,   w + 4, ui.t.HIGHLIGHT_COL);
 							ui._x = _uix;
 							ui._y = _uiy;
 						}
@@ -92,8 +92,8 @@ class TabTextures {
 						let isPacked = Project.raw.packed_assets != null && Project.packedAssetExists(Project.raw.packed_assets, asset.file);
 
 						if (ui.isHovered) {
-							ui.tooltipImage(img, 256);
-							ui.tooltip(asset.name + (isPacked ? " " + tr("(packed)") : ""));
+							Zui.tooltipImage(img, 256);
+							Zui.tooltip(asset.name + (isPacked ? " " + tr("(packed)") : ""));
 						}
 
 						if (ui.isHovered && ui.inputReleasedR) {
@@ -108,7 +108,7 @@ class TabTextures {
 							count = isPacked ? 6 : 6;
 							///end
 
-							UIMenu.draw((ui: Zui) => {
+							UIMenu.draw((ui: ZuiRaw) => {
 								if (UIMenu.menuButton(ui, tr("Export"))) {
 									UIFiles.show("png", true, false, (path: string) => {
 										Base.notifyOnNextFrame(() => {
@@ -119,18 +119,18 @@ class TabTextures {
 											if (Base.pipeCopy == null) Base.makePipe();
 											///end
 
-											let target = Image.createRenderTarget(TabTextures.to_pow2(img.width), TabTextures.to_pow2(img.height));
-											Graphics2.begin(target.g2, false);
+											let target = image_create_render_target(TabTextures.to_pow2(img.width), TabTextures.to_pow2(img.height));
+											g2_begin(target.g2, false);
 											target.g2.pipeline = Base.pipeCopy;
-											Graphics2.drawScaledImage(img, 0, 0, target.width, target.height);
+											g2_draw_scaled_image(img, 0, 0, target.width, target.height);
 											target.g2.pipeline = null;
-											Graphics2.end(target.g2);
+											g2_end(target.g2);
 											Base.notifyOnNextFrame(() => {
 												let f = UIFiles.filename;
 												if (f == "") f = tr("untitled");
 												if (!f.endsWith(".png")) f += ".png";
-												Krom.writePng(path + Path.sep + f, Image.getPixels(target), target.width, target.height, 0);
-												Image.unload(target);
+												Krom.writePng(path + Path.sep + f, image_get_pixels(target), target.width, target.height, 0);
+												image_unload(target);
 											});
 										});
 									});
@@ -180,11 +180,11 @@ class TabTextures {
 						if (Config.raw.show_asset_names) {
 							ui._x = uix;
 							ui._y += slotw * 0.9;
-							ui.text(Project.assets[i].name, Align.Center);
-							if (ui.isHovered) ui.tooltip(Project.assets[i].name);
+							Zui.text(Project.assets[i].name, Align.Center);
+							if (ui.isHovered) Zui.tooltip(Project.assets[i].name);
 							ui._y -= slotw * 0.9;
 							if (i == Project.assets.length - 1) {
-								ui._y += j == num - 1 ? imgw : imgw + ui.ELEMENT_H() + ui.ELEMENT_OFFSET();
+								ui._y += j == num - 1 ? imgw : imgw + Zui.ELEMENT_H(ui) + Zui.ELEMENT_OFFSET(ui);
 							}
 						}
 					}
@@ -193,8 +193,8 @@ class TabTextures {
 			else {
 				let img = Res.get("icons.k");
 				let r = Res.tile50(img, 0, 1);
-				ui.image(img, ui.t.BUTTON_COL, r.h, r.x, r.y, r.w, r.h);
-				if (ui.isHovered) ui.tooltip(tr("Drag and drop files here"));
+				Zui.image(img, ui.t.BUTTON_COL, r.h, r.x, r.y, r.w, r.h);
+				if (ui.isHovered) Zui.tooltip(tr("Drag and drop files here"));
 			}
 
 			let inFocus = ui.inputX > ui._windowX && ui.inputX < ui._windowX + ui._windowW &&

Vissa filer visades inte eftersom för många filer har ändrats