luboslenco 1 gadu atpakaļ
vecāks
revīzija
131ca3ce9e
100 mainītis faili ar 2071 papildinājumiem un 5727 dzēšanām
  1. 17 17
      armorforge/Sources/TabObjects.ts
  2. 9 9
      armorlab/Sources/MakeMaterial.ts
  3. 18 18
      armorlab/Sources/MakeMesh.ts
  4. 14 14
      armorlab/Sources/MakePaint.ts
  5. 2 2
      armorlab/Sources/NodesBrush.ts
  6. 56 56
      armorlab/Sources/RenderPathPaint.ts
  7. 14 14
      armorlab/Sources/UINodesExt.ts
  8. 6 6
      armorlab/Sources/nodes/BrushOutputNode.ts
  9. 3 3
      armorlab/Sources/nodes/ImageTextureNode.ts
  10. 8 8
      armorlab/Sources/nodes/InpaintNode.ts
  11. 12 12
      armorlab/Sources/nodes/PhotoToPBRNode.ts
  12. 8 8
      armorlab/Sources/nodes/TextToPhotoNode.ts
  13. 3 3
      armorlab/Sources/nodes/TilingNode.ts
  14. 4 4
      armorlab/Sources/nodes/UpscaleNode.ts
  15. 2 2
      armorlab/Sources/nodes/VarianceNode.ts
  16. 17 17
      armorpaint/Sources/ImportFolder.ts
  17. 23 23
      armorpaint/Sources/MakeBake.ts
  18. 4 4
      armorpaint/Sources/MakeBlur.ts
  19. 9 9
      armorpaint/Sources/MakeBrush.ts
  20. 2 2
      armorpaint/Sources/MakeClone.ts
  21. 3 3
      armorpaint/Sources/MakeColorIdPicker.ts
  22. 1 1
      armorpaint/Sources/MakeDiscard.ts
  23. 43 43
      armorpaint/Sources/MakeMaterial.ts
  24. 42 42
      armorpaint/Sources/MakeMesh.ts
  25. 4 4
      armorpaint/Sources/MakeMeshPreview.ts
  26. 4 4
      armorpaint/Sources/MakeNodePreview.ts
  27. 83 83
      armorpaint/Sources/MakePaint.ts
  28. 1 1
      armorpaint/Sources/MakeParticle.ts
  29. 7 7
      armorpaint/Sources/MakeTexcoord.ts
  30. 2 2
      armorpaint/Sources/NodesBrush.ts
  31. 214 214
      armorpaint/Sources/RenderPathPaint.ts
  32. 2 2
      armorpaint/Sources/RenderPathPreview.ts
  33. 1 1
      armorpaint/Sources/SlotBrush.ts
  34. 1 1
      armorpaint/Sources/SlotFont.ts
  35. 48 48
      armorpaint/Sources/SlotLayer.ts
  36. 5 5
      armorpaint/Sources/SlotMaterial.ts
  37. 145 145
      armorpaint/Sources/TabLayers.ts
  38. 50 50
      armorpaint/Sources/nodes/BrushOutputNode.ts
  39. 25 25
      armorpaint/Sources/nodes/InputNode.ts
  40. 1 1
      armorsculpt/Sources/ExportObj.ts
  41. 42 42
      armorsculpt/Sources/ImportMesh.ts
  42. 1 1
      armorsculpt/Sources/MakeBrush.ts
  43. 30 30
      armorsculpt/Sources/MakeMaterial.ts
  44. 21 21
      armorsculpt/Sources/MakeMesh.ts
  45. 9 9
      armorsculpt/Sources/MakeMeshPreview.ts
  46. 13 13
      armorsculpt/Sources/MakeSculpt.ts
  47. 45 45
      armorsculpt/Sources/TabLayers.ts
  48. 47 47
      armorsculpt/Sources/nodes/BrushOutputNode.ts
  49. 60 60
      base/Sources/BoxExport.ts
  50. 159 159
      base/Sources/BoxPreferences.ts
  51. 23 23
      base/Sources/BoxProjects.ts
  52. 0 232
      base/Sources/Camera.ts
  53. 0 304
      base/Sources/Config.ts
  54. 0 76
      base/Sources/Console.ts
  55. 0 434
      base/Sources/Context.ts
  56. 5 5
      base/Sources/ContextFormat.ts
  57. 53 53
      base/Sources/ExportArm.ts
  58. 2 2
      base/Sources/ExportMesh.ts
  59. 2 2
      base/Sources/ExportObj.ts
  60. 62 62
      base/Sources/ExportTexture.ts
  61. 0 199
      base/Sources/File.ts
  62. 0 139
      base/Sources/Geom.ts
  63. 0 268
      base/Sources/Gizmo.ts
  64. 0 743
      base/Sources/History.ts
  65. 103 103
      base/Sources/ImportArm.ts
  66. 16 16
      base/Sources/ImportAsset.ts
  67. 12 12
      base/Sources/ImportBlendMaterial.ts
  68. 4 4
      base/Sources/ImportBlendMesh.ts
  69. 4 4
      base/Sources/ImportEnvmap.ts
  70. 5 5
      base/Sources/ImportFont.ts
  71. 5 5
      base/Sources/ImportGpl.ts
  72. 6 6
      base/Sources/ImportKeymap.ts
  73. 46 46
      base/Sources/ImportMesh.ts
  74. 12 12
      base/Sources/ImportObj.ts
  75. 6 6
      base/Sources/ImportPlugin.ts
  76. 13 13
      base/Sources/ImportTexture.ts
  77. 8 8
      base/Sources/ImportTheme.ts
  78. 0 193
      base/Sources/LineDraw.ts
  79. 0 78
      base/Sources/MakeVoxel.ts
  80. 7 8
      base/Sources/NodesMaterial.ts
  81. 0 49
      base/Sources/Operator.ts
  82. 8 8
      base/Sources/ParserMaterial.ts
  83. 0 177
      base/Sources/Path.ts
  84. 0 43
      base/Sources/Plugin.ts
  85. 0 640
      base/Sources/Project.ts
  86. 50 50
      base/Sources/RenderPathBase.ts
  87. 1 1
      base/Sources/RenderPathDeferred.ts
  88. 22 22
      base/Sources/RenderPathRaytrace.ts
  89. 32 32
      base/Sources/RenderPathRaytraceBake.ts
  90. 0 57
      base/Sources/Res.ts
  91. 0 23
      base/Sources/Strings.ts
  92. 29 29
      base/Sources/TabBrowser.ts
  93. 42 42
      base/Sources/TabBrushes.ts
  94. 10 10
      base/Sources/TabConsole.ts
  95. 36 36
      base/Sources/TabFonts.ts
  96. 5 5
      base/Sources/TabHistory.ts
  97. 58 58
      base/Sources/TabMaterials.ts
  98. 39 39
      base/Sources/TabMeshes.ts
  99. 1 1
      base/Sources/TabPlugins.ts
  100. 4 4
      base/Sources/TabScript.ts

+ 17 - 17
armorforge/Sources/TabObjects.ts

@@ -14,8 +14,8 @@ class TabObjects {
 			zui_begin_sticky();
 			zui_row([1 / 4]);
 			if (zui_button("Import")) {
-				Project.import_mesh(false, () => {
-					object_set_parent(Project.paint_objects.pop().base, null);
+				project_import_mesh(false, () => {
+					object_set_parent(project_paint_objects.pop().base, null);
 				});
 			}
 			zui_end_sticky();
@@ -40,7 +40,7 @@ class TabObjects {
 					}
 
 					// Highlight selected line
-					if (currentObject == Context.raw.selected_object) {
+					if (currentObject == context_context_raw.selected_object) {
 						g2_set_color(0xff205d9c);
 						g2_fill_rect(0, ui._y, ui._window_w, zui_ELEMENT_H(ui));
 						g2_set_color(0xffffffff);
@@ -68,7 +68,7 @@ class TabObjects {
 					ui._y -= zui_ELEMENT_OFFSET(ui);
 
 					if (ui.is_released) {
-						Context.raw.selected_object = currentObject;
+						context_context_raw.selected_object = currentObject;
 					}
 
 					if (ui.is_hovered && ui.input_released_r) {
@@ -127,12 +127,12 @@ class TabObjects {
 			if (zui_panel(zui_handle("tabobjects_2", {selected: true}), 'Properties')) {
 				// ui.indent();
 
-				if (Context.raw.selected_object != null) {
+				if (context_context_raw.selected_object != null) {
 					let h = zui_handle("tabobjects_3");
-					h.selected = Context.raw.selected_object.visible;
-					Context.raw.selected_object.visible = zui_check(h, "Visible");
+					h.selected = context_context_raw.selected_object.visible;
+					context_context_raw.selected_object.visible = zui_check(h, "Visible");
 
-					let t = Context.raw.selected_object.transform;
+					let t = context_context_raw.selected_object.transform;
 					let localPos = t.loc;
 					let worldPos = vec4_create(transform_world_x(t), transform_world_y(t), transform_world_z(t), 1.0);
 					let scale = t.scale;
@@ -178,10 +178,10 @@ class TabObjects {
 					f = parseFloat(zui_text_input(h, "Z"));
 					if (h.changed) { changed = true; rot.z = f; }
 
-					if (changed && Context.raw.selected_object.name != "Scene") {
+					if (changed && context_context_raw.selected_object.name != "Scene") {
 						vec4_mult(rot, 3.141592 / 180);
-						quat_from_euler(Context.raw.selected_object.transform.rot, rot.x, rot.y, rot.z);
-						transform_build_matrix(Context.raw.selected_object.transform);
+						quat_from_euler(context_context_raw.selected_object.transform.rot, rot.x, rot.y, rot.z);
+						transform_build_matrix(context_context_raw.selected_object.transform);
 						// ///if arm_physics
 						// if (rb != null) rb.syncTransform();
 						// ///end
@@ -223,20 +223,20 @@ class TabObjects {
 					f = parseFloat(zui_text_input(h, "Z"));
 					if (h.changed) dim.z = f;
 
-					Context.raw.selected_object.transform.dirty = true;
+					context_context_raw.selected_object.transform.dirty = true;
 
-					if (Context.raw.selected_object.name == "Scene") {
+					if (context_context_raw.selected_object.name == "Scene") {
 						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.selected_object.ext_type == "light_object_t") {
-						let light = Context.raw.selected_object.ext;
+					else if (context_context_raw.selected_object.ext_type == "light_object_t") {
+						let light = context_context_raw.selected_object.ext;
 						let lightHandle = zui_handle("tabobjects_17");
 						lightHandle.value = light.data.strength / 10;
 						light.data.strength = zui_slider(lightHandle, "Strength", 0.0, 5.0, true) * 10;
 					}
-					else if (Context.raw.selected_object.ext_type == "camera_object_t") {
-						let cam = Context.raw.selected_object.ext;
+					else if (context_context_raw.selected_object.ext_type == "camera_object_t") {
+						let cam = context_context_raw.selected_object.ext;
 						let fovHandle = zui_handle("tabobjects_18");
 						fovHandle.value = Math.floor(cam.data.fov * 100) / 100;
 						cam.data.fov = zui_slider(fovHandle, "FoV", 0.3, 2.0, true);

+ 9 - 9
armorlab/Sources/MakeMaterial.ts

@@ -6,7 +6,7 @@ class MakeMaterial {
 	static heightUsed = false;
 
 	static parseMeshMaterial = () => {
-		let m = Project.materialData;
+		let m = project_materialData;
 
 		for (let c of m._.shader.contexts) {
 			if (c.name == "mesh") {
@@ -24,14 +24,14 @@ class MakeMaterial {
 			let sampler = con.frag.sharedSamplers[0];
 			scon._.override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
 		}
-		if (!Context.raw.textureFilter) {
+		if (!context_raw.textureFilter) {
 			scon._.override_context.filter = "point";
 		}
 		scon._.override_context.addressing = "repeat";
 		m._.shader.contexts.push(scon);
 		m._.shader._.contexts.push(scon);
 
-		Context.raw.ddirty = 2;
+		context_raw.ddirty = 2;
 
 		///if arm_voxels
 		MakeMaterial.makeVoxel(m);
@@ -45,7 +45,7 @@ class MakeMaterial {
 	///if arm_voxels
 	static makeVoxel = (m: material_data_t) => {
 		let rebuild = true; // heightUsed;
-		if (Config.raw.rp_gi != false && rebuild) {
+		if (config_raw.rp_gi != false && rebuild) {
 			let scon: shader_context_t = null;
 			for (let c of m._.shader._.contexts) {
 				if (c.name == "voxel") {
@@ -53,13 +53,13 @@ class MakeMaterial {
 					break;
 				}
 			}
-			if (scon != null) MakeVoxel.run(scon);
+			if (scon != null) make_voxel_run(scon);
 		}
 	}
 	///end
 
 	static parsePaintMaterial = () => {
-		let m = Project.materialData;
+		let m = project_materialData;
 		let scon: shader_context_t = null;
 		let mcon: material_context_t = null;
 		for (let c of m._.shader.contexts) {
@@ -103,12 +103,12 @@ class MakeMaterial {
 	}
 
 	static getDisplaceStrength = (): f32 => {
-		let sc = Context.mainObject().base.transform.scale.x;
-		return Config.raw.displace_strength * 0.02 * sc;
+		let sc = context_mainObject().base.transform.scale.x;
+		return config_raw.displace_strength * 0.02 * sc;
 	}
 
 	static voxelgiHalfExtents = (): string => {
-		let ext = Context.raw.vxaoExt;
+		let ext = context_raw.vxaoExt;
 		return `const vec3 voxelgiHalfExtents = vec3(${ext}, ${ext}, ${ext});`;
 	}
 

+ 18 - 18
armorlab/Sources/MakeMesh.ts

@@ -4,18 +4,18 @@ class MakeMesh {
 	static layerPassCount = 1;
 
 	static run = (data: TMaterial, layerPass = 0): NodeShaderContextRaw => {
-		let con_mesh = NodeShaderContext.create(data, {
+		let con_mesh = NodeShadercontext_create(data, {
 			name: "mesh",
 			depth_write: layerPass == 0 ? true : false,
 			compare_mode: layerPass == 0 ? "less" : "equal",
-			cull_mode: (Context.raw.cullBackfaces || layerPass > 0) ? "clockwise" : "none",
+			cull_mode: (context_raw.cullBackfaces || layerPass > 0) ? "clockwise" : "none",
 			vertex_elements: [{name: "pos", data: "short4norm"}, {name: "nor", data: "short2norm"}, {name: "tex", data: "short2norm"}],
 			color_attachments: ["RGBA64", "RGBA64", "RGBA64"],
 			depth_attachment: "DEPTH32"
 		});
 
-		let vert = NodeShaderContext.make_vert(con_mesh);
-		let frag = NodeShaderContext.make_frag(con_mesh);
+		let vert = NodeShadercontext_make_vert(con_mesh);
+		let frag = NodeShadercontext_make_frag(con_mesh);
 		frag.ins = vert.outs;
 
 		NodeShader.add_out(vert, 'vec2 texCoord');
@@ -35,7 +35,7 @@ class MakeMesh {
 		}
 
 		NodeShader.write(vert, 'gl_Position = mul(vec4(wposition.xyz, 1.0), VP);');
-		let brushScale = Context.raw.brushScale;
+		let brushScale = context_raw.brushScale;
 		NodeShader.add_uniform(vert, 'float texScale', '_tex_unpack');
 		NodeShader.write(vert, `texCoord = tex * ${brushScale} * texScale;`);
 		if (MakeMaterial.heightUsed && displaceStrength > 0) {
@@ -73,7 +73,7 @@ class MakeMesh {
 			NodeShader.write(frag, 'float height3 = 0.0;');
 		}
 
-		if (Context.raw.viewportMode == ViewportMode.ViewLit && Context.raw.renderMode == RenderMode.RenderForward) {
+		if (context_raw.viewportMode == ViewportMode.ViewLit && context_raw.renderMode == RenderMode.RenderForward) {
 			NodeShader.add_uniform(frag, 'sampler2D senvmapBrdf', "$brdf.k");
 			NodeShader.add_uniform(frag, 'sampler2D senvmapRadiance', '_envmap_radiance');
 			NodeShader.add_uniform(frag, 'sampler2D sltcMat', '_ltcMat');
@@ -136,15 +136,15 @@ class MakeMesh {
 		NodeShader.write(frag, 'n.y = -n.y;');
 		NodeShader.write(frag, 'n = normalize(mul(n, TBN));');
 
-		if (Context.raw.viewportMode == ViewportMode.ViewLit || Context.raw.viewportMode == ViewportMode.ViewPathTrace) {
+		if (context_raw.viewportMode == ViewportMode.ViewLit || context_raw.viewportMode == ViewportMode.ViewPathTrace) {
 
 			NodeShader.write(frag, 'basecol = pow(basecol, vec3(2.2, 2.2, 2.2));');
 
-			if (Context.raw.viewportShader != null) {
-				let color = Context.raw.viewportShader(frag);
+			if (context_raw.viewportShader != null) {
+				let color = context_raw.viewportShader(frag);
 				NodeShader.write(frag, `fragColor[1] = vec4(${color}, 1.0);`);
 			}
-			else if (Context.raw.renderMode == RenderMode.RenderForward && Context.raw.viewportMode != ViewportMode.ViewPathTrace) {
+			else if (context_raw.renderMode == RenderMode.RenderForward && context_raw.viewportMode != ViewportMode.ViewPathTrace) {
 				frag.wposition = true;
 				NodeShader.write(frag, 'vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);');
 				NodeShader.write(frag, 'vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);');
@@ -191,32 +191,32 @@ class MakeMesh {
 				NodeShader.write(frag, 'fragColor[1] = vec4(basecol, occlusion);');
 			}
 		}
-		else if (Context.raw.viewportMode == ViewportMode.ViewBaseColor) {
+		else if (context_raw.viewportMode == ViewportMode.ViewBaseColor) {
 			NodeShader.write(frag, 'fragColor[1] = vec4(basecol, 1.0);');
 		}
-		else if (Context.raw.viewportMode == ViewportMode.ViewNormalMap) {
+		else if (context_raw.viewportMode == ViewportMode.ViewNormalMap) {
 			NodeShader.write(frag, 'fragColor[1] = vec4(ntex.rgb, 1.0);');
 		}
-		else if (Context.raw.viewportMode == ViewportMode.ViewOcclusion) {
+		else if (context_raw.viewportMode == ViewportMode.ViewOcclusion) {
 			NodeShader.write(frag, 'fragColor[1] = vec4(vec3(occlusion, occlusion, occlusion), 1.0);');
 		}
-		else if (Context.raw.viewportMode == ViewportMode.ViewRoughness) {
+		else if (context_raw.viewportMode == ViewportMode.ViewRoughness) {
 			NodeShader.write(frag, 'fragColor[1] = vec4(vec3(roughness, roughness, roughness), 1.0);');
 		}
-		else if (Context.raw.viewportMode == ViewportMode.ViewMetallic) {
+		else if (context_raw.viewportMode == ViewportMode.ViewMetallic) {
 			NodeShader.write(frag, 'fragColor[1] = vec4(vec3(metallic, metallic, metallic), 1.0);');
 		}
-		else if (Context.raw.viewportMode == ViewportMode.ViewOpacity) {
+		else if (context_raw.viewportMode == ViewportMode.ViewOpacity) {
 			NodeShader.write(frag, 'fragColor[1] = vec4(vec3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);');
 		}
-		else if (Context.raw.viewportMode == ViewportMode.ViewHeight) {
+		else if (context_raw.viewportMode == ViewportMode.ViewHeight) {
 			NodeShader.write(frag, 'fragColor[1] = vec4(vec3(height, height, height), 1.0);');
 		}
 		else {
 			NodeShader.write(frag, 'fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);'); // Pink
 		}
 
-		if (Context.raw.viewportMode != ViewportMode.ViewLit && Context.raw.viewportMode != ViewportMode.ViewPathTrace) {
+		if (context_raw.viewportMode != ViewportMode.ViewLit && context_raw.viewportMode != ViewportMode.ViewPathTrace) {
 			NodeShader.write(frag, 'fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));');
 		}
 

+ 14 - 14
armorlab/Sources/MakePaint.ts

@@ -2,7 +2,7 @@
 class MakePaint {
 
 	static run = (data: TMaterial, matcon: material_context_t): NodeShaderContextRaw => {
-		let con_paint = NodeShaderContext.create(data, {
+		let con_paint = NodeShadercontext_create(data, {
 			name: "paint",
 			depth_write: false,
 			compare_mode: "always", // TODO: align texcoords winding order
@@ -10,7 +10,7 @@ class MakePaint {
 			cull_mode: "none",
 			vertex_elements: [{name: "pos", data: "short4norm"}, {name: "nor", data: "short2norm"}, {name: "tex", data: "short2norm"}],
 			color_attachments:
-				Context.raw.tool == WorkspaceTool.ToolPicker ? ["RGBA32", "RGBA32", "RGBA32", "RGBA32"] :
+				context_raw.tool == WorkspaceTool.ToolPicker ? ["RGBA32", "RGBA32", "RGBA32", "RGBA32"] :
 					["RGBA32", "RGBA32", "RGBA32", "R8"]
 		});
 
@@ -18,13 +18,13 @@ class MakePaint {
 		con_paint.data.color_writes_green = [true, true, true, true];
 		con_paint.data.color_writes_blue = [true, true, true, true];
 		con_paint.data.color_writes_alpha = [true, true, true, true];
-		con_paint.allow_vcols = mesh_data_get_vertex_array(Context.raw.paintObject.data, "col") != null;
+		con_paint.allow_vcols = mesh_data_get_vertex_array(context_raw.paintObject.data, "col") != null;
 
-		let vert = NodeShaderContext.make_vert(con_paint);
-		let frag = NodeShaderContext.make_frag(con_paint);
+		let vert = NodeShadercontext_make_vert(con_paint);
+		let frag = NodeShadercontext_make_frag(con_paint);
 		frag.ins = vert.outs;
 
-		if (Context.raw.tool == WorkspaceTool.ToolPicker) {
+		if (context_raw.tool == WorkspaceTool.ToolPicker) {
 			// Mangle vertices to form full screen triangle
 			NodeShader.write(vert, 'gl_Position = vec4(-1.0 + float((gl_VertexID & 1) << 2), -1.0 + float((gl_VertexID & 2) << 1), 0.0, 1.0);');
 
@@ -85,10 +85,10 @@ class MakePaint {
 		NodeShader.add_uniform(frag, 'float brushOpacity', '_brushOpacity');
 		NodeShader.add_uniform(frag, 'float brushHardness', '_brushHardness');
 
-		if (Context.raw.tool == WorkspaceTool.ToolEraser ||
-			Context.raw.tool == WorkspaceTool.ToolClone  ||
-			Context.raw.tool == WorkspaceTool.ToolBlur   ||
-			Context.raw.tool == WorkspaceTool.ToolSmudge) {
+		if (context_raw.tool == WorkspaceTool.ToolEraser ||
+			context_raw.tool == WorkspaceTool.ToolClone  ||
+			context_raw.tool == WorkspaceTool.ToolBlur   ||
+			context_raw.tool == WorkspaceTool.ToolSmudge) {
 
 			NodeShader.write(frag, 'float dist = 0.0;');
 
@@ -129,14 +129,14 @@ class MakePaint {
 		// NodeShader.add_out(vert, 'vec2 texCoord');
 		// NodeShader.write(vert, 'texCoord = tex * brushScale * texScale;');
 
-		if (Context.raw.tool == WorkspaceTool.ToolClone || Context.raw.tool == WorkspaceTool.ToolBlur || Context.raw.tool == WorkspaceTool.ToolSmudge) {
+		if (context_raw.tool == WorkspaceTool.ToolClone || context_raw.tool == WorkspaceTool.ToolBlur || context_raw.tool == WorkspaceTool.ToolSmudge) {
 			NodeShader.add_uniform(frag, 'sampler2D gbuffer2');
 			NodeShader.add_uniform(frag, 'vec2 gbufferSize', '_gbufferSize');
 			NodeShader.add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo');
 			NodeShader.add_uniform(frag, 'sampler2D texpaint_nor_undo', '_texpaint_nor_undo');
 			NodeShader.add_uniform(frag, 'sampler2D texpaint_pack_undo', '_texpaint_pack_undo');
 
-			if (Context.raw.tool == WorkspaceTool.ToolClone) {
+			if (context_raw.tool == WorkspaceTool.ToolClone) {
 				// NodeShader.add_uniform(frag, 'vec2 cloneDelta', '_cloneDelta');
 				// ///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
 				// NodeShader.write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2((sp.xy + cloneDelta) * gbufferSize), 0).ba;');
@@ -179,7 +179,7 @@ class MakePaint {
 
 				// NodeShader.add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize');
 				// NodeShader.write(frag, 'float blur_step = 1.0 / texpaintSize.x;');
-				// if (Context.raw.blurDirectional) {
+				// if (context_raw.blurDirectional) {
 				// 	///if (krom_direct3d11 || krom_direct3d12 || krom_metal)
 				// 	NodeShader.write(frag, 'const float blur_weight[7] = {1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0};');
 				// 	///else
@@ -257,7 +257,7 @@ class MakePaint {
 		NodeShader.add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo');
 		NodeShader.write(frag, 'vec4 sample_undo = textureLod(texpaint_undo, sample_tc, 0.0);');
 
-		if (Context.raw.tool == WorkspaceTool.ToolEraser) {
+		if (context_raw.tool == WorkspaceTool.ToolEraser) {
 			// NodeShader.write(frag, 'fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);');
 			NodeShader.write(frag, 'fragColor[0] = vec4(0.0, 0.0, 0.0, 0.0);');
 			NodeShader.write(frag, 'fragColor[1] = vec4(0.5, 0.5, 1.0, 0.0);');

+ 2 - 2
armorlab/Sources/NodesBrush.ts

@@ -30,8 +30,8 @@ class NodesBrush {
 		for (let c of NodesBrush.list) {
 			for (let n of c) {
 				if (n.type == nodeType) {
-					let canvas = Project.canvas;
-					let nodes = Project.nodes;
+					let canvas = project_canvas;
+					let nodes = project_nodes;
 					let node = UINodes.makeNode(n, nodes, canvas);
 					canvas.nodes.push(node);
 					return node;

+ 56 - 56
armorlab/Sources/RenderPathPaint.ts

@@ -8,16 +8,16 @@ class RenderPathPaint {
 		{
 			let t = render_target_create();
 			t.name = "texpaint_blend0";
-			t.width = Config.getTextureResX();
-			t.height = Config.getTextureResY();
+			t.width = config_getTextureResX();
+			t.height = config_getTextureResY();
 			t.format = "R8";
 			render_path_create_render_target(t);
 		}
 		{
 			let t = render_target_create();
 			t.name = "texpaint_blend1";
-			t.width = Config.getTextureResX();
-			t.height = Config.getTextureResY();
+			t.width = config_getTextureResX();
+			t.height = config_getTextureResY();
 			t.format = "R8";
 			render_path_create_render_target(t);
 		}
@@ -60,9 +60,9 @@ class RenderPathPaint {
 	static commandsPaint = (dilation = true) => {
 		let tid = "";
 
-		if (Context.raw.pdirty > 0) {
+		if (context_raw.pdirty > 0) {
 
-			if (Context.raw.tool == WorkspaceTool.ToolPicker) {
+			if (context_raw.tool == WorkspaceTool.ToolPicker) {
 
 					///if krom_metal
 					// render_path_set_target("texpaint_picker");
@@ -77,7 +77,7 @@ class RenderPathPaint {
 					// render_path_clear_target(0xff000000);
 					///end
 					render_path_bind_target("gbuffer2", "gbuffer2");
-					// tid = Context.raw.layer.id;
+					// tid = context_raw.layer.id;
 					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");
@@ -93,39 +93,39 @@ class RenderPathPaint {
 					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);
+					if (context_raw.colorPickerCallback != null) {
+						context_raw.colorPickerCallback(context_raw.pickedColor);
 					}
 
 					// Picked surface values
 					// ///if (krom_metal || krom_vulkan)
-					// Context.raw.pickedColor.base.Rb = a.get(2);
-					// Context.raw.pickedColor.base.Gb = a.get(1);
-					// Context.raw.pickedColor.base.Bb = a.get(0);
-					// Context.raw.pickedColor.normal.Rb = b.get(2);
-					// Context.raw.pickedColor.normal.Gb = b.get(1);
-					// Context.raw.pickedColor.normal.Bb = b.get(0);
-					// Context.raw.pickedColor.occlusion = c.get(2) / 255;
-					// Context.raw.pickedColor.roughness = c.get(1) / 255;
-					// Context.raw.pickedColor.metallic = c.get(0) / 255;
-					// Context.raw.pickedColor.height = c.get(3) / 255;
-					// Context.raw.pickedColor.opacity = a.get(3) / 255;
-					// Context.raw.uvxPicked = d.get(2) / 255;
-					// Context.raw.uvyPicked = d.get(1) / 255;
+					// context_raw.pickedColor.base.Rb = a.get(2);
+					// context_raw.pickedColor.base.Gb = a.get(1);
+					// context_raw.pickedColor.base.Bb = a.get(0);
+					// context_raw.pickedColor.normal.Rb = b.get(2);
+					// context_raw.pickedColor.normal.Gb = b.get(1);
+					// context_raw.pickedColor.normal.Bb = b.get(0);
+					// context_raw.pickedColor.occlusion = c.get(2) / 255;
+					// context_raw.pickedColor.roughness = c.get(1) / 255;
+					// context_raw.pickedColor.metallic = c.get(0) / 255;
+					// context_raw.pickedColor.height = c.get(3) / 255;
+					// context_raw.pickedColor.opacity = a.get(3) / 255;
+					// context_raw.uvxPicked = d.get(2) / 255;
+					// context_raw.uvyPicked = d.get(1) / 255;
 					// ///else
-					// Context.raw.pickedColor.base.Rb = a.get(0);
-					// Context.raw.pickedColor.base.Gb = a.get(1);
-					// Context.raw.pickedColor.base.Bb = a.get(2);
-					// Context.raw.pickedColor.normal.Rb = b.get(0);
-					// Context.raw.pickedColor.normal.Gb = b.get(1);
-					// Context.raw.pickedColor.normal.Bb = b.get(2);
-					// Context.raw.pickedColor.occlusion = c.get(0) / 255;
-					// Context.raw.pickedColor.roughness = c.get(1) / 255;
-					// Context.raw.pickedColor.metallic = c.get(2) / 255;
-					// Context.raw.pickedColor.height = c.get(3) / 255;
-					// Context.raw.pickedColor.opacity = a.get(3) / 255;
-					// Context.raw.uvxPicked = d.get(0) / 255;
-					// Context.raw.uvyPicked = d.get(1) / 255;
+					// context_raw.pickedColor.base.Rb = a.get(0);
+					// context_raw.pickedColor.base.Gb = a.get(1);
+					// context_raw.pickedColor.base.Bb = a.get(2);
+					// context_raw.pickedColor.normal.Rb = b.get(0);
+					// context_raw.pickedColor.normal.Gb = b.get(1);
+					// context_raw.pickedColor.normal.Bb = b.get(2);
+					// context_raw.pickedColor.occlusion = c.get(0) / 255;
+					// context_raw.pickedColor.roughness = c.get(1) / 255;
+					// context_raw.pickedColor.metallic = c.get(2) / 255;
+					// context_raw.pickedColor.height = c.get(3) / 255;
+					// context_raw.pickedColor.opacity = a.get(3) / 255;
+					// context_raw.uvxPicked = d.get(0) / 255;
+					// context_raw.uvyPicked = d.get(1) / 255;
 					// ///end
 			}
 			else {
@@ -142,9 +142,9 @@ class RenderPathPaint {
 				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;
+				let readTC = context_raw.tool == WorkspaceTool.ToolClone ||
+							 context_raw.tool == WorkspaceTool.ToolBlur ||
+							 context_raw.tool == WorkspaceTool.ToolSmudge;
 				if (readTC) {
 					render_path_bind_target("gbuffer2", "gbuffer2");
 				}
@@ -155,7 +155,7 @@ class RenderPathPaint {
 	}
 
 	static commandsCursor = () => {
-		let tool = Context.raw.tool;
+		let tool = context_raw.tool;
 		if (tool != WorkspaceTool.ToolEraser &&
 			tool != WorkspaceTool.ToolClone &&
 			tool != WorkspaceTool.ToolBlur &&
@@ -171,13 +171,13 @@ class RenderPathPaint {
 			return;
 		}
 
-		let mx = Context.raw.paintVec.x;
-		let my = 1.0 - Context.raw.paintVec.y;
-		if (Context.raw.brushLocked) {
-			mx = (Context.raw.lockStartedX - app_x()) / app_w();
-			my = 1.0 - (Context.raw.lockStartedY - app_y()) / app_h();
+		let mx = context_raw.paintVec.x;
+		let my = 1.0 - context_raw.paintVec.y;
+		if (context_raw.brushLocked) {
+			mx = (context_raw.lockStartedX - app_x()) / app_w();
+			my = 1.0 - (context_raw.lockStartedY - app_y()) / app_h();
 		}
-		let radius = Context.raw.brushRadius;
+		let radius = context_raw.brushRadius;
 		RenderPathPaint.drawCursor(mx, my, radius / 3.4);
 	}
 
@@ -188,7 +188,7 @@ class RenderPathPaint {
 
 		render_path_set_target("");
 		g4_set_pipeline(base_pipeCursor);
-		let img = Res.get("cursor.k");
+		let img = resource_get("cursor.k");
 		g4_set_tex(base_cursorTex, img);
 		let gbuffer0 = render_path_render_targets.get("gbuffer0")._image;
 		g4_set_tex_depth(base_cursorGbufferD, gbuffer0);
@@ -215,7 +215,7 @@ class RenderPathPaint {
 	}
 
 	static paintEnabled = (): bool => {
-		return !Context.raw.foregroundEvent;
+		return !context_raw.foregroundEvent;
 	}
 
 	static begin = () => {
@@ -224,11 +224,11 @@ class RenderPathPaint {
 
 	static end = () => {
 		RenderPathPaint.commandsCursor();
-		Context.raw.ddirty--;
-		Context.raw.rdirty--;
+		context_raw.ddirty--;
+		context_raw.rdirty--;
 
 		if (!RenderPathPaint.paintEnabled()) return;
-		Context.raw.pdirty--;
+		context_raw.pdirty--;
 	}
 
 	static draw = () => {
@@ -236,8 +236,8 @@ class RenderPathPaint {
 
 		RenderPathPaint.commandsPaint();
 
-		if (Context.raw.brushBlendDirty) {
-			Context.raw.brushBlendDirty = false;
+		if (context_raw.brushBlendDirty) {
+			context_raw.brushBlendDirty = false;
 			///if krom_metal
 			render_path_set_target("texpaint_blend0");
 			render_path_clear_target(0x00000000);
@@ -265,16 +265,16 @@ class RenderPathPaint {
 			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.width = config_getTextureResX();
+				t.height = config_getTextureResY();
 				t.format = "RGBA32";
 				render_path_render_targets.set(t.name, t);
 			}
 			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.width = config_getTextureResX();
+				t.height = config_getTextureResY();
 				t.format = "RGBA32";
 				render_path_render_targets.set(t.name, t);
 			}

+ 14 - 14
armorlab/Sources/UINodesExt.ts

@@ -6,7 +6,7 @@ class UINodesExt {
 	static drawButtons = (ew: f32, startY: f32) => {
 		let ui = UINodes.ui;
 		if (zui_button(tr("Run"))) {
-			Console.progress(tr("Processing"));
+			console_progress(tr("Processing"));
 
 			let delayIdleSleep = () => {
 				krom_delay_idle_sleep();
@@ -18,8 +18,8 @@ class UINodesExt {
 			let taskDone = () => {
 				tasks--;
 				if (tasks == 0) {
-					Console.progress(null);
-					Context.raw.ddirty = 2;
+					console_progress(null);
+					context_raw.ddirty = 2;
 					app_remove_render_2d(delayIdleSleep);
 
 					///if (krom_direct3d12 || krom_vulkan || krom_metal)
@@ -30,7 +30,7 @@ class UINodesExt {
 
 			base_notifyOnNextFrame(() => {
 				let timer = time_time();
-				ParserLogic.parse(Project.canvas);
+				ParserLogic.parse(project_canvas);
 
 				PhotoToPBRNode.cachedSource = null;
 				BrushOutputNode.inst.getAsImage(ChannelType.ChannelBaseColor, (texbase: image_t) => {
@@ -42,14 +42,14 @@ class UINodesExt {
 					if (texbase != null) {
 						let texpaint = render_path_render_targets.get("texpaint")._image;
 						g2_begin(texpaint);
-						g2_draw_scaled_image(texbase, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+						g2_draw_scaled_image(texbase, 0, 0, config_getTextureResX(), config_getTextureResY());
 						g2_end();
 					}
 
 					if (texnor != null) {
 						let texpaint_nor = render_path_render_targets.get("texpaint_nor")._image;
 						g2_begin(texpaint_nor);
-						g2_draw_scaled_image(texnor, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+						g2_draw_scaled_image(texnor, 0, 0, config_getTextureResX(), config_getTextureResY());
 						g2_end();
 					}
 
@@ -62,7 +62,7 @@ class UINodesExt {
 					if (texocc != null) {
 						g2_begin(texpaint_pack);
 						g2_set_pipeline(base_pipeCopyR);
-						g2_draw_scaled_image(texocc, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+						g2_draw_scaled_image(texocc, 0, 0, config_getTextureResX(), config_getTextureResY());
 						g2_set_pipeline(null);
 						g2_end();
 					}
@@ -70,7 +70,7 @@ class UINodesExt {
 					if (texrough != null) {
 						g2_begin(texpaint_pack);
 						g2_set_pipeline(base_pipeCopyG);
-						g2_draw_scaled_image(texrough, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+						g2_draw_scaled_image(texrough, 0, 0, config_getTextureResX(), config_getTextureResY());
 						g2_set_pipeline(null);
 						g2_end();
 					}
@@ -88,7 +88,7 @@ class UINodesExt {
 							BrushOutputNode.inst.inputs[ChannelType.ChannelHeight].node.constructor != FloatNode) {
 
 							// Make copy of vertices before displacement
-							let o = Project.paintObjects[0];
+							let o = project_paintObjects[0];
 							let g = o.data;
 							let vertices = g4_vertex_buffer_lock(g._.vertex_buffer);
 							if (UINodesExt.lastVertices == null || UINodesExt.lastVertices.byteLength != vertices.byteLength) {
@@ -105,13 +105,13 @@ class UINodesExt {
 							g4_vertex_buffer_unlock(g._.vertex_buffer);
 
 							// Apply displacement
-							if (Config.raw.displace_strength > 0) {
+							if (config_raw.displace_strength > 0) {
 								tasks++;
 								base_notifyOnNextFrame(() => {
-									Console.progress(tr("Apply Displacement"));
+									console_progress(tr("Apply Displacement"));
 									base_notifyOnNextFrame(() => {
-										let uv_scale = scene_meshes[0].data.scale_tex * Context.raw.brushScale;
-										UtilMesh.applyDisplacement(texpaint_pack, 0.05 * Config.raw.displace_strength, uv_scale);
+										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_ml_unload();
 
 					taskDone();

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

@@ -17,24 +17,24 @@ class BrushOutputNode extends LogicNode {
 			{
 				let t = render_target_create();
 				t.name = "texpaint";
-				t.width = Config.getTextureResX();
-				t.height = Config.getTextureResY();
+				t.width = config_getTextureResX();
+				t.height = config_getTextureResY();
 				t.format = "RGBA32";
 				this.texpaint = render_path_create_render_target(t)._image;
 			}
 			{
 				let t = render_target_create();
 				t.name = "texpaint_nor";
-				t.width = Config.getTextureResX();
-				t.height = Config.getTextureResY();
+				t.width = config_getTextureResX();
+				t.height = config_getTextureResY();
 				t.format = "RGBA32";
 				this.texpaint_nor = render_path_create_render_target(t)._image;
 			}
 			{
 				let t = render_target_create();
 				t.name = "texpaint_pack";
-				t.width = Config.getTextureResX();
-				t.height = Config.getTextureResY();
+				t.width = config_getTextureResX();
+				t.height = config_getTextureResY();
 				t.format = "RGBA32";
 				this.texpaint_pack = render_path_create_render_target(t)._image;
 			}

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

@@ -9,9 +9,9 @@ class ImageTextureNode extends LogicNode {
 	}
 
 	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));
+		let index = project_assetNames.indexOf(this.file);
+		let asset = project_assets[index];
+		done(project_getImage(asset));
 	}
 
 	override getCachedImage = (): image_t => {

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

@@ -19,11 +19,11 @@ class InpaintNode extends LogicNode {
 
 	static init = () => {
 		if (InpaintNode.image == null) {
-			InpaintNode.image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
+			InpaintNode.image = image_create_render_target(config_getTextureResX(), config_getTextureResY());
 		}
 
 		if (InpaintNode.mask == null) {
-			InpaintNode.mask = image_create_render_target(Config.getTextureResX(), Config.getTextureResY(), tex_format_t.R8);
+			InpaintNode.mask = image_create_render_target(config_getTextureResX(), config_getTextureResY(), tex_format_t.R8);
 			base_notifyOnNextFrame(() => {
 				g4_begin(InpaintNode.mask);
 				g4_clear(color_from_floats(1.0, 1.0, 1.0, 1.0));
@@ -36,7 +36,7 @@ class InpaintNode extends LogicNode {
 		}
 
 		if (InpaintNode.result == null) {
-			InpaintNode.result = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
+			InpaintNode.result = image_create_render_target(config_getTextureResX(), config_getTextureResY());
 		}
 	}
 
@@ -53,10 +53,10 @@ class InpaintNode extends LogicNode {
 	override getAsImage = (from: i32, done: (img: image_t)=>void) => {
 		this.inputs[0].getAsImage((source: image_t) => {
 
-			Console.progress(tr("Processing") + " - " + tr("Inpaint"));
+			console_progress(tr("Processing") + " - " + tr("Inpaint"));
 			base_notifyOnNextFrame(() => {
 				g2_begin(InpaintNode.image);
-				g2_draw_scaled_image(source, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+				g2_draw_scaled_image(source, 0, 0, config_getTextureResX(), config_getTextureResY());
 				g2_end();
 
 				InpaintNode.auto ? InpaintNode.texsynthInpaint(InpaintNode.image, false, InpaintNode.mask, done) : InpaintNode.sdInpaint(InpaintNode.image, InpaintNode.mask, done);
@@ -87,8 +87,8 @@ class InpaintNode extends LogicNode {
 	}
 
 	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 w = config_getTextureResX();
+		let h = config_getTextureResY();
 
 		let bytes_img = image_get_pixels(image);
 		let bytes_mask = mask != null ? image_get_pixels(mask) : new ArrayBuffer(w * h);
@@ -141,7 +141,7 @@ class InpaintNode extends LogicNode {
 					f32a[i + 512 * 512 * 2] = (u8a[i * 4 + 2] / 255.0) * 2.0 - 1.0;
 				}
 
-				let latents_buf = krom_ml_inference(vae_encoder_blob, [f32a.buffer], [[1, 3, 512, 512]], [1, 4, 64, 64], Config.raw.gpu_inference);
+				let latents_buf = krom_ml_inference(vae_encoder_blob, [f32a.buffer], [[1, 3, 512, 512]], [1, 4, 64, 64], config_raw.gpu_inference);
 				let latents = new Float32Array(latents_buf);
 				for (let i = 0; i < latents.length; ++i) {
 					latents[i] = 0.18215 * latents[i];

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

@@ -24,7 +24,7 @@ class PhotoToPBRNode extends LogicNode {
 		if (PhotoToPBRNode.images == null) {
 			PhotoToPBRNode.images = [];
 			for (let i = 0; i < PhotoToPBRNode.modelNames.length; ++i) {
-				PhotoToPBRNode.images.push(image_create_render_target(Config.getTextureResX(), Config.getTextureResY()));
+				PhotoToPBRNode.images.push(image_create_render_target(config_getTextureResX(), config_getTextureResY()));
 			}
 		}
 	}
@@ -38,24 +38,24 @@ class PhotoToPBRNode extends LogicNode {
 		getSource((source: image_t) => {
 			PhotoToPBRNode.cachedSource = source;
 
-			Console.progress(tr("Processing") + " - " + tr("Photo to PBR"));
+			console_progress(tr("Processing") + " - " + tr("Photo to PBR"));
 			base_notifyOnNextFrame(() => {
 				let tileFloats: Float32Array[] = [];
-				let tilesX = Math.floor(Config.getTextureResX() / PhotoToPBRNode.tileW);
-				let tilesY = Math.floor(Config.getTextureResY() / PhotoToPBRNode.tileW);
+				let tilesX = Math.floor(config_getTextureResX() / PhotoToPBRNode.tileW);
+				let tilesY = Math.floor(config_getTextureResY() / PhotoToPBRNode.tileW);
 				let numTiles = tilesX * tilesY;
 				for (let i = 0; i < numTiles; ++i) {
 					let x = i % tilesX;
 					let y = Math.floor(i / tilesX);
 
 					g2_begin(PhotoToPBRNode.temp);
-					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_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();
 
 					let bytes_img = image_get_pixels(PhotoToPBRNode.temp);
@@ -68,7 +68,7 @@ class PhotoToPBRNode extends LogicNode {
 					}
 
 					let model_blob: ArrayBuffer = data_get_blob("models/photo_to_" + PhotoToPBRNode.modelNames[from] + ".quant.onnx");
-					let buf = krom_ml_inference(model_blob, [f32a.buffer], null, null, Config.raw.gpu_inference);
+					let buf = krom_ml_inference(model_blob, [f32a.buffer], null, null, config_raw.gpu_inference);
 					let ar = new Float32Array(buf);
 					u8a = new Uint8Array(4 * PhotoToPBRNode.tileW * PhotoToPBRNode.tileW);
 					let offsetG = (from == ChannelType.ChannelBaseColor || from == ChannelType.ChannelNormalMap) ? PhotoToPBRNode.tileWithBorderW * PhotoToPBRNode.tileWithBorderW : 0;

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

@@ -44,7 +44,7 @@ class TextToPhotoNode extends LogicNode {
 	}
 
 	static textEncoder = (prompt: string, inpaintLatents: Float32Array, done: (a: Float32Array, b: Float32Array)=>void) => {
-		Console.progress(tr("Processing") + " - " + tr("Text to Photo"));
+		console_progress(tr("Processing") + " - " + tr("Text to Photo"));
 		base_notifyOnNextFrame(() => {
 			let words = prompt.replaceAll("\n", " ").replaceAll(",", " , ").replaceAll("  ", " ").trim().split(" ");
 			for (let i = 0; i < words.length; ++i) {
@@ -55,11 +55,11 @@ class TextToPhotoNode extends LogicNode {
 			}
 
 			let i32a = new Int32Array(TextToPhotoNode.text_input_ids);
-			let text_embeddings_buf = krom_ml_inference(TextToPhotoNode.text_encoder_blob, [i32a.buffer], [[1, 77]], [1, 77, 768], Config.raw.gpu_inference);
+			let text_embeddings_buf = krom_ml_inference(TextToPhotoNode.text_encoder_blob, [i32a.buffer], [[1, 77]], [1, 77, 768], config_raw.gpu_inference);
 			let text_embeddings = new Float32Array(text_embeddings_buf);
 
 			i32a = new Int32Array(TextToPhotoNode.uncond_input_ids);
-			let uncond_embeddings_buf = krom_ml_inference(TextToPhotoNode.text_encoder_blob, [i32a.buffer], [[1, 77]], [1, 77, 768], Config.raw.gpu_inference);
+			let uncond_embeddings_buf = krom_ml_inference(TextToPhotoNode.text_encoder_blob, [i32a.buffer], [[1, 77]], [1, 77, 768], config_raw.gpu_inference);
 			let uncond_embeddings = new Float32Array(uncond_embeddings_buf);
 
 			let f32a = new Float32Array(uncond_embeddings.length + text_embeddings.length);
@@ -93,7 +93,7 @@ class TextToPhotoNode extends LogicNode {
 		let counter = 0;
 
 		let processing = () => {
-			Console.progress(tr("Processing") + " - " + tr("Text to Photo") + " (" + (counter + 1) + "/" + (50 - offset) + ")");
+			console_progress(tr("Processing") + " - " + tr("Text to Photo") + " (" + (counter + 1) + "/" + (50 - offset) + ")");
 
 			let timestep = TextToPhotoNode.timesteps[counter + offset];
 			for (let i = 0; i < latents.length; ++i) latent_model_input[i] = latents[i];
@@ -101,7 +101,7 @@ class TextToPhotoNode extends LogicNode {
 
 			let t32 = new Int32Array(2);
 			t32[0] = timestep;
-			let noise_pred_buf = krom_ml_inference(TextToPhotoNode.unet_blob, [latent_model_input.buffer, t32.buffer, text_embeddings.buffer], [[2, 4, 64, 64], [1], [2, 77, 768]], [2, 4, 64, 64], Config.raw.gpu_inference);
+			let noise_pred_buf = krom_ml_inference(TextToPhotoNode.unet_blob, [latent_model_input.buffer, t32.buffer, text_embeddings.buffer], [[2, 4, 64, 64], [1], [2, 77, 768]], [2, 4, 64, 64], config_raw.gpu_inference);
 			let noise_pred = new Float32Array(noise_pred_buf);
 
 			for (let i = 0; i < noise_pred_uncond.length; ++i) noise_pred_uncond[i] = noise_pred[i];
@@ -193,13 +193,13 @@ class TextToPhotoNode extends LogicNode {
 	}
 
 	static vaeDecoder = (latents: Float32Array, upscale: bool, done: (img: image_t)=>void) => {
-		Console.progress(tr("Processing") + " - " + tr("Text to Photo"));
+		console_progress(tr("Processing") + " - " + tr("Text to Photo"));
 		base_notifyOnNextFrame(() => {
 			for (let i = 0; i < latents.length; ++i) {
 				latents[i] = 1.0 / 0.18215 * latents[i];
 			}
 
-			let pyimage_buf = krom_ml_inference(TextToPhotoNode.vae_decoder_blob, [latents.buffer], [[1, 4, 64, 64]], [1, 3, 512, 512], Config.raw.gpu_inference);
+			let pyimage_buf = krom_ml_inference(TextToPhotoNode.vae_decoder_blob, [latents.buffer], [[1, 4, 64, 64]], [1, 3, 512, 512], config_raw.gpu_inference);
 			let pyimage = new Float32Array(pyimage_buf);
 
 			for (let i = 0; i < pyimage.length; ++i) {
@@ -225,7 +225,7 @@ class TextToPhotoNode extends LogicNode {
 			else {
 				if (upscale) {
 					UpscaleNode.loadBlob(() => {
-						while (image.width < Config.getTextureResX()) {
+						while (image.width < config_getTextureResX()) {
 							let lastImage = image;
 							image = UpscaleNode.esrgan(image);
 							image_unload(lastImage);

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

@@ -14,7 +14,7 @@ class TilingNode extends LogicNode {
 
 	static init = () => {
 		if (TilingNode.image == null) {
-			TilingNode.image = image_create_render_target(Config.getTextureResX(), Config.getTextureResY());
+			TilingNode.image = image_create_render_target(config_getTextureResX(), config_getTextureResY());
 		}
 	}
 
@@ -31,10 +31,10 @@ class TilingNode extends LogicNode {
 	override getAsImage = (from: i32, done: (img: image_t)=>void) => {
 		this.inputs[0].getAsImage((source: image_t) => {
 			g2_begin(TilingNode.image);
-			g2_draw_scaled_image(source, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+			g2_draw_scaled_image(source, 0, 0, config_getTextureResX(), config_getTextureResY());
 			g2_end();
 
-			Console.progress(tr("Processing") + " - " + tr("Tiling"));
+			console_progress(tr("Processing") + " - " + tr("Tiling"));
 			base_notifyOnNextFrame(() => {
 				let _done = (image: image_t) => {
 					this.result = image;

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

@@ -13,12 +13,12 @@ class UpscaleNode extends LogicNode {
 		this.inputs[0].getAsImage((_image: image_t) => {
 			UpscaleNode.image = _image;
 
-			Console.progress(tr("Processing") + " - " + tr("Upscale"));
+			console_progress(tr("Processing") + " - " + tr("Upscale"));
 			base_notifyOnNextFrame(() => {
 				UpscaleNode.loadBlob(() => {
-					if (UpscaleNode.image.width < Config.getTextureResX()) {
+					if (UpscaleNode.image.width < config_getTextureResX()) {
 						UpscaleNode.image = UpscaleNode.esrgan(UpscaleNode.image);
-						while (UpscaleNode.image.width < Config.getTextureResX()) {
+						while (UpscaleNode.image.width < config_getTextureResX()) {
 							let lastImage = UpscaleNode.image;
 							UpscaleNode.image = UpscaleNode.esrgan(UpscaleNode.image);
 							image_unload(lastImage);
@@ -63,7 +63,7 @@ class UpscaleNode extends LogicNode {
 			f32a[i + size1w * size1w * 2] = (u8a[i * 4 + 2] / 255);
 		}
 
-		let esrgan2x_buf = krom_ml_inference(UpscaleNode.esrgan_blob, [f32a.buffer], [[1, 3, size1w, size1h]], [1, 3, size2w, size2h], Config.raw.gpu_inference);
+		let esrgan2x_buf = krom_ml_inference(UpscaleNode.esrgan_blob, [f32a.buffer], [[1, 3, size1w, size1h]], [1, 3, size2w, size2h], config_raw.gpu_inference);
 		let esrgan2x = new Float32Array(esrgan2x_buf);
 		for (let i = 0; i < esrgan2x.length; ++i) {
 			if (esrgan2x[i] < 0) esrgan2x[i] = 0;

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

@@ -40,10 +40,10 @@ class VarianceNode extends LogicNode {
 				f32a[i + 512 * 512 * 2] = (u8a[i * 4 + 2] / 255) * 2.0 - 1.0;
 			}
 
-			Console.progress(tr("Processing") + " - " + tr("Variance"));
+			console_progress(tr("Processing") + " - " + tr("Variance"));
 			base_notifyOnNextFrame(() => {
 				let vae_encoder_blob: ArrayBuffer = data_get_blob("models/sd_vae_encoder.quant.onnx");
-				let latents_buf = krom_ml_inference(vae_encoder_blob, [f32a.buffer], [[1, 3, 512, 512]], [1, 4, 64, 64], Config.raw.gpu_inference);
+				let latents_buf = krom_ml_inference(vae_encoder_blob, [f32a.buffer], [[1, 3, 512, 512]], [1, 4, 64, 64], config_raw.gpu_inference);
 				let latents = new Float32Array(latents_buf);
 				for (let i = 0; i < latents.length; ++i) {
 					latents[i] = 0.18215 * latents[i];

+ 17 - 17
armorpaint/Sources/ImportFolder.ts

@@ -2,7 +2,7 @@
 class ImportFolder {
 
 	static run = (path: string) => {
-		let files: string[] = File.read_directory(path);
+		let files: string[] = file_read_directory(path);
 		let mapbase: string = "";
 		let mapopac: string = "";
 		let mapnor: string = "";
@@ -14,58 +14,58 @@ class ImportFolder {
 		let found_texture: bool = false;
 		// Import maps
 		for (let f of files) {
-			if (!Path.is_texture(f)) continue;
+			if (!path_is_texture(f)) continue;
 
 			// TODO: handle -albedo
 
 			let base: string = f.substr(0, f.lastIndexOf(".")).toLowerCase();
 			let valid: bool = false;
-			if (mapbase == "" && Path.is_base_color_tex(base)) {
+			if (mapbase == "" && path_is_base_color_tex(base)) {
 				mapbase = f;
 				valid = true;
 			}
-			if (mapopac == "" && Path.is_opacity_tex(base)) {
+			if (mapopac == "" && path_is_opacity_tex(base)) {
 				mapopac = f;
 				valid = true;
 			}
-			if (mapnor == "" && Path.is_normal_map_tex(base)) {
+			if (mapnor == "" && path_is_normal_map_tex(base)) {
 				mapnor = f;
 				valid = true;
 			}
-			if (mapocc == "" && Path.is_occlusion_tex(base)) {
+			if (mapocc == "" && path_is_occlusion_tex(base)) {
 				mapocc = f;
 				valid = true;
 			}
-			if (maprough == "" && Path.is_roughness_tex(base)) {
+			if (maprough == "" && path_is_roughness_tex(base)) {
 				maprough = f;
 				valid = true;
 			}
-			if (mapmet == "" && Path.is_metallic_tex(base)) {
+			if (mapmet == "" && path_is_metallic_tex(base)) {
 				mapmet = f;
 				valid = true;
 			}
-			if (mapheight == "" && Path.is_displacement_tex(base)) {
+			if (mapheight == "" && path_is_displacement_tex(base)) {
 				mapheight = f;
 				valid = true;
 			}
 
 			if (valid) {
-				ImportTexture.run(path + Path.sep + f, false);
+				ImportTexture.run(path + path_sep + f, false);
 				found_texture = true;
 			}
 		}
 
 		if (!found_texture) {
-			Console.info(tr("Folder does not contain textures"));
+			console_info(tr("Folder does not contain textures"));
 			return;
 		}
 
 		// Create material
-		Context.raw.material = SlotMaterial.create(Project.materials[0].data);
-		Project.materials.push(Context.raw.material);
-		let nodes: zui_nodes_t = Context.raw.material.nodes;
-		let canvas: zui_node_canvas_t = Context.raw.material.canvas;
-		let dirs: string[] = path.split(Path.sep);
+		context_raw.material = SlotMaterial.create(project_materials[0].data);
+		project_materials.push(context_raw.material);
+		let nodes: zui_nodes_t = context_raw.material.nodes;
+		let canvas: zui_node_canvas_t = context_raw.material.canvas;
+		let dirs: string[] = path.split(path_sep);
 		canvas.name = dirs[dirs.length - 1];
 		let nout: zui_node_t = null;
 		for (let n of canvas.nodes) {
@@ -117,7 +117,7 @@ class ImportFolder {
 		MakeMaterial.parse_paint_material();
 		UtilRender.make_material_preview();
 		UIBase.hwnds[1].redraws = 2;
-		History.new_material();
+		history_new_material();
 	}
 
 	static place_image_node = (nodes: zui_nodes_t, canvas: zui_node_canvas_t, asset: string, ny: i32, to_id: i32, to_socket: i32) => {

+ 23 - 23
armorpaint/Sources/MakeBake.ts

@@ -2,7 +2,7 @@
 class MakeBake {
 
 	static run = (con: NodeShaderContextRaw, vert: NodeShaderRaw, frag: NodeShaderRaw) => {
-		if (Context.raw.bake_type == bake_type_t.AO) { // Voxel
+		if (context_raw.bake_type == bake_type_t.AO) { // Voxel
 			///if arm_voxels
 			// Apply normal channel
 			frag.wposition = true;
@@ -23,23 +23,23 @@ class MakeBake {
 			NodeShader.add_uniform(frag, 'sampler3D voxels');
 			NodeShader.add_function(frag, ShaderFunctions.str_trace_ao);
 			frag.n = true;
-			let strength: f32 = Context.raw.bake_ao_strength;
-			let radius: f32 = Context.raw.bake_ao_radius;
-			let offset: f32 = Context.raw.bake_ao_offset;
+			let strength: f32 = context_raw.bake_ao_strength;
+			let radius: f32 = context_raw.bake_ao_radius;
+			let offset: f32 = context_raw.bake_ao_offset;
 			NodeShader.write(frag, `float ao = traceAO(voxpos, n, ${radius}, ${offset}) * ${strength};`);
-			if (Context.raw.bake_axis != bake_axis_t.XYZ) {
-				let axis: string = MakeBake.axis_string(Context.raw.bake_axis);
+			if (context_raw.bake_axis != bake_axis_t.XYZ) {
+				let axis: string = MakeBake.axis_string(context_raw.bake_axis);
 				NodeShader.write(frag, `ao *= dot(n, ${axis});`);
 			}
 			NodeShader.write(frag, 'ao = 1.0 - ao;');
 			NodeShader.write(frag, 'fragColor[0] = vec4(ao, ao, ao, 1.0);');
 			///end
 		}
-		else if (Context.raw.bake_type == bake_type_t.CURVATURE) {
+		else if (context_raw.bake_type == bake_type_t.CURVATURE) {
 			let pass: bool = ParserMaterial.bake_passthrough;
-			let strength: string = pass ? ParserMaterial.bake_passthrough_strength : Context.raw.bake_curv_strength + "";
-			let radius: string = pass ? ParserMaterial.bake_passthrough_radius : Context.raw.bake_curv_radius + "";
-			let offset: string = pass ? ParserMaterial.bake_passthrough_offset : Context.raw.bake_curv_offset + "";
+			let strength: string = pass ? ParserMaterial.bake_passthrough_strength : context_raw.bake_curv_strength + "";
+			let radius: string = pass ? ParserMaterial.bake_passthrough_radius : context_raw.bake_curv_radius + "";
+			let offset: string = pass ? ParserMaterial.bake_passthrough_offset : context_raw.bake_curv_offset + "";
 			strength = `float(${strength})`;
 			radius = `float(${radius})`;
 			offset = `float(${offset})`;
@@ -48,13 +48,13 @@ class MakeBake {
 			NodeShader.write(frag, 'vec3 dy = dFdy(n);');
 			NodeShader.write(frag, 'float curvature = max(dot(dx, dx), dot(dy, dy));');
 			NodeShader.write(frag, 'curvature = clamp(pow(curvature, (1.0 / ' + radius + ') * 0.25) * ' + strength + ' * 2.0 + ' + offset + ' / 10.0, 0.0, 1.0);');
-			if (Context.raw.bake_axis != bake_axis_t.XYZ) {
-				let axis: string = MakeBake.axis_string(Context.raw.bake_axis);
+			if (context_raw.bake_axis != bake_axis_t.XYZ) {
+				let axis: string = MakeBake.axis_string(context_raw.bake_axis);
 				NodeShader.write(frag, `curvature *= dot(n, ${axis});`);
 			}
 			NodeShader.write(frag, 'fragColor[0] = vec4(curvature, curvature, curvature, 1.0);');
 		}
-		else if (Context.raw.bake_type == bake_type_t.NORMAL) { // Tangent
+		else if (context_raw.bake_type == bake_type_t.NORMAL) { // Tangent
 			frag.n = true;
 			NodeShader.add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo'); // Baked high-poly normals
 			NodeShader.write(frag, 'vec3 n0 = textureLod(texpaint_undo, texCoord, 0.0).rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);');
@@ -63,21 +63,21 @@ class MakeBake {
 			NodeShader.write(frag, 'vec3 res = normalize(mul(n0, invTBN)) * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5);');
 			NodeShader.write(frag, 'fragColor[0] = vec4(res, 1.0);');
 		}
-		else if (Context.raw.bake_type == bake_type_t.NORMAL_OBJECT) {
+		else if (context_raw.bake_type == bake_type_t.NORMAL_OBJECT) {
 			frag.n = true;
 			NodeShader.write(frag, 'fragColor[0] = vec4(n * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), 1.0);');
-			if (Context.raw.bake_up_axis == bake_up_axis_t.Y) {
+			if (context_raw.bake_up_axis == bake_up_axis_t.Y) {
 				NodeShader.write(frag, 'fragColor[0].rgb = vec3(fragColor[0].r, fragColor[0].b, 1.0 - fragColor[0].g);');
 			}
 		}
-		else if (Context.raw.bake_type == bake_type_t.HEIGHT) {
+		else if (context_raw.bake_type == bake_type_t.HEIGHT) {
 			frag.wposition = true;
 			NodeShader.add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo'); // Baked high-poly positions
 			NodeShader.write(frag, 'vec3 wpos0 = textureLod(texpaint_undo, texCoord, 0.0).rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);');
 			NodeShader.write(frag, 'float res = distance(wpos0, wposition) * 10.0;');
 			NodeShader.write(frag, 'fragColor[0] = vec4(res, res, res, 1.0);');
 		}
-		else if (Context.raw.bake_type == bake_type_t.DERIVATIVE) {
+		else if (context_raw.bake_type == bake_type_t.DERIVATIVE) {
 			NodeShader.add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo'); // Baked height
 			NodeShader.write(frag, 'vec2 texDx = dFdx(texCoord);');
 			NodeShader.write(frag, 'vec2 texDy = dFdy(texCoord);');
@@ -86,17 +86,17 @@ class MakeBake {
 			NodeShader.write(frag, 'float h2 = textureLod(texpaint_undo, texCoord + texDy, 0.0).r * 100;');
 			NodeShader.write(frag, 'fragColor[0] = vec4((h1 - h0) * 0.5 + 0.5, (h2 - h0) * 0.5 + 0.5, 0.0, 1.0);');
 		}
-		else if (Context.raw.bake_type == bake_type_t.POSITION) {
+		else if (context_raw.bake_type == bake_type_t.POSITION) {
 			frag.wposition = true;
 			NodeShader.write(frag, 'fragColor[0] = vec4(wposition * vec3(0.5, 0.5, 0.5) + vec3(0.5, 0.5, 0.5), 1.0);');
-			if (Context.raw.bake_up_axis == bake_up_axis_t.Y) {
+			if (context_raw.bake_up_axis == bake_up_axis_t.Y) {
 				NodeShader.write(frag, 'fragColor[0].rgb = vec3(fragColor[0].r, fragColor[0].b, 1.0 - fragColor[0].g);');
 			}
 		}
-		else if (Context.raw.bake_type == bake_type_t.TEXCOORD) {
+		else if (context_raw.bake_type == bake_type_t.TEXCOORD) {
 			NodeShader.write(frag, 'fragColor[0] = vec4(texCoord.xy, 0.0, 1.0);');
 		}
-		else if (Context.raw.bake_type == bake_type_t.MATERIALID) {
+		else if (context_raw.bake_type == bake_type_t.MATERIALID) {
 			NodeShader.add_uniform(frag, 'sampler2D texpaint_nor_undo', '_texpaint_nor_undo');
 			NodeShader.write(frag, 'float sample_matid = textureLod(texpaint_nor_undo, texCoord, 0.0).a + 1.0 / 255.0;');
 			NodeShader.write(frag, 'float matid_r = fract(sin(dot(vec2(sample_matid, sample_matid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);');
@@ -104,7 +104,7 @@ class MakeBake {
 			NodeShader.write(frag, 'float matid_b = fract(sin(dot(vec2(sample_matid, sample_matid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);');
 			NodeShader.write(frag, 'fragColor[0] = vec4(matid_r, matid_g, matid_b, 1.0);');
 		}
-		else if (Context.raw.bake_type == bake_type_t.OBJECTID) {
+		else if (context_raw.bake_type == bake_type_t.OBJECTID) {
 			NodeShader.add_uniform(frag, 'float objectId', '_objectId');
 			NodeShader.write(frag, 'float obid = objectId + 1.0 / 255.0;');
 			NodeShader.write(frag, 'float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);');
@@ -112,7 +112,7 @@ class MakeBake {
 			NodeShader.write(frag, 'float id_b = fract(sin(dot(vec2(obid, obid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);');
 			NodeShader.write(frag, 'fragColor[0] = vec4(id_r, id_g, id_b, 1.0);');
 		}
-		else if (Context.raw.bake_type == bake_type_t.VERTEX_COLOR) {
+		else if (context_raw.bake_type == bake_type_t.VERTEX_COLOR) {
 			if (con.allow_vcols) {
 				NodeShaderContext.add_elem(con, "col", "short4norm");
 				NodeShader.write(frag, 'fragColor[0] = vec4(vcolor.r, vcolor.g, vcolor.b, 1.0);');

+ 4 - 4
armorpaint/Sources/MakeBlur.ts

@@ -15,23 +15,23 @@ class MakeBlur {
 		NodeShader.write(frag, 'vec3 nortan = vec3(0.0, 0.0, 0.0);');
 		NodeShader.write(frag, 'float height = 0.0;');
 		NodeShader.write(frag, 'float mat_opacity = 1.0;');
-		let is_mask: bool = SlotLayer.is_mask(Context.raw.layer);
+		let is_mask: bool = SlotLayer.is_mask(context_raw.layer);
 		if (is_mask) {
 			NodeShader.write(frag, 'float opacity = 1.0;');
 		}
 		else {
 			NodeShader.write(frag, 'float opacity = 0.0;');
 		}
-		if (Context.raw.material.paint_emis) {
+		if (context_raw.material.paint_emis) {
 			NodeShader.write(frag, 'float emis = 0.0;');
 		}
-		if (Context.raw.material.paint_subs) {
+		if (context_raw.material.paint_subs) {
 			NodeShader.write(frag, 'float subs = 0.0;');
 		}
 
 		NodeShader.add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize');
 		NodeShader.write(frag, 'float blur_step = 1.0 / texpaintSize.x;');
-		if (Context.raw.tool == workspace_tool_t.SMUDGE) {
+		if (context_raw.tool == workspace_tool_t.SMUDGE) {
 			///if (krom_direct3d11 || krom_direct3d12 || krom_metal)
 			NodeShader.write(frag, 'const float blur_weight[7] = {1.0 / 28.0, 2.0 / 28.0, 3.0 / 28.0, 4.0 / 28.0, 5.0 / 28.0, 6.0 / 28.0, 7.0 / 28.0};');
 			///else

+ 9 - 9
armorpaint/Sources/MakeBrush.ts

@@ -5,13 +5,13 @@ class MakeBrush {
 
 		NodeShader.write(frag, 'float dist = 0.0;');
 
-		if (Context.raw.tool == workspace_tool_t.PARTICLE) return;
+		if (context_raw.tool == workspace_tool_t.PARTICLE) return;
 
-		let fill_layer: bool = Context.raw.layer.fill_layer != null;
-		let decal: bool = Context.raw.tool == workspace_tool_t.DECAL || Context.raw.tool == workspace_tool_t.TEXT;
+		let fill_layer: bool = context_raw.layer.fill_layer != null;
+		let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT;
 		if (decal && !fill_layer) NodeShader.write(frag, 'if (decalMask.z > 0.0) {');
 
-		if (Config.raw.brush_3d) {
+		if (config_raw.brush_3d) {
 			///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
 			NodeShader.write(frag, 'float depth = textureLod(gbufferD, inp.xy, 0.0).r;');
 			///else
@@ -24,7 +24,7 @@ class MakeBrush {
 			NodeShader.write(frag, 'winp.xyz /= winp.w;');
 			frag.wposition = true;
 
-			if (Config.raw.brush_angle_reject || Context.raw.xray) {
+			if (config_raw.brush_angle_reject || context_raw.xray) {
 				NodeShader.add_function(frag, ShaderFunctions.str_octahedron_wrap);
 				NodeShader.add_uniform(frag, 'sampler2D gbuffer0');
 				///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
@@ -38,10 +38,10 @@ class MakeBrush {
 				NodeShader.write(frag, 'wn = normalize(wn);');
 				NodeShader.write(frag, 'float planeDist = dot(wn, winp.xyz - wposition);');
 
-				if (Config.raw.brush_angle_reject && !Context.raw.xray) {
+				if (config_raw.brush_angle_reject && !context_raw.xray) {
 					NodeShader.write(frag, 'if (planeDist < -0.01) discard;');
 					frag.n = true;
-					let angle: f32 = Context.raw.brush_angle_reject_dot;
+					let angle: f32 = context_raw.brush_angle_reject_dot;
 					NodeShader.write(frag, `if (dot(wn, n) < ${angle}) discard;`);
 				}
 			}
@@ -57,12 +57,12 @@ class MakeBrush {
 			NodeShader.write(frag, 'winplast.xyz /= winplast.w;');
 
 			NodeShader.write(frag, 'vec3 pa = wposition - winp.xyz;');
-			if (Context.raw.xray) {
+			if (context_raw.xray) {
 				NodeShader.write(frag, 'pa += wn * vec3(planeDist, planeDist, planeDist);');
 			}
 			NodeShader.write(frag, 'vec3 ba = winplast.xyz - winp.xyz;');
 
-			if (Context.raw.brush_lazy_radius > 0 && Context.raw.brush_lazy_step > 0) {
+			if (context_raw.brush_lazy_radius > 0 && context_raw.brush_lazy_step > 0) {
 				// Sphere
 				NodeShader.write(frag, 'dist = distance(wposition, winp.xyz);');
 			}

+ 2 - 2
armorpaint/Sources/MakeClone.ts

@@ -25,10 +25,10 @@ class MakeClone {
 		NodeShader.write(frag, `float height = ${height};`);
 		NodeShader.write(frag, `float mat_opacity = ${opac};`);
 		NodeShader.write(frag, 'float opacity = mat_opacity * brushOpacity;');
-		if (Context.raw.material.paint_emis) {
+		if (context_raw.material.paint_emis) {
 			NodeShader.write(frag, 'float emis = 0.0;');
 		}
-		if (Context.raw.material.paint_subs) {
+		if (context_raw.material.paint_subs) {
 			NodeShader.write(frag, 'float subs = 0.0;');
 		}
 	}

+ 3 - 3
armorpaint/Sources/MakeColorIdPicker.ts

@@ -15,14 +15,14 @@ class MakeColorIdPicker {
 		NodeShader.write(frag, 'vec2 texCoordInp = texelFetch(gbuffer2, ivec2(inp.x * gbufferSize.x, (1.0 - inp.y) * gbufferSize.y), 0).ba;');
 		///end
 
-		if (Context.raw.tool == workspace_tool_t.COLORID) {
+		if (context_raw.tool == workspace_tool_t.COLORID) {
 			NodeShader.add_out(frag, 'vec4 fragColor');
 			NodeShader.add_uniform(frag, 'sampler2D texcolorid', '_texcolorid');
 			NodeShader.write(frag, 'vec3 idcol = textureLod(texcolorid, texCoordInp, 0.0).rgb;');
 			NodeShader.write(frag, 'fragColor = vec4(idcol, 1.0);');
 		}
-		else if (Context.raw.tool == workspace_tool_t.PICKER || Context.raw.tool == workspace_tool_t.MATERIAL) {
-			if (Context.raw.pick_pos_nor_tex) {
+		else if (context_raw.tool == workspace_tool_t.PICKER || context_raw.tool == workspace_tool_t.MATERIAL) {
+			if (context_raw.pick_pos_nor_tex) {
 				NodeShader.add_out(frag, 'vec4 fragColor[2]');
 				NodeShader.add_uniform(frag, 'sampler2D gbufferD');
 				NodeShader.add_uniform(frag, 'mat4 invVP', '_inv_view_proj_matrix');

+ 1 - 1
armorpaint/Sources/MakeDiscard.ts

@@ -44,7 +44,7 @@ class MakeDiscard {
 		NodeShader.write(frag, 'picker_sample_tc.y = 1.0 - picker_sample_tc.y;');
 		///end
 		NodeShader.add_uniform(frag, 'sampler2D texpaint_nor_undo', '_texpaint_nor_undo');
-		let matid: i32 = Context.raw.materialid_picked / 255;
+		let matid: i32 = context_raw.materialid_picked / 255;
 		NodeShader.write(frag, `if (${matid} != textureLod(texpaint_nor_undo, picker_sample_tc, 0.0).a) discard;`);
 	}
 }

+ 43 - 43
armorpaint/Sources/MakeMaterial.ts

@@ -14,7 +14,7 @@ class MakeMaterial {
 	}
 
 	static parse_mesh_material = () => {
-		let m: material_data_t = Project.materials[0].data;
+		let m: material_data_t = project_materials[0].data;
 
 		for (let c of m._.shader._.contexts) {
 			if (c.name == "mesh") {
@@ -63,7 +63,7 @@ class MakeMaterial {
 			let sampler: string = con.frag.shared_samplers[0];
 			scon._.override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
 		}
-		if (!Context.raw.texture_filter) {
+		if (!context_raw.texture_filter) {
 			scon._.override_context.filter = "point";
 		}
 		m._.shader.contexts.push(scon);
@@ -77,7 +77,7 @@ class MakeMaterial {
 				let sampler: string = con.frag.shared_samplers[0];
 				scon._.override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
 			}
-			if (!Context.raw.texture_filter) {
+			if (!context_raw.texture_filter) {
 				scon._.override_context.filter = "point";
 			}
 			m._.shader.contexts.push(scon);
@@ -89,7 +89,7 @@ class MakeMaterial {
 			m._.contexts.push(mcon);
 		}
 
-		Context.raw.ddirty = 2;
+		context_raw.ddirty = 2;
 
 		///if arm_voxels
 		MakeMaterial.make_voxel(m);
@@ -101,7 +101,7 @@ class MakeMaterial {
 	}
 
 	static parse_particle_material = () => {
-		let m: material_data_t = Context.raw.particle_material;
+		let m: material_data_t = context_raw.particle_material;
 		let sc: shader_context_t = null;
 		for (let c of m._.shader._.contexts) {
 			if (c.name == "mesh") {
@@ -123,7 +123,7 @@ class MakeMaterial {
 	static parse_mesh_preview_material = (md: material_data_t = null) => {
 		if (!MakeMaterial.get_mout()) return;
 
-		let m: material_data_t = md == null ? Project.materials[0].data : md;
+		let m: material_data_t = md == null ? project_materials[0].data : md;
 		let scon: shader_context_t = null;
 		for (let c of m._.shader._.contexts) {
 			if (c.name == "mesh") {
@@ -162,7 +162,7 @@ class MakeMaterial {
 	///if arm_voxels
 	static make_voxel = (m: material_data_t) => {
 		let rebuild: bool = MakeMaterial.height_used;
-		if (Config.raw.rp_gi != false && rebuild) {
+		if (config_raw.rp_gi != false && rebuild) {
 			let scon: shader_context_t = null;
 			for (let c of m._.shader._.contexts) {
 				if (c.name == "voxel") {
@@ -170,7 +170,7 @@ class MakeMaterial {
 					break;
 				}
 			}
-			if (scon != null) MakeVoxel.run(scon);
+			if (scon != null) make_voxel_run(scon);
 		}
 	}
 	///end
@@ -185,7 +185,7 @@ class MakeMaterial {
 			if (current != null) g2_begin(current);
 		}
 
-		let m: material_data_t = Project.materials[0].data;
+		let m: material_data_t = project_materials[0].data;
 		// let scon: TShaderContext = null;
 		// let mcon: TMaterialContext = null;
 		for (let c of m._.shader._.contexts) {
@@ -228,14 +228,14 @@ class MakeMaterial {
 	}
 
 	static bake_node_previews = () => {
-		Context.raw.node_previews_used = [];
-		if (Context.raw.node_previews == null) Context.raw.node_previews = new Map();
+		context_raw.node_previews_used = [];
+		if (context_raw.node_previews == null) context_raw.node_previews = new Map();
 		MakeMaterial.traverse_nodes(UINodes.get_canvas_material().nodes, null, []);
-		for (let key of Context.raw.node_previews.keys()) {
-			if (Context.raw.node_previews_used.indexOf(key) == -1) {
-				let image: image_t = Context.raw.node_previews.get(key);
+		for (let key of context_raw.node_previews.keys()) {
+			if (context_raw.node_previews_used.indexOf(key) == -1) {
+				let image: image_t = context_raw.node_previews.get(key);
 				base_notify_on_next_frame(function() { image_unload(image); });
-				Context.raw.node_previews.delete(key);
+				context_raw.node_previews.delete(key);
 			}
 		}
 	}
@@ -244,7 +244,7 @@ class MakeMaterial {
 		for (let node of nodes) {
 			MakeMaterial.bake_node_preview(node, group, parents);
 			if (node.type == "GROUP") {
-				for (let g of Project.material_groups) {
+				for (let g of project_material_groups) {
 					if (g.canvas.name == node.name) {
 						parents.push(node);
 						MakeMaterial.traverse_nodes(g.canvas.nodes, g.canvas, parents);
@@ -259,14 +259,14 @@ class MakeMaterial {
 	static bake_node_preview = (node: zui_node_t, group: zui_node_canvas_t, parents: zui_node_t[]) => {
 		if (node.type == "BLUR") {
 			let id: string = ParserMaterial.node_name(node, parents);
-			let image: image_t = Context.raw.node_previews.get(id);
-			Context.raw.node_previews_used.push(id);
-			let resX: i32 = Math.floor(Config.get_texture_res_x() / 4);
-			let resY: i32 = Math.floor(Config.get_texture_res_y() / 4);
+			let image: image_t = context_raw.node_previews.get(id);
+			context_raw.node_previews_used.push(id);
+			let resX: i32 = Math.floor(config_get_texture_res_x() / 4);
+			let resY: i32 = Math.floor(config_get_texture_res_y() / 4);
 			if (image == null || image.width != resX || image.height != resY) {
 				if (image != null) image_unload(image);
 				image = image_create_render_target(resX, resY);
-				Context.raw.node_previews.set(id, image);
+				context_raw.node_previews.set(id, image);
 			}
 
 			ParserMaterial.blur_passthrough = true;
@@ -275,14 +275,14 @@ class MakeMaterial {
 		}
 		else if (node.type == "DIRECT_WARP") {
 			let id: string = ParserMaterial.node_name(node, parents);
-			let image: image_t = Context.raw.node_previews.get(id);
-			Context.raw.node_previews_used.push(id);
-			let resX: i32 = Math.floor(Config.get_texture_res_x());
-			let resY: i32 = Math.floor(Config.get_texture_res_y());
+			let image: image_t = context_raw.node_previews.get(id);
+			context_raw.node_previews_used.push(id);
+			let resX: i32 = Math.floor(config_get_texture_res_x());
+			let resY: i32 = Math.floor(config_get_texture_res_y());
 			if (image == null || image.width != resX || image.height != resY) {
 				if (image != null) image_unload(image);
 				image = image_create_render_target(resX, resY);
-				Context.raw.node_previews.set(id, image);
+				context_raw.node_previews.set(id, image);
 			}
 
 			ParserMaterial.warp_passthrough = true;
@@ -291,14 +291,14 @@ class MakeMaterial {
 		}
 		else if (node.type == "BAKE_CURVATURE") {
 			let id: string = ParserMaterial.node_name(node, parents);
-			let image: image_t = Context.raw.node_previews.get(id);
-			Context.raw.node_previews_used.push(id);
-			let resX: i32 = Math.floor(Config.get_texture_res_x());
-			let resY: i32 = Math.floor(Config.get_texture_res_y());
+			let image: image_t = context_raw.node_previews.get(id);
+			context_raw.node_previews_used.push(id);
+			let resX: i32 = Math.floor(config_get_texture_res_x());
+			let resY: i32 = Math.floor(config_get_texture_res_y());
 			if (image == null || image.width != resX || image.height != resY) {
 				if (image != null) image_unload(image);
 				image = image_create_render_target(resX, resY, tex_format_t.R8);
-				Context.raw.node_previews.set(id, image);
+				context_raw.node_previews.set(id, image);
 			}
 
 			if (RenderPathPaint.live_layer == null) {
@@ -306,11 +306,11 @@ class MakeMaterial {
 			}
 
 			let _space: i32 = UIHeader.worktab.position;
-			let _tool: workspace_tool_t = Context.raw.tool;
-			let _bake_type: bake_type_t = Context.raw.bake_type;
+			let _tool: workspace_tool_t = context_raw.tool;
+			let _bake_type: bake_type_t = context_raw.bake_type;
 			UIHeader.worktab.position = space_type_t.SPACE3D;
-			Context.raw.tool = workspace_tool_t.BAKE;
-			Context.raw.bake_type = bake_type_t.CURVATURE;
+			context_raw.tool = workspace_tool_t.BAKE;
+			context_raw.bake_type = bake_type_t.CURVATURE;
 
 			ParserMaterial.bake_passthrough = true;
 			ParserMaterial.start_node = node;
@@ -321,16 +321,16 @@ class MakeMaterial {
 			ParserMaterial.start_node = null;
 			ParserMaterial.start_group = null;
 			ParserMaterial.start_parents = null;
-			Context.raw.pdirty = 1;
+			context_raw.pdirty = 1;
 			RenderPathPaint.use_live_layer(true);
 			RenderPathPaint.commands_paint(false);
 			RenderPathPaint.dilate(true, false);
 			RenderPathPaint.use_live_layer(false);
-			Context.raw.pdirty = 0;
+			context_raw.pdirty = 0;
 
 			UIHeader.worktab.position = _space;
-			Context.raw.tool = _tool;
-			Context.raw.bake_type = _bake_type;
+			context_raw.tool = _tool;
+			context_raw.bake_type = _bake_type;
 			MakeMaterial.parse_paint_material(false);
 
 			let rts: Map<string, render_target_t> = render_path_render_targets;
@@ -358,7 +358,7 @@ class MakeMaterial {
 	}
 
 	static parse_brush = () => {
-		ParserLogic.parse(Context.raw.brush.canvas);
+		ParserLogic.parse(context_raw.brush.canvas);
 	}
 
 	static blend_mode = (frag: NodeShaderRaw, blending: i32, cola: string, colb: string, opac: string): string => {
@@ -475,12 +475,12 @@ class MakeMaterial {
 	}
 
 	static get_displace_strength = (): f32 => {
-		let sc: f32 = Context.main_object().base.transform.scale.x;
-		return Config.raw.displace_strength * 0.02 * sc;
+		let sc: f32 = context_main_object().base.transform.scale.x;
+		return config_raw.displace_strength * 0.02 * sc;
 	}
 
 	static voxelgi_half_extents = (): string => {
-		let ext: f32 = Context.raw.vxao_ext;
+		let ext: f32 = context_raw.vxao_ext;
 		return `const vec3 voxelgiHalfExtents = vec3(${ext}, ${ext}, ${ext});`;
 	}
 

+ 42 - 42
armorpaint/Sources/MakeMesh.ts

@@ -9,7 +9,7 @@ class MakeMesh {
 			name: context_id,
 			depth_write: layerPass == 0 ? true : false,
 			compare_mode: layerPass == 0 ? "less" : "equal",
-			cull_mode: (Context.raw.cull_backfaces || layerPass > 0) ? "clockwise" : "none",
+			cull_mode: (context_raw.cull_backfaces || layerPass > 0) ? "clockwise" : "none",
 			vertex_elements: [{name: "pos", data: "short4norm"}, {name: "nor", data: "short2norm"}, {name: "tex", data: "short2norm"}],
 			color_attachments: ["RGBA64", "RGBA64", "RGBA64"],
 			depth_attachment: "DEPTH32"
@@ -32,7 +32,7 @@ class MakeMesh {
 			vert.n = true;
 			NodeShader.write(vert, 'float height = 0.0;');
 			let num_layers: i32 = 0;
-			for (let l of Project.layers) {
+			for (let l of project_layers) {
 				if (!SlotLayer.is_visible(l) || !l.paint_height || !SlotLayer.is_layer(l)) continue;
 				if (num_layers > 16) break;
 				num_layers++;
@@ -66,7 +66,7 @@ class MakeMesh {
 		frag.n = true;
 		NodeShader.add_function(frag, ShaderFunctions.str_pack_float_int16);
 
-		if (Context.raw.tool == workspace_tool_t.COLORID) {
+		if (context_raw.tool == workspace_tool_t.COLORID) {
 			texture_count++;
 			NodeShader.add_uniform(frag, 'sampler2D texcolorid', '_texcolorid');
 			NodeShader.write(frag, 'fragColor[0] = vec4(n.xy, 1.0, packFloatInt16(0.0, uint(0)));');
@@ -118,20 +118,20 @@ class MakeMesh {
 				NodeShader.write(frag, 'float height3 = 0.0;');
 			}
 
-			if (Context.raw.draw_wireframe) {
+			if (context_raw.draw_wireframe) {
 				texture_count++;
 				NodeShader.add_uniform(frag, 'sampler2D texuvmap', '_texuvmap');
 			}
 
-			if (Context.raw.viewport_mode == viewport_mode_t.MASK && SlotLayer.get_masks(Context.raw.layer) != null) {
-				for (let m of SlotLayer.get_masks(Context.raw.layer)) {
+			if (context_raw.viewport_mode == viewport_mode_t.MASK && SlotLayer.get_masks(context_raw.layer) != null) {
+				for (let m of SlotLayer.get_masks(context_raw.layer)) {
 					if (!SlotLayer.is_visible(m)) continue;
 					texture_count++;
-					NodeShader.add_uniform(frag, 'sampler2D texpaint_view_mask' + m.id, '_texpaint' + Project.layers.indexOf(m));
+					NodeShader.add_uniform(frag, 'sampler2D texpaint_view_mask' + m.id, '_texpaint' + project_layers.indexOf(m));
 				}
 			}
 
-			if (Context.raw.viewport_mode == viewport_mode_t.LIT && Context.raw.render_mode == render_mode_t.FORWARD) {
+			if (context_raw.viewport_mode == viewport_mode_t.LIT && context_raw.render_mode == render_mode_t.FORWARD) {
 				texture_count += 4;
 				NodeShader.add_uniform(frag, 'sampler2D senvmapBrdf', "$brdf.k");
 				NodeShader.add_uniform(frag, 'sampler2D senvmapRadiance', '_envmap_radiance');
@@ -143,9 +143,9 @@ class MakeMesh {
 			MakeMesh.layer_pass_count = 1;
 			let layers: SlotLayerRaw[] = [];
 			let start_count: i32 = texture_count;
-			let is_material_tool: bool = Context.raw.tool == workspace_tool_t.MATERIAL;
-			for (let l of Project.layers) {
-				if (is_material_tool && l != Context.raw.layer) continue;
+			let is_material_tool: bool = context_raw.tool == workspace_tool_t.MATERIAL;
+			for (let l of project_layers) {
+				if (is_material_tool && l != context_raw.layer) continue;
 				if (!SlotLayer.is_layer(l) || !SlotLayer.is_visible(l)) continue;
 
 				let count: i32 = 3;
@@ -166,8 +166,8 @@ class MakeMesh {
 			for (let l of layers) {
 				if (SlotLayer.get_object_mask(l) > 0) {
 					NodeShader.add_uniform(frag, 'int uid', '_uid');
-					if (SlotLayer.get_object_mask(l) > Project.paint_objects.length) { // Atlas
-						let visibles: mesh_object_t[] = Project.get_atlas_objects(SlotLayer.get_object_mask(l));
+					if (SlotLayer.get_object_mask(l) > project_paint_objects.length) { // Atlas
+						let visibles: mesh_object_t[] = project_get_atlas_objects(SlotLayer.get_object_mask(l));
 						NodeShader.write(frag, 'if (');
 						for (let i: i32 = 0; i < visibles.length; ++i) {
 							if (i > 0) NodeShader.write(frag, ' || ');
@@ -176,7 +176,7 @@ class MakeMesh {
 						NodeShader.write(frag, ') {');
 					}
 					else { // Object mask
-						let uid: i32 = Project.paint_objects[SlotLayer.get_object_mask(l) - 1].base.uid;
+						let uid: i32 = project_paint_objects[SlotLayer.get_object_mask(l) - 1].base.uid;
 						NodeShader.write(frag, `if (${uid} == uid) {`);
 					}
 				}
@@ -185,7 +185,7 @@ class MakeMesh {
 				NodeShader.write(frag, 'texpaint_sample = textureLodShared(texpaint' + l.id + ', texCoord, 0.0);');
 				NodeShader.write(frag, 'texpaint_opac = texpaint_sample.a;');
 				// ///if (krom_direct3d12 || krom_vulkan)
-				// if (Context.raw.viewportMode == ViewLit) {
+				// if (raw.viewportMode == ViewLit) {
 				// 	NodeShader.write(frag, 'if (texpaint_opac < 0.1) discard;');
 				// }
 				// ///end
@@ -219,7 +219,7 @@ class MakeMesh {
 				}
 
 				if (l.paint_base) {
-					if (l == Project.layers[0]) {
+					if (l == project_layers[0]) {
 						NodeShader.write(frag, 'basecol = texpaint_sample.rgb * texpaint_opac;');
 					}
 					else {
@@ -282,7 +282,7 @@ class MakeMesh {
 				}
 			}
 
-			if (last_pass && Context.raw.draw_texels) {
+			if (last_pass && context_raw.draw_texels) {
 				NodeShader.add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize');
 				NodeShader.write(frag, 'vec2 texel0 = texCoord * texpaintSize * 0.01;');
 				NodeShader.write(frag, 'vec2 texel1 = texCoord * texpaintSize * 0.1;');
@@ -292,7 +292,7 @@ class MakeMesh {
 				NodeShader.write(frag, 'basecol *= max(float(mod(int(texel2.x), 2.0) == mod(int(texel2.y), 2.0)), 0.9);');
 			}
 
-			if (last_pass && Context.raw.draw_wireframe) {
+			if (last_pass && context_raw.draw_wireframe) {
 				NodeShader.write(frag, 'basecol *= 1.0 - textureLod(texuvmap, texCoord, 0.0).r;');
 			}
 
@@ -330,14 +330,14 @@ class MakeMesh {
 			NodeShader.write(frag, 'n.y = -n.y;');
 			NodeShader.write(frag, 'n = normalize(mul(n, TBN));');
 
-			if (Context.raw.viewport_mode == viewport_mode_t.LIT || Context.raw.viewport_mode == viewport_mode_t.PATH_TRACE) {
+			if (context_raw.viewport_mode == viewport_mode_t.LIT || context_raw.viewport_mode == viewport_mode_t.PATH_TRACE) {
 				NodeShader.write(frag, 'basecol = pow(basecol, vec3(2.2, 2.2, 2.2));');
 
-				if (Context.raw.viewport_shader != null) {
-					let color: string = Context.raw.viewport_shader(frag);
+				if (context_raw.viewport_shader != null) {
+					let color: string = context_raw.viewport_shader(frag);
 					NodeShader.write(frag, `fragColor[1] = vec4(${color}, 1.0);`);
 				}
-				else if (Context.raw.render_mode == render_mode_t.FORWARD && Context.raw.viewport_mode != viewport_mode_t.PATH_TRACE) {
+				else if (context_raw.render_mode == render_mode_t.FORWARD && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) {
 					frag.wposition = true;
 					NodeShader.write(frag, 'vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);');
 					NodeShader.write(frag, 'vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);');
@@ -387,52 +387,52 @@ class MakeMesh {
 					NodeShader.write(frag, 'fragColor[1] = vec4(basecol, occlusion);');
 				}
 			}
-			else if (Context.raw.viewport_mode == viewport_mode_t.BASE_COLOR && Context.raw.layer.paint_base) {
+			else if (context_raw.viewport_mode == viewport_mode_t.BASE_COLOR && context_raw.layer.paint_base) {
 				NodeShader.write(frag, 'fragColor[1] = vec4(basecol, 1.0);');
 			}
-			else if (Context.raw.viewport_mode == viewport_mode_t.NORMAL_MAP && Context.raw.layer.paint_nor) {
+			else if (context_raw.viewport_mode == viewport_mode_t.NORMAL_MAP && context_raw.layer.paint_nor) {
 				NodeShader.write(frag, 'fragColor[1] = vec4(ntex.rgb, 1.0);');
 			}
-			else if (Context.raw.viewport_mode == viewport_mode_t.OCCLUSION && Context.raw.layer.paint_occ) {
+			else if (context_raw.viewport_mode == viewport_mode_t.OCCLUSION && context_raw.layer.paint_occ) {
 				NodeShader.write(frag, 'fragColor[1] = vec4(vec3(occlusion, occlusion, occlusion), 1.0);');
 			}
-			else if (Context.raw.viewport_mode == viewport_mode_t.ROUGHNESS && Context.raw.layer.paint_rough) {
+			else if (context_raw.viewport_mode == viewport_mode_t.ROUGHNESS && context_raw.layer.paint_rough) {
 				NodeShader.write(frag, 'fragColor[1] = vec4(vec3(roughness, roughness, roughness), 1.0);');
 			}
-			else if (Context.raw.viewport_mode == viewport_mode_t.METALLIC && Context.raw.layer.paint_met) {
+			else if (context_raw.viewport_mode == viewport_mode_t.METALLIC && context_raw.layer.paint_met) {
 				NodeShader.write(frag, 'fragColor[1] = vec4(vec3(metallic, metallic, metallic), 1.0);');
 			}
-			else if (Context.raw.viewport_mode == viewport_mode_t.OPACITY && Context.raw.layer.paint_opac) {
+			else if (context_raw.viewport_mode == viewport_mode_t.OPACITY && context_raw.layer.paint_opac) {
 				NodeShader.write(frag, 'fragColor[1] = vec4(vec3(texpaint_sample.a, texpaint_sample.a, texpaint_sample.a), 1.0);');
 			}
-			else if (Context.raw.viewport_mode == viewport_mode_t.HEIGHT && Context.raw.layer.paint_height) {
+			else if (context_raw.viewport_mode == viewport_mode_t.HEIGHT && context_raw.layer.paint_height) {
 				NodeShader.write(frag, 'fragColor[1] = vec4(vec3(height, height, height), 1.0);');
 			}
-			else if (Context.raw.viewport_mode == viewport_mode_t.EMISSION) {
+			else if (context_raw.viewport_mode == viewport_mode_t.EMISSION) {
 				NodeShader.write(frag, 'float emis = int(matid * 255.0) % 3 == 1 ? 1.0 : 0.0;');
 				NodeShader.write(frag, 'fragColor[1] = vec4(vec3(emis, emis, emis), 1.0);');
 			}
-			else if (Context.raw.viewport_mode == viewport_mode_t.SUBSURFACE) {
+			else if (context_raw.viewport_mode == viewport_mode_t.SUBSURFACE) {
 				NodeShader.write(frag, 'float subs = int(matid * 255.0) % 3 == 2 ? 1.0 : 0.0;');
 				NodeShader.write(frag, 'fragColor[1] = vec4(vec3(subs, subs, subs), 1.0);');
 			}
-			else if (Context.raw.viewport_mode == viewport_mode_t.TEXCOORD) {
+			else if (context_raw.viewport_mode == viewport_mode_t.TEXCOORD) {
 				NodeShader.write(frag, 'fragColor[1] = vec4(texCoord, 0.0, 1.0);');
 			}
-			else if (Context.raw.viewport_mode == viewport_mode_t.OBJECT_NORMAL) {
+			else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_NORMAL) {
 				frag.nattr = true;
 				NodeShader.write(frag, 'fragColor[1] = vec4(nAttr, 1.0);');
 			}
-			else if (Context.raw.viewport_mode == viewport_mode_t.MATERIAL_ID) {
-				NodeShader.add_shared_sampler(frag, 'sampler2D texpaint_nor' + Context.raw.layer.id);
+			else if (context_raw.viewport_mode == viewport_mode_t.MATERIAL_ID) {
+				NodeShader.add_shared_sampler(frag, 'sampler2D texpaint_nor' + context_raw.layer.id);
 				NodeShader.add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize');
-				NodeShader.write(frag, 'float sample_matid = texelFetch(texpaint_nor' + Context.raw.layer.id + ', ivec2(texCoord * texpaintSize), 0).a + 1.0 / 255.0;');
+				NodeShader.write(frag, 'float sample_matid = texelFetch(texpaint_nor' + context_raw.layer.id + ', ivec2(texCoord * texpaintSize), 0).a + 1.0 / 255.0;');
 				NodeShader.write(frag, 'float matid_r = fract(sin(dot(vec2(sample_matid, sample_matid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);');
 				NodeShader.write(frag, 'float matid_g = fract(sin(dot(vec2(sample_matid * 20.0, sample_matid), vec2(12.9898, 78.233))) * 43758.5453);');
 				NodeShader.write(frag, 'float matid_b = fract(sin(dot(vec2(sample_matid, sample_matid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);');
 				NodeShader.write(frag, 'fragColor[1] = vec4(matid_r, matid_g, matid_b, 1.0);');
 			}
-			else if (Context.raw.viewport_mode == viewport_mode_t.OBJECT_ID) {
+			else if (context_raw.viewport_mode == viewport_mode_t.OBJECT_ID) {
 				NodeShader.add_uniform(frag, 'float objectId', '_objectId');
 				NodeShader.write(frag, 'float obid = objectId + 1.0 / 255.0;');
 				NodeShader.write(frag, 'float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);');
@@ -440,13 +440,13 @@ class MakeMesh {
 				NodeShader.write(frag, 'float id_b = fract(sin(dot(vec2(obid, obid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);');
 				NodeShader.write(frag, 'fragColor[1] = vec4(id_r, id_g, id_b, 1.0);');
 			}
-			else if (Context.raw.viewport_mode == viewport_mode_t.MASK && (SlotLayer.get_masks(Context.raw.layer) != null || SlotLayer.is_mask(Context.raw.layer))) {
-				if (SlotLayer.is_mask(Context.raw.layer)) {
-					NodeShader.write(frag, 'float mask_view = textureLodShared(texpaint' + Context.raw.layer.id + ', texCoord, 0.0).r;');
+			else if (context_raw.viewport_mode == viewport_mode_t.MASK && (SlotLayer.get_masks(context_raw.layer) != null || SlotLayer.is_mask(context_raw.layer))) {
+				if (SlotLayer.is_mask(context_raw.layer)) {
+					NodeShader.write(frag, 'float mask_view = textureLodShared(texpaint' + context_raw.layer.id + ', texCoord, 0.0).r;');
 				}
 				else {
 					NodeShader.write(frag, 'float mask_view = 0.0;');
-					for (let m of SlotLayer.get_masks(Context.raw.layer)) {
+					for (let m of SlotLayer.get_masks(context_raw.layer)) {
 						if (!SlotLayer.is_visible(m)) continue;
 						NodeShader.write(frag, 'float mask_sample' + m.id + ' = textureLodShared(texpaint_view_mask' + m.id + ', texCoord, 0.0).r;');
 						NodeShader.write(frag, 'mask_view = ' + MakeMaterial.blend_mode_mask(frag, m.blending, 'mask_view', 'mask_sample' + m.id, 'float(' + SlotLayer.get_opacity(m) + ')') + ';');
@@ -458,7 +458,7 @@ class MakeMesh {
 				NodeShader.write(frag, 'fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);'); // Pink
 			}
 
-			if (Context.raw.viewport_mode != viewport_mode_t.LIT && Context.raw.viewport_mode != viewport_mode_t.PATH_TRACE) {
+			if (context_raw.viewport_mode != viewport_mode_t.LIT && context_raw.viewport_mode != viewport_mode_t.PATH_TRACE) {
 				NodeShader.write(frag, 'fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));');
 			}
 

+ 4 - 4
armorpaint/Sources/MakeMeshPreview.ts

@@ -21,7 +21,7 @@ class MakeMeshPreview {
 		let pos: string = "pos";
 
 		///if arm_skin
-		let skin: bool = mesh_data_get_vertex_array(Context.raw.paint_object.data, "bone") != null;
+		let skin: bool = mesh_data_get_vertex_array(context_raw.paint_object.data, "bone") != null;
 		if (skin) {
 			pos = "spos";
 			NodeShaderContext.add_elem(con_mesh, "bone", 'short4norm');
@@ -43,11 +43,11 @@ class MakeMeshPreview {
 		NodeShader.add_uniform(vert, 'mat4 WVP', '_world_view_proj_matrix');
 		NodeShader.write_attrib(vert, `gl_Position = mul(vec4(${pos}.xyz, 1.0), WVP);`);
 
-		let brush_scale: string = (Context.raw.brush_scale * Context.raw.brush_nodes_scale) + "";
+		let brush_scale: string = (context_raw.brush_scale * context_raw.brush_nodes_scale) + "";
 		NodeShader.add_out(vert, 'vec2 texCoord');
 		NodeShader.write_attrib(vert, `texCoord = tex * float(${brush_scale});`);
 
-		let decal: bool = Context.raw.decal_preview;
+		let decal: bool = context_raw.decal_preview;
 		ParserMaterial.sample_keep_aspect = decal;
 		ParserMaterial.sample_uv_scale = brush_scale;
 		ParserMaterial.parse_height = MakeMaterial.height_used;
@@ -82,7 +82,7 @@ class MakeMeshPreview {
 		// }
 
 		if (decal) {
-			if (Context.raw.tool == workspace_tool_t.TEXT) {
+			if (context_raw.tool == workspace_tool_t.TEXT) {
 				NodeShader.add_uniform(frag, 'sampler2D textexttool', '_textexttool');
 				NodeShader.write(frag, `opacity *= textureLod(textexttool, texCoord / float(${brush_scale}), 0.0).r;`);
 			}

+ 4 - 4
armorpaint/Sources/MakeNodePreview.ts

@@ -26,15 +26,15 @@ class MakeNodePreview {
 		///end
 
 		ParserMaterial.init();
-		ParserMaterial.canvases = [Context.raw.material.canvas];
-		ParserMaterial.nodes = Context.raw.material.canvas.nodes;
-		ParserMaterial.links = Context.raw.material.canvas.links;
+		ParserMaterial.canvases = [context_raw.material.canvas];
+		ParserMaterial.nodes = context_raw.material.canvas.nodes;
+		ParserMaterial.links = context_raw.material.canvas.links;
 		if (group != null) {
 			ParserMaterial.push_group(group);
 			ParserMaterial.parents = parents;
 		}
 		let links: zui_node_link_t[] = ParserMaterial.links;
-		let link: zui_node_link_t = { id: zui_get_link_id(links), from_id: node.id, from_socket: Context.raw.node_preview_socket, to_id: -1, to_socket: -1 };
+		let link: zui_node_link_t = { id: zui_get_link_id(links), from_id: node.id, from_socket: context_raw.node_preview_socket, to_id: -1, to_socket: -1 };
 		links.push(link);
 
 		ParserMaterial.con = con_mesh;

+ 83 - 83
armorpaint/Sources/MakePaint.ts

@@ -5,7 +5,7 @@ class MakePaint {
 
 	static get is_raytraced_bake(): bool {
 		///if (krom_direct3d12 || krom_vulkan || krom_metal)
-		return Context.raw.bake_type == bake_type_t.INIT;
+		return context_raw.bake_type == bake_type_t.INIT;
 		///else
 		return false;
 		///end
@@ -22,10 +22,10 @@ class MakePaint {
 			cull_mode: "none",
 			vertex_elements: [{name: "pos", data: "short4norm"}, {name: "nor", data: "short2norm"}, {name: "tex", data: "short2norm"}],
 			color_attachments:
-				Context.raw.tool == workspace_tool_t.COLORID ? ["RGBA32"] :
-				(Context.raw.tool == workspace_tool_t.PICKER && Context.raw.pick_pos_nor_tex) ? ["RGBA128", "RGBA128"] :
-				(Context.raw.tool == workspace_tool_t.PICKER || Context.raw.tool == workspace_tool_t.MATERIAL) ? ["RGBA32", "RGBA32", "RGBA32", "RGBA32"] :
-				(Context.raw.tool == workspace_tool_t.BAKE && MakePaint.is_raytraced_bake) ? ["RGBA64", "RGBA64"] :
+				context_raw.tool == workspace_tool_t.COLORID ? ["RGBA32"] :
+				(context_raw.tool == workspace_tool_t.PICKER && context_raw.pick_pos_nor_tex) ? ["RGBA128", "RGBA128"] :
+				(context_raw.tool == workspace_tool_t.PICKER || context_raw.tool == workspace_tool_t.MATERIAL) ? ["RGBA32", "RGBA32", "RGBA32", "RGBA32"] :
+				(context_raw.tool == workspace_tool_t.BAKE && MakePaint.is_raytraced_bake) ? ["RGBA64", "RGBA64"] :
 					["RGBA32", "RGBA32", "RGBA32", "R8"]
 		});
 
@@ -33,14 +33,14 @@ class MakePaint {
 		con_paint.data.color_writes_green = [true, true, true, true];
 		con_paint.data.color_writes_blue = [true, true, true, true];
 		con_paint.data.color_writes_alpha = [true, true, true, true];
-		con_paint.allow_vcols = mesh_data_get_vertex_array(Context.raw.paint_object.data, 'col') != null;
+		con_paint.allow_vcols = mesh_data_get_vertex_array(context_raw.paint_object.data, 'col') != null;
 
 		let vert: NodeShaderRaw = NodeShaderContext.make_vert(con_paint);
 		let frag: NodeShaderRaw = NodeShaderContext.make_frag(con_paint);
 		frag.ins = vert.outs;
 
 		///if (krom_direct3d12 || krom_vulkan || krom_metal)
-		if (Context.raw.tool == workspace_tool_t.BAKE && Context.raw.bake_type == bake_type_t.INIT) {
+		if (context_raw.tool == workspace_tool_t.BAKE && context_raw.bake_type == bake_type_t.INIT) {
 			// Init raytraced bake
 			MakeBake.position_normal(vert, frag);
 			con_paint.data.shader_from_source = true;
@@ -50,11 +50,11 @@ class MakePaint {
 		}
 		///end
 
-		if (Context.raw.tool == workspace_tool_t.BAKE) {
+		if (context_raw.tool == workspace_tool_t.BAKE) {
 			MakeBake.set_color_writes(con_paint);
 		}
 
-		if (Context.raw.tool == workspace_tool_t.COLORID || Context.raw.tool == workspace_tool_t.PICKER || Context.raw.tool == workspace_tool_t.MATERIAL) {
+		if (context_raw.tool == workspace_tool_t.COLORID || context_raw.tool == workspace_tool_t.PICKER || context_raw.tool == workspace_tool_t.MATERIAL) {
 			MakeColorIdPicker.run(vert, frag);
 			con_paint.data.shader_from_source = true;
 			con_paint.data.vertex_shader = NodeShader.get(vert);
@@ -62,9 +62,9 @@ class MakePaint {
 			return con_paint;
 		}
 
-		let face_fill: bool = Context.raw.tool == workspace_tool_t.FILL && Context.raw.fill_type_handle.position == fill_type_t.FACE;
-		let uv_island_fill: bool = Context.raw.tool == workspace_tool_t.FILL && Context.raw.fill_type_handle.position == fill_type_t.UV_ISLAND;
-		let decal: bool = Context.raw.tool == workspace_tool_t.DECAL || Context.raw.tool == workspace_tool_t.TEXT;
+		let face_fill: bool = context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.FACE;
+		let uv_island_fill: bool = context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.UV_ISLAND;
+		let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT;
 
 		///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
 		NodeShader.write(vert, 'vec2 tpos = vec2(tex.x * 2.0 - 1.0, (1.0 - tex.y) * 2.0 - 1.0);');
@@ -74,7 +74,7 @@ class MakePaint {
 
 		NodeShader.write(vert, 'gl_Position = vec4(tpos, 0.0, 1.0);');
 
-		let decal_layer: bool = Context.raw.layer.fill_layer != null && Context.raw.layer.uv_type == uv_type_t.PROJECT;
+		let decal_layer: bool = context_raw.layer.fill_layer != null && context_raw.layer.uv_type == uv_type_t.PROJECT;
 		if (decal_layer) {
 			NodeShader.add_uniform(vert, 'mat4 WVP', '_decalLayerMatrix');
 		}
@@ -89,7 +89,7 @@ class MakePaint {
 		NodeShader.write_attrib(frag, 'sp.y = 1.0 - sp.y;');
 		NodeShader.write_attrib(frag, 'sp.z -= 0.0001;'); // small bias
 
-		let uv_type: uv_type_t = Context.raw.layer.fill_layer != null ? Context.raw.layer.uv_type : Context.raw.brush_paint;
+		let uv_type: uv_type_t = context_raw.layer.fill_layer != null ? context_raw.layer.uv_type : context_raw.brush_paint;
 		if (uv_type == uv_type_t.PROJECT) frag.ndcpos = true;
 
 		NodeShader.add_uniform(frag, 'vec4 inp', '_inputBrush');
@@ -107,21 +107,21 @@ class MakePaint {
 		NodeShader.add_uniform(frag, 'float brushOpacity', '_brushOpacity');
 		NodeShader.add_uniform(frag, 'float brushHardness', '_brushHardness');
 
-		if (Context.raw.tool == workspace_tool_t.BRUSH  ||
-			Context.raw.tool == workspace_tool_t.ERASER ||
-			Context.raw.tool == workspace_tool_t.CLONE  ||
-			Context.raw.tool == workspace_tool_t.BLUR   ||
-			Context.raw.tool == workspace_tool_t.SMUDGE   ||
-			Context.raw.tool == workspace_tool_t.PARTICLE ||
+		if (context_raw.tool == workspace_tool_t.BRUSH  ||
+			context_raw.tool == workspace_tool_t.ERASER ||
+			context_raw.tool == workspace_tool_t.CLONE  ||
+			context_raw.tool == workspace_tool_t.BLUR   ||
+			context_raw.tool == workspace_tool_t.SMUDGE   ||
+			context_raw.tool == workspace_tool_t.PARTICLE ||
 			decal) {
 
-			let depth_reject: bool = !Context.raw.xray;
-			if (Config.raw.brush_3d && !Config.raw.brush_depth_reject) depth_reject = false;
+			let depth_reject: bool = !context_raw.xray;
+			if (config_raw.brush_3d && !config_raw.brush_depth_reject) depth_reject = false;
 
 			// TODO: sp.z needs to take height channel into account
-			let particle: bool = Context.raw.tool == workspace_tool_t.PARTICLE;
-			if (Config.raw.brush_3d && !decal && !particle) {
-				if (MakeMaterial.height_used || Context.raw.sym_x || Context.raw.sym_y || Context.raw.sym_z) depth_reject = false;
+			let particle: bool = context_raw.tool == workspace_tool_t.PARTICLE;
+			if (config_raw.brush_3d && !decal && !particle) {
+				if (MakeMaterial.height_used || context_raw.sym_x || context_raw.sym_y || context_raw.sym_z) depth_reject = false;
 			}
 
 			if (depth_reject) {
@@ -136,7 +136,7 @@ class MakePaint {
 		}
 		else { // Fill, Bake
 			NodeShader.write(frag, 'float dist = 0.0;');
-			let angle_fill: bool = Context.raw.tool == workspace_tool_t.FILL && Context.raw.fill_type_handle.position == fill_type_t.ANGLE;
+			let angle_fill: bool = context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.ANGLE;
 			if (angle_fill) {
 				NodeShader.add_function(frag, ShaderFunctions.str_octahedron_wrap);
 				NodeShader.add_uniform(frag, 'sampler2D gbuffer0');
@@ -146,10 +146,10 @@ class MakePaint {
 				NodeShader.write(frag, 'wn.xy = wn.z >= 0.0 ? g0.xy : octahedronWrap(g0.xy);');
 				NodeShader.write(frag, 'wn = normalize(wn);');
 				frag.n = true;
-				let angle: f32 = Context.raw.brush_angle_reject_dot;
+				let angle: f32 = context_raw.brush_angle_reject_dot;
 				NodeShader.write(frag, `if (dot(wn, n) < ${angle}) discard;`);
 			}
-			let stencil_fill: bool = Context.raw.tool == workspace_tool_t.FILL && Context.raw.brush_stencil_image != null;
+			let stencil_fill: bool = context_raw.tool == workspace_tool_t.FILL && context_raw.brush_stencil_image != null;
 			if (stencil_fill) {
 				///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
 				NodeShader.write(frag, 'if (sp.z > textureLod(gbufferD, sp.xy, 0.0).r + 0.0005) discard;');
@@ -159,10 +159,10 @@ class MakePaint {
 			}
 		}
 
-		if (Context.raw.colorid_picked || face_fill || uv_island_fill) {
+		if (context_raw.colorid_picked || face_fill || uv_island_fill) {
 			NodeShader.add_out(vert, 'vec2 texCoordPick');
 			NodeShader.write(vert, 'texCoordPick = tex;');
-			if (Context.raw.colorid_picked) {
+			if (context_raw.colorid_picked) {
 				MakeDiscard.color_id(vert, frag);
 			}
 			if (face_fill) {
@@ -173,20 +173,20 @@ class MakePaint {
 			}
 		}
 
-		if (Context.raw.picker_mask_handle.position == picker_mask_t.MATERIAL) {
+		if (context_raw.picker_mask_handle.position == picker_mask_t.MATERIAL) {
 			MakeDiscard.material_id(vert, frag);
 		}
 
 		MakeTexcoord.run(vert, frag);
 
-		if (Context.raw.tool == workspace_tool_t.CLONE || Context.raw.tool == workspace_tool_t.BLUR || Context.raw.tool == workspace_tool_t.SMUDGE) {
+		if (context_raw.tool == workspace_tool_t.CLONE || context_raw.tool == workspace_tool_t.BLUR || context_raw.tool == workspace_tool_t.SMUDGE) {
 			NodeShader.add_uniform(frag, 'sampler2D gbuffer2');
 			NodeShader.add_uniform(frag, 'vec2 gbufferSize', '_gbufferSize');
 			NodeShader.add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo');
 			NodeShader.add_uniform(frag, 'sampler2D texpaint_nor_undo', '_texpaint_nor_undo');
 			NodeShader.add_uniform(frag, 'sampler2D texpaint_pack_undo', '_texpaint_pack_undo');
 
-			if (Context.raw.tool == workspace_tool_t.CLONE) {
+			if (context_raw.tool == workspace_tool_t.CLONE) {
 				MakeClone.run(vert, frag);
 			}
 			else { // Blur, Smudge
@@ -194,11 +194,11 @@ class MakePaint {
 			}
 		}
 		else {
-			ParserMaterial.parse_emission = Context.raw.material.paint_emis;
-			ParserMaterial.parse_subsurface = Context.raw.material.paint_subs;
-			ParserMaterial.parse_height = Context.raw.material.paint_height;
+			ParserMaterial.parse_emission = context_raw.material.paint_emis;
+			ParserMaterial.parse_subsurface = context_raw.material.paint_subs;
+			ParserMaterial.parse_height = context_raw.material.paint_height;
 			ParserMaterial.parse_height_as_channel = true;
-			let uv_type: uv_type_t = Context.raw.layer.fill_layer != null ? Context.raw.layer.uv_type : Context.raw.brush_paint;
+			let uv_type: uv_type_t = context_raw.layer.fill_layer != null ? context_raw.layer.uv_type : context_raw.brush_paint;
 			ParserMaterial.triplanar = uv_type == uv_type_t.TRIPLANAR && !decal;
 			ParserMaterial.sample_keep_aspect = decal;
 			ParserMaterial.sample_uv_scale = 'brushScale';
@@ -224,13 +224,13 @@ class MakePaint {
 			NodeShader.write(frag, `float height = ${height};`);
 			NodeShader.write(frag, `float mat_opacity = ${opac};`);
 			NodeShader.write(frag, 'float opacity = mat_opacity;');
-			if (Context.raw.layer.fill_layer == null) {
+			if (context_raw.layer.fill_layer == null) {
 				NodeShader.write(frag, 'opacity *= brushOpacity;');
 			}
-			if (Context.raw.material.paint_emis) {
+			if (context_raw.material.paint_emis) {
 				NodeShader.write(frag, `float emis = ${emis};`);
 			}
-			if (Context.raw.material.paint_subs) {
+			if (context_raw.material.paint_subs) {
 				NodeShader.write(frag, `float subs = ${subs};`);
 			}
 			if (parseFloat(height) != 0.0 && !MakeMaterial.height_used) {
@@ -242,29 +242,29 @@ class MakePaint {
 			if (parseFloat(subs) != 0.0) MakeMaterial.subs_used = true;
 		}
 
-		if (Context.raw.brush_mask_image != null && Context.raw.tool == workspace_tool_t.DECAL) {
+		if (context_raw.brush_mask_image != null && context_raw.tool == workspace_tool_t.DECAL) {
 			NodeShader.add_uniform(frag, 'sampler2D texbrushmask', '_texbrushmask');
 			NodeShader.write(frag, 'vec4 mask_sample = textureLod(texbrushmask, uvsp, 0.0);');
-			if (Context.raw.brush_mask_image_is_alpha) {
+			if (context_raw.brush_mask_image_is_alpha) {
 				NodeShader.write(frag, 'opacity *= mask_sample.a;');
 			}
 			else {
 				NodeShader.write(frag, 'opacity *= mask_sample.r * mask_sample.a;');
 			}
 		}
-		else if (Context.raw.tool == workspace_tool_t.TEXT) {
+		else if (context_raw.tool == workspace_tool_t.TEXT) {
 			NodeShader.add_uniform(frag, 'sampler2D textexttool', '_textexttool');
 			NodeShader.write(frag, 'opacity *= textureLod(textexttool, uvsp, 0.0).r;');
 		}
 
-		if (Context.raw.brush_stencil_image != null && (
-			Context.raw.tool == workspace_tool_t.BRUSH  ||
-			Context.raw.tool == workspace_tool_t.ERASER ||
-			Context.raw.tool == workspace_tool_t.FILL ||
-			Context.raw.tool == workspace_tool_t.CLONE  ||
-			Context.raw.tool == workspace_tool_t.BLUR   ||
-			Context.raw.tool == workspace_tool_t.SMUDGE   ||
-			Context.raw.tool == workspace_tool_t.PARTICLE ||
+		if (context_raw.brush_stencil_image != null && (
+			context_raw.tool == workspace_tool_t.BRUSH  ||
+			context_raw.tool == workspace_tool_t.ERASER ||
+			context_raw.tool == workspace_tool_t.FILL ||
+			context_raw.tool == workspace_tool_t.CLONE  ||
+			context_raw.tool == workspace_tool_t.BLUR   ||
+			context_raw.tool == workspace_tool_t.SMUDGE   ||
+			context_raw.tool == workspace_tool_t.PARTICLE ||
 			decal)) {
 			NodeShader.add_uniform(frag, 'sampler2D texbrushstencil', '_texbrushstencil');
 			NodeShader.add_uniform(frag, 'vec4 stencilTransform', '_stencilTransform');
@@ -278,7 +278,7 @@ class MakePaint {
 			NodeShader.write(frag, 'stencil_uv.x *= stencil_ratio;');
 			NodeShader.write(frag, 'if (stencil_uv.x < 0 || stencil_uv.x > 1 || stencil_uv.y < 0 || stencil_uv.y > 1) discard;');
 			NodeShader.write(frag, 'vec4 texbrushstencil_sample = textureLod(texbrushstencil, stencil_uv, 0.0);');
-			if (Context.raw.brush_stencil_image_is_alpha) {
+			if (context_raw.brush_stencil_image_is_alpha) {
 				NodeShader.write(frag, 'opacity *= texbrushstencil_sample.a;');
 			}
 			else {
@@ -286,30 +286,30 @@ class MakePaint {
 			}
 		}
 
-		if (Context.raw.brush_mask_image != null && (Context.raw.tool == workspace_tool_t.BRUSH || Context.raw.tool == workspace_tool_t.ERASER)) {
+		if (context_raw.brush_mask_image != null && (context_raw.tool == workspace_tool_t.BRUSH || context_raw.tool == workspace_tool_t.ERASER)) {
 			NodeShader.add_uniform(frag, 'sampler2D texbrushmask', '_texbrushmask');
 			NodeShader.write(frag, 'vec2 binp_mask = inp.xy * 2.0 - 1.0;');
 			NodeShader.write(frag, 'binp_mask.x *= aspectRatio;');
 			NodeShader.write(frag, 'binp_mask = binp_mask * 0.5 + 0.5;');
 			NodeShader.write(frag, 'vec2 pa_mask = bsp.xy - binp_mask.xy;');
-			if (Context.raw.brush_directional) {
+			if (context_raw.brush_directional) {
 				NodeShader.add_uniform(frag, 'vec3 brushDirection', '_brushDirection');
 				NodeShader.write(frag, 'if (brushDirection.z == 0.0) discard;');
 				NodeShader.write(frag, 'pa_mask = vec2(pa_mask.x * brushDirection.x - pa_mask.y * brushDirection.y, pa_mask.x * brushDirection.y + pa_mask.y * brushDirection.x);');
 			}
-			let angle: f32 = Context.raw.brush_angle + Context.raw.brush_nodes_angle;
+			let angle: f32 = context_raw.brush_angle + context_raw.brush_nodes_angle;
 			if (angle != 0.0) {
 				NodeShader.add_uniform(frag, 'vec2 brushAngle', '_brushAngle');
 				NodeShader.write(frag, 'pa_mask.xy = vec2(pa_mask.x * brushAngle.x - pa_mask.y * brushAngle.y, pa_mask.x * brushAngle.y + pa_mask.y * brushAngle.x);');
 			}
 			NodeShader.write(frag, 'pa_mask /= brushRadius;');
-			if (Config.raw.brush_3d) {
+			if (config_raw.brush_3d) {
 				NodeShader.add_uniform(frag, 'vec3 eye', '_camera_pos');
 				NodeShader.write(frag, 'pa_mask *= distance(eye, winp.xyz) / 1.5;');
 			}
 			NodeShader.write(frag, 'pa_mask = pa_mask.xy * 0.5 + 0.5;');
 			NodeShader.write(frag, 'vec4 mask_sample = textureLod(texbrushmask, pa_mask, 0.0);');
-			if (Context.raw.brush_mask_image_is_alpha) {
+			if (context_raw.brush_mask_image_is_alpha) {
 				NodeShader.write(frag, 'opacity *= mask_sample.a;');
 			}
 			else {
@@ -319,7 +319,7 @@ class MakePaint {
 
 		NodeShader.write(frag, 'if (opacity == 0.0) discard;');
 
-		if (Context.raw.tool == workspace_tool_t.PARTICLE) { // Particle mask
+		if (context_raw.tool == workspace_tool_t.PARTICLE) { // Particle mask
 			MakeParticle.mask(vert, frag);
 		}
 		else { // Brush cursor mask
@@ -340,31 +340,31 @@ class MakePaint {
 		NodeShader.add_uniform(frag, 'sampler2D texpaint_undo', '_texpaint_undo');
 		NodeShader.write(frag, 'vec4 sample_undo = textureLod(texpaint_undo, sample_tc, 0.0);');
 
-		let matid: f32 = Context.raw.material.id / 255;
-		if (Context.raw.picker_mask_handle.position == picker_mask_t.MATERIAL) {
-			matid = Context.raw.materialid_picked / 255; // Keep existing material id in place when mask is set
+		let matid: f32 = context_raw.material.id / 255;
+		if (context_raw.picker_mask_handle.position == picker_mask_t.MATERIAL) {
+			matid = context_raw.materialid_picked / 255; // Keep existing material id in place when mask is set
 		}
 		let matid_string: string = ParserMaterial.vec1(matid * 3.0);
 		NodeShader.write(frag, `float matid = ${matid_string};`);
 
 		// matid % 3 == 0 - normal, 1 - emission, 2 - subsurface
-		if (Context.raw.material.paint_emis) {
+		if (context_raw.material.paint_emis) {
 			NodeShader.write(frag, 'if (emis > 0.0) {');
 			NodeShader.write(frag, '	matid += 1.0 / 255.0;');
 			NodeShader.write(frag, '	if (str == 0.0) discard;');
 			NodeShader.write(frag, '}');
 		}
-		else if (Context.raw.material.paint_subs) {
+		else if (context_raw.material.paint_subs) {
 			NodeShader.write(frag, 'if (subs > 0.0) {');
 			NodeShader.write(frag, '    matid += 2.0 / 255.0;');
 			NodeShader.write(frag, '	if (str == 0.0) discard;');
 			NodeShader.write(frag, '}');
 		}
 
-		let is_mask: bool = SlotLayer.is_mask(Context.raw.layer);
-		let layered: bool = Context.raw.layer != Project.layers[0];
+		let is_mask: bool = SlotLayer.is_mask(context_raw.layer);
+		let layered: bool = context_raw.layer != project_layers[0];
 		if (layered && !is_mask) {
-			if (Context.raw.tool == workspace_tool_t.ERASER) {
+			if (context_raw.tool == workspace_tool_t.ERASER) {
 				NodeShader.write(frag, 'fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);');
 				NodeShader.write(frag, 'nortan = vec3(0.5, 0.5, 1.0);');
 				NodeShader.write(frag, 'occlusion = 1.0;');
@@ -372,21 +372,21 @@ class MakePaint {
 				NodeShader.write(frag, 'metallic = 0.0;');
 				NodeShader.write(frag, 'matid = 0.0;');
 			}
-			else if (Context.raw.tool == workspace_tool_t.PARTICLE || decal || Context.raw.brush_mask_image != null) {
-				NodeShader.write(frag, 'fragColor[0] = vec4(' + MakeMaterial.blend_mode(frag, Context.raw.brush_blending, 'sample_undo.rgb', 'basecol', 'str') + ', max(str, sample_undo.a));');
+			else if (context_raw.tool == workspace_tool_t.PARTICLE || decal || context_raw.brush_mask_image != null) {
+				NodeShader.write(frag, 'fragColor[0] = vec4(' + MakeMaterial.blend_mode(frag, context_raw.brush_blending, 'sample_undo.rgb', 'basecol', 'str') + ', max(str, sample_undo.a));');
 			}
 			else {
-				if (Context.raw.layer.fill_layer != null) {
-					NodeShader.write(frag, 'fragColor[0] = vec4(' + MakeMaterial.blend_mode(frag, Context.raw.brush_blending, 'sample_undo.rgb', 'basecol', 'opacity') + ', mat_opacity);');
+				if (context_raw.layer.fill_layer != null) {
+					NodeShader.write(frag, 'fragColor[0] = vec4(' + MakeMaterial.blend_mode(frag, context_raw.brush_blending, 'sample_undo.rgb', 'basecol', 'opacity') + ', mat_opacity);');
 				}
 				else {
-					NodeShader.write(frag, 'fragColor[0] = vec4(' + MakeMaterial.blend_mode(frag, Context.raw.brush_blending, 'sample_undo.rgb', 'basecol', 'opacity') + ', max(str, sample_undo.a));');
+					NodeShader.write(frag, 'fragColor[0] = vec4(' + MakeMaterial.blend_mode(frag, context_raw.brush_blending, 'sample_undo.rgb', 'basecol', 'opacity') + ', max(str, sample_undo.a));');
 				}
 			}
 			NodeShader.write(frag, 'fragColor[1] = vec4(nortan, matid);');
 
 			let height: string = "0.0";
-			if (Context.raw.material.paint_height && MakeMaterial.height_used) {
+			if (context_raw.material.paint_height && MakeMaterial.height_used) {
 				height = "height";
 			}
 
@@ -400,7 +400,7 @@ class MakePaint {
 			}
 		}
 		else {
-			if (Context.raw.tool == workspace_tool_t.ERASER) {
+			if (context_raw.tool == workspace_tool_t.ERASER) {
 				NodeShader.write(frag, 'fragColor[0] = vec4(mix(sample_undo.rgb, vec3(0.0, 0.0, 0.0), str), sample_undo.a - str);');
 				NodeShader.write(frag, 'fragColor[1] = vec4(0.5, 0.5, 1.0, 0.0);');
 				NodeShader.write(frag, 'fragColor[2] = vec4(1.0, 0.0, 0.0, 0.0);');
@@ -410,9 +410,9 @@ class MakePaint {
 				NodeShader.add_uniform(frag, 'sampler2D texpaint_pack_undo', '_texpaint_pack_undo');
 				NodeShader.write(frag, 'vec4 sample_nor_undo = textureLod(texpaint_nor_undo, sample_tc, 0.0);');
 				NodeShader.write(frag, 'vec4 sample_pack_undo = textureLod(texpaint_pack_undo, sample_tc, 0.0);');
-				NodeShader.write(frag, 'fragColor[0] = vec4(' + MakeMaterial.blend_mode(frag, Context.raw.brush_blending, 'sample_undo.rgb', 'basecol', 'str') + ', max(str, sample_undo.a));');
+				NodeShader.write(frag, 'fragColor[0] = vec4(' + MakeMaterial.blend_mode(frag, context_raw.brush_blending, 'sample_undo.rgb', 'basecol', 'str') + ', max(str, sample_undo.a));');
 				NodeShader.write(frag, 'fragColor[1] = vec4(mix(sample_nor_undo.rgb, nortan, str), matid);');
-				if (Context.raw.material.paint_height && MakeMaterial.height_used) {
+				if (context_raw.material.paint_height && MakeMaterial.height_used) {
 					NodeShader.write(frag, 'fragColor[2] = mix(sample_pack_undo, vec4(occlusion, roughness, metallic, height), str);');
 				}
 				else {
@@ -422,29 +422,29 @@ class MakePaint {
 		}
 		NodeShader.write(frag, 'fragColor[3] = vec4(str, 0.0, 0.0, 1.0);');
 
-		if (!Context.raw.material.paint_base) {
+		if (!context_raw.material.paint_base) {
 			con_paint.data.color_writes_red[0] = false;
 			con_paint.data.color_writes_green[0] = false;
 			con_paint.data.color_writes_blue[0] = false;
 		}
-		if (!Context.raw.material.paint_opac) {
+		if (!context_raw.material.paint_opac) {
 			con_paint.data.color_writes_alpha[0] = false;
 		}
-		if (!Context.raw.material.paint_nor) {
+		if (!context_raw.material.paint_nor) {
 			con_paint.data.color_writes_red[1] = false;
 			con_paint.data.color_writes_green[1] = false;
 			con_paint.data.color_writes_blue[1] = false;
 		}
-		if (!Context.raw.material.paint_occ) {
+		if (!context_raw.material.paint_occ) {
 			con_paint.data.color_writes_red[2] = false;
 		}
-		if (!Context.raw.material.paint_rough) {
+		if (!context_raw.material.paint_rough) {
 			con_paint.data.color_writes_green[2] = false;
 		}
-		if (!Context.raw.material.paint_met) {
+		if (!context_raw.material.paint_met) {
 			con_paint.data.color_writes_blue[2] = false;
 		}
-		if (!Context.raw.material.paint_height) {
+		if (!context_raw.material.paint_height) {
 			con_paint.data.color_writes_alpha[2] = false;
 		}
 
@@ -465,7 +465,7 @@ class MakePaint {
 			con_paint.data.color_writes_alpha[2] = false;
 		}
 
-		if (Context.raw.tool == workspace_tool_t.BAKE) {
+		if (context_raw.tool == workspace_tool_t.BAKE) {
 			MakeBake.run(con_paint, vert, frag);
 		}
 

+ 1 - 1
armorpaint/Sources/MakeParticle.ts

@@ -87,7 +87,7 @@ class MakeParticle {
 
 	static mask = (vert: NodeShaderRaw, frag: NodeShaderRaw) => {
 		///if arm_physics
-		if (Context.raw.particle_physics) {
+		if (context_raw.particle_physics) {
 			NodeShader.add_out(vert, 'vec4 wpos');
 			NodeShader.add_uniform(vert, 'mat4 W', '_world_matrix');
 			NodeShader.write_attrib(vert, 'wpos = mul(vec4(pos.xyz, 1.0), W);');

+ 7 - 7
armorpaint/Sources/MakeTexcoord.ts

@@ -3,11 +3,11 @@ class MakeTexcoord {
 
 	static run = (vert: NodeShaderRaw, frag: NodeShaderRaw) => {
 
-		let fill_layer: bool = Context.raw.layer.fill_layer != null;
-		let uv_type: uv_type_t = fill_layer ? Context.raw.layer.uv_type : Context.raw.brush_paint;
-		let decal: bool = Context.raw.tool == workspace_tool_t.DECAL || Context.raw.tool == workspace_tool_t.TEXT;
-		let angle: f32 = Context.raw.brush_angle + Context.raw.brush_nodes_angle;
-		let uvAngle: f32 = fill_layer ? Context.raw.layer.angle : angle;
+		let fill_layer: bool = context_raw.layer.fill_layer != null;
+		let uv_type: uv_type_t = fill_layer ? context_raw.layer.uv_type : context_raw.brush_paint;
+		let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT;
+		let angle: f32 = context_raw.brush_angle + context_raw.brush_nodes_angle;
+		let uvAngle: f32 = fill_layer ? context_raw.layer.angle : angle;
 
 		if (uv_type == uv_type_t.PROJECT || decal) { // TexCoords - project
 			NodeShader.add_uniform(frag, 'float brushScale', '_brushScale');
@@ -23,7 +23,7 @@ class MakeTexcoord {
 
 				frag.n = true;
 				NodeShader.add_uniform(frag, 'vec3 decalLayerNor', '_decalLayerNor');
-				let dot_angle: f32 = Context.raw.brush_angle_reject_dot;
+				let dot_angle: f32 = context_raw.brush_angle_reject_dot;
 				NodeShader.write(frag, `if (abs(dot(n, decalLayerNor) - 1.0) > ${dot_angle}) discard;`);
 
 				frag.wposition = true;
@@ -37,7 +37,7 @@ class MakeTexcoord {
 				NodeShader.write_attrib(frag, 'uvsp.x *= aspectRatio;');
 				NodeShader.write_attrib(frag, 'uvsp *= 0.21 / (decalMask.w * 0.9);'); // Decal radius
 
-				if (Context.raw.brush_directional) {
+				if (context_raw.brush_directional) {
 					NodeShader.add_uniform(frag, 'vec3 brushDirection', '_brushDirection');
 					NodeShader.write_attrib(frag, 'if (brushDirection.z == 0.0) discard;');
 					NodeShader.write_attrib(frag, 'uvsp = vec2(uvsp.x * brushDirection.x - uvsp.y * brushDirection.y, uvsp.x * brushDirection.y + uvsp.y * brushDirection.x);');

+ 2 - 2
armorpaint/Sources/NodesBrush.ts

@@ -30,8 +30,8 @@ class NodesBrush {
 		for (let c of NodesBrush.list) {
 			for (let n of c) {
 				if (n.type == nodeType) {
-					let canvas: zui_node_canvas_t = Context.raw.brush.canvas;
-					let nodes: zui_nodes_t = Context.raw.brush.nodes;
+					let canvas: zui_node_canvas_t = context_raw.brush.canvas;
+					let nodes: zui_nodes_t = context_raw.brush.nodes;
 					let node: zui_node_t = UINodes.make_node(n, nodes, canvas);
 					canvas.nodes.push(node);
 					return node;

+ 214 - 214
armorpaint/Sources/RenderPathPaint.ts

@@ -27,16 +27,16 @@ class RenderPathPaint {
 		{
 			let t: render_target_t = render_target_create();
 			t.name = "texpaint_blend0";
-			t.width = Config.get_texture_res_x();
-			t.height = Config.get_texture_res_y();
+			t.width = config_get_texture_res_x();
+			t.height = config_get_texture_res_y();
 			t.format = "R8";
 			render_path_create_render_target(t);
 		}
 		{
 			let t: render_target_t = render_target_create();
 			t.name = "texpaint_blend1";
-			t.width = Config.get_texture_res_x();
-			t.height = Config.get_texture_res_y();
+			t.width = config_get_texture_res_x();
+			t.height = config_get_texture_res_y();
 			t.format = "R8";
 			render_path_create_render_target(t);
 		}
@@ -105,19 +105,19 @@ class RenderPathPaint {
 	}
 
 	static commands_paint = (dilation = true) => {
-		let tid: i32 = Context.raw.layer.id;
+		let tid: i32 = context_raw.layer.id;
 
-		if (Context.raw.pdirty > 0) {
+		if (context_raw.pdirty > 0) {
 			///if arm_physics
-			let particle_physics: bool = Context.raw.particle_physics;
+			let particle_physics: bool = context_raw.particle_physics;
 			///else
 			let particle_physics: bool = false;
 			///end
-			if (Context.raw.tool == workspace_tool_t.PARTICLE && !particle_physics) {
+			if (context_raw.tool == workspace_tool_t.PARTICLE && !particle_physics) {
 				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) {
+				if ((context_raw.xray || config_raw.brush_angle_reject) && config_raw.brush_3d) {
 					render_path_bind_target("gbuffer0", "gbuffer0");
 				}
 
@@ -134,16 +134,16 @@ class RenderPathPaint {
 			}
 
 			///if is_paint
-			if (Context.raw.tool == workspace_tool_t.COLORID) {
+			if (context_raw.tool == workspace_tool_t.COLORID) {
 				render_path_set_target("texpaint_colorid");
 				render_path_clear_target(0xff000000);
 				render_path_bind_target("gbuffer2", "gbuffer2");
 				render_path_draw_meshes("paint");
 				UIHeader.header_handle.redraws = 2;
 			}
-			else if (Context.raw.tool == workspace_tool_t.PICKER || Context.raw.tool == workspace_tool_t.MATERIAL) {
-				if (Context.raw.pick_pos_nor_tex) {
-					if (Context.raw.paint2d) {
+			else if (context_raw.tool == workspace_tool_t.PICKER || context_raw.tool == workspace_tool_t.MATERIAL) {
+				if (context_raw.pick_pos_nor_tex) {
+					if (context_raw.paint2d) {
 						render_path_set_target("gbuffer0", ["gbuffer1", "gbuffer2"]);
 						render_path_draw_meshes("mesh");
 					}
@@ -155,20 +155,20 @@ class RenderPathPaint {
 					let texpaint_posnortex_picker1: image_t = render_path_render_targets.get("texpaint_posnortex_picker1")._image;
 					let a: DataView = new DataView(image_get_pixels(texpaint_posnortex_picker0));
 					let b: DataView = new DataView(image_get_pixels(texpaint_posnortex_picker1));
-					Context.raw.posx_picked = a.getFloat32(0, true);
-					Context.raw.posy_picked = a.getFloat32(4, true);
-					Context.raw.posz_picked = a.getFloat32(8, true);
-					Context.raw.uvx_picked = a.getFloat32(12, true);
-					Context.raw.norx_picked = b.getFloat32(0, true);
-					Context.raw.nory_picked = b.getFloat32(4, true);
-					Context.raw.norz_picked = b.getFloat32(8, true);
-					Context.raw.uvy_picked = b.getFloat32(12, true);
+					context_raw.posx_picked = a.getFloat32(0, true);
+					context_raw.posy_picked = a.getFloat32(4, true);
+					context_raw.posz_picked = a.getFloat32(8, true);
+					context_raw.uvx_picked = a.getFloat32(12, true);
+					context_raw.norx_picked = b.getFloat32(0, true);
+					context_raw.nory_picked = b.getFloat32(4, true);
+					context_raw.norz_picked = b.getFloat32(8, true);
+					context_raw.uvy_picked = b.getFloat32(12, true);
 				}
 				else {
 					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 use_live_layer: bool = Context.raw.tool == workspace_tool_t.MATERIAL;
+					tid = context_raw.layer.id;
+					let use_live_layer: bool = context_raw.tool == workspace_tool_t.MATERIAL;
 					if (use_live_layer) RenderPathPaint.use_live_layer(true);
 					render_path_bind_target("texpaint" + tid, "texpaint");
 					render_path_bind_target("texpaint_nor" + tid, "texpaint_nor");
@@ -187,8 +187,8 @@ class RenderPathPaint {
 					let c: DataView = new DataView(image_get_pixels(texpaint_pack_picker));
 					let d: DataView = new DataView(image_get_pixels(texpaint_uv_picker));
 
-					if (Context.raw.color_picker_callback != null) {
-						Context.raw.color_picker_callback(Context.raw.picked_color);
+					if (context_raw.color_picker_callback != null) {
+						context_raw.color_picker_callback(context_raw.picked_color);
 					}
 
 					// Picked surface values
@@ -202,27 +202,27 @@ class RenderPathPaint {
 					let i2: i32 = 2;
 					///end
 					let i3: i32 = 3;
-					Context.raw.picked_color.base = color_set_rb(Context.raw.picked_color.base, a.getUint8(i0));
-					Context.raw.picked_color.base = color_set_gb(Context.raw.picked_color.base, a.getUint8(i1));
-					Context.raw.picked_color.base = color_set_bb(Context.raw.picked_color.base, a.getUint8(i2));
-					Context.raw.picked_color.normal = color_set_rb(Context.raw.picked_color.normal, b.getUint8(i0));
-					Context.raw.picked_color.normal = color_set_gb(Context.raw.picked_color.normal, b.getUint8(i1));
-					Context.raw.picked_color.normal = color_set_bb(Context.raw.picked_color.normal, b.getUint8(i2));
-					Context.raw.picked_color.occlusion = c.getUint8(i0) / 255;
-					Context.raw.picked_color.roughness = c.getUint8(i1) / 255;
-					Context.raw.picked_color.metallic = c.getUint8(i2) / 255;
-					Context.raw.picked_color.height = c.getUint8(i3) / 255;
-					Context.raw.picked_color.opacity = a.getUint8(i3) / 255;
-					Context.raw.uvx_picked = d.getUint8(i0) / 255;
-					Context.raw.uvy_picked = d.getUint8(i1) / 255;
+					context_raw.picked_color.base = color_set_rb(context_raw.picked_color.base, a.getUint8(i0));
+					context_raw.picked_color.base = color_set_gb(context_raw.picked_color.base, a.getUint8(i1));
+					context_raw.picked_color.base = color_set_bb(context_raw.picked_color.base, a.getUint8(i2));
+					context_raw.picked_color.normal = color_set_rb(context_raw.picked_color.normal, b.getUint8(i0));
+					context_raw.picked_color.normal = color_set_gb(context_raw.picked_color.normal, b.getUint8(i1));
+					context_raw.picked_color.normal = color_set_bb(context_raw.picked_color.normal, b.getUint8(i2));
+					context_raw.picked_color.occlusion = c.getUint8(i0) / 255;
+					context_raw.picked_color.roughness = c.getUint8(i1) / 255;
+					context_raw.picked_color.metallic = c.getUint8(i2) / 255;
+					context_raw.picked_color.height = c.getUint8(i3) / 255;
+					context_raw.picked_color.opacity = a.getUint8(i3) / 255;
+					context_raw.uvx_picked = d.getUint8(i0) / 255;
+					context_raw.uvy_picked = d.getUint8(i1) / 255;
 					// Pick material
-					if (Context.raw.picker_select_material && Context.raw.color_picker_callback == null) {
+					if (context_raw.picker_select_material && context_raw.color_picker_callback == null) {
 						// matid % 3 == 0 - normal, 1 - emission, 2 - subsurface
 						let matid: i32 = Math.floor((b.getUint8(3) - (b.getUint8(3) % 3)) / 3);
-						for (let m of Project.materials) {
+						for (let m of project_materials) {
 							if (m.id == matid) {
-								Context.set_material(m);
-								Context.raw.materialid_picked = matid;
+								context_set_material(m);
+								context_raw.materialid_picked = matid;
 								break;
 							}
 						}
@@ -231,13 +231,13 @@ class RenderPathPaint {
 			}
 			else {
 				///if arm_voxels
-				if (Context.raw.tool == workspace_tool_t.BAKE && Context.raw.bake_type == bake_type_t.AO) {
+				if (context_raw.tool == workspace_tool_t.BAKE && context_raw.bake_type == bake_type_t.AO) {
 					if (RenderPathPaint.init_voxels) {
 						RenderPathPaint.init_voxels = false;
-						let _rp_gi: bool = Config.raw.rp_gi;
-						Config.raw.rp_gi = true;
+						let _rp_gi: bool = config_raw.rp_gi;
+						config_raw.rp_gi = true;
 						RenderPathBase.init_voxels();
-						Config.raw.rp_gi = _rp_gi;
+						config_raw.rp_gi = _rp_gi;
 					}
 					render_path_clear_image("voxels", 0x00000000);
 					render_path_set_target("");
@@ -249,7 +249,7 @@ class RenderPathPaint {
 				///end
 
 				let texpaint: string = "texpaint" + tid;
-				if (Context.raw.tool == workspace_tool_t.BAKE && Context.raw.brush_time == time_delta()) {
+				if (context_raw.tool == workspace_tool_t.BAKE && context_raw.brush_time == time_delta()) {
 					// Clear to black on bake start
 					render_path_set_target(texpaint);
 					render_path_clear_target(0xff000000);
@@ -258,11 +258,11 @@ class RenderPathPaint {
 				render_path_set_target("texpaint_blend1");
 				render_path_bind_target("texpaint_blend0", "tex");
 				render_path_draw_shader("shader_datas/copy_pass/copyR8_pass");
-				let is_mask: bool = SlotLayer.is_mask(Context.raw.layer);
+				let is_mask: bool = SlotLayer.is_mask(context_raw.layer);
 				if (is_mask) {
-					let ptid: i32 = Context.raw.layer.parent.id;
-					if (SlotLayer.is_group(Context.raw.layer.parent)) { // Group mask
-						for (let c of SlotLayer.get_children(Context.raw.layer.parent)) {
+					let ptid: i32 = context_raw.layer.parent.id;
+					if (SlotLayer.is_group(context_raw.layer.parent)) { // Group mask
+						for (let c of SlotLayer.get_children(context_raw.layer.parent)) {
 							ptid = c.id;
 							break;
 						}
@@ -273,40 +273,40 @@ class RenderPathPaint {
 					render_path_set_target(texpaint, ["texpaint_nor" + tid, "texpaint_pack" + tid, "texpaint_blend0"]);
 				}
 				render_path_bind_target("_main", "gbufferD");
-				if ((Context.raw.xray || Config.raw.brush_angle_reject) && Config.raw.brush_3d) {
+				if ((context_raw.xray || config_raw.brush_angle_reject) && config_raw.brush_3d) {
 					render_path_bind_target("gbuffer0", "gbuffer0");
 				}
 				render_path_bind_target("texpaint_blend1", "paintmask");
 				///if arm_voxels
-				if (Context.raw.tool == workspace_tool_t.BAKE && Context.raw.bake_type == bake_type_t.AO) {
+				if (context_raw.tool == workspace_tool_t.BAKE && context_raw.bake_type == bake_type_t.AO) {
 					render_path_bind_target("voxels", "voxels");
 				}
 				///end
-				if (Context.raw.colorid_picked) {
+				if (context_raw.colorid_picked) {
 					render_path_bind_target("texpaint_colorid", "texpaint_colorid");
 				}
 
 				// Read texcoords from gbuffer
-				let read_tc: bool = (Context.raw.tool == workspace_tool_t.FILL && Context.raw.fill_type_handle.position == fill_type_t.FACE) ||
-							  		 Context.raw.tool == workspace_tool_t.CLONE ||
-									 Context.raw.tool == workspace_tool_t.BLUR ||
-									 Context.raw.tool == workspace_tool_t.SMUDGE;
+				let read_tc: bool = (context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.FACE) ||
+							  		 context_raw.tool == workspace_tool_t.CLONE ||
+									 context_raw.tool == workspace_tool_t.BLUR ||
+									 context_raw.tool == workspace_tool_t.SMUDGE;
 				if (read_tc) {
 					render_path_bind_target("gbuffer2", "gbuffer2");
 				}
 
 				render_path_draw_meshes("paint");
 
-				if (Context.raw.tool == workspace_tool_t.BAKE && Context.raw.bake_type == bake_type_t.CURVATURE && Context.raw.bake_curv_smooth > 0) {
+				if (context_raw.tool == workspace_tool_t.BAKE && context_raw.bake_type == bake_type_t.CURVATURE && context_raw.bake_curv_smooth > 0) {
 					if (render_path_render_targets.get("texpaint_blur") == null) {
 						let t = render_target_create();
 						t.name = "texpaint_blur";
-						t.width = Math.floor(Config.get_texture_res_x() * 0.95);
-						t.height = Math.floor(Config.get_texture_res_y() * 0.95);
+						t.width = Math.floor(config_get_texture_res_x() * 0.95);
+						t.height = Math.floor(config_get_texture_res_y() * 0.95);
 						t.format = "RGBA32";
 						render_path_create_render_target(t);
 					}
-					let blurs: i32 = Math.round(Context.raw.bake_curv_smooth);
+					let blurs: i32 = Math.round(context_raw.bake_curv_smooth);
 					for (let i: i32 = 0; i < blurs; ++i) {
 						render_path_set_target("texpaint_blur");
 						render_path_bind_target(texpaint, "tex");
@@ -317,7 +317,7 @@ class RenderPathPaint {
 					}
 				}
 
-				if (dilation && Config.raw.dilate == dilate_type_t.INSTANT) {
+				if (dilation && config_raw.dilate == dilate_type_t.INSTANT) {
 					RenderPathPaint.dilate(true, false);
 				}
 			}
@@ -330,16 +330,16 @@ class RenderPathPaint {
 			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) {
+			if ((context_raw.xray || config_raw.brush_angle_reject) && config_raw.brush_3d) {
 				render_path_bind_target("gbuffer0", "gbuffer0");
 			}
 			render_path_bind_target("texpaint_blend1", "paintmask");
 
 			// Read texcoords from gbuffer
-			let read_tc: bool = (Context.raw.tool == workspace_tool_t.FILL && Context.raw.fill_type_handle.position == fill_type_t.FACE) ||
-						  		 Context.raw.tool == workspace_tool_t.CLONE ||
-						  		 Context.raw.tool == workspace_tool_t.BLUR ||
-						  		 Context.raw.tool == workspace_tool_t.SMUDGE;
+			let read_tc: bool = (context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.FACE) ||
+						  		 context_raw.tool == workspace_tool_t.CLONE ||
+						  		 context_raw.tool == workspace_tool_t.BLUR ||
+						  		 context_raw.tool == workspace_tool_t.SMUDGE;
 			if (read_tc) {
 				render_path_bind_target("gbuffer2", "gbuffer2");
 			}
@@ -347,14 +347,14 @@ class RenderPathPaint {
 
 			let material_contexts: material_context_t[] = [];
 			let shader_contexts: shader_context_t[] = [];
-			let mats: material_data_t[] = Project.paint_objects[0].materials;
-			mesh_object_get_contexts(Project.paint_objects[0], "paint", mats, material_contexts, shader_contexts);
+			let mats: material_data_t[] = project_paint_objects[0].materials;
+			mesh_object_get_contexts(project_paint_objects[0], "paint", mats, material_contexts, shader_contexts);
 
 			let cc_context: shader_context_t = shader_contexts[0];
 			if (const_data_screen_aligned_vb == null) const_data_create_screen_aligned_data();
 			g4_set_pipeline(cc_context._.pipe_state);
 			uniforms_set_context_consts(cc_context,_render_path_bind_params);
-			uniforms_set_obj_consts(cc_context, Project.paint_objects[0].base);
+			uniforms_set_obj_consts(cc_context, project_paint_objects[0].base);
 			uniforms_set_material_consts(cc_context, material_contexts[0]);
 			g4_set_vertex_buffer(const_data_screen_aligned_vb);
 			g4_set_index_buffer(const_data_screen_aligned_ib);
@@ -365,8 +365,8 @@ class RenderPathPaint {
 	}
 
 	static use_live_layer = (use: bool) => {
-		let tid: i32 = Context.raw.layer.id;
-		let hid: i32 = History.undo_i - 1 < 0 ? Config.raw.undo_steps - 1 : History.undo_i - 1;
+		let tid: i32 = context_raw.layer.id;
+		let hid: i32 = history_undo_i - 1 < 0 ? config_raw.undo_steps - 1 : history_undo_i - 1;
 		if (use) {
 			RenderPathPaint._texpaint = render_path_render_targets.get("texpaint" + tid);
 			RenderPathPaint._texpaint_undo = render_path_render_targets.get("texpaint_undo" + hid);
@@ -376,7 +376,7 @@ class RenderPathPaint {
 			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.is_layer(Context.raw.layer)) {
+			if (SlotLayer.is_layer(context_raw.layer)) {
 				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"));
@@ -386,7 +386,7 @@ class RenderPathPaint {
 		else {
 			render_path_render_targets.set("texpaint" + tid, RenderPathPaint._texpaint);
 			render_path_render_targets.set("texpaint_undo" + hid, RenderPathPaint._texpaint_undo);
-			if (SlotLayer.is_layer(Context.raw.layer)) {
+			if (SlotLayer.is_layer(context_raw.layer)) {
 				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);
@@ -397,7 +397,7 @@ class RenderPathPaint {
 	}
 
 	static commands_live_brush = () => {
-		let tool: workspace_tool_t = Context.raw.tool;
+		let tool: workspace_tool_t = context_raw.tool;
 		if (tool != workspace_tool_t.BRUSH &&
 			tool != workspace_tool_t.ERASER &&
 			tool != workspace_tool_t.CLONE &&
@@ -414,8 +414,8 @@ class RenderPathPaint {
 			RenderPathPaint.live_layer = SlotLayer.create("_live");
 		}
 
-		let tid: i32 = Context.raw.layer.id;
-		if (SlotLayer.is_mask(Context.raw.layer)) {
+		let tid: i32 = context_raw.layer.id;
+		if (SlotLayer.is_mask(context_raw.layer)) {
 			render_path_set_target("texpaint_live");
 			render_path_bind_target("texpaint" + tid, "tex");
 			render_path_draw_shader("shader_datas/copy_pass/copy_pass");
@@ -433,41 +433,41 @@ class RenderPathPaint {
 		RenderPathPaint.live_layer_drawn = 2;
 
 		UIView2D.hwnd.redraws = 2;
-		let _x: f32 = Context.raw.paint_vec.x;
-		let _y: f32 = Context.raw.paint_vec.y;
-		if (Context.raw.brush_locked) {
-			Context.raw.paint_vec.x = (Context.raw.lock_started_x - app_x()) / app_w();
-			Context.raw.paint_vec.y = (Context.raw.lock_started_y - app_y()) / app_h();
-		}
-		let _last_x: f32 = Context.raw.last_paint_vec_x;
-		let _last_y: f32 = Context.raw.last_paint_vec_y;
-		let _pdirty: i32 = Context.raw.pdirty;
-		Context.raw.last_paint_vec_x = Context.raw.paint_vec.x;
-		Context.raw.last_paint_vec_y = Context.raw.paint_vec.y;
-		if (Operator.shortcut(Config.keymap.brush_ruler)) {
-			Context.raw.last_paint_vec_x = Context.raw.last_paint_x;
-			Context.raw.last_paint_vec_y = Context.raw.last_paint_y;
-		}
-		Context.raw.pdirty = 2;
+		let _x: f32 = context_raw.paint_vec.x;
+		let _y: f32 = context_raw.paint_vec.y;
+		if (context_raw.brush_locked) {
+			context_raw.paint_vec.x = (context_raw.lock_started_x - app_x()) / app_w();
+			context_raw.paint_vec.y = (context_raw.lock_started_y - app_y()) / app_h();
+		}
+		let _last_x: f32 = context_raw.last_paint_vec_x;
+		let _last_y: f32 = context_raw.last_paint_vec_y;
+		let _pdirty: i32 = context_raw.pdirty;
+		context_raw.last_paint_vec_x = context_raw.paint_vec.x;
+		context_raw.last_paint_vec_y = context_raw.paint_vec.y;
+		if (operator_shortcut(config_keymap.brush_ruler)) {
+			context_raw.last_paint_vec_x = context_raw.last_paint_x;
+			context_raw.last_paint_vec_y = context_raw.last_paint_y;
+		}
+		context_raw.pdirty = 2;
 
 		RenderPathPaint.commands_symmetry();
 		RenderPathPaint.commands_paint();
 
 		RenderPathPaint.use_live_layer(false);
 
-		Context.raw.paint_vec.x = _x;
-		Context.raw.paint_vec.y = _y;
-		Context.raw.last_paint_vec_x = _last_x;
-		Context.raw.last_paint_vec_y = _last_y;
-		Context.raw.pdirty = _pdirty;
-		Context.raw.brush_blend_dirty = true;
+		context_raw.paint_vec.x = _x;
+		context_raw.paint_vec.y = _y;
+		context_raw.last_paint_vec_x = _last_x;
+		context_raw.last_paint_vec_y = _last_y;
+		context_raw.pdirty = _pdirty;
+		context_raw.brush_blend_dirty = true;
 	}
 
 	static commands_cursor = () => {
-		if (!Config.raw.brush_3d) return;
-		let decal: bool = Context.raw.tool == workspace_tool_t.DECAL || Context.raw.tool == workspace_tool_t.TEXT;
-		let decal_mask: bool = decal && Operator.shortcut(Config.keymap.decal_mask, ShortcutType.ShortcutDown);
-		let tool: workspace_tool_t = Context.raw.tool;
+		if (!config_raw.brush_3d) return;
+		let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT;
+		let decal_mask: bool = decal && operator_shortcut(config_keymap.decal_mask, shortcut_type_t.DOWN);
+		let tool: workspace_tool_t = context_raw.tool;
 		if (tool != workspace_tool_t.BRUSH &&
 			tool != workspace_tool_t.ERASER &&
 			tool != workspace_tool_t.CLONE &&
@@ -478,20 +478,20 @@ class RenderPathPaint {
 				return;
 		}
 
-		let fill_layer: bool = Context.raw.layer.fill_layer != null;
-		let group_layer: bool = SlotLayer.is_group(Context.raw.layer);
+		let fill_layer: bool = context_raw.layer.fill_layer != null;
+		let group_layer: bool = SlotLayer.is_group(context_raw.layer);
 		if (!base_ui_enabled || base_is_dragging || fill_layer || group_layer) {
 			return;
 		}
 
-		let mx: f32 = Context.raw.paint_vec.x;
-		let my: f32 = 1.0 - Context.raw.paint_vec.y;
-		if (Context.raw.brush_locked) {
-			mx = (Context.raw.lock_started_x - app_x()) / app_w();
-			my = 1.0 - (Context.raw.lock_started_y - app_y()) / app_h();
+		let mx: f32 = context_raw.paint_vec.x;
+		let my: f32 = 1.0 - context_raw.paint_vec.y;
+		if (context_raw.brush_locked) {
+			mx = (context_raw.lock_started_x - app_x()) / app_w();
+			my = 1.0 - (context_raw.lock_started_y - app_y()) / app_h();
 		}
-		let radius: f32 = decal_mask ? Context.raw.brush_decal_mask_radius : Context.raw.brush_radius;
-		RenderPathPaint.draw_cursor(mx, my, Context.raw.brush_nodes_radius * radius / 3.4);
+		let radius: f32 = decal_mask ? context_raw.brush_decal_mask_radius : context_raw.brush_radius;
+		RenderPathPaint.draw_cursor(mx, my, context_raw.brush_nodes_radius * radius / 3.4);
 	}
 
 	static draw_cursor = (mx: f32, my: f32, radius: f32, tintR = 1.0, tintG = 1.0, tintB = 1.0) => {
@@ -502,9 +502,9 @@ class RenderPathPaint {
 
 		render_path_set_target("");
 		g4_set_pipeline(base_pipe_cursor);
-		let decal: bool = Context.raw.tool == workspace_tool_t.DECAL || Context.raw.tool == workspace_tool_t.TEXT;
-		let decal_mask: bool = decal && Operator.shortcut(Config.keymap.decal_mask, ShortcutType.ShortcutDown);
-		let img: image_t = (decal && !decal_mask) ? Context.raw.decal_image : Res.get("cursor.k");
+		let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT;
+		let decal_mask: bool = decal && operator_shortcut(config_keymap.decal_mask, shortcut_type_t.DOWN);
+		let img: image_t = (decal && !decal_mask) ? context_raw.decal_image : resource_get("cursor.k");
 		g4_set_tex(base_cursor_tex, img);
 		let gbuffer0: image_t = render_path_render_targets.get("gbuffer0")._image;
 		g4_set_tex_depth(base_cursor_gbufferd, gbuffer0);
@@ -531,43 +531,43 @@ class RenderPathPaint {
 	}
 
 	static commands_symmetry = () => {
-		if (Context.raw.sym_x || Context.raw.sym_y || Context.raw.sym_z) {
-			Context.raw.ddirty = 2;
-			let t: transform_t = Context.raw.paint_object.base.transform;
+		if (context_raw.sym_x || context_raw.sym_y || context_raw.sym_z) {
+			context_raw.ddirty = 2;
+			let t: transform_t = context_raw.paint_object.base.transform;
 			let sx: f32 = t.scale.x;
 			let sy: f32 = t.scale.y;
 			let sz: f32 = t.scale.z;
-			if (Context.raw.sym_x) {
+			if (context_raw.sym_x) {
 				vec4_set(t.scale, -sx, sy, sz);
 				transform_build_matrix(t);
 				RenderPathPaint.commands_paint(false);
 			}
-			if (Context.raw.sym_y) {
+			if (context_raw.sym_y) {
 				vec4_set(t.scale, sx, -sy, sz);
 				transform_build_matrix(t);
 				RenderPathPaint.commands_paint(false);
 			}
-			if (Context.raw.sym_z) {
+			if (context_raw.sym_z) {
 				vec4_set(t.scale, sx, sy, -sz);
 				transform_build_matrix(t);
 				RenderPathPaint.commands_paint(false);
 			}
-			if (Context.raw.sym_x && Context.raw.sym_y) {
+			if (context_raw.sym_x && context_raw.sym_y) {
 				vec4_set(t.scale, -sx, -sy, sz);
 				transform_build_matrix(t);
 				RenderPathPaint.commands_paint(false);
 			}
-			if (Context.raw.sym_x && Context.raw.sym_z) {
+			if (context_raw.sym_x && context_raw.sym_z) {
 				vec4_set(t.scale, -sx, sy, -sz);
 				transform_build_matrix(t);
 				RenderPathPaint.commands_paint(false);
 			}
-			if (Context.raw.sym_y && Context.raw.sym_z) {
+			if (context_raw.sym_y && context_raw.sym_z) {
 				vec4_set(t.scale, sx, -sy, -sz);
 				transform_build_matrix(t);
 				RenderPathPaint.commands_paint(false);
 			}
-			if (Context.raw.sym_x && Context.raw.sym_y && Context.raw.sym_z) {
+			if (context_raw.sym_x && context_raw.sym_y && context_raw.sym_z) {
 				vec4_set(t.scale, -sx, -sy, -sz);
 				transform_build_matrix(t);
 				RenderPathPaint.commands_paint(false);
@@ -579,15 +579,15 @@ class RenderPathPaint {
 
 	static paint_enabled = (): bool => {
 		///if is_paint
-		let fill_layer: bool = Context.raw.layer.fill_layer != null && Context.raw.tool != workspace_tool_t.PICKER && Context.raw.tool != workspace_tool_t.MATERIAL && Context.raw.tool != workspace_tool_t.COLORID;
+		let fill_layer: bool = context_raw.layer.fill_layer != null && context_raw.tool != workspace_tool_t.PICKER && context_raw.tool != workspace_tool_t.MATERIAL && context_raw.tool != workspace_tool_t.COLORID;
 		///end
 
 		///if is_sculpt
-		let fill_layer: bool = Context.raw.layer.fill_layer != null && Context.raw.tool != workspace_tool_t.PICKER && Context.raw.tool != workspace_tool_t.MATERIAL;
+		let fill_layer: bool = context_raw.layer.fill_layer != null && context_raw.tool != workspace_tool_t.PICKER && context_raw.tool != workspace_tool_t.MATERIAL;
 		///end
 
-		let group_layer: bool = SlotLayer.is_group(Context.raw.layer);
-		return !fill_layer && !group_layer && !Context.raw.foreground_event;
+		let group_layer: bool = SlotLayer.is_group(context_raw.layer);
+		return !fill_layer && !group_layer && !context_raw.foreground_event;
 	}
 
 	static live_brush_dirty = () => {
@@ -595,10 +595,10 @@ class RenderPathPaint {
 		let my: f32 = RenderPathPaint.last_y;
 		RenderPathPaint.last_x = mouse_view_x();
 		RenderPathPaint.last_y = mouse_view_y();
-		if (Config.raw.brush_live && Context.raw.pdirty <= 0) {
-			let moved: bool = (mx != RenderPathPaint.last_x || my != RenderPathPaint.last_y) && (Context.in_viewport() || Context.in_2d_view());
-			if (moved || Context.raw.brush_locked) {
-				Context.raw.rdirty = 2;
+		if (config_raw.brush_live && context_raw.pdirty <= 0) {
+			let moved: bool = (mx != RenderPathPaint.last_x || my != RenderPathPaint.last_y) && (context_in_viewport() || context_in_2d_view());
+			if (moved || context_raw.brush_locked) {
+				context_raw.rdirty = 2;
 			}
 		}
 	}
@@ -607,7 +607,7 @@ class RenderPathPaint {
 
 		///if is_paint
 		if (!RenderPathPaint.dilated) {
-			RenderPathPaint.dilate(Config.raw.dilate == dilate_type_t.DELAYED, true);
+			RenderPathPaint.dilate(config_raw.dilate == dilate_type_t.DELAYED, true);
 			RenderPathPaint.dilated = true;
 		}
 		///end
@@ -615,11 +615,11 @@ class RenderPathPaint {
 		if (!RenderPathPaint.paint_enabled()) return;
 
 		///if is_paint
-		RenderPathPaint.push_undo_last = History.push_undo;
+		RenderPathPaint.push_undo_last = history_push_undo;
 		///end
 
-		if (History.push_undo && History.undo_layers != null) {
-			History.paint();
+		if (history_push_undo && history_undo_layers != null) {
+			history_paint();
 
 			///if is_sculpt
 			render_path_set_target("gbuffer0_undo");
@@ -633,18 +633,18 @@ class RenderPathPaint {
 		}
 
 		///if is_sculpt
-		if (History.push_undo2 && History.undo_layers != null) {
-			History.paint();
+		if (history_push_undo2 && history_undo_layers != null) {
+			history_paint();
 		}
 		///end
 
-		if (Context.raw.paint2d) {
+		if (context_raw.paint2d) {
 			RenderPathPaint.set_plane_mesh();
 		}
 
 		if (RenderPathPaint.live_layer_drawn > 0) RenderPathPaint.live_layer_drawn--;
 
-		if (Config.raw.brush_live && Context.raw.pdirty <= 0 && Context.raw.ddirty <= 0 && Context.raw.brush_time == 0) {
+		if (config_raw.brush_live && context_raw.pdirty <= 0 && context_raw.ddirty <= 0 && context_raw.brush_time == 0) {
 			// Depth is unchanged, draw before gbuffer gets updated
 			RenderPathPaint.commands_live_brush();
 		}
@@ -652,97 +652,97 @@ class RenderPathPaint {
 
 	static end = () => {
 		RenderPathPaint.commands_cursor();
-		Context.raw.ddirty--;
-		Context.raw.rdirty--;
+		context_raw.ddirty--;
+		context_raw.rdirty--;
 
 		if (!RenderPathPaint.paint_enabled()) return;
-		Context.raw.pdirty--;
+		context_raw.pdirty--;
 	}
 
 	static draw = () => {
 		if (!RenderPathPaint.paint_enabled()) return;
 
 		///if (!krom_ios) // No hover on iPad, decals are painted by pen release
-		if (Config.raw.brush_live && Context.raw.pdirty <= 0 && Context.raw.ddirty > 0 && Context.raw.brush_time == 0) {
+		if (config_raw.brush_live && context_raw.pdirty <= 0 && context_raw.ddirty > 0 && context_raw.brush_time == 0) {
 			// gbuffer has been updated now but brush will lag 1 frame
 			RenderPathPaint.commands_live_brush();
 		}
 		///end
 
-		if (History.undo_layers != null) {
+		if (history_undo_layers != null) {
 			RenderPathPaint.commands_symmetry();
 
-			if (Context.raw.pdirty > 0) RenderPathPaint.dilated = false;
+			if (context_raw.pdirty > 0) RenderPathPaint.dilated = false;
 
 			///if is_paint
-			if (Context.raw.tool == workspace_tool_t.BAKE) {
+			if (context_raw.tool == workspace_tool_t.BAKE) {
 
 				///if (krom_direct3d12 || krom_vulkan || krom_metal)
-				let is_raytraced_bake: bool = (Context.raw.bake_type == bake_type_t.AO  ||
-					Context.raw.bake_type == bake_type_t.LIGHTMAP ||
-					Context.raw.bake_type == bake_type_t.BENT_NORMAL ||
-					Context.raw.bake_type == bake_type_t.THICKNESS);
+				let is_raytraced_bake: bool = (context_raw.bake_type == bake_type_t.AO  ||
+					context_raw.bake_type == bake_type_t.LIGHTMAP ||
+					context_raw.bake_type == bake_type_t.BENT_NORMAL ||
+					context_raw.bake_type == bake_type_t.THICKNESS);
 				///end
 
-				if (Context.raw.bake_type == bake_type_t.NORMAL || Context.raw.bake_type == bake_type_t.HEIGHT || Context.raw.bake_type == bake_type_t.DERIVATIVE) {
-					if (!RenderPathPaint.baking && Context.raw.pdirty > 0) {
+				if (context_raw.bake_type == bake_type_t.NORMAL || context_raw.bake_type == bake_type_t.HEIGHT || context_raw.bake_type == bake_type_t.DERIVATIVE) {
+					if (!RenderPathPaint.baking && context_raw.pdirty > 0) {
 						RenderPathPaint.baking = true;
-						let _bake_type: bake_type_t = Context.raw.bake_type;
-						Context.raw.bake_type = Context.raw.bake_type == bake_type_t.NORMAL ? bake_type_t.NORMAL_OBJECT : bake_type_t.POSITION; // Bake high poly data
+						let _bake_type: bake_type_t = context_raw.bake_type;
+						context_raw.bake_type = context_raw.bake_type == bake_type_t.NORMAL ? bake_type_t.NORMAL_OBJECT : bake_type_t.POSITION; // Bake high poly data
 						MakeMaterial.parse_paint_material();
-						let _paint_object: mesh_object_t = Context.raw.paint_object;
-						let high_poly: mesh_object_t = Project.paint_objects[Context.raw.bake_high_poly];
+						let _paint_object: mesh_object_t = context_raw.paint_object;
+						let high_poly: mesh_object_t = project_paint_objects[context_raw.bake_high_poly];
 						let _visible: bool = high_poly.base.visible;
 						high_poly.base.visible = true;
-						Context.select_paint_object(high_poly);
+						context_select_paint_object(high_poly);
 						RenderPathPaint.commands_paint();
 						high_poly.base.visible = _visible;
-						if (RenderPathPaint.push_undo_last) History.paint();
-						Context.select_paint_object(_paint_object);
+						if (RenderPathPaint.push_undo_last) history_paint();
+						context_select_paint_object(_paint_object);
 
 						let _render_final = () => {
-							Context.raw.bake_type = _bake_type;
+							context_raw.bake_type = _bake_type;
 							MakeMaterial.parse_paint_material();
-							Context.raw.pdirty = 1;
+							context_raw.pdirty = 1;
 							RenderPathPaint.commands_paint();
-							Context.raw.pdirty = 0;
+							context_raw.pdirty = 0;
 							RenderPathPaint.baking = false;
 						}
 						let _render_deriv = () => {
-							Context.raw.bake_type = bake_type_t.HEIGHT;
+							context_raw.bake_type = bake_type_t.HEIGHT;
 							MakeMaterial.parse_paint_material();
-							Context.raw.pdirty = 1;
+							context_raw.pdirty = 1;
 							RenderPathPaint.commands_paint();
-							Context.raw.pdirty = 0;
-							if (RenderPathPaint.push_undo_last) History.paint();
+							context_raw.pdirty = 0;
+							if (RenderPathPaint.push_undo_last) history_paint();
 							app_notify_on_init(_render_final);
 						}
-						let bake_type: bake_type_t = Context.raw.bake_type as bake_type_t;
+						let bake_type: bake_type_t = context_raw.bake_type as bake_type_t;
 						app_notify_on_init(bake_type == bake_type_t.DERIVATIVE ? _render_deriv : _render_final);
 					}
 				}
-				else if (Context.raw.bake_type == bake_type_t.OBJECTID) {
-					let _layer_filter: i32 = Context.raw.layer_filter;
-					let _paint_object: mesh_object_t = Context.raw.paint_object;
-					let is_merged: bool = Context.raw.merged_object != null;
-					let _visible: bool = is_merged && Context.raw.merged_object.base.visible;
-					Context.raw.layer_filter = 1;
-					if (is_merged) Context.raw.merged_object.base.visible = false;
-
-					for (let p of Project.paint_objects) {
-						Context.select_paint_object(p);
+				else if (context_raw.bake_type == bake_type_t.OBJECTID) {
+					let _layer_filter: i32 = context_raw.layer_filter;
+					let _paint_object: mesh_object_t = context_raw.paint_object;
+					let is_merged: bool = context_raw.merged_object != null;
+					let _visible: bool = is_merged && context_raw.merged_object.base.visible;
+					context_raw.layer_filter = 1;
+					if (is_merged) context_raw.merged_object.base.visible = false;
+
+					for (let p of project_paint_objects) {
+						context_select_paint_object(p);
 						RenderPathPaint.commands_paint();
 					}
 
-					Context.raw.layer_filter = _layer_filter;
-					Context.select_paint_object(_paint_object);
-					if (is_merged) Context.raw.merged_object.base.visible = _visible;
+					context_raw.layer_filter = _layer_filter;
+					context_select_paint_object(_paint_object);
+					if (is_merged) context_raw.merged_object.base.visible = _visible;
 				}
 				///if (krom_direct3d12 || krom_vulkan || krom_metal)
 				else if (is_raytraced_bake) {
 					let dirty: bool = RenderPathRaytraceBake.commands(MakeMaterial.parse_paint_material);
 					if (dirty) UIHeader.header_handle.redraws = 2;
-					if (Config.raw.dilate == dilate_type_t.INSTANT) { // && Context.raw.pdirty == 1
+					if (config_raw.dilate == dilate_type_t.INSTANT) { // && raw.pdirty == 1
 						RenderPathPaint.dilate(true, false);
 					}
 				}
@@ -761,8 +761,8 @@ class RenderPathPaint {
 			///end
 		}
 
-		if (Context.raw.brush_blend_dirty) {
-			Context.raw.brush_blend_dirty = false;
+		if (context_raw.brush_blend_dirty) {
+			context_raw.brush_blend_dirty = false;
 			///if krom_metal
 			render_path_set_target("texpaint_blend0");
 			render_path_clear_target(0x00000000);
@@ -774,28 +774,28 @@ class RenderPathPaint {
 			///end
 		}
 
-		if (Context.raw.paint2d) {
+		if (context_raw.paint2d) {
 			RenderPathPaint.restore_plane_mesh();
 		}
 	}
 
 	static set_plane_mesh = () => {
-		Context.raw.paint2d_view = true;
-		RenderPathPaint.painto = Context.raw.paint_object;
+		context_raw.paint2d_view = true;
+		RenderPathPaint.painto = context_raw.paint_object;
 		RenderPathPaint.visibles = [];
-		for (let p of Project.paint_objects) {
+		for (let p of project_paint_objects) {
 			RenderPathPaint.visibles.push(p.base.visible);
 			p.base.visible = false;
 		}
-		if (Context.raw.merged_object != null) {
-			RenderPathPaint.merged_object_visible = Context.raw.merged_object.base.visible;
-			Context.raw.merged_object.base.visible = false;
+		if (context_raw.merged_object != null) {
+			RenderPathPaint.merged_object_visible = context_raw.merged_object.base.visible;
+			context_raw.merged_object.base.visible = false;
 		}
 
 		let cam: camera_object_t = scene_camera;
-		mat4_set_from(Context.raw.saved_camera, cam.base.transform.local);
+		mat4_set_from(context_raw.saved_camera, cam.base.transform.local);
 		RenderPathPaint.saved_fov = cam.data.fov;
-		Viewport.update_camera_type(camera_type_t.PERSPECTIVE);
+		viewport_update_camera_type(camera_type_t.PERSPECTIVE);
 		let m: mat4_t = mat4_identity();
 		mat4_translate(m, 0, 0, 0.5);
 		transform_set_matrix(cam.base.transform, m);
@@ -841,31 +841,31 @@ class RenderPathPaint {
 
 		RenderPathPaint.planeo = scene_get_child(tiled ? ".PlaneTiled" : ".Plane").ext;
 		RenderPathPaint.planeo.base.visible = true;
-		Context.raw.paint_object = RenderPathPaint.planeo;
+		context_raw.paint_object = RenderPathPaint.planeo;
 
 		let v: vec4_t = vec4_create();
 		let sx: f32 = vec4_len(vec4_set(v, m.m[0], m.m[1], m.m[2]));
 		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.get_texture_res_y() / Config.get_texture_res_x();
+		RenderPathPaint.planeo.base.transform.scale.z *= config_get_texture_res_y() / config_get_texture_res_x();
 		vec4_set(RenderPathPaint.planeo.base.transform.loc, m.m[12], -m.m[13], 0.0);
 		transform_build_matrix(RenderPathPaint.planeo.base.transform);
 	}
 
 	static restore_plane_mesh = () => {
-		Context.raw.paint2d_view = false;
+		context_raw.paint2d_view = false;
 		RenderPathPaint.planeo.base.visible = false;
 		vec4_set(RenderPathPaint.planeo.base.transform.loc, 0.0, 0.0, 0.0);
-		for (let i: i32 = 0; i < Project.paint_objects.length; ++i) {
-			Project.paint_objects[i].base.visible = RenderPathPaint.visibles[i];
+		for (let i: i32 = 0; i < project_paint_objects.length; ++i) {
+			project_paint_objects[i].base.visible = RenderPathPaint.visibles[i];
 		}
-		if (Context.raw.merged_object != null) {
-			Context.raw.merged_object.base.visible = RenderPathPaint.merged_object_visible;
+		if (context_raw.merged_object != null) {
+			context_raw.merged_object.base.visible = RenderPathPaint.merged_object_visible;
 		}
-		Context.raw.paint_object = RenderPathPaint.painto;
-		transform_set_matrix(scene_camera.base.transform, Context.raw.saved_camera);
+		context_raw.paint_object = RenderPathPaint.painto;
+		transform_set_matrix(scene_camera.base.transform, context_raw.saved_camera);
 		scene_camera.data.fov = RenderPathPaint.saved_fov;
-		Viewport.update_camera_type(Context.raw.camera_type);
+		viewport_update_camera_type(context_raw.camera_type);
 		camera_object_build_proj(scene_camera);
 		camera_object_build_mat(scene_camera);
 
@@ -874,13 +874,13 @@ class RenderPathPaint {
 
 	static bind_layers = () => {
 		///if is_paint
-		let is_live: bool = Config.raw.brush_live && RenderPathPaint.live_layer_drawn > 0;
-		let is_material_tool: bool = Context.raw.tool == workspace_tool_t.MATERIAL;
+		let is_live: bool = config_raw.brush_live && RenderPathPaint.live_layer_drawn > 0;
+		let is_material_tool: bool = context_raw.tool == workspace_tool_t.MATERIAL;
 		if (is_live || is_material_tool) RenderPathPaint.use_live_layer(true);
 		///end
 
-		for (let i: i32 = 0; i < Project.layers.length; ++i) {
-			let l: SlotLayerRaw = Project.layers[i];
+		for (let i: i32 = 0; i < project_layers.length; ++i) {
+			let l: SlotLayerRaw = project_layers[i];
 			render_path_bind_target("texpaint" + l.id, "texpaint" + l.id);
 
 			///if is_paint
@@ -894,18 +894,18 @@ class RenderPathPaint {
 
 	static unbind_layers = () => {
 		///if is_paint
-		let is_live: bool = Config.raw.brush_live && RenderPathPaint.live_layer_drawn > 0;
-		let is_material_tool: bool = Context.raw.tool == workspace_tool_t.MATERIAL;
+		let is_live: bool = config_raw.brush_live && RenderPathPaint.live_layer_drawn > 0;
+		let is_material_tool: bool = context_raw.tool == workspace_tool_t.MATERIAL;
 		if (is_live || is_material_tool) RenderPathPaint.use_live_layer(false);
 		///end
 	}
 
 	static dilate = (base: bool, nor_pack: bool) => {
 		///if is_paint
-		if (Config.raw.dilate_radius > 0 && !Context.raw.paint2d) {
+		if (config_raw.dilate_radius > 0 && !context_raw.paint2d) {
 			UtilUV.cache_dilate_map();
 			base_make_temp_img();
-			let tid: i32 = Context.raw.layer.id;
+			let tid: i32 = context_raw.layer.id;
 			if (base) {
 				let texpaint: string = "texpaint";
 				render_path_set_target("temptex0");
@@ -915,7 +915,7 @@ class RenderPathPaint {
 				render_path_bind_target("temptex0", "tex");
 				render_path_draw_shader("shader_datas/dilate_pass/dilate_pass");
 			}
-			if (nor_pack && !SlotLayer.is_mask(Context.raw.layer)) {
+			if (nor_pack && !SlotLayer.is_mask(context_raw.layer)) {
 				render_path_set_target("temptex0");
 				render_path_bind_target("texpaint_nor" + tid, "tex");
 				render_path_draw_shader("shader_datas/copy_pass/copy_pass");

+ 2 - 2
armorpaint/Sources/RenderPathPreview.ts

@@ -98,7 +98,7 @@ class RenderPathPreview {
 		///end
 
 		let framebuffer: string = "texpreview";
-		let selected_mat: SlotMaterialRaw = Context.raw.material;
+		let selected_mat: SlotMaterialRaw = context_raw.material;
 		render_path_render_targets.get("texpreview")._image = selected_mat.image;
 		render_path_render_targets.get("texpreview_icon")._image = selected_mat.image_icon;
 
@@ -142,7 +142,7 @@ class RenderPathPreview {
 		///end
 
 		let framebuffer: string = "texpreview";
-		render_path_render_targets.get("texpreview")._image = Context.raw.decal_image;
+		render_path_render_targets.get("texpreview")._image = context_raw.decal_image;
 
 		render_path_set_target(framebuffer);
 

+ 1 - 1
armorpaint/Sources/SlotBrush.ts

@@ -13,7 +13,7 @@ class SlotBrush {
 
 	static create(c: zui_node_canvas_t = null): SlotBrushRaw {
 		let raw: SlotBrushRaw = new SlotBrushRaw();
-		for (let brush of Project.brushes) if (brush.id >= raw.id) raw.id = brush.id + 1;
+		for (let brush of project_brushes) if (brush.id >= raw.id) raw.id = brush.id + 1;
 
 		if (c == null) {
 			if (SlotBrush.default_canvas == null) { // Synchronous

+ 1 - 1
armorpaint/Sources/SlotFont.ts

@@ -12,7 +12,7 @@ class SlotFont {
 
 	static create(name: string, font: g2_font_t, file = ""): SlotFontRaw {
 		let raw: SlotFontRaw = new SlotFontRaw();
-		for (let slot of Project.fonts) if (slot.id >= raw.id) raw.id = slot.id + 1;
+		for (let slot of project_fonts) if (slot.id >= raw.id) raw.id = slot.id + 1;
 		raw.name = name;
 		raw.font = font;
 		raw.file = file;

+ 48 - 48
armorpaint/Sources/SlotLayer.ts

@@ -41,7 +41,7 @@ class SlotLayer {
 		let raw: SlotLayerRaw = new SlotLayerRaw();
 		if (ext == "") {
 			raw.id = 0;
-			for (let l of Project.layers) if (l.id >= raw.id) raw.id = l.id + 1;
+			for (let l of project_layers) if (l.id >= raw.id) raw.id = l.id + 1;
 			ext = raw.id + "";
 		}
 		raw.ext = ext;
@@ -65,8 +65,8 @@ class SlotLayer {
 			{
 				let t: render_target_t = render_target_create();
 				t.name = "texpaint" + ext;
-				t.width = Config.get_texture_res_x();
-				t.height = Config.get_texture_res_y();
+				t.width = config_get_texture_res_x();
+				t.height = config_get_texture_res_y();
 				t.format = format;
 				raw.texpaint = render_path_create_render_target(t)._image;
 			}
@@ -75,16 +75,16 @@ class SlotLayer {
 			{
 				let t: render_target_t = render_target_create();
 				t.name = "texpaint_nor" + ext;
-				t.width = Config.get_texture_res_x();
-				t.height = Config.get_texture_res_y();
+				t.width = config_get_texture_res_x();
+				t.height = config_get_texture_res_y();
 				t.format = format;
 				raw.texpaint_nor = render_path_create_render_target(t)._image;
 			}
 			{
 				let t: render_target_t = render_target_create();
 				t.name = "texpaint_pack" + ext;
-				t.width = Config.get_texture_res_x();
-				t.height = Config.get_texture_res_y();
+				t.width = config_get_texture_res_x();
+				t.height = config_get_texture_res_y();
 				t.format = format;
 				raw.texpaint_pack = render_path_create_render_target(t)._image;
 			}
@@ -102,8 +102,8 @@ class SlotLayer {
 			{
 				let t: render_target_t = render_target_create();
 				t.name = "texpaint" + ext;
-				t.width = Config.get_texture_res_x();
-				t.height = Config.get_texture_res_y();
+				t.width = config_get_texture_res_x();
+				t.height = config_get_texture_res_y();
 				t.format = format;
 				raw.texpaint = render_path_create_render_target(t)._image;
 			}
@@ -129,11 +129,11 @@ class SlotLayer {
 			if (masks != null) for (let m of masks) SlotLayer.delete(m);
 		}
 
-		let lpos: i32 = Project.layers.indexOf(raw);
-		array_remove(Project.layers, raw);
+		let lpos: i32 = project_layers.indexOf(raw);
+		array_remove(project_layers, raw);
 		// Undo can remove base layer and then restore it from undo layers
-		if (Project.layers.length > 0) {
-			Context.set_layer(Project.layers[lpos > 0 ? lpos - 1 : 0]);
+		if (project_layers.length > 0) {
+			context_set_layer(project_layers[lpos > 0 ? lpos - 1 : 0]);
 		}
 
 		// Do not remove empty groups if the last layer is deleted as this prevents redo from working properly
@@ -220,8 +220,8 @@ class SlotLayer {
 		}
 		///end
 
-		Context.raw.layer_preview_dirty = true;
-		Context.raw.ddirty = 3;
+		context_raw.layer_preview_dirty = true;
+		context_raw.ddirty = 3;
 	}
 
 	static invert_mask = (raw: SlotLayerRaw) => {
@@ -238,8 +238,8 @@ class SlotLayer {
 		}
 		base_notify_on_next_frame(_next);
 		raw.texpaint = render_path_render_targets.get("texpaint" + raw.id)._image = inverted;
-		Context.raw.layer_preview_dirty = true;
-		Context.raw.ddirty = 3;
+		context_raw.layer_preview_dirty = true;
+		context_raw.ddirty = 3;
 	}
 
 	static apply_mask = (raw: SlotLayerRaw) => {
@@ -258,7 +258,7 @@ class SlotLayer {
 	}
 
 	static duplicate = (raw: SlotLayerRaw): SlotLayerRaw => {
-		let layers: SlotLayerRaw[] = Project.layers;
+		let layers: SlotLayerRaw[] = project_layers;
 		let i: i32 = layers.indexOf(raw) + 1;
 		let l: SlotLayerRaw = SlotLayer.create("", SlotLayer.is_layer(raw) ? layer_slot_type_t.LAYER : SlotLayer.is_mask(raw) ? layer_slot_type_t.MASK : layer_slot_type_t.GROUP, raw.parent);
 		layers.splice(i, 0, l);
@@ -324,8 +324,8 @@ class SlotLayer {
 	}
 
 	static resize_and_set_bits = (raw: SlotLayerRaw) => {
-		let res_x: i32 = Config.get_texture_res_x();
-		let res_y: i32 = Config.get_texture_res_y();
+		let res_x: i32 = config_get_texture_res_x();
+		let res_y: i32 = config_get_texture_res_y();
 		let rts: map_t<string, render_target_t> = render_path_render_targets;
 		if (base_pipe_merge == null) base_make_pipe();
 
@@ -402,22 +402,22 @@ class SlotLayer {
 	}
 
 	static to_fill_layer = (raw: SlotLayerRaw) => {
-		Context.set_layer(raw);
-		raw.fill_layer = Context.raw.material;
+		context_set_layer(raw);
+		raw.fill_layer = context_raw.material;
 		base_update_fill_layer();
 		let _next = () => {
 			MakeMaterial.parse_paint_material();
-			Context.raw.layer_preview_dirty = true;
+			context_raw.layer_preview_dirty = true;
 			UIBase.hwnds[tab_area_t.SIDEBAR0].redraws = 2;
 		}
 		base_notify_on_next_frame(_next);
 	}
 
 	static to_paint_layer = (raw: SlotLayerRaw) => {
-		Context.set_layer(raw);
+		context_set_layer(raw);
 		raw.fill_layer = null;
 		MakeMaterial.parse_paint_material();
-		Context.raw.layer_preview_dirty = true;
+		context_raw.layer_preview_dirty = true;
 		UIBase.hwnds[tab_area_t.SIDEBAR0].redraws = 2;
 	}
 
@@ -427,7 +427,7 @@ class SlotLayer {
 
 	static get_children = (raw: SlotLayerRaw): SlotLayerRaw[] => {
 		let children: SlotLayerRaw[] = null; // Child layers of a group
-		for (let l of Project.layers) {
+		for (let l of project_layers) {
 			if (l.parent == raw && SlotLayer.is_layer(l)) {
 				if (children == null) children = [];
 				children.push(l);
@@ -438,7 +438,7 @@ class SlotLayer {
 
 	static get_recursive_children = (raw: SlotLayerRaw): SlotLayerRaw[] => {
 		let children: SlotLayerRaw[] = null;
-		for (let l of Project.layers) {
+		for (let l of project_layers) {
 			if (l.parent == raw) { // Child layers and group masks
 				if (children == null) children = [];
 				children.push(l);
@@ -456,7 +456,7 @@ class SlotLayer {
 
 		let children: SlotLayerRaw[] = null;
 		// Child masks of a layer
-		for (let l of Project.layers) {
+		for (let l of project_layers) {
 			if (l.parent == raw && SlotLayer.is_mask(l)) {
 				if (children == null) children = [];
 				children.push(l);
@@ -465,7 +465,7 @@ class SlotLayer {
 		// Child masks of a parent group
 		if (includeGroupMasks) {
 			if (raw.parent != null && SlotLayer.is_group(raw.parent)) {
-				for (let l of Project.layers) {
+				for (let l of project_layers) {
 					if (l.parent == raw.parent && SlotLayer.is_mask(l)) {
 						if (children == null) children = [];
 						children.push(l);
@@ -478,14 +478,14 @@ class SlotLayer {
 
 	static has_masks = (raw: SlotLayerRaw, includeGroupMasks = true): bool => {
 		// Layer mask
-		for (let l of Project.layers) {
+		for (let l of project_layers) {
 			if (l.parent == raw && SlotLayer.is_mask(l)) {
 				return true;
 			}
 		}
 		// Group mask
 		if (includeGroupMasks && raw.parent != null && SlotLayer.is_group(raw.parent)) {
-			for (let l of Project.layers) {
+			for (let l of project_layers) {
 				if (l.parent == raw.parent && SlotLayer.is_mask(l)) {
 					return true;
 				}
@@ -557,25 +557,25 @@ class SlotLayer {
 	}
 
 	static can_move = (raw: SlotLayerRaw, to: i32): bool => {
-		let old_index: i32 = Project.layers.indexOf(raw);
+		let old_index: i32 = project_layers.indexOf(raw);
 
 		let delta: i32 = to - old_index; // If delta > 0 the layer is moved up, otherwise down
-		if (to < 0 || to > Project.layers.length - 1 || delta == 0) return false;
+		if (to < 0 || to > project_layers.length - 1 || delta == 0) return false;
 
 		// If the layer is moved up, all layers between the old position and the new one move one down.
 		// The layers above the new position stay where they are.
 		// If the new position is on top or on bottom no upper resp. lower layer exists.
-		let new_upper_layer: SlotLayerRaw = delta > 0 ? (to < Project.layers.length - 1 ? Project.layers[to + 1] : null) : Project.layers[to];
+		let new_upper_layer: SlotLayerRaw = delta > 0 ? (to < project_layers.length - 1 ? project_layers[to + 1] : null) : project_layers[to];
 
 		// Group or layer is collapsed so we check below and update the upper layer.
 		if (new_upper_layer != null && !new_upper_layer.show_panel) {
 			let children: SlotLayerRaw[] = SlotLayer.get_recursive_children(new_upper_layer);
 			to -= children != null ? children.length : 0;
 			delta = to - old_index;
-			new_upper_layer = delta > 0 ? (to < Project.layers.length - 1 ? Project.layers[to + 1] : null) : Project.layers[to];
+			new_upper_layer = delta > 0 ? (to < project_layers.length - 1 ? project_layers[to + 1] : null) : project_layers[to];
 		}
 
-		let new_lower_layer: SlotLayerRaw = delta > 0 ? Project.layers[to] : (to > 0 ? Project.layers[to - 1] : null);
+		let new_lower_layer: SlotLayerRaw = delta > 0 ? project_layers[to] : (to > 0 ? project_layers[to - 1] : null);
 
 		if (SlotLayer.is_mask(raw)) {
 			// Masks can not be on top.
@@ -617,24 +617,24 @@ class SlotLayer {
 		}
 
 		let pointers: map_t<SlotLayerRaw, i32> = TabLayers.init_layer_map();
-		let old_index: i32 = Project.layers.indexOf(raw);
+		let old_index: i32 = project_layers.indexOf(raw);
 		let delta: i32 = to - old_index;
-		let new_upper_layer: SlotLayerRaw = delta > 0 ? (to < Project.layers.length - 1 ? Project.layers[to + 1] : null) : Project.layers[to];
+		let new_upper_layer: SlotLayerRaw = delta > 0 ? (to < project_layers.length - 1 ? project_layers[to + 1] : null) : project_layers[to];
 
 		// Group or layer is collapsed so we check below and update the upper layer.
 		if (new_upper_layer != null && !new_upper_layer.show_panel) {
 			let children: SlotLayerRaw[] = SlotLayer.get_recursive_children(new_upper_layer);
 			to -= children != null ? children.length : 0;
 			delta = to - old_index;
-			new_upper_layer = delta > 0 ? (to < Project.layers.length - 1 ? Project.layers[to + 1] : null) : Project.layers[to];
+			new_upper_layer = delta > 0 ? (to < project_layers.length - 1 ? project_layers[to + 1] : null) : project_layers[to];
 		}
 
-		Context.set_layer(raw);
-		History.order_layers(to);
+		context_set_layer(raw);
+		history_order_layers(to);
 		UIBase.hwnds[tab_area_t.SIDEBAR0].redraws = 2;
 
-		array_remove(Project.layers, raw);
-		Project.layers.splice(to, 0, raw);
+		array_remove(project_layers, raw);
+		project_layers.splice(to, 0, raw);
 
 		if (SlotLayer.is_layer(raw)) {
 			let old_parent: SlotLayerRaw = raw.parent;
@@ -657,9 +657,9 @@ class SlotLayer {
 			if (layer_masks != null) {
 				for (let idx: i32 = 0; idx < layer_masks.length; ++idx) {
 					let mask: SlotLayerRaw = layer_masks[idx];
-					array_remove(Project.layers, mask);
+					array_remove(project_layers, mask);
 					// If the masks are moved down each step increases the index below the layer by one.
-					Project.layers.splice(delta > 0 ? old_index + delta - 1 : old_index + delta + idx, 0, mask);
+					project_layers.splice(delta > 0 ? old_index + delta - 1 : old_index + delta + idx, 0, mask);
 				}
 			}
 
@@ -680,13 +680,13 @@ class SlotLayer {
 			if (children != null) {
 				for (let idx: i32 = 0; idx < children.length; ++idx) {
 					let child: SlotLayerRaw = children[idx];
-					array_remove(Project.layers, child);
+					array_remove(project_layers, child);
 					// If the children are moved down each step increases the index below the layer by one.
-					Project.layers.splice(delta > 0 ? old_index + delta - 1 : old_index + delta + idx, 0, child);
+					project_layers.splice(delta > 0 ? old_index + delta - 1 : old_index + delta + idx, 0, child);
 				}
 			}
 		}
 
-		for (let m of Project.materials) TabLayers.remap_layer_pointers(m.canvas.nodes, TabLayers.fill_layer_map(pointers));
+		for (let m of project_materials) TabLayers.remap_layer_pointers(m.canvas.nodes, TabLayers.fill_layer_map(pointers));
 	}
 }

+ 5 - 5
armorpaint/Sources/SlotMaterial.ts

@@ -24,7 +24,7 @@ class SlotMaterial {
 
 	static create(m: material_data_t = null, c: zui_node_canvas_t = null): SlotMaterialRaw {
 		let raw: SlotMaterialRaw = new SlotMaterialRaw();
-		for (let mat of Project.materials) if (mat.id >= raw.id) raw.id = mat.id + 1;
+		for (let mat of project_materials) if (mat.id >= raw.id) raw.id = mat.id + 1;
 		raw.data = m;
 
 		let w: i32 = UtilRender.material_preview_size;
@@ -61,10 +61,10 @@ class SlotMaterial {
 
 	static delete = (raw: SlotMaterialRaw) => {
 		SlotMaterial.unload(raw);
-		let mpos: i32 = Project.materials.indexOf(raw);
-		array_remove(Project.materials, this);
-		if (Project.materials.length > 0) {
-			Context.set_material(Project.materials[mpos > 0 ? mpos - 1 : 0]);
+		let mpos: i32 = project_materials.indexOf(raw);
+		array_remove(project_materials, this);
+		if (project_materials.length > 0) {
+			context_set_material(project_materials[mpos > 0 ? mpos - 1 : 0]);
 		}
 	}
 }

+ 145 - 145
armorpaint/Sources/TabLayers.ts

@@ -6,7 +6,7 @@ class TabLayers {
 	static show_context_menu: bool = false;
 
 	static draw = (htab: zui_handle_t) => {
-		let mini: bool = Config.raw.layout[layout_size_t.SIDEBAR_W] <= UIBase.sidebar_mini_w;
+		let mini: bool = config_raw.layout[layout_size_t.SIDEBAR_W] <= UIBase.sidebar_mini_w;
 		mini ? TabLayers.draw_mini(htab) : TabLayers.draw_full(htab);
 	}
 
@@ -56,14 +56,14 @@ class TabLayers {
 		if (zui_button(tr("2D View"))) {
 			UIBase.show_2d_view(view_2d_type_t.LAYER);
 		}
-		else if (ui.is_hovered) zui_tooltip(tr("Show 2D View") + ` (${Config.keymap.toggle_2d_view})`);
+		else if (ui.is_hovered) zui_tooltip(tr("Show 2D View") + ` (${config_keymap.toggle_2d_view})`);
 	}
 
 	static draw_slots = (mini: bool) => {
-		for (let i: i32 = 0; i < Project.layers.length; ++i) {
-			if (i >= Project.layers.length) break; // Layer was deleted
-			let j: i32 = Project.layers.length - 1 - i;
-			let l: SlotLayerRaw = Project.layers[j];
+		for (let i: i32 = 0; i < project_layers.length; ++i) {
+			if (i >= project_layers.length) break; // Layer was deleted
+			let j: i32 = project_layers.length - 1 - i;
+			let l: SlotLayerRaw = project_layers[j];
 			TabLayers.draw_layer_slot(l, j, mini);
 		}
 	}
@@ -82,10 +82,10 @@ class TabLayers {
 	static button_new = (text: string) => {
 		if (zui_button(text)) {
 			UIMenu.draw((ui: zui_t) => {
-				let l: SlotLayerRaw = Context.raw.layer;
+				let l: SlotLayerRaw = context_raw.layer;
 				if (UIMenu.menu_button(ui, tr("Paint Layer"))) {
 					base_new_layer();
-					History.new_layer();
+					history_new_layer();
 				}
 				if (UIMenu.menu_button(ui, tr("Fill Layer"))) {
 					base_create_fill_layer(uv_type_t.UVMAP);
@@ -94,45 +94,45 @@ class TabLayers {
 					base_create_fill_layer(uv_type_t.PROJECT);
 				}
 				if (UIMenu.menu_button(ui, tr("Black Mask"))) {
-					if (SlotLayer.is_mask(l)) Context.set_layer(l.parent);
-					// let l: SlotLayerRaw = Context.raw.layer;
+					if (SlotLayer.is_mask(l)) context_set_layer(l.parent);
+					// let l: SlotLayerRaw = raw.layer;
 
 					let m: SlotLayerRaw = base_new_mask(false, l);
 					let _next = () => {
 						SlotLayer.clear(m, 0x00000000);
 					}
 					base_notify_on_next_frame(_next);
-					Context.raw.layer_preview_dirty = true;
-					History.new_black_mask();
+					context_raw.layer_preview_dirty = true;
+					history_new_black_mask();
 					base_update_fill_layers();
 				}
 				if (UIMenu.menu_button(ui, tr("White Mask"))) {
-					if (SlotLayer.is_mask(l)) Context.set_layer(l.parent);
-					// let l: SlotLayerRaw = Context.raw.layer;
+					if (SlotLayer.is_mask(l)) context_set_layer(l.parent);
+					// let l: SlotLayerRaw = raw.layer;
 
 					let m: SlotLayerRaw = base_new_mask(false, l);
 					let _next = () => {
 						SlotLayer.clear(m, 0xffffffff);
 					}
 					base_notify_on_next_frame(_next);
-					Context.raw.layer_preview_dirty = true;
-					History.new_white_mask();
+					context_raw.layer_preview_dirty = true;
+					history_new_white_mask();
 					base_update_fill_layers();
 				}
 				if (UIMenu.menu_button(ui, tr("Fill Mask"))) {
-					if (SlotLayer.is_mask(l)) Context.set_layer(l.parent);
-					// let l: SlotLayerRaw = Context.raw.layer;
+					if (SlotLayer.is_mask(l)) context_set_layer(l.parent);
+					// let l: SlotLayerRaw = raw.layer;
 
 					let m: SlotLayerRaw = base_new_mask(false, l);
 					let _init = () => {
 						SlotLayer.to_fill_layer(m);
 					}
 					app_notify_on_init(_init);
-					Context.raw.layer_preview_dirty = true;
-					History.new_fill_mask();
+					context_raw.layer_preview_dirty = true;
+					history_new_fill_mask();
 					base_update_fill_layers();
 				}
-				ui.enabled = !SlotLayer.is_group(Context.raw.layer) && !SlotLayer.is_in_group(Context.raw.layer);
+				ui.enabled = !SlotLayer.is_group(context_raw.layer) && !SlotLayer.is_in_group(context_raw.layer);
 				if (UIMenu.menu_button(ui, tr("Group"))) {
 					if (SlotLayer.is_group(l) || SlotLayer.is_in_group(l)) return;
 
@@ -140,13 +140,13 @@ class TabLayers {
 
 					let pointers: map_t<SlotLayerRaw, i32> = TabLayers.init_layer_map();
 					let group = base_new_group();
-					Context.set_layer(l);
-					array_remove(Project.layers, group);
-					Project.layers.splice(Project.layers.indexOf(l) + 1, 0, group);
+					context_set_layer(l);
+					array_remove(project_layers, group);
+					project_layers.splice(project_layers.indexOf(l) + 1, 0, group);
 					l.parent = group;
-					for (let m of Project.materials) TabLayers.remap_layer_pointers(m.canvas.nodes, TabLayers.fill_layer_map(pointers));
-					Context.set_layer(group);
-					History.new_group();
+					for (let m of project_materials) TabLayers.remap_layer_pointers(m.canvas.nodes, TabLayers.fill_layer_map(pointers));
+					context_set_layer(group);
+					history_new_group();
 				}
 				ui.enabled = true;
 			}, 7);
@@ -155,27 +155,27 @@ class TabLayers {
 
 	static combo_filter = () => {
 		let ar: string[] = [tr("All")];
-		for (let p of Project.paint_objects) ar.push(p.base.name);
-		let atlases: string[] = Project.get_used_atlases();
+		for (let p of project_paint_objects) ar.push(p.base.name);
+		let atlases: string[] = project_get_used_atlases();
 		if (atlases != null) for (let a of atlases) ar.push(a);
 		let filter_handle: zui_handle_t = zui_handle("tablayers_0");
-		filter_handle.position = Context.raw.layer_filter;
-		Context.raw.layer_filter = zui_combo(filter_handle, ar, tr("Filter"), false, zui_align_t.LEFT);
+		filter_handle.position = context_raw.layer_filter;
+		context_raw.layer_filter = zui_combo(filter_handle, ar, tr("Filter"), false, zui_align_t.LEFT);
 		if (filter_handle.changed) {
-			for (let p of Project.paint_objects) {
-				p.base.visible = Context.raw.layer_filter == 0 || p.base.name == ar[Context.raw.layer_filter] || Project.is_atlas_object(p);
+			for (let p of project_paint_objects) {
+				p.base.visible = context_raw.layer_filter == 0 || p.base.name == ar[context_raw.layer_filter] || project_is_atlas_object(p);
 			}
-			if (Context.raw.layer_filter == 0 && Context.raw.merged_object_is_atlas) { // All
+			if (context_raw.layer_filter == 0 && context_raw.merged_object_is_atlas) { // All
 				UtilMesh.merge_mesh();
 			}
-			else if (Context.raw.layer_filter > Project.paint_objects.length) { // Atlas
+			else if (context_raw.layer_filter > project_paint_objects.length) { // Atlas
 				let visibles: mesh_object_t[] = [];
-				for (let p of Project.paint_objects) if (p.base.visible) visibles.push(p);
+				for (let p of project_paint_objects) if (p.base.visible) visibles.push(p);
 				UtilMesh.merge_mesh(visibles);
 			}
 			base_set_object_mask();
 			UtilUV.uvmap_cached = false;
-			Context.raw.ddirty = 2;
+			context_raw.ddirty = 2;
 			///if (krom_direct3d12 || krom_vulkan || krom_metal)
 			RenderPathRaytrace.ready = false;
 			///end
@@ -195,13 +195,13 @@ class TabLayers {
 
 	static init_layer_map = (): Map<SlotLayerRaw, i32> => {
 		let res: Map<SlotLayerRaw, i32> = new Map();
-		for (let i: i32 = 0; i < Project.layers.length; ++i) res.set(Project.layers[i], i);
+		for (let i: i32 = 0; i < project_layers.length; ++i) res.set(project_layers[i], i);
 		return res;
 	}
 
 	static fill_layer_map = (map: Map<SlotLayerRaw, i32>): Map<i32, i32> => {
 		let res: Map<i32, i32> = new Map();
-		for (let l of map.keys()) res.set(map.get(l), Project.layers.indexOf(l) > -1 ? Project.layers.indexOf(l) : 9999);
+		for (let l of map.keys()) res.set(map.get(l), project_layers.indexOf(l) > -1 ? project_layers.indexOf(l) : 9999);
 		return res;
 	}
 
@@ -209,15 +209,15 @@ class TabLayers {
 		base_drag_off_x = offX;
 		base_drag_off_y = offY;
 		base_drag_layer = layer;
-		Context.raw.drag_dest = Project.layers.indexOf(layer);
+		context_raw.drag_dest = project_layers.indexOf(layer);
 	}
 
 	static draw_layer_slot = (l: SlotLayerRaw, i: i32, mini: bool) => {
 		let ui: zui_t = UIBase.ui;
 
-		if (Context.raw.layer_filter > 0 &&
+		if (context_raw.layer_filter > 0 &&
 			SlotLayer.get_object_mask(l) > 0 &&
-			SlotLayer.get_object_mask(l) != Context.raw.layer_filter) {
+			SlotLayer.get_object_mask(l) != context_raw.layer_filter) {
 			return;
 		}
 
@@ -233,37 +233,37 @@ class TabLayers {
 
 		// Highlight drag destination
 		let absy: f32 = ui._window_y + ui._y;
-		if (base_is_dragging && base_drag_layer != null && Context.in_layers()) {
+		if (base_is_dragging && base_drag_layer != null && context_in_layers()) {
 			if (mouse_y > absy + step && mouse_y < absy + step * 3) {
-				let down: bool = Project.layers.indexOf(base_drag_layer) >= i;
-				Context.raw.drag_dest = down ? i : i - 1;
+				let down: bool = project_layers.indexOf(base_drag_layer) >= i;
+				context_raw.drag_dest = down ? i : i - 1;
 
-				let ls: SlotLayerRaw[] = Project.layers;
-				let dest: i32 = Context.raw.drag_dest;
+				let ls: SlotLayerRaw[] = project_layers;
+				let dest: i32 = context_raw.drag_dest;
 				let to_group: bool = down ? dest > 0 && ls[dest - 1].parent != null && ls[dest - 1].parent.show_panel : dest < ls.length && ls[dest].parent != null && ls[dest].parent.show_panel;
 				let nested_group: bool = SlotLayer.is_group(base_drag_layer) && to_group;
 				if (!nested_group) {
-					if (SlotLayer.can_move(Context.raw.layer, Context.raw.drag_dest)) {
+					if (SlotLayer.can_move(context_raw.layer, context_raw.drag_dest)) {
 						zui_fill(checkw, step * 2, (ui._window_w / zui_SCALE(ui) - 2) - checkw, 2 * zui_SCALE(ui), ui.t.HIGHLIGHT_COL);
 					}
 				}
 			}
-			else if (i == Project.layers.length - 1 && mouse_y < absy + step) {
-				Context.raw.drag_dest = Project.layers.length - 1;
-				if (SlotLayer.can_move(Context.raw.layer, Context.raw.drag_dest)) {
+			else if (i == project_layers.length - 1 && mouse_y < absy + step) {
+				context_raw.drag_dest = project_layers.length - 1;
+				if (SlotLayer.can_move(context_raw.layer, context_raw.drag_dest)) {
 					zui_fill(checkw, 0, (ui._window_w / zui_SCALE(ui) - 2) - checkw, 2 * zui_SCALE(ui), ui.t.HIGHLIGHT_COL);
 				}
 			}
 		}
-		if (base_is_dragging && (base_drag_material != null || base_drag_swatch != null) && Context.in_layers()) {
+		if (base_is_dragging && (base_drag_material != null || base_drag_swatch != null) && context_in_layers()) {
 			if (mouse_y > absy + step && mouse_y < absy + step * 3) {
-				Context.raw.drag_dest = i;
+				context_raw.drag_dest = i;
 				if (TabLayers.can_drop_new_layer(i))
 					zui_fill(checkw, 2 * step, (ui._window_w / zui_SCALE(ui) - 2) - checkw, 2 * zui_SCALE(ui), ui.t.HIGHLIGHT_COL);
 			}
-			else if (i == Project.layers.length - 1 && mouse_y < absy + step) {
-				Context.raw.drag_dest = Project.layers.length;
-				if (TabLayers.can_drop_new_layer(Project.layers.length))
+			else if (i == project_layers.length - 1 && mouse_y < absy + step) {
+				context_raw.drag_dest = project_layers.length;
+				if (TabLayers.can_drop_new_layer(project_layers.length))
 					zui_fill(checkw, 0, (ui._window_w / zui_SCALE(ui) - 2) - checkw, 2 * zui_SCALE(ui), ui.t.HIGHLIGHT_COL);
 			}
 		}
@@ -305,8 +305,8 @@ class TabLayers {
 		}
 
 		// Draw eye icon
-		let icons: image_t = Res.get("icons.k");
-		let r: rect_t = Res.tile18(icons, l.visible ? 0 : 1, 0);
+		let icons: image_t = resource_get("icons.k");
+		let r: rect_t = resource_tile18(icons, l.visible ? 0 : 1, 0);
 		let center: f32 = (step / 2) * zui_SCALE(ui);
 		ui._x += 2;
 		ui._y += 3;
@@ -340,7 +340,7 @@ class TabLayers {
 		ui._x -= 2;
 		ui._y -= 3;
 
-		if (Config.raw.touch_ui) {
+		if (config_raw.touch_ui) {
 			ui._x += 12 * zui_SCALE(ui);
 		}
 
@@ -362,31 +362,31 @@ class TabLayers {
 				ui.input_x > ui._window_x + ui._x && ui.input_x < ui._window_x + ui._window_w &&
 				ui.input_y > ui._window_y + ui._y - center && ui.input_y < ui._window_y + ui._y - center + (step * zui_SCALE(ui)) * 2) {
 				if (ui.input_started) {
-					Context.set_layer(l);
-					TabLayers.set_drag_layer(Context.raw.layer, -(mouse_x - uix - ui._window_x - 3), -(mouse_y - uiy - ui._window_y + 1));
+					context_set_layer(l);
+					TabLayers.set_drag_layer(context_raw.layer, -(mouse_x - uix - ui._window_x - 3), -(mouse_y - uiy - ui._window_y + 1));
 				}
 				else if (ui.input_released_r) {
-					Context.set_layer(l);
+					context_set_layer(l);
 					TabLayers.show_context_menu = true;
 				}
 			}
 
 			let state: zui_state_t = zui_text(l.name);
 			if (state == zui_state_t.RELEASED) {
-				if (time_time() - Context.raw.select_time < 0.25) {
+				if (time_time() - context_raw.select_time < 0.25) {
 					TabLayers.layer_name_edit = l.id;
 					TabLayers.layer_name_handle.text = l.name;
 					zui_start_text_edit(TabLayers.layer_name_handle);
 				}
-				Context.raw.select_time = time_time();
+				context_raw.select_time = time_time();
 			}
 
 			let in_focus: bool = ui.input_x > ui._window_x && ui.input_x < ui._window_x + ui._window_w &&
 						  		 ui.input_y > ui._window_y && ui.input_y < ui._window_y + ui._window_h;
-			if (in_focus && ui.is_delete_down && TabLayers.can_delete(Context.raw.layer)) {
+			if (in_focus && ui.is_delete_down && TabLayers.can_delete(context_raw.layer)) {
 				ui.is_delete_down = false;
 				let _init = () => {
-					TabLayers.delete_layer(Context.raw.layer);
+					TabLayers.delete_layer(context_raw.layer);
 				}
 				app_notify_on_init(_init);
 			}
@@ -433,7 +433,7 @@ class TabLayers {
 			zui_end_element();
 			zui_end_element();
 
-			if (Config.raw.touch_ui) {
+			if (config_raw.touch_ui) {
 				ui._x += 12 * zui_SCALE(ui);
 			}
 
@@ -446,18 +446,18 @@ class TabLayers {
 
 	static combo_object = (ui: zui_t, l: SlotLayerRaw, label = false): zui_handle_t => {
 		let ar: string[] = [tr("Shared")];
-		for (let p of Project.paint_objects) ar.push(p.base.name);
-		let atlases: string[] = Project.get_used_atlases();
+		for (let p of project_paint_objects) ar.push(p.base.name);
+		let atlases: string[] = project_get_used_atlases();
 		if (atlases != null) for (let a of atlases) ar.push(a);
 		let object_handle: zui_handle_t = zui_nest(zui_handle("tablayers_2"), l.id);
 		object_handle.position = l.object_mask;
 		l.object_mask = zui_combo(object_handle, ar, tr("Object"), label, zui_align_t.LEFT);
 		if (object_handle.changed) {
-			Context.set_layer(l);
+			context_set_layer(l);
 			MakeMaterial.parse_mesh_material();
 			if (l.fill_layer != null) { // Fill layer
 				let _init = () => {
-					Context.raw.material = l.fill_layer;
+					context_raw.material = l.fill_layer;
 					SlotLayer.clear(l);
 					base_update_fill_layers();
 				}
@@ -494,8 +494,8 @@ class TabLayers {
 			tr("Value"),
 		], tr("Blending"), label);
 		if (blending_handle.changed) {
-			Context.set_layer(l);
-			History.layer_blending();
+			context_set_layer(l);
+			history_layer_blending();
 			l.blending = blending_handle.position;
 			MakeMaterial.parse_mesh_material();
 		}
@@ -516,7 +516,7 @@ class TabLayers {
 		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 (context_raw.layer == l) {
 			if (mini) {
 				zui_rect(1, -step * 2, ui._w / zui_SCALE(ui) - 1, step * 2 + (mini ? -1 : 1), ui.t.HIGHLIGHT_COL, 3);
 			}
@@ -542,39 +542,39 @@ class TabLayers {
 		if (ui.is_hovered && texpaint_preview != null) {
 			if (SlotLayer.is_mask(l)) {
 				TabLayers.make_mask_preview_rgba32(l);
-				zui_tooltip_image(Context.raw.mask_preview_rgba32);
+				zui_tooltip_image(context_raw.mask_preview_rgba32);
 			}
 			else {
 				zui_tooltip_image(texpaint_preview);
 			}
-			if (i < 9) zui_tooltip(l.name + " - (" + Config.keymap.select_layer + " " + (i + 1) + ")");
+			if (i < 9) zui_tooltip(l.name + " - (" + config_keymap.select_layer + " " + (i + 1) + ")");
 			else zui_tooltip(l.name);
 		}
 
 		// Show context menu
 		if (ui.is_hovered && ui.input_released_r) {
-			Context.set_layer(l);
+			context_set_layer(l);
 			TabLayers.show_context_menu = true;
 		}
 
 		if (state == zui_state_t.STARTED) {
-			Context.set_layer(l);
-			TabLayers.set_drag_layer(Context.raw.layer, -(mouse_x - uix - ui._window_x - 3), -(mouse_y - uiy - ui._window_y + 1));
+			context_set_layer(l);
+			TabLayers.set_drag_layer(context_raw.layer, -(mouse_x - uix - ui._window_x - 3), -(mouse_y - uiy - ui._window_y + 1));
 		}
 		else if (state == zui_state_t.RELEASED) {
-			if (time_time() - Context.raw.select_time < 0.2) {
+			if (time_time() - context_raw.select_time < 0.2) {
 				UIBase.show_2d_view(view_2d_type_t.LAYER);
 			}
-			if (time_time() - Context.raw.select_time > 0.2) {
-				Context.raw.select_time = time_time();
+			if (time_time() - context_raw.select_time > 0.2) {
+				context_raw.select_time = time_time();
 			}
-			if (l.fill_layer != null) Context.set_material(l.fill_layer);
+			if (l.fill_layer != null) context_set_material(l.fill_layer);
 		}
 	}
 
 	static draw_layer_icon = (l: SlotLayerRaw, i: i32, uix: f32, uiy: f32, mini: bool) => {
 		let ui: zui_t = UIBase.ui;
-		let icons: image_t = Res.get("icons.k");
+		let icons: image_t = resource_get("icons.k");
 		let icon_h: i32 = (zui_ELEMENT_H(ui) - (mini ? 2 : 3)) * 2;
 
 		if (mini && zui_SCALE(ui) > 1) {
@@ -601,7 +601,7 @@ class TabLayers {
 			let icon: image_t = l.fill_layer == null ? texpaint_preview : l.fill_layer.image_icon;
 			if (l.fill_layer == null) {
 				// Checker
-				let r: rect_t = Res.tile50(icons, 4, 1);
+				let r: rect_t = resource_tile50(icons, 4, 1);
 				let _x: f32 = ui._x;
 				let _y: f32 = ui._y;
 				let _w: f32 = ui._w;
@@ -628,7 +628,7 @@ class TabLayers {
 			// Draw layer numbers when selecting a layer via keyboard shortcut
 			let is_typing: bool = ui.is_typing || UIView2D.ui.is_typing || UINodes.ui.is_typing;
 			if (!is_typing) {
-				if (i < 9 && Operator.shortcut(Config.keymap.select_layer, ShortcutType.ShortcutDown)) {
+				if (i < 9 && operator_shortcut(config_keymap.select_layer, shortcut_type_t.DOWN)) {
 					let number: string = String(i + 1) ;
 					let width: i32 = g2_font_width(ui.font, ui.font_size, number) + 10;
 					let height: i32 = g2_font_height(ui.font, ui.font_size);
@@ -642,23 +642,23 @@ class TabLayers {
 			return state;
 		}
 		else { // Group
-			let folder_closed: rect_t = Res.tile50(icons, 2, 1);
-			let folder_open: rect_t = Res.tile50(icons, 8, 1);
+			let folder_closed: rect_t = resource_tile50(icons, 2, 1);
+			let folder_open: rect_t = resource_tile50(icons, 8, 1);
 			let folder: rect_t = l.show_panel ? folder_open : folder_closed;
 			return zui_image(icons, ui.t.LABEL_COL - 0x00202020, icon_h, folder.x, folder.y, folder.w, folder.h);
 		}
 	}
 
 	static can_merge_down = (l: SlotLayerRaw) : bool => {
-		let index: i32 = Project.layers.indexOf(l);
+		let index: i32 = project_layers.indexOf(l);
 		// Lowest layer
 		if (index == 0) return false;
 		// Lowest layer that has masks
-		if (SlotLayer.is_layer(l) && SlotLayer.is_mask(Project.layers[0]) && Project.layers[0].parent == l) return false;
+		if (SlotLayer.is_layer(l) && SlotLayer.is_mask(project_layers[0]) && project_layers[0].parent == l) return false;
 		// The lowest toplevel layer is a group
-		if (SlotLayer.is_group(l) && SlotLayer.is_in_group(Project.layers[0]) && SlotLayer.get_containing_group(Project.layers[0]) == l) return false;
+		if (SlotLayer.is_group(l) && SlotLayer.is_in_group(project_layers[0]) && SlotLayer.get_containing_group(project_layers[0]) == l) return false;
 		// Masks must be merged down to masks
-		if (SlotLayer.is_mask(l) && !SlotLayer.is_mask(Project.layers[index - 1])) return false;
+		if (SlotLayer.is_mask(l) && !SlotLayer.is_mask(project_layers[index - 1])) return false;
 		return true;
 	}
 
@@ -708,12 +708,12 @@ class TabLayers {
 						let f: string = UIFiles.filename;
 						if (f == "") f = tr("untitled");
 						if (!f.endsWith(".png")) f += ".png";
-						krom_write_png(path + Path.sep + f, image_get_pixels(l.texpaint), l.texpaint.width, l.texpaint.height, 3); // RRR1
+						krom_write_png(path + path_sep + f, image_get_pixels(l.texpaint), l.texpaint.width, l.texpaint.height, 3); // RRR1
 					});
 				}
 				else {
 					///if is_paint
-					Context.raw.layers_export = export_mode_t.SELECTED;
+					context_raw.layers_export = export_mode_t.SELECTED;
 					BoxExport.show_textures();
 					///end
 				}
@@ -725,14 +725,14 @@ class TabLayers {
 
 				if (l.fill_layer == null && UIMenu.menu_button(ui, to_fill_string)) {
 					let _init = () => {
-						SlotLayer.is_layer(l) ? History.to_fill_layer() : History.to_fill_mask();
+						SlotLayer.is_layer(l) ? history_to_fill_layer() : history_to_fill_mask();
 						SlotLayer.to_fill_layer(l);
 					}
 					app_notify_on_init(_init);
 				}
 				if (l.fill_layer != null && UIMenu.menu_button(ui, to_paint_string)) {
 					let _init = () => {
-						SlotLayer.is_layer(l) ? History.to_paint_layer() : History.to_paint_mask();
+						SlotLayer.is_layer(l) ? history_to_paint_layer() : history_to_paint_mask();
 						SlotLayer.to_paint_layer(l);
 					}
 					app_notify_on_init(_init);
@@ -742,47 +742,47 @@ class TabLayers {
 			ui.enabled = TabLayers.can_delete(l);
 			if (UIMenu.menu_button(ui, tr("Delete"), "delete")) {
 				let _init = () => {
-					TabLayers.delete_layer(Context.raw.layer);
+					TabLayers.delete_layer(context_raw.layer);
 				}
 				app_notify_on_init(_init);
 			}
 			ui.enabled = true;
 
 			if (l.fill_layer == null && UIMenu.menu_button(ui, tr("Clear"))) {
-				Context.set_layer(l);
+				context_set_layer(l);
 				let _init = () => {
 					if (!SlotLayer.is_group(l)) {
-						History.clear_layer();
+						history_clear_layer();
 						SlotLayer.clear(l);
 					}
 					else {
 						for (let c of SlotLayer.get_children(l)) {
-							Context.raw.layer = c;
-							History.clear_layer();
+							context_raw.layer = c;
+							history_clear_layer();
 							SlotLayer.clear(c);
 						}
-						Context.raw.layers_preview_dirty = true;
-						Context.raw.layer = l;
+						context_raw.layers_preview_dirty = true;
+						context_raw.layer = l;
 					}
 				}
 				app_notify_on_init(_init);
 			}
 			if (SlotLayer.is_mask(l) && l.fill_layer == null && UIMenu.menu_button(ui, tr("Invert"))) {
 				let _init = () => {
-					Context.set_layer(l);
-					History.invert_mask();
+					context_set_layer(l);
+					history_invert_mask();
 					SlotLayer.invert_mask(l);
 				}
 				app_notify_on_init(_init);
 			}
 			if (SlotLayer.is_mask(l) && UIMenu.menu_button(ui, tr("Apply"))) {
 				let _init = () => {
-					Context.raw.layer = l;
-					History.apply_mask();
+					context_raw.layer = l;
+					history_apply_mask();
 					SlotLayer.apply_mask(l);
-					Context.set_layer(l.parent);
+					context_set_layer(l.parent);
 					MakeMaterial.parse_mesh_material();
-					Context.raw.layers_preview_dirty = true;
+					context_raw.layers_preview_dirty = true;
 				}
 				app_notify_on_init(_init);
 			}
@@ -795,18 +795,18 @@ class TabLayers {
 			ui.enabled = TabLayers.can_merge_down(l);
 			if (UIMenu.menu_button(ui, tr("Merge Down"))) {
 				let _init = () => {
-					Context.set_layer(l);
-					History.merge_layers();
+					context_set_layer(l);
+					history_merge_layers();
 					base_merge_down();
-					if (Context.raw.layer.fill_layer != null) SlotLayer.to_paint_layer(Context.raw.layer);
+					if (context_raw.layer.fill_layer != null) SlotLayer.to_paint_layer(context_raw.layer);
 				}
 				app_notify_on_init(_init);
 			}
 			ui.enabled = true;
 			if (UIMenu.menu_button(ui, tr("Duplicate"))) {
 				let _init = () => {
-					Context.set_layer(l);
-					History.duplicate_layer();
+					context_set_layer(l);
+					history_duplicate_layer();
 					base_duplicate_layer(l);
 				}
 				app_notify_on_init(_init);
@@ -818,7 +818,7 @@ class TabLayers {
 			layer_opac_handle.value = l.mask_opacity;
 			zui_slider(layer_opac_handle, tr("Opacity"), 0.0, 1.0, true);
 			if (layer_opac_handle.changed) {
-				if (ui.input_started) History.layer_opacity();
+				if (ui.input_started) history_layer_opacity();
 				l.mask_opacity = layer_opac_handle.value;
 				MakeMaterial.parse_mesh_material();
 				UIMenu.keep_open = true;
@@ -866,8 +866,8 @@ class TabLayers {
 				scale_handle.value = l.scale;
 				l.scale = zui_slider(scale_handle, tr("UV Scale"), 0.0, 5.0, true);
 				if (scale_handle.changed) {
-					Context.set_material(l.fill_layer);
-					Context.set_layer(l);
+					context_set_material(l.fill_layer);
+					context_set_layer(l);
 					let _init = () => {
 						base_update_fill_layers();
 					}
@@ -881,8 +881,8 @@ class TabLayers {
 				angle_handle.value = l.angle;
 				l.angle = zui_slider(angle_handle, tr("Angle"), 0.0, 360, true, 1);
 				if (angle_handle.changed) {
-					Context.set_material(l.fill_layer);
-					Context.set_layer(l);
+					context_set_material(l.fill_layer);
+					context_set_layer(l);
 					MakeMaterial.parse_paint_material();
 					let _init = () => {
 						base_update_fill_layers();
@@ -897,8 +897,8 @@ class TabLayers {
 				uv_type_handle.position = l.uv_type;
 				l.uv_type = zui_inline_radio(uv_type_handle, [tr("UV Map"), tr("Triplanar"), tr("Project")], zui_align_t.LEFT);
 				if (uv_type_handle.changed) {
-					Context.set_material(l.fill_layer);
-					Context.set_layer(l);
+					context_set_material(l.fill_layer);
+					context_set_layer(l);
 					MakeMaterial.parse_paint_material();
 					let _init = () => {
 						base_update_fill_layers();
@@ -973,14 +973,14 @@ class TabLayers {
 
 	static make_mask_preview_rgba32 = (l: SlotLayerRaw) => {
 		///if is_paint
-		if (Context.raw.mask_preview_rgba32 == null) {
-			Context.raw.mask_preview_rgba32 = image_create_render_target(UtilRender.layer_preview_size, UtilRender.layer_preview_size);
+		if (context_raw.mask_preview_rgba32 == null) {
+			context_raw.mask_preview_rgba32 = image_create_render_target(UtilRender.layer_preview_size, UtilRender.layer_preview_size);
 		}
 		// Convert from R8 to RGBA32 for tooltip display
-		if (Context.raw.mask_preview_last != l) {
-			Context.raw.mask_preview_last = l;
+		if (context_raw.mask_preview_last != l) {
+			context_raw.mask_preview_last = l;
 			app_notify_on_init(() => {
-				g2_begin(Context.raw.mask_preview_rgba32);
+				g2_begin(context_raw.mask_preview_rgba32);
 				g2_set_pipeline(UIView2D.pipe);
 				g4_set_int(UIView2D.channel_location, 1);
 				g2_draw_image(l.texpaint_preview, 0, 0);
@@ -996,8 +996,8 @@ class TabLayers {
 
 		if (SlotLayer.is_layer(l) && SlotLayer.has_masks(l, false)) {
 			for (let m of SlotLayer.get_masks(l, false)) {
-				Context.raw.layer = m;
-				History.delete_layer();
+				context_raw.layer = m;
+				history_delete_layer();
 				SlotLayer.delete(m);
 			}
 		}
@@ -1005,30 +1005,30 @@ class TabLayers {
 			for (let c of SlotLayer.get_children(l)) {
 				if (SlotLayer.has_masks(c, false)) {
 					for (let m of SlotLayer.get_masks(c, false)) {
-						Context.raw.layer = m;
-						History.delete_layer();
+						context_raw.layer = m;
+						history_delete_layer();
 						SlotLayer.delete(m);
 					}
 				}
-				Context.raw.layer = c;
-				History.delete_layer();
+				context_raw.layer = c;
+				history_delete_layer();
 				SlotLayer.delete(c);
 			}
 			if (SlotLayer.has_masks(l)) {
 				for (let m of SlotLayer.get_masks(l)) {
-					Context.raw.layer = m;
-					History.delete_layer();
+					context_raw.layer = m;
+					history_delete_layer();
 					SlotLayer.delete(m);
 				}
 			}
 		}
 
-		Context.raw.layer = l;
-		History.delete_layer();
+		context_raw.layer = l;
+		history_delete_layer();
 		SlotLayer.delete(l);
 
 		if (SlotLayer.is_mask(l)) {
-			Context.raw.layer = l.parent;
+			context_raw.layer = l.parent;
 			base_update_fill_layers();
 		}
 
@@ -1038,17 +1038,17 @@ class TabLayers {
 			// Maybe some group masks are left
 			if (SlotLayer.has_masks(g)) {
 				for (let m of SlotLayer.get_masks(g)) {
-					Context.raw.layer = m;
-					History.delete_layer();
+					context_raw.layer = m;
+					history_delete_layer();
 					SlotLayer.delete(m);
 				}
 			}
-			Context.raw.layer = l.parent;
-			History.delete_layer();
+			context_raw.layer = l.parent;
+			history_delete_layer();
 			SlotLayer.delete(l.parent);
 		}
-		Context.raw.ddirty = 2;
-		for (let m of Project.materials) TabLayers.remap_layer_pointers(m.canvas.nodes, TabLayers.fill_layer_map(pointers));
+		context_raw.ddirty = 2;
+		for (let m of project_materials) TabLayers.remap_layer_pointers(m.canvas.nodes, TabLayers.fill_layer_map(pointers));
 	}
 
 	static can_delete = (l: SlotLayerRaw) => {
@@ -1056,7 +1056,7 @@ class TabLayers {
 
 		if (SlotLayer.is_mask(l)) return true;
 
-		for (let slot of Project.layers) {
+		for (let slot of project_layers) {
 			if (SlotLayer.is_layer(slot)) ++num_layers;
 		}
 
@@ -1068,7 +1068,7 @@ class TabLayers {
 	}
 
 	static can_drop_new_layer = (position: i32) => {
-		if (position > 0 && position < Project.layers.length && SlotLayer.is_mask(Project.layers[position - 1])) {
+		if (position > 0 && position < project_layers.length && SlotLayer.is_mask(project_layers[position - 1])) {
 			// 1. The layer to insert is inserted in the middle
 			// 2. The layer below is a mask, i.e. the layer would have to be a (group) mask, too.
 			return false;

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

@@ -5,13 +5,13 @@ class BrushOutputNode extends LogicNode {
 
 	constructor() {
 		super();
-		Context.raw.run_brush = this.run;
-		Context.raw.parse_brush_inputs = this.parse_inputs;
+		context_raw.run_brush = this.run;
+		context_raw.parse_brush_inputs = this.parse_inputs;
 	}
 
 	parse_inputs = () => {
-		let last_mask: image_t = Context.raw.brush_mask_image;
-		let last_stencil: image_t = Context.raw.brush_stencil_image;
+		let last_mask: image_t = context_raw.brush_mask_image;
+		let last_stencil: image_t = context_raw.brush_stencil_image;
 
 		let input0: any;
 		let input1: any;
@@ -33,77 +33,77 @@ class BrushOutputNode extends LogicNode {
 			return;
 		}
 
-		Context.raw.paint_vec = input0;
-		Context.raw.brush_nodes_radius = input1;
-		Context.raw.brush_nodes_scale = input2;
-		Context.raw.brush_nodes_angle = input3;
+		context_raw.paint_vec = input0;
+		context_raw.brush_nodes_radius = input1;
+		context_raw.brush_nodes_scale = input2;
+		context_raw.brush_nodes_angle = input3;
 
 		let opac: any = input4; // Float or texture name
 		if (opac == null) opac = 1.0;
 		if (typeof opac == "string") {
-			Context.raw.brush_mask_image_is_alpha = opac.endsWith(".a");
+			context_raw.brush_mask_image_is_alpha = opac.endsWith(".a");
 			opac = opac.substr(0, opac.lastIndexOf("."));
-			Context.raw.brush_nodes_opacity = 1.0;
-			let index: i32 = Project.asset_names.indexOf(opac);
-			let asset: asset_t = Project.assets[index];
-			Context.raw.brush_mask_image = Project.get_image(asset);
+			context_raw.brush_nodes_opacity = 1.0;
+			let index: i32 = project_asset_names.indexOf(opac);
+			let asset: asset_t = project_assets[index];
+			context_raw.brush_mask_image = project_get_image(asset);
 		}
 		else {
-			Context.raw.brush_nodes_opacity = opac;
-			Context.raw.brush_mask_image = null;
+			context_raw.brush_nodes_opacity = opac;
+			context_raw.brush_mask_image = null;
 		}
 
-		Context.raw.brush_nodes_hardness = input5;
+		context_raw.brush_nodes_hardness = input5;
 
 		let stencil: any = input6; // Float or texture name
 		if (stencil == null) stencil = 1.0;
 		if (typeof stencil == "string") {
-			Context.raw.brush_stencil_image_is_alpha = stencil.endsWith(".a");
+			context_raw.brush_stencil_image_is_alpha = stencil.endsWith(".a");
 			stencil = stencil.substr(0, stencil.lastIndexOf("."));
-			let index: i32 = Project.asset_names.indexOf(stencil);
-			let asset: asset_t = Project.assets[index];
-			Context.raw.brush_stencil_image = Project.get_image(asset);
+			let index: i32 = project_asset_names.indexOf(stencil);
+			let asset: asset_t = project_assets[index];
+			context_raw.brush_stencil_image = project_get_image(asset);
 		}
 		else {
-			Context.raw.brush_stencil_image = null;
+			context_raw.brush_stencil_image = null;
 		}
 
-		if (last_mask != Context.raw.brush_mask_image ||
-			last_stencil != Context.raw.brush_stencil_image) {
+		if (last_mask != context_raw.brush_mask_image ||
+			last_stencil != context_raw.brush_stencil_image) {
 			MakeMaterial.parse_paint_material();
 		}
 
-		Context.raw.brush_directional = this.Directional;
+		context_raw.brush_directional = this.Directional;
 	}
 
 	run = (from: i32) => {
 		let left: f32 = 0.0;
 		let right: f32 = 1.0;
-		if (Context.raw.paint2d) {
+		if (context_raw.paint2d) {
 			left = 1.0;
-			right = (Context.raw.split_view ? 2.0 : 1.0) + UIView2D.ww / base_w();
+			right = (context_raw.split_view ? 2.0 : 1.0) + UIView2D.ww / base_w();
 		}
 
 		// First time init
-		if (Context.raw.last_paint_x < 0 || Context.raw.last_paint_y < 0) {
-			Context.raw.last_paint_vec_x = Context.raw.paint_vec.x;
-			Context.raw.last_paint_vec_y = Context.raw.paint_vec.y;
+		if (context_raw.last_paint_x < 0 || context_raw.last_paint_y < 0) {
+			context_raw.last_paint_vec_x = context_raw.paint_vec.x;
+			context_raw.last_paint_vec_y = context_raw.paint_vec.y;
 		}
 
 		// Do not paint over fill layer
-		let fill_layer: bool = Context.raw.layer.fill_layer != null && Context.raw.tool != workspace_tool_t.PICKER && Context.raw.tool != workspace_tool_t.MATERIAL && Context.raw.tool != workspace_tool_t.COLORID;
+		let fill_layer: bool = context_raw.layer.fill_layer != null && context_raw.tool != workspace_tool_t.PICKER && context_raw.tool != workspace_tool_t.MATERIAL && context_raw.tool != workspace_tool_t.COLORID;
 
 		// Do not paint over groups
-		let group_layer: bool = SlotLayer.is_group(Context.raw.layer);
+		let group_layer: bool = SlotLayer.is_group(context_raw.layer);
 
 		// Paint bounds
-		if (Context.raw.paint_vec.x > left &&
-			Context.raw.paint_vec.x < right &&
-			Context.raw.paint_vec.y > 0 &&
-			Context.raw.paint_vec.y < 1 &&
+		if (context_raw.paint_vec.x > left &&
+			context_raw.paint_vec.x < right &&
+			context_raw.paint_vec.y > 0 &&
+			context_raw.paint_vec.y < 1 &&
 			!fill_layer &&
 			!group_layer &&
-			(SlotLayer.is_visible(Context.raw.layer) || Context.raw.paint2d) &&
+			(SlotLayer.is_visible(context_raw.layer) || context_raw.paint2d) &&
 			!UIBase.ui.is_hovered &&
 			!base_is_dragging &&
 			!base_is_resizing &&
@@ -112,34 +112,34 @@ class BrushOutputNode extends LogicNode {
 
 			// Set color pick
 			let down: bool = mouse_down() || pen_down();
-			if (down && Context.raw.tool == workspace_tool_t.COLORID && Project.assets.length > 0) {
-				Context.raw.colorid_picked = true;
+			if (down && context_raw.tool == workspace_tool_t.COLORID && project_assets.length > 0) {
+				context_raw.colorid_picked = true;
 				UIToolbar.toolbar_handle.redraws = 1;
 			}
 
 			// Prevent painting the same spot
-			let same_spot: bool = Context.raw.paint_vec.x == Context.raw.last_paint_x && Context.raw.paint_vec.y == Context.raw.last_paint_y;
-			let lazy: bool = Context.raw.tool == workspace_tool_t.BRUSH && Context.raw.brush_lazy_radius > 0;
+			let same_spot: bool = context_raw.paint_vec.x == context_raw.last_paint_x && context_raw.paint_vec.y == context_raw.last_paint_y;
+			let lazy: bool = context_raw.tool == workspace_tool_t.BRUSH && context_raw.brush_lazy_radius > 0;
 			if (down && (same_spot || lazy)) {
-				Context.raw.painted++;
+				context_raw.painted++;
 			}
 			else {
-				Context.raw.painted = 0;
+				context_raw.painted = 0;
 			}
-			Context.raw.last_paint_x = Context.raw.paint_vec.x;
-			Context.raw.last_paint_y = Context.raw.paint_vec.y;
+			context_raw.last_paint_x = context_raw.paint_vec.x;
+			context_raw.last_paint_y = context_raw.paint_vec.y;
 
-			if (Context.raw.tool == workspace_tool_t.PARTICLE) {
-				Context.raw.painted = 0; // Always paint particles
+			if (context_raw.tool == workspace_tool_t.PARTICLE) {
+				context_raw.painted = 0; // Always paint particles
 			}
 
-			if (Context.raw.painted == 0) {
+			if (context_raw.painted == 0) {
 				this.parse_inputs();
 			}
 
-			if (Context.raw.painted <= 1) {
-				Context.raw.pdirty = 1;
-				Context.raw.rdirty = 2;
+			if (context_raw.painted <= 1) {
+				context_raw.pdirty = 1;
+				context_raw.rdirty = 2;
 			}
 		}
 	}

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

@@ -25,16 +25,16 @@ class InputNode extends LogicNode {
 	}
 
 	update = () => {
-		if (Context.raw.split_view) {
-			Context.raw.view_index = mouse_view_x() > base_w() / 2 ? 1 : 0;
+		if (context_raw.split_view) {
+			context_raw.view_index = mouse_view_x() > base_w() / 2 ? 1 : 0;
 		}
 
-		let decal: bool = Context.raw.tool == workspace_tool_t.DECAL || Context.raw.tool == workspace_tool_t.TEXT;
-		let decal_mask: bool = decal && Operator.shortcut(Config.keymap.decal_mask + "+" + Config.keymap.action_paint, ShortcutType.ShortcutDown);
+		let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT;
+		let decal_mask: bool = decal && operator_shortcut(config_keymap.decal_mask + "+" + config_keymap.action_paint, shortcut_type_t.DOWN);
 
-		let lazy_paint: bool = Context.raw.brush_lazy_radius > 0 &&
-			(Operator.shortcut(Config.keymap.action_paint, ShortcutType.ShortcutDown) ||
-			 Operator.shortcut(Config.keymap.brush_ruler + "+" + Config.keymap.action_paint, ShortcutType.ShortcutDown) ||
+		let lazy_paint: bool = context_raw.brush_lazy_radius > 0 &&
+			(operator_shortcut(config_keymap.action_paint, shortcut_type_t.DOWN) ||
+			 operator_shortcut(config_keymap.brush_ruler + "+" + config_keymap.action_paint, shortcut_type_t.DOWN) ||
 			 decal_mask);
 
 		let paint_x: f32 = mouse_view_x() / app_w();
@@ -53,22 +53,22 @@ class InputNode extends LogicNode {
 			InputNode.startY = pen_view_y() / app_h();
 		}
 
-		if (Operator.shortcut(Config.keymap.brush_ruler + "+" + Config.keymap.action_paint, ShortcutType.ShortcutDown)) {
+		if (operator_shortcut(config_keymap.brush_ruler + "+" + config_keymap.action_paint, shortcut_type_t.DOWN)) {
 			if (InputNode.lock_x) paint_x = InputNode.startX;
 			if (InputNode.lock_y) paint_y = InputNode.startY;
 		}
 
-		if (Context.raw.brush_lazy_radius > 0) {
-			Context.raw.brush_lazy_x = paint_x;
-			Context.raw.brush_lazy_y = paint_y;
+		if (context_raw.brush_lazy_radius > 0) {
+			context_raw.brush_lazy_x = paint_x;
+			context_raw.brush_lazy_y = paint_y;
 		}
 		if (!lazy_paint) {
 			InputNode.coords.x = paint_x;
 			InputNode.coords.y = paint_y;
 		}
 
-		if (Context.raw.split_view) {
-			Context.raw.view_index = -1;
+		if (context_raw.split_view) {
+			context_raw.view_index = -1;
 		}
 
 		if (InputNode.lock_begin) {
@@ -80,44 +80,44 @@ class InputNode extends LogicNode {
 			}
 		}
 
-		if (keyboard_started(Config.keymap.brush_ruler)) {
+		if (keyboard_started(config_keymap.brush_ruler)) {
 			InputNode.lock_start_x = mouse_view_x();
 			InputNode.lock_start_y = mouse_view_y();
 			InputNode.lock_begin = true;
 		}
-		else if (keyboard_released(Config.keymap.brush_ruler)) {
+		else if (keyboard_released(config_keymap.brush_ruler)) {
 			InputNode.lock_x = InputNode.lock_y = InputNode.lock_begin = false;
 		}
 
-		if (Context.raw.brush_lazy_radius > 0) {
-			let v1: vec4_t = vec4_create(Context.raw.brush_lazy_x * app_w(), Context.raw.brush_lazy_y * app_h(), 0.0);
+		if (context_raw.brush_lazy_radius > 0) {
+			let v1: vec4_t = vec4_create(context_raw.brush_lazy_x * app_w(), context_raw.brush_lazy_y * app_h(), 0.0);
 			let v2: vec4_t = vec4_create(InputNode.coords.x * app_w(), InputNode.coords.y * app_h(), 0.0);
 			let d: f32 = vec4_dist(v1, v2);
-			let r: f32 = Context.raw.brush_lazy_radius * 85;
+			let r: f32 = context_raw.brush_lazy_radius * 85;
 			if (d > r) {
 				let v3: vec4_t = vec4_create();
 				vec4_sub_vecs(v3, v2, v1);
 				vec4_normalize(v3, );
-				vec4_mult(v3, 1.0 - Context.raw.brush_lazy_step);
+				vec4_mult(v3, 1.0 - context_raw.brush_lazy_step);
 				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
-				Context.raw.painted = -1;
+				context_raw.painted = -1;
 			}
-			Context.raw.last_paint_x = -1;
-			Context.raw.last_paint_y = -1;
+			context_raw.last_paint_x = -1;
+			context_raw.last_paint_y = -1;
 		}
 
-		Context.raw.parse_brush_inputs();
+		context_raw.parse_brush_inputs();
 	}
 
 	override get = (from: i32, done: (a: any)=>void) => {
 		this.inputs[0].get((value) => {
-			Context.raw.brush_lazy_radius = value;
+			context_raw.brush_lazy_radius = value;
 			this.inputs[1].get((value) => {
-				Context.raw.brush_lazy_step = value;
+				context_raw.brush_lazy_step = value;
 				done(InputNode.coords);
 			});
 		});

+ 1 - 1
armorsculpt/Sources/ExportObj.ts

@@ -11,7 +11,7 @@ class ExportObj {
 		let o: i32[] = [];
 		ExportObj.writeString(o, "# armorsculpt.org\n");
 
-		let texpaint = Project.layers[0].texpaint;
+		let texpaint = project_layers[0].texpaint;
 		let pixels = image_get_pixels(texpaint);
 		let pixelsView = new DataView(pixels);
 		let mesh = paintObjects[0].data;

+ 42 - 42
armorsculpt/Sources/ImportMesh.ts

@@ -4,74 +4,74 @@ class ImportMesh {
 	static clearLayers = true;
 
 	static run = (path: string, _clearLayers = true, replaceExisting = true) => {
-		if (!Path.isMesh(path)) {
-			if (!Context.enableImportPlugin(path)) {
-				Console.error(Strings.error1());
+		if (!path_isMesh(path)) {
+			if (!context_enableImportPlugin(path)) {
+				console_error(Strings.error1());
 				return;
 			}
 		}
 
 		ImportMesh.clearLayers = _clearLayers;
-		Context.raw.layerFilter = 0;
+		context_raw.layerFilter = 0;
 
 		let p = path.toLowerCase();
 		if (p.endsWith(".obj")) ImportObj.run(path, replaceExisting);
 		else if (p.endsWith(".blend")) ImportBlendMesh.run(path, replaceExisting);
 		else {
 			let ext = path.substr(path.lastIndexOf(".") + 1);
-			let importer = Path.meshImporters.get(ext);
+			let importer = path_meshImporters.get(ext);
 			importer(path, (mesh: any) => {
 				replaceExisting ? ImportMesh.makeMesh(mesh, path) : ImportMesh.addMesh(mesh);
 			});
 		}
 
-		Project.meshAssets = [path];
+		project_meshAssets = [path];
 
 		///if (krom_android || krom_ios)
-		sys_title_set(path.substring(path.lastIndexOf(Path.sep) + 1, path.lastIndexOf(".")));
+		sys_title_set(path.substring(path.lastIndexOf(path_sep) + 1, path.lastIndexOf(".")));
 		///end
 	}
 
 	static finishImport = () => {
-		if (Context.raw.mergedObject != null) {
-			mesh_object_remove(Context.raw.mergedObject);
-			data_delete_mesh(Context.raw.mergedObject.data._.handle);
-			Context.raw.mergedObject = null;
+		if (context_raw.mergedObject != null) {
+			mesh_object_remove(context_raw.mergedObject);
+			data_delete_mesh(context_raw.mergedObject.data._.handle);
+			context_raw.mergedObject = null;
 		}
 
-		Context.selectPaintObject(Context.mainObject());
+		context_selectPaintObject(context_mainObject());
 
-		if (Project.paintObjects.length > 1) {
+		if (project_paintObjects.length > 1) {
 			// Sort by name
-			Project.paintObjects.sort((a, b): i32 => {
+			project_paintObjects.sort((a, b): i32 => {
 				if (a.base.name < b.base.name) return -1;
 				else if (a.base.name > b.base.name) return 1;
 				return 0;
 			});
 
 			// No mask by default
-			for (let p of Project.paintObjects) p.base.visible = true;
-			if (Context.raw.mergedObject == null) UtilMesh.mergeMesh();
-			Context.raw.paintObject.skip_context = "paint";
-			Context.raw.mergedObject.base.visible = true;
+			for (let p of project_paintObjects) p.base.visible = true;
+			if (context_raw.mergedObject == null) UtilMesh.mergeMesh();
+			context_raw.paintObject.skip_context = "paint";
+			context_raw.mergedObject.base.visible = true;
 		}
 
 		Viewport.scaleToBounds();
 
-		if (Context.raw.paintObject.base.name == "") Context.raw.paintObject.base.name = "Object";
+		if (context_raw.paintObject.base.name == "") context_raw.paintObject.base.name = "Object";
 		MakeMaterial.parsePaintMaterial();
 		MakeMaterial.parseMeshMaterial();
 
 		UIView2D.hwnd.redraws = 2;
 
 		///if arm_physics
-		Context.raw.paintBody = null;
+		context_raw.paintBody = null;
 		///end
 	}
 
 	static makeMesh = (mesh: any, path: string) => {
 		if (mesh == null || mesh.posa == null || mesh.nora == null || mesh.inda == null || mesh.posa.length == 0) {
-			Console.error(Strings.error3());
+			console_error(Strings.error3());
 			return;
 		}
 
@@ -80,38 +80,38 @@ class ImportMesh {
 			if (mesh.cola != null) raw.vertex_arrays.push({ values: mesh.cola, attrib: "col", data: "short4norm" });
 
 			let md: mesh_data_t = mesh_data_create(raw);
-			Context.raw.paintObject = Context.mainObject();
+			context_raw.paintObject = context_mainObject();
 
-			Context.selectPaintObject(Context.mainObject());
-			for (let i = 0; i < Project.paintObjects.length; ++i) {
-				let p = Project.paintObjects[i];
-				if (p == Context.raw.paintObject) continue;
+			context_selectPaintObject(context_mainObject());
+			for (let i = 0; i < project_paintObjects.length; ++i) {
+				let p = project_paintObjects[i];
+				if (p == context_raw.paintObject) continue;
 				data_delete_mesh(p.data._.handle);
 				mesh_object_remove(p);
 			}
-			let handle = Context.raw.paintObject.data._.handle;
+			let handle = context_raw.paintObject.data._.handle;
 			if (handle != "SceneSphere" && handle != "ScenePlane") {
 				data_delete_mesh(handle);
 			}
 
 			if (ImportMesh.clearLayers) {
-				while (Project.layers.length > 0) {
-					let l = Project.layers.pop();
+				while (project_layers.length > 0) {
+					let l = project_layers.pop();
 					SlotLayer.unload(l);
 				}
 				base_newLayer(false);
 				app_notify_on_init(base_initLayers);
-				History.reset();
+				history_reset();
 			}
 
-			mesh_object_set_data(Context.raw.paintObject, md);
-			Context.raw.paintObject.base.name = mesh.name;
-			Project.paintObjects = [Context.raw.paintObject];
+			mesh_object_set_data(context_raw.paintObject, md);
+			context_raw.paintObject.base.name = mesh.name;
+			project_paintObjects = [context_raw.paintObject];
 
 			md._.handle = raw.name;
 			data_cached_meshes.set(md._.handle, md);
 
-			Context.raw.ddirty = 4;
+			context_raw.ddirty = 4;
 			UIBase.hwnds[TabArea.TabSidebar0].redraws = 2;
 			UIBase.hwnds[TabArea.TabSidebar1].redraws = 2;
 
@@ -119,7 +119,7 @@ class ImportMesh {
 			app_notify_on_init(ImportMesh.finishImport);
 
 			base_notifyOnNextFrame(() => {
-				let f32 = new Float32Array(Config.getTextureResX() * Config.getTextureResY() * 4);
+				let f32 = new Float32Array(config_getTextureResX() * config_getTextureResY() * 4);
 				for (let i = 0; i < Math.floor(mesh.inda.length); ++i) {
 					let index = mesh.inda[i];
 					f32[i * 4]     = mesh.posa[index * 4]     / 32767;
@@ -127,11 +127,11 @@ class ImportMesh {
 					f32[i * 4 + 2] = mesh.posa[index * 4 + 2] / 32767;
 					f32[i * 4 + 3] = 1.0;
 				}
-				let imgmesh = image_from_bytes(f32.buffer, Config.getTextureResX(), Config.getTextureResY(), tex_format_t.RGBA128);
-				let texpaint = Project.layers[0].texpaint;
+				let imgmesh = image_from_bytes(f32.buffer, config_getTextureResX(), config_getTextureResY(), tex_format_t.RGBA128);
+				let texpaint = project_layers[0].texpaint;
 				g2_begin(texpaint);
 				g2_set_pipeline(base_pipeCopy128);
-				g2_draw_scaled_image(imgmesh, 0, 0, Config.getTextureResX(), Config.getTextureResY());
+				g2_draw_scaled_image(imgmesh, 0, 0, config_getTextureResX(), config_getTextureResY());
 				g2_set_pipeline(null);
 				g2_end();
 			});
@@ -148,12 +148,12 @@ class ImportMesh {
 
 			let md: mesh_data_t = mesh_data_create(raw);
 
-			let object = scene_add_mesh_object(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";
 
 			// Ensure unique names
-			for (let p of Project.paintObjects) {
+			for (let p of project_paintObjects) {
 				if (p.base.name == object.base.name) {
 					p.base.name += ".001";
 					p.data._.handle += ".001";
@@ -161,12 +161,12 @@ class ImportMesh {
 				}
 			}
 
-			Project.paintObjects.push(object);
+			project_paintObjects.push(object);
 
 			md._.handle = raw.name;
 			data_cached_meshes.set(md._.handle, md);
 
-			Context.raw.ddirty = 4;
+			context_raw.ddirty = 4;
 			UIBase.hwnds[TabArea.TabSidebar0].redraws = 2;
 		}
 

+ 1 - 1
armorsculpt/Sources/MakeBrush.ts

@@ -5,7 +5,7 @@ class MakeBrush {
 
 		NodeShader.write(frag, 'float dist = 0.0;');
 
-		if (Config.raw.brush_3d) {
+		if (config_raw.brush_3d) {
 			///if (krom_direct3d11 || krom_direct3d12 || krom_metal || krom_vulkan)
 			NodeShader.write(frag, 'float depth = textureLod(gbufferD, inp.xy, 0.0).r;');
 			///else

+ 30 - 30
armorsculpt/Sources/MakeMaterial.ts

@@ -14,7 +14,7 @@ class MakeMaterial {
 	}
 
 	static parseMeshMaterial = () => {
-		let m = Project.materials[0].data;
+		let m = project_materials[0].data;
 
 		for (let c of m._.shader._.contexts) {
 			if (c.name == "mesh") {
@@ -63,7 +63,7 @@ class MakeMaterial {
 			let sampler = con.frag.sharedSamplers[0];
 			scon._.override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
 		}
-		if (!Context.raw.textureFilter) {
+		if (!context_raw.textureFilter) {
 			scon._.override_context.filter = "point";
 		}
 		m._.shader.contexts.push(scon);
@@ -77,7 +77,7 @@ class MakeMaterial {
 				let sampler = con.frag.sharedSamplers[0];
 				scon._.override_context.shared_sampler = sampler.substr(sampler.lastIndexOf(" ") + 1);
 			}
-			if (!Context.raw.textureFilter) {
+			if (!context_raw.textureFilter) {
 				scon._.override_context.filter = "point";
 			}
 			m._.shader.contexts.push(scon);
@@ -88,7 +88,7 @@ class MakeMaterial {
 			m._.contexts.push(mcon);
 		}
 
-		Context.raw.ddirty = 2;
+		context_raw.ddirty = 2;
 
 		///if arm_voxels
 		MakeMaterial.makeVoxel(m);
@@ -96,7 +96,7 @@ class MakeMaterial {
 	}
 
 	static parseParticleMaterial = () => {
-		let m = Context.raw.particleMaterial;
+		let m = context_raw.particleMaterial;
 		let sc: shader_context_t = null;
 		for (let c of m._.shader._.contexts) {
 			if (c.name == "mesh") {
@@ -118,7 +118,7 @@ class MakeMaterial {
 	static parseMeshPreviewMaterial = () => {
 		if (!MakeMaterial.getMOut()) return;
 
-		let m = Project.materials[0].data;
+		let m = project_materials[0].data;
 		let scon: shader_context_t = null;
 		for (let c of m._.shader._.contexts) {
 			if (c.name == "mesh") {
@@ -156,7 +156,7 @@ class MakeMaterial {
 	///if arm_voxels
 	static makeVoxel = (m: material_data_t) => {
 		let rebuild = MakeMaterial.heightUsed;
-		if (Config.raw.rp_gi != false && rebuild) {
+		if (config_raw.rp_gi != false && rebuild) {
 			let scon: shader_context_t = null;
 			for (let c of m._.shader._.contexts) {
 				if (c.name == "voxel") {
@@ -164,7 +164,7 @@ class MakeMaterial {
 					break;
 				}
 			}
-			if (scon != null) MakeVoxel.run(scon);
+			if (scon != null) make_voxel_run(scon);
 		}
 	}
 	///end
@@ -179,7 +179,7 @@ class MakeMaterial {
 			if (current != null) g2_begin(current);
 		}
 
-		let m = Project.materials[0].data;
+		let m = project_materials[0].data;
 		let scon: shader_context_t = null;
 		let mcon: material_context_t = null;
 		for (let c of m._.shader._.contexts) {
@@ -223,14 +223,14 @@ class MakeMaterial {
 	}
 
 	static bakeNodePreviews = () => {
-		Context.raw.nodePreviewsUsed = [];
-		if (Context.raw.nodePreviews == null) Context.raw.nodePreviews = new Map();
+		context_raw.nodePreviewsUsed = [];
+		if (context_raw.nodePreviews == null) context_raw.nodePreviews = new Map();
 		MakeMaterial.traverseNodes(UINodes.getCanvasMaterial().nodes, null, []);
-		for (let key of Context.raw.nodePreviews.keys()) {
-			if (Context.raw.nodePreviewsUsed.indexOf(key) == -1) {
-				let image = Context.raw.nodePreviews.get(key);
+		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); });
-				Context.raw.nodePreviews.delete(key);
+				context_raw.nodePreviews.delete(key);
 			}
 		}
 	}
@@ -239,7 +239,7 @@ class MakeMaterial {
 		for (let node of nodes) {
 			MakeMaterial.bakeNodePreview(node, group, parents);
 			if (node.type == "GROUP") {
-				for (let g of Project.materialGroups) {
+				for (let g of project_materialGroups) {
 					if (g.canvas.name == node.name) {
 						parents.push(node);
 						MakeMaterial.traverseNodes(g.canvas.nodes, g.canvas, parents);
@@ -254,14 +254,14 @@ class MakeMaterial {
 	static bakeNodePreview = (node: zui_node_t, group: zui_node_canvas_t, parents: zui_node_t[]) => {
 		if (node.type == "BLUR") {
 			let id = ParserMaterial.node_name(node, parents);
-			let image = Context.raw.nodePreviews.get(id);
-			Context.raw.nodePreviewsUsed.push(id);
-			let resX = Math.floor(Config.getTextureResX() / 4);
-			let resY = Math.floor(Config.getTextureResY() / 4);
+			let image = context_raw.nodePreviews.get(id);
+			context_raw.nodePreviewsUsed.push(id);
+			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_create_render_target(resX, resY);
-				Context.raw.nodePreviews.set(id, image);
+				context_raw.nodePreviews.set(id, image);
 			}
 
 			ParserMaterial.blur_passthrough = true;
@@ -270,14 +270,14 @@ class MakeMaterial {
 		}
 		else if (node.type == "DIRECT_WARP") {
 			let id = ParserMaterial.node_name(node, parents);
-			let image = Context.raw.nodePreviews.get(id);
-			Context.raw.nodePreviewsUsed.push(id);
-			let resX = Math.floor(Config.getTextureResX());
-			let resY = Math.floor(Config.getTextureResY());
+			let image = context_raw.nodePreviews.get(id);
+			context_raw.nodePreviewsUsed.push(id);
+			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_create_render_target(resX, resY);
-				Context.raw.nodePreviews.set(id, image);
+				context_raw.nodePreviews.set(id, image);
 			}
 
 			ParserMaterial.warp_passthrough = true;
@@ -303,16 +303,16 @@ class MakeMaterial {
 	}
 
 	static parseBrush = () => {
-		ParserLogic.parse(Context.raw.brush.canvas);
+		ParserLogic.parse(context_raw.brush.canvas);
 	}
 
 	static getDisplaceStrength = (): f32 => {
-		let sc = Context.mainObject().base.transform.scale.x;
-		return Config.raw.displace_strength * 0.02 * sc;
+		let sc = context_mainObject().base.transform.scale.x;
+		return config_raw.displace_strength * 0.02 * sc;
 	}
 
 	static voxelgiHalfExtents = (): string => {
-		let ext = Context.raw.vxaoExt;
+		let ext = context_raw.vxaoExt;
 		return `const vec3 voxelgiHalfExtents = vec3(${ext}, ${ext}, ${ext});`;
 	}
 

+ 21 - 21
armorsculpt/Sources/MakeMesh.ts

@@ -5,18 +5,18 @@ class MakeMesh {
 
 	static run = (data: TMaterial, layerPass = 0): NodeShaderContextRaw => {
 		let context_id = layerPass == 0 ? "mesh" : "mesh" + layerPass;
-		let con_mesh = NodeShaderContext.create(data, {
+		let con_mesh = NodeShadercontext_create(data, {
 			name: context_id,
 			depth_write: layerPass == 0 ? true : false,
 			compare_mode: layerPass == 0 ? "less" : "equal",
-			cull_mode: (Context.raw.cullBackfaces || layerPass > 0) ? "clockwise" : "none",
+			cull_mode: (context_raw.cullBackfaces || layerPass > 0) ? "clockwise" : "none",
 			vertex_elements: [{name: "pos", data: "short4norm"}],
 			color_attachments: ["RGBA64", "RGBA64", "RGBA64"],
 			depth_attachment: "DEPTH32"
 		});
 
-		let vert = NodeShaderContext.make_vert(con_mesh);
-		let frag = NodeShaderContext.make_frag(con_mesh);
+		let vert = NodeShadercontext_make_vert(con_mesh);
+		let frag = NodeShadercontext_make_frag(con_mesh);
 		frag.ins = vert.outs;
 
 		NodeShader.add_out(vert, 'vec2 texCoord');
@@ -29,7 +29,7 @@ class MakeMesh {
 		let textureCount = 0;
 
 		NodeShader.add_uniform(vert, 'mat4 WVP', '_world_view_proj_matrix');
-		NodeShader.add_uniform(vert, 'sampler2D texpaint_vert', '_texpaint_vert' + Project.layers[0].id);
+		NodeShader.add_uniform(vert, 'sampler2D texpaint_vert', '_texpaint_vert' + project_layers[0].id);
 		NodeShader.write(vert, 'vec3 meshpos = texelFetch(texpaint_vert, ivec2(gl_VertexID % textureSize(texpaint_vert, 0).x, gl_VertexID / textureSize(texpaint_vert, 0).y), 0).xyz;');
 		// + pos.xyz * 0.000001
 		NodeShader.write(vert, 'gl_Position = mul(vec4(meshpos.xyz, 1.0), WVP);');
@@ -98,12 +98,12 @@ class MakeMesh {
 			NodeShader.write(frag, 'float height3 = 0.0;');
 		}
 
-		if (Context.raw.drawWireframe) {
+		if (context_raw.drawWireframe) {
 			textureCount++;
 			NodeShader.add_uniform(frag, 'sampler2D texuvmap', '_texuvmap');
 		}
 
-		if (Context.raw.viewportMode == ViewportMode.ViewLit && Context.raw.renderMode == RenderMode.RenderForward) {
+		if (context_raw.viewportMode == ViewportMode.ViewLit && context_raw.renderMode == RenderMode.RenderForward) {
 			textureCount += 4;
 			NodeShader.add_uniform(frag, 'sampler2D senvmapBrdf', "$brdf.k");
 			NodeShader.add_uniform(frag, 'sampler2D senvmapRadiance', '_envmap_radiance');
@@ -115,7 +115,7 @@ class MakeMesh {
 		MakeMesh.layerPassCount = 1;
 		let layers: SlotLayerRaw[] = [];
 		let startCount = textureCount;
-		for (let l of Project.layers) {
+		for (let l of project_layers) {
 			if (!SlotLayer.isLayer(l) || !SlotLayer.isVisible(l)) continue;
 
 			let count = 3;
@@ -136,8 +136,8 @@ class MakeMesh {
 		for (let l of layers) {
 			if (SlotLayer.getObjectMask(l) > 0) {
 				NodeShader.add_uniform(frag, 'int uid', '_uid');
-				if (SlotLayer.getObjectMask(l) > Project.paintObjects.length) { // Atlas
-					let visibles = Project.getAtlasObjects(SlotLayer.getObjectMask(l));
+				if (SlotLayer.getObjectMask(l) > project_paintObjects.length) { // Atlas
+					let visibles = project_getAtlasObjects(SlotLayer.getObjectMask(l));
 					NodeShader.write(frag, 'if (');
 					for (let i = 0; i < visibles.length; ++i) {
 						if (i > 0) NodeShader.write(frag, ' || ');
@@ -146,7 +146,7 @@ class MakeMesh {
 					NodeShader.write(frag, ') {');
 				}
 				else { // Object mask
-					let uid = Project.paintObjects[SlotLayer.getObjectMask(l) - 1].base.uid;
+					let uid = project_paintObjects[SlotLayer.getObjectMask(l) - 1].base.uid;
 					NodeShader.write(frag, `if (${uid} == uid) {`);
 				}
 			}
@@ -182,7 +182,7 @@ class MakeMesh {
 				NodeShader.write(frag, `texpaint_opac *= ${SlotLayer.getOpacity(l)};`);
 			}
 
-			if (l == Project.layers[0]) {
+			if (l == project_layers[0]) {
 				NodeShader.write(frag, 'basecol = vec3(0.8, 0.8, 0.8);// texpaint_sample.rgb * texpaint_opac;');
 			}
 
@@ -190,7 +190,7 @@ class MakeMesh {
 				NodeShader.write(frag, '}');
 			}
 
-			if (lastPass && Context.raw.drawTexels) {
+			if (lastPass && context_raw.drawTexels) {
 				NodeShader.add_uniform(frag, 'vec2 texpaintSize', '_texpaintSize');
 				NodeShader.write(frag, 'vec2 texel0 = texCoord * texpaintSize * 0.01;');
 				NodeShader.write(frag, 'vec2 texel1 = texCoord * texpaintSize * 0.1;');
@@ -200,7 +200,7 @@ class MakeMesh {
 				NodeShader.write(frag, 'basecol *= max(float(mod(int(texel2.x), 2.0) == mod(int(texel2.y), 2.0)), 0.9);');
 			}
 
-			if (lastPass && Context.raw.drawWireframe) {
+			if (lastPass && context_raw.drawWireframe) {
 				NodeShader.write(frag, 'basecol *= 1.0 - textureLod(texuvmap, texCoord, 0.0).r;');
 			}
 
@@ -236,15 +236,15 @@ class MakeMesh {
 			NodeShader.write(frag, 'n.y = -n.y;');
 			NodeShader.write(frag, 'n = normalize(mul(n, TBN));');
 
-			if (Context.raw.viewportMode == ViewportMode.ViewLit) {
+			if (context_raw.viewportMode == ViewportMode.ViewLit) {
 
 				NodeShader.write(frag, 'basecol = pow(basecol, vec3(2.2, 2.2, 2.2));');
 
-				if (Context.raw.viewportShader != null) {
-					let color = Context.raw.viewportShader(frag);
+				if (context_raw.viewportShader != null) {
+					let color = context_raw.viewportShader(frag);
 					NodeShader.write(frag, `fragColor[1] = vec4(${color}, 1.0);`);
 				}
-				else if (Context.raw.renderMode == RenderMode.RenderForward) {
+				else if (context_raw.renderMode == RenderMode.RenderForward) {
 					frag.wposition = true;
 					NodeShader.write(frag, 'vec3 albedo = mix(basecol, vec3(0.0, 0.0, 0.0), metallic);');
 					NodeShader.write(frag, 'vec3 f0 = mix(vec3(0.04, 0.04, 0.04), basecol, metallic);');
@@ -292,11 +292,11 @@ class MakeMesh {
 					NodeShader.write(frag, 'fragColor[1] = vec4(basecol, occlusion);');
 				}
 			}
-			else if (Context.raw.viewportMode == ViewportMode.ViewObjectNormal) {
+			else if (context_raw.viewportMode == ViewportMode.ViewObjectNormal) {
 				frag.nAttr = true;
 				NodeShader.write(frag, 'fragColor[1] = vec4(nAttr, 1.0);');
 			}
-			else if (Context.raw.viewportMode == ViewportMode.ViewObjectID) {
+			else if (context_raw.viewportMode == ViewportMode.ViewObjectID) {
 				NodeShader.add_uniform(frag, 'float objectId', '_objectId');
 				NodeShader.write(frag, 'float obid = objectId + 1.0 / 255.0;');
 				NodeShader.write(frag, 'float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);');
@@ -308,7 +308,7 @@ class MakeMesh {
 				NodeShader.write(frag, 'fragColor[1] = vec4(1.0, 0.0, 1.0, 1.0);'); // Pink
 			}
 
-			if (Context.raw.viewportMode != ViewportMode.ViewLit && Context.raw.viewportMode != ViewportMode.ViewPathTrace) {
+			if (context_raw.viewportMode != ViewportMode.ViewLit && context_raw.viewportMode != ViewportMode.ViewPathTrace) {
 				NodeShader.write(frag, 'fragColor[1].rgb = pow(fragColor[1].rgb, vec3(2.2, 2.2, 2.2));');
 			}
 

+ 9 - 9
armorsculpt/Sources/MakeMeshPreview.ts

@@ -5,7 +5,7 @@ class MakeMeshPreview {
 
 	static run = (data: TMaterial, matcon: material_context_t): NodeShaderContextRaw => {
 		let context_id = "mesh";
-		let con_mesh = NodeShaderContext.create(data, {
+		let con_mesh = NodeShadercontext_create(data, {
 			name: context_id,
 			depth_write: true,
 			compare_mode: "less",
@@ -15,17 +15,17 @@ class MakeMeshPreview {
 			depth_attachment: "DEPTH32"
 		});
 
-		let vert = NodeShaderContext.make_vert(con_mesh);
-		let frag = NodeShaderContext.make_frag(con_mesh);
+		let vert = NodeShadercontext_make_vert(con_mesh);
+		let frag = NodeShadercontext_make_frag(con_mesh);
 		frag.ins = vert.outs;
 		let pos = "pos";
 
 		///if arm_skin
-		let skin = mesh_data_get_vertex_array(Context.raw.paintObject.data, "bone") != null;
+		let skin = mesh_data_get_vertex_array(context_raw.paintObject.data, "bone") != null;
 		if (skin) {
 			pos = "spos";
-			NodeShaderContext.add_elem(con_mesh, "bone", 'short4norm');
-			NodeShaderContext.add_elem(con_mesh, "weight", 'short4norm');
+			NodeShadercontext_add_elem(con_mesh, "bone", 'short4norm');
+			NodeShadercontext_add_elem(con_mesh, "weight", 'short4norm');
 			NodeShader.add_function(vert, ShaderFunctions.str_getSkinningDualQuat);
 			NodeShader.add_uniform(vert, 'vec4 skinBones[128 * 2]', '_skin_bones');
 			NodeShader.add_uniform(vert, 'float posUnpack', '_pos_unpack');
@@ -43,11 +43,11 @@ class MakeMeshPreview {
 		NodeShader.add_uniform(vert, 'mat4 WVP', '_world_view_proj_matrix');
 		NodeShader.write_attrib(vert, `gl_Position = mul(vec4(${pos}.xyz, 1.0), WVP);`);
 
-		let brushScale = (Context.raw.brushScale * Context.raw.brushNodesScale) + "";
+		let brushScale = (context_raw.brushScale * context_raw.brushNodesScale) + "";
 		NodeShader.add_out(vert, 'vec2 texCoord');
 		NodeShader.write_attrib(vert, `texCoord = tex * float(${brushScale});`);
 
-		let decal = Context.raw.decalPreview;
+		let decal = context_raw.decalPreview;
 		ParserMaterial.sample_keep_aspect = decal;
 		ParserMaterial.sample_uv_scale = brushScale;
 		ParserMaterial.parse_height = MakeMaterial.heightUsed;
@@ -82,7 +82,7 @@ class MakeMeshPreview {
 		// }
 
 		if (decal) {
-			if (Context.raw.tool == WorkspaceTool.ToolText) {
+			if (context_raw.tool == WorkspaceTool.ToolText) {
 				NodeShader.add_uniform(frag, 'sampler2D textexttool', '_textexttool');
 				NodeShader.write(frag, `opacity *= textureLod(textexttool, texCoord / float(${brushScale}), 0.0).r;`);
 			}

+ 13 - 13
armorsculpt/Sources/MakeSculpt.ts

@@ -3,7 +3,7 @@ class MakeSculpt {
 
 	static run = (data: TMaterial, matcon: material_context_t): NodeShaderContextRaw => {
 		let context_id = "paint";
-		let con_paint = NodeShaderContext.create(data, {
+		let con_paint = NodeShadercontext_create(data, {
 			name: context_id,
 			depth_write: false,
 			compare_mode: "always", // TODO: align texcoords winding order
@@ -17,14 +17,14 @@ class MakeSculpt {
 		con_paint.data.color_writes_green = [true, true, true, true];
 		con_paint.data.color_writes_blue = [true, true, true, true];
 		con_paint.data.color_writes_alpha = [true, true, true, true];
-		con_paint.allow_vcols = mesh_data_get_vertex_array(Context.raw.paintObject.data, "col") != null;
+		con_paint.allow_vcols = mesh_data_get_vertex_array(context_raw.paintObject.data, "col") != null;
 
-		let vert = NodeShaderContext.make_vert(con_paint);
-		let frag = NodeShaderContext.make_frag(con_paint);
+		let vert = NodeShadercontext_make_vert(con_paint);
+		let frag = NodeShadercontext_make_frag(con_paint);
 		frag.ins = vert.outs;
 
-		let faceFill = Context.raw.tool == WorkspaceTool.ToolFill && Context.raw.fillTypeHandle.position == FillType.FillFace;
-		let decal = Context.raw.tool == WorkspaceTool.ToolDecal || Context.raw.tool == WorkspaceTool.ToolText;
+		let faceFill = context_raw.tool == WorkspaceTool.ToolFill && context_raw.fillTypeHandle.position == FillType.FillFace;
+		let decal = context_raw.tool == WorkspaceTool.ToolDecal || context_raw.tool == WorkspaceTool.ToolText;
 
 		NodeShader.add_out(vert, 'vec2 texCoord');
 		NodeShader.write(vert, 'const vec2 madd = vec2(0.5, 0.5);');
@@ -45,15 +45,15 @@ class MakeSculpt {
 		NodeShader.add_uniform(frag, 'float brushOpacity', '_brushOpacity');
 		NodeShader.add_uniform(frag, 'float brushHardness', '_brushHardness');
 
-		if (Context.raw.tool == WorkspaceTool.ToolBrush  ||
-			Context.raw.tool == WorkspaceTool.ToolEraser ||
-			Context.raw.tool == WorkspaceTool.ToolClone  ||
-			Context.raw.tool == WorkspaceTool.ToolBlur   ||
-			Context.raw.tool == WorkspaceTool.ToolSmudge   ||
-			Context.raw.tool == WorkspaceTool.ToolParticle ||
+		if (context_raw.tool == WorkspaceTool.ToolBrush  ||
+			context_raw.tool == WorkspaceTool.ToolEraser ||
+			context_raw.tool == WorkspaceTool.ToolClone  ||
+			context_raw.tool == WorkspaceTool.ToolBlur   ||
+			context_raw.tool == WorkspaceTool.ToolSmudge   ||
+			context_raw.tool == WorkspaceTool.ToolParticle ||
 			decal) {
 
-			let depthReject = !Context.raw.xray;
+			let depthReject = !context_raw.xray;
 
 			MakeBrush.run(vert, frag);
 		}

+ 45 - 45
armorsculpt/Sources/TabLayers.ts

@@ -6,7 +6,7 @@ class TabLayers {
 	static showContextMenu = false;
 
 	static draw = (htab: zui_handle_t) => {
-		let mini = Config.raw.layout[layout_size_t.SIDEBAR_W] <= UIBase.sidebar_mini_w;
+		let mini = config_config_raw.layout[layout_size_t.SIDEBAR_W] <= UIBase.sidebar_mini_w;
 		mini ? TabLayers.draw_mini(htab) : TabLayers.draw_full(htab);
 	}
 
@@ -50,10 +50,10 @@ class TabLayers {
 	}
 
 	static drawSlots = (mini: bool) => {
-		for (let i = 0; i < Project.layers.length; ++i) {
-			if (i >= Project.layers.length) break; // Layer was deleted
-			let j = Project.layers.length - 1 - i;
-			let l = Project.layers[j];
+		for (let i = 0; i < project_project_layers.length; ++i) {
+			if (i >= project_project_layers.length) break; // Layer was deleted
+			let j = project_project_layers.length - 1 - i;
+			let l = project_project_layers[j];
 			TabLayers.draw_layer_slot(l, j, mini);
 		}
 	}
@@ -73,10 +73,10 @@ class TabLayers {
 		let ui = UIBase.ui;
 		if (zui_button(text)) {
 			UIMenu.draw((ui: zui_t) => {
-				let l = Context.raw.layer;
+				let l = context_context_raw.layer;
 				if (UIMenu.menu_button(ui, tr("Paint Layer"))) {
 					base_base_new_layer();
-					History.new_layer();
+					history_new_layer();
 				}
 			}, 1);
 		}
@@ -86,8 +86,8 @@ class TabLayers {
 		let ui = UIBase.ui;
 		let ar = [tr("All")];
 		let filterHandle = zui_handle("tablayers_0");
-		filterHandle.position = Context.raw.layer_filter;
-		Context.raw.layer_filter = zui_combo(filterHandle, ar, tr("Filter"), false, zui_align_t.LEFT);
+		filterHandle.position = context_context_raw.layer_filter;
+		context_context_raw.layer_filter = zui_combo(filterHandle, ar, tr("Filter"), false, zui_align_t.LEFT);
 	}
 
 	static remapLayerPointers = (nodes: zui_node_t[], pointerMap: Map<i32, i32>) => {
@@ -103,13 +103,13 @@ class TabLayers {
 
 	static initLayerMap = (): Map<SlotLayerRaw, i32> => {
 		let res: Map<SlotLayerRaw, i32> = new Map();
-		for (let i = 0; i < Project.layers.length; ++i) res.set(Project.layers[i], i);
+		for (let i = 0; i < project_project_layers.length; ++i) res.set(project_project_layers[i], i);
 		return res;
 	}
 
 	static fillLayerMap = (map: Map<SlotLayerRaw, i32>): Map<i32, i32> => {
 		let res: Map<i32, i32> = new Map();
-		for (let l of map.keys()) res.set(map.get(l), Project.layers.indexOf(l) > -1 ? Project.layers.indexOf(l) : 9999);
+		for (let l of map.keys()) res.set(map.get(l), project_project_layers.indexOf(l) > -1 ? project_project_layers.indexOf(l) : 9999);
 		return res;
 	}
 
@@ -117,15 +117,15 @@ class TabLayers {
 		base_base_drag_off_x = offX;
 		base_base_drag_off_y = offY;
 		base_base_drag_layer = layer;
-		Context.raw.drag_dest = Project.layers.indexOf(layer);
+		context_context_raw.drag_dest = project_project_layers.indexOf(layer);
 	}
 
 	static drawLayerSlot = (l: SlotLayerRaw, i: i32, mini: bool) => {
 		let ui = UIBase.ui;
 
-		if (Context.raw.layer_filter > 0 &&
+		if (context_context_raw.layer_filter > 0 &&
 			SlotLayer.get_object_mask(l) > 0 &&
-			SlotLayer.get_object_mask(l) != Context.raw.layer_filter) {
+			SlotLayer.get_object_mask(l) != context_context_raw.layer_filter) {
 			return;
 		}
 
@@ -141,37 +141,37 @@ class TabLayers {
 
 		// Highlight drag destination
 		let absy = ui._window_y + ui._y;
-		if (base_base_is_dragging && base_base_drag_layer != null && Context.in_layers()) {
+		if (base_base_is_dragging && base_base_drag_layer != null && context_context_in_layers()) {
 			if (mouse_y > absy + step && mouse_y < absy + step * 3) {
-				let down = Project.layers.indexOf(base_base_drag_layer) >= i;
-				Context.raw.drag_dest = down ? i : i - 1;
+				let down = project_project_layers.indexOf(base_base_drag_layer) >= i;
+				context_context_raw.drag_dest = down ? i : i - 1;
 
-				let ls = Project.layers;
-				let dest = Context.raw.drag_dest;
+				let ls = project_project_layers;
+				let dest = context_context_raw.drag_dest;
 				let toGroup = down ? dest > 0 && ls[dest - 1].parent != null && ls[dest - 1].parent.show_panel : dest < ls.length && ls[dest].parent != null && ls[dest].parent.show_panel;
 				let nestedGroup = SlotLayer.is_group(base_base_drag_layer) && toGroup;
 				if (!nestedGroup) {
-					if (SlotLayer.can_move(Context.raw.layer, Context.raw.drag_dest)) {
+					if (SlotLayer.can_move(context_context_raw.layer, context_context_raw.drag_dest)) {
 						zui_fill(checkw, step * 2, (ui._window_w / zui_SCALE(ui) - 2) - checkw, 2 * zui_SCALE(ui), ui.t.HIGHLIGHT_COL);
 					}
 				}
 			}
-			else if (i == Project.layers.length - 1 && mouse_y < absy + step) {
-				Context.raw.drag_dest = Project.layers.length - 1;
-				if (SlotLayer.can_move(Context.raw.layer, Context.raw.drag_dest)) {
+			else if (i == project_project_layers.length - 1 && mouse_y < absy + step) {
+				context_context_raw.drag_dest = project_project_layers.length - 1;
+				if (SlotLayer.can_move(context_context_raw.layer, context_context_raw.drag_dest)) {
 					zui_fill(checkw, 0, (ui._window_w / zui_SCALE(ui) - 2) - checkw, 2 * zui_SCALE(ui), ui.t.HIGHLIGHT_COL);
 				}
 			}
 		}
-		if (base_base_is_dragging && (base_base_drag_material != null || base_base_drag_swatch != null) && Context.in_layers()) {
+		if (base_base_is_dragging && (base_base_drag_material != null || base_base_drag_swatch != null) && context_context_in_layers()) {
 			if (mouse_y > absy + step && mouse_y < absy + step * 3) {
-				Context.raw.drag_dest = i;
+				context_context_raw.drag_dest = i;
 				if (TabLayers.can_drop_new_layer(i))
 					zui_fill(checkw, 2 * step, (ui._window_w / zui_SCALE(ui) - 2) - checkw, 2 * zui_SCALE(ui), ui.t.HIGHLIGHT_COL);
 			}
-			else if (i == Project.layers.length - 1 && mouse_y < absy + step) {
-				Context.raw.drag_dest = Project.layers.length;
-				if (TabLayers.can_drop_new_layer(Project.layers.length))
+			else if (i == project_project_layers.length - 1 && mouse_y < absy + step) {
+				context_context_raw.drag_dest = project_project_layers.length;
+				if (TabLayers.can_drop_new_layer(project_project_layers.length))
 					zui_fill(checkw, 0, (ui._window_w / zui_SCALE(ui) - 2) - checkw, 2 * zui_SCALE(ui), ui.t.HIGHLIGHT_COL);
 			}
 		}
@@ -212,8 +212,8 @@ class TabLayers {
 		}
 
 		// Draw eye icon
-		let icons = Res.get("icons.k");
-		let r = Res.tile18(icons, l.visible ? 0 : 1, 0);
+		let icons = resource_get("icons.k");
+		let r = resource_tile18(icons, l.visible ? 0 : 1, 0);
 		let center = (step / 2) * zui_SCALE(ui);
 		ui._x += 2;
 		ui._y += 3;
@@ -244,23 +244,23 @@ class TabLayers {
 				ui.input_x > ui._window_x + ui._x && ui.input_x < ui._window_x + ui._window_w &&
 				ui.input_y > ui._window_y + ui._y - center && ui.input_y < ui._window_y + ui._y - center + (step * zui_SCALE(ui)) * 2) {
 				if (ui.input_started) {
-					Context.set_layer(l);
-					TabLayers.set_drag_layer(Context.raw.layer, -(mouse_x - uix - ui._window_x - 3), -(mouse_y - uiy - ui._window_y + 1));
+					context_context_set_layer(l);
+					TabLayers.set_drag_layer(context_context_raw.layer, -(mouse_x - uix - ui._window_x - 3), -(mouse_y - uiy - ui._window_y + 1));
 				}
 				else if (ui.input_released) {
-					if (time_time() - Context.raw.select_time > 0.2) {
-						Context.raw.select_time = time_time();
+					if (time_time() - context_context_raw.select_time > 0.2) {
+						context_context_raw.select_time = time_time();
 					}
 				}
 				else if (ui.input_released_r) {
-					Context.set_layer(l);
+					context_context_set_layer(l);
 					TabLayers.show_context_menu = true;
 				}
 			}
 
 			let state = zui_text(l.name);
 			if (state == zui_state_t.RELEASED) {
-				let td = time_time() - Context.raw.select_time;
+				let td = time_time() - context_context_raw.select_time;
 				if (td < 0.2 && td > 0.0) {
 					TabLayers.layer_name_edit = l.id;
 					TabLayers.layer_name_handle.text = l.name;
@@ -270,10 +270,10 @@ class TabLayers {
 
 			// let inFocus = ui.inputX > ui._windowX && ui.inputX < ui._windowX + ui._windowW &&
 			// 			  ui.inputY > ui._windowY && ui.inputY < ui._windowY + ui._windowH;
-			// if (inFocus && ui.isDeleteDown && canDelete(Context.raw.layer)) {
+			// if (inFocus && ui.isDeleteDown && canDelete(context_raw.layer)) {
 			// 	ui.isDeleteDown = false;
 			// 	let _init() = () => {
-			// 		deleteLayer(Context.raw.layer);
+			// 		deleteLayer(context_raw.layer);
 			// 	}
 			// 	app_notify_on_init(_init);
 			// }
@@ -321,7 +321,7 @@ class TabLayers {
 			zui_end_element();
 			zui_end_element();
 
-			if (Config.raw.touch_ui) {
+			if (config_config_raw.touch_ui) {
 				ui._x += 12 * zui_SCALE(ui);
 			}
 
@@ -357,7 +357,7 @@ class TabLayers {
 		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 (context_context_raw.layer == l) {
 			if (mini) {
 				zui_rect(1, -step * 2, ui._w / zui_SCALE(ui) - 1, step * 2 + (mini ? -1 : 1), ui.t.HIGHLIGHT_COL, 3);
 			}
@@ -368,15 +368,15 @@ class TabLayers {
 	}
 
 	static canMergeDown = (l: SlotLayerRaw) : bool => {
-		let index = Project.layers.indexOf(l);
+		let index = project_project_layers.indexOf(l);
 		// Lowest layer
 		if (index == 0) return false;
 		// Lowest layer that has masks
-		if (SlotLayer.is_layer(l) && SlotLayer.is_mask(Project.layers[0]) && Project.layers[0].parent == l) return false;
+		if (SlotLayer.is_layer(l) && SlotLayer.is_mask(project_project_layers[0]) && project_project_layers[0].parent == l) return false;
 		// The lowest toplevel layer is a group
-		if (SlotLayer.is_group(l) && SlotLayer.is_in_group(Project.layers[0]) && SlotLayer.get_containing_group(Project.layers[0]) == l) return false;
+		if (SlotLayer.is_group(l) && SlotLayer.is_in_group(project_project_layers[0]) && SlotLayer.get_containing_group(project_project_layers[0]) == l) return false;
 		// Masks must be merged down to masks
-		if (SlotLayer.is_mask(l) && !SlotLayer.is_mask(Project.layers[index - 1])) return false;
+		if (SlotLayer.is_mask(l) && !SlotLayer.is_mask(project_project_layers[index - 1])) return false;
 		return true;
 	}
 
@@ -385,7 +385,7 @@ class TabLayers {
 	}
 
 	static canDropNewLayer = (position: i32) => {
-		if (position > 0 && position < Project.layers.length && SlotLayer.is_mask(Project.layers[position - 1])) {
+		if (position > 0 && position < project_project_layers.length && SlotLayer.is_mask(project_project_layers[position - 1])) {
 			// 1. The layer to insert is inserted in the middle
 			// 2. The layer below is a mask, i.e. the layer would have to be a (group) mask, too.
 			return false;

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

@@ -5,13 +5,13 @@ class BrushOutputNode extends LogicNode {
 
 	constructor() {
 		super();
-		Context.raw.runBrush = this.run;
-		Context.raw.parseBrushInputs = this.parseInputs;
+		context_raw.runBrush = this.run;
+		context_raw.parseBrushInputs = this.parseInputs;
 	}
 
 	parseInputs = () => {
-		let lastMask = Context.raw.brushMaskImage;
-		let lastStencil = Context.raw.brushStencilImage;
+		let lastMask = context_raw.brushMaskImage;
+		let lastStencil = context_raw.brushStencilImage;
 
 		let input0: any;
 		let input1: any;
@@ -29,75 +29,75 @@ class BrushOutputNode extends LogicNode {
 			return;
 		}
 
-		Context.raw.paintVec = input0;
-		Context.raw.brushNodesRadius = input1;
+		context_raw.paintVec = input0;
+		context_raw.brushNodesRadius = input1;
 
 		let opac: any = input2; // Float or texture name
 		if (opac == null) opac = 1.0;
 		if (typeof opac == "string") {
-			Context.raw.brushMaskImageIsAlpha = opac.endsWith(".a");
+			context_raw.brushMaskImageIsAlpha = opac.endsWith(".a");
 			opac = opac.substr(0, opac.lastIndexOf("."));
-			Context.raw.brushNodesOpacity = 1.0;
-			let index = Project.assetNames.indexOf(opac);
-			let asset = Project.assets[index];
-			Context.raw.brushMaskImage = Project.getImage(asset);
+			context_raw.brushNodesOpacity = 1.0;
+			let index = project_assetNames.indexOf(opac);
+			let asset = project_assets[index];
+			context_raw.brushMaskImage = project_getImage(asset);
 		}
 		else {
-			Context.raw.brushNodesOpacity = opac;
-			Context.raw.brushMaskImage = null;
+			context_raw.brushNodesOpacity = opac;
+			context_raw.brushMaskImage = null;
 		}
 
-		Context.raw.brushNodesHardness = input3;
+		context_raw.brushNodesHardness = input3;
 
 		let stencil: any = input4; // Float or texture name
 		if (stencil == null) stencil = 1.0;
 		if (typeof stencil == "string") {
-			Context.raw.brushStencilImageIsAlpha = stencil.endsWith(".a");
+			context_raw.brushStencilImageIsAlpha = stencil.endsWith(".a");
 			stencil = stencil.substr(0, stencil.lastIndexOf("."));
-			let index = Project.assetNames.indexOf(stencil);
-			let asset = Project.assets[index];
-			Context.raw.brushStencilImage = Project.getImage(asset);
+			let index = project_assetNames.indexOf(stencil);
+			let asset = project_assets[index];
+			context_raw.brushStencilImage = project_getImage(asset);
 		}
 		else {
-			Context.raw.brushStencilImage = null;
+			context_raw.brushStencilImage = null;
 		}
 
-		if (lastMask != Context.raw.brushMaskImage ||
-			lastStencil != Context.raw.brushStencilImage) {
+		if (lastMask != context_raw.brushMaskImage ||
+			lastStencil != context_raw.brushStencilImage) {
 			MakeMaterial.parsePaintMaterial();
 		}
 
-		Context.raw.brushDirectional = this.Directional;
+		context_raw.brushDirectional = this.Directional;
 	}
 
 	run = (from: i32) => {
 		let left = 0.0;
 		let right = 1.0;
-		if (Context.raw.paint2d) {
+		if (context_raw.paint2d) {
 			left = 1.0;
-			right = (Context.raw.splitView ? 2.0 : 1.0) + UIView2D.ww / base_w();
+			right = (context_raw.splitView ? 2.0 : 1.0) + UIView2D.ww / base_w();
 		}
 
 		// First time init
-		if (Context.raw.lastPaintX < 0 || Context.raw.lastPaintY < 0) {
-			Context.raw.lastPaintVecX = Context.raw.paintVec.x;
-			Context.raw.lastPaintVecY = Context.raw.paintVec.y;
+		if (context_raw.lastPaintX < 0 || context_raw.lastPaintY < 0) {
+			context_raw.lastPaintVecX = context_raw.paintVec.x;
+			context_raw.lastPaintVecY = context_raw.paintVec.y;
 		}
 
 		// Do not paint over fill layer
-		let fillLayer = Context.raw.layer.fill_layer != null;
+		let fillLayer = context_raw.layer.fill_layer != null;
 
 		// Do not paint over groups
-		let groupLayer = SlotLayer.isGroup(Context.raw.layer);
+		let groupLayer = SlotLayer.isGroup(context_raw.layer);
 
 		// Paint bounds
-		if (Context.raw.paintVec.x > left &&
-			Context.raw.paintVec.x < right &&
-			Context.raw.paintVec.y > 0 &&
-			Context.raw.paintVec.y < 1 &&
+		if (context_raw.paintVec.x > left &&
+			context_raw.paintVec.x < right &&
+			context_raw.paintVec.y > 0 &&
+			context_raw.paintVec.y < 1 &&
 			!fillLayer &&
 			!groupLayer &&
-			(SlotLayer.isVisible(Context.raw.layer) || Context.raw.paint2d) &&
+			(SlotLayer.isVisible(context_raw.layer) || context_raw.paint2d) &&
 			!UIBase.ui.is_hovered &&
 			!base_isDragging &&
 			!base_isResizing &&
@@ -107,29 +107,29 @@ class BrushOutputNode extends LogicNode {
 			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;
-			let lazy = Context.raw.tool == WorkspaceTool.ToolBrush && Context.raw.brushLazyRadius > 0;
+			let sameSpot = context_raw.paintVec.x == context_raw.lastPaintX && context_raw.paintVec.y == context_raw.lastPaintY;
+			let lazy = context_raw.tool == WorkspaceTool.ToolBrush && context_raw.brushLazyRadius > 0;
 			if (down && (sameSpot || lazy)) {
-				Context.raw.painted++;
+				context_raw.painted++;
 			}
 			else {
-				Context.raw.painted = 0;
+				context_raw.painted = 0;
 			}
-			Context.raw.lastPaintX = Context.raw.paintVec.x;
-			Context.raw.lastPaintY = Context.raw.paintVec.y;
+			context_raw.lastPaintX = context_raw.paintVec.x;
+			context_raw.lastPaintY = context_raw.paintVec.y;
 
-			if (Context.raw.tool == WorkspaceTool.ToolParticle) {
-				Context.raw.painted = 0; // Always paint particles
+			if (context_raw.tool == WorkspaceTool.ToolParticle) {
+				context_raw.painted = 0; // Always paint particles
 			}
 
-			if (Context.raw.painted == 0) {
+			if (context_raw.painted == 0) {
 				this.parseInputs();
 			}
 
-			if (Context.raw.painted == 0) {
-				Context.raw.pdirty = 1;
-				Context.raw.rdirty = 2;
-				History.pushUndo2 = true; ////
+			if (context_raw.painted == 0) {
+				context_raw.pdirty = 1;
+				context_raw.rdirty = 2;
+				history_push_undo2 = true; ////
 			}
 		}
 	}

+ 60 - 60
base/Sources/BoxExport.ts

@@ -61,7 +61,7 @@ class BoxExport {
 
 	///if (is_paint || is_lab)
 	static tab_export_textures = (ui: zui_t, title: string, bake_material: bool = false) => {
-		let tab_vertical: bool = Config.raw.touch_ui;
+		let tab_vertical: bool = config_raw.touch_ui;
 		if (zui_tab(BoxExport.htab, title, tab_vertical)) {
 
 			zui_row([0.5, 0.5]);
@@ -100,22 +100,22 @@ class BoxExport {
 
 			zui_row([0.5, 0.5]);
 			if (base_bits_handle.position == texture_bits_t.BITS8) {
-				Context.raw.format_type = zui_combo(zui_handle("boxexport_0", { position: Context.raw.format_type }), ["png", "jpg"], tr("Format"), true);
+				context_raw.format_type = zui_combo(zui_handle("boxexport_0", { position: context_raw.format_type }), ["png", "jpg"], tr("Format"), true);
 			}
 			else {
-				Context.raw.format_type = zui_combo(zui_handle("boxexport_1", { position: Context.raw.format_type }), ["exr"], tr("Format"), true);
+				context_raw.format_type = zui_combo(zui_handle("boxexport_1", { position: context_raw.format_type }), ["exr"], tr("Format"), true);
 			}
 
-			ui.enabled = Context.raw.format_type == texture_ldr_format_t.JPG && base_bits_handle.position == texture_bits_t.BITS8;
-			Context.raw.format_quality = zui_slider(zui_handle("boxexport_2", { value: Context.raw.format_quality }), tr("Quality"), 0.0, 100.0, true, 1);
+			ui.enabled = context_raw.format_type == texture_ldr_format_t.JPG && base_bits_handle.position == texture_bits_t.BITS8;
+			context_raw.format_quality = zui_slider(zui_handle("boxexport_2", { value: context_raw.format_quality }), tr("Quality"), 0.0, 100.0, true, 1);
 			ui.enabled = true;
 
 			///if is_paint
 			zui_row([0.5, 0.5]);
 			ui.enabled = !bake_material;
 			let layers_export_handle: zui_handle_t = zui_handle("boxexport_3");
-			layers_export_handle.position = Context.raw.layers_export;
-			Context.raw.layers_export = zui_combo(layers_export_handle, [tr("Visible"), tr("Selected"), tr("Per Object"), tr("Per Udim Tile")], tr("Layers"), true);
+			layers_export_handle.position = context_raw.layers_export;
+			context_raw.layers_export = zui_combo(layers_export_handle, [tr("Visible"), tr("Selected"), tr("Per Object"), tr("Per Udim Tile")], tr("Layers"), true);
 			ui.enabled = true;
 			///end
 
@@ -123,8 +123,8 @@ class BoxExport {
 			if (BoxExport.hpreset.changed) BoxExport.preset = null;
 
 			let layers_destination_handle: zui_handle_t = zui_handle("boxexport_4");
-			layers_destination_handle.position = Context.raw.layers_destination;
-			Context.raw.layers_destination = zui_combo(layers_destination_handle, [tr("Disk"), tr("Packed")], tr("Destination"), true);
+			layers_destination_handle.position = context_raw.layers_destination;
+			context_raw.layers_destination = zui_combo(layers_destination_handle, [tr("Disk"), tr("Packed")], tr("Destination"), true);
 
 			zui_end_element();
 
@@ -134,36 +134,36 @@ class BoxExport {
 			}
 			if (zui_button(tr("Export"))) {
 				UIBox.hide();
-				if (Context.raw.layers_destination == export_destination_t.PACKED) {
-					Context.raw.texture_export_path = "/";
+				if (context_raw.layers_destination == export_destination_t.PACKED) {
+					context_raw.texture_export_path = "/";
 					let _init = () => {
 						///if is_paint
-						ExportTexture.run(Context.raw.texture_export_path, bake_material);
+						ExportTexture.run(context_raw.texture_export_path, bake_material);
 						///end
 						///if is_lab
-						ExportTexture.run(Context.raw.texture_export_path);
+						ExportTexture.run(context_raw.texture_export_path);
 						///end
 					}
 					app_notify_on_init(_init);
 				}
 				else {
-					let filters = base_bits_handle.position != texture_bits_t.BITS8 ? "exr" : Context.raw.format_type == texture_ldr_format_t.PNG ? "png" : "jpg";
+					let filters = base_bits_handle.position != texture_bits_t.BITS8 ? "exr" : context_raw.format_type == texture_ldr_format_t.PNG ? "png" : "jpg";
 					UIFiles.show(filters, true, false, (path: string) => {
-						Context.raw.texture_export_path = path;
+						context_raw.texture_export_path = path;
 						let doExport = () => {
 							let _init = () => {
 								///if is_paint
-								ExportTexture.run(Context.raw.texture_export_path, bake_material);
+								ExportTexture.run(context_raw.texture_export_path, bake_material);
 								///end
 								///if is_lab
-								ExportTexture.run(Context.raw.texture_export_path);
+								ExportTexture.run(context_raw.texture_export_path);
 								///end
 							}
 							app_notify_on_init(_init);
 						}
 						///if (krom_android || krom_ios)
 						base_notify_on_next_frame(() => {
-							Console.toast(tr("Exporting textures"));
+							console_toast(tr("Exporting textures"));
 							base_notify_on_next_frame(doExport);
 						});
 						///else
@@ -172,12 +172,12 @@ class BoxExport {
 					});
 				}
 			}
-			if (ui.is_hovered) zui_tooltip(tr("Export texture files") + ` (${Config.keymap.file_export_textures})`);
+			if (ui.is_hovered) zui_tooltip(tr("Export texture files") + ` (${config_keymap.file_export_textures})`);
 		}
 	}
 
 	static tab_presets = (ui: zui_t) => {
-		let tab_vertical: bool = Config.raw.touch_ui;
+		let tab_vertical: bool = config_raw.touch_ui;
 		if (zui_tab(BoxExport.htab, tr("Presets"), tab_vertical)) {
 			zui_row([3 / 5, 1 / 5, 1 / 5]);
 
@@ -186,7 +186,7 @@ class BoxExport {
 
 			if (zui_button(tr("New"))) {
 				UIBox.show_custom((ui: zui_t) => {
-					let tab_vertical: bool = Config.raw.touch_ui;
+					let tab_vertical: bool = config_raw.touch_ui;
 					if (zui_tab(zui_handle("boxexport_5"), tr("New Preset"), tab_vertical)) {
 						zui_row([0.5, 0.5]);
 						let preset_name: string = zui_text_input(zui_handle("boxexport_6", { text: "new_preset" }), tr("Name"));
@@ -207,15 +207,15 @@ class BoxExport {
 				UIFiles.show("json", false, false, (path: string) => {
 					path = path.toLowerCase();
 					if (path.endsWith(".json")) {
-						let filename: string = path.substr(path.lastIndexOf(Path.sep) + 1);
-						let dst_path: string = Path.data() + Path.sep + "export_presets" + Path.sep + filename;
-						File.copy(path, dst_path); // Copy to presets folder
+						let filename: string = path.substr(path.lastIndexOf(path_sep) + 1);
+						let dst_path: string = path_data() + path_sep + "export_presets" + path_sep + filename;
+						file_copy(path, dst_path); // Copy to presets folder
 						BoxExport.fetch_presets();
 						BoxExport.preset = null;
 						BoxExport.hpreset.position = BoxExport.files.indexOf(filename.substr(0, filename.length - 5)); // Strip .json
-						Console.info(tr("Preset imported:") + " " + filename);
+						console_info(tr("Preset imported:") + " " + filename);
 					}
-					else Console.error(Strings.error1());
+					else console_error(strings_error1());
 				});
 			}
 
@@ -290,29 +290,29 @@ class BoxExport {
 
 	///if is_paint
 	static tab_atlases = (ui: zui_t) => {
-		let tab_vertical: bool = Config.raw.touch_ui;
+		let tab_vertical: bool = config_raw.touch_ui;
 		if (zui_tab(BoxExport.htab, tr("Atlases"), tab_vertical)) {
-			if (Project.atlas_objects == null || Project.atlas_objects.length != Project.paint_objects.length) {
-				Project.atlas_objects = [];
-				Project.atlas_names = [];
-				for (let i: i32 = 0; i < Project.paint_objects.length; ++i) {
-					Project.atlas_objects.push(0);
-					Project.atlas_names.push(tr("Atlas") + " " + (i + 1));
+			if (project_atlas_objects == null || project_atlas_objects.length != project_paint_objects.length) {
+				project_atlas_objects = [];
+				project_atlas_names = [];
+				for (let i: i32 = 0; i < project_paint_objects.length; ++i) {
+					project_atlas_objects.push(0);
+					project_atlas_names.push(tr("Atlas") + " " + (i + 1));
 				}
 			}
-			for (let i: i32 = 0; i < Project.paint_objects.length; ++i) {
+			for (let i: i32 = 0; i < project_paint_objects.length; ++i) {
 				zui_row([1 / 2, 1 / 2]);
-				zui_text(Project.paint_objects[i].base.name);
+				zui_text(project_paint_objects[i].base.name);
 				let hatlas: zui_handle_t = zui_nest(zui_handle("boxexport_7"), i);
-				hatlas.position = Project.atlas_objects[i];
-				Project.atlas_objects[i] = zui_combo(hatlas, Project.atlas_names, tr("Atlas"));
+				hatlas.position = project_atlas_objects[i];
+				project_atlas_objects[i] = zui_combo(hatlas, project_atlas_names, tr("Atlas"));
 			}
 		}
 	}
 	///end
 
 	static show_mesh = () => {
-		BoxExport.export_mesh_handle.position = Context.raw.export_mesh_index;
+		BoxExport.export_mesh_handle.position = context_raw.export_mesh_index;
 		UIBox.show_custom((ui: zui_t) => {
 			let htab: zui_handle_t = zui_handle("boxexport_8");
 			BoxExport.tab_export_mesh(ui, htab);
@@ -320,22 +320,22 @@ class BoxExport {
 	}
 
 	static tab_export_mesh = (ui: zui_t, htab: zui_handle_t) => {
-		let tab_vertical: bool = Config.raw.touch_ui;
+		let tab_vertical: bool = config_raw.touch_ui;
 		if (zui_tab(htab, tr("Export Mesh"), tab_vertical)) {
 
 			zui_row([1 / 2, 1 / 2]);
 
-			Context.raw.export_mesh_format = zui_combo(zui_handle("boxexport_9", { position: Context.raw.export_mesh_format }), ["obj", "arm"], tr("Format"), true);
+			context_raw.export_mesh_format = zui_combo(zui_handle("boxexport_9", { position: context_raw.export_mesh_format }), ["obj", "arm"], tr("Format"), true);
 
 			let ar: string[] = [tr("All")];
-			for (let p of Project.paint_objects) ar.push(p.base.name);
+			for (let p of project_paint_objects) ar.push(p.base.name);
 			zui_combo(BoxExport.export_mesh_handle, ar, tr("Meshes"), true);
 
 			let apply_displacement: bool = zui_check(zui_handle("boxexport_10"), tr("Apply Displacement"));
 
 			let tris: i32 = 0;
 			let pos: i32 = BoxExport.export_mesh_handle.position;
-			let paint_objects: mesh_object_t[] = pos == 0 ? Project.paint_objects : [Project.paint_objects[pos - 1]];
+			let paint_objects: mesh_object_t[] = pos == 0 ? project_paint_objects : [project_paint_objects[pos - 1]];
 			for (let po of paint_objects) {
 				for (let inda of po.data.index_arrays) {
 					tris += Math.floor(inda.values.length / 3);
@@ -349,7 +349,7 @@ class BoxExport {
 			}
 			if (zui_button(tr("Export"))) {
 				UIBox.hide();
-				UIFiles.show(Context.raw.export_mesh_format == mesh_format_t.OBJ ? "obj" : "arm", true, false, (path: string) => {
+				UIFiles.show(context_raw.export_mesh_format == mesh_format_t.OBJ ? "obj" : "arm", true, false, (path: string) => {
 					///if (krom_android || krom_ios)
 					let f: string = sys_title();
 					///else
@@ -357,11 +357,11 @@ class BoxExport {
 					///end
 					if (f == "") f = tr("untitled");
 					let doExport = () => {
-						ExportMesh.run(path + Path.sep + f, BoxExport.export_mesh_handle.position == 0 ? null : [Project.paint_objects[BoxExport.export_mesh_handle.position - 1]], apply_displacement);
+						ExportMesh.run(path + path_sep + f, BoxExport.export_mesh_handle.position == 0 ? null : [project_paint_objects[BoxExport.export_mesh_handle.position - 1]], apply_displacement);
 					}
 					///if (krom_android || krom_ios)
 					base_notify_on_next_frame(() => {
-						Console.toast(tr("Exporting mesh"));
+						console_toast(tr("Exporting mesh"));
 						base_notify_on_next_frame(doExport);
 					});
 					///else
@@ -376,14 +376,14 @@ class BoxExport {
 	static show_material = () => {
 		UIBox.show_custom((ui: zui_t) => {
 			let htab: zui_handle_t = zui_handle("boxexport_11");
-			let tab_vertical: bool = Config.raw.touch_ui;
+			let tab_vertical: bool = config_raw.touch_ui;
 			if (zui_tab(htab, tr("Export Material"), tab_vertical)) {
 				let h1: zui_handle_t = zui_handle("boxexport_12");
 				let h2: zui_handle_t = zui_handle("boxexport_13");
-				h1.selected = Context.raw.pack_assets_on_export;
-				h2.selected = Context.raw.write_icon_on_export;
-				Context.raw.pack_assets_on_export = zui_check(h1, tr("Pack Assets"));
-				Context.raw.write_icon_on_export = zui_check(h2, tr("Export Icon"));
+				h1.selected = context_raw.pack_assets_on_export;
+				h2.selected = context_raw.write_icon_on_export;
+				context_raw.pack_assets_on_export = zui_check(h1, tr("Pack Assets"));
+				context_raw.write_icon_on_export = zui_check(h2, tr("Export Icon"));
 				zui_row([0.5, 0.5]);
 				if (zui_button(tr("Cancel"))) {
 					UIBox.hide();
@@ -394,7 +394,7 @@ class BoxExport {
 						let f: string = UIFiles.filename;
 						if (f == "") f = tr("untitled");
 						app_notify_on_init(() => {
-							ExportArm.run_material(path + Path.sep + f);
+							ExportArm.run_material(path + path_sep + f);
 						});
 					});
 				}
@@ -405,14 +405,14 @@ class BoxExport {
 	static show_brush = () => {
 		UIBox.show_custom((ui: zui_t) => {
 			let htab: zui_handle_t = zui_handle("boxexport_14");
-			let tab_vertical: bool = Config.raw.touch_ui;
+			let tab_vertical: bool = config_raw.touch_ui;
 			if (zui_tab(htab, tr("Export Brush"), tab_vertical)) {
 				let h1: zui_handle_t = zui_handle("boxexport_15");
 				let h2: zui_handle_t = zui_handle("boxexport_16");
-				h1.selected = Context.raw.pack_assets_on_export;
-				h2.selected = Context.raw.write_icon_on_export;
-				Context.raw.pack_assets_on_export = zui_check(h1, tr("Pack Assets"));
-				Context.raw.write_icon_on_export = zui_check(h2, tr("Export Icon"));
+				h1.selected = context_raw.pack_assets_on_export;
+				h2.selected = context_raw.write_icon_on_export;
+				context_raw.pack_assets_on_export = zui_check(h1, tr("Pack Assets"));
+				context_raw.write_icon_on_export = zui_check(h2, tr("Export Icon"));
 				zui_row([0.5, 0.5]);
 				if (zui_button(tr("Cancel"))) {
 					UIBox.hide();
@@ -423,7 +423,7 @@ class BoxExport {
 						let f: string = UIFiles.filename;
 						if (f == "") f = tr("untitled");
 						app_notify_on_init(() => {
-							ExportArm.run_brush(path + Path.sep + f);
+							ExportArm.run_brush(path + path_sep + f);
 						});
 					});
 				}
@@ -434,7 +434,7 @@ class BoxExport {
 
 	///if (is_paint || is_lab)
 	static fetch_presets = () => {
-		BoxExport.files = File.read_directory(Path.data() + Path.sep + "export_presets");
+		BoxExport.files = file_read_directory(path_data() + path_sep + "export_presets");
 		for (let i: i32 = 0; i < BoxExport.files.length; ++i) {
 			BoxExport.files[i] = BoxExport.files[i].substr(0, BoxExport.files[i].length - 5); // Strip .json
 		}
@@ -456,14 +456,14 @@ class BoxExport {
 }
 `;
 		if (!name.endsWith(".json")) name += ".json";
-		let path: string = Path.data() + Path.sep + "export_presets" + Path.sep + name;
+		let path: string = path_data() + path_sep + "export_presets" + path_sep + name;
 		krom_file_save_bytes(path, sys_string_to_buffer(template));
 	}
 
 	static save_preset = () => {
 		let name: string = BoxExport.files[BoxExport.hpreset.position];
 		if (name == "generic") return; // generic is const
-		let path: string = Path.data() + Path.sep + "export_presets" + Path.sep + name + ".json";
+		let path: string = path_data() + path_sep + "export_presets" + path_sep + name + ".json";
 		krom_file_save_bytes(path, sys_string_to_buffer(JSON.stringify(BoxExport.preset)));
 	}
 	///end

+ 159 - 159
base/Sources/BoxPreferences.ts

@@ -16,68 +16,68 @@ class BoxPreferences {
 			if (zui_tab(BoxPreferences.htab, tr("Interface"), true)) {
 
 				if (BoxPreferences.locales == null) {
-					BoxPreferences.locales = Translator.get_supported_locales();
+					BoxPreferences.locales = translator_get_supported_locales();
 				}
 
-				let locale_handle: zui_handle_t = zui_handle("boxpreferences_0", { position: BoxPreferences.locales.indexOf(Config.raw.locale) });
+				let locale_handle: zui_handle_t = zui_handle("boxpreferences_0", { position: BoxPreferences.locales.indexOf(config_raw.locale) });
 				zui_combo(locale_handle, BoxPreferences.locales, tr("Language"), true);
 				if (locale_handle.changed) {
 					let locale_code: string = BoxPreferences.locales[locale_handle.position];
-					Config.raw.locale = locale_code;
-					Translator.load_translations(locale_code);
+					config_raw.locale = locale_code;
+					translator_load_translations(locale_code);
 					UIBase.tag_ui_redraw();
 				}
 
-				let hscale: zui_handle_t = zui_handle("boxpreferences_1", { value: Config.raw.window_scale });
+				let hscale: zui_handle_t = zui_handle("boxpreferences_1", { value: config_raw.window_scale });
 				zui_slider(hscale, tr("UI Scale"), 1.0, 4.0, true, 10);
-				if (Context.raw.hscale_was_changed && !ui.input_down) {
-					Context.raw.hscale_was_changed = false;
+				if (context_raw.hscale_was_changed && !ui.input_down) {
+					context_raw.hscale_was_changed = false;
 					if (hscale.value == null || isNaN(hscale.value)) hscale.value = 1.0;
-					Config.raw.window_scale = hscale.value;
+					config_raw.window_scale = hscale.value;
 					BoxPreferences.set_scale();
 				}
-				if (hscale.changed) Context.raw.hscale_was_changed = true;
+				if (hscale.changed) context_raw.hscale_was_changed = true;
 
-				let hspeed: zui_handle_t = zui_handle("boxpreferences_2", { value: Config.raw.camera_zoom_speed });
-				Config.raw.camera_zoom_speed = zui_slider(hspeed, tr("Camera Zoom Speed"), 0.1, 4.0, true);
+				let hspeed: zui_handle_t = zui_handle("boxpreferences_2", { value: config_raw.camera_zoom_speed });
+				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 = zui_slider(hspeed, tr("Camera Rotation Speed"), 0.1, 4.0, true);
+				hspeed = zui_handle("boxpreferences_3", { value: config_raw.camera_rotation_speed });
+				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 = zui_slider(hspeed, tr("Camera Pan Speed"), 0.1, 4.0, true);
+				hspeed = zui_handle("boxpreferences_4", { value: config_raw.camera_pan_speed });
+				config_raw.camera_pan_speed = zui_slider(hspeed, tr("Camera Pan Speed"), 0.1, 4.0, true);
 
-				let zoom_direction_handle: zui_handle_t = zui_handle("boxpreferences_5", { position: Config.raw.zoom_direction });
+				let zoom_direction_handle: zui_handle_t = zui_handle("boxpreferences_5", { position: config_raw.zoom_direction });
 				zui_combo(zoom_direction_handle, [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 (zoom_direction_handle.changed) {
-					Config.raw.zoom_direction = zoom_direction_handle.position;
+					config_raw.zoom_direction = zoom_direction_handle.position;
 				}
 
-				Config.raw.wrap_mouse = zui_check(zui_handle("boxpreferences_6", { selected: Config.raw.wrap_mouse }), tr("Wrap Mouse"));
+				config_raw.wrap_mouse = zui_check(zui_handle("boxpreferences_6", { selected: config_raw.wrap_mouse }), tr("Wrap Mouse"));
 				if (ui.is_hovered) zui_tooltip(tr("Wrap mouse around view boundaries during camera control"));
 
-				Config.raw.node_preview = zui_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 = zui_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.tag_ui_redraw();
 				}
 
 				///if !(krom_android || krom_ios)
 				ui.changed = false;
-				Config.raw.touch_ui = zui_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_set_touch_scroll(Config.raw.touch_ui);
-					zui_set_touch_hold(Config.raw.touch_ui);
-					zui_set_touch_tooltip(Config.raw.touch_ui);
-					Config.load_theme(Config.raw.theme);
+					zui_set_touch_scroll(config_raw.touch_ui);
+					zui_set_touch_hold(config_raw.touch_ui);
+					zui_set_touch_tooltip(config_raw.touch_ui);
+					config_load_theme(config_raw.theme);
 					BoxPreferences.set_scale();
 					UIBase.tag_ui_redraw();
 				}
 				///end
 
-				Config.raw.splash_screen = zui_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"));
 
 				// Zui.text("Node Editor");
 				// let grid_snap: bool = Zui.check(Zui.handle("boxpreferences_11", { selected: false }), "Grid Snap");
@@ -89,9 +89,9 @@ class BoxPreferences {
 						if (UIMenu.menu_button(ui, tr("Confirm"))) {
 							app_notify_on_init(() => {
 								ui.t.ELEMENT_H = base_default_element_h;
-								Config.restore();
+								config_restore();
 								BoxPreferences.set_scale();
-								if (BoxPreferences.files_plugin != null) for (let f of BoxPreferences.files_plugin) Plugin.stop(f);
+								if (BoxPreferences.files_plugin != null) for (let f of BoxPreferences.files_plugin) plugin_stop(f);
 								BoxPreferences.files_plugin = null;
 								BoxPreferences.files_keymap = null;
 								MakeMaterial.parse_mesh_material();
@@ -104,7 +104,7 @@ class BoxPreferences {
 								let raw: config_t = JSON.parse(sys_buffer_to_string(b));
 								app_notify_on_init(() => {
 									ui.t.ELEMENT_H = base_default_element_h;
-									Config.import_from(raw);
+									config_import_from(raw);
 									BoxPreferences.set_scale();
 									MakeMaterial.parse_mesh_material();
 									MakeMaterial.parse_paint_material();
@@ -117,7 +117,7 @@ class BoxPreferences {
 					UIMenu.draw((ui: zui_t) => {
 						if (UIMenu.menu_button(ui, tr("Confirm"))) {
 							base_init_layout();
-							Config.save();
+							config_save();
 						}
 					}, 1);
 				}
@@ -135,8 +135,8 @@ class BoxPreferences {
 
 				zui_combo(BoxPreferences.theme_handle, BoxPreferences.themes, tr("Theme"));
 				if (BoxPreferences.theme_handle.changed) {
-					Config.raw.theme = BoxPreferences.themes[BoxPreferences.theme_handle.position] + ".json";
-					Config.load_theme(Config.raw.theme);
+					config_raw.theme = BoxPreferences.themes[BoxPreferences.theme_handle.position] + ".json";
+					config_load_theme(config_raw.theme);
 				}
 
 				if (zui_button(tr("New"))) {
@@ -147,10 +147,10 @@ class BoxPreferences {
 							if (zui_button(tr("OK")) || ui.is_return_down) {
 								let template: string = JSON.stringify(base_theme);
 								if (!theme_name.endsWith(".json")) theme_name += ".json";
-								let path: string = Path.data() + Path.sep + "themes" + Path.sep + theme_name;
+								let path: string = path_data() + path_sep + "themes" + path_sep + theme_name;
 								krom_file_save_bytes(path, sys_string_to_buffer(template));
 								BoxPreferences.fetch_themes(); // Refresh file list
-								Config.raw.theme = theme_name;
+								config_raw.theme = theme_name;
 								BoxPreferences.theme_handle.position = BoxPreferences.get_theme_index();
 								UIBox.hide();
 								BoxPreferences.htab.position = 1; // Themes
@@ -168,7 +168,7 @@ class BoxPreferences {
 
 				if (zui_button(tr("Export"))) {
 					UIFiles.show("json", true, false, (path: string) => {
-						path += Path.sep + UIFiles.filename;
+						path += path_sep + UIFiles.filename;
 						if (!path.endsWith(".json")) path += ".json";
 						krom_file_save_bytes(path, sys_string_to_buffer(JSON.stringify(base_theme)));
 					});
@@ -204,10 +204,10 @@ class BoxPreferences {
 					b[1] = color_get_gb(BoxPreferences.world_color);
 					b[2] = color_get_bb(BoxPreferences.world_color);
 					b[3] = 255;
-					Context.raw.empty_envmap = image_from_bytes(b.buffer, 1, 1);
-					Context.raw.ddirty = 2;
-					if (!Context.raw.show_envmap) {
-						scene_world._.envmap = Context.raw.empty_envmap;
+					context_raw.empty_envmap = image_from_bytes(b.buffer, 1, 1);
+					context_raw.ddirty = 2;
+					if (!context_raw.show_envmap) {
+						scene_world._.envmap = context_raw.empty_envmap;
 					}
 				}
 
@@ -264,56 +264,56 @@ class BoxPreferences {
 			}
 
 			if (zui_tab(BoxPreferences.htab, tr("Usage"), true)) {
-				Context.raw.undo_handle = zui_handle("boxpreferences_16", { value: Config.raw.undo_steps });
-				Config.raw.undo_steps = Math.floor(zui_slider(Context.raw.undo_handle, tr("Undo Steps"), 1, 64, false, 1));
-				if (Config.raw.undo_steps < 1) {
-					Config.raw.undo_steps = Math.floor(Context.raw.undo_handle.value = 1);
+				context_raw.undo_handle = zui_handle("boxpreferences_16", { value: config_raw.undo_steps });
+				config_raw.undo_steps = Math.floor(zui_slider(context_raw.undo_handle, tr("Undo Steps"), 1, 64, false, 1));
+				if (config_raw.undo_steps < 1) {
+					config_raw.undo_steps = Math.floor(context_raw.undo_handle.value = 1);
 				}
-				if (Context.raw.undo_handle.changed) {
+				if (context_raw.undo_handle.changed) {
 					let current: image_t = _g2_current;
 					g2_end();
 
 					///if (is_paint || is_sculpt)
-					while (History.undo_layers.length < Config.raw.undo_steps) {
-						let l: SlotLayerRaw = SlotLayer.create("_undo" + History.undo_layers.length);
-						History.undo_layers.push(l);
+					while (history_undo_layers.length < config_raw.undo_steps) {
+						let l: SlotLayerRaw = SlotLayer.create("_undo" + history_undo_layers.length);
+						history_undo_layers.push(l);
 					}
-					while (History.undo_layers.length > Config.raw.undo_steps) {
-						let l: SlotLayerRaw = History.undo_layers.pop();
+					while (history_undo_layers.length > config_raw.undo_steps) {
+						let l: SlotLayerRaw = history_undo_layers.pop();
 						SlotLayer.unload(l);
 					}
 					///end
 
-					History.reset();
+					history_reset();
 					g2_begin(current);
 				}
 
 				///if is_paint
-				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));
+				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.is_hovered) zui_tooltip(tr("Dilate painted textures to prevent seams"));
 
-				let dilate_handle: zui_handle_t = zui_handle("boxpreferences_18", { position: Config.raw.dilate });
+				let dilate_handle: zui_handle_t = zui_handle("boxpreferences_18", { position: config_raw.dilate });
 				zui_combo(dilate_handle, [tr("Instant"), tr("Delayed")], tr("Dilate"), true);
 				if (dilate_handle.changed) {
-					Config.raw.dilate = dilate_handle.position;
+					config_raw.dilate = dilate_handle.position;
 				}
 				///end
 
 				///if is_lab
-				let workspace_handle: zui_handle_t = zui_handle("boxpreferences_19", { position: Config.raw.workspace });
+				let workspace_handle: zui_handle_t = zui_handle("boxpreferences_19", { position: config_raw.workspace });
 				zui_combo(workspace_handle, [tr("3D View"), tr("2D View")], tr("Default Workspace"), true);
 				if (workspace_handle.changed) {
-					Config.raw.workspace = workspace_handle.position;
+					config_raw.workspace = workspace_handle.position;
 				}
 				///end
 
-				let camera_controls_handle: zui_handle_t = zui_handle("boxpreferences_20", { position: Config.raw.camera_controls });
+				let camera_controls_handle: zui_handle_t = zui_handle("boxpreferences_20", { position: config_raw.camera_controls });
 				zui_combo(camera_controls_handle, [tr("Orbit"), tr("Rotate"), tr("Fly")], tr("Default Camera Controls"), true);
 				if (camera_controls_handle.changed) {
-					Config.raw.camera_controls = camera_controls_handle.position;
+					config_raw.camera_controls = camera_controls_handle.position;
 				}
 
-				let layer_res_handle: zui_handle_t = zui_handle("boxpreferences_21", { position: Config.raw.layer_res });
+				let layer_res_handle: zui_handle_t = zui_handle("boxpreferences_21", { position: config_raw.layer_res });
 
 				///if is_paint
 				///if (krom_android || krom_ios)
@@ -332,40 +332,40 @@ class BoxPreferences {
 				///end
 
 				if (layer_res_handle.changed) {
-					Config.raw.layer_res = layer_res_handle.position;
+					config_raw.layer_res = layer_res_handle.position;
 				}
 
-				let server_handle: zui_handle_t = zui_handle("boxpreferences_22", { text: Config.raw.server });
-				Config.raw.server = zui_text_input(server_handle, tr("Cloud Server"));
+				let server_handle: zui_handle_t = zui_handle("boxpreferences_22", { text: config_raw.server });
+				config_raw.server = zui_text_input(server_handle, tr("Cloud Server"));
 
 				///if (is_paint || is_sculpt)
-				let material_live_handle: zui_handle_t = zui_handle("boxpreferences_23", {selected: Config.raw.material_live });
-				Config.raw.material_live = zui_check(material_live_handle, tr("Live Material Preview"));
+				let material_live_handle: zui_handle_t = zui_handle("boxpreferences_23", {selected: config_raw.material_live });
+				config_raw.material_live = zui_check(material_live_handle, tr("Live Material Preview"));
 				if (ui.is_hovered) zui_tooltip(tr("Instantly update material preview on node change"));
 
-				let brush_live_handle: zui_handle_t = zui_handle("boxpreferences_24", { selected: Config.raw.brush_live });
-				Config.raw.brush_live = zui_check(brush_live_handle, tr("Live Brush Preview"));
+				let brush_live_handle: zui_handle_t = zui_handle("boxpreferences_24", { selected: config_raw.brush_live });
+				config_raw.brush_live = zui_check(brush_live_handle, tr("Live Brush Preview"));
 				if (ui.is_hovered) zui_tooltip(tr("Draw live brush preview in viewport"));
-				if (brush_live_handle.changed) Context.raw.ddirty = 2;
+				if (brush_live_handle.changed) context_raw.ddirty = 2;
 
-				let brush_3d_handle: zui_handle_t = zui_handle("boxpreferences_25", { selected: Config.raw.brush_3d });
-				Config.raw.brush_3d = zui_check(brush_3d_handle, tr("3D Cursor"));
+				let brush_3d_handle: zui_handle_t = zui_handle("boxpreferences_25", { selected: config_raw.brush_3d });
+				config_raw.brush_3d = zui_check(brush_3d_handle, tr("3D Cursor"));
 				if (brush_3d_handle.changed) MakeMaterial.parse_paint_material();
 
-				ui.enabled = Config.raw.brush_3d;
-				let brush_depth_reject_handle: zui_handle_t = zui_handle("boxpreferences_26", { selected: Config.raw.brush_depth_reject });
-				Config.raw.brush_depth_reject = zui_check(brush_depth_reject_handle, tr("Depth Reject"));
+				ui.enabled = config_raw.brush_3d;
+				let brush_depth_reject_handle: zui_handle_t = zui_handle("boxpreferences_26", { selected: config_raw.brush_depth_reject });
+				config_raw.brush_depth_reject = zui_check(brush_depth_reject_handle, tr("Depth Reject"));
 				if (brush_depth_reject_handle.changed) MakeMaterial.parse_paint_material();
 
 				zui_row([0.5, 0.5]);
 
-				let brush_angle_reject_handle: zui_handle_t = zui_handle("boxpreferences_27", { selected: Config.raw.brush_angle_reject });
-				Config.raw.brush_angle_reject = zui_check(brush_angle_reject_handle, tr("Angle Reject"));
+				let brush_angle_reject_handle: zui_handle_t = zui_handle("boxpreferences_27", { selected: config_raw.brush_angle_reject });
+				config_raw.brush_angle_reject = zui_check(brush_angle_reject_handle, tr("Angle Reject"));
 				if (brush_angle_reject_handle.changed) MakeMaterial.parse_paint_material();
 
-				if (!Config.raw.brush_angle_reject) ui.enabled = false;
-				let angle_dot_handle: zui_handle_t = zui_handle("boxpreferences_28", { value: Context.raw.brush_angle_reject_dot });
-				Context.raw.brush_angle_reject_dot = zui_slider(angle_dot_handle, tr("Angle"), 0.0, 1.0, true);
+				if (!config_raw.brush_angle_reject) ui.enabled = false;
+				let angle_dot_handle: zui_handle_t = zui_handle("boxpreferences_28", { value: context_raw.brush_angle_reject_dot });
+				context_raw.brush_angle_reject_dot = zui_slider(angle_dot_handle, tr("Angle"), 0.0, 1.0, true);
 				if (angle_dot_handle.changed) {
 					MakeMaterial.parse_paint_material();
 				}
@@ -373,7 +373,7 @@ class BoxPreferences {
 				///end
 
 				///if is_lab
-				Config.raw.gpu_inference = zui_check(zui_handle("boxpreferences_29", { selected: Config.raw.gpu_inference }), tr("Use GPU"));
+				config_raw.gpu_inference = zui_check(zui_handle("boxpreferences_29", { selected: config_raw.gpu_inference }), tr("Use GPU"));
 				if (ui.is_hovered) zui_tooltip(tr("Use GPU to accelerate node graph processing"));
 				///end
 			}
@@ -387,88 +387,88 @@ class BoxPreferences {
 
 			if (zui_tab(BoxPreferences.htab, pen_name, 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);
+				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 = 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"));
+				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
 
 				zui_end_element();
 				zui_row([0.5]);
 				if (zui_button(tr("Help"))) {
 					///if (is_paint || is_sculpt)
-					File.load_url("https://github.com/armory3d/armorpaint_docs///pen");
+					file_load_url("https://github.com/armory3d/armorpaint_docs///pen");
 					///end
 					///if is_lab
-					File.load_url("https://github.com/armory3d/armorlab_docs///pen");
+					file_load_url("https://github.com/armory3d/armorlab_docs///pen");
 					///end
 				}
 			}
 
-			Context.raw.hssao = zui_handle("boxpreferences_35", { selected: Config.raw.rp_ssao });
-			Context.raw.hssr = zui_handle("boxpreferences_36", { selected: Config.raw.rp_ssr });
-			Context.raw.hbloom = zui_handle("boxpreferences_37", { selected: Config.raw.rp_bloom });
-			Context.raw.hsupersample = zui_handle("boxpreferences_38", { position: Config.get_super_sample_quality(Config.raw.rp_supersample) });
-			Context.raw.hvxao = zui_handle("boxpreferences_39", { selected: Config.raw.rp_gi });
+			context_raw.hssao = zui_handle("boxpreferences_35", { selected: config_raw.rp_ssao });
+			context_raw.hssr = zui_handle("boxpreferences_36", { selected: config_raw.rp_ssr });
+			context_raw.hbloom = zui_handle("boxpreferences_37", { selected: config_raw.rp_bloom });
+			context_raw.hsupersample = zui_handle("boxpreferences_38", { position: config_get_super_sample_quality(config_raw.rp_supersample) });
+			context_raw.hvxao = zui_handle("boxpreferences_39", { selected: config_raw.rp_gi });
 			if (zui_tab(BoxPreferences.htab, tr("Viewport"), true)) {
 				///if (krom_direct3d12 || krom_vulkan || krom_metal)
 
-				let hpathtrace_mode: zui_handle_t = zui_handle("boxpreferences_40", { position: Context.raw.pathtrace_mode });
-				Context.raw.pathtrace_mode = zui_combo(hpathtrace_mode, [tr("Core"), tr("Full")], tr("Path Tracer"), true);
+				let hpathtrace_mode: zui_handle_t = zui_handle("boxpreferences_40", { position: context_raw.pathtrace_mode });
+				context_raw.pathtrace_mode = zui_combo(hpathtrace_mode, [tr("Core"), tr("Full")], tr("Path Tracer"), true);
 				if (hpathtrace_mode.changed) {
 					RenderPathRaytrace.ready = false;
 				}
 
 				///end
 
-				let hrender_mode: zui_handle_t = zui_handle("boxpreferences_41", { position: Context.raw.render_mode });
-				Context.raw.render_mode = zui_combo(hrender_mode, [tr("Full"), tr("Mobile")], tr("Renderer"), true);
+				let hrender_mode: zui_handle_t = zui_handle("boxpreferences_41", { position: context_raw.render_mode });
+				context_raw.render_mode = zui_combo(hrender_mode, [tr("Full"), tr("Mobile")], tr("Renderer"), true);
 				if (hrender_mode.changed) {
-					Context.set_render_path();
+					context_set_render_path();
 				}
 
-				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.apply_config();
+				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_apply();
 
-				if (Context.raw.render_mode == render_mode_t.DEFERRED) {
+				if (context_raw.render_mode == render_mode_t.DEFERRED) {
 					///if arm_voxels
-					zui_check(Context.raw.hvxao, tr("Voxel AO"));
+					zui_check(context_raw.hvxao, tr("Voxel AO"));
 					if (ui.is_hovered) zui_tooltip(tr("Cone-traced AO and shadows"));
-					if (Context.raw.hvxao.changed) {
-						Config.apply_config();
+					if (context_raw.hvxao.changed) {
+						config_apply();
 					}
 
-					ui.enabled = Context.raw.hvxao.selected;
-					let h: zui_handle_t = zui_handle("boxpreferences_42", { value: Context.raw.vxao_offset });
-					Context.raw.vxao_offset = 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.vxao_aperture });
-					Context.raw.vxao_aperture = zui_slider(h, tr("Aperture"), 1.0, 4.0, true);
-					if (h.changed) Context.raw.ddirty = 2;
+					ui.enabled = context_raw.hvxao.selected;
+					let h: zui_handle_t = zui_handle("boxpreferences_42", { value: context_raw.vxao_offset });
+					context_raw.vxao_offset = 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.vxao_aperture });
+					context_raw.vxao_aperture = zui_slider(h, tr("Aperture"), 1.0, 4.0, true);
+					if (h.changed) context_raw.ddirty = 2;
 					ui.enabled = true;
 					///end
 
-					zui_check(Context.raw.hssao, tr("SSAO"));
-					if (Context.raw.hssao.changed) Config.apply_config();
-					zui_check(Context.raw.hssr, tr("SSR"));
-					if (Context.raw.hssr.changed) Config.apply_config();
-					zui_check(Context.raw.hbloom, tr("Bloom"));
-					if (Context.raw.hbloom.changed) Config.apply_config();
+					zui_check(context_raw.hssao, tr("SSAO"));
+					if (context_raw.hssao.changed) config_apply();
+					zui_check(context_raw.hssr, tr("SSR"));
+					if (context_raw.hssr.changed) config_apply();
+					zui_check(context_raw.hbloom, tr("Bloom"));
+					if (context_raw.hbloom.changed) config_apply();
 				}
 
-				let h: zui_handle_t = zui_handle("boxpreferences_44", { value: Config.raw.rp_vignette });
-				Config.raw.rp_vignette = zui_slider(h, tr("Vignette"), 0.0, 1.0, true);
-				if (h.changed) Context.raw.ddirty = 2;
+				let h: zui_handle_t = zui_handle("boxpreferences_44", { value: config_raw.rp_vignette });
+				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 = zui_slider(h, tr("Noise Grain"), 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 = zui_slider(h, tr("Noise Grain"), 0.0, 1.0, true);
+				if (h.changed) context_raw.ddirty = 2;
 
-				// let h: zui_handle_t = Zui.handle("boxpreferences_46", { value: Context.raw.autoExposureStrength });
-				// Context.raw.autoExposureStrength = Zui.slider(h, "Auto Exposure", 0.0, 2.0, true);
-				// if (h.changed) Context.raw.ddirty = 2;
+				// let h: zui_handle_t = Zui.handle("boxpreferences_46", { value: raw.autoExposureStrength });
+				// raw.autoExposureStrength = Zui.slider(h, "Auto Exposure", 0.0, 2.0, true);
+				// if (h.changed) raw.ddirty = 2;
 
 				let cam: camera_object_t = scene_camera;
 				let cam_raw: camera_data_t = cam.data;
@@ -482,10 +482,10 @@ class BoxPreferences {
 					camera_object_build_proj(cam);
 				}
 
-				let disp_handle: zui_handle_t = zui_handle("boxpreferences_49", { value: Config.raw.displace_strength });
-				Config.raw.displace_strength = zui_slider(disp_handle, tr("Displacement Strength"), 0.0, 10.0, true);
+				let disp_handle: zui_handle_t = zui_handle("boxpreferences_49", { value: config_raw.displace_strength });
+				config_raw.displace_strength = zui_slider(disp_handle, tr("Displacement Strength"), 0.0, 10.0, true);
 				if (disp_handle.changed) {
-					Context.raw.ddirty = 2;
+					context_raw.ddirty = 2;
 					MakeMaterial.parse_mesh_material();
 				}
 			}
@@ -501,9 +501,9 @@ class BoxPreferences {
 				BoxPreferences.preset_handle = zui_handle("boxpreferences_50", { position: BoxPreferences.get_preset_index() });
 				zui_combo(BoxPreferences.preset_handle, BoxPreferences.files_keymap, tr("Preset"));
 				if (BoxPreferences.preset_handle.changed) {
-					Config.raw.keymap = BoxPreferences.files_keymap[BoxPreferences.preset_handle.position] + ".json";
-					Config.apply_config();
-					Config.load_keymap();
+					config_raw.keymap = BoxPreferences.files_keymap[BoxPreferences.preset_handle.position] + ".json";
+					config_apply();
+					config_load_keymap();
 				}
 
 				if (zui_button(tr("New"))) {
@@ -514,10 +514,10 @@ class BoxPreferences {
 							if (zui_button(tr("OK")) || ui.is_return_down) {
 								let template: string = JSON.stringify(base_default_keymap);
 								if (!keymap_name.endsWith(".json")) keymap_name += ".json";
-								let path: string = Path.data() + Path.sep + "keymap_presets" + Path.sep + keymap_name;
+								let path: string = path_data() + path_sep + "keymap_presets" + path_sep + keymap_name;
 								krom_file_save_bytes(path, sys_string_to_buffer(template));
 								BoxPreferences.fetch_keymaps(); // Refresh file list
-								Config.raw.keymap = keymap_name;
+								config_raw.keymap = keymap_name;
 								BoxPreferences.preset_handle.position = BoxPreferences.get_preset_index();
 								UIBox.hide();
 								BoxPreferences.htab.position = 5; // Keymap
@@ -535,8 +535,8 @@ class BoxPreferences {
 				if (zui_button(tr("Export"))) {
 					UIFiles.show("json", true, false, (dest: string) => {
 						if (!UIFiles.filename.endsWith(".json")) UIFiles.filename += ".json";
-						let path: string = Path.data() + Path.sep + "keymap_presets" + Path.sep + Config.raw.keymap;
-						File.copy(path, dest + Path.sep + UIFiles.filename);
+						let path: string = path_data() + path_sep + "keymap_presets" + path_sep + config_raw.keymap;
+						file_copy(path, dest + path_sep + UIFiles.filename);
 					});
 				}
 
@@ -546,15 +546,15 @@ class BoxPreferences {
 
 				let i: i32 = 0;
 				ui.changed = false;
-				for (let key in Config.keymap) {
+				for (let key in config_keymap) {
 					let h: zui_handle_t = zui_nest(zui_handle("boxpreferences_53"), i++);
-					h.text = Config.keymap[key];
+					h.text = config_keymap[key];
 					let text: string = zui_text_input(h, key, zui_align_t.LEFT);
-					Config.keymap[key] = text;
+					config_keymap[key] = text;
 				}
 				if (ui.changed) {
-					Config.apply_config();
-					Config.save_keymap();
+					config_apply();
+					config_save_keymap();
 				}
 			}
 			if (zui_tab(BoxPreferences.htab, tr("Plugins"), true)) {
@@ -567,7 +567,7 @@ class BoxPreferences {
 							let plugin_name: string = zui_text_input(zui_handle("boxpreferences_55", { text: "new_plugin" }), tr("Name"));
 							if (zui_button(tr("OK")) || ui.is_return_down) {
 								let template: string =
-`let plugin = Plugin.create();
+`let plugin = create();
 let h1 = new Handle();
 plugin.drawUI = (ui) { =>
 	if (Zui.panel(h1, 'New Plugin')) {
@@ -578,7 +578,7 @@ plugin.drawUI = (ui) { =>
 }
 `;
 								if (!plugin_name.endsWith(".js")) plugin_name += ".js";
-								let path: string = Path.data() + Path.sep + "plugins" + Path.sep + plugin_name;
+								let path: string = path_data() + path_sep + "plugins" + path_sep + plugin_name;
 								krom_file_save_bytes(path, sys_string_to_buffer(template));
 								BoxPreferences.files_plugin = null; // Refresh file list
 								UIBox.hide();
@@ -599,61 +599,61 @@ plugin.drawUI = (ui) { =>
 					BoxPreferences.fetch_plugins();
 				}
 
-				if (Config.raw.plugins == null) Config.raw.plugins = [];
+				if (config_raw.plugins == null) config_raw.plugins = [];
 				let h: zui_handle_t = zui_handle("boxpreferences_56", { selected: false });
 				for (let f of BoxPreferences.files_plugin) {
 					let is_js: bool = f.endsWith(".js");
 					if (!is_js) continue;
-					let enabled: bool = Config.raw.plugins.indexOf(f) >= 0;
+					let enabled: bool = config_raw.plugins.indexOf(f) >= 0;
 					h.selected = enabled;
 					let tag: string = is_js ? f.split(".")[0] : f;
 					zui_check(h, tag);
 					if (h.changed && h.selected != enabled) {
-						h.selected ? Config.enable_plugin(f) : Config.disable_plugin(f);
+						h.selected ? config_enable_plugin(f) : config_disable_plugin(f);
 						base_redraw_ui();
 					}
 					if (ui.is_hovered && ui.input_released_r) {
 						UIMenu.draw((ui: zui_t) => {
-							let path: string = Path.data() + Path.sep + "plugins" + Path.sep + f;
+							let path: string = path_data() + path_sep + "plugins" + path_sep + f;
 							if (UIMenu.menu_button(ui, tr("Edit in Text Editor"))) {
-								File.start(path);
+								file_start(path);
 							}
 							if (UIMenu.menu_button(ui, tr("Edit in Script Tab"))) {
 								let blob: ArrayBuffer = data_get_blob("plugins/" + f);
 								TabScript.hscript.text = sys_buffer_to_string(blob);
 								data_delete_blob("plugins/" + f);
-								Console.info(tr("Script opened"));
+								console_info(tr("Script opened"));
 							}
 							if (UIMenu.menu_button(ui, tr("Export"))) {
 								UIFiles.show("js", true, false, (dest: string) => {
 									if (!UIFiles.filename.endsWith(".js")) UIFiles.filename += ".js";
-									File.copy(path, dest + Path.sep + UIFiles.filename);
+									file_copy(path, dest + path_sep + UIFiles.filename);
 								});
 							}
 							if (UIMenu.menu_button(ui, tr("Delete"))) {
-								if (Config.raw.plugins.indexOf(f) >= 0) {
-									array_remove(Config.raw.plugins, f);
-									Plugin.stop(f);
+								if (config_raw.plugins.indexOf(f) >= 0) {
+									array_remove(config_raw.plugins, f);
+									plugin_stop(f);
 								}
 								array_remove(BoxPreferences.files_plugin, f);
-								File.delete(path);
+								file_delete(path);
 							}
 						}, 4);
 					}
 				}
 			}
 
-		}, 620, Config.raw.touch_ui ? 480 : 420, () => { Config.save(); });
+		}, 620, config_raw.touch_ui ? 480 : 420, () => { config_save(); });
 	}
 
 	static fetch_themes = () => {
-		BoxPreferences.themes = File.read_directory(Path.data() + Path.sep + "themes");
+		BoxPreferences.themes = file_read_directory(path_data() + path_sep + "themes");
 		for (let i: i32 = 0; i < BoxPreferences.themes.length; ++i) BoxPreferences.themes[i] = BoxPreferences.themes[i].substr(0, BoxPreferences.themes[i].length - 5); // Strip .json
 		BoxPreferences.themes.unshift("default");
 	}
 
 	static fetch_keymaps = () => {
-		BoxPreferences.files_keymap = File.read_directory(Path.data() + Path.sep + "keymap_presets");
+		BoxPreferences.files_keymap = file_read_directory(path_data() + path_sep + "keymap_presets");
 		for (let i: i32 = 0; i < BoxPreferences.files_keymap.length; ++i) {
 			BoxPreferences.files_keymap[i] = BoxPreferences.files_keymap[i].substr(0, BoxPreferences.files_keymap[i].length - 5); // Strip .json
 		}
@@ -661,22 +661,22 @@ plugin.drawUI = (ui) { =>
 	}
 
 	static fetch_plugins = () => {
-		BoxPreferences.files_plugin = File.read_directory(Path.data() + Path.sep + "plugins");
+		BoxPreferences.files_plugin = file_read_directory(path_data() + path_sep + "plugins");
 	}
 
 	static get_theme_index = (): i32 => {
-		return BoxPreferences.themes.indexOf(Config.raw.theme.substr(0, Config.raw.theme.length - 5)); // Strip .json
+		return BoxPreferences.themes.indexOf(config_raw.theme.substr(0, config_raw.theme.length - 5)); // Strip .json
 	}
 
 	static get_preset_index = (): i32 => {
-		return BoxPreferences.files_keymap.indexOf(Config.raw.keymap.substr(0, Config.raw.keymap.length - 5)); // Strip .json
+		return BoxPreferences.files_keymap.indexOf(config_raw.keymap.substr(0, config_raw.keymap.length - 5)); // Strip .json
 	}
 
 	static set_scale = () => {
-		let scale: f32 = Config.raw.window_scale;
+		let scale: f32 = config_raw.window_scale;
 		zui_set_scale(UIBase.ui, scale);
 		UIHeader.headerh = Math.floor(UIHeader.default_header_h * scale);
-		Config.raw.layout[layout_size_t.STATUS_H] = Math.floor(UIStatus.default_status_h * scale);
+		config_raw.layout[layout_size_t.STATUS_H] = Math.floor(UIStatus.default_status_h * scale);
 		UIMenubar.menubarw = Math.floor(UIMenubar.default_menubar_w * scale);
 		UIBase.set_icon_scale();
 		zui_set_scale(UINodes.ui, scale);
@@ -685,7 +685,7 @@ plugin.drawUI = (ui) { =>
 		zui_set_scale(base_ui_menu, scale);
 		base_resize();
 		///if (is_paint || is_sculpt)
-		Config.raw.layout[layout_size_t.SIDEBAR_W] = Math.floor(UIBase.default_sidebar_w * scale);
+		config_raw.layout[layout_size_t.SIDEBAR_W] = Math.floor(UIBase.default_sidebar_w * scale);
 		UIToolbar.toolbar_w = Math.floor(UIToolbar.default_toolbar_w * scale);
 		///end
 	}

+ 23 - 23
base/Sources/BoxProjects.ts

@@ -42,16 +42,16 @@ class BoxProjects {
 			BoxProjects.draw_badge(ui);
 
 			if (zui_button(tr("New"))) {
-				Project.project_new();
-				Viewport.scale_to_bounds();
+				project_new();
+				viewport_scale_to_bounds();
 				UIBox.hide();
 				// Pick unique name
 				let i: i32 = 0;
 				let j: i32 = 0;
 				let title: string = tr("untitled") + i;
-				while (j < Config.raw.recent_projects.length) {
-					let base: string = Config.raw.recent_projects[j];
-					base = base.substring(base.lastIndexOf(Path.sep) + 1, base.lastIndexOf("."));
+				while (j < config_raw.recent_projects.length) {
+					let base: string = config_raw.recent_projects[j];
+					base = base.substring(base.lastIndexOf(path_sep) + 1, base.lastIndexOf("."));
 					j++;
 					if (title == base) {
 						i++;
@@ -66,7 +66,7 @@ class BoxProjects {
 
 			let slotw: i32 = Math.floor(150 * zui_SCALE(ui));
 			let num: i32 = Math.floor(sys_width() / slotw);
-			let recent_projects: string[] = Config.raw.recent_projects;
+			let recent_projects: string[] = config_raw.recent_projects;
 			let show_asset_names: bool = true;
 
 			for (let row: i32 = 0; row < Math.ceil(recent_projects.length / num); ++row) {
@@ -124,7 +124,7 @@ class BoxProjects {
 
 							///if (krom_android || krom_ios)
 							base_notify_on_next_frame(() => {
-								Console.toast(tr("Opening project"));
+								console_toast(tr("Opening project"));
 								base_notify_on_next_frame(doImport);
 							});
 							///else
@@ -132,16 +132,16 @@ class BoxProjects {
 							///end
 						}
 
-						let name: string = path.substring(path.lastIndexOf(Path.sep) + 1, path.lastIndexOf("."));
+						let name: string = path.substring(path.lastIndexOf(path_sep) + 1, path.lastIndexOf("."));
 						if (ui.is_hovered && ui.input_released_r) {
 							UIMenu.draw((ui: zui_t) => {
 								// if (UIMenu.menuButton(ui, tr("Duplicate"))) {}
 								if (UIMenu.menu_button(ui, tr("Delete"))) {
 									app_notify_on_init(() => {
-										File.delete(path);
-										File.delete(icon_path);
+										file_delete(path);
+										file_delete(icon_path);
 										let data_path: string = path.substr(0, path.length - 4);
-										File.delete(data_path);
+										file_delete(data_path);
 										recent_projects.splice(i, 1);
 									});
 								}
@@ -176,22 +176,22 @@ class BoxProjects {
 
 			BoxProjects.draw_badge(ui);
 
-			ui.enabled = Config.raw.recent_projects.length > 0;
+			ui.enabled = config_raw.recent_projects.length > 0;
 			BoxProjects.hsearch.text = zui_text_input(BoxProjects.hsearch, tr("Search"), zui_align_t.LEFT, true, true);
 			ui.enabled = true;
 
-			for (let path of Config.raw.recent_projects) {
+			for (let path of config_raw.recent_projects) {
 				let file: string = path;
 				///if krom_windows
 				file = string_replace_all(path, "/", "\\");
 				///else
 				file = string_replace_all(path, "\\", "/");
 				///end
-				file = file.substr(file.lastIndexOf(Path.sep) + 1);
+				file = file.substr(file.lastIndexOf(path_sep) + 1);
 
 				if (file.toLowerCase().indexOf(BoxProjects.hsearch.text.toLowerCase()) < 0) continue; // Search filter
 
-				if (zui_button(file, zui_align_t.LEFT) && File.exists(path)) {
+				if (zui_button(file, zui_align_t.LEFT) && file_exists(path)) {
 					let current: image_t = _g2_current;
 					if (current != null) g2_end();
 
@@ -203,16 +203,16 @@ class BoxProjects {
 				if (ui.is_hovered) zui_tooltip(path);
 			}
 
-			ui.enabled = Config.raw.recent_projects.length > 0;
+			ui.enabled = config_raw.recent_projects.length > 0;
 			if (zui_button(tr("Clear"), zui_align_t.LEFT)) {
-				Config.raw.recent_projects = [];
-				Config.save();
+				config_raw.recent_projects = [];
+				config_save();
 			}
 			ui.enabled = true;
 
 			zui_end_element();
-			if (zui_button(tr("New Project..."), zui_align_t.LEFT)) Project.project_new_box();
-			if (zui_button(tr("Open..."), zui_align_t.LEFT)) Project.project_open();
+			if (zui_button(tr("New .."), zui_align_t.LEFT)) project_new_box();
+			if (zui_button(tr("Open..."), zui_align_t.LEFT)) project_open();
 		}
 	}
 
@@ -225,13 +225,13 @@ class BoxProjects {
 	static get_started_tab = (ui: zui_t) => {
 		if (zui_tab(BoxProjects.htab, tr("Get Started"), true)) {
 			if (zui_button(tr("Manual"))) {
-				File.load_url(manifest_url + "/manual");
+				file_load_url(manifest_url + "/manual");
 			}
 			if (zui_button(tr("How To"))) {
-				File.load_url(manifest_url + "/howto");
+				file_load_url(manifest_url + "/howto");
 			}
 			if (zui_button(tr("What's New"))) {
-				File.load_url(manifest_url + "/notes");
+				file_load_url(manifest_url + "/notes");
 			}
 		}
 	}

+ 0 - 232
base/Sources/Camera.ts

@@ -1,232 +0,0 @@
-
-class Camera {
-
-	static origins: vec4_t[];
-	static views: mat4_t[];
-	static redraws: i32 = 0;
-	static dir: vec4_t = vec4_create();
-	static ease: f32 = 1.0;
-	static controls_down: bool = false;
-
-	constructor() {
-		Camera.reset();
-	}
-
-	static update = () => {
-		let camera: camera_object_t = scene_camera;
-
-		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.controls_down) {
-				if (mouse_view_x() < 0) {
-					mouse_x = mouse_last_x = app_x() + app_w();
-					krom_set_mouse_position(Math.floor(mouse_x), Math.floor(mouse_y));
-				}
-				else if (mouse_view_x() > app_w()) {
-					mouse_x = mouse_last_x = app_x();
-					krom_set_mouse_position(Math.floor(mouse_x), Math.floor(mouse_y));
-				}
-				else if (mouse_view_y() < 0) {
-					mouse_y = mouse_last_y = app_y() + app_h();
-					krom_set_mouse_position(Math.floor(mouse_x), Math.floor(mouse_y));
-				}
-				else if (mouse_view_y() > app_h()) {
-					mouse_y = mouse_last_y = app_y();
-					krom_set_mouse_position(Math.floor(mouse_x), Math.floor(mouse_y));
-				}
-			}
-			else {
-				return;
-			}
-		}
-
-		let modif_key: bool = keyboard_down("alt") || keyboard_down("shift") || keyboard_down("control");
-		let modif: bool = modif_key || Config.keymap.action_rotate == "middle";
-		let default_keymap: bool = Config.raw.keymap == "default.json";
-
-		if (Operator.shortcut(Config.keymap.action_rotate, ShortcutType.ShortcutStarted) ||
-			Operator.shortcut(Config.keymap.action_zoom, ShortcutType.ShortcutStarted) ||
-			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_wheel_delta != 0 && !modif_key)) {
-			Camera.controls_down = true;
-		}
-		else if (!Operator.shortcut(Config.keymap.action_rotate, ShortcutType.ShortcutDown) &&
-			!Operator.shortcut(Config.keymap.action_zoom, ShortcutType.ShortcutDown) &&
-			!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_wheel_delta == 0 && !modif_key)) {
-			Camera.controls_down = false;
-		}
-
-		if (_input_occupied || !base_ui_enabled || base_is_dragging || base_is_scrolling() || base_is_combo_selected() || !Camera.controls_down) {
-			return;
-		}
-
-		let controls: camera_controls_t = Context.raw.camera_controls;
-		if (controls == camera_controls_t.ORBIT && (Operator.shortcut(Config.keymap.action_rotate, ShortcutType.ShortcutDown) || (mouse_down("right") && !modif && default_keymap))) {
-			Camera.redraws = 2;
-			let dist: f32 = Camera.distance();
-			transform_move(camera.base.transform, camera_object_look_world(camera), dist);
-			transform_rotate(camera.base.transform, vec4_z_axis(), -mouse_movement_x / 100 * Config.raw.camera_rotation_speed);
-			transform_rotate(camera.base.transform, camera_object_right_world(camera), -mouse_movement_y / 100 * Config.raw.camera_rotation_speed);
-			if (camera_object_up_world(camera).z < 0) {
-				transform_rotate(camera.base.transform, camera_object_right_world(camera), mouse_movement_y / 100 * Config.raw.camera_rotation_speed);
-			}
-			transform_move(camera.base.transform, camera_object_look_world(camera), -dist);
-		}
-		else if (controls == camera_controls_t.ROTATE && (Operator.shortcut(Config.keymap.action_rotate, ShortcutType.ShortcutDown) || (mouse_down("right") && !modif && default_keymap))) {
-			Camera.redraws = 2;
-			let t: transform_t = Context.main_object().base.transform;
-			let up: vec4_t = vec4_normalize(transform_up(t));
-			transform_rotate(t, up, mouse_movement_x / 100 * Config.raw.camera_rotation_speed);
-			let right: vec4_t = vec4_normalize(camera_object_right_world(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);
-			}
-		}
-
-		if (controls == camera_controls_t.ROTATE || controls == camera_controls_t.ORBIT) {
-			Camera.pan_action(modif, default_keymap);
-
-			if (Operator.shortcut(Config.keymap.action_zoom, ShortcutType.ShortcutDown)) {
-				Camera.redraws = 2;
-				let f: f32 = Camera.get_zoom_delta() / 150;
-				f *= Camera.get_camera_zoom_speed();
-				transform_move(camera.base.transform, camera_object_look(camera), f);
-			}
-
-			if (mouse_wheel_delta != 0 && !modif_key) {
-				Camera.redraws = 2;
-				let f: f32 = mouse_wheel_delta * (-0.1);
-				f *= Camera.get_camera_zoom_speed();
-				transform_move(camera.base.transform, camera_object_look(camera), f);
-			}
-		}
-		else if (controls == camera_controls_t.FLY && mouse_down("right")) {
-			let move_forward: bool = keyboard_down("w") || keyboard_down("up") || mouse_wheel_delta < 0;
-			let move_backward: bool = keyboard_down("s") || keyboard_down("down") || mouse_wheel_delta > 0;
-			let strafe_left: bool = keyboard_down("a") || keyboard_down("left");
-			let strafe_right: bool = keyboard_down("d") || keyboard_down("right");
-			let strafe_up: bool = keyboard_down("e");
-			let strafe_down: bool = keyboard_down("q");
-			let fast: f32 = 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 (move_forward || move_backward || strafe_right || strafe_left || strafe_up || strafe_down) {
-				Camera.ease += time_delta() * 15;
-				if (Camera.ease > 1.0) Camera.ease = 1.0;
-				vec4_set(Camera.dir, 0, 0, 0);
-				if (move_forward) vec4_add_f(Camera.dir, camera_object_look(camera).x, camera_object_look(camera).y, camera_object_look(camera).z);
-				if (move_backward) vec4_add_f(Camera.dir, -camera_object_look(camera).x, -camera_object_look(camera).y, -camera_object_look(camera).z);
-				if (strafe_right) vec4_add_f(Camera.dir, camera_object_right(camera).x, camera_object_right(camera).y, camera_object_right(camera).z);
-				if (strafe_left) vec4_add_f(Camera.dir, -camera_object_right(camera).x, -camera_object_right(camera).y, -camera_object_right(camera).z);
-				if (strafe_up) vec4_add_f(Camera.dir, 0, 0, 1);
-				if (strafe_down) vec4_add_f(Camera.dir, 0, 0, -1);
-			}
-			else {
-				Camera.ease -= time_delta() * 20.0 * Camera.ease;
-				if (Camera.ease < 0.0) Camera.ease = 0.0;
-			}
-
-
-			let d: f32 = time_delta() * fast * Camera.ease * 2.0 * ((move_forward || move_backward) ? Config.raw.camera_zoom_speed : Config.raw.camera_pan_speed);
-			if (d > 0.0) {
-				transform_move(camera.base.transform, Camera.dir, d);
-				if (Context.raw.camera_type == camera_type_t.ORTHOGRAPHIC) {
-					Viewport.update_camera_type(Context.raw.camera_type);
-				}
-			}
-
-			Camera.redraws = 2;
-			transform_rotate(camera.base.transform, vec4_z_axis(), -mouse_movement_x / 200 * Config.raw.camera_rotation_speed);
-			transform_rotate(camera.base.transform, camera_object_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: light_object_t = scene_lights[0];
-			Context.raw.light_angle = (Context.raw.light_angle + ((mouse_movement_x / 100) % (2 * Math.PI) + 2 * Math.PI)) % (2 * Math.PI);
-			let m: mat4_t = 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.envmap_angle -= mouse_movement_x / 100;
-		}
-
-		if (Camera.redraws > 0) {
-			Camera.redraws--;
-			Context.raw.ddirty = 2;
-
-			if (Context.raw.camera_type == camera_type_t.ORTHOGRAPHIC) {
-				Viewport.update_camera_type(Context.raw.camera_type);
-			}
-		}
-	}
-
-	static distance = (): f32 => {
-		let camera: camera_object_t = scene_camera;
-		return vec4_dist(Camera.origins[Camera.index()], camera.base.transform.loc);
-	}
-
-	static index = (): i32 => {
-		return Context.raw.view_index_last > 0 ? 1 : 0;
-	}
-
-	static get_camera_zoom_speed = (): f32 => {
-		let sign: i32 = Config.raw.zoom_direction == zoom_direction_t.VERTICAL_INVERTED ||
-						Config.raw.zoom_direction == zoom_direction_t.HORIZONTAL_INVERTED ||
-				   		Config.raw.zoom_direction == zoom_direction_t.VERTICAL_HORIZONTAL_INVERTED ? -1 : 1;
-		return Config.raw.camera_zoom_speed * sign;
-	}
-
-	static reset = (viewIndex: i32 = -1) => {
-		let camera: camera_object_t = 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)];
-		}
-		else {
-			Camera.origins[viewIndex] = vec4_create(0, 0, 0);
-			Camera.views[viewIndex] = mat4_clone(camera.base.transform.local);
-		}
-	}
-
-	static pan_action = (modif: bool, defaultKeymap: bool) => {
-		let camera: camera_object_t = scene_camera;
-		if (Operator.shortcut(Config.keymap.action_pan, ShortcutType.ShortcutDown) || (mouse_down("middle") && !modif && defaultKeymap)) {
-			Camera.redraws = 2;
-			let look: vec4_t = vec4_mult(vec4_normalize(transform_look(camera.base.transform)), mouse_movement_y / 150 * Config.raw.camera_pan_speed);
-			let right: vec4_t = 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);
-			camera_object_build_mat(camera);
-		}
-	}
-
-	static get_zoom_delta = (): f32 => {
-		return Config.raw.zoom_direction == zoom_direction_t.VERTICAL ? -mouse_movement_y :
-			   Config.raw.zoom_direction == zoom_direction_t.VERTICAL_INVERTED ? -mouse_movement_y :
-			   Config.raw.zoom_direction == zoom_direction_t.HORIZONTAL ? mouse_movement_x :
-			   Config.raw.zoom_direction == zoom_direction_t.HORIZONTAL_INVERTED ? mouse_movement_x :
-			   -(mouse_movement_y - mouse_movement_x);
-	}
-}

+ 0 - 304
base/Sources/Config.ts

@@ -1,304 +0,0 @@
-
-class Config {
-
-	static raw: config_t = null;
-	static keymap: any;
-	static config_loaded: bool = false;
-	static button_align: zui_align_t = zui_align_t.LEFT;
-	static default_button_spacing: string = "       ";
-	static button_spacing: string = Config.default_button_spacing;
-
-	static load = (done: ()=>void) => {
-		try {
-			let blob: ArrayBuffer = data_get_blob((Path.is_protected() ? krom_save_path() : "") + "config.json");
-			Config.config_loaded = true;
-			Config.raw = JSON.parse(sys_buffer_to_string(blob));
-			done();
-		}
-		catch (e: any) {
-			///if krom_linux
-			try { // Protected directory
-				let blob: ArrayBuffer = data_get_blob(krom_save_path() + "config.json");
-				Config.config_loaded = true;
-				Config.raw = JSON.parse(sys_buffer_to_string(blob));
-				done();
-			}
-			catch (e: any) {
-				krom_log(e);
-				done();
-			}
-			///else
-			done();
-			///end
-		}
-	}
-
-	static save = () => {
-		// Use system application data folder
-		// when running from protected path like "Program Files"
-		let path: string = (Path.is_protected() ? krom_save_path() : Path.data() + Path.sep) + "config.json";
-		let buffer: buffer_t = sys_string_to_buffer(JSON.stringify(Config.raw));
-		krom_file_save_bytes(path, buffer);
-
-		///if krom_linux // Protected directory
-		if (!File.exists(path)) krom_file_save_bytes(krom_save_path() + "config.json", buffer);
-		///end
-	}
-
-	static init = () => {
-		if (!Config.config_loaded || Config.raw == null) {
-			Config.raw = {};
-			Config.raw.locale = "system";
-			Config.raw.window_mode = 0;
-			Config.raw.window_resizable = true;
-			Config.raw.window_minimizable = true;
-			Config.raw.window_maximizable = true;
-			Config.raw.window_w = 1600;
-			Config.raw.window_h = 900;
-			///if krom_darwin
-			Config.raw.window_w *= 2;
-			Config.raw.window_h *= 2;
-			///end
-			Config.raw.window_x = -1;
-			Config.raw.window_y = -1;
-			Config.raw.window_scale = 1.0;
-			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 = sys_display_frequency();
-			Config.raw.rp_bloom = false;
-			Config.raw.rp_gi = false;
-			Config.raw.rp_vignette = 0.2;
-			Config.raw.rp_grain = 0.09;
-			Config.raw.rp_motionblur = false;
-			///if (krom_android || krom_ios)
-			Config.raw.rp_ssao = false;
-			///else
-			Config.raw.rp_ssao = true;
-			///end
-			Config.raw.rp_ssr = false;
-			Config.raw.rp_supersample = 1.0;
-			Config.raw.version = manifest_version;
-			Config.raw.sha = Config.get_sha();
-			base_init_config();
-		}
-		else {
-			// Upgrade config format created by older ArmorPaint build
-			// if (Config.raw.version != manifest_version) {
-			// 	Config.raw.version = manifest_version;
-			// 	save();
-			// }
-			if (Config.raw.sha != Config.get_sha()) {
-				Config.config_loaded = false;
-				Config.init();
-				return;
-			}
-		}
-
-		zui_set_touch_scroll(Config.raw.touch_ui);
-		zui_set_touch_hold(Config.raw.touch_ui);
-		zui_set_touch_tooltip(Config.raw.touch_ui);
-		base_res_handle.position = Config.raw.layer_res;
-		Config.load_keymap();
-	}
-
-	static get_sha = (): string => {
-		let sha: string = "";
-		let blob: ArrayBuffer = data_get_blob("version.json");
-		sha = JSON.parse(sys_buffer_to_string(blob)).sha;
-		return sha;
-	}
-
-	static get_date = (): string => {
-		let date: string = "";
-		let blob: ArrayBuffer = data_get_blob("version.json");
-		date = JSON.parse(sys_buffer_to_string(blob)).date;
-		return date;
-	}
-
-	static get_options = (): kinc_sys_ops_t => {
-		let window_mode: window_mode_t = Config.raw.window_mode == 0 ? window_mode_t.WINDOWED : window_mode_t.FULLSCREEN;
-		let window_features: window_features_t = window_features_t.NONE;
-		if (Config.raw.window_resizable) window_features |= window_features_t.RESIZABLE;
-		if (Config.raw.window_maximizable) window_features |= window_features_t.MAXIMIZABLE;
-		if (Config.raw.window_minimizable) window_features |= window_features_t.MINIMIZABLE;
-		let title: string = "untitled - " + manifest_title;
-		return {
-			title: title,
-			width: Config.raw.window_w,
-			height: Config.raw.window_h,
-			x: Config.raw.window_x,
-			y: Config.raw.window_y,
-			mode: window_mode,
-			features: window_features,
-			vsync: Config.raw.window_vsync,
-			frequency: Config.raw.window_frequency
-		};
-	}
-
-	static restore = () => {
-		zui_children = new Map(); // Reset ui handles
-		Config.config_loaded = false;
-		let _layout: i32[] = Config.raw.layout;
-		Config.init();
-		Config.raw.layout = _layout;
-		base_init_layout();
-		Translator.load_translations(Config.raw.locale);
-		Config.apply_config();
-		Config.load_theme(Config.raw.theme);
-	}
-
-	static import_from = (from: config_t) => {
-		let _sha: string = Config.raw.sha;
-		let _version: string = Config.raw.version;
-		Config.raw = from;
-		Config.raw.sha = _sha;
-		Config.raw.version = _version;
-		zui_children = new Map(); // Reset ui handles
-		Config.load_keymap();
-		base_init_layout();
-		Translator.load_translations(Config.raw.locale);
-		Config.apply_config();
-		Config.load_theme(Config.raw.theme);
-	}
-
-	static apply_config = () => {
-		Config.raw.rp_ssao = Context.raw.hssao.selected;
-		Config.raw.rp_ssr = Context.raw.hssr.selected;
-		Config.raw.rp_bloom = Context.raw.hbloom.selected;
-		Config.raw.rp_gi = Context.raw.hvxao.selected;
-		Config.raw.rp_supersample = Config.get_super_sample_size(Context.raw.hsupersample.position);
-		Config.save();
-		Context.raw.ddirty = 2;
-
-		let current: image_t = _g2_current;
-		if (current != null) g2_end();
-		RenderPathBase.apply_config();
-		if (current != null) g2_begin(current);
-	}
-
-	static load_keymap = () => {
-		if (Config.raw.keymap == "default.json") { // Built-in default
-			Config.keymap = base_default_keymap;
-		}
-		else {
-			let blob: ArrayBuffer = data_get_blob("keymap_presets/" + Config.raw.keymap);
-			Config.keymap = JSON.parse(sys_buffer_to_string(blob));
-			// Fill in undefined keys with defaults
-			for (let field in base_default_keymap) {
-				if (!(field in Config.keymap)) {
-					let adefault_keymap: any = base_default_keymap;
-					Config.keymap[field] = adefault_keymap[field];
-				}
-			}
-		}
-	}
-
-	static save_keymap = () => {
-		if (Config.raw.keymap == "default.json") return;
-		let path: string = data_path() + "keymap_presets/" + Config.raw.keymap;
-		let buffer: buffer_t = sys_string_to_buffer(JSON.stringify(Config.keymap));
-		krom_file_save_bytes(path, buffer);
-	}
-
-	static get_super_sample_quality = (f: f32): i32 => {
-		return f == 0.25 ? 0 :
-			   f == 0.5 ? 1 :
-			   f == 1.0 ? 2 :
-			   f == 1.5 ? 3 :
-			   f == 2.0 ? 4 : 5;
-	}
-
-	static get_super_sample_size = (i: i32): f32 => {
-		return i == 0 ? 0.25 :
-			   i == 1 ? 0.5 :
-			   i == 2 ? 1.0 :
-			   i == 3 ? 1.5 :
-			   i == 4 ? 2.0 : 4.0;
-	}
-
-	static get_texture_res = (): i32 => {
-		let res: i32 = base_res_handle.position;
-		return res == texture_res_t.RES128 ? 128 :
-			   res == texture_res_t.RES256 ? 256 :
-			   res == texture_res_t.RES512 ? 512 :
-			   res == texture_res_t.RES1024 ? 1024 :
-			   res == texture_res_t.RES2048 ? 2048 :
-			   res == texture_res_t.RES4096 ? 4096 :
-			   res == texture_res_t.RES8192 ? 8192 :
-			   res == texture_res_t.RES16384 ? 16384 : 0;
-	}
-
-	static get_texture_res_x = (): i32 => {
-		return Context.raw.project_aspect_ratio == 2 ? Math.floor(Config.get_texture_res() / 2) : Config.get_texture_res();
-	}
-
-	static get_texture_res_y = (): i32 => {
-		return Context.raw.project_aspect_ratio == 1 ? Math.floor(Config.get_texture_res() / 2) : Config.get_texture_res();
-	}
-
-	static get_texture_res_pos = (i: i32): i32 => {
-		return i == 128 ? texture_res_t.RES128 :
-			   i == 256 ? texture_res_t.RES256 :
-			   i == 512 ? texture_res_t.RES512 :
-			   i == 1024 ? texture_res_t.RES1024 :
-			   i == 2048 ? texture_res_t.RES2048 :
-			   i == 4096 ? texture_res_t.RES4096 :
-			   i == 8192 ? texture_res_t.RES8192 :
-			   i == 16384 ? texture_res_t.RES16384 : 0;
-	}
-
-	static load_theme = (theme: string, tagRedraw: bool = true) => {
-		if (theme == "default.json") { // Built-in default
-			base_theme = zui_theme_create();
-		}
-		else {
-			let b: ArrayBuffer = data_get_blob("themes/" + theme);
-			let parsed: any = JSON.parse(sys_buffer_to_string(b));
-			base_theme = zui_theme_create();
-			for (let key in base_theme) {
-				if (key == "theme_") continue;
-				if (key.startsWith("set_")) continue;
-				if (key.startsWith("get_")) key = key.substr(4);
-				let atheme: any = base_theme;
-				atheme[key] = parsed[key];
-			}
-		}
-		base_theme.FILL_WINDOW_BG = true;
-		if (tagRedraw) {
-			for (let ui of base_get_uis()) ui.t = base_theme;
-			UIBase.tag_ui_redraw();
-		}
-		if (Config.raw.touch_ui) {
-			// Enlarge elements
-			base_theme.FULL_TABS = true;
-			base_theme.ELEMENT_H = 24 + 6;
-			base_theme.BUTTON_H = 22 + 6;
-			base_theme.FONT_SIZE = 13 + 2;
-			base_theme.ARROW_SIZE = 5 + 2;
-			base_theme.CHECK_SIZE = 15 + 4;
-			base_theme.CHECK_SELECT_SIZE = 8 + 2;
-			Config.button_align = zui_align_t.LEFT;
-			Config.button_spacing = "";
-		}
-		else {
-			base_theme.FULL_TABS = false;
-			Config.button_align = zui_align_t.LEFT;
-			Config.button_spacing = Config.default_button_spacing;
-		}
-	}
-
-	static enable_plugin = (f: string) => {
-		Config.raw.plugins.push(f);
-		Plugin.start(f);
-	}
-
-	static disable_plugin = (f: string) => {
-		array_remove(Config.raw.plugins, f);
-		Plugin.stop(f);
-	}
-}

+ 0 - 76
base/Sources/Console.ts

@@ -1,76 +0,0 @@
-
-class Console {
-
-	static message: string = "";
-	static message_timer: f32 = 0.0;
-	static message_color: i32 = 0x00000000;
-	static last_traces: string[] = [""];
-	static progress_text: string = null;
-
-	static draw_toast = (s: string) => {
-		g2_set_color(0x55000000);
-		g2_fill_rect(0, 0, sys_width(), sys_height());
-		let scale: f32 = zui_SCALE(base_get_uis()[0]);
-		let x: f32 = sys_width() / 2;
-		let y: f32 = sys_height() - 200 * scale;
-		g2_fill_rect(x - 200 * scale, y, 400 * scale, 80 * scale);
-		g2_set_font(base_font);
-		g2_set_font_size(Math.floor(22 * scale));
-		g2_set_color(0xffffffff);
-		g2_draw_string(s, x - g2_font_width(_g2_font, _g2_font_size, s) / 2, y + 40 * scale - g2_font_height(_g2_font, _g2_font_size) / 2);
-	}
-
-	static toast = (s: string) => {
-		// Show a popup message
-		let _render = () => {
-			Console.draw_toast(s);
-			base_notify_on_next_frame(() => {
-				app_remove_render_2d(_render);
-			});
-		}
-		app_notify_on_render_2d(_render);
-		Console.console_trace(s);
-	}
-
-	static draw_progress = () => {
-		Console.draw_toast(Console.progress_text);
-	}
-
-	static progress = (s: string) => {
-		// Keep popup message displayed until s == null
-		if (s == null) {
-			app_remove_render_2d(Console.draw_progress);
-		}
-		else if (Console.progress_text == null) {
-			app_notify_on_render_2d(Console.draw_progress);
-		}
-		if (s != null) Console.console_trace(s);
-		Console.progress_text = s;
-	}
-
-	static info = (s: string) => {
-		Console.message_timer = 5.0;
-		Console.message = s;
-		Console.message_color = 0x00000000;
-		base_redraw_status();
-		Console.console_trace(s);
-	}
-
-	static error = (s: string) => {
-		Console.message_timer = 8.0;
-		Console.message = s;
-		Console.message_color = 0xffaa0000;
-		base_redraw_status();
-		Console.console_trace(s);
-	}
-
-	static log = (s: string) => {
-		Console.console_trace(s);
-	}
-
-	static console_trace = (v: any) => {
-		base_redraw_console();
-		Console.last_traces.unshift(String(v));
-		if (Console.last_traces.length > 100) Console.last_traces.pop();
-	}
-}

+ 0 - 434
base/Sources/Context.ts

@@ -1,434 +0,0 @@
-/// <reference path='./ContextFormat.ts'/>
-
-class Context {
-
-	static raw: TContext = new TContext(); //{};
-
-	static use_deferred = (): bool => {
-		///if is_paint
-		return Context.raw.render_mode != render_mode_t.FORWARD && (Context.raw.viewport_mode == viewport_mode_t.LIT || Context.raw.viewport_mode == viewport_mode_t.PATH_TRACE) && Context.raw.tool != workspace_tool_t.COLORID;
-		///end
-
-		///if (is_sculpt || is_lab)
-		return Context.raw.render_mode != render_mode_t.FORWARD && (Context.raw.viewport_mode == viewport_mode_t.LIT || Context.raw.viewport_mode == viewport_mode_t.PATH_TRACE);
-		///end
-	}
-
-	///if (is_paint || is_sculpt)
-	static select_material = (i: i32) => {
-		if (Project.materials.length <= i) return;
-		Context.set_material(Project.materials[i]);
-	}
-
-	static set_material = (m: SlotMaterialRaw) => {
-		if (Project.materials.indexOf(m) == -1) return;
-		Context.raw.material = m;
-		MakeMaterial.parse_paint_material();
-		UIBase.hwnds[tab_area_t.SIDEBAR1].redraws = 2;
-		UIHeader.header_handle.redraws = 2;
-		UINodes.hwnd.redraws = 2;
-		UINodes.group_stack = [];
-
-		let decal: bool = Context.raw.tool == workspace_tool_t.DECAL || Context.raw.tool == workspace_tool_t.TEXT;
-		if (decal) {
-			let _next = () => {
-				UtilRender.make_decal_preview();
-			}
-			base_notify_on_next_frame(_next);
-		}
-	}
-
-	static select_brush = (i: i32) => {
-		if (Project.brushes.length <= i) return;
-		Context.set_brush(Project.brushes[i]);
-	}
-
-	static set_brush = (b: SlotBrushRaw) => {
-		if (Project.brushes.indexOf(b) == -1) return;
-		Context.raw.brush = b;
-		MakeMaterial.parse_brush();
-		UIBase.hwnds[tab_area_t.SIDEBAR1].redraws = 2;
-		UINodes.hwnd.redraws = 2;
-	}
-
-	static select_font = (i: i32) => {
-		if (Project.fonts.length <= i) return;
-		Context.set_font(Project.fonts[i]);
-	}
-
-	static set_font = (f: SlotFontRaw) => {
-		if (Project.fonts.indexOf(f) == -1) return;
-		Context.raw.font = f;
-		UtilRender.make_text_preview();
-		UtilRender.make_decal_preview();
-		UIBase.hwnds[tab_area_t.STATUS].redraws = 2;
-		UIView2D.hwnd.redraws = 2;
-	}
-
-	static select_layer = (i: i32) => {
-		if (Project.layers.length <= i) return;
-		Context.set_layer(Project.layers[i]);
-	}
-
-	static set_layer = (l: SlotLayerRaw) => {
-		if (l == Context.raw.layer) return;
-		Context.raw.layer = l;
-		UIHeader.header_handle.redraws = 2;
-
-		let current: image_t = _g2_current;
-		if (current != null) g2_end();
-
-		base_set_object_mask();
-		MakeMaterial.parse_mesh_material();
-		MakeMaterial.parse_paint_material();
-
-		if (current != null) g2_begin(current);
-
-		UIBase.hwnds[tab_area_t.SIDEBAR0].redraws = 2;
-		UIView2D.hwnd.redraws = 2;
-	}
-	///end
-
-	static select_tool = (i: i32) => {
-		Context.raw.tool = i;
-		MakeMaterial.parse_paint_material();
-		MakeMaterial.parse_mesh_material();
-		Context.raw.ddirty = 3;
-		let _viewport_mode: viewport_mode_t = Context.raw.viewport_mode;
-		Context.raw.viewport_mode = -1 as viewport_mode_t;
-		Context.set_viewport_mode(_viewport_mode);
-
-		///if (is_paint || is_sculpt)
-		Context.init_tool();
-		UIHeader.header_handle.redraws = 2;
-		UIToolbar.toolbar_handle.redraws = 2;
-		///end
-	}
-
-	///if (is_paint || is_sculpt)
-	static init_tool = () => {
-		let decal: bool = Context.raw.tool == workspace_tool_t.DECAL || Context.raw.tool == workspace_tool_t.TEXT;
-		if (decal) {
-			if (Context.raw.tool == workspace_tool_t.TEXT) {
-				UtilRender.make_text_preview();
-			}
-			UtilRender.make_decal_preview();
-		}
-
-		else if (Context.raw.tool == workspace_tool_t.PARTICLE) {
-			UtilParticle.init_particle();
-			MakeMaterial.parse_particle_material();
-		}
-
-		else if (Context.raw.tool == workspace_tool_t.BAKE) {
-			///if (krom_direct3d12 || krom_vulkan || krom_metal)
-			// Bake in lit mode for now
-			if (Context.raw.viewport_mode == viewport_mode_t.PATH_TRACE) {
-				Context.raw.viewport_mode = viewport_mode_t.LIT;
-			}
-			///end
-		}
-
-		else if (Context.raw.tool == workspace_tool_t.MATERIAL) {
-			base_update_fill_layers();
-			Context.main_object().skip_context = null;
-		}
-
-		///if krom_ios
-		// No hover on iPad, decals are painted by pen release
-		Config.raw.brush_live = decal;
-		///end
-	}
-	///end
-
-	static select_paint_object = (o: mesh_object_t) => {
-		///if (is_paint || is_sculpt)
-		UIHeader.header_handle.redraws = 2;
-		for (let p of Project.paint_objects) p.skip_context = "paint";
-		Context.raw.paint_object = o;
-
-		let mask: i32 = SlotLayer.get_object_mask(Context.raw.layer);
-		if (Context.layer_filter_used()) mask = Context.raw.layer_filter;
-
-		if (Context.raw.merged_object == null || mask > 0) {
-			Context.raw.paint_object.skip_context = "";
-		}
-		UtilUV.uvmap_cached = false;
-		UtilUV.trianglemap_cached = false;
-		UtilUV.dilatemap_cached = false;
-		///end
-
-		///if is_lab
-		Context.raw.paint_object = o;
-		///end
-	}
-
-	static main_object = (): mesh_object_t => {
-		///if (is_paint || is_sculpt)
-		for (let po of Project.paint_objects) if (po.base.children.length > 0) return po;
-		return Project.paint_objects[0];
-		///end
-
-		///if is_lab
-		return Project.paint_objects[0];
-		///end
-	}
-
-	static layer_filter_used = (): bool => {
-		///if (is_paint || is_sculpt)
-		return Context.raw.layer_filter > 0 && Context.raw.layer_filter <= Project.paint_objects.length;
-		///end
-
-		///if is_lab
-		return true;
-		///end
-	}
-
-	static object_mask_used = (): bool => {
-		///if (is_paint || is_sculpt)
-		return SlotLayer.get_object_mask(Context.raw.layer) > 0 && SlotLayer.get_object_mask(Context.raw.layer) <= Project.paint_objects.length;
-		///end
-
-		///if is_lab
-		return false;
-		///end
-	}
-
-	static in_viewport = (): bool => {
-		return Context.raw.paint_vec.x < 1 && Context.raw.paint_vec.x > 0 &&
-			   Context.raw.paint_vec.y < 1 && Context.raw.paint_vec.y > 0;
-	}
-
-	static in_paint_area = (): bool => {
-		///if (is_paint || is_sculpt)
-		let right: i32 = app_w();
-		if (UIView2D.show) right += UIView2D.ww;
-		return mouse_view_x() > 0 && mouse_view_x() < right &&
-			   mouse_view_y() > 0 && mouse_view_y() < app_h();
-		///end
-
-		///if is_lab
-		return Context.in_viewport();
-		///end
-	}
-
-	static in_layers = (): bool => {
-		return zui_get_hovered_tab_name() == tr("Layers");
-	}
-
-	static in_materials = (): bool => {
-		return zui_get_hovered_tab_name() == tr("Materials");
-	}
-
-	///if (is_paint || is_sculpt)
-	static in_2d_view = (type: view_2d_type_t = view_2d_type_t.LAYER): 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;
-	}
-	///end
-
-	static in_nodes = (): bool => {
-		return UINodes.show &&
-			   mouse_x > UINodes.wx && mouse_x < UINodes.wx + UINodes.ww &&
-			   mouse_y > UINodes.wy && mouse_y < UINodes.wy + UINodes.wh;
-	}
-
-	static in_swatches = (): bool => {
-		return zui_get_hovered_tab_name() == tr("Swatches");
-	}
-
-	static in_browser = (): bool => {
-		return zui_get_hovered_tab_name() == tr("Browser");
-	}
-
-	static get_area_type = (): area_type_t => {
-		if (Context.in_viewport()) return area_type_t.VIEWPORT;
-		if (Context.in_nodes()) return area_type_t.NODES;
-		if (Context.in_browser()) return area_type_t.BROWSER;
-		///if (is_paint || is_sculpt)
-		if (Context.in_2d_view()) return area_type_t.VIEW2D;
-		if (Context.in_layers()) return area_type_t.LAYERS;
-		if (Context.in_materials()) return area_type_t.MATERIALS;
-		///end
-		return -1 as area_type_t;
-	}
-
-	static set_viewport_mode = (mode: viewport_mode_t) => {
-		if (mode == Context.raw.viewport_mode) return;
-
-		Context.raw.viewport_mode = mode;
-		if (Context.use_deferred()) {
-			render_path_commands = RenderPathDeferred.commands;
-		}
-		else {
-			render_path_commands = RenderPathForward.commands;
-		}
-		let _workspace: i32 = UIHeader.worktab.position;
-		UIHeader.worktab.position = 0;
-		MakeMaterial.parse_mesh_material();
-		UIHeader.worktab.position = _workspace;
-	}
-
-	static load_envmap = () => {
-		if (!Context.raw.envmap_loaded) {
-			// TODO: Unable to share texture for both radiance and envmap - reload image
-			Context.raw.envmap_loaded = true;
-			data_cached_images.delete("World_radiance.k");
-		}
-		world_data_load_envmap(scene_world, (_) => {});
-		if (Context.raw.saved_envmap == null) Context.raw.saved_envmap = scene_world._.envmap;
-	}
-
-	static update_envmap = () => {
-		if (Context.raw.show_envmap) {
-			scene_world._.envmap = Context.raw.show_envmap_blur ? scene_world._.radiance_mipmaps[0] : Context.raw.saved_envmap;
-		}
-		else {
-			scene_world._.envmap = Context.raw.empty_envmap;
-		}
-	}
-
-	static set_viewport_shader = (viewportShader: (ns: NodeShaderRaw)=>string) => {
-		Context.raw.viewport_shader = viewportShader;
-		Context.set_render_path();
-	}
-
-	static set_render_path = () => {
-		if (Context.raw.render_mode == render_mode_t.FORWARD || Context.raw.viewport_shader != null) {
-			render_path_commands = RenderPathForward.commands;
-		}
-		else {
-			render_path_commands = RenderPathDeferred.commands;
-		}
-		app_notify_on_init(() => {
-			MakeMaterial.parse_mesh_material();
-		});
-	}
-
-	static enable_import_plugin = (file: string): bool => {
-		// Return plugin name suitable for importing the specified file
-		if (BoxPreferences.files_plugin == null) {
-			BoxPreferences.fetch_plugins();
-		}
-		let ext: string = file.substr(file.lastIndexOf(".") + 1);
-		for (let f of BoxPreferences.files_plugin) {
-			if (f.startsWith("import_") && f.indexOf(ext) >= 0) {
-				Config.enable_plugin(f);
-				Console.info(f + " " + tr("plugin enabled"));
-				return true;
-			}
-		}
-		return false;
-	}
-
-	static set_swatch = (s: swatch_color_t) => {
-		Context.raw.swatch = s;
-	}
-
-	///if is_lab
-	static run_brush = (from: i32) => {
-		let left: f32 = 0.0;
-		let right: f32 = 1.0;
-
-		// First time init
-		if (Context.raw.last_paint_x < 0 || Context.raw.last_paint_y < 0) {
-			Context.raw.last_paint_vec_x = Context.raw.paint_vec.x;
-			Context.raw.last_paint_vec_y = Context.raw.paint_vec.y;
-		}
-
-		let nodes: zui_nodes_t = UINodes.get_nodes();
-		let canvas: zui_node_canvas_t = UINodes.get_canvas(true);
-		let inpaint: bool = nodes.nodes_selected_id.length > 0 && zui_get_node(canvas.nodes, nodes.nodes_selected_id[0]).type == "InpaintNode";
-
-		// Paint bounds
-		if (inpaint &&
-			Context.raw.paint_vec.x > left &&
-			Context.raw.paint_vec.x < right &&
-			Context.raw.paint_vec.y > 0 &&
-			Context.raw.paint_vec.y < 1 &&
-			!base_is_dragging &&
-			!base_is_resizing &&
-			!base_is_scrolling() &&
-			!base_is_combo_selected()) {
-
-			let down: bool = mouse_down() || pen_down();
-
-			// Prevent painting the same spot
-			let same_spot: bool = Context.raw.paint_vec.x == Context.raw.last_paint_x && Context.raw.paint_vec.y == Context.raw.last_paint_y;
-			if (down && same_spot) {
-				Context.raw.painted++;
-			}
-			else {
-				Context.raw.painted = 0;
-			}
-			Context.raw.last_paint_x = Context.raw.paint_vec.x;
-			Context.raw.last_paint_y = Context.raw.paint_vec.y;
-
-			if (Context.raw.painted == 0) {
-				Context.parse_brush_inputs();
-			}
-
-			if (Context.raw.painted <= 1) {
-				Context.raw.pdirty = 1;
-				Context.raw.rdirty = 2;
-			}
-		}
-	}
-
-	static parse_brush_inputs = () => {
-		if (!Context.raw.registered) {
-			Context.raw.registered = true;
-			app_notify_on_update(Context.update);
-		}
-
-		Context.raw.paint_vec = Context.raw.coords;
-	}
-
-	static update = () => {
-		let paint_x: f32 = mouse_view_x() / app_w();
-		let paint_y: f32 = mouse_view_y() / app_h();
-		if (mouse_started()) {
-			Context.raw.start_x = mouse_view_x() / app_w();
-			Context.raw.start_y = mouse_view_y() / app_h();
-		}
-
-		if (pen_down()) {
-			paint_x = pen_view_x() / app_w();
-			paint_y = pen_view_y() / app_h();
-		}
-		if (pen_started()) {
-			Context.raw.start_x = pen_view_x() / app_w();
-			Context.raw.start_y = pen_view_y() / app_h();
-		}
-
-		if (Operator.shortcut(Config.keymap.brush_ruler + "+" + Config.keymap.action_paint, ShortcutType.ShortcutDown)) {
-			if (Context.raw.lock_x) paint_x = Context.raw.start_x;
-			if (Context.raw.lock_y) paint_y = Context.raw.start_y;
-		}
-
-		Context.raw.coords.x = paint_x;
-		Context.raw.coords.y = paint_y;
-
-		if (Context.raw.lock_begin) {
-			let dx: i32 = Math.abs(Context.raw.lock_start_x - mouse_view_x());
-			let dy: i32 = Math.abs(Context.raw.lock_start_y - mouse_view_y());
-			if (dx > 1 || dy > 1) {
-				Context.raw.lock_begin = false;
-				dx > dy ? Context.raw.lock_y = true : Context.raw.lock_x = true;
-			}
-		}
-
-		if (keyboard_started(Config.keymap.brush_ruler)) {
-			Context.raw.lock_start_x = mouse_view_x();
-			Context.raw.lock_start_y = mouse_view_y();
-			Context.raw.lock_begin = true;
-		}
-		else if (keyboard_released(Config.keymap.brush_ruler)) {
-			Context.raw.lock_x = Context.raw.lock_y = Context.raw.lock_begin = false;
-		}
-
-		Context.parse_brush_inputs();
-	}
-	///end
-}

+ 5 - 5
base/Sources/ContextFormat.ts

@@ -1,8 +1,8 @@
-/// <reference path='./Project.ts'/>
-/// <reference path='./Enums.ts'/>
+/// <reference path='./project.ts'/>
+/// <reference path='./enums.ts'/>
 
-// type TContext = {
-class TContext {
+// type context_t = {
+class context_t {
 
 	texture?: asset_t = null;
 	paint_object?: mesh_object_t;
@@ -20,7 +20,7 @@ class TContext {
 	view_index_last?: i32 = -1;
 
 	swatch?: swatch_color_t;
-	picked_color?: swatch_color_t = Project.make_swatch();
+	picked_color?: swatch_color_t = make_swatch();
 	color_picker_callback?: (sc: swatch_color_t)=>void = null;
 
 	default_irradiance?: Float32Array = null;

+ 53 - 53
base/Sources/ExportArm.ts

@@ -13,25 +13,25 @@ class ExportArm {
 	static run_project = () => {
 		///if (is_paint || is_sculpt)
 		let mnodes: zui_node_canvas_t[] = [];
-		for (let m of Project.materials) {
+		for (let m of project_materials) {
 			let c: zui_node_canvas_t = JSON.parse(JSON.stringify(m.canvas));
 			for (let n of c.nodes) ExportArm.export_node(n);
 			mnodes.push(c);
 		}
 
 		let bnodes: zui_node_canvas_t[] = [];
-		for (let b of Project.brushes) bnodes.push(b.canvas);
+		for (let b of project_brushes) bnodes.push(b.canvas);
 		///end
 
 		///if is_lab
-		let c: zui_node_canvas_t = JSON.parse(JSON.stringify(Project.canvas));
+		let c: zui_node_canvas_t = JSON.parse(JSON.stringify(project_canvas));
 		for (let n of c.nodes) ExportArm.export_node(n);
 		///end
 
 		let mgroups: zui_node_canvas_t[] = null;
-		if (Project.material_groups.length > 0) {
+		if (project_material_groups.length > 0) {
 			mgroups = [];
-			for (let g of Project.material_groups) {
+			for (let g of project_material_groups) {
 				let c: zui_node_canvas_t = JSON.parse(JSON.stringify(g.canvas));
 				for (let n of c.nodes) ExportArm.export_node(n);
 				mgroups.push(c);
@@ -40,27 +40,27 @@ class ExportArm {
 
 		///if (is_paint || is_sculpt)
 		let md: mesh_data_t[] = [];
-		for (let p of Project.paint_objects) md.push(p.data);
+		for (let p of project_paint_objects) md.push(p.data);
 		///end
 
 		///if is_lab
-		let md: mesh_data_t = Project.paint_objects[0].data;
+		let md: mesh_data_t = project_paint_objects[0].data;
 		///end
 
-		let texture_files: string[] = ExportArm.assets_to_files(Project.filepath, Project.assets);
+		let texture_files: string[] = ExportArm.assets_to_files(project_filepath, project_assets);
 
 		///if (is_paint || is_sculpt)
-		let font_files: string[] = ExportArm.fonts_to_files(Project.filepath, Project.fonts);
-		let mesh_files: string[] = ExportArm.meshes_to_files(Project.filepath);
+		let font_files: string[] = ExportArm.fonts_to_files(project_filepath, project_fonts);
+		let mesh_files: string[] = ExportArm.meshes_to_files(project_filepath);
 
 		let bits_pos: i32 = base_bits_handle.position;
 		let bpp: i32 = bits_pos == texture_bits_t.BITS8 ? 8 : bits_pos == texture_bits_t.BITS16 ? 16 : 32;
 
 		let ld: layer_data_t[] = [];
-		for (let l of Project.layers) {
+		for (let l of project_layers) {
 			ld.push({
 				name: l.name,
-				res: l.texpaint != null ? l.texpaint.width : Project.layers[0].texpaint.width,
+				res: l.texpaint != null ? l.texpaint.width : project_layers[0].texpaint.width,
 				bpp: bpp,
 				texpaint: l.texpaint != null ? lz4_encode(image_get_pixels(l.texpaint)) : null,
 				uv_scale: l.scale,
@@ -68,10 +68,10 @@ class ExportArm {
 				uv_type: l.uv_type,
 				decal_mat: l.uv_type == uv_type_t.PROJECT ? mat4_to_f32_array(l.decal_mat) : null,
 				opacity_mask: l.mask_opacity,
-				fill_layer: l.fill_layer != null ? Project.materials.indexOf(l.fill_layer) : -1,
+				fill_layer: l.fill_layer != null ? project_materials.indexOf(l.fill_layer) : -1,
 				object_mask: l.object_mask,
 				blending: l.blending,
-				parent: l.parent != null ? Project.layers.indexOf(l.parent) : -1,
+				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_get_pixels(l.texpaint_nor)) : null,
@@ -92,23 +92,23 @@ class ExportArm {
 		}
 		///end
 
-		let packed_assets: packed_asset_t[] = (Project.raw.packed_assets == null || Project.raw.packed_assets.length == 0) ? null : Project.raw.packed_assets;
+		let packed_assets: packed_asset_t[] = (project_raw.packed_assets == null || project_raw.packed_assets.length == 0) ? null : project_raw.packed_assets;
 		///if krom_ios
 		let same_drive: bool = false;
 		///else
-		let same_drive: bool = Project.raw.envmap != null ? Project.filepath.charAt(0) == Project.raw.envmap.charAt(0) : true;
+		let same_drive: bool = project_raw.envmap != null ? project_filepath.charAt(0) == project_raw.envmap.charAt(0) : true;
 		///end
 
-		Project.raw = {
+		project_raw = {
 			version: manifest_version,
 			material_groups: mgroups,
 			assets: texture_files,
 			packed_assets: packed_assets,
-			swatches: Project.raw.swatches,
-			envmap: Project.raw.envmap != null ? (same_drive ? Path.to_relative(Project.filepath, Project.raw.envmap) : Project.raw.envmap) : null,
+			swatches: project_raw.swatches,
+			envmap: project_raw.envmap != null ? (same_drive ? path_to_relative(project_filepath, project_raw.envmap) : project_raw.envmap) : null,
 			envmap_strength: scene_world.strength,
 			camera_world: mat4_to_f32_array(scene_camera.base.transform.local),
-			camera_origin: ExportArm.vec3f32(Camera.origins[0]),
+			camera_origin: ExportArm.vec3f32(camera_origins[0]),
 			camera_fov: scene_camera.data.fov,
 
 			///if (is_paint || is_sculpt)
@@ -121,8 +121,8 @@ class ExportArm {
 			///end
 
 			///if is_paint
-			atlas_objects: Project.atlas_objects,
-			atlas_names: Project.atlas_names,
+			atlas_objects: project_atlas_objects,
+			atlas_names: project_atlas_names,
 			///end
 
 			///if is_lab
@@ -138,7 +138,7 @@ class ExportArm {
 		};
 
 		///if (krom_android || krom_ios)
-		let tex: image_t = render_path_render_targets.get(Context.raw.render_mode == render_mode_t.FORWARD ? "buf" : "tex")._image;
+		let tex: image_t = render_path_render_targets.get(context_raw.render_mode == render_mode_t.FORWARD ? "buf" : "tex")._image;
 		let mesh_icon: image_t = image_create_render_target(256, 256);
 		let r: f32 = app_w() / app_h();
 		g2_begin(mesh_icon);
@@ -164,37 +164,37 @@ class ExportArm {
 		base_notify_on_next_frame(() => {
 			image_unload(mesh_icon);
 		});
-		// Project.raw.mesh_icons =
+		// raw.mesh_icons =
 		// 	///if (krom_metal || krom_vulkan)
 		// 	[encode(bgraSwap(mesh_icon_pixels)];
 		// 	///else
 		// 	[encode(mesh_icon_pixels)];
 		// 	///end
-		krom_write_png(Project.filepath.substr(0, Project.filepath.length - 4) + "_icon.png", mesh_icon_pixels, 256, 256, 0);
+		krom_write_png(project_filepath.substr(0, project_filepath.length - 4) + "_icon.png", mesh_icon_pixels, 256, 256, 0);
 		///end
 
 		///if (is_paint || is_sculpt)
-		let is_packed: bool = Project.filepath.endsWith("_packed_.arm");
+		let is_packed: bool = project_filepath.endsWith("_packed_.arm");
 		if (is_packed) { // Pack textures
-			ExportArm.pack_assets(Project.raw, Project.assets);
+			ExportArm.pack_assets(project_raw, project_assets);
 		}
 		///end
 
-		let buffer: buffer_t = armpack_encode(Project.raw);
-		krom_file_save_bytes(Project.filepath, buffer, buffer.byteLength + 1);
+		let buffer: buffer_t = armpack_encode(project_raw);
+		krom_file_save_bytes(project_filepath, buffer, buffer.byteLength + 1);
 
 		// Save to recent
 		///if krom_ios
-		let recent_path: string = Project.filepath.substr(Project.filepath.lastIndexOf("/") + 1);
+		let recent_path: string = project_filepath.substr(project_filepath.lastIndexOf("/") + 1);
 		///else
-		let recent_path: string = Project.filepath;
+		let recent_path: string = project_filepath;
 		///end
-		let recent: string[] = Config.raw.recent_projects;
+		let recent: string[] = config_raw.recent_projects;
 		array_remove(recent, recent_path);
 		recent.unshift(recent_path);
-		Config.save();
+		config_save();
 
-		Console.info(tr("Project saved"));
+		console_info(tr("Project saved"));
 	}
 
 	static texture_node_name = (): string => {
@@ -211,7 +211,7 @@ class ExportArm {
 			n.buttons[0].data = base_enum_texts(n.type)[index];
 
 			if (assets != null) {
-				let asset: asset_t = Project.assets[index];
+				let asset: asset_t = project_assets[index];
 				if (assets.indexOf(asset) == -1) {
 					assets.push(asset);
 				}
@@ -228,7 +228,7 @@ class ExportArm {
 		if (!path.endsWith(".arm")) path += ".arm";
 		let mnodes: zui_node_canvas_t[] = [];
 		let mgroups: zui_node_canvas_t[] = null;
-		let m: SlotMaterialRaw = Context.raw.material;
+		let m: SlotMaterialRaw = context_raw.material;
 		let c: zui_node_canvas_t = JSON.parse(JSON.stringify(m.canvas));
 		let assets: asset_t[] = [];
 		if (UINodes.has_group(c)) {
@@ -243,7 +243,7 @@ class ExportArm {
 		let is_cloud: bool = path.endsWith("_cloud_.arm");
 		if (is_cloud) path = string_replace_all(path, "_cloud_", "");
 		let packed_assets: packed_asset_t[] = null;
-		if (!Context.raw.pack_assets_on_export) {
+		if (!context_raw.pack_assets_on_export) {
 			packed_assets = ExportArm.get_packed_assets(path, texture_files);
 		}
 
@@ -261,14 +261,14 @@ class ExportArm {
 			packed_assets: packed_assets
 		};
 
-		if (Context.raw.write_icon_on_export) { // Separate icon files
+		if (context_raw.write_icon_on_export) { // Separate icon files
 			krom_write_png(path.substr(0, path.length - 4) + "_icon.png", image_get_pixels(m.image), m.image.width, m.image.height, 0);
 			if (is_cloud) {
 				krom_write_jpg(path.substr(0, path.length - 4) + "_icon.jpg", image_get_pixels(m.image), m.image.width, m.image.height, 0, 50);
 			}
 		}
 
-		if (Context.raw.pack_assets_on_export) { // Pack textures
+		if (context_raw.pack_assets_on_export) { // Pack textures
 			ExportArm.pack_assets(raw, assets);
 		}
 
@@ -293,7 +293,7 @@ class ExportArm {
 	static run_brush = (path: string) => {
 		if (!path.endsWith(".arm")) path += ".arm";
 		let bnodes: zui_node_canvas_t[] = [];
-		let b: SlotBrushRaw = Context.raw.brush;
+		let b: SlotBrushRaw = context_raw.brush;
 		let c: zui_node_canvas_t = JSON.parse(JSON.stringify(b.canvas));
 		let assets: asset_t[] = [];
 		for (let n of c.nodes) ExportArm.export_node(n, assets);
@@ -303,7 +303,7 @@ class ExportArm {
 		let is_cloud: bool = path.endsWith("_cloud_.arm");
 		if (is_cloud) path = string_replace_all(path, "_cloud_", "");
 		let packed_assets: packed_asset_t[] = null;
-		if (!Context.raw.pack_assets_on_export) {
+		if (!context_raw.pack_assets_on_export) {
 			packed_assets = ExportArm.get_packed_assets(path, texture_files);
 		}
 
@@ -320,11 +320,11 @@ class ExportArm {
 			packed_assets: packed_assets
 		};
 
-		if (Context.raw.write_icon_on_export) { // Separate icon file
+		if (context_raw.write_icon_on_export) { // Separate icon file
 			krom_write_png(path.substr(0, path.length - 4) + "_icon.png", image_get_pixels(b.image), b.image.width, b.image.height, 0);
 		}
 
-		if (Context.raw.pack_assets_on_export) { // Pack textures
+		if (context_raw.pack_assets_on_export) { // Pack textures
 			ExportArm.pack_assets(raw, assets);
 		}
 
@@ -343,7 +343,7 @@ class ExportArm {
 			///end
 			// Convert image path from absolute to relative
 			if (same_drive) {
-				texture_files.push(Path.to_relative(projectPath, a.file));
+				texture_files.push(path_to_relative(projectPath, a.file));
 			}
 			else {
 				texture_files.push(a.file);
@@ -355,7 +355,7 @@ class ExportArm {
 	///if (is_paint || is_sculpt)
 	static meshes_to_files = (projectPath: string): string[] => {
 		let mesh_files: string[] = [];
-		for (let file of Project.mesh_assets) {
+		for (let file of project_mesh_assets) {
 			///if krom_ios
 			let same_drive: bool = false;
 			///else
@@ -363,7 +363,7 @@ class ExportArm {
 			///end
 			// Convert mesh path from absolute to relative
 			if (same_drive) {
-				mesh_files.push(Path.to_relative(projectPath, file));
+				mesh_files.push(path_to_relative(projectPath, file));
 			}
 			else {
 				mesh_files.push(file);
@@ -383,7 +383,7 @@ class ExportArm {
 			///end
 			// Convert font path from absolute to relative
 			if (same_drive) {
-				font_files.push(Path.to_relative(projectPath, f.file));
+				font_files.push(path_to_relative(projectPath, f.file));
 			}
 			else {
 				font_files.push(f.file);
@@ -395,15 +395,15 @@ class ExportArm {
 
 	static get_packed_assets = (projectPath: string, texture_files: string[]): packed_asset_t[] => {
 		let packed_assets: packed_asset_t[] = null;
-		if (Project.raw.packed_assets != null) {
-			for (let pa of Project.raw.packed_assets) {
+		if (project_raw.packed_assets != null) {
+			for (let pa of project_raw.packed_assets) {
 				///if krom_ios
 				let same_drive: bool = false;
 				///else
 				let same_drive: bool = projectPath.charAt(0) == pa.name.charAt(0);
 				///end
 				// Convert path from absolute to relative
-				pa.name = same_drive ? Path.to_relative(projectPath, pa.name) : pa.name;
+				pa.name = same_drive ? path_to_relative(projectPath, pa.name) : pa.name;
 				for (let tf of texture_files) {
 					if (pa.name == tf) {
 						if (packed_assets == null) {
@@ -424,8 +424,8 @@ class ExportArm {
 		}
 		let temp_images: image_t[] = [];
 		for (let i: i32 = 0; i < assets.length; ++i) {
-			if (!Project.packed_asset_exists(raw.packed_assets, assets[i].file)) {
-				let image: image_t = Project.get_image(assets[i]);
+			if (!project_packed_asset_exists(raw.packed_assets, assets[i].file)) {
+				let image: image_t = project_get_image(assets[i]);
 				let temp: image_t = image_create_render_target(image.width, image.height);
 				g2_begin(temp);
 				g2_draw_image(image, 0, 0);
@@ -448,7 +448,7 @@ class ExportArm {
 		if (!path.endsWith(".arm")) path += ".arm";
 		let raw: any = {
 			version: manifest_version,
-			swatches: Project.raw.swatches
+			swatches: project_raw.swatches
 		};
 		let buffer: buffer_t = armpack_encode(raw);
 		krom_file_save_bytes(path, buffer, buffer.byteLength + 1);

+ 2 - 2
base/Sources/ExportMesh.ts

@@ -2,8 +2,8 @@
 class ExportMesh {
 
 	static run = (path: string, paintObjects: mesh_object_t[] = null, applyDisplacement: bool = false) => {
-		if (paintObjects == null) paintObjects = Project.paint_objects;
-		if (Context.raw.export_mesh_format == mesh_format_t.OBJ) ExportObj.run(path, paintObjects, applyDisplacement);
+		if (paintObjects == null) paintObjects = project_paint_objects;
+		if (context_raw.export_mesh_format == mesh_format_t.OBJ) ExportObj.run(path, paintObjects, applyDisplacement);
 		else ExportArm.run_mesh(path, paintObjects);
 	}
 }

+ 2 - 2
base/Sources/ExportObj.ts

@@ -89,8 +89,8 @@ class ExportObj {
 			}
 
 			if (applyDisplacement) {
-				// let height: buffer_t = Project.layers[0].texpaint_pack.getPixels();
-				// let res: i32 = Project.layers[0].texpaint_pack.width;
+				// let height: buffer_t = layers[0].texpaint_pack.getPixels();
+				// let res: i32 = layers[0].texpaint_pack.width;
 				// let strength: f32 = 0.1;
 				// for (let i: i32 = 0; i < len; ++i) {
 				// 	let x: i32 = Math.floor(texa2[i * 2    ] / 32767 * res);

+ 62 - 62
base/Sources/ExportTexture.ts

@@ -11,62 +11,62 @@ class ExportTexture {
 		if (bake_material) {
 			ExportTexture.run_bake_material(path);
 		}
-		else if (Context.raw.layers_export == export_mode_t.PER_UDIM_TILE) {
+		else if (context_raw.layers_export == export_mode_t.PER_UDIM_TILE) {
 			let udim_tiles: string[] = [];
-			for (let l of Project.layers) {
+			for (let l of project_layers) {
 				if (SlotLayer.get_object_mask(l) > 0) {
-					let name: string = Project.paint_objects[SlotLayer.get_object_mask(l) - 1].base.name;
+					let name: string = project_paint_objects[SlotLayer.get_object_mask(l) - 1].base.name;
 					if (name.substr(name.length - 5, 2) == ".1") { // tile.1001
 						udim_tiles.push(name.substr(name.length - 5));
 					}
 				}
 			}
 			if (udim_tiles.length > 0) {
-				for (let udim_tile of udim_tiles) ExportTexture.run_layers(path, Project.layers, udim_tile);
+				for (let udim_tile of udim_tiles) ExportTexture.run_layers(path, project_layers, udim_tile);
 			}
-			else ExportTexture.run_layers(path, Project.layers);
+			else ExportTexture.run_layers(path, project_layers);
 		}
-		else if (Context.raw.layers_export == export_mode_t.PER_OBJECT) {
+		else if (context_raw.layers_export == export_mode_t.PER_OBJECT) {
 			let object_names: string[] = [];
-			for (let l of Project.layers) {
+			for (let l of project_layers) {
 				if (SlotLayer.get_object_mask(l) > 0) {
-					let name: string = Project.paint_objects[SlotLayer.get_object_mask(l) - 1].base.name;
+					let name: string = project_paint_objects[SlotLayer.get_object_mask(l) - 1].base.name;
 					if (object_names.indexOf(name) == -1) {
 						object_names.push(name);
 					}
 				}
 			}
 			if (object_names.length > 0) {
-				for (let name of object_names) ExportTexture.run_layers(path, Project.layers, name);
+				for (let name of object_names) ExportTexture.run_layers(path, project_layers, name);
 			}
-			else ExportTexture.run_layers(path, Project.layers);
+			else ExportTexture.run_layers(path, project_layers);
 		}
 		else { // Visible or selected
 			let atlas_export: bool = false;
-			if (Project.atlas_objects != null) {
-				for (let i: i32 = 1; i < Project.atlas_objects.length; ++i) {
-					if (Project.atlas_objects[i - 1] != Project.atlas_objects[i]) {
+			if (project_atlas_objects != null) {
+				for (let i: i32 = 1; i < project_atlas_objects.length; ++i) {
+					if (project_atlas_objects[i - 1] != project_atlas_objects[i]) {
 						atlas_export = true;
 						break;
 					}
 				}
 			}
 			if (atlas_export) {
-				for (let atlas_index: i32 = 0; atlas_index < Project.atlas_objects.length; ++atlas_index) {
+				for (let atlas_index: i32 = 0; atlas_index < project_atlas_objects.length; ++atlas_index) {
 					let layers: SlotLayerRaw[] = [];
-					for (let object_index: i32 = 0; object_index < Project.atlas_objects.length; ++object_index) {
-						if (Project.atlas_objects[object_index] == atlas_index) {
-							for (let l of Project.layers) {
+					for (let object_index: i32 = 0; object_index < project_atlas_objects.length; ++object_index) {
+						if (project_atlas_objects[object_index] == atlas_index) {
+							for (let l of project_layers) {
 								if (SlotLayer.get_object_mask(l) == 0 /* shared object */ || SlotLayer.get_object_mask(l) - 1 == object_index) layers.push(l);
 							}
 						}
 					}
 					if (layers.length > 0) {
-						ExportTexture.run_layers(path, layers, Project.atlas_names[atlas_index]);
+						ExportTexture.run_layers(path, layers, project_atlas_names[atlas_index]);
 					}
 				}
 			}
-			else ExportTexture.run_layers(path, Context.raw.layers_export == export_mode_t.SELECTED ? (SlotLayer.is_group(Context.raw.layer) ? SlotLayer.get_children(Context.raw.layer) : [Context.raw.layer]) : Project.layers);
+			else ExportTexture.run_layers(path, context_raw.layers_export == export_mode_t.SELECTED ? (SlotLayer.is_group(context_raw.layer) ? SlotLayer.get_children(context_raw.layer) : [context_raw.layer]) : project_layers);
 		}
 		///end
 
@@ -75,11 +75,11 @@ class ExportTexture {
 		///end
 
 		///if krom_ios
-		Console.info(tr("Textures exported") + " ('Files/On My iPad/" + manifest_title + "')");
+		console_info(tr("Textures exported") + " ('Files/On My iPad/" + manifest_title + "')");
 		///elseif krom_android
-		Console.info(tr("Textures exported") + " ('Files/Internal storage/Pictures/" + manifest_title + "')");
+		console_info(tr("Textures exported") + " ('Files/Internal storage/Pictures/" + manifest_title + "')");
 		///else
-		Console.info(tr("Textures exported"));
+		console_info(tr("Textures exported"));
 		///end
 		UIFiles.last_path = "";
 	}
@@ -90,22 +90,22 @@ class ExportTexture {
 			RenderPathPaint.live_layer = SlotLayer.create("_live");
 		}
 
-		let _tool: workspace_tool_t = Context.raw.tool;
-		Context.raw.tool = workspace_tool_t.FILL;
+		let _tool: workspace_tool_t = context_raw.tool;
+		context_raw.tool = workspace_tool_t.FILL;
 		MakeMaterial.parse_paint_material();
-		let _paint_object: mesh_object_t = Context.raw.paint_object;
+		let _paint_object: mesh_object_t = context_raw.paint_object;
 		let planeo: mesh_object_t = scene_get_child(".Plane").ext;
 		planeo.base.visible = true;
-		Context.raw.paint_object = planeo;
-		Context.raw.pdirty = 1;
+		context_raw.paint_object = planeo;
+		context_raw.pdirty = 1;
 		RenderPathPaint.use_live_layer(true);
 		RenderPathPaint.commands_paint(false);
 		RenderPathPaint.use_live_layer(false);
-		Context.raw.tool = _tool;
+		context_raw.tool = _tool;
 		MakeMaterial.parse_paint_material();
-		Context.raw.pdirty = 0;
+		context_raw.pdirty = 0;
 		planeo.base.visible = false;
-		Context.raw.paint_object = _paint_object;
+		context_raw.paint_object = _paint_object;
 
 		ExportTexture.run_layers(path, [RenderPathPaint.live_layer], "", true);
 	}
@@ -119,21 +119,21 @@ class ExportTexture {
 	static run_layers = (path: string, layers: any[], object_name: string = "") => {
 	///end
 
-		let texture_size_x: i32 = Config.get_texture_res_x();
-		let texture_size_y: i32 = Config.get_texture_res_y();
+		let texture_size_x: i32 = config_get_texture_res_x();
+		let texture_size_y: i32 = config_get_texture_res_y();
 		///if (krom_android || krom_ios)
 		let f: string = sys_title();
 		///else
 		let f: string = UIFiles.filename;
 		///end
 		if (f == "") f = tr("untitled");
-		let format_type: texture_ldr_format_t = Context.raw.format_type;
+		let format_type: texture_ldr_format_t = context_raw.format_type;
 		let bits: i32 = base_bits_handle.position == texture_bits_t.BITS8 ? 8 : 16;
 		let ext: string = bits == 16 ? ".exr" : format_type == texture_ldr_format_t.PNG ? ".png" : ".jpg";
 		if (f.endsWith(ext)) f = f.substr(0, f.length - 4);
 
 		///if is_paint
-		let is_udim: bool = Context.raw.layers_export == export_mode_t.PER_UDIM_TILE;
+		let is_udim: bool = context_raw.layers_export == export_mode_t.PER_UDIM_TILE;
 		if (is_udim) ext = object_name + ext;
 
 		base_make_temp_img();
@@ -143,9 +143,9 @@ class ExportTexture {
 		let empty: image_t = render_path_render_targets.get("empty_white")._image;
 
 		// Append object mask name
-		let export_selected: bool = Context.raw.layers_export == export_mode_t.SELECTED;
+		let export_selected: bool = context_raw.layers_export == export_mode_t.SELECTED;
 		if (export_selected && SlotLayer.get_object_mask(layers[0]) > 0) {
-			f += "_" + Project.paint_objects[SlotLayer.get_object_mask(layers[0]) - 1].base.name;
+			f += "_" + project_paint_objects[SlotLayer.get_object_mask(layers[0]) - 1].base.name;
 		}
 		if (!is_udim && !export_selected && object_name != "") {
 			f += "_" + object_name;
@@ -168,9 +168,9 @@ class ExportTexture {
 			if (!SlotLayer.is_layer(l1)) continue;
 
 			if (object_name != "" && SlotLayer.get_object_mask(l1) > 0) {
-				if (is_udim && !Project.paint_objects[SlotLayer.get_object_mask(l1) - 1].base.name.endsWith(object_name)) continue;
-				let per_object: bool = Context.raw.layers_export == export_mode_t.PER_OBJECT;
-				if (per_object && Project.paint_objects[SlotLayer.get_object_mask(l1) - 1].base.name != object_name) continue;
+				if (is_udim && !project_paint_objects[SlotLayer.get_object_mask(l1) - 1].base.name.endsWith(object_name)) continue;
+				let per_object: bool = context_raw.layers_export == export_mode_t.PER_OBJECT;
+				if (per_object && project_paint_objects[SlotLayer.get_object_mask(l1) - 1].base.name != object_name) continue;
 			}
 
 			let mask: image_t = empty;
@@ -292,28 +292,28 @@ class ExportTexture {
 			let tex_name = t.name != "" ? "_" + t.name : "";
 			let single_channel: bool = c[0] == c[1] && c[1] == c[2] && c[3] == "1.0";
 			if (c[0] == "base_r" && c[1] == "base_g" && c[2] == "base_b" && c[3] == "1.0" && t.color_space == "linear") {
-				ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint, 1);
+				ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint, 1);
 			}
 			else if (c[0] == "nor_r" && c[1] == "nor_g" && c[2] == "nor_b" && c[3] == "1.0" && t.color_space == "linear") {
-				ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint_nor, 1);
+				ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint_nor, 1);
 			}
 			else if (c[0] == "occ" && c[1] == "rough" && c[2] == "metal" && c[3] == "1.0" && t.color_space == "linear") {
-				ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint_pack, 1);
+				ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint_pack, 1);
 			}
 			else if (single_channel && c[0] == "occ" && t.color_space == "linear") {
-				ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint_pack, 2, 0);
+				ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint_pack, 2, 0);
 			}
 			else if (single_channel && c[0] == "rough" && t.color_space == "linear") {
-				ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint_pack, 2, 1);
+				ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint_pack, 2, 1);
 			}
 			else if (single_channel && c[0] == "metal" && t.color_space == "linear") {
-				ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint_pack, 2, 2);
+				ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint_pack, 2, 2);
 			}
 			else if (single_channel && c[0] == "height" && t.color_space == "linear") {
-				ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint_pack, 2, 3);
+				ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint_pack, 2, 3);
 			}
 			else if (single_channel && c[0] == "opac" && t.color_space == "linear") {
-				ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pixpaint, 2, 3);
+				ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pixpaint, 2, 3);
 			}
 			else {
 				if (pix == null) pix = new ArrayBuffer(texture_size_x * texture_size_y * 4 * Math.floor(bits / 8));
@@ -337,7 +337,7 @@ class ExportTexture {
 					else if (c == "0.0") ExportTexture.set_channel(0, new DataView(pix), i);
 					else if (c == "1.0") ExportTexture.set_channel(255, new DataView(pix), i);
 				}
-				ExportTexture.write_texture(path + Path.sep + f + tex_name + ext, pix, 3);
+				ExportTexture.write_texture(path + path_sep + f + tex_name + ext, pix, 3);
 			}
 		}
 
@@ -348,8 +348,8 @@ class ExportTexture {
 	}
 
 	static write_texture = (file: string, pixels: ArrayBuffer, type: i32 = 1, off: i32 = 0) => {
-		let res_x: i32 = Config.get_texture_res_x();
-		let res_y: i32 = Config.get_texture_res_y();
+		let res_x: i32 = config_get_texture_res_x();
+		let res_y: i32 = config_get_texture_res_y();
 		let bits_handle: i32 = base_bits_handle.position;
 		let bits: i32 = bits_handle == texture_bits_t.BITS8 ? 8 : bits_handle == texture_bits_t.BITS16 ? 16 : 32;
 		let format: i32 = 0; // RGBA
@@ -359,26 +359,26 @@ class ExportTexture {
 		if (type == 2 && off == 2) format = 5; // BBB1
 		if (type == 2 && off == 3) format = 6; // AAA1
 
-		if (Context.raw.layers_destination == export_destination_t.PACKED) {
+		if (context_raw.layers_destination == export_destination_t.PACKED) {
 			let image: image_t = image_from_bytes(pixels, res_x, res_y);
 			data_cached_images.set(file, image);
-			let ar: string[] = file.split(Path.sep);
+			let ar: string[] = file.split(path_sep);
 			let name: string = ar[ar.length - 1];
-			let asset: asset_t = {name: name, file: file, id: Project.asset_id++};
-			Project.assets.push(asset);
-			if (Project.raw.assets == null) Project.raw.assets = [];
-			Project.raw.assets.push(asset.file);
-			Project.asset_names.push(asset.name);
-			Project.asset_map.set(asset.id, image);
-			ExportArm.pack_assets(Project.raw, [asset]);
+			let asset: asset_t = {name: name, file: file, id: project_asset_id++};
+			project_assets.push(asset);
+			if (project_raw.assets == null) project_raw.assets = [];
+			project_raw.assets.push(asset.file);
+			project_asset_names.push(asset.name);
+			project_asset_map.set(asset.id, image);
+			ExportArm.pack_assets(project_raw, [asset]);
 			return;
 		}
 
-		if (bits == 8 && Context.raw.format_type == texture_ldr_format_t.PNG) {
+		if (bits == 8 && context_raw.format_type == texture_ldr_format_t.PNG) {
 			krom_write_png(file, pixels, res_x, res_y, format);
 		}
-		else if (bits == 8 && Context.raw.format_type == texture_ldr_format_t.JPG) {
-			krom_write_jpg(file, pixels, res_x, res_y, format, Math.floor(Context.raw.format_quality));
+		else if (bits == 8 && context_raw.format_type == texture_ldr_format_t.JPG) {
+			krom_write_jpg(file, pixels, res_x, res_y, format, Math.floor(context_raw.format_quality));
 		}
 		else { // Exr
 			let b: ArrayBuffer = ParserExr.run(res_x, res_y, pixels, bits, type, off);

+ 0 - 199
base/Sources/File.ts

@@ -1,199 +0,0 @@
-
-class File {
-
-	///if krom_windows
-	static cmd_mkdir: string = "mkdir";
-	static cmd_copy: string = "copy";
-	///else
-	static cmd_mkdir: string = "mkdir -p";
-	static cmd_copy: string = "cp";
-	///end
-
-	static cloud: Map<string, string[]> = null;
-	static cloud_sizes: Map<string, i32> = null;
-
-	// ///if krom_android
-	// static let internal: Map<string, string[]> = null; // .apk contents
-	// ///end
-
-	static read_directory = (path: string, folders_only: bool = false): string[] => {
-		if (path.startsWith("cloud")) {
-			let files: string[] = File.cloud != null ? File.cloud.get(string_replace_all(path, "\\", "/")) : null;
-			return files != null ? files : [];
-		}
-		// ///if krom_android
-		// path = string_replace_all(path, "//", "/");
-		// if (internal == null) {
-		// 	internal = [];
-		// 	internal.set("/data/plugins", BuildMacros.readDirectory("krom/data/plugins"));
-		// 	internal.set("/data/export_presets", BuildMacros.readDirectory("krom/data/export_presets"));
-		// 	internal.set("/data/keymap_presets", BuildMacros.readDirectory("krom/data/keymap_presets"));
-		// 	internal.set("/data/locale", BuildMacros.readDirectory("krom/data/locale"));
-		// 	internal.set("/data/meshes", BuildMacros.readDirectory("krom/data/meshes"));
-		// 	internal.set("/data/themes", BuildMacros.readDirectory("krom/data/themes"));
-		// }
-		// if (internal.exists(path)) return internal.get(path);
-		// ///end
-		return krom_read_directory(path, folders_only).split("\n");
-	}
-
-	static create_directory = (path: string) => {
-		krom_sys_command(File.cmd_mkdir + ' "' + path + '"');
-	}
-
-	static copy = (srcPath: string, dst_path: string) => {
-		krom_sys_command(File.cmd_copy + ' "' + srcPath + '" "' + dst_path + '"');
-	}
-
-	static start = (path: string) => {
-		///if krom_windows
-		krom_sys_command('start "" "' + path + '"');
-		///elseif krom_linux
-		krom_sys_command('xdg-open "' + path + '"');
-		///else
-		krom_sys_command('open "' + path + '"');
-		///end
-	}
-
-	static load_url = (url: string) => {
-		krom_load_url(url);
-	}
-
-	static delete = (path: string) => {
-		krom_delete_file(path);
-	}
-
-	static exists = (path: string): bool => {
-		return krom_file_exists(path);
-	}
-
-	static download = (url: string, dstPath: string, done: ()=>void, size: i32 = 0) => {
-		///if (krom_windows || krom_darwin || krom_ios || krom_android)
-		krom_http_request(url, size, (ab: ArrayBuffer) => {
-			if (ab != null) krom_file_save_bytes(dstPath, ab);
-			done();
-		});
-		///elseif krom_linux
-		krom_sys_command('wget -O "' + dstPath + '" "' + url + '"');
-		done();
-		///else
-		krom_sys_command('curl -L ' + url + ' -o "' + dstPath + '"');
-		done();
-		///end
-	}
-
-	static download_bytes = (url: string, done: (ab: ArrayBuffer)=>void) => {
-		let save: string = (Path.is_protected() ? krom_save_path() : Path.data() + Path.sep) + "download.bin";
-		File.download(url, save, () => {
-			let buffer: ArrayBuffer = null;
-			try {
-				buffer = krom_load_blob(save);
-			}
-			catch (e: any) {}
-			done(buffer);
-		});
-	}
-
-	static cache_cloud = (path: string, done: (s: string)=>void) => {
-		///if krom_ios
-		let path2: string = string_replace_all(path, "/", "_"); // Cache everything into root folder
-		///else
-		let path2: string = path;
-		///end
-		let dest: string = (Path.is_protected() ? krom_save_path() : krom_get_files_location() + Path.sep) + path2;
-		if (File.exists(dest)) {
-			///if (krom_darwin || krom_ios)
-			done(dest);
-			///else
-			done((Path.is_protected() ? krom_save_path() : Path.working_dir() + Path.sep) + path);
-			///end
-			return;
-		}
-
-		let file_dir: string = dest.substr(0, dest.lastIndexOf(Path.sep));
-		if (File.read_directory(file_dir)[0] == "") {
-			File.create_directory(file_dir);
-		}
-		///if krom_windows
-		path = string_replace_all(path, "\\", "/");
-		///end
-		let url: string = Config.raw.server + "/" + path;
-		File.download(url, dest, () => {
-			if (!File.exists(dest)) {
-				Console.error(Strings.error5());
-				done(null);
-				return;
-			}
-			///if (krom_darwin || krom_ios)
-			done(dest);
-			///else
-			done((Path.is_protected() ? krom_save_path() : Path.working_dir() + Path.sep) + path);
-			///end
-		}, File.cloud_sizes.get(path));
-	}
-
-	static init_cloud_bytes = (done: ()=>void, append: string = "") => {
-		File.download_bytes(Config.raw.server + "/?list-type=2" + append, (buffer: ArrayBuffer) => {
-			if (buffer == null) {
-				File.cloud.set("cloud", []);
-				Console.error(Strings.error5());
-				return;
-			}
-			let files: string[] = [];
-			let sizes: i32[] = [];
-
-			let str: string = sys_buffer_to_string(buffer);
-			let pos_start: i32 = 0;
-			let pos_end: i32 = 0;
-
-			while (true) {
-				pos_start = str.indexOf("<Key>", pos_start);
-				if (pos_start == -1) break;
-				pos_start += 5; // <Key>
-				pos_end = str.indexOf("</Key>", pos_start);
-
-				files.push(str.substring(pos_start, pos_end));
-
-				pos_start = str.indexOf("<Size>", pos_end);
-				pos_start += 6; //<Size>
-				pos_end = str.indexOf("</Size>", pos_start);
-
-				sizes.push(Number(str.substring(pos_start, pos_end)));
-			}
-
-			for (let file of files) {
-				if (Path.is_folder(file)) {
-					File.cloud.set(file.substr(0, file.length - 1), []);
-				}
-			}
-			for (let i: i32 = 0; i < files.length; ++i) {
-				let file: string = files[i];
-				let nested: bool = file.indexOf("/") != file.lastIndexOf("/");
-				if (nested) {
-					let delim: i32 = Path.is_folder(file) ? file.substr(0, file.length - 1).lastIndexOf("/") : file.lastIndexOf("/");
-					let parent: string = file.substr(0, delim);
-					let child: string = Path.is_folder(file) ? file.substring(delim + 1, file.length - 1) : file.substr(delim + 1);
-					File.cloud.get(parent).push(child);
-					if (!Path.is_folder(file)) {
-						File.cloud_sizes.set(file, sizes[i]);
-					}
-				}
-			}
-
-			let is_truncated: bool = str.indexOf("<IsTruncated>true") > -1;
-			if (is_truncated) {
-				let pos_start: i32 = str.indexOf("<NextContinuationToken>");
-				pos_start += 23;
-				let pos_end: i32 = str.indexOf("</NextContinuationToken>", pos_start);
-				File.init_cloud_bytes(done, "&start-after=" + str.substring(pos_start, pos_end));
-			}
-			else done();
-		});
-	}
-
-	static init_cloud = (done: ()=>void) => {
-		File.cloud = new Map();
-		File.cloud_sizes = new Map();
-		File.init_cloud_bytes(done);
-	}
-}

+ 0 - 139
base/Sources/Geom.ts

@@ -1,139 +0,0 @@
-
-class Geom {
-
-	static make_plane(size_x: f32 = 1.0, size_y: f32 = 1.0, verts_x: i32 = 2, verts_y: i32 = 2, uv_scale: f32 = 1.0): raw_mesh_t {
-
-		let mesh: raw_mesh_t = {};
-		mesh.scalePos = 1.0;
-		mesh.scaleTex = 1.0;
-		mesh.name = "";
-		mesh.hasNext = false;
-
-		// Pack positions to (-1, 1) range
-		let half_x: f32 = size_x / 2;
-		let half_y: f32 = size_y / 2;
-		mesh.scalePos = Math.max(half_x, half_y);
-		let inv: f32 = (1 / mesh.scalePos) * 32767;
-
-		mesh.posa = new Int16Array(verts_x * verts_y * 4);
-		mesh.nora = new Int16Array(verts_x * verts_y * 2);
-		mesh.texa = new Int16Array(verts_x * verts_y * 2);
-		mesh.inda = new Uint32Array((verts_x - 1) * (verts_y - 1) * 6);
-		let step_x: f32 = size_x / (verts_x - 1);
-		let step_y: f32 = size_y / (verts_y - 1);
-		for (let i: i32 = 0; i < verts_x * verts_y; ++i) {
-			let x: f32 = (i % verts_x) * step_x - half_x;
-			let y: f32 = Math.floor(i / verts_x) * step_y - half_y;
-			mesh.posa[i * 4    ] = Math.floor(x * inv);
-			mesh.posa[i * 4 + 1] = Math.floor(y * inv);
-			mesh.posa[i * 4 + 2] = 0;
-			mesh.nora[i * 2    ] = 0;
-			mesh.nora[i * 2 + 1] = 0;
-			mesh.posa[i * 4 + 3] = 32767;
-			x = (i % verts_x) / (verts_x - 1);
-			y = 1.0 - Math.floor(i / verts_x) / (verts_y - 1);
-			mesh.texa[i * 2    ] = (Math.floor(x * 32767 * uv_scale) - 1) % 32767;
-			mesh.texa[i * 2 + 1] = (Math.floor(y * 32767 * uv_scale) - 1) % 32767;
-		}
-		for (let i: i32 = 0; i < (verts_x - 1) * (verts_y - 1); ++i) {
-			let x: f32 = i % (verts_x - 1);
-			let y: f32 = Math.floor(i / (verts_y - 1));
-			mesh.inda[i * 6    ] = y * verts_x + x;
-			mesh.inda[i * 6 + 1] = y * verts_x + x + 1;
-			mesh.inda[i * 6 + 2] = (y + 1) * verts_x + x;
-			mesh.inda[i * 6 + 3] = y * verts_x + x + 1;
-			mesh.inda[i * 6 + 4] = (y + 1) * verts_x + x + 1;
-			mesh.inda[i * 6 + 5] = (y + 1) * verts_x + x;
-		}
-
-		return mesh;
-	}
-
-	static make_uv_sphere(radius: f32 = 1.0, widthSegments: i32 = 32, heightSegments: i32 = 16, stretch_uv: bool = true, uvScale: f32 = 1.0): raw_mesh_t {
-
-		let mesh: raw_mesh_t = {};
-		mesh.scalePos = 1.0;
-		mesh.scaleTex = 1.0;
-		mesh.name = "";
-		mesh.hasNext = false;
-
-		// Pack positions to (-1, 1) range
-		mesh.scalePos = radius;
-		mesh.scaleTex = uvScale;
-		let inv: f32 = (1 / mesh.scalePos) * 32767;
-		let pi2: f32 = Math.PI * 2;
-
-		let width_verts: i32 = widthSegments + 1;
-		let height_verts: i32 = heightSegments + 1;
-		mesh.posa = new Int16Array(width_verts * height_verts * 4);
-		mesh.nora = new Int16Array(width_verts * height_verts * 2);
-		mesh.texa = new Int16Array(width_verts * height_verts * 2);
-		mesh.inda = new Uint32Array(widthSegments * heightSegments * 6 - widthSegments * 6);
-
-		let nor: vec4_t = vec4_create();
-		let pos: i32 = 0;
-		for (let y: i32 = 0; y < height_verts; ++y) {
-			let v: f32 = y / heightSegments;
-			let v_flip: f32 = 1.0 - v;
-			if (!stretch_uv) v_flip /= 2;
-			let u_off: f32 = y == 0 ? 0.5 / widthSegments : y == heightSegments ? -0.5 / widthSegments : 0.0;
-			for (let x: i32 = 0; x < width_verts; ++x) {
-				let u: f32 = x / widthSegments;
-				let u_pi2: f32 = u * pi2;
-				let v_pi: f32  = v * Math.PI;
-				let v_pi_sin: f32 = Math.sin(v_pi);
-				let vx: f32 = -radius * Math.cos(u_pi2) * v_pi_sin;
-				let vy: f32 =  radius * Math.sin(u_pi2) * v_pi_sin;
-				let vz: f32 = -radius * Math.cos(v_pi);
-				let i4: i32 = pos * 4;
-				let i2: i32 = pos * 2;
-				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));
-				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);
-				mesh.texa[i2    ] = (Math.floor((u + u_off) * 32767) - 1) % 32767;
-				mesh.texa[i2 + 1] = (Math.floor(v_flip      * 32767) - 1) % 32767;
-				pos++;
-			}
-		}
-
-		pos = 0;
-		let height_segments1: i32 = heightSegments - 1;
-		for (let y: i32 = 0; y < heightSegments; ++y) {
-			for (let x: i32 = 0; x < widthSegments; ++x) {
-				let x1: i32 = x + 1;
-				let y1: i32 = y + 1;
-				let a: f32 = y  * width_verts + x1;
-				let b: f32 = y  * width_verts + x;
-				let c: f32 = y1 * width_verts + x;
-				let d: f32 = y1 * width_verts + x1;
-				if (y > 0) {
-					mesh.inda[pos++] = a;
-					mesh.inda[pos++] = b;
-					mesh.inda[pos++] = d;
-				}
-				if (y < height_segments1) {
-					mesh.inda[pos++] = b;
-					mesh.inda[pos++] = c;
-					mesh.inda[pos++] = d;
-				}
-			}
-		}
-
-		return mesh;
-	}
-}
-
-type raw_mesh_t = {
-	posa?: Int16Array;
-	nora?: Int16Array;
-	texa?: Int16Array;
-	inda?: Uint32Array;
-	scalePos?: f32;
-	scaleTex?: f32;
-	name?: string;
-	hasNext?: bool;
-};

+ 0 - 268
base/Sources/Gizmo.ts

@@ -1,268 +0,0 @@
-
-///if (is_paint || is_sculpt)
-
-class Gizmo {
-
-	static v: vec4_t = vec4_create();
-	static v0: vec4_t = vec4_create();
-	static q: quat_t = quat_create();
-	static q0: quat_t = quat_create();
-
-	static update = () => {
-		let is_object: bool = Context.raw.tool == workspace_tool_t.GIZMO;
-		let is_decal: bool = base_is_decal_layer();
-
-		let gizmo: object_t = Context.raw.gizmo;
-		let hide: bool = Operator.shortcut(Config.keymap.stencil_hide, ShortcutType.ShortcutDown);
-		gizmo.visible = (is_object || is_decal) && !hide;
-		if (!gizmo.visible) return;
-
-		let paint_object: object_t = Context.raw.paint_object.base;
-		///if is_forge
-		if (Context.raw.selected_object != null) {
-			paint_object = Context.raw.selected_object;
-		}
-		///end
-
-		if (is_object) {
-			vec4_set_from(gizmo.transform.loc, paint_object.transform.loc);
-		}
-		else if (is_decal) {
-			vec4_set(gizmo.transform.loc, Context.raw.layer.decal_mat.m[12], Context.raw.layer.decal_mat.m[13], Context.raw.layer.decal_mat.m[14]);
-		}
-		let cam: camera_object_t = scene_camera;
-		let fov: f32 = cam.data.fov;
-		let dist: f32 = vec4_dist(cam.base.transform.loc, gizmo.transform.loc) / 8 * fov;
-		vec4_set(gizmo.transform.scale, dist, dist, dist);
-		vec4_set(Context.raw.gizmo_translate_x.transform.scale, dist, dist, dist);
-		vec4_set(Context.raw.gizmo_translate_y.transform.scale, dist, dist, dist);
-		vec4_set(Context.raw.gizmo_translate_z.transform.scale, dist, dist, dist);
-		vec4_set(Context.raw.gizmo_scale_x.transform.scale, dist, dist, dist);
-		vec4_set(Context.raw.gizmo_scale_y.transform.scale, dist, dist, dist);
-		vec4_set(Context.raw.gizmo_scale_z.transform.scale, dist, dist, dist);
-		vec4_set(Context.raw.gizmo_rotate_x.transform.scale, dist, dist, dist);
-		vec4_set(Context.raw.gizmo_rotate_y.transform.scale, dist, dist, dist);
-		vec4_set(Context.raw.gizmo_rotate_z.transform.scale, dist, dist, dist);
-		transform_build_matrix(gizmo.transform);
-
-		// Scene control
-		if (is_object) {
-			if (Context.raw.translate_x || Context.raw.translate_y || Context.raw.translate_z || Context.raw.scale_x || Context.raw.scale_y || Context.raw.scale_z || Context.raw.rotate_x || Context.raw.rotate_y || Context.raw.rotate_z) {
-				if (Context.raw.translate_x) {
-					paint_object.transform.loc.x = Context.raw.gizmo_drag;
-				}
-				else if (Context.raw.translate_y) {
-					paint_object.transform.loc.y = Context.raw.gizmo_drag;
-				}
-				else if (Context.raw.translate_z) {
-					paint_object.transform.loc.z = Context.raw.gizmo_drag;
-				}
-				else if (Context.raw.scale_x) {
-					paint_object.transform.scale.x += Context.raw.gizmo_drag - Context.raw.gizmo_drag_last;
-				}
-				else if (Context.raw.scale_y) {
-					paint_object.transform.scale.y += Context.raw.gizmo_drag - Context.raw.gizmo_drag_last;
-				}
-				else if (Context.raw.scale_z) {
-					paint_object.transform.scale.z += Context.raw.gizmo_drag - Context.raw.gizmo_drag_last;
-				}
-				else if (Context.raw.rotate_x) {
-					quat_from_axis_angle(Gizmo.q0, vec4_x_axis(), Context.raw.gizmo_drag - Context.raw.gizmo_drag_last);
-					quat_mult(paint_object.transform.rot, Gizmo.q0);
-				}
-				else if (Context.raw.rotate_y) {
-					quat_from_axis_angle(Gizmo.q0, vec4_y_axis(), Context.raw.gizmo_drag - Context.raw.gizmo_drag_last);
-					quat_mult(paint_object.transform.rot, Gizmo.q0);
-				}
-				else if (Context.raw.rotate_z) {
-					quat_from_axis_angle(Gizmo.q0, vec4_z_axis(), Context.raw.gizmo_drag - Context.raw.gizmo_drag_last);
-					quat_mult(paint_object.transform.rot, Gizmo.q0);
-				}
-				Context.raw.gizmo_drag_last = Context.raw.gizmo_drag;
-
-				transform_build_matrix(paint_object.transform);
-				///if arm_physics
-				let pb: any = (paint_object as any).physicsBody;
-				if (pb != null) pb.syncTransform();
-				///end
-			}
-		}
-		// Decal layer control
-		else if (is_decal) {
-			if (Context.raw.translate_x || Context.raw.translate_y || Context.raw.translate_z || Context.raw.scale_x || Context.raw.scale_y || Context.raw.scale_z || Context.raw.rotate_x || Context.raw.rotate_y || Context.raw.rotate_z) {
-				if (Context.raw.translate_x) {
-					Context.raw.layer.decal_mat.m[12] = Context.raw.gizmo_drag;
-				}
-				else if (Context.raw.translate_y) {
-					Context.raw.layer.decal_mat.m[13] = Context.raw.gizmo_drag;
-				}
-				else if (Context.raw.translate_z) {
-					Context.raw.layer.decal_mat.m[14] = Context.raw.gizmo_drag;
-				}
-				else if (Context.raw.scale_x) {
-					mat4_decompose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-					Gizmo.v0.x += Context.raw.gizmo_drag - Context.raw.gizmo_drag_last;
-					mat4_compose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-				}
-				else if (Context.raw.scale_y) {
-					mat4_decompose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-					Gizmo.v0.y += Context.raw.gizmo_drag - Context.raw.gizmo_drag_last;
-					mat4_compose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-				}
-				else if (Context.raw.scale_z) {
-					mat4_decompose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-					Gizmo.v0.z += Context.raw.gizmo_drag - Context.raw.gizmo_drag_last;
-					mat4_compose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-				}
-				else if (Context.raw.rotate_x) {
-					mat4_decompose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-					quat_from_axis_angle(Gizmo.q0, vec4_x_axis(), -Context.raw.gizmo_drag + Context.raw.gizmo_drag_last);
-					quat_mult_quats(Gizmo.q, Gizmo.q0, Gizmo.q);
-					mat4_compose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-				}
-				else if (Context.raw.rotate_y) {
-					mat4_decompose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-					quat_from_axis_angle(Gizmo.q0, vec4_y_axis(), -Context.raw.gizmo_drag + Context.raw.gizmo_drag_last);
-					quat_mult_quats(Gizmo.q, Gizmo.q0, Gizmo.q);
-					mat4_compose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-				}
-				else if (Context.raw.rotate_z) {
-					mat4_decompose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-					quat_from_axis_angle(Gizmo.q0, vec4_z_axis(), Context.raw.gizmo_drag - Context.raw.gizmo_drag_last);
-					quat_mult_quats(Gizmo.q, Gizmo.q0, Gizmo.q);
-					mat4_compose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-				}
-				Context.raw.gizmo_drag_last = Context.raw.gizmo_drag;
-
-				if (Context.raw.material != Context.raw.layer.fill_layer) {
-					Context.set_material(Context.raw.layer.fill_layer);
-				}
-				base_update_fill_layer(Context.raw.gizmo_started);
-			}
-		}
-
-		Context.raw.gizmo_started = false;
-		if (mouse_started("left") && paint_object.name != "Scene") {
-			// Translate, scale
-			let trs: transform_t[] = [
-				Context.raw.gizmo_translate_x.transform,
-				Context.raw.gizmo_translate_y.transform,
-				Context.raw.gizmo_translate_z.transform,
-				Context.raw.gizmo_scale_x.transform,
-				Context.raw.gizmo_scale_y.transform,
-				Context.raw.gizmo_scale_z.transform
-			];
-			let hit: transform_t = raycast_closest_box_intersect(trs, mouse_view_x(), mouse_view_y(), scene_camera);
-			if (hit != null) {
-				if (hit.object == Context.raw.gizmo_translate_x) Context.raw.translate_x = true;
-				else if (hit.object == Context.raw.gizmo_translate_y) Context.raw.translate_y = true;
-				else if (hit.object == Context.raw.gizmo_translate_z) Context.raw.translate_z = true;
-				else if (hit.object == Context.raw.gizmo_scale_x) Context.raw.scale_x = true;
-				else if (hit.object == Context.raw.gizmo_scale_y) Context.raw.scale_y = true;
-				else if (hit.object == Context.raw.gizmo_scale_z) Context.raw.scale_z = true;
-				if (Context.raw.translate_x || Context.raw.translate_y || Context.raw.translate_z || Context.raw.scale_x || Context.raw.scale_y || Context.raw.scale_z) {
-					Context.raw.gizmo_offset = 0.0;
-					Context.raw.gizmo_started = true;
-				}
-			}
-			else {
-				// Rotate
-				let trs: transform_t[] = [
-					Context.raw.gizmo_rotate_x.transform,
-					Context.raw.gizmo_rotate_y.transform,
-					Context.raw.gizmo_rotate_z.transform
-				];
-				let hit: transform_t = raycast_closest_box_intersect(trs, mouse_view_x(), mouse_view_y(), scene_camera);
-				if (hit != null) {
-					if (hit.object == Context.raw.gizmo_rotate_x) Context.raw.rotate_x = true;
-					else if (hit.object == Context.raw.gizmo_rotate_y) Context.raw.rotate_y = true;
-					else if (hit.object == Context.raw.gizmo_rotate_z) Context.raw.rotate_z = true;
-					if (Context.raw.rotate_x || Context.raw.rotate_y || Context.raw.rotate_z) {
-						Context.raw.gizmo_offset = 0.0;
-						Context.raw.gizmo_started = true;
-					}
-				}
-			}
-		}
-		else if (mouse_released("left")) {
-			Context.raw.translate_x = Context.raw.translate_y = Context.raw.translate_z = false;
-			Context.raw.scale_x = Context.raw.scale_y = Context.raw.scale_z = false;
-			Context.raw.rotate_x = Context.raw.rotate_y = Context.raw.rotate_z = false;
-		}
-
-		if (Context.raw.translate_x || Context.raw.translate_y || Context.raw.translate_z || Context.raw.scale_x || Context.raw.scale_y || Context.raw.scale_z || Context.raw.rotate_x || Context.raw.rotate_y || Context.raw.rotate_z) {
-			Context.raw.rdirty = 2;
-
-			if (is_object) {
-				let t: transform_t = paint_object.transform;
-				vec4_set(Gizmo.v, transform_world_x(t), transform_world_y(t), transform_world_z(t));
-			}
-			else if (is_decal) {
-				vec4_set(Gizmo.v, Context.raw.layer.decal_mat.m[12], Context.raw.layer.decal_mat.m[13], Context.raw.layer.decal_mat.m[14]);
-			}
-
-			if (Context.raw.translate_x || Context.raw.scale_x) {
-				let hit: vec4_t = raycast_plane_intersect(vec4_y_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
-				if (hit != null) {
-					if (Context.raw.gizmo_started) Context.raw.gizmo_offset = hit.x - Gizmo.v.x;
-					Context.raw.gizmo_drag = hit.x - Context.raw.gizmo_offset;
-				}
-			}
-			else if (Context.raw.translate_y || Context.raw.scale_y) {
-				let hit: vec4_t = raycast_plane_intersect(vec4_x_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
-				if (hit != null) {
-					if (Context.raw.gizmo_started) Context.raw.gizmo_offset = hit.y - Gizmo.v.y;
-					Context.raw.gizmo_drag = hit.y - Context.raw.gizmo_offset;
-				}
-			}
-			else if (Context.raw.translate_z || Context.raw.scale_z) {
-				let hit: vec4_t = raycast_plane_intersect(vec4_x_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
-				if (hit != null) {
-					if (Context.raw.gizmo_started) Context.raw.gizmo_offset = hit.z - Gizmo.v.z;
-					Context.raw.gizmo_drag = hit.z - Context.raw.gizmo_offset;
-				}
-			}
-			else if (Context.raw.rotate_x) {
-				let hit: vec4_t = raycast_plane_intersect(vec4_x_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
-				if (hit != null) {
-					if (Context.raw.gizmo_started) {
-						mat4_decompose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-						Context.raw.gizmo_offset = Math.atan2(hit.y - Gizmo.v.y, hit.z - Gizmo.v.z);
-					}
-					Context.raw.gizmo_drag = Math.atan2(hit.y - Gizmo.v.y, hit.z - Gizmo.v.z) - Context.raw.gizmo_offset;
-				}
-			}
-			else if (Context.raw.rotate_y) {
-				let hit: vec4_t = raycast_plane_intersect(vec4_y_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
-				if (hit != null) {
-					if (Context.raw.gizmo_started) {
-						mat4_decompose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-						Context.raw.gizmo_offset = Math.atan2(hit.z - Gizmo.v.z, hit.x - Gizmo.v.x);
-					}
-					Context.raw.gizmo_drag = Math.atan2(hit.z - Gizmo.v.z, hit.x - Gizmo.v.x) - Context.raw.gizmo_offset;
-				}
-			}
-			else if (Context.raw.rotate_z) {
-				let hit: vec4_t = raycast_plane_intersect(vec4_z_axis(), Gizmo.v, mouse_view_x(), mouse_view_y(), scene_camera);
-				if (hit != null) {
-					if (Context.raw.gizmo_started) {
-						mat4_decompose(Context.raw.layer.decal_mat, Gizmo.v, Gizmo.q, Gizmo.v0);
-						Context.raw.gizmo_offset = Math.atan2(hit.y - Gizmo.v.y, hit.x - Gizmo.v.x);
-					}
-					Context.raw.gizmo_drag = Math.atan2(hit.y - Gizmo.v.y, hit.x - Gizmo.v.x) - Context.raw.gizmo_offset;
-				}
-			}
-
-			if (Context.raw.gizmo_started) Context.raw.gizmo_drag_last = Context.raw.gizmo_drag;
-
-			///if is_forge
-			UtilMesh.remove_merged_mesh();
-			RenderPathRaytrace.ready = false;
-			///end
-		}
-
-		_input_occupied = (Context.raw.translate_x || Context.raw.translate_y || Context.raw.translate_z || Context.raw.scale_x || Context.raw.scale_y || Context.raw.scale_z || Context.raw.rotate_x || Context.raw.rotate_y || Context.raw.rotate_z) && mouse_view_x() < base_w();
-	}
-}
-
-///end

+ 0 - 743
base/Sources/History.ts

@@ -1,743 +0,0 @@
-
-class History {
-
-	static steps: step_t[];
-	static undo_i: i32 = 0; // Undo layer
-	static undos: i32 = 0; // Undos available
-	static redos: i32 = 0; // Redos available
-	///if (is_paint || is_sculpt)
-	static push_undo: bool = false; // Store undo on next paint
-	static undo_layers: SlotLayerRaw[] = null;
-	///end
-	///if is_sculpt
-	static push_undo2: bool = false;
-	///end
-
-	static undo = () => {
-		if (History.undos > 0) {
-			let active: i32 = History.steps.length - 1 - History.redos;
-			let step: step_t = History.steps[active];
-
-			if (step.name == tr("Edit Nodes")) {
-				History.swap_canvas(step);
-			}
-
-			///if (is_paint || is_sculpt)
-			else if (step.name == tr("New Layer") || step.name == tr("New Black Mask") || step.name == tr("New White Mask") || step.name == tr("New Fill Mask")) {
-				Context.raw.layer = Project.layers[step.layer];
-				SlotLayer.delete(Context.raw.layer);
-				Context.raw.layer = Project.layers[step.layer > 0 ? step.layer - 1 : 0];
-			}
-			else if (step.name == tr("New Group")) {
-				Context.raw.layer = Project.layers[step.layer];
-				// The layer below is the only layer in the group. Its layer masks are automatically unparented, too.
-				Project.layers[step.layer - 1].parent = null;
-				SlotLayer.delete(Context.raw.layer);
-				Context.raw.layer = Project.layers[step.layer > 0 ? step.layer - 1 : 0];
-			}
-			else if (step.name == tr("Delete Layer")) {
-				let parent: SlotLayerRaw = step.layer_parent > 0 ? Project.layers[step.layer_parent - 1] : null;
-				let l: SlotLayerRaw = SlotLayer.create("", step.layer_type, parent);
-				Project.layers.splice(step.layer, 0, l);
-				Context.set_layer(l);
-				History.undo_i = History.undo_i - 1 < 0 ? Config.raw.undo_steps - 1 : History.undo_i - 1;
-				let lay: SlotLayerRaw = History.undo_layers[History.undo_i];
-				SlotLayer.swap(l, lay);
-				l.mask_opacity = step.layer_opacity;
-				l.blending = step.layer_blending;
-				l.object_mask = step.layer_object;
-				MakeMaterial.parse_mesh_material();
-
-				// Undo at least second time in order to avoid empty groups
-				if (step.layer_type == layer_slot_type_t.GROUP) {
-					base_notify_on_next_frame(() => {
-						// 1. Undo deleting group masks
-						let n: i32 = 1;
-						while (History.steps[active - n].layer_type == layer_slot_type_t.MASK) {
-							History.undo();
-							++n;
-						}
-						// 2. Undo a mask to have a non empty group
-						History.undo();
-					});
-				}
-			}
-			else if (step.name == tr("Clear Layer")) {
-				History.undo_i = History.undo_i - 1 < 0 ? Config.raw.undo_steps - 1 : History.undo_i - 1;
-				let lay: SlotLayerRaw = History.undo_layers[History.undo_i];
-				SlotLayer.swap(Context.raw.layer, lay);
-				Context.raw.layer_preview_dirty = true;
-			}
-			else if (step.name == tr("Duplicate Layer")) {
-				let children: SlotLayerRaw[] = SlotLayer.get_recursive_children(Project.layers[step.layer]);
-				let position: i32 = step.layer + 1;
-				if (children != null)
-					position += children.length;
-
-				Context.raw.layer = Project.layers[position];
-				SlotLayer.delete(Context.raw.layer);
-			}
-			else if (step.name == tr("Order Layers")) {
-				let target: SlotLayerRaw = Project.layers[step.prev_order];
-				Project.layers[step.prev_order] = Project.layers[step.layer];
-				Project.layers[step.layer] = target;
-			}
-			else if (step.name == tr("Merge Layers")) {
-				Context.raw.layer = Project.layers[step.layer];
-				SlotLayer.delete(Context.raw.layer);
-
-				let parent: SlotLayerRaw = step.layer_parent > 0 ? Project.layers[step.layer_parent - 2] : null;
-				let l: SlotLayerRaw = SlotLayer.create("", step.layer_type, parent);
-				Project.layers.splice(step.layer, 0, l);
-				Context.set_layer(l);
-
-				History.undo_i = History.undo_i - 1 < 0 ? Config.raw.undo_steps - 1 : History.undo_i - 1;
-				let lay: SlotLayerRaw = History.undo_layers[History.undo_i];
-				SlotLayer.swap(Context.raw.layer, lay);
-
-				l = SlotLayer.create("", step.layer_type, parent);
-				Project.layers.splice(step.layer + 1, 0, l);
-				Context.set_layer(l);
-
-				History.undo_i = History.undo_i - 1 < 0 ? Config.raw.undo_steps - 1 : History.undo_i - 1;
-				lay = History.undo_layers[History.undo_i];
-				SlotLayer.swap(Context.raw.layer, lay);
-
-				Context.raw.layer.mask_opacity = step.layer_opacity;
-				Context.raw.layer.blending = step.layer_blending;
-				Context.raw.layer.object_mask = step.layer_object;
-				Context.raw.layers_preview_dirty = true;
-				MakeMaterial.parse_mesh_material();
-			}
-			else if (step.name == tr("Apply Mask")) {
-				// First restore the layer(s)
-				let mask_pos: i32 = step.layer;
-				let current_layer: SlotLayerRaw = null;
-				// The layer at the old mask position is a mask, i.e. the layer had multiple masks before.
-				if (SlotLayer.is_mask(Project.layers[mask_pos])) {
-					current_layer = Project.layers[mask_pos].parent;
-				}
-				else if (SlotLayer.is_layer(Project.layers[mask_pos]) || SlotLayer.is_group(Project.layers[mask_pos])) {
-					current_layer = Project.layers[mask_pos];
-				}
-
-				let layers_to_restore: SlotLayerRaw[] = SlotLayer.is_group(current_layer) ? SlotLayer.get_children(current_layer) : [current_layer];
-				layers_to_restore.reverse();
-
-				for (let layer of layers_to_restore) {
-					// Replace the current layer's content with the old one
-					Context.raw.layer = layer;
-					History.undo_i = History.undo_i - 1 < 0 ? Config.raw.undo_steps - 1 : History.undo_i - 1;
-					let old_layer: SlotLayerRaw = History.undo_layers[History.undo_i];
-					SlotLayer.swap(Context.raw.layer, old_layer);
-				}
-
-				// Now restore the applied mask
-				History.undo_i = History.undo_i - 1 < 0 ? Config.raw.undo_steps - 1 : History.undo_i - 1;
-				let mask: SlotLayerRaw = History.undo_layers[History.undo_i];
-				base_new_mask(false, current_layer, mask_pos);
-				SlotLayer.swap(Context.raw.layer, mask);
-				Context.raw.layers_preview_dirty = true;
-				Context.set_layer(Context.raw.layer);
-			}
-			else if (step.name == tr("Invert Mask")) {
-				let _next = () => {
-					Context.raw.layer = Project.layers[step.layer];
-					SlotLayer.invert_mask(Context.raw.layer);
-				}
-				app_notify_on_init(_next);
-			}
-			else if (step.name == "Apply Filter") {
-				History.undo_i = History.undo_i - 1 < 0 ? Config.raw.undo_steps - 1 : History.undo_i - 1;
-				let lay: SlotLayerRaw = History.undo_layers[History.undo_i];
-				Context.set_layer(Project.layers[step.layer]);
-				SlotLayer.swap(Context.raw.layer, lay);
-				base_new_mask(false, Context.raw.layer);
-				SlotLayer.swap(Context.raw.layer, lay);
-				Context.raw.layer_preview_dirty = true;
-			}
-			else if (step.name == tr("To Fill Layer") || step.name == tr("To Fill Mask")) {
-				SlotLayer.to_paint_layer(Context.raw.layer);
-				History.undo_i = History.undo_i - 1 < 0 ? Config.raw.undo_steps - 1 : History.undo_i - 1;
-				let lay: SlotLayerRaw = History.undo_layers[History.undo_i];
-				SlotLayer.swap(Context.raw.layer, lay);
-			}
-			else if (step.name == tr("To Paint Layer") || step.name == tr("To Paint Mask")) {
-				History.undo_i = History.undo_i - 1 < 0 ? Config.raw.undo_steps - 1 : History.undo_i - 1;
-				let lay: SlotLayerRaw = History.undo_layers[History.undo_i];
-				SlotLayer.swap(Context.raw.layer, lay);
-				Context.raw.layer.fill_layer = Project.materials[step.material];
-			}
-			else if (step.name == tr("Layer Opacity")) {
-				Context.set_layer(Project.layers[step.layer]);
-				let t: f32 = Context.raw.layer.mask_opacity;
-				Context.raw.layer.mask_opacity = step.layer_opacity;
-				step.layer_opacity = t;
-				MakeMaterial.parse_mesh_material();
-			}
-			else if (step.name == tr("Layer Blending")) {
-				Context.set_layer(Project.layers[step.layer]);
-				let t: blend_type_t = Context.raw.layer.blending;
-				Context.raw.layer.blending = step.layer_blending;
-				step.layer_blending = t;
-				MakeMaterial.parse_mesh_material();
-			}
-			else if (step.name == tr("Delete Node Group")) {
-				Project.material_groups.splice(step.canvas_group, 0, { canvas: null, nodes: zui_nodes_create() });
-				History.swap_canvas(step);
-			}
-			else if (step.name == tr("New Material")) {
-				Context.raw.material = Project.materials[step.material];
-				step.canvas = Context.raw.material.canvas;
-				SlotMaterial.delete(Context.raw.material);
-			}
-			else if (step.name == tr("Delete Material")) {
-				Context.raw.material = SlotMaterial.create(Project.materials[0].data);
-				Project.materials.splice(step.material, 0, Context.raw.material);
-				Context.raw.material.canvas = step.canvas;
-				UINodes.canvas_changed();
-				UINodes.hwnd.redraws = 2;
-			}
-			else if (step.name == tr("Duplicate Material")) {
-				Context.raw.material = Project.materials[step.material];
-				step.canvas = Context.raw.material.canvas;
-				SlotMaterial.delete(Context.raw.material);
-			}
-			else { // Paint operation
-				History.undo_i = History.undo_i - 1 < 0 ? Config.raw.undo_steps - 1 : History.undo_i - 1;
-				let lay: SlotLayerRaw = History.undo_layers[History.undo_i];
-				Context.select_paint_object(Project.paint_objects[step.object]);
-				Context.set_layer(Project.layers[step.layer]);
-				SlotLayer.swap(Context.raw.layer, lay);
-				Context.raw.layer_preview_dirty = true;
-			}
-			///end
-
-			History.undos--;
-			History.redos++;
-			Context.raw.ddirty = 2;
-
-			///if (is_paint || is_sculpt)
-			UIBase.hwnds[tab_area_t.SIDEBAR0].redraws = 2;
-			UIBase.hwnds[tab_area_t.SIDEBAR1].redraws = 2;
-			if (UIView2D.show) {
-				UIView2D.hwnd.redraws = 2;
-			}
-
-			if (Config.raw.touch_ui) {
-				// Refresh undo & redo buttons
-				UIMenubar.menu_handle.redraws = 2;
-			}
-			///end
-		}
-	}
-
-	static redo = () => {
-		if (History.redos > 0) {
-			let active: i32 = History.steps.length - History.redos;
-			let step: step_t = History.steps[active];
-
-			if (step.name == tr("Edit Nodes")) {
-				History.swap_canvas(step);
-			}
-
-			///if (is_paint || is_sculpt)
-			else if (step.name == tr("New Layer") || step.name == tr("New Black Mask") || step.name == tr("New White Mask") || step.name == tr("New Fill Mask")) {
-				let parent: SlotLayerRaw = step.layer_parent > 0 ? Project.layers[step.layer_parent - 1] : null;
-				let l: SlotLayerRaw = SlotLayer.create("", step.layer_type, parent);
-				Project.layers.splice(step.layer, 0, l);
-				if (step.name == tr("New Black Mask")) {
-					base_notify_on_next_frame(() => {
-						SlotLayer.clear(l, 0x00000000);
-					});
-				}
-				else if (step.name == tr("New White Mask")) {
-					base_notify_on_next_frame(() => {
-						SlotLayer.clear(l, 0xffffffff);
-					});
-				}
-				else if (step.name == tr("New Fill Mask")) {
-					base_notify_on_next_frame(() => {
-						Context.raw.material = Project.materials[step.material];
-						SlotLayer.to_fill_layer(l);
-					});
-				}
-				Context.raw.layer_preview_dirty = true;
-				Context.set_layer(l);
-			}
-			else if (step.name == tr("New Group")) {
-				let l: SlotLayerRaw = Project.layers[step.layer - 1];
-				let group: SlotLayerRaw = base_new_group();
-				array_remove(Project.layers, group);
-				Project.layers.splice(step.layer, 0, group);
-				l.parent = group;
-				Context.set_layer(group);
-			}
-			else if (step.name == tr("Delete Layer")) {
-				Context.raw.layer = Project.layers[step.layer];
-				History.swap_active();
-				SlotLayer.delete(Context.raw.layer);
-
-				// Redoing the last delete would result in an empty group
-				// Redo deleting all group masks + the group itself
-				if (step.layer_type == layer_slot_type_t.LAYER && History.steps.length >= active + 2 && (History.steps[active + 1].layer_type == layer_slot_type_t.GROUP || History.steps[active + 1].layer_type == layer_slot_type_t.MASK)) {
-					let n: i32 = 1;
-					while (History.steps[active + n].layer_type == layer_slot_type_t.MASK) {
-						++n;
-					}
-					base_notify_on_next_frame(() => {
-						for (let i: i32 = 0; i < n; ++i) History.redo();
-					});
-				}
-			}
-			else if (step.name == tr("Clear Layer")) {
-				Context.raw.layer = Project.layers[step.layer];
-				History.swap_active();
-				SlotLayer.clear(Context.raw.layer);
-				Context.raw.layer_preview_dirty = true;
-			}
-			else if (step.name == tr("Duplicate Layer")) {
-				Context.raw.layer = Project.layers[step.layer];
-				let _next = () => {
-					base_duplicate_layer(Context.raw.layer);
-				}
-				base_notify_on_next_frame(_next);
-			}
-			else if (step.name == tr("Order Layers")) {
-				let target: SlotLayerRaw = Project.layers[step.prev_order];
-				Project.layers[step.prev_order] = Project.layers[step.layer];
-				Project.layers[step.layer] = target;
-			}
-			else if (step.name == tr("Merge Layers")) {
-				Context.raw.layer = Project.layers[step.layer + 1];
-				app_notify_on_init(History.redo_merge_layers);
-				app_notify_on_init(base_merge_down);
-			}
-			else if (step.name == tr("Apply Mask")) {
-				Context.raw.layer = Project.layers[step.layer];
-					if (SlotLayer.is_group_mask(Context.raw.layer)) {
-						let group: SlotLayerRaw = Context.raw.layer.parent;
-						let layers: SlotLayerRaw[] = SlotLayer.get_children(group);
-						layers.splice(0, 0, Context.raw.layer);
-						History.copy_merging_layers2(layers);
-					}
-					else History.copy_merging_layers2([Context.raw.layer, Context.raw.layer.parent]);
-
-				let _next = () => {
-					SlotLayer.apply_mask(Context.raw.layer);
-					Context.set_layer(Context.raw.layer);
-					Context.raw.layers_preview_dirty = true;
-				}
-				base_notify_on_next_frame(_next);
-			}
-			else if (step.name == tr("Invert Mask")) {
-				let _next = () => {
-					Context.raw.layer = Project.layers[step.layer];
-					SlotLayer.invert_mask(Context.raw.layer);
-				}
-				app_notify_on_init(_next);
-			}
-			else if (step.name == tr("Apply Filter")) {
-				let lay: SlotLayerRaw = History.undo_layers[History.undo_i];
-				Context.set_layer(Project.layers[step.layer]);
-				SlotLayer.swap(Context.raw.layer, lay);
-				base_new_mask(false, lay);
-				SlotLayer.swap(Context.raw.layer, lay);
-				Context.raw.layer_preview_dirty = true;
-				History.undo_i = (History.undo_i + 1) % Config.raw.undo_steps;
-			}
-			else if (step.name == tr("To Fill Layer") || step.name == tr("To Fill Mask")) {
-				let lay: SlotLayerRaw = History.undo_layers[History.undo_i];
-				SlotLayer.swap(Context.raw.layer, lay);
-				Context.raw.layer.fill_layer = Project.materials[step.material];
-				History.undo_i = (History.undo_i + 1) % Config.raw.undo_steps;
-			}
-			else if (step.name == tr("To Paint Layer") || step.name == tr("To Paint Mask")) {
-				SlotLayer.to_paint_layer(Context.raw.layer);
-				let lay: SlotLayerRaw = History.undo_layers[History.undo_i];
-				SlotLayer.swap(Context.raw.layer, lay);
-				History.undo_i = (History.undo_i + 1) % Config.raw.undo_steps;
-			}
-			else if (step.name == tr("Layer Opacity")) {
-				Context.set_layer(Project.layers[step.layer]);
-				let t: f32 = Context.raw.layer.mask_opacity;
-				Context.raw.layer.mask_opacity = step.layer_opacity;
-				step.layer_opacity = t;
-				MakeMaterial.parse_mesh_material();
-			}
-			else if (step.name == tr("Layer Blending")) {
-				Context.set_layer(Project.layers[step.layer]);
-				let t: blend_type_t = Context.raw.layer.blending;
-				Context.raw.layer.blending = step.layer_blending;
-				step.layer_blending = t;
-				MakeMaterial.parse_mesh_material();
-			}
-			else if (step.name == tr("Delete Node Group")) {
-				History.swap_canvas(step);
-				array_remove(Project.material_groups, Project.material_groups[step.canvas_group]);
-			}
-			else if (step.name == tr("New Material")) {
-				Context.raw.material = SlotMaterial.create(Project.materials[0].data);
-				Project.materials.splice(step.material, 0, Context.raw.material);
-				Context.raw.material.canvas = step.canvas;
-				UINodes.canvas_changed();
-				UINodes.hwnd.redraws = 2;
-			}
-			else if (step.name == tr("Delete Material")) {
-				Context.raw.material = Project.materials[step.material];
-				step.canvas = Context.raw.material.canvas;
-				SlotMaterial.delete(Context.raw.material);
-			}
-			else if (step.name == tr("Duplicate Material")) {
-				Context.raw.material = SlotMaterial.create(Project.materials[0].data);
-				Project.materials.splice(step.material, 0, Context.raw.material);
-				Context.raw.material.canvas = step.canvas;
-				UINodes.canvas_changed();
-				UINodes.hwnd.redraws = 2;
-			}
-			else { // Paint operation
-				let lay: SlotLayerRaw = History.undo_layers[History.undo_i];
-				Context.select_paint_object(Project.paint_objects[step.object]);
-				Context.set_layer(Project.layers[step.layer]);
-				SlotLayer.swap(Context.raw.layer, lay);
-				Context.raw.layer_preview_dirty = true;
-				History.undo_i = (History.undo_i + 1) % Config.raw.undo_steps;
-			}
-			///end
-
-			History.undos++;
-			History.redos--;
-			Context.raw.ddirty = 2;
-
-			///if (is_paint || is_sculpt)
-			UIBase.hwnds[tab_area_t.SIDEBAR0].redraws = 2;
-			UIBase.hwnds[tab_area_t.SIDEBAR1].redraws = 2;
-			if (UIView2D.show) UIView2D.hwnd.redraws = 2;
-
-			if (Config.raw.touch_ui) {
-				// Refresh undo & redo buttons
-				UIMenubar.menu_handle.redraws = 2;
-			}
-			///end
-		}
-	}
-
-	static reset = () => {
-		///if (is_paint || is_sculpt)
-		History.steps = [{name: tr("New"), layer: 0, layer_type: layer_slot_type_t.LAYER, layer_parent: -1, object: 0, material: 0, brush: 0}];
-		///end
-		///if is_lab
-		History.steps = [{name: tr("New")}];
-		///end
-
-		History.undos = 0;
-		History.redos = 0;
-		History.undo_i = 0;
-	}
-
-	///if (is_paint || is_sculpt)
-	static edit_nodes = (canvas: zui_node_canvas_t, canvas_type: i32, canvas_group: Null<i32> = null) => {
-	///end
-	///if is_lab
-	static edit_nodes = (canvas: zui_node_canvas_t, canvas_group: Null<i32> = null) => {
-	///end
-		let step: step_t = History.push(tr("Edit Nodes"));
-		step.canvas_group = canvas_group;
-		///if (is_paint || is_sculpt)
-		step.canvas_type = canvas_type;
-		///end
-		step.canvas = JSON.parse(JSON.stringify(canvas));
-	}
-
-	///if (is_paint || is_sculpt)
-	static paint = () => {
-		let is_mask: bool = SlotLayer.is_mask(Context.raw.layer);
-		History.copy_to_undo(Context.raw.layer.id, History.undo_i, is_mask);
-
-		History.push_undo = false;
-		History.push(tr(UIToolbar.tool_names[Context.raw.tool]));
-	}
-
-	static new_layer = () => {
-		History.push(tr("New Layer"));
-	}
-
-	static new_black_mask = () => {
-		History.push(tr("New Black Mask"));
-	}
-
-	static new_white_mask = () => {
-		History.push(tr("New White Mask"));
-	}
-
-	static new_fill_mask = () => {
-		History.push(tr("New Fill Mask"));
-	}
-
-	static new_group = () => {
-		History.push(tr("New Group"));
-	}
-
-	static duplicate_layer = () => {
-		History.push(tr("Duplicate Layer"));
-	}
-
-	static delete_layer = () => {
-		History.swap_active();
-		History.push(tr("Delete Layer"));
-	}
-
-	static clear_layer = () => {
-		History.swap_active();
-		History.push(tr("Clear Layer"));
-	}
-
-	static order_layers = (prevOrder: i32) => {
-		let step: step_t = History.push(tr("Order Layers"));
-		step.prev_order = prevOrder;
-	}
-
-	static merge_layers = () => {
-		History.copy_merging_layers();
-
-		let step: step_t = History.push(tr("Merge Layers"));
-		step.layer -= 1; // Merge down
-		if (SlotLayer.has_masks(Context.raw.layer)) {
-			step.layer -= SlotLayer.get_masks(Context.raw.layer).length;
-		}
-		History.steps.shift(); // Merge consumes 2 steps
-		History.undos--;
-		// TODO: use undo layer in app_merge_down to save memory
-	}
-
-	static apply_mask = () => {
-		if (SlotLayer.is_group_mask(Context.raw.layer)) {
-			let group: SlotLayerRaw = Context.raw.layer.parent;
-			let layers: SlotLayerRaw[] = SlotLayer.get_children(group);
-			layers.splice(0, 0, Context.raw.layer);
-			History.copy_merging_layers2(layers);
-		}
-		else History.copy_merging_layers2([Context.raw.layer, Context.raw.layer.parent]);
-		History.push(tr("Apply Mask"));
-	}
-
-
-	static invert_mask = () => {
-		History.push(tr("Invert Mask"));
-	}
-
-	static apply_filter = () => {
-		History.copy_to_undo(Context.raw.layer.id, History.undo_i, true);
-		History.push(tr("Apply Filter"));
-	}
-
-	static to_fill_layer = () => {
-		History.copy_to_undo(Context.raw.layer.id, History.undo_i, false);
-		History.push(tr("To Fill Layer"));
-	}
-
-	static to_fill_mask = () => {
-		History.copy_to_undo(Context.raw.layer.id, History.undo_i, true);
-		History.push(tr("To Fill Mask"));
-	}
-
-	static to_paint_layer = () => {
-		History.copy_to_undo(Context.raw.layer.id, History.undo_i, false);
-		History.push(tr("To Paint Layer"));
-	}
-
-	static to_paint_mask = () => {
-		History.copy_to_undo(Context.raw.layer.id, History.undo_i, true);
-		History.push(tr("To Paint Mask"));
-	}
-
-	static layer_opacity = () => {
-		History.push(tr("Layer Opacity"));
-	}
-
-	// static layer_object = () => {
-	// 	History.push("Layer Object");
-	// }
-
-	static layer_blending = () => {
-		History.push(tr("Layer Blending"));
-	}
-
-	static new_material = () => {
-		let step: step_t = History.push(tr("New Material"));
-		step.canvas_type = 0;
-		step.canvas = JSON.parse(JSON.stringify(Context.raw.material.canvas));
-	}
-
-	static delete_material = () => {
-		let step: step_t = History.push(tr("Delete Material"));
-		step.canvas_type = 0;
-		step.canvas = JSON.parse(JSON.stringify(Context.raw.material.canvas));
-	}
-
-	static duplicate_material = () => {
-		let step: step_t = History.push(tr("Duplicate Material"));
-		step.canvas_type = 0;
-		step.canvas = JSON.parse(JSON.stringify(Context.raw.material.canvas));
-	}
-
-	static delete_material_group = (group: node_group_t) => {
-		let step: step_t = History.push(tr("Delete Node Group"));
-		step.canvas_type = canvas_type_t.MATERIAL;
-		step.canvas_group = Project.material_groups.indexOf(group);
-		step.canvas = JSON.parse(JSON.stringify(group.canvas));
-	}
-	///end
-
-	static push = (name: string): step_t => {
-		///if (krom_windows || krom_linux || krom_darwin)
-		let filename: string = Project.filepath == "" ? UIFiles.filename : Project.filepath.substring(Project.filepath.lastIndexOf(Path.sep) + 1, Project.filepath.length - 4);
-		sys_title_set(filename + "* - " + manifest_title);
-		///end
-
-		if (Config.raw.touch_ui) {
-			// Refresh undo & redo buttons
-			UIMenubar.menu_handle.redraws = 2;
-		}
-
-		if (History.undos < Config.raw.undo_steps) History.undos++;
-		if (History.redos > 0) {
-			for (let i: i32 = 0; i < History.redos; ++i) History.steps.pop();
-			History.redos = 0;
-		}
-
-		///if (is_paint || is_sculpt)
-		let opos: i32 = Project.paint_objects.indexOf(Context.raw.paint_object);
-		let lpos: i32 = Project.layers.indexOf(Context.raw.layer);
-		let mpos: i32 = Project.materials.indexOf(Context.raw.material);
-		let bpos: i32 = Project.brushes.indexOf(Context.raw.brush);
-
-		History.steps.push({
-			name: name,
-			layer: lpos,
-			layer_type: SlotLayer.is_mask(Context.raw.layer) ? layer_slot_type_t.MASK : SlotLayer.is_group(Context.raw.layer) ? layer_slot_type_t.GROUP : layer_slot_type_t.LAYER,
-			layer_parent: Context.raw.layer.parent == null ? -1 : Project.layers.indexOf(Context.raw.layer.parent),
-			object: opos,
-			material: mpos,
-			brush: bpos,
-			layer_opacity: Context.raw.layer.mask_opacity,
-			layer_object: Context.raw.layer.object_mask,
-			layer_blending: Context.raw.layer.blending
-		});
-		///end
-
-		///if is_lab
-		History.steps.push({
-			name: name
-		});
-		///end
-
-		while (History.steps.length > Config.raw.undo_steps + 1) History.steps.shift();
-		return History.steps[History.steps.length - 1];
-	}
-
-	///if (is_paint || is_sculpt)
-	static redo_merge_layers = () => {
-		History.copy_merging_layers();
-	}
-
-	static copy_merging_layers = () => {
-		let lay: SlotLayerRaw = Context.raw.layer;
-		History.copy_to_undo(lay.id, History.undo_i, SlotLayer.is_mask(Context.raw.layer));
-
-		let below: i32 = Project.layers.indexOf(lay) - 1;
-		lay = Project.layers[below];
-		History.copy_to_undo(lay.id, History.undo_i, SlotLayer.is_mask(Context.raw.layer));
-	}
-
-	static copy_merging_layers2 = (layers: SlotLayerRaw[]) => {
-		for (let layer of layers)
-		History.copy_to_undo(layer.id, History.undo_i, SlotLayer.is_mask(layer));
-	}
-
-	static swap_active = () => {
-		let undo_layer: SlotLayerRaw = History.undo_layers[History.undo_i];
-		SlotLayer.swap(undo_layer, Context.raw.layer);
-		History.undo_i = (History.undo_i + 1) % Config.raw.undo_steps;
-	}
-
-	static copy_to_undo = (fromId: i32, toId: i32, isMask: bool) => {
-
-		///if is_sculpt
-		isMask = true;
-		///end
-
-		if (isMask) {
-			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 {
-			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.undo_i = (History.undo_i + 1) % Config.raw.undo_steps;
-	}
-	///end
-
-	static get_canvas_owner = (step: step_t): any => {
-		///if (is_paint || is_sculpt)
-		return step.canvas_group == null ?
-			Project.materials[step.material] :
-			Project.material_groups[step.canvas_group];
-		///end
-
-		///if is_lab
-		return null;
-		///end
-	}
-
-	static swap_canvas = (step: step_t) => {
-		///if (is_paint || is_sculpt)
-		if (step.canvas_type == 0) {
-			let _canvas: zui_node_canvas_t = History.get_canvas_owner(step).canvas;
-			History.get_canvas_owner(step).canvas = step.canvas;
-			step.canvas = _canvas;
-			Context.raw.material = Project.materials[step.material];
-		}
-		else {
-			let _canvas: zui_node_canvas_t = Project.brushes[step.brush].canvas;
-			Project.brushes[step.brush].canvas = step.canvas;
-			step.canvas = _canvas;
-			Context.raw.brush = Project.brushes[step.brush];
-		}
-		///end
-
-		///if is_lab
-		let _canvas: zui_node_canvas_t = History.get_canvas_owner(step).canvas;
-		History.get_canvas_owner(step).canvas = step.canvas;
-		step.canvas = _canvas;
-		///end
-
-		UINodes.canvas_changed();
-		UINodes.hwnd.redraws = 2;
-	}
-}
-
-type step_t = {
-	name?: string;
-	canvas?: zui_node_canvas_t; // Node history
-	canvas_group?: i32;
-	///if (is_paint || is_sculpt)
-	layer?: i32;
-	layer_type?: layer_slot_type_t;
-	layer_parent?: i32;
-	object?: i32;
-	material?: i32;
-	brush?: i32;
-	layer_opacity?: f32;
-	layer_object?: i32;
-	layer_blending?: i32;
-	prev_order?: i32; // Previous layer position
-	canvas_type?: i32;
-	///end
-};

+ 103 - 103
base/Sources/ImportArm.ts

@@ -23,17 +23,17 @@ class ImportArm {
 		}
 
 		let import_as_mesh: bool = project.version == null;
-		Context.raw.layers_preview_dirty = true;
-		Context.raw.layer_filter = 0;
+		context_raw.layers_preview_dirty = true;
+		context_raw.layer_filter = 0;
 		///end
 
 		///if is_lab
 		let import_as_mesh: bool = true;
 		///end
 
-		Project.project_new(import_as_mesh);
-		Project.filepath = path;
-		UIFiles.filename = path.substring(path.lastIndexOf(Path.sep) + 1, path.lastIndexOf("."));
+		project_new(import_as_mesh);
+		project_filepath = path;
+		UIFiles.filename = path.substring(path.lastIndexOf(path_sep) + 1, path.lastIndexOf("."));
 		///if (krom_android || krom_ios)
 		sys_title_set(UIFiles.filename);
 		///else
@@ -54,38 +54,38 @@ class ImportArm {
 		///else
 		let recent_path: string = path;
 		///end
-		let recent: string[] = Config.raw.recent_projects;
+		let recent: string[] = config_raw.recent_projects;
 		array_remove(recent, recent_path);
 		recent.unshift(recent_path);
-		Config.save();
+		config_save();
 
-		Project.raw = project;
+		project_raw = project;
 
 		///if (is_paint || is_sculpt)
 		let l0: layer_data_t = project.layer_datas[0];
-		base_res_handle.position = Config.get_texture_res_pos(l0.res);
+		base_res_handle.position = config_get_texture_res_pos(l0.res);
 		let bits_pos: texture_bits_t = l0.bpp == 8 ? texture_bits_t.BITS8 : l0.bpp == 16 ? texture_bits_t.BITS16 : texture_bits_t.BITS32;
 		base_bits_handle.position = bits_pos;
 		let bytes_per_pixel: i32 = Math.floor(l0.bpp / 8);
 		let format: tex_format_t = l0.bpp == 8 ? tex_format_t.RGBA32 : l0.bpp == 16 ? tex_format_t.RGBA64 : tex_format_t.RGBA128;
 		///end
 
-		let base: string = Path.base_dir(path);
-		if (Project.raw.envmap != null) {
-			Project.raw.envmap = data_is_abs(Project.raw.envmap) ? Project.raw.envmap : base + Project.raw.envmap;
+		let base: string = path_base_dir(path);
+		if (project_raw.envmap != null) {
+			project_raw.envmap = data_is_abs(project_raw.envmap) ? project_raw.envmap : base + project_raw.envmap;
 		}
-		if (Project.raw.envmap_strength != null) {
-			scene_world.strength = Project.raw.envmap_strength;
+		if (project_raw.envmap_strength != null) {
+			scene_world.strength = project_raw.envmap_strength;
 		}
-		if (Project.raw.camera_world != null) {
-			scene_camera.base.transform.local = mat4_from_f32_array(Project.raw.camera_world);
+		if (project_raw.camera_world != null) {
+			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;
+			scene_camera.data.fov = project_raw.camera_fov;
 			camera_object_build_proj(scene_camera);
-			let origin: Float32Array = Project.raw.camera_origin;
-			Camera.origins[0].x = origin[0];
-			Camera.origins[0].y = origin[1];
-			Camera.origins[0].z = origin[2];
+			let origin: Float32Array = project_raw.camera_origin;
+			camera_origins[0].x = origin[0];
+			camera_origins[0].y = origin[1];
+			camera_origins[0].z = origin[2];
 		}
 
 		for (let file of project.assets) {
@@ -97,13 +97,13 @@ class ImportArm {
 			// Convert image path from relative to absolute
 			let abs: string = data_is_abs(file) ? file : base + file;
 			if (project.packed_assets != null) {
-				abs = Path.normalize(abs);
+				abs = path_normalize(abs);
 				ImportArm.unpack_asset(project, abs, file);
 			}
-			if (data_cached_images.get(abs) == null && !File.exists(abs)) {
+			if (data_cached_images.get(abs) == null && !file_exists(abs)) {
 				ImportArm.make_pink(abs);
 			}
-			let hdr_as_envmap: bool = abs.endsWith(".hdr") && Project.raw.envmap == abs;
+			let hdr_as_envmap: bool = abs.endsWith(".hdr") && project_raw.envmap == abs;
 			ImportTexture.run(abs, hdr_as_envmap);
 		}
 
@@ -117,7 +117,7 @@ class ImportArm {
 				///end
 				// Convert font path from relative to absolute
 				let abs: string = data_is_abs(file) ? file : base + file;
-				if (File.exists(abs)) {
+				if (file_exists(abs)) {
 					ImportFont.run(abs);
 				}
 			}
@@ -132,66 +132,66 @@ class ImportArm {
 		let md: mesh_data_t = mesh_data_create(project.mesh_data);
 		///end
 
-		mesh_object_set_data(Context.raw.paint_object, md);
-		vec4_set(Context.raw.paint_object.base.transform.scale, 1, 1, 1);
-		transform_build_matrix(Context.raw.paint_object.base.transform);
-		Context.raw.paint_object.base.name = md.name;
-		Project.paint_objects = [Context.raw.paint_object];
+		mesh_object_set_data(context_raw.paint_object, md);
+		vec4_set(context_raw.paint_object.base.transform.scale, 1, 1, 1);
+		transform_build_matrix(context_raw.paint_object.base.transform);
+		context_raw.paint_object.base.name = md.name;
+		project_paint_objects = [context_raw.paint_object];
 
 		///if (is_paint || is_sculpt)
 		for (let i: i32 = 1; i < project.mesh_datas.length; ++i) {
 			let raw: mesh_data_t = project.mesh_datas[i];
 			let md: mesh_data_t = mesh_data_create(raw);
-			let object: mesh_object_t = scene_add_mesh_object(md, Context.raw.paint_object.materials, Context.raw.paint_object.base);
+			let object: mesh_object_t = scene_add_mesh_object(md, context_raw.paint_object.materials, context_raw.paint_object.base);
 			object.base.name = md.name;
 			object.skip_context = "paint";
-			Project.paint_objects.push(object);
+			project_paint_objects.push(object);
 		}
 
 		if (project.mesh_assets != null && project.mesh_assets.length > 0) {
 			let file: string = project.mesh_assets[0];
 			let abs: string = data_is_abs(file) ? file : base + file;
-			Project.mesh_assets = [abs];
+			project_mesh_assets = [abs];
 		}
 
 		///if is_paint
-		if (project.atlas_objects != null) Project.atlas_objects = project.atlas_objects;
-		if (project.atlas_names != null) Project.atlas_names = project.atlas_names;
+		if (project.atlas_objects != null) project_atlas_objects = project.atlas_objects;
+		if (project.atlas_names != null) project_atlas_names = project.atlas_names;
 		///end
 
 		// No mask by default
-		if (Context.raw.merged_object == null) UtilMesh.merge_mesh();
+		if (context_raw.merged_object == null) UtilMesh.merge_mesh();
 		///end
 
-		Context.select_paint_object(Context.main_object());
-		Viewport.scale_to_bounds();
-		Context.raw.paint_object.skip_context = "paint";
-		Context.raw.merged_object.base.visible = true;
+		context_select_paint_object(context_main_object());
+		viewport_scale_to_bounds();
+		context_raw.paint_object.skip_context = "paint";
+		context_raw.merged_object.base.visible = true;
 
 		///if (is_paint || is_sculpt)
-		let tex: image_t = Project.layers[0].texpaint;
-		if (tex.width != Config.get_texture_res_x() || tex.height != Config.get_texture_res_y()) {
-			if (History.undo_layers != null) for (let l of History.undo_layers) SlotLayer.resize_and_set_bits(l);
+		let tex: image_t = project_layers[0].texpaint;
+		if (tex.width != config_get_texture_res_x() || tex.height != config_get_texture_res_y()) {
+			if (history_undo_layers != null) for (let l of history_undo_layers) SlotLayer.resize_and_set_bits(l);
 			let rts: map_t<string, render_target_t> = render_path_render_targets;
 			let _texpaint_blend0: image_t = rts.get("texpaint_blend0")._image;
 			base_notify_on_next_frame(() => {
 				image_unload(_texpaint_blend0);
 			});
-			rts.get("texpaint_blend0").width = Config.get_texture_res_x();
-			rts.get("texpaint_blend0").height = Config.get_texture_res_y();
-			rts.get("texpaint_blend0")._image = image_create_render_target(Config.get_texture_res_x(), Config.get_texture_res_y(), tex_format_t.R8, depth_format_t.NO_DEPTH);
+			rts.get("texpaint_blend0").width = config_get_texture_res_x();
+			rts.get("texpaint_blend0").height = config_get_texture_res_y();
+			rts.get("texpaint_blend0")._image = image_create_render_target(config_get_texture_res_x(), config_get_texture_res_y(), tex_format_t.R8, depth_format_t.NO_DEPTH);
 			let _texpaint_blend1: image_t = rts.get("texpaint_blend1")._image;
 			base_notify_on_next_frame(() => {
 				image_unload(_texpaint_blend1);
 			});
-			rts.get("texpaint_blend1").width = Config.get_texture_res_x();
-			rts.get("texpaint_blend1").height = Config.get_texture_res_y();
-			rts.get("texpaint_blend1")._image = image_create_render_target(Config.get_texture_res_x(), Config.get_texture_res_y(), tex_format_t.R8, depth_format_t.NO_DEPTH);
-			Context.raw.brush_blend_dirty = true;
+			rts.get("texpaint_blend1").width = config_get_texture_res_x();
+			rts.get("texpaint_blend1").height = config_get_texture_res_y();
+			rts.get("texpaint_blend1")._image = image_create_render_target(config_get_texture_res_x(), config_get_texture_res_y(), tex_format_t.R8, depth_format_t.NO_DEPTH);
+			context_raw.brush_blend_dirty = true;
 		}
 
-		for (let l of Project.layers) SlotLayer.unload(l);
-		Project.layers = [];
+		for (let l of project_layers) SlotLayer.unload(l);
+		project_layers = [];
 		for (let i: i32 = 0; i < project.layer_datas.length; ++i) {
 			let ld: layer_data_t = project.layer_datas[i];
 			let is_group: bool = ld.texpaint == null;
@@ -206,7 +206,7 @@ class ImportArm {
 			let l: SlotLayerRaw = SlotLayer.create("", is_group ? layer_slot_type_t.GROUP : is_mask ? layer_slot_type_t.MASK : layer_slot_type_t.LAYER);
 			if (ld.name != null) l.name = ld.name;
 			l.visible = ld.visible;
-			Project.layers.push(l);
+			project_layers.push(l);
 
 			if (!is_group) {
 				if (base_pipe_merge == null) base_make_pipe();
@@ -289,42 +289,42 @@ class ImportArm {
 		for (let i: i32 = 0; i < project.layer_datas.length; ++i) {
 			let ld: layer_data_t = project.layer_datas[i];
 			if (ld.parent >= 0) {
-				Project.layers[i].parent = Project.layers[ld.parent];
+				project_layers[i].parent = project_layers[ld.parent];
 			}
 		}
 
-		Context.set_layer(Project.layers[0]);
+		context_set_layer(project_layers[0]);
 
 		// Materials
 		let m0: material_data_t = data_get_material("Scene", "Material");
 
-		Project.materials = [];
+		project_materials = [];
 		for (let n of project.material_nodes) {
 			ImportArm.init_nodes(n.nodes);
-			Context.raw.material = SlotMaterial.create(m0, n);
-			Project.materials.push(Context.raw.material);
+			context_raw.material = SlotMaterial.create(m0, n);
+			project_materials.push(context_raw.material);
 		}
 		///end
 
 		UINodes.hwnd.redraws = 2;
 		UINodes.group_stack = [];
-		Project.material_groups = [];
+		project_material_groups = [];
 		if (project.material_groups != null) {
-			for (let g of project.material_groups) Project.material_groups.push({ canvas: g, nodes: zui_nodes_create() });
+			for (let g of project.material_groups) project_material_groups.push({ canvas: g, nodes: zui_nodes_create() });
 		}
 
 		///if (is_paint || is_sculpt)
-		for (let m of Project.materials) {
-			Context.raw.material = m;
+		for (let m of project_materials) {
+			context_raw.material = m;
 			MakeMaterial.parse_paint_material();
 			UtilRender.make_material_preview();
 		}
 
-		Project.brushes = [];
+		project_brushes = [];
 		for (let n of project.brush_nodes) {
 			ImportArm.init_nodes(n.nodes);
-			Context.raw.brush = SlotBrush.create(n);
-			Project.brushes.push(Context.raw.brush);
+			context_raw.brush = SlotBrush.create(n);
+			project_brushes.push(context_raw.brush);
 			MakeMaterial.parse_brush();
 			UtilRender.make_brush_preview();
 		}
@@ -332,10 +332,10 @@ class ImportArm {
 		// Fill layers
 		for (let i: i32 = 0; i < project.layer_datas.length; ++i) {
 			let ld: layer_data_t = project.layer_datas[i];
-			let l: SlotLayerRaw = Project.layers[i];
+			let l: SlotLayerRaw = project_layers[i];
 			let is_group: bool = ld.texpaint == null;
 			if (!is_group) {
-				l.fill_layer = ld.fill_layer > -1 ? Project.materials[ld.fill_layer] : null;
+				l.fill_layer = ld.fill_layer > -1 ? project_materials[ld.fill_layer] : null;
 			}
 		}
 
@@ -345,26 +345,26 @@ class ImportArm {
 
 		///if is_lab
 		ImportArm.init_nodes(project.material.nodes);
-		Project.canvas = project.material;
-		ParserLogic.parse(Project.canvas);
+		project_canvas = project.material;
+		ParserLogic.parse(project_canvas);
 		///end
 
-		Context.raw.ddirty = 4;
+		context_raw.ddirty = 4;
 		data_delete_blob(path);
 	}
 
 	///if (is_paint || is_sculpt)
 	static run_mesh = (raw: scene_t) => {
-		Project.paint_objects = [];
+		project_paint_objects = [];
 		for (let i: i32 = 0; i < raw.mesh_datas.length; ++i) {
 			let md: mesh_data_t = mesh_data_create(raw.mesh_datas[i]);
 			let object: mesh_object_t = null;
 			if (i == 0) {
-				mesh_object_set_data(Context.raw.paint_object, md);
-				object = Context.raw.paint_object;
+				mesh_object_set_data(context_raw.paint_object, md);
+				object = context_raw.paint_object;
 			}
 			else {
-				object = scene_add_mesh_object(md, Context.raw.paint_object.materials, Context.raw.paint_object.base);
+				object = scene_add_mesh_object(md, context_raw.paint_object.materials, context_raw.paint_object.base);
 				object.base.name = md.name;
 				object.skip_context = "paint";
 				md._.handle = md.name;
@@ -373,12 +373,12 @@ class ImportArm {
 			vec4_set(object.base.transform.scale, 1, 1, 1);
 			transform_build_matrix(object.base.transform);
 			object.base.name = md.name;
-			Project.paint_objects.push(object);
+			project_paint_objects.push(object);
 			UtilMesh.merge_mesh();
-			Viewport.scale_to_bounds();
+			viewport_scale_to_bounds();
 		}
 		app_notify_on_init(base_init_layers);
-		History.reset();
+		history_reset();
 	}
 
 	static run_material = (path: string) => {
@@ -389,7 +389,7 @@ class ImportArm {
 	}
 
 	static run_material_from_project = (project: project_format_t, path: string) => {
-		let base: string = Path.base_dir(path);
+		let base: string = path_base_dir(path);
 		for (let file of project.assets) {
 			///if krom_windows
 			file = string_replace_all(file, "/", "\\");
@@ -399,10 +399,10 @@ class ImportArm {
 			// Convert image path from relative to absolute
 			let abs: string = data_is_abs(file) ? file : base + file;
 			if (project.packed_assets != null) {
-				abs = Path.normalize(abs);
+				abs = path_normalize(abs);
 				ImportArm.unpack_asset(project, abs, file);
 			}
-			if (data_cached_images.get(abs) == null && !File.exists(abs)) {
+			if (data_cached_images.get(abs) == null && !file_exists(abs)) {
 				ImportArm.make_pink(abs);
 			}
 			ImportTexture.run(abs);
@@ -414,23 +414,23 @@ class ImportArm {
 
 		for (let c of project.material_nodes) {
 			ImportArm.init_nodes(c.nodes);
-			Context.raw.material = SlotMaterial.create(m0, c);
-			Project.materials.push(Context.raw.material);
-			imported.push(Context.raw.material);
-			History.new_material();
+			context_raw.material = SlotMaterial.create(m0, c);
+			project_materials.push(context_raw.material);
+			imported.push(context_raw.material);
+			history_new_material();
 		}
 
 		if (project.material_groups != null) {
 			for (let c of project.material_groups) {
 				while (ImportArm.group_exists(c)) ImportArm.rename_group(c.name, imported, project.material_groups); // Ensure unique group name
 				ImportArm.init_nodes(c.nodes);
-				Project.material_groups.push({ canvas: c, nodes: zui_nodes_create() });
+				project_material_groups.push({ canvas: c, nodes: zui_nodes_create() });
 			}
 		}
 
 		let _init = () => {
 			for (let m of imported) {
-				Context.set_material(m);
+				context_set_material(m);
 				MakeMaterial.parse_paint_material();
 				UtilRender.make_material_preview();
 			}
@@ -443,7 +443,7 @@ class ImportArm {
 	}
 
 	static group_exists = (c: zui_node_canvas_t): bool => {
-		for (let g of Project.material_groups) {
+		for (let g of project_material_groups) {
 			if (g.canvas.name == c.name) return true;
 		}
 		return false;
@@ -471,7 +471,7 @@ class ImportArm {
 	}
 
 	static run_brush_from_project = (project: project_format_t, path: string) => {
-		let base: string = Path.base_dir(path);
+		let base: string = path_base_dir(path);
 		for (let file of project.assets) {
 			///if krom_windows
 			file = string_replace_all(file, "/", "\\");
@@ -481,10 +481,10 @@ class ImportArm {
 			// Convert image path from relative to absolute
 			let abs: string = data_is_abs(file) ? file : base + file;
 			if (project.packed_assets != null) {
-				abs = Path.normalize(abs);
+				abs = path_normalize(abs);
 				ImportArm.unpack_asset(project, abs, file);
 			}
-			if (data_cached_images.get(abs) == null && !File.exists(abs)) {
+			if (data_cached_images.get(abs) == null && !file_exists(abs)) {
 				ImportArm.make_pink(abs);
 			}
 			ImportTexture.run(abs);
@@ -494,14 +494,14 @@ class ImportArm {
 
 		for (let n of project.brush_nodes) {
 			ImportArm.init_nodes(n.nodes);
-			Context.raw.brush = SlotBrush.create(n);
-			Project.brushes.push(Context.raw.brush);
-			imported.push(Context.raw.brush);
+			context_raw.brush = SlotBrush.create(n);
+			project_brushes.push(context_raw.brush);
+			imported.push(context_raw.brush);
 		}
 
 		let _init = () => {
 			for (let b of imported) {
-				Context.set_brush(b);
+				context_set_brush(b);
 				UtilRender.make_brush_preview();
 			}
 		}
@@ -521,16 +521,16 @@ class ImportArm {
 
 	static run_swatches_from_project = (project: project_format_t, path: string, replaceExisting: bool = false) => {
 		if (replaceExisting) {
-			Project.raw.swatches = [];
+			project_raw.swatches = [];
 
 			if (project.swatches == null) { // No swatches contained
-				Project.raw.swatches.push(Project.make_swatch());
+				project_raw.swatches.push(make_swatch());
 			}
 		}
 
 		if (project.swatches != null) {
 			for (let s of project.swatches) {
-				Project.raw.swatches.push(s);
+				project_raw.swatches.push(s);
 			}
 		}
 		UIBase.hwnds[tab_area_t.STATUS].redraws = 2;
@@ -538,7 +538,7 @@ class ImportArm {
 	}
 
 	static make_pink = (abs: string) => {
-		Console.error(Strings.error2() + " " + abs);
+		console_error(strings_error2() + " " + abs);
 		let b: Uint8Array = new Uint8Array(4);
 		b[0] = 255;
 		b[1] = 0;
@@ -566,8 +566,8 @@ class ImportArm {
 	}
 
 	static unpack_asset = (project: project_format_t, abs: string, file: string) => {
-		if (Project.raw.packed_assets == null) {
-			Project.raw.packed_assets = [];
+		if (project_raw.packed_assets == null) {
+			project_raw.packed_assets = [];
 		}
 		for (let pa of project.packed_assets) {
 			///if krom_windows
@@ -575,11 +575,11 @@ class ImportArm {
 			///else
 			pa.name = string_replace_all(pa.name, "\\", "/");
 			///end
-			pa.name = Path.normalize(pa.name);
+			pa.name = path_normalize(pa.name);
 			if (pa.name == file) pa.name = abs; // From relative to absolute
 			if (pa.name == abs) {
-				if (!Project.packed_asset_exists(Project.raw.packed_assets, pa.name)) {
-					Project.raw.packed_assets.push(pa);
+				if (!project_packed_asset_exists(project_raw.packed_assets, pa.name)) {
+					project_raw.packed_assets.push(pa);
 				}
 				let image: image_t = image_from_encoded_bytes(pa.bytes, pa.name.endsWith(".jpg") ? ".jpg" : ".png");
 				data_cached_images.set(abs, image);

+ 16 - 16
base/Sources/ImportAsset.ts

@@ -5,7 +5,7 @@ class ImportAsset {
 
 		if (path.startsWith("cloud")) {
 			let do_cache_cloud = () => {
-				File.cache_cloud(path, (abs: string) => {
+				file_cache_cloud(path, (abs: string) => {
 					if (abs == null) return;
 					ImportAsset.run(abs, dropX, dropY, showBox, hdrAsEnvmap, done);
 				});
@@ -13,7 +13,7 @@ class ImportAsset {
 
 			///if (krom_android || krom_ios)
 			base_notify_on_next_frame(() => {
-				Console.toast(tr("Downloading"));
+				console_toast(tr("Downloading"));
 				base_notify_on_next_frame(do_cache_cloud);
 			});
 			///else
@@ -23,19 +23,19 @@ class ImportAsset {
 			return;
 		}
 
-		if (Path.is_mesh(path)) {
-			showBox ? Project.import_mesh_box(path) : ImportMesh.run(path);
+		if (path_is_mesh(path)) {
+			showBox ? project_import_mesh_box(path) : ImportMesh.run(path);
 			if (dropX > 0) UIBox.click_to_hide = false; // Prevent closing when going back to window after drag and drop
 		}
-		else if (Path.is_texture(path)) {
+		else if (path_is_texture(path)) {
 			ImportTexture.run(path, hdrAsEnvmap);
 			// Place image node
 			let x0: i32 = UINodes.wx;
 			let x1: i32 = UINodes.wx + UINodes.ww;
 			if (UINodes.show && dropX > x0 && dropX < x1) {
 				let asset_index: i32 = 0;
-				for (let i: i32 = 0; i < Project.assets.length; ++i) {
-					if (Project.assets[i].file == path) {
+				for (let i: i32 = 0; i < project_assets.length; ++i) {
+					if (project_assets[i].file == path) {
 						asset_index = i;
 						break;
 					}
@@ -46,35 +46,35 @@ class ImportAsset {
 			}
 
 			///if is_paint
-			if (Context.raw.tool == workspace_tool_t.COLORID && Project.asset_names.length == 1) {
+			if (context_raw.tool == workspace_tool_t.COLORID && project_asset_names.length == 1) {
 				UIHeader.header_handle.redraws = 2;
-				Context.raw.ddirty = 2;
+				context_raw.ddirty = 2;
 			}
 			///end
 		}
-		else if (Path.is_project(path)) {
+		else if (path_is_project(path)) {
 			ImportArm.run_project(path);
 		}
-		else if (Path.is_plugin(path)) {
+		else if (path_is_plugin(path)) {
 			ImportPlugin.run(path);
 		}
-		else if (Path.is_gimp_color_palette(path)) {
+		else if (path_is_gimp_color_palette(path)) {
 			ImportGpl.run(path, false);
 		}
 		///if is_paint
-		else if (Path.is_font(path)) {
+		else if (path_is_font(path)) {
 			ImportFont.run(path);
 		}
-		else if (Path.is_folder(path)) {
+		else if (path_is_folder(path)) {
 			ImportFolder.run(path);
 		}
 		///end
 		else {
-			if (Context.enable_import_plugin(path)) {
+			if (context_enable_import_plugin(path)) {
 				ImportAsset.run(path, dropX, dropY, showBox);
 			}
 			else {
-				Console.error(Strings.error1());
+				console_error(strings_error1());
 			}
 		}
 

+ 12 - 12
base/Sources/ImportBlendMaterial.ts

@@ -7,13 +7,13 @@ class ImportBlendMaterial {
 		let b: ArrayBuffer = data_get_blob(path);
 		let bl: BlendRaw = ParserBlend.init(b);
 		if (bl.dna == null) {
-			Console.error(Strings.error3());
+			console_error(strings_error3());
 			return;
 		}
 
 		let mats: BlHandleRaw[] = ParserBlend.get(bl, "Material");
 		if (mats.length == 0) {
-			Console.error("Error: No materials found");
+			console_error("Error: No materials found");
 			return;
 		}
 
@@ -21,11 +21,11 @@ class ImportBlendMaterial {
 
 		for (let mat of mats) {
 			// Material slot
-			Context.raw.material = SlotMaterial.create(Project.materials[0].data);
-			Project.materials.push(Context.raw.material);
-			imported.push(Context.raw.material);
-			let nodes: zui_nodes_t = Context.raw.material.nodes;
-			let canvas: zui_node_canvas_t = Context.raw.material.canvas;
+			context_raw.material = SlotMaterial.create(project_materials[0].data);
+			project_materials.push(context_raw.material);
+			imported.push(context_raw.material);
+			let nodes: zui_nodes_t = context_raw.material.nodes;
+			let canvas: zui_node_canvas_t = context_raw.material.canvas;
 			canvas.name = BlHandle.get(BlHandle.get(mat, "id"), "name").substr(2); // MAWood
 			let nout: zui_node_t = null;
 			for (let n of canvas.nodes) {
@@ -55,7 +55,7 @@ class ImportBlendMaterial {
 				node = BlHandle.get(node, "next");
 			}
 			if (BlHandle.get(node, "idname") != "ShaderNodeBsdfPrincipled") {
-				Console.error("Error: No Principled BSDF node found");
+				console_error("Error: No Principled BSDF node found");
 				continue;
 			}
 
@@ -107,9 +107,9 @@ class ImportBlendMaterial {
 					if (search == "teximage") {
 						let img: any = BlHandle.get(node, "id", 0, "Image");
 						let file: string = BlHandle.get(img, "name").substr(2); // '//desktop\logo.png'
-						file = Path.base_dir(path) + file;
+						file = path_base_dir(path) + file;
 						ImportTexture.run(file);
-						let ar: string[] = file.split(Path.sep);
+						let ar: string[] = file.split(path_sep);
 						let filename: string = ar[ar.length - 1];
 						n.buttons[0].default_value = base_get_asset_index(filename);
 					}
@@ -240,12 +240,12 @@ class ImportBlendMaterial {
 				link = BlHandle.get(link, "next");
 				if (last.block == link.block) break;
 			}
-			History.new_material();
+			history_new_material();
 		}
 
 		let _init = () => {
 			for (let m of imported) {
-				Context.set_material(m);
+				context_set_material(m);
 				MakeMaterial.parse_paint_material();
 				UtilRender.make_material_preview();
 			}

+ 4 - 4
base/Sources/ImportBlendMesh.ts

@@ -7,7 +7,7 @@ class ImportBlendMesh {
 		let b: ArrayBuffer = data_get_blob(path);
 		let bl: BlendRaw = ParserBlend.init(b);
 		if (bl.dna == null) {
-			Console.error(Strings.error3());
+			console_error(strings_error3());
 			return;
 		}
 
@@ -76,7 +76,7 @@ class ImportBlendMesh {
 
 			let hasuv: bool = uvdata != null;
 			let texa: Int16Array = hasuv ? new Int16Array(numtri * 3 * 2) : null;
-			let hascol: bool = Context.raw.parse_vcols && coldata != null;
+			let hascol: bool = context_raw.parse_vcols && coldata != null;
 			let cola: Int16Array = hascol ? new Int16Array(numtri * 3 * 4) : null;
 
 			let tri: i32 = 0;
@@ -437,8 +437,8 @@ class ImportBlendMesh {
 				cola: cola,
 				inda: inda,
 				name: name,
-				scalePos: scale_pos,
-				scaleTes: 1.0
+				scale_pos: scale_pos,
+				scale_tex: 1.0
 			};
 
 			(first && replaceExisting) ? ImportMesh.make_mesh(obj, path) : ImportMesh.add_mesh(obj);

+ 4 - 4
base/Sources/ImportEnvmap.ts

@@ -83,12 +83,12 @@ class ImportEnvmap {
 		scene_world.envmap = path;
 		scene_world._.radiance = ImportEnvmap.radiance_cpu;
 		scene_world._.radiance_mipmaps = ImportEnvmap.mips_cpu;
-		Context.raw.saved_envmap = image;
-		if (Context.raw.show_envmap_blur) {
+		context_raw.saved_envmap = image;
+		if (context_raw.show_envmap_blur) {
 			scene_world._.envmap = scene_world._.radiance_mipmaps[0];
 		}
-		Context.raw.ddirty = 2;
-		Project.raw.envmap = path;
+		context_raw.ddirty = 2;
+		project_raw.envmap = path;
 	}
 
 	static get_radiance_mip = (mip: image_t, level: i32, radiance: image_t) => {

+ 5 - 5
base/Sources/ImportFont.ts

@@ -4,9 +4,9 @@
 class ImportFont {
 
 	static run = (path: string) => {
-		for (let f of Project.fonts) {
+		for (let f of project_fonts) {
 			if (f.file == path) {
-				Console.info(Strings.info0());
+				console_info(strings_info0());
 				return;
 			}
 		}
@@ -15,7 +15,7 @@ class ImportFont {
 		let count: i32 = krom_g2_font_count(font.font_);
 		let font_slots: SlotFontRaw[] = [];
 		for (let i: i32 = 0; i < count; ++i) {
-			let ar: string[] = path.split(Path.sep);
+			let ar: string[] = path.split(path_sep);
 			let name: string = ar[ar.length - 1];
 			let f: g2_font_t = g2_font_clone(font);
 			g2_font_set_font_index(f, i);
@@ -25,8 +25,8 @@ class ImportFont {
 
 		let _init = () => {
 			for (let f of font_slots) {
-				Context.raw.font = f;
-				Project.fonts.push(f);
+				context_raw.font = f;
+				project_fonts.push(f);
 				UtilRender.make_font_preview();
 			}
 		}

+ 5 - 5
base/Sources/ImportGpl.ts

@@ -11,7 +11,7 @@ class ImportGpl {
 		// let view: DataView = new DataView(b);
 		// // GIMP's color palette importer: https://gitlab.gnome.org/GNOME/gimp/-/blob/gimp-2-10/app/core/gimppalette-load.c#L39
 		// if (!lines[0].startsWith("GIMP Palette")) {
-		// 	Console.error(tr("Not a valid GIMP color palette"));
+		// 	console_error(tr("Not a valid GIMP color palette"));
 		// 	return;
 		// }
 
@@ -23,22 +23,22 @@ class ImportGpl {
 		// 	else {
 		// 		let tokens: string[] = delimiter.split(line);
 		// 		if (tokens.length < 3) continue;
-		// 		let swatch: TSwatchColor = Project.makeSwatch(Color.fromBytes(String(tokens[0]), String(tokens[1]), String(tokens[2])));
+		// 		let swatch: TSwatchColor = makeSwatch(Color.fromBytes(String(tokens[0]), String(tokens[1]), String(tokens[2])));
 		// 		swatches.push(swatch);
 		// 	}
 		// }
 
 		// if (replaceExisting) {
-		// 	Project.raw.swatches = [];
+		// 	raw.swatches = [];
 
 		// 	if (swatches.length == 0) { // No swatches contained
-		// 		Project.raw.swatches.push(Project.makeSwatch());
+		// 		raw.swatches.push(makeSwatch());
 		// 	}
 		// }
 
 		// if (swatches.length > 0) {
 		// 	for (let s of swatches) {
-		// 		Project.raw.swatches.push(s);
+		// 		raw.swatches.push(s);
 		// 	}
 		// }
 	}

+ 6 - 6
base/Sources/ImportKeymap.ts

@@ -2,16 +2,16 @@
 class ImportKeymap {
 
 	static run = (path: string) => {
-		if (!Path.is_json(path)) {
-			Console.error(Strings.error1());
+		if (!path_is_json(path)) {
+			console_error(strings_error1());
 			return;
 		}
 
-		let filename: string = path.substr(path.lastIndexOf(Path.sep) + 1);
-		let dst_path: string = Path.data() + Path.sep + "keymap_presets" + Path.sep + filename;
-		File.copy(path, dst_path); // Copy to preset folder
+		let filename: string = path.substr(path.lastIndexOf(path_sep) + 1);
+		let dst_path: string = path_data() + path_sep + "keymap_presets" + path_sep + filename;
+		file_copy(path, dst_path); // Copy to preset folder
 		BoxPreferences.fetch_keymaps(); // Refresh file list
 		BoxPreferences.preset_handle.position = BoxPreferences.get_preset_index();
-		Console.info(tr("Keymap imported:") + " " + filename);
+		console_info(tr("Keymap imported:") + " " + filename);
 	}
 }

+ 46 - 46
base/Sources/ImportMesh.ts

@@ -15,16 +15,16 @@ class ImportMesh {
 	static run = (path: string, replace_existing: bool = true) => {
 	///end
 
-		if (!Path.is_mesh(path)) {
-			if (!Context.enable_import_plugin(path)) {
-				Console.error(Strings.error1());
+		if (!path_is_mesh(path)) {
+			if (!context_enable_import_plugin(path)) {
+				console_error(strings_error1());
 				return;
 			}
 		}
 
 		///if (is_paint || is_sculpt)
 		ImportMesh.clear_layers = _clear_layers;
-		Context.raw.layer_filter = 0;
+		context_raw.layer_filter = 0;
 		///end
 
 		ImportMesh.meshes_to_unwrap = null;
@@ -34,7 +34,7 @@ class ImportMesh {
 		else if (p.endsWith(".blend")) ImportBlendMesh.run(path, replace_existing);
 		else {
 			let ext: string = path.substr(path.lastIndexOf(".") + 1);
-			let importer: (s: string, f: (a: any)=>void)=>void = Path.mesh_importers.get(ext);
+			let importer: (s: string, f: (a: any)=>void)=>void = path_mesh_importers.get(ext);
 			importer(path, (mesh: any) => {
 				replace_existing ? ImportMesh.make_mesh(mesh, path) : ImportMesh.add_mesh(mesh);
 
@@ -45,47 +45,47 @@ class ImportMesh {
 						ImportMesh.add_mesh(mesh);
 
 						// let m: mat4_t = fromFloat32Array(mesh.transform);
-						// Project.paintObjects[Project.paintObjects.length - 1].transform.localOnly = true;
-						// Project.paintObjects[Project.paintObjects.length - 1].transform.setMatrix(m);
+						// paintObjects[paintObjects.length - 1].transform.localOnly = true;
+						// paintObjects[paintObjects.length - 1].transform.setMatrix(m);
 					});
 				}
 			});
 		}
 
-		Project.mesh_assets = [path];
+		project_mesh_assets = [path];
 
 		///if (krom_android || krom_ios)
-		sys_title_set(path.substring(path.lastIndexOf(Path.sep) + 1, path.lastIndexOf(".")));
+		sys_title_set(path.substring(path.lastIndexOf(path_sep) + 1, path.lastIndexOf(".")));
 		///end
 	}
 
 	static finish_import = () => {
-		if (Context.raw.merged_object != null) {
-			mesh_data_delete(Context.raw.merged_object.data);
-			mesh_object_remove(Context.raw.merged_object);
-			Context.raw.merged_object = null;
+		if (context_raw.merged_object != null) {
+			mesh_data_delete(context_raw.merged_object.data);
+			mesh_object_remove(context_raw.merged_object);
+			context_raw.merged_object = null;
 		}
 
-		Context.select_paint_object(Context.main_object());
+		context_select_paint_object(context_main_object());
 
-		if (Project.paint_objects.length > 1) {
+		if (project_paint_objects.length > 1) {
 			// Sort by name
-			Project.paint_objects.sort((a, b): i32 => {
+			project_paint_objects.sort((a, b): i32 => {
 				if (a.base.name < b.base.name) return -1;
 				else if (a.base.name > b.base.name) return 1;
 				return 0;
 			});
 
 			// No mask by default
-			for (let p of Project.paint_objects) p.base.visible = true;
-			if (Context.raw.merged_object == null) UtilMesh.merge_mesh();
-			Context.raw.paint_object.skip_context = "paint";
-			Context.raw.merged_object.base.visible = true;
+			for (let p of project_paint_objects) p.base.visible = true;
+			if (context_raw.merged_object == null) UtilMesh.merge_mesh();
+			context_raw.paint_object.skip_context = "paint";
+			context_raw.merged_object.base.visible = true;
 		}
 
-		Viewport.scale_to_bounds();
+		viewport_scale_to_bounds();
 
-		if (Context.raw.paint_object.base.name == "") Context.raw.paint_object.base.name = "Object";
+		if (context_raw.paint_object.base.name == "") context_raw.paint_object.base.name = "Object";
 		MakeMaterial.parse_paint_material();
 		MakeMaterial.parse_mesh_material();
 
@@ -98,7 +98,7 @@ class ImportMesh {
 		///end
 
 		///if arm_physics
-		Context.raw.paint_body = null;
+		context_raw.paint_body = null;
 		///end
 	}
 
@@ -107,28 +107,28 @@ class ImportMesh {
 		if (mesh.cola != null) raw.vertex_arrays.push({ values: mesh.cola, attrib: "col", data: "short4norm" });
 
 		let md: mesh_data_t = mesh_data_create(raw);
-		Context.raw.paint_object = Context.main_object();
+		context_raw.paint_object = context_main_object();
 
-		Context.select_paint_object(Context.main_object());
-		for (let i: i32 = 0; i < Project.paint_objects.length; ++i) {
-			let p: mesh_object_t = Project.paint_objects[i];
-			if (p == Context.raw.paint_object) continue;
+		context_select_paint_object(context_main_object());
+		for (let i: i32 = 0; i < project_paint_objects.length; ++i) {
+			let p: mesh_object_t = project_paint_objects[i];
+			if (p == context_raw.paint_object) continue;
 			data_delete_mesh(p.data._.handle);
 			mesh_object_remove(p);
 		}
-		let handle: string = Context.raw.paint_object.data._.handle;
+		let handle: string = context_raw.paint_object.data._.handle;
 		if (handle != "SceneSphere" && handle != "ScenePlane") {
 			data_delete_mesh(handle);
 		}
 
-		mesh_object_set_data(Context.raw.paint_object, md);
-		Context.raw.paint_object.base.name = mesh.name;
-		Project.paint_objects = [Context.raw.paint_object];
+		mesh_object_set_data(context_raw.paint_object, md);
+		context_raw.paint_object.base.name = mesh.name;
+		project_paint_objects = [context_raw.paint_object];
 
 		md._.handle = raw.name;
 		data_cached_meshes.set(md._.handle, md);
 
-		Context.raw.ddirty = 4;
+		context_raw.ddirty = 4;
 
 		///if (is_paint || is_sculpt)
 		UIBase.hwnds[tab_area_t.SIDEBAR0].redraws = 2;
@@ -140,13 +140,13 @@ class ImportMesh {
 
 		///if (is_paint || is_sculpt)
 		if (ImportMesh.clear_layers) {
-			while (Project.layers.length > 0) {
-				let l: SlotLayerRaw = Project.layers.pop();
+			while (project_layers.length > 0) {
+				let l: SlotLayerRaw = project_layers.pop();
 				SlotLayer.unload(l);
 			}
 			base_new_layer(false);
 			app_notify_on_init(base_init_layers);
-			History.reset();
+			history_reset();
 		}
 		///end
 
@@ -161,7 +161,7 @@ class ImportMesh {
 
 	static make_mesh = (mesh: any, path: string) => {
 		if (mesh == null || mesh.posa == null || mesh.nora == null || mesh.inda == null || mesh.posa.length == 0) {
-			Console.error(Strings.error3());
+			console_error(strings_error3());
 			return;
 		}
 
@@ -171,9 +171,9 @@ class ImportMesh {
 			}
 			let first_unwrap_done = (mesh: any) => {
 				ImportMesh._make_mesh(mesh);
-				for (let mesh of ImportMesh.meshes_to_unwrap) Project.unwrap_mesh_box(mesh, ImportMesh._add_mesh, true);
+				for (let mesh of ImportMesh.meshes_to_unwrap) project_unwrap_mesh_box(mesh, ImportMesh._add_mesh, true);
 			}
-			Project.unwrap_mesh_box(mesh, first_unwrap_done);
+			project_unwrap_mesh_box(mesh, first_unwrap_done);
 		}
 		else {
 			ImportMesh._make_mesh(mesh);
@@ -186,12 +186,12 @@ class ImportMesh {
 
 		let md: mesh_data_t = mesh_data_create(raw);
 
-		let object: mesh_object_t = scene_add_mesh_object(md, Context.raw.paint_object.materials, Context.raw.paint_object.base);
+		let object: mesh_object_t = scene_add_mesh_object(md, context_raw.paint_object.materials, context_raw.paint_object.base);
 		object.base.name = mesh.name;
 		object.skip_context = "paint";
 
 		// Ensure unique names
-		for (let p of Project.paint_objects) {
+		for (let p of project_paint_objects) {
 			if (p.base.name == object.base.name) {
 				p.base.name += ".001";
 				p.data._.handle += ".001";
@@ -199,12 +199,12 @@ class ImportMesh {
 			}
 		}
 
-		Project.paint_objects.push(object);
+		project_paint_objects.push(object);
 
 		md._.handle = raw.name;
 		data_cached_meshes.set(md._.handle, md);
 
-		Context.raw.ddirty = 4;
+		context_raw.ddirty = 4;
 
 		///if (is_paint || is_sculpt)
 		UIBase.hwnds[tab_area_t.SIDEBAR0].redraws = 2;
@@ -217,7 +217,7 @@ class ImportMesh {
 	static add_mesh = (mesh: any) => {
 		if (mesh.texa == null) {
 			if (ImportMesh.meshes_to_unwrap != null) ImportMesh.meshes_to_unwrap.push(mesh);
-			else Project.unwrap_mesh_box(mesh, ImportMesh._add_mesh);
+			else project_unwrap_mesh_box(mesh, ImportMesh._add_mesh);
 		}
 		else {
 			ImportMesh._add_mesh(mesh);
@@ -235,8 +235,8 @@ class ImportMesh {
 			index_arrays: [
 				{ values: mesh.inda, material: 0 }
 			],
-			scale_pos: mesh.scalePos,
-			scale_tex: mesh.scaleTex
+			scale_pos: mesh.scale_pos,
+			scale_tex: mesh.scale_tex
 		};
 	}
 }

+ 12 - 12
base/Sources/ImportObj.ts

@@ -2,7 +2,7 @@
 class ImportObj {
 
 	static run = (path: string, replace_existing: bool = true) => {
-		let i: split_type_t = Context.raw.split_by;
+		let i: split_type_t = context_raw.split_by;
 		let is_udim: bool = i == split_type_t.UDIM;
 		let split_code: i32 =
 			(i == split_type_t.OBJECT || is_udim) ? "o".charCodeAt(0) :
@@ -35,7 +35,7 @@ class ImportObj {
 				}
 				parts.push(part);
 			}
-			if (Context.raw.split_by == split_type_t.MATERIAL) {
+			if (context_raw.split_by == split_type_t.MATERIAL) {
 				let posa0: Int16Array;
 				let posa1: Int16Array;
 				let nora0: Int16Array;
@@ -61,21 +61,21 @@ class ImportObj {
 							// Repack merged positions
 							let posa32: Float32Array = new Float32Array(Math.floor(posa0.length / 4) * 3 + Math.floor(posa1.length / 4) * 3);
 							for (let k: i32 = 0; k < Math.floor(posa0.length / 4); ++k) {
-								posa32[k * 3    ] = posa0[k * 4    ] / 32767 * parts[i].scalePos;
-								posa32[k * 3 + 1] = posa0[k * 4 + 1] / 32767 * parts[i].scalePos;
-								posa32[k * 3 + 2] = posa0[k * 4 + 2] / 32767 * parts[i].scalePos;
+								posa32[k * 3    ] = posa0[k * 4    ] / 32767 * parts[i].scale_pos;
+								posa32[k * 3 + 1] = posa0[k * 4 + 1] / 32767 * parts[i].scale_pos;
+								posa32[k * 3 + 2] = posa0[k * 4 + 2] / 32767 * parts[i].scale_pos;
 							}
 							for (let k: i32 = 0; k < Math.floor(posa1.length / 4); ++k) {
-								posa32[voff * 3 + k * 3    ] = posa1[k * 4    ] / 32767 * parts[j].scalePos;
-								posa32[voff * 3 + k * 3 + 1] = posa1[k * 4 + 1] / 32767 * parts[j].scalePos;
-								posa32[voff * 3 + k * 3 + 2] = posa1[k * 4 + 2] / 32767 * parts[j].scalePos;
+								posa32[voff * 3 + k * 3    ] = posa1[k * 4    ] / 32767 * parts[j].scale_pos;
+								posa32[voff * 3 + k * 3 + 1] = posa1[k * 4 + 1] / 32767 * parts[j].scale_pos;
+								posa32[voff * 3 + k * 3 + 2] = posa1[k * 4 + 2] / 32767 * parts[j].scale_pos;
 							}
-							let scalePos: f32 = 0.0;
+							let scale_pos: f32 = 0.0;
 							for (let k: i32 = 0; k < posa32.length; ++k) {
 								let f: f32 = Math.abs(posa32[k]);
-								if (scalePos < f) scalePos = f;
+								if (scale_pos < f) scale_pos = f;
 							}
-							let inv: f32 = 32767 * (1 / scalePos);
+							let inv: f32 = 32767 * (1 / scale_pos);
 							let posa: Int16Array = new Int16Array(posa0.length + posa1.length);
 							for (let k: i32 = 0; k < Math.floor(posa.length / 4); ++k) {
 								posa[k * 4    ] = Math.floor(posa32[k * 3    ] * inv);
@@ -100,7 +100,7 @@ class ImportObj {
 							parts[i].nora = nora;
 							parts[i].texa = texa;
 							parts[i].inda = inda;
-							parts[i].scalePos = scalePos;
+							parts[i].scale_pos = scale_pos;
 							parts.splice(j, 1);
 						}
 						else j++;

+ 6 - 6
base/Sources/ImportPlugin.ts

@@ -2,15 +2,15 @@
 class ImportPlugin {
 
 	static run = (path: string) => {
-		if (!Path.is_plugin(path)) {
-			Console.error(Strings.error1());
+		if (!path_is_plugin(path)) {
+			console_error(strings_error1());
 			return;
 		}
 
-		let filename: string = path.substr(path.lastIndexOf(Path.sep) + 1);
-		let dst_path: string = Path.data() + Path.sep + "plugins" + Path.sep + filename;
-		File.copy(path, dst_path); // Copy to plugin folder
+		let filename: string = path.substr(path.lastIndexOf(path_sep) + 1);
+		let dst_path: string = path_data() + path_sep + "plugins" + path_sep + filename;
+		file_copy(path, dst_path); // Copy to plugin folder
 		BoxPreferences.files_plugin = null; // Refresh file list
-		Console.info(tr("Plugin imported:") + " " + filename);
+		console_info(tr("Plugin imported:") + " " + filename);
 	}
 }

+ 13 - 13
base/Sources/ImportTexture.ts

@@ -2,14 +2,14 @@
 class ImportTexture {
 
 	static run = (path: string, hdr_as_envmap: bool = true) => {
-		if (!Path.is_texture(path)) {
-			if (!Context.enable_import_plugin(path)) {
-				Console.error(Strings.error1());
+		if (!path_is_texture(path)) {
+			if (!context_enable_import_plugin(path)) {
+				console_error(strings_error1());
 				return;
 			}
 		}
 
-		for (let a of Project.assets) {
+		for (let a of project_assets) {
 			// Already imported
 			if (a.file == path) {
 				// Set as envmap
@@ -19,27 +19,27 @@ class ImportTexture {
 						ImportEnvmap.run(path, image);
 					});
 				}
-				Console.info(Strings.info0());
+				console_info(strings_info0());
 				return;
 			}
 		}
 
 		let ext: string = path.substr(path.lastIndexOf(".") + 1);
-		let importer: (s: string, f: (img: image_t)=>void)=>void = Path.texture_importers.get(ext);
+		let importer: (s: string, f: (img: image_t)=>void)=>void = path_texture_importers.get(ext);
 		let cached: bool = data_cached_images.get(path) != null; // Already loaded or pink texture for missing file
 		if (importer == null || cached) importer = ImportTexture.default_importer;
 
 		importer(path, (image: image_t) => {
 			data_cached_images.set(path, image);
-			let ar: string[] = path.split(Path.sep);
+			let ar: string[] = path.split(path_sep);
 			let name: string = ar[ar.length - 1];
-			let asset: asset_t = {name: name, file: path, id: Project.asset_id++};
-			Project.assets.push(asset);
-			if (Context.raw.texture == null) Context.raw.texture = asset;
-			Project.asset_names.push(name);
-			Project.asset_map.set(asset.id, image);
+			let asset: asset_t = {name: name, file: path, id: project_asset_id++};
+			project_assets.push(asset);
+			if (context_raw.texture == null) context_raw.texture = asset;
+			project_asset_names.push(name);
+			project_asset_map.set(asset.id, image);
 			UIBase.hwnds[tab_area_t.STATUS].redraws = 2;
-			Console.info(tr("Texture imported:") + " " + name);
+			console_info(tr("Texture imported:") + " " + name);
 
 			// Set as envmap
 			if (hdr_as_envmap && path.toLowerCase().endsWith(".hdr")) {

+ 8 - 8
base/Sources/ImportTheme.ts

@@ -2,18 +2,18 @@
 class ImportTheme {
 
 	static run = (path: string) => {
-		if (!Path.is_json(path)) {
-			Console.error(Strings.error1());
+		if (!path_is_json(path)) {
+			console_error(strings_error1());
 			return;
 		}
 
-		let filename: string = path.substr(path.lastIndexOf(Path.sep) + 1);
-		let dst_path: string = Path.data() + Path.sep + "themes" + Path.sep + filename;
-		File.copy(path, dst_path); // Copy to preset folder
+		let filename: string = path.substr(path.lastIndexOf(path_sep) + 1);
+		let dst_path: string = path_data() + path_sep + "themes" + path_sep + filename;
+		file_copy(path, dst_path); // Copy to preset folder
 		BoxPreferences.fetch_themes(); // Refresh file list
-		Config.raw.theme = filename;
+		config_raw.theme = filename;
 		BoxPreferences.theme_handle.position = BoxPreferences.get_theme_index();
-		Config.load_theme(Config.raw.theme);
-		Console.info(tr("Theme imported:") + " " + filename);
+		config_load_theme(config_raw.theme);
+		console_info(tr("Theme imported:") + " " + filename);
 	}
 }

+ 0 - 193
base/Sources/LineDraw.ts

@@ -1,193 +0,0 @@
-
-class LineDraw {
-
-	static color: color_t = 0xffff0000;
-	static strength: f32 = 0.005;
-	static mat: mat4_t = null;
-	static dim: vec4_t = null;
-
-	static vertex_buffer: vertex_buffer_t;
-	static index_buffer: index_buffer_t;
-	static pipeline: pipeline_t = null;
-
-	static vp: mat4_t;
-	static vp_loc: kinc_const_loc_t;
-
-	static vb_data: DataView;
-	static ib_data: Uint32Array;
-
-	static max_lines: i32 = 300;
-	static max_vertices: i32 = LineDraw.max_lines * 4;
-	static max_indices: i32 = LineDraw.max_lines * 6;
-	static lines: i32 = 0;
-
-	static wpos: vec4_t;
-	static vx: vec4_t = vec4_create();
-	static vy: vec4_t = vec4_create();
-	static vz: vec4_t = vec4_create();
-
-	static v1: vec4_t = vec4_create();
-	static v2: vec4_t = vec4_create();
-	static t: vec4_t = vec4_create();
-
-	static mid_point: vec4_t = vec4_create();
-	static mid_line: vec4_t = vec4_create();
-	static corner1: vec4_t = vec4_create();
-	static corner2: vec4_t = vec4_create();
-	static corner3: vec4_t = vec4_create();
-	static corner4: vec4_t = vec4_create();
-	static camera_look: vec4_t = vec4_create();
-
-	static render = (matrix: mat4_t) => {
-		LineDraw.mat = matrix;
-		LineDraw.dim = mat4_get_scale(matrix);
-
-		if (LineDraw.pipeline == null) {
-			let structure: vertex_struct_t = g4_vertex_struct_create();
-			g4_vertex_struct_add(structure, "pos", vertex_data_t.F32_3X);
-			g4_vertex_struct_add(structure, "col", vertex_data_t.F32_3X);
-			LineDraw.pipeline = g4_pipeline_create();
-			LineDraw.pipeline.input_layout = [structure];
-			LineDraw.pipeline.fragment_shader = sys_get_shader("line.frag");
-			LineDraw.pipeline.vertex_shader = sys_get_shader("line.vert");
-			LineDraw.pipeline.depth_write = true;
-			LineDraw.pipeline.depth_mode = compare_mode_t.LESS;
-			LineDraw.pipeline.cull_mode = cull_mode_t.NONE;
-			LineDraw.pipeline.color_attachment_count = 3;
-			LineDraw.pipeline.color_attachments[0] = tex_format_t.RGBA64;
-			LineDraw.pipeline.color_attachments[1] = tex_format_t.RGBA64;
-			LineDraw.pipeline.color_attachments[2] = tex_format_t.RGBA64;
-			LineDraw.pipeline.depth_attachment = depth_format_t.DEPTH24;
-			g4_pipeline_compile(LineDraw.pipeline);
-			LineDraw.vp_loc = g4_pipeline_get_const_loc(LineDraw.pipeline, "VP");
-			LineDraw.vp = mat4_identity();
-			LineDraw.vertex_buffer = g4_vertex_buffer_create(LineDraw.max_vertices, structure, usage_t.DYNAMIC);
-			LineDraw.index_buffer = g4_index_buffer_create(LineDraw.max_indices);
-		}
-
-		LineDraw.begin();
-		LineDraw.bounds(LineDraw.mat, LineDraw.dim);
-		LineDraw.end();
-	}
-
-	static bounds = (mat: mat4_t, dim: vec4_t) => {
-		LineDraw.wpos = mat4_get_loc(mat);
-		let dx: f32 = dim.x / 2;
-		let dy: f32 = dim.y / 2;
-		let dz: f32 = dim.z / 2;
-
-		let up: vec4_t = mat4_up(mat);
-		let look: vec4_t = mat4_look(mat);
-		let right: vec4_t = mat4_right(mat);
-		vec4_normalize(up);
-		vec4_normalize(look);
-		vec4_normalize(right);
-
-		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);
-		LineDraw.lineb(-1, -1,  1,  1, -1,  1);
-		LineDraw.lineb(-1,  1,  1,  1,  1,  1);
-
-		LineDraw.lineb(-1, -1, -1, -1,  1, -1);
-		LineDraw.lineb(-1, -1,  1, -1,  1,  1);
-		LineDraw.lineb( 1, -1, -1,  1,  1, -1);
-		LineDraw.lineb( 1, -1,  1,  1,  1,  1);
-
-		LineDraw.lineb(-1, -1, -1, -1, -1,  1);
-		LineDraw.lineb(-1,  1, -1, -1,  1,  1);
-		LineDraw.lineb( 1, -1, -1,  1, -1,  1);
-		LineDraw.lineb( 1,  1, -1,  1,  1,  1);
-	}
-
-	static lineb = (a: i32, b: i32, c: i32, d: i32, e: i32, f: i32) => {
-		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_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 line = (x1: f32, y1: f32, z1: f32, x2: f32, y2: f32, z2: f32) => {
-		if (LineDraw.lines >= LineDraw.max_lines) {
-			LineDraw.end();
-			LineDraw.begin();
-		}
-
-		vec4_set(LineDraw.mid_point, x1 + x2, y1 + y2, z1 + z2);
-		vec4_mult(LineDraw.mid_point, 0.5);
-
-		vec4_set(LineDraw.mid_line, x1, y1, z1);
-		vec4_sub(LineDraw.mid_line, LineDraw.mid_point);
-
-		let camera: camera_object_t = scene_camera;
-		LineDraw.camera_look = mat4_get_loc(camera.base.transform.world);
-		vec4_sub(LineDraw.camera_look, LineDraw.mid_point);
-
-		let line_width: vec4_t = vec4_cross(LineDraw.camera_look, LineDraw.mid_line);
-		vec4_normalize(line_width);
-		vec4_mult(line_width, LineDraw.strength);
-
-		vec4_add(vec4_set(LineDraw.corner1, x1, y1, z1), line_width);
-		vec4_sub(vec4_set(LineDraw.corner2, x1, y1, z1), line_width);
-		vec4_sub(vec4_set(LineDraw.corner3, x2, y2, z2), line_width);
-		vec4_add(vec4_set(LineDraw.corner4, x2, y2, z2), line_width);
-
-		let i: i32 = LineDraw.lines * 24; // 4 * 6 (structure len)
-		LineDraw.add_vb_data(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]);
-		i += 6;
-		LineDraw.add_vb_data(i, [LineDraw.corner2.x, LineDraw.corner2.y, LineDraw.corner2.z, color_get_rb(LineDraw.color) / 255, color_get_gb(LineDraw.color) / 255, color_get_ab(LineDraw.color) / 255]);
-		i += 6;
-		LineDraw.add_vb_data(i, [LineDraw.corner3.x, LineDraw.corner3.y, LineDraw.corner3.z, color_get_rb(LineDraw.color) / 255, color_get_gb(LineDraw.color) / 255, color_get_ab(LineDraw.color) / 255]);
-		i += 6;
-		LineDraw.add_vb_data(i, [LineDraw.corner4.x, LineDraw.corner4.y, LineDraw.corner4.z, color_get_rb(LineDraw.color) / 255, color_get_gb(LineDraw.color) / 255, color_get_ab(LineDraw.color) / 255]);
-
-		i = LineDraw.lines * 6;
-		LineDraw.ib_data[i    ] = LineDraw.lines * 4;
-		LineDraw.ib_data[i + 1] = LineDraw.lines * 4 + 1;
-		LineDraw.ib_data[i + 2] = LineDraw.lines * 4 + 2;
-		LineDraw.ib_data[i + 3] = LineDraw.lines * 4 + 2;
-		LineDraw.ib_data[i + 4] = LineDraw.lines * 4 + 3;
-		LineDraw.ib_data[i + 5] = LineDraw.lines * 4;
-
-		LineDraw.lines++;
-	}
-
-	static begin = () => {
-		LineDraw.lines = 0;
-		LineDraw.vb_data = g4_vertex_buffer_lock(LineDraw.vertex_buffer);
-		LineDraw.ib_data = g4_index_buffer_lock(LineDraw.index_buffer);
-	}
-
-	static end = () => {
-		g4_vertex_buffer_unlock(LineDraw.vertex_buffer);
-		g4_index_buffer_unlock(LineDraw.index_buffer);
-
-		g4_set_vertex_buffer(LineDraw.vertex_buffer);
-		g4_set_index_buffer(LineDraw.index_buffer);
-		g4_set_pipeline(LineDraw.pipeline);
-		let camera: camera_object_t = scene_camera;
-		mat4_set_from(LineDraw.vp, camera.v);
-		mat4_mult_mat(LineDraw.vp, camera.p);
-		g4_set_mat(LineDraw.vp_loc, LineDraw.vp);
-		g4_draw(0, LineDraw.lines * 6);
-	}
-
-	static add_vb_data = (i: i32, data: f32[]) => {
-		for (let offset: i32 = 0; offset < 6; ++offset) {
-			LineDraw.vb_data.setFloat32((i + offset) * 4, data[offset], true);
-		}
-	}
-}

+ 0 - 78
base/Sources/MakeVoxel.ts

@@ -1,78 +0,0 @@
-
-class MakeVoxel {
-
-	///if arm_voxels
-	static run = (data: shader_context_t) => {
-		let structure: vertex_struct_t = g4_vertex_struct_create();
-		g4_vertex_struct_add(structure, "pos", vertex_data_t.I16_4X_NORM);
-		g4_vertex_struct_add(structure, "nor", vertex_data_t.I16_2X_NORM);
-		g4_vertex_struct_add(structure, "tex", vertex_data_t.I16_2X_NORM);
-
-		let pipe_state: pipeline_t = data._.pipe_state;
-		pipe_state.input_layout = [structure];
-		data.vertex_elements = [
-			{name: "pos", data: "short4norm"},
-			{name: "nor", data: "short2norm"},
-			{name: "tex", data: "short2norm"}
-		];
-
-		// ///if arm_skin
-		// let is_mesh: bool = Context.raw.object.constructor == mesh_object_t;
-		// let skin: bool = is_mesh && cast(Context.raw.object, mesh_object_t).data.geom.bones != null;
-		// if (skin) {
-		// 	VertexStructure.add(structure, "bone", VertexData.I16_4X_Normalized);
-		// 	VertexStructure.add(structure, "weight", VertexData.I16_4X_Normalized);
-		// 	data.raw.vertex_elements.push({ name: "bone", data: 'short4norm' });
-		// 	data.raw.vertex_elements.push({ name: "weight", data: 'short4norm' });
-		// }
-		// ///end
-
-		let ds: f32 = MakeMaterial.get_displace_strength();
-		pipe_state.vertex_shader = g4_shader_from_source(MakeVoxel.voxel_source(), shader_type_t.VERTEX);
-
-		g4_pipeline_compile(pipe_state);
-		data.constants = [{ name: "W", type: "mat4", link: "_world_matrix" }, { name: "N", type: "mat3", link: "_normal_matrix" }];
-		data._.constants = [g4_pipeline_get_const_loc(pipe_state, "W"), g4_pipeline_get_const_loc(pipe_state, "N")];
-		data.texture_units = [{ name: "texpaint_pack" }, { name: "voxels", image_uniform: true }];
-		data._.tex_units = [g4_pipeline_get_tex_unit(pipe_state, "texpaint_pack"), g4_pipeline_get_tex_unit(pipe_state, "voxels")];
-	}
-
-	static voxel_source = (): string => {
-		///if krom_direct3d11
-		return `#define vec3 float3
-		uniform float4x4 W;
-		uniform float3x3 N;
-		Texture2D<float4> texpaint_pack;
-		SamplerState _texpaint_pack_sampler;
-		struct SPIRV_Cross_Input { float4 pos : TEXCOORD1; float2 nor : TEXCOORD0; float2 tex : TEXCOORD2; };
-		struct SPIRV_Cross_Output { float4 svpos : SV_POSITION; };
-		SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) {
-			SPIRV_Cross_Output stage_output;
-			" + MakeMaterial.voxelgiHalfExtents() + "
-			stage_output.svpos.xyz = mul(float4(stage_input.pos.xyz, 1.0), W).xyz / voxelgiHalfExtents.xxx;
-			float3 wnormal = normalize(mul(float3(stage_input.nor.xy, stage_input.pos.w), N));
-			float height = texpaint_pack.SampleLevel(_texpaint_pack_sampler, stage_input.tex, 0.0).a;
-			stage_output.svpos.xyz += wnormal * height.xxx * float3(" + ds + "," + ds + "," + ds + ");
-			stage_output.svpos.w = 1.0;
-			return stage_output;
-		}`;
-		///else
-		return `#version 450
-		in vec4 pos;
-		in vec2 nor;
-		in vec2 tex;
-		out vec3 voxpositionGeom;
-		uniform mat4 W;
-		uniform mat3 N;
-		uniform sampler2D texpaint_pack;
-		void main() {
-			" + MakeMaterial.voxelgiHalfExtents() + "
-			voxpositionGeom = vec3(W * vec4(pos.xyz, 1.0)) / voxelgiHalfExtents;
-			vec3 wnormal = normalize(N * vec3(nor.xy, pos.w));
-			float height = textureLod(texpaint_pack, tex, 0.0).a;
-			voxpositionGeom += wnormal * vec3(height) * vec3(" + ds + ");
-		}`;
-		///end
-	}
-	///end
-}

+ 7 - 8
base/Sources/NodesMaterial.ts

@@ -1,4 +1,3 @@
-/// <reference path='./tr.ts'/>
 
 class NodesMaterial {
 
@@ -2876,7 +2875,7 @@ class NodesMaterial {
 				node.name = tr("Group") + " " + i;
 
 				let found: bool = false;
-				for (let g of Project.material_groups) {
+				for (let g of project_material_groups) {
 					if (g.canvas.name == node.name) {
 						found = true;
 						break;
@@ -2927,11 +2926,11 @@ class NodesMaterial {
 				],
 				links: []
 			};
-			Project.material_groups.push({ canvas: canvas, nodes: zui_nodes_create() });
+			project_material_groups.push({ canvas: canvas, nodes: zui_nodes_create() });
 		}
 
 		let group: node_group_t = null;
-		for (let g of Project.material_groups) {
+		for (let g of project_material_groups) {
 			if (g.canvas.name == node.name) {
 				group = g;
 				break;
@@ -2975,8 +2974,8 @@ class NodesMaterial {
 	static sync_sockets = (node: zui_node_t) => {
 		let groupStack: node_group_t[] = UINodes.group_stack;
 		let c: zui_node_canvas_t = groupStack[groupStack.length - 1].canvas;
-		for (let m of Project.materials) NodesMaterial.sync_group_sockets(m.canvas, c.name, node);
-		for (let g of Project.material_groups) NodesMaterial.sync_group_sockets(g.canvas, c.name, node);
+		for (let m of project_materials) NodesMaterial.sync_group_sockets(m.canvas, c.name, node);
+		for (let g of project_material_groups) NodesMaterial.sync_group_sockets(g.canvas, c.name, node);
 		zui_node_replace.push(node);
 	}
 
@@ -3031,8 +3030,8 @@ class NodesMaterial {
 	static create_node = (nodeType: string, group: node_group_t = null): zui_node_t => {
 		let n: zui_node_t = NodesMaterial.get_node_t(nodeType);
 		if (n == null) return null;
-		let canvas: zui_node_canvas_t = group != null ? group.canvas : Context.raw.material.canvas;
-		let nodes: zui_nodes_t = group != null ? group.nodes : Context.raw.material.nodes;
+		let canvas: zui_node_canvas_t = group != null ? group.canvas : context_raw.material.canvas;
+		let nodes: zui_nodes_t = group != null ? group.nodes : context_raw.material.nodes;
 		let node: zui_node_t = UINodes.make_node(n, nodes, canvas);
 		canvas.nodes.push(node);
 		return node;

+ 0 - 49
base/Sources/Operator.ts

@@ -1,49 +0,0 @@
-
-class Operator {
-
-	static ops: Map<string, any> = new Map();
-
-	static register = (name: string, call: any) => {
-		Operator.ops.set(name, call);
-	}
-
-	static run = (name: string) => {
-		if (Operator.ops.get(name) != null) Operator.ops.get(name)();
-	}
-
-	static update = () => {
-		if (mouse_started_any() || keyboard_started_any()) {
-			for (let op in Config.keymap) {
-				if (Operator.shortcut(Config.keymap[op])) Operator.run(op);
-			}
-		}
-	}
-
-	static shortcut = (s: string, type = ShortcutType.ShortcutStarted): bool => {
-		if (s == "") return false;
-		let shift: bool = s.indexOf("shift") >= 0;
-		let ctrl: bool = s.indexOf("ctrl") >= 0;
-		let alt: bool = s.indexOf("alt") >= 0;
-		let flag: bool = 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;
-		}
-		else if (shift || ctrl || alt) return flag;
-		let key: bool = (s == "left" || s == "right" || s == "middle") ?
-			// Mouse
-			(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));
-		return flag && key;
-	}
-}
-
-enum ShortcutType {
-	ShortcutStarted,
-	ShortcutRepeat,
-	ShortcutDown,
-	ShortcutReleased,
-}

+ 8 - 8
base/Sources/ParserMaterial.ts

@@ -206,7 +206,7 @@ class ParserMaterial {
 			}
 		}
 		if (frag.wtangent) {
-			// NodeShaderContext.add_elem(con, "tang", "short4norm");
+			// NodeShaderadd_elem(con, "tang", "short4norm");
 			// NodeShader.add_uniform(vert, "mat3 N", "_normal_matrix");
 			NodeShader.add_out(vert, "vec3 wtangent");
 			// NodeShader.write_attrib(vert, `wtangent = normalize(mul(tang.xyz, N));`);
@@ -268,7 +268,7 @@ class ParserMaterial {
 	}
 
 	static get_group = (name: string): zui_node_canvas_t => {
-		for (let g of Project.material_groups) if (g.canvas.name == name) return g.canvas;
+		for (let g of project_material_groups) if (g.canvas.name == name) return g.canvas;
 		return null;
 	}
 
@@ -784,8 +784,8 @@ class ParserMaterial {
 		else if (node.type == "MATERIAL") {
 			let result: string = "vec3(0.0, 0.0, 0.0)";
 			let mi: any = node.buttons[0].default_value;
-			if (mi >= Project.materials.length) return result;
-			let m: SlotMaterialRaw = Project.materials[mi];
+			if (mi >= project_materials.length) return result;
+			let m: SlotMaterialRaw = project_materials[mi];
 			let _nodes: zui_node_t[] = ParserMaterial.nodes;
 			let _links: zui_node_link_t[] = ParserMaterial.links;
 			ParserMaterial.nodes = m.canvas.nodes;
@@ -1203,8 +1203,8 @@ class ParserMaterial {
 		else if (node.type == "MATERIAL") {
 			let result: string = "0.0";
 			let mi: any = node.buttons[0].default_value;
-			if (mi >= Project.materials.length) return result;
-			let m: SlotMaterialRaw = Project.materials[mi];
+			if (mi >= project_materials.length) return result;
+			let m: SlotMaterialRaw = project_materials[mi];
 			let _nodes: zui_node_t[] = ParserMaterial.nodes;
 			let _links: zui_node_link_t[] = ParserMaterial.links;
 			ParserMaterial.nodes = m.canvas.nodes;
@@ -1865,7 +1865,7 @@ class ParserMaterial {
 	}
 
 	static enum_data = (s: string): string => {
-		for (let a of Project.assets) if (a.name == s) return a.file;
+		for (let a of project_assets) if (a.name == s) return a.file;
 		return "";
 	}
 
@@ -1880,7 +1880,7 @@ class ParserMaterial {
 			file: filepath
 		};
 
-		if (Context.raw.texture_filter) {
+		if (context_raw.texture_filter) {
 			tex.min_filter = "anisotropic";
 			tex.mag_filter = "linear";
 			tex.mipmap_filter = "linear";

+ 0 - 177
base/Sources/Path.ts

@@ -1,177 +0,0 @@
-
-class Path {
-
-	static get sep(): string {
-		///if krom_windows
-		return "\\";
-		///else
-		return "/";
-		///end
-	}
-
-	static mesh_formats: string[] = ["obj", "blend"];
-	static texture_formats: string[] = ["jpg", "jpeg", "png", "tga", "bmp", "psd", "gif", "hdr", "k"];
-
-	static mesh_importers: Map<string, (s: string, f: (a: any)=>void)=>void> = new Map();
-	static texture_importers: Map<string, (s: string, f: (img: image_t)=>void)=>void> = new Map();
-
-	static base_color_ext: string[] = ["albedo", "alb", "basecol", "basecolor", "diffuse", "diff", "base", "bc", "d", "color", "col"];
-	static opacity_ext: string[] = ["opac", "opacity", "alpha"];
-	static normal_map_ext: string[] = ["normal", "nor", "n", "nrm", "normalgl"];
-	static occlusion_ext: string[] = ["ao", "occlusion", "ambientOcclusion", "o", "occ"];
-	static roughness_ext: string[] = ["roughness", "rough", "r", "rgh"];
-	static metallic_ext: string[] = ["metallic", "metal", "metalness", "m", "met"];
-	static displacement_ext: string[] = ["displacement", "height", "h", "disp"];
-
-	static working_dir_cache: string = null;
-
-	static data = (): string => {
-		return krom_get_files_location() + Path.sep + data_path();
-	}
-
-	static to_relative = (from: string, to: string): string => {
-		let a: string[] = from.split(Path.sep);
-		let b: string[] = to.split(Path.sep);
-		while (a[0] == b[0]) {
-			a.shift();
-			b.shift();
-			if (a.length == 0 || b.length == 0) break;
-		}
-		let base: string = "";
-		for (let i: i32 = 0; i < a.length - 1; ++i) base += ".." + Path.sep;
-		base += b.join(Path.sep);
-		return base;
-	}
-
-	static normalize = (path: string): string => {
-		let ar: string[] = path.split(Path.sep);
-		let i: i32 = 0;
-		while (i < ar.length) {
-			if (i > 0 && ar[i] == ".." && ar[i - 1] != "..") {
-				ar.splice(i - 1, 2);
-				i--;
-			}
-			else i++;
-		}
-		return ar.join(Path.sep);
-	}
-
-	static base_dir = (path: string): string => {
-		return path.substr(0, path.lastIndexOf(Path.sep) + 1);
-	}
-
-	static get pwd(): string {
-		///if krom_windows
-		return "cd";
-		///else
-		return "echo $PWD";
-		///end
-	}
-
-	static working_dir = (): string => {
-		if (Path.working_dir_cache == null) {
-			let cmd: string = Path.pwd;
-			let save: string = (Path.is_protected() ? krom_save_path() : Path.data() + Path.sep) + "working_dir.txt";
-			krom_sys_command(cmd + ' > "' + save + '"');
-			Path.working_dir_cache = trim_end(sys_buffer_to_string(krom_load_blob(save)));
-		}
-		return Path.working_dir_cache;
-	}
-
-	static is_mesh = (path: string): bool => {
-		let p: string = path.toLowerCase();
-		for (let s of Path.mesh_formats) if (p.endsWith("." + s)) return true;
-		return false;
-	}
-
-	static is_texture = (path: string): bool => {
-		let p: string = path.toLowerCase();
-		for (let s of Path.texture_formats) if (p.endsWith("." + s)) return true;
-		return false;
-	}
-
-	static is_font = (path: string): bool => {
-		let p: string = path.toLowerCase();
-		return p.endsWith(".ttf") ||
-				p.endsWith(".ttc") ||
-				p.endsWith(".otf");
-	}
-
-	static is_project = (path: string): bool => {
-		let p: string = path.toLowerCase();
-		return p.endsWith(".arm");
-	}
-
-	static is_plugin = (path: string): bool => {
-		let p: string = path.toLowerCase();
-		return p.endsWith(".js");
-	}
-
-	static is_json = (path: string): bool => {
-		let p: string = path.toLowerCase();
-		return p.endsWith(".json");
-	}
-
-	static is_text = (path: string): bool => {
-		let p: string = path.toLowerCase();
-		return p.endsWith(".txt");
-	}
-
-	static is_gimp_color_palette = (path: string): bool => {
-		let p: string = path.toLowerCase();
-		return p.endsWith(".gpl");
-	}
-
-	static is_known = (path: string): bool => {
-		return Path.is_mesh(path) || Path.is_texture(path) || Path.is_font(path) || Path.is_project(path) || Path.is_plugin(path) || Path.is_text(path) || Path.is_gimp_color_palette(path);
-	}
-
-	static check_ext = (p: string, exts: string[]): bool => {
-		p = string_replace_all(p, "-", "_");
-		for (let ext of exts) {
-			if (p.endsWith("_" + ext) ||
-				(p.indexOf("_" + ext + "_") >= 0 && !p.endsWith("_preview") && !p.endsWith("_icon"))) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	static is_base_color_tex = (p: string): bool => {
-		return Path.check_ext(p, Path.base_color_ext);
-	}
-	static is_opacity_tex = (p: string): bool => {
-		return Path.check_ext(p, Path.opacity_ext);
-	}
-	static is_normal_map_tex = (p: string): bool => {
-		return Path.check_ext(p, Path.normal_map_ext);
-	}
-	static is_occlusion_tex = (p: string): bool => {
-		return Path.check_ext(p, Path.occlusion_ext);
-	}
-	static is_roughness_tex = (p: string): bool => {
-		return Path.check_ext(p, Path.roughness_ext);
-	}
-	static is_metallic_tex = (p: string): bool => {
-		return Path.check_ext(p, Path.metallic_ext);
-	}
-	static is_displacement_tex = (p: string): bool => {
-		return Path.check_ext(p, Path.displacement_ext);
-	}
-
-	static is_folder = (p: string): bool => {
-		return string_replace_all(p, "\\", "/").split("/").pop().indexOf(".") == -1;
-	}
-
-	static is_protected = (): bool => {
-		///if krom_windows
-		return krom_get_files_location().indexOf("Program Files") >= 0;
-		///elseif krom_android
-		return true;
-		///elseif krom_ios
-		return true;
-		///else
-		return false;
-		///end
-	}
-}

+ 0 - 43
base/Sources/Plugin.ts

@@ -1,43 +0,0 @@
-
-class PluginRaw {
-	draw_ui: (ui: zui_t)=>void = null;
-	draw: ()=>void = null;
-	update: ()=>void = null;
-	delete: ()=>void = null;
-	version: string = "0.1";
-	apiversion: string = "0.1";
-	name: string;
-}
-
-class Plugin {
-
-	static plugins: Map<string, PluginRaw> = new Map();
-	static plugin_name: string;
-
-	static create(): PluginRaw {
-		let p: PluginRaw = new PluginRaw();
-		p.name = Plugin.plugin_name;
-		Plugin.plugins.set(p.name, p);
-		return p;
-	}
-
-	static start = (plugin: string) => {
-		try {
-			let blob: ArrayBuffer = data_get_blob("plugins/" + plugin);
-			Plugin.plugin_name = plugin;
-			// (1, eval)(sys_buffer_to_string(blob)); // Global scope
-			eval(sys_buffer_to_string(blob)); // Local scope
-			data_delete_blob("plugins/" + plugin);
-		}
-		catch (e: any) {
-			Console.error(tr("Failed to load plugin") + " '" + plugin + "'");
-			krom_log(e);
-		}
-	}
-
-	static stop = (plugin: string) => {
-		let p: PluginRaw = Plugin.plugins.get(plugin);
-		if (p != null && p.delete != null) p.delete();
-		Plugin.plugins.delete(plugin);
-	}
-}

+ 0 - 640
base/Sources/Project.ts

@@ -1,640 +0,0 @@
-
-class Project {
-
-	static raw: project_format_t = {};
-	static filepath: string = "";
-	static assets: asset_t[] = [];
-	static asset_names: string[] = [];
-	static asset_id: i32 = 0;
-	static mesh_assets: string[] = [];
-	static material_groups: node_group_t[] = [];
-	static paint_objects: mesh_object_t[] = null;
-	static asset_map: Map<i32, any> = new Map(); // ImageRaw | FontRaw
-	static mesh_list: string[] = null;
-	///if (is_paint || is_sculpt)
-	static materials: SlotMaterialRaw[] = null;
-	static brushes: SlotBrushRaw[] = null;
-	static layers: SlotLayerRaw[] = null;
-	static fonts: SlotFontRaw[] = null;
-	static atlas_objects: i32[] = null;
-	static atlas_names: string[] = null;
-	///end
-	///if is_lab
-	static material_data: material_data_t = null; ////
-	static materials: any[] = null; ////
-	static nodes: zui_nodes_t;
-	static canvas: zui_node_canvas_t;
-	static default_canvas: ArrayBuffer = null;
-	///end
-
-	static project_open = () => {
-		UIFiles.show("arm", false, false, (path: string) => {
-			if (!path.endsWith(".arm")) {
-				Console.error(Strings.error0());
-				return;
-			}
-
-			let current: image_t = _g2_current;
-			if (current != null) g2_end();
-
-			ImportArm.run_project(path);
-
-			if (current != null) g2_begin(current);
-		});
-	}
-
-	static project_save = (saveAndQuit: bool = false) => {
-		if (Project.filepath == "") {
-			///if krom_ios
-			let document_directory: string = krom_save_dialog("", "");
-			document_directory = document_directory.substr(0, document_directory.length - 8); // Strip /'untitled'
-			Project.filepath = document_directory + "/" + sys_title() + ".arm";
-			///elseif krom_android
-			Project.filepath = krom_save_path() + "/" + sys_title() + ".arm";
-			///else
-			Project.project_save_as(saveAndQuit);
-			return;
-			///end
-		}
-
-		///if (krom_windows || krom_linux || krom_darwin)
-		let filename: string = Project.filepath.substring(Project.filepath.lastIndexOf(Path.sep) + 1, Project.filepath.length - 4);
-		sys_title_set(filename + " - " + manifest_title);
-		///end
-
-		let _init = () => {
-			ExportArm.run_project();
-			if (saveAndQuit) sys_stop();
-		}
-		app_notify_on_init(_init);
-	}
-
-	static project_save_as = (saveAndQuit: bool = false) => {
-		UIFiles.show("arm", true, false, (path: string) => {
-			let f: string = UIFiles.filename;
-			if (f == "") f = tr("untitled");
-			Project.filepath = path + Path.sep + f;
-			if (!Project.filepath.endsWith(".arm")) Project.filepath += ".arm";
-			Project.project_save(saveAndQuit);
-		});
-	}
-
-	static project_new_box = () => {
-		///if (is_paint || is_sculpt)
-		UIBox.show_custom((ui: zui_t) => {
-			if (zui_tab(zui_handle("project_0"), tr("New Project"))) {
-				if (Project.mesh_list == null) {
-					Project.mesh_list = File.read_directory(Path.data() + Path.sep + "meshes");
-					for (let i: i32 = 0; i < Project.mesh_list.length; ++i) Project.mesh_list[i] = Project.mesh_list[i].substr(0, Project.mesh_list[i].length - 4); // Trim .arm
-					Project.mesh_list.unshift("plane");
-					Project.mesh_list.unshift("sphere");
-					Project.mesh_list.unshift("rounded_cube");
-				}
-
-				zui_row([0.5, 0.5]);
-				Context.raw.project_type = zui_combo(zui_handle("project_1", { position: Context.raw.project_type }), Project.mesh_list, tr("Template"), true);
-				Context.raw.project_aspect_ratio = zui_combo(zui_handle("project_2", { position: Context.raw.project_aspect_ratio }), ["1:1", "2:1", "1:2"], tr("Aspect Ratio"), true);
-
-				zui_end_element();
-				zui_row([0.5, 0.5]);
-				if (zui_button(tr("Cancel"))) {
-					UIBox.hide();
-				}
-				if (zui_button(tr("OK")) || ui.is_return_down) {
-					Project.project_new();
-					Viewport.scale_to_bounds();
-					UIBox.hide();
-				}
-			}
-		});
-		///end
-
-		///if is_lab
-		Project.project_new();
-		Viewport.scale_to_bounds();
-		///end
-	}
-
-	static project_new = (resetLayers: bool = true) => {
-		///if (krom_windows || krom_linux || krom_darwin)
-		sys_title_set(manifest_title);
-		///end
-		Project.filepath = "";
-
-		///if (is_paint || is_sculpt)
-		if (Context.raw.merged_object != null) {
-			mesh_object_remove(Context.raw.merged_object);
-			data_delete_mesh(Context.raw.merged_object.data._.handle);
-			Context.raw.merged_object = null;
-		}
-		Context.raw.layer_preview_dirty = true;
-		Context.raw.layer_filter = 0;
-		Project.mesh_assets = [];
-		///end
-
-		Viewport.reset();
-		Context.raw.paint_object = Context.main_object();
-
-		Context.select_paint_object(Context.main_object());
-		for (let i: i32 = 1; i < Project.paint_objects.length; ++i) {
-			let p: mesh_object_t = Project.paint_objects[i];
-			if (p == Context.raw.paint_object) continue;
-			data_delete_mesh(p.data._.handle);
-			mesh_object_remove(p);
-		}
-		let meshes: mesh_object_t[] = scene_meshes;
-		let len: i32 = meshes.length;
-		for (let i: i32 = 0; i < len; ++i) {
-			let m: mesh_object_t = meshes[len - i - 1];
-			if (Context.raw.project_objects.indexOf(m) == -1 &&
-				m.base.name != ".ParticleEmitter" &&
-				m.base.name != ".Particle") {
-				data_delete_mesh(m.data._.handle);
-				mesh_object_remove(m);
-			}
-		}
-		let handle: string = Context.raw.paint_object.data._.handle;
-		if (handle != "SceneSphere" && handle != "ScenePlane") {
-			data_delete_mesh(handle);
-		}
-
-		if (Context.raw.project_type != project_model_t.ROUNDED_CUBE) {
-			let raw: mesh_data_t = null;
-			if (Context.raw.project_type == project_model_t.SPHERE || Context.raw.project_type == project_model_t.TESSELLATED_PLANE) {
-				let mesh: any = Context.raw.project_type == project_model_t.SPHERE ?
-					Geom.make_uv_sphere(1, 512, 256) :
-					Geom.make_plane(1, 1, 512, 512);
-				mesh.name = "Tessellated";
-				raw = ImportMesh.raw_mesh(mesh);
-
-				///if is_sculpt
-				base_notify_on_next_frame(() => {
-					let f32a: Float32Array = new Float32Array(Config.get_texture_res_x() * Config.get_texture_res_y() * 4);
-					for (let i: i32 = 0; i < Math.floor(mesh.inda.length); ++i) {
-						let index: i32 = mesh.inda[i];
-						f32a[i * 4]     = mesh.posa[index * 4]     / 32767;
-						f32a[i * 4 + 1] = mesh.posa[index * 4 + 1] / 32767;
-						f32a[i * 4 + 2] = mesh.posa[index * 4 + 2] / 32767;
-						f32a[i * 4 + 3] = 1.0;
-					}
-
-					let imgmesh: image_t = image_from_bytes(f32a.buffer, Config.get_texture_res_x(), Config.get_texture_res_y(), tex_format_t.RGBA128);
-					let texpaint: image_t = Project.layers[0].texpaint;
-					g2_begin(texpaint);
-					g2_set_pipeline(base_pipe_copy128);
-					g2_draw_scaled_image(imgmesh, 0, 0, Config.get_texture_res_x(), Config.get_texture_res_y());
-					g2_set_pipeline(null);
-					g2_end();
-				});
-				///end
-			}
-			else {
-				let b: ArrayBuffer = data_get_blob("meshes/" + Project.mesh_list[Context.raw.project_type] + ".arm");
-				raw = armpack_decode(b).mesh_datas[0];
-			}
-
-			let md: mesh_data_t = mesh_data_create(raw);
-			data_cached_meshes.set("SceneTessellated", md);
-
-			if (Context.raw.project_type == project_model_t.TESSELLATED_PLANE) {
-				Viewport.set_view(0, 0, 0.75, 0, 0, 0); // Top
-			}
-		}
-
-		let n: string = Context.raw.project_type == project_model_t.ROUNDED_CUBE ? ".Cube" : "Tessellated";
-		let md: mesh_data_t = data_get_mesh("Scene", n);
-
-		let current: image_t = _g2_current;
-		if (current != null) g2_end();
-
-		///if is_paint
-		Context.raw.picker_mask_handle.position = picker_mask_t.NONE;
-		///end
-
-		mesh_object_set_data(Context.raw.paint_object, md);
-		vec4_set(Context.raw.paint_object.base.transform.scale, 1, 1, 1);
-		transform_build_matrix(Context.raw.paint_object.base.transform);
-		Context.raw.paint_object.base.name = n;
-		Project.paint_objects = [Context.raw.paint_object];
-		///if (is_paint || is_sculpt)
-		while (Project.materials.length > 0) SlotMaterial.unload(Project.materials.pop());
-		///end
-		let m: material_data_t = data_get_material("Scene", "Material");
-		///if (is_paint || is_sculpt)
-		Project.materials.push(SlotMaterial.create(m));
-		///end
-		///if is_lab
-		Project.material_data = m;
-		///end
-
-		///if (is_paint || is_sculpt)
-		Context.raw.material = Project.materials[0];
-		///end
-
-		UINodes.hwnd.redraws = 2;
-		UINodes.group_stack = [];
-		Project.material_groups = [];
-
-		///if (is_paint || is_sculpt)
-		Project.brushes = [SlotBrush.create()];
-		Context.raw.brush = Project.brushes[0];
-
-		Project.fonts = [SlotFont.create("default.ttf", base_font)];
-		Context.raw.font = Project.fonts[0];
-		///end
-
-		Project.set_default_swatches();
-		Context.raw.swatch = Project.raw.swatches[0];
-
-		Context.raw.picked_color = Project.make_swatch();
-		Context.raw.color_picker_callback = null;
-		History.reset();
-
-		MakeMaterial.parse_paint_material();
-
-		///if (is_paint || is_sculpt)
-		UtilRender.make_material_preview();
-		///end
-
-		for (let a of Project.assets) data_delete_image(a.file);
-		Project.assets = [];
-		Project.asset_names = [];
-		Project.asset_map = new Map();
-		Project.asset_id = 0;
-		Project.raw.packed_assets = [];
-		Context.raw.ddirty = 4;
-
-		///if (is_paint || is_sculpt)
-		UIBase.hwnds[tab_area_t.SIDEBAR0].redraws = 2;
-		UIBase.hwnds[tab_area_t.SIDEBAR1].redraws = 2;
-		///end
-
-		if (resetLayers) {
-
-			///if (is_paint || is_sculpt)
-			let aspect_ratio_changed: bool = Project.layers[0].texpaint.width != Config.get_texture_res_x() || Project.layers[0].texpaint.height != Config.get_texture_res_y();
-			while (Project.layers.length > 0) SlotLayer.unload(Project.layers.pop());
-			let layer: SlotLayerRaw = SlotLayer.create();
-			Project.layers.push(layer);
-			Context.set_layer(layer);
-			if (aspect_ratio_changed) {
-				app_notify_on_init(base_resize_layers);
-			}
-			///end
-
-			app_notify_on_init(base_init_layers);
-		}
-
-		if (current != null) g2_begin(current);
-
-		Context.raw.saved_envmap = null;
-		Context.raw.envmap_loaded = false;
-		scene_world._.envmap = Context.raw.empty_envmap;
-		scene_world.envmap = "World_radiance.k";
-		Context.raw.show_envmap_handle.selected = Context.raw.show_envmap = false;
-		scene_world._.radiance = Context.raw.default_radiance;
-		scene_world._.radiance_mipmaps = Context.raw.default_radiance_mipmaps;
-		scene_world._.irradiance = Context.raw.default_irradiance;
-		scene_world.strength = 4.0;
-
-		///if (is_paint || is_sculpt)
-		Context.init_tool();
-		///end
-
-		///if (krom_direct3d12 || krom_vulkan || krom_metal)
-		RenderPathRaytrace.ready = false;
-		///end
-	}
-
-	///if (is_paint || is_sculpt)
-	static import_material = () => {
-		UIFiles.show("arm,blend", false, true, (path: string) => {
-			path.endsWith(".blend") ?
-				ImportBlendMaterial.run(path) :
-				ImportArm.run_material(path);
-		});
-	}
-
-	static import_brush = () => {
-		UIFiles.show("arm," + Path.texture_formats.join(","), false, true, (path: string) => {
-			// Create brush from texture
-			if (Path.is_texture(path)) {
-				// Import texture
-				ImportAsset.run(path);
-				let asset_index: i32 = 0;
-				for (let i: i32 = 0; i < Project.assets.length; ++i) {
-					if (Project.assets[i].file == path) {
-						asset_index = i;
-						break;
-					}
-				}
-
-				// Create a new brush
-				Context.raw.brush = SlotBrush.create();
-				Project.brushes.push(Context.raw.brush);
-
-				// Create and link image node
-				let n: zui_node_t = NodesBrush.create_node("TEX_IMAGE");
-				n.x = 83;
-				n.y = 340;
-				n.buttons[0].default_value = asset_index;
-				let links: zui_node_link_t[] = Context.raw.brush.canvas.links;
-				links.push({
-					id: zui_get_link_id(links),
-					from_id: n.id,
-					from_socket: 0,
-					to_id: 0,
-					to_socket: 4
-				});
-
-				// Parse brush
-				MakeMaterial.parse_brush();
-				UINodes.hwnd.redraws = 2;
-				let _init = () => {
-					UtilRender.make_brush_preview();
-				}
-				app_notify_on_init(_init);
-			}
-			// Import from project file
-			else {
-				ImportArm.run_brush(path);
-			}
-		});
-	}
-	///end
-
-	static import_mesh = (replaceExisting: bool = true, done: ()=>void = null) => {
-		UIFiles.show(Path.mesh_formats.join(","), false, false, (path: string) => {
-			Project.import_mesh_box(path, replaceExisting, true, done);
-		});
-	}
-
-	static import_mesh_box = (path: string, replaceExisting: bool = true, clearLayers: bool = true, done: ()=>void = null) => {
-
-		///if krom_ios
-		// Import immediately while access to resource is unlocked
-		// data_get_blob(path, (b: Blob) => {});
-		///end
-
-		UIBox.show_custom((ui: zui_t) => {
-			let tab_vertical: bool = Config.raw.touch_ui;
-			if (zui_tab(zui_handle("project_3"), tr("Import Mesh"), tab_vertical)) {
-
-				if (path.toLowerCase().endsWith(".obj")) {
-					Context.raw.split_by = zui_combo(zui_handle("project_4"), [
-						tr("Object"),
-						tr("Group"),
-						tr("Material"),
-						tr("UDIM Tile"),
-					], tr("Split By"), true);
-					if (ui.is_hovered) zui_tooltip(tr("Split .obj mesh into objects"));
-				}
-
-				// if (path.toLowerCase().endsWith(".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.parse_vcols = zui_check(zui_handle("project_6", { selected: Context.raw.parse_vcols }), tr("Parse Vertex Colors"));
-					if (ui.is_hovered) zui_tooltip(tr("Import vertex color data"));
-				}
-				///end
-
-				zui_row([0.45, 0.45, 0.1]);
-				if (zui_button(tr("Cancel"))) {
-					UIBox.hide();
-				}
-				if (zui_button(tr("Import")) || ui.is_return_down) {
-					UIBox.hide();
-					let do_import = () => {
-						///if (is_paint || is_sculpt)
-						ImportMesh.run(path, clearLayers, replaceExisting);
-						///end
-						///if is_lab
-						ImportMesh.run(path, replaceExisting);
-						///end
-						if (done != null) done();
-					}
-					///if (krom_android || krom_ios)
-					base_notify_on_next_frame(() => {
-						Console.toast(tr("Importing mesh"));
-						base_notify_on_next_frame(do_import);
-					});
-					///else
-					do_import();
-					///end
-				}
-				if (zui_button(tr("?"))) {
-					File.load_url("https://github.com/armory3d/armorpaint_docs/blob/master/faq.md");
-				}
-			}
-		});
-		UIBox.click_to_hide = false; // Prevent closing when going back to window from file browser
-	}
-
-	static reimport_mesh = () => {
-		if (Project.mesh_assets != null && Project.mesh_assets.length > 0 && File.exists(Project.mesh_assets[0])) {
-			Project.import_mesh_box(Project.mesh_assets[0], true, false);
-		}
-		else Project.import_asset();
-	}
-
-	static unwrap_mesh_box = (mesh: any, done: (a: any)=>void, skipUI: bool = false) => {
-		UIBox.show_custom((ui: zui_t) => {
-			let tab_vertical: bool = Config.raw.touch_ui;
-			if (zui_tab(zui_handle("project_7"), tr("Unwrap Mesh"), tab_vertical)) {
-
-				let unwrapPlugins: string[] = [];
-				if (BoxPreferences.files_plugin == null) {
-					BoxPreferences.fetch_plugins();
-				}
-				for (let f of BoxPreferences.files_plugin) {
-					if (f.indexOf("uv_unwrap") >= 0 && f.endsWith(".js")) {
-						unwrapPlugins.push(f);
-					}
-				}
-				unwrapPlugins.push("equirect");
-
-				let unwrap_by: i32 = zui_combo(zui_handle("project_8"), unwrapPlugins, tr("Plugin"), true);
-
-				zui_row([0.5, 0.5]);
-				if (zui_button(tr("Cancel"))) {
-					UIBox.hide();
-				}
-				if (zui_button(tr("Unwrap")) || ui.is_return_down || skipUI) {
-					UIBox.hide();
-					let do_unwrap = () => {
-						if (unwrap_by == unwrapPlugins.length - 1) {
-							UtilMesh.equirect_unwrap(mesh);
-						}
-						else {
-							let f: string = unwrapPlugins[unwrap_by];
-							if (Config.raw.plugins.indexOf(f) == -1) {
-								Config.enable_plugin(f);
-								Console.info(f + " " + tr("plugin enabled"));
-							}
-							UtilMesh.unwrappers.get(f)(mesh);
-						}
-						done(mesh);
-					}
-					///if (krom_android || krom_ios)
-					base_notify_on_next_frame(() => {
-						Console.toast(tr("Unwrapping mesh"));
-						base_notify_on_next_frame(do_unwrap);
-					});
-					///else
-					do_unwrap();
-					///end
-				}
-			}
-		});
-	}
-
-	static import_asset = (filters: string = null, hdrAsEnvmap: bool = true) => {
-		if (filters == null) filters = Path.texture_formats.join(",") + "," + Path.mesh_formats.join(",");
-		UIFiles.show(filters, false, true, (path: string) => {
-			ImportAsset.run(path, -1.0, -1.0, true, hdrAsEnvmap);
-		});
-	}
-
-	static import_swatches = (replaceExisting: bool = false) => {
-		UIFiles.show("arm,gpl", false, false, (path: string) => {
-			if (Path.is_gimp_color_palette(path)) ImportGpl.run(path, replaceExisting);
-			else ImportArm.run_swatches(path, replaceExisting);
-		});
-	}
-
-	static reimport_textures = () => {
-		for (let asset of Project.assets) {
-			Project.reimport_texture(asset);
-		}
-	}
-
-	static reimport_texture = (asset: asset_t) => {
-		let load = (path: string) => {
-			asset.file = path;
-			let i: i32 = Project.assets.indexOf(asset);
-			data_delete_image(asset.file);
-			Project.asset_map.delete(asset.id);
-			let old_asset: asset_t = Project.assets[i];
-			Project.assets.splice(i, 1);
-			Project.asset_names.splice(i, 1);
-			ImportTexture.run(asset.file);
-			Project.assets.splice(i, 0, Project.assets.pop());
-			Project.asset_names.splice(i, 0, Project.asset_names.pop());
-
-			///if (is_paint || is_sculpt)
-			if (Context.raw.texture == old_asset) Context.raw.texture = Project.assets[i];
-			///end
-
-			let _next = () => {
-				MakeMaterial.parse_paint_material();
-
-				///if (is_paint || is_sculpt)
-				UtilRender.make_material_preview();
-				UIBase.hwnds[tab_area_t.SIDEBAR1].redraws = 2;
-				///end
-			}
-			base_notify_on_next_frame(_next);
-		}
-		if (!File.exists(asset.file)) {
-			let filters: string = Path.texture_formats.join(",");
-			UIFiles.show(filters, false, false, (path: string) => {
-				load(path);
-			});
-		}
-		else load(asset.file);
-	}
-
-	static get_image = (asset: asset_t): image_t => {
-		return asset != null ? Project.asset_map.get(asset.id) : null;
-	}
-
-	///if (is_paint || is_sculpt)
-	static get_used_atlases = (): string[] => {
-		if (Project.atlas_objects == null) return null;
-		let used: i32[] = [];
-		for (let i of Project.atlas_objects) if (used.indexOf(i) == -1) used.push(i);
-		if (used.length > 1) {
-			let res: string[] = [];
-			for (let i of used) res.push(Project.atlas_names[i]);
-			return res;
-		}
-		else return null;
-	}
-
-	static is_atlas_object = (p: mesh_object_t): bool => {
-		if (Context.raw.layer_filter <= Project.paint_objects.length) return false;
-		let atlas_name: string = Project.get_used_atlases()[Context.raw.layer_filter - Project.paint_objects.length - 1];
-		let atlas_i: i32 = Project.atlas_names.indexOf(atlas_name);
-		return atlas_i == Project.atlas_objects[Project.paint_objects.indexOf(p)];
-	}
-
-	static get_atlas_objects = (objectMask: i32): mesh_object_t[] => {
-		let atlas_name: string = Project.get_used_atlases()[objectMask - Project.paint_objects.length - 1];
-		let atlas_i: i32 = Project.atlas_names.indexOf(atlas_name);
-		let visibles: mesh_object_t[] = [];
-		for (let i: i32 = 0; i < Project.paint_objects.length; ++i) if (Project.atlas_objects[i] == atlas_i) visibles.push(Project.paint_objects[i]);
-		return visibles;
-	}
-	///end
-
-	static packed_asset_exists = (packed_assets: packed_asset_t[], name: string): bool => {
-		for (let pa of packed_assets) if (pa.name == name) return true;
-		return false;
-	}
-
-	static export_swatches = () => {
-		UIFiles.show("arm,gpl", true, false, (path: string) => {
-			let f: string = UIFiles.filename;
-			if (f == "") f = tr("untitled");
-			if (Path.is_gimp_color_palette(f)) ExportGpl.run(path + Path.sep + f, f.substring(0, f.lastIndexOf(".")), Project.raw.swatches);
-			else ExportArm.run_swatches(path + Path.sep + f);
-		});
-	}
-
-	static make_swatch = (base: i32 = 0xffffffff): swatch_color_t => {
-		return { base: base, opacity: 1.0, occlusion: 1.0, roughness: 0.0, metallic: 0.0, normal: 0xff8080ff, emission: 0.0, height: 0.0, subsurface: 0.0 };
-	}
-
-	static clone_swatch = (swatch: swatch_color_t): swatch_color_t => {
-		return { base: swatch.base, opacity: swatch.opacity, occlusion: swatch.occlusion, roughness: swatch.roughness, metallic: swatch.metallic, normal: swatch.normal, emission: swatch.emission, height: swatch.height, subsurface: swatch.subsurface };
-	}
-
-	static set_default_swatches = () => {
-		// 32-Color Palette by Andrew Kensler
-		// http://eastfarthing.com/blog/2016-05-06-palette/
-		Project.raw.swatches = [];
-		let colors: i32[] = [0xffffffff, 0xff000000, 0xffd6a090, 0xffa12c32, 0xfffa2f7a, 0xfffb9fda, 0xffe61cf7, 0xff992f7c, 0xff47011f, 0xff051155, 0xff4f02ec, 0xff2d69cb, 0xff00a6ee, 0xff6febff, 0xff08a29a, 0xff2a666a, 0xff063619, 0xff4a4957, 0xff8e7ba4, 0xffb7c0ff, 0xffacbe9c, 0xff827c70, 0xff5a3b1c, 0xffae6507, 0xfff7aa30, 0xfff4ea5c, 0xff9b9500, 0xff566204, 0xff11963b, 0xff51e113, 0xff08fdcc];
-		for (let c of colors) Project.raw.swatches.push(Project.make_swatch(c));
-	}
-
-	static get_material_group_by_name = (groupName: string): node_group_t => {
-		for (let g of Project.material_groups) if (g.canvas.name == groupName) return g;
-		return null;
-	}
-
-	///if (is_paint || is_sculpt)
-	static is_material_group_in_use = (group: node_group_t): bool => {
-		let canvases: zui_node_canvas_t[] = [];
-		for (let m of Project.materials) canvases.push(m.canvas);
-		for (let m of Project.material_groups) canvases.push(m.canvas);
-		for (let canvas of canvases) {
-			for (let n of canvas.nodes) {
-				if (n.type == "GROUP" && n.name == group.canvas.name) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-	///end
-}
-
-type node_group_t = {
-	nodes?: zui_nodes_t;
-	canvas?: zui_node_canvas_t;
-};

+ 50 - 50
base/Sources/RenderPathBase.ts

@@ -14,12 +14,12 @@ class RenderPathBase {
 	///end
 
 	static init = () => {
-		RenderPathBase.super_sample = Config.raw.rp_supersample;
+		RenderPathBase.super_sample = config_raw.rp_supersample;
 	}
 
 	///if arm_voxels
 	static init_voxels = (targetName: string = "voxels") => {
-		if (Config.raw.rp_gi != true || RenderPathBase.voxels_created) return;
+		if (config_raw.rp_gi != true || RenderPathBase.voxels_created) return;
 		RenderPathBase.voxels_created = true;
 
 		{
@@ -37,8 +37,8 @@ class RenderPathBase {
 	///end
 
 	static apply_config = () => {
-		if (RenderPathBase.super_sample != Config.raw.rp_supersample) {
-			RenderPathBase.super_sample = Config.raw.rp_supersample;
+		if (RenderPathBase.super_sample != config_raw.rp_supersample) {
+			RenderPathBase.super_sample = config_raw.rp_supersample;
 			for (let rt of render_path_render_targets.values()) {
 				if (rt.width == 0 && rt.scale != null) {
 					rt.scale = RenderPathBase.super_sample;
@@ -56,7 +56,7 @@ class RenderPathBase {
 	}
 
 	static draw_compass = () => {
-		if (Context.raw.show_compass) {
+		if (context_raw.show_compass) {
 			let cam: camera_object_t = scene_camera;
 			let compass: mesh_object_t = scene_get_child(".Compass").ext;
 
@@ -88,36 +88,36 @@ class RenderPathBase {
 
 	static begin = () => {
 		// Begin split
-		if (Context.raw.split_view && !Context.raw.paint2d_view) {
-			if (Context.raw.view_index_last == -1 && Context.raw.view_index == -1) {
+		if (context_raw.split_view && !context_raw.paint2d_view) {
+			if (context_raw.view_index_last == -1 && context_raw.view_index == -1) {
 				// Begin split, draw right viewport first
-				Context.raw.view_index = 1;
+				context_raw.view_index = 1;
 			}
 			else {
 				// Set current viewport
-				Context.raw.view_index = mouse_view_x() > base_w() / 2 ? 1 : 0;
+				context_raw.view_index = mouse_view_x() > base_w() / 2 ? 1 : 0;
 			}
 
 			let cam: camera_object_t = scene_camera;
-			if (Context.raw.view_index_last > -1) {
+			if (context_raw.view_index_last > -1) {
 				// Save current viewport camera
-				mat4_set_from(Camera.views[Context.raw.view_index_last], cam.base.transform.local);
+				mat4_set_from(camera_views[context_raw.view_index_last], cam.base.transform.local);
 			}
 
-			let decal: bool = Context.raw.tool == workspace_tool_t.DECAL || Context.raw.tool == workspace_tool_t.TEXT;
+			let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT;
 
-			if (Context.raw.view_index_last != Context.raw.view_index || decal || !Config.raw.brush_3d) {
+			if (context_raw.view_index_last != context_raw.view_index || decal || !config_raw.brush_3d) {
 				// Redraw on current viewport change
-				Context.raw.ddirty = 1;
+				context_raw.ddirty = 1;
 			}
 
-			transform_set_matrix(cam.base.transform, Camera.views[Context.raw.view_index]);
+			transform_set_matrix(cam.base.transform, camera_views[context_raw.view_index]);
 			camera_object_build_mat(cam);
 			camera_object_build_proj(cam);
 		}
 
 		// Match projection matrix jitter
-		let skip_taa: bool = Context.raw.split_view || ((Context.raw.tool == workspace_tool_t.CLONE || Context.raw.tool == workspace_tool_t.BLUR || Context.raw.tool == workspace_tool_t.SMUDGE) && Context.raw.pdirty > 0);
+		let skip_taa: bool = context_raw.split_view || ((context_raw.tool == workspace_tool_t.CLONE || context_raw.tool == workspace_tool_t.BLUR || context_raw.tool == workspace_tool_t.SMUDGE) && context_raw.pdirty > 0);
 		scene_camera.frame = skip_taa ? 0 : RenderPathBase.taa_frame;
 		camera_object_proj_jitter(scene_camera);
 		camera_object_build_mat(scene_camera);
@@ -125,19 +125,19 @@ class RenderPathBase {
 
 	static end = () => {
 		// End split
-		Context.raw.view_index_last = Context.raw.view_index;
-		Context.raw.view_index = -1;
+		context_raw.view_index_last = context_raw.view_index;
+		context_raw.view_index = -1;
 
-		if (Context.raw.foreground_event && !mouse_down()) {
-			Context.raw.foreground_event = false;
-			Context.raw.pdirty = 0;
+		if (context_raw.foreground_event && !mouse_down()) {
+			context_raw.foreground_event = false;
+			context_raw.pdirty = 0;
 		}
 
 		RenderPathBase.taa_frame++;
 	}
 
 	static ssaa4 = (): bool => {
-		return Config.raw.rp_supersample == 4;
+		return config_raw.rp_supersample == 4;
 	}
 
 	static is_cached = (): bool => {
@@ -148,12 +148,12 @@ class RenderPathBase {
 		RenderPathBase.last_x = mouse_view_x();
 		RenderPathBase.last_y = mouse_view_y();
 
-		if (Context.raw.ddirty <= 0 && Context.raw.rdirty <= 0 && Context.raw.pdirty <= 0) {
-			if (mx != RenderPathBase.last_x || my != RenderPathBase.last_y || mouse_locked) Context.raw.ddirty = 0;
+		if (context_raw.ddirty <= 0 && context_raw.rdirty <= 0 && context_raw.pdirty <= 0) {
+			if (mx != RenderPathBase.last_x || my != RenderPathBase.last_y || mouse_locked) context_raw.ddirty = 0;
 			///if (krom_metal || krom_android)
-			if (Context.raw.ddirty > -6) {
+			if (context_raw.ddirty > -6) {
 			///else
-			if (Context.raw.ddirty > -2) {
+			if (context_raw.ddirty > -2) {
 			///end
 				render_path_set_target("");
 				render_path_bind_target("taa", "tex");
@@ -161,7 +161,7 @@ class RenderPathBase {
 					render_path_draw_shader("shader_datas/supersample_resolve/supersample_resolve") :
 					render_path_draw_shader("shader_datas/copy_pass/copy_pass");
 				RenderPathPaint.commands_cursor();
-				if (Context.raw.ddirty <= 0) Context.raw.ddirty--;
+				if (context_raw.ddirty <= 0) context_raw.ddirty--;
 			}
 			RenderPathBase.end();
 			return true;
@@ -179,9 +179,9 @@ class RenderPathBase {
 		RenderPathPaint.draw();
 
 		///if (krom_direct3d12 || krom_vulkan || krom_metal)
-		if (Context.raw.viewport_mode ==  viewport_mode_t.PATH_TRACE) {
+		if (context_raw.viewport_mode ==  viewport_mode_t.PATH_TRACE) {
 			///if is_paint
-			let use_live_layer: bool = Context.raw.tool == workspace_tool_t.MATERIAL;
+			let use_live_layer: bool = context_raw.tool == workspace_tool_t.MATERIAL;
 			///else
 			let use_live_layer: bool = false;
 			///end
@@ -196,7 +196,7 @@ class RenderPathBase {
 	}
 
 	static draw_bloom = (tex: string = "tex") => {
-		if (Config.raw.rp_bloom != false) {
+		if (config_raw.rp_bloom != false) {
 			if (RenderPathBase.bloom_mipmaps == null) {
 				RenderPathBase.bloom_mipmaps = [];
 
@@ -239,12 +239,12 @@ class RenderPathBase {
 	}
 
 	static draw_split = (drawCommands: ()=>void) => {
-		if (Context.raw.split_view && !Context.raw.paint2d_view) {
-			Context.raw.ddirty = 2;
+		if (context_raw.split_view && !context_raw.paint2d_view) {
+			context_raw.ddirty = 2;
 			let cam: camera_object_t = scene_camera;
 
-			Context.raw.view_index = Context.raw.view_index == 0 ? 1 : 0;
-			transform_set_matrix(cam.base.transform, Camera.views[Context.raw.view_index]);
+			context_raw.view_index = context_raw.view_index == 0 ? 1 : 0;
+			transform_set_matrix(cam.base.transform, camera_views[context_raw.view_index]);
 			camera_object_build_mat(cam);
 			camera_object_build_proj(cam);
 
@@ -252,17 +252,17 @@ class RenderPathBase {
 
 			///if (krom_direct3d12 || krom_vulkan || krom_metal)
 			///if is_paint
-			let use_live_layer: bool = Context.raw.tool == workspace_tool_t.MATERIAL;
+			let use_live_layer: bool = context_raw.tool == workspace_tool_t.MATERIAL;
 			///else
 			let use_live_layer: bool = false;
 			///end
-			Context.raw.viewport_mode == viewport_mode_t.PATH_TRACE ? RenderPathRaytrace.draw(use_live_layer) : drawCommands();
+			context_raw.viewport_mode == viewport_mode_t.PATH_TRACE ? RenderPathRaytrace.draw(use_live_layer) : drawCommands();
 			///else
 			drawCommands();
 			///end
 
-			Context.raw.view_index = Context.raw.view_index == 0 ? 1 : 0;
-			transform_set_matrix(cam.base.transform, Camera.views[Context.raw.view_index]);
+			context_raw.view_index = context_raw.view_index == 0 ? 1 : 0;
+			transform_set_matrix(cam.base.transform, camera_views[context_raw.view_index]);
 			camera_object_build_mat(cam);
 			camera_object_build_proj(cam);
 		}
@@ -270,15 +270,15 @@ class RenderPathBase {
 
 	///if arm_voxels
 	static draw_voxels = () => {
-		if (Config.raw.rp_gi != false) {
-			let voxelize: bool = Context.raw.ddirty > 0 && RenderPathBase.taa_frame > 0;
+		if (config_raw.rp_gi != false) {
+			let voxelize: bool = context_raw.ddirty > 0 && RenderPathBase.taa_frame > 0;
 			if (voxelize) {
 				render_path_clear_image("voxels", 0x00000000);
 				render_path_set_target("");
 				render_path_set_viewport(RenderPathBase.voxels_res, RenderPathBase.voxels_res);
 				render_path_bind_target("voxels", "voxels");
 				if (MakeMaterial.height_used) {
-					let tid: i32 = 0; // Project.layers[0].id;
+					let tid: i32 = 0; // layers[0].id;
 					render_path_bind_target("texpaint_pack" + tid, "texpaint_pack");
 				}
 				render_path_draw_meshes("voxel");
@@ -313,8 +313,8 @@ class RenderPathBase {
 	}
 
 	static draw_ssao = () => {
-		let ssao: bool = Config.raw.rp_ssao != false && Context.raw.camera_type == camera_type_t.PERSPECTIVE;
-		if (ssao && Context.raw.ddirty > 0 && RenderPathBase.taa_frame > 0) {
+		let ssao: bool = config_raw.rp_ssao != false && context_raw.camera_type == camera_type_t.PERSPECTIVE;
+		if (ssao && context_raw.ddirty > 0 && RenderPathBase.taa_frame > 0) {
 			if (render_path_render_targets.get("singlea") == null) {
 				RenderPathBase.init_ssao();
 			}
@@ -341,7 +341,7 @@ class RenderPathBase {
 		render_path_bind_target("_main", "gbufferD");
 		render_path_bind_target("gbuffer0", "gbuffer0");
 		render_path_bind_target("gbuffer1", "gbuffer1");
-		let ssao: bool = Config.raw.rp_ssao != false && Context.raw.camera_type == camera_type_t.PERSPECTIVE;
+		let ssao: bool = config_raw.rp_ssao != false && context_raw.camera_type == camera_type_t.PERSPECTIVE;
 		if (ssao && RenderPathBase.taa_frame > 0) {
 			render_path_bind_target("singlea", "ssaotex");
 		}
@@ -351,7 +351,7 @@ class RenderPathBase {
 
 		let voxelao_pass: bool = false;
 		///if arm_voxels
-		if (Config.raw.rp_gi != false) {
+		if (config_raw.rp_gi != false) {
 			voxelao_pass = true;
 			render_path_bind_target("voxels", "voxels");
 		}
@@ -374,7 +374,7 @@ class RenderPathBase {
 	}
 
 	static draw_ssr = () => {
-		if (Config.raw.rp_ssr != false) {
+		if (config_raw.rp_ssr != false) {
 			if (_render_path_cached_shader_contexts.get("shader_datas/ssr_pass/ssr_pass") == null) {
 				{
 					let t: render_target_t = render_target_create();
@@ -411,7 +411,7 @@ class RenderPathBase {
 	}
 
 	// static draw_motion_blur = () => {
-	// 	if (Config.raw.rp_motionblur != false) {
+	// 	if (config_raw.rp_motionblur != false) {
 	// 		render_path_set_target("buf");
 	// 		render_path_bind_target("tex", "tex");
 	// 		render_path_bind_target("gbuffer0", "gbuffer0");
@@ -469,7 +469,7 @@ class RenderPathBase {
 		render_path_bind_target("gbuffer2", "sveloc");
 		render_path_draw_shader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
 
-		let skip_taa: bool = Context.raw.split_view;
+		let skip_taa: bool = context_raw.split_view;
 		if (skip_taa) {
 			render_path_set_target("taa");
 			render_path_bind_target(current, "tex");
@@ -532,9 +532,9 @@ class RenderPathBase {
 			}
 		}
 
-		let hide: bool = Operator.shortcut(Config.keymap.stencil_hide, ShortcutType.ShortcutDown) || keyboard_down("control");
+		let hide: bool = operator_shortcut(config_keymap.stencil_hide, shortcut_type_t.DOWN) || keyboard_down("control");
 		let is_decal: bool = base_is_decal_layer();
-		if (is_decal && !hide) LineDraw.render(Context.raw.layer.decal_mat);
+		if (is_decal && !hide) line_draw_render(context_raw.layer.decal_mat);
 	}
 
 	static make_gbuffer_copy_textures = () => {

+ 1 - 1
base/Sources/RenderPathDeferred.ts

@@ -135,7 +135,7 @@ class RenderPathDeferred {
 		}
 		///end
 
-		if (Config.raw.rp_ssao) {
+		if (config_raw.rp_ssao) {
 			RenderPathBase.init_ssao();
 		}
 

+ 22 - 22
base/Sources/RenderPathRaytrace.ts

@@ -36,18 +36,18 @@ class RenderPathRaytrace {
 		if (!RenderPathRaytrace.ready || RenderPathRaytrace.is_bake) {
 			RenderPathRaytrace.ready = true;
 			RenderPathRaytrace.is_bake = false;
-			let mode: string = Context.raw.pathtrace_mode == path_trace_mode_t.CORE ? "core" : "full";
+			let mode: string = context_raw.pathtrace_mode == path_trace_mode_t.CORE ? "core" : "full";
 			RenderPathRaytrace.raytrace_init("raytrace_brute_" + mode + RenderPathRaytrace.ext);
 			RenderPathRaytrace.last_envmap = null;
 		}
 
-		if (!Context.raw.envmap_loaded) {
-			Context.load_envmap();
-			Context.update_envmap();
+		if (!context_raw.envmap_loaded) {
+			context_load_envmap();
+			context_update_envmap();
 		}
 
 		let probe: world_data_t = scene_world;
-		let saved_envmap: image_t = Context.raw.show_envmap_blur ? probe._.radiance_mipmaps[0] : Context.raw.saved_envmap;
+		let saved_envmap: image_t = context_raw.show_envmap_blur ? probe._.radiance_mipmaps[0] : context_raw.saved_envmap;
 
 		if (RenderPathRaytrace.last_envmap != saved_envmap) {
 			RenderPathRaytrace.last_envmap = saved_envmap;
@@ -73,7 +73,7 @@ class RenderPathRaytrace {
 		}
 		///end
 
-		if (Context.raw.pdirty > 0 || RenderPathRaytrace.dirty > 0) {
+		if (context_raw.pdirty > 0 || RenderPathRaytrace.dirty > 0) {
 			base_flatten(true);
 		}
 
@@ -110,8 +110,8 @@ class RenderPathRaytrace {
 		RenderPathRaytrace.f32a[18] = RenderPathRaytrace.help_mat.m[14];
 		RenderPathRaytrace.f32a[19] = RenderPathRaytrace.help_mat.m[15];
 		RenderPathRaytrace.f32a[20] = scene_world.strength * 1.5;
-		if (!Context.raw.show_envmap) RenderPathRaytrace.f32a[20] = -RenderPathRaytrace.f32a[20];
-		RenderPathRaytrace.f32a[21] = Context.raw.envmap_angle;
+		if (!context_raw.show_envmap) RenderPathRaytrace.f32a[20] = -RenderPathRaytrace.f32a[20];
+		RenderPathRaytrace.f32a[21] = context_raw.envmap_angle;
 		RenderPathRaytrace.f32a[22] = RenderPathRaytrace.uv_scale;
 		///if is_lab
 		RenderPathRaytrace.f32a[22] *= scene_meshes[0].data.scale_tex;
@@ -120,18 +120,18 @@ class RenderPathRaytrace {
 		let framebuffer: image_t = render_path_render_targets.get("buf")._image;
 		krom_raytrace_dispatch_rays(framebuffer.render_target_, RenderPathRaytrace.f32a.buffer);
 
-		if (Context.raw.ddirty == 1 || Context.raw.pdirty == 1) {
+		if (context_raw.ddirty == 1 || context_raw.pdirty == 1) {
 			///if krom_metal
-			Context.raw.rdirty = 128;
+			context_raw.rdirty = 128;
 			///else
-			Context.raw.rdirty = 4;
+			context_raw.rdirty = 4;
 			///end
 		}
-		Context.raw.ddirty--;
-		Context.raw.pdirty--;
-		Context.raw.rdirty--;
+		context_raw.ddirty--;
+		context_raw.pdirty--;
+		context_raw.rdirty--;
 
-		// Context.raw.ddirty = 1; // _RENDER
+		// raw.ddirty = 1; // _RENDER
 	}
 
 	static raytrace_init = (shaderName: string, build: bool = true) => {
@@ -148,9 +148,9 @@ class RenderPathRaytrace {
 	}
 
 	static build_data = () => {
-		if (Context.raw.merged_object == null) UtilMesh.merge_mesh();
+		if (context_raw.merged_object == null) UtilMesh.merge_mesh();
 		///if is_paint
-		let mo: mesh_object_t = !Context.layer_filter_used() ? Context.raw.merged_object : Context.raw.paint_object;
+		let mo: mesh_object_t = !context_layer_filter_used() ? context_raw.merged_object : context_raw.paint_object;
 		///else
 		let mo: mesh_object_t = scene_meshes[0];
 		///end
@@ -163,18 +163,18 @@ class RenderPathRaytrace {
 	}
 
 	static draw = (useLiveLayer: bool) => {
-		let is_live: bool = Config.raw.brush_live && RenderPathPaint.live_layer_drawn > 0;
-		if (Context.raw.ddirty > 1 || Context.raw.pdirty > 0 || is_live) RenderPathRaytrace.frame = 0;
+		let is_live: bool = config_raw.brush_live && RenderPathPaint.live_layer_drawn > 0;
+		if (context_raw.ddirty > 1 || context_raw.pdirty > 0 || is_live) RenderPathRaytrace.frame = 0;
 
 		///if krom_metal
 		// Delay path tracing additional samples while painting
 		let down: bool = mouse_down() || pen_down();
-		if (Context.in_viewport() && down) RenderPathRaytrace.frame = 0;
+		if (context_in_viewport() && down) RenderPathRaytrace.frame = 0;
 		///end
 
 		RenderPathRaytrace.commands(useLiveLayer);
 
-		if (Config.raw.rp_bloom != false) {
+		if (config_raw.rp_bloom != false) {
 			RenderPathBase.draw_bloom("buf");
 		}
 		render_path_set_target("buf");
@@ -187,7 +187,7 @@ class RenderPathRaytrace {
 		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) {
+		if (config_raw.brush_3d) {
 			RenderPathPaint.commands_cursor();
 		}
 	}

+ 32 - 32
base/Sources/RenderPathRaytraceBake.ts

@@ -13,9 +13,9 @@ class RenderPathRaytraceBake {
 
 	static commands = (parsePaintMaterial: (b?: bool)=>void): bool => {
 
-		if (!RenderPathRaytrace.ready || !RenderPathRaytrace.is_bake || RenderPathRaytraceBake.last_bake != Context.raw.bake_type) {
-			let rebuild: bool = !(RenderPathRaytrace.ready && RenderPathRaytrace.is_bake && RenderPathRaytraceBake.last_bake != Context.raw.bake_type);
-			RenderPathRaytraceBake.last_bake = Context.raw.bake_type;
+		if (!RenderPathRaytrace.ready || !RenderPathRaytrace.is_bake || RenderPathRaytraceBake.last_bake != context_raw.bake_type) {
+			let rebuild: bool = !(RenderPathRaytrace.ready && RenderPathRaytrace.is_bake && RenderPathRaytraceBake.last_bake != context_raw.bake_type);
+			RenderPathRaytraceBake.last_bake = context_raw.bake_type;
 			RenderPathRaytrace.ready = true;
 			RenderPathRaytrace.is_bake = true;
 			RenderPathRaytrace.last_envmap = null;
@@ -30,36 +30,36 @@ class RenderPathRaytraceBake {
 			{
 				let t: render_target_t = render_target_create();
 				t.name = "baketex0";
-				t.width = Config.get_texture_res_x();
-				t.height = Config.get_texture_res_y();
+				t.width = config_get_texture_res_x();
+				t.height = config_get_texture_res_y();
 				t.format = "RGBA64";
 				render_path_create_render_target(t);
 			}
 			{
 				let t: render_target_t = render_target_create();
 				t.name = "baketex1";
-				t.width = Config.get_texture_res_x();
-				t.height = Config.get_texture_res_y();
+				t.width = config_get_texture_res_x();
+				t.height = config_get_texture_res_y();
 				t.format = "RGBA64";
 				render_path_create_render_target(t);
 			}
 			{
 				let t: render_target_t = render_target_create();
 				t.name = "baketex2";
-				t.width = Config.get_texture_res_x();
-				t.height = Config.get_texture_res_y();
+				t.width = config_get_texture_res_x();
+				t.height = config_get_texture_res_y();
 				t.format = "RGBA64"; // Match raytrace_target format
 				render_path_create_render_target(t);
 			}
 
-			let _bake_type: bake_type_t = Context.raw.bake_type;
-			Context.raw.bake_type = bake_type_t.INIT;
+			let _bake_type: bake_type_t = context_raw.bake_type;
+			context_raw.bake_type = bake_type_t.INIT;
 			parsePaintMaterial();
 			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.bake_type = _bake_type;
+			context_raw.bake_type = _bake_type;
 			let _next = () => {
 				parsePaintMaterial();
 			}
@@ -70,44 +70,44 @@ class RenderPathRaytraceBake {
 			return false;
 		}
 
-		if (!Context.raw.envmap_loaded) {
-			Context.load_envmap();
-			Context.update_envmap();
+		if (!context_raw.envmap_loaded) {
+			context_load_envmap();
+			context_update_envmap();
 		}
 		let probe: world_data_t = scene_world;
-		let saved_envmap: image_t = Context.raw.show_envmap_blur ? probe._.radiance_mipmaps[0] : Context.raw.saved_envmap;
-		if (RenderPathRaytrace.last_envmap != saved_envmap || RenderPathRaytraceBake.last_layer != Context.raw.layer.texpaint) {
+		let saved_envmap: image_t = context_raw.show_envmap_blur ? probe._.radiance_mipmaps[0] : context_raw.saved_envmap;
+		if (RenderPathRaytrace.last_envmap != saved_envmap || RenderPathRaytraceBake.last_layer != context_raw.layer.texpaint) {
 			RenderPathRaytrace.last_envmap = saved_envmap;
-			RenderPathRaytraceBake.last_layer = Context.raw.layer.texpaint;
+			RenderPathRaytraceBake.last_layer = context_raw.layer.texpaint;
 
 			let baketex0: image_t = render_path_render_targets.get("baketex0")._image;
 			let baketex1: image_t = render_path_render_targets.get("baketex1")._image;
 			let bnoise_sobol: image_t = scene_embedded.get("bnoise_sobol.k");
 			let bnoise_scramble: image_t = scene_embedded.get("bnoise_scramble.k");
 			let bnoise_rank: image_t = scene_embedded.get("bnoise_rank.k");
-			let texpaint_undo: image_t = render_path_render_targets.get("texpaint_undo" + History.undo_i)._image;
+			let texpaint_undo: image_t = render_path_render_targets.get("texpaint_undo" + history_undo_i)._image;
 			krom_raytrace_set_textures(baketex0, baketex1, texpaint_undo, saved_envmap.texture_, bnoise_sobol.texture_, bnoise_scramble.texture_, bnoise_rank.texture_);
 		}
 
-		if (Context.raw.brush_time > 0) {
-			Context.raw.pdirty = 2;
-			Context.raw.rdirty = 2;
+		if (context_raw.brush_time > 0) {
+			context_raw.pdirty = 2;
+			context_raw.rdirty = 2;
 		}
 
-		if (Context.raw.pdirty > 0) {
+		if (context_raw.pdirty > 0) {
 			let f32a: Float32Array = RenderPathRaytrace.f32a;
 			f32a[0] = RenderPathRaytrace.frame++;
-			f32a[1] = Context.raw.bake_ao_strength;
-			f32a[2] = Context.raw.bake_ao_radius;
-			f32a[3] = Context.raw.bake_ao_offset;
+			f32a[1] = context_raw.bake_ao_strength;
+			f32a[2] = context_raw.bake_ao_radius;
+			f32a[3] = context_raw.bake_ao_offset;
 			f32a[4] = scene_world.strength;
-			f32a[5] = Context.raw.bake_up_axis;
-			f32a[6] = Context.raw.envmap_angle;
+			f32a[5] = context_raw.bake_up_axis;
+			f32a[6] = context_raw.envmap_angle;
 
 			let framebuffer: image_t = render_path_render_targets.get("baketex2")._image;
 			krom_raytrace_dispatch_rays(framebuffer.render_target_, f32a.buffer);
 
-			render_path_set_target("texpaint" + Context.raw.layer.id);
+			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");
 
@@ -139,9 +139,9 @@ class RenderPathRaytraceBake {
 	}
 
 	static get_bake_shader_name = (): string => {
-		return Context.raw.bake_type == bake_type_t.AO  		? "raytrace_bake_ao" + RenderPathRaytrace.ext :
-			   Context.raw.bake_type == bake_type_t.LIGHTMAP 	? "raytrace_bake_light" + RenderPathRaytrace.ext :
-			   Context.raw.bake_type == bake_type_t.BENT_NORMAL  ? "raytrace_bake_bent" + RenderPathRaytrace.ext :
+		return context_raw.bake_type == bake_type_t.AO  		? "raytrace_bake_ao" + RenderPathRaytrace.ext :
+			   context_raw.bake_type == bake_type_t.LIGHTMAP 	? "raytrace_bake_light" + RenderPathRaytrace.ext :
+			   context_raw.bake_type == bake_type_t.BENT_NORMAL  ? "raytrace_bake_bent" + RenderPathRaytrace.ext :
 												  				  "raytrace_bake_thick" + RenderPathRaytrace.ext;
 	}
 }

+ 0 - 57
base/Sources/Res.ts

@@ -1,57 +0,0 @@
-
-class Res {
-
-	static bundled: Map<string, image_t> = new Map();
-
-	static load = (names: string[], done: ()=>void) => {
-		let loaded: i32 = 0;
-		for (let s of names) {
-			let image: image_t = data_get_image(s);
-			Res.bundled.set(s, image);
-			loaded++;
-			if (loaded == names.length) done();
-		}
-	}
-
-	static get = (name: string): image_t => {
-		return Res.bundled.get(name);
-	}
-
-	static tile50 = (img: image_t, x: i32, y: i32): rect_t => {
-		let size: i32 = Config.raw.window_scale > 1 ? 100 : 50;
-		return { x: x * size, y: y * size, w: size, h: size };
-	}
-
-	static tile25 = (img: image_t, x: i32, y: i32): rect_t => {
-		let size: i32 = Config.raw.window_scale > 1 ? 50 : 25;
-		return { x: x * size, y: y * size, w: size, h: size };
-	}
-
-	static tile18 = (img: image_t, x: i32, y: i32): rect_t => {
-		let size: i32 = Config.raw.window_scale > 1 ? 36 : 18;
-		return { x: x * size, y: img.height - (y + 1) * size, w: size, h: size };
-	}
-
-	///if arm_snapshot
-	static embed_raw = (handle: string, name: string, file: ArrayBuffer) => {
-		data_cached_blobs.set(name, file);
-		data_get_scene_raw(handle, (_) => {});
-		data_cached_blobs.delete(name);
-	}
-
-	static embed_blob = (name: string, file: ArrayBuffer) => {
-		data_cached_blobs.set(name, file);
-	}
-
-	static embed_font = (name: string, file: ArrayBuffer) => {
-		data_cached_fonts.set(name, g2_font_create(file));
-	}
-	///end
-}
-
-type rect_t = {
-	x?: i32;
-	y?: i32;
-	w?: i32;
-	h?: i32;
-};

+ 0 - 23
base/Sources/Strings.ts

@@ -1,23 +0,0 @@
-
-class Strings {
-	static error0 = (): string => { return tr("Error: .arm file expected"); }
-	static error1 = (): string => { return tr("Error: Unknown asset format"); }
-	static error2 = (): string => { return tr("Error: Could not locate texture"); }
-	static error3 = (): string => { return tr("Error: Failed to read mesh data"); }
-	static error5 = (): string => { return tr("Error: Check internet connection to access the cloud"); }
-	static info0 = (): string => { return tr("Info: Asset already imported"); }
-
-	static get graphics_api(): string {
-		///if krom_direct3d11
-		return "Direct3D11";
-		///elseif krom_direct3d12
-		return "Direct3D12";
-		///elseif krom_metal
-		return "Metal";
-		///elseif krom_vulkan
-		return "Vulkan";
-		///else
-		return "OpenGL";
-		///end
-	}
-}

+ 29 - 29
base/Sources/TabBrowser.ts

@@ -14,17 +14,17 @@ class TabBrowser {
 
 	static draw = (htab: zui_handle_t) => {
 		let ui: zui_t = UIBase.ui;
-		let statush: i32 = Config.raw.layout[layout_size_t.STATUS_H];
+		let statush: i32 = config_raw.layout[layout_size_t.STATUS_H];
 		if (zui_tab(htab, tr("Browser")) && statush > UIStatus.default_status_h * zui_SCALE(ui)) {
 
-			if (Config.raw.bookmarks == null) {
-				Config.raw.bookmarks = [];
+			if (config_raw.bookmarks == null) {
+				config_raw.bookmarks = [];
 			}
 
 			let bookmarks_w: i32 = 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];
+			if (TabBrowser.hpath.text == "" && config_raw.bookmarks.length > 0) { // Init to first bookmark
+				TabBrowser.hpath.text = config_raw.bookmarks[0];
 			}
 
 			zui_begin_sticky();
@@ -37,8 +37,8 @@ class TabBrowser {
 			}
 
 			if (zui_button("+")) {
-				Config.raw.bookmarks.push(TabBrowser.hpath.text);
-				Config.save();
+				config_raw.bookmarks.push(TabBrowser.hpath.text);
+				config_save();
 			}
 			if (ui.is_hovered) zui_tooltip(tr("Add bookmark"));
 
@@ -84,25 +84,25 @@ class TabBrowser {
 			ui._x = bookmarks_w;
 			ui._w -= bookmarks_w;
 			UIFiles.file_browser(ui, TabBrowser.hpath, false, true, TabBrowser.hsearch.text, refresh, (file: string) => {
-				let file_name: string = file.substr(file.lastIndexOf(Path.sep) + 1);
+				let file_name: string = file.substr(file.lastIndexOf(path_sep) + 1);
 				if (file_name != "..") {
 					UIMenu.draw((ui: zui_t) => {
 						if (UIMenu.menu_button(ui, tr("Import"))) {
 							ImportAsset.run(file);
 						}
-						if (Path.is_texture(file)) {
+						if (path_is_texture(file)) {
 							if (UIMenu.menu_button(ui, tr("Set as Envmap"))) {
 								ImportAsset.run(file, -1.0, -1.0, true, true, () => {
 									base_notify_on_next_frame(() => {
 										let asset_index: i32 = -1;
-										for (let i: i32 = 0; i < Project.assets.length; ++i) {
-											if (Project.assets[i].file == file) {
+										for (let i: i32 = 0; i < project_assets.length; ++i) {
+											if (project_assets[i].file == file) {
 												asset_index = i;
 												break;
 											}
 										}
 										if (asset_index != -1) {
-											ImportEnvmap.run(file, Project.get_image(Project.assets[asset_index]));
+											ImportEnvmap.run(file, project_get_image(project_assets[asset_index]));
 										}
 									});
 								});
@@ -113,14 +113,14 @@ class TabBrowser {
 								ImportAsset.run(file, -1.0, -1.0, true, true, () => {
 									base_notify_on_next_frame(() => {
 										let asset_index: i32 = -1;
-										for (let i: i32 = 0; i < Project.assets.length; ++i) {
-											if (Project.assets[i].file == file) {
+										for (let i: i32 = 0; i < project_assets.length; ++i) {
+											if (project_assets[i].file == file) {
 												asset_index = i;
 												break;
 											}
 										}
 										if (asset_index != -1) {
-											base_create_image_mask(Project.assets[asset_index]);
+											base_create_image_mask(project_assets[asset_index]);
 										}
 									});
 								});
@@ -132,19 +132,19 @@ class TabBrowser {
 								ImportAsset.run(file, -1.0, -1.0, true, true, () => {
 									base_notify_on_next_frame(() => {
 										let asset_index: i32 = -1;
-										for (let i: i32 = 0; i < Project.assets.length; ++i) {
-											if (Project.assets[i].file == file) {
+										for (let i: i32 = 0; i < project_assets.length; ++i) {
+											if (project_assets[i].file == file) {
 												asset_index = i;
 												break;
 											}
 										}
 										if (asset_index != -1) {
-											Context.raw.colorid_handle.position = asset_index;
-											Context.raw.colorid_picked = false;
+											context_raw.colorid_handle.position = asset_index;
+											context_raw.colorid_picked = false;
 											UIToolbar.toolbar_handle.redraws = 1;
-											if (Context.raw.tool == workspace_tool_t.COLORID) {
+											if (context_raw.tool == workspace_tool_t.COLORID) {
 												UIHeader.header_handle.redraws = 2;
-												Context.raw.ddirty = 2;
+												context_raw.ddirty = 2;
 											}
 										}
 									});
@@ -153,9 +153,9 @@ class TabBrowser {
 							///end
 						}
 						if (UIMenu.menu_button(ui, tr("Open Externally"))) {
-							File.start(file);
+							file_start(file);
 						}
-					}, Path.is_texture(file) ? 5 : 2);
+					}, path_is_texture(file) ? 5 : 2);
 				}
 			});
 
@@ -164,9 +164,9 @@ class TabBrowser {
 				app_notify_on_init(() => {
 					ImportAsset.run(path);
 				});
-				TabBrowser.hpath.text = TabBrowser.hpath.text.substr(0, TabBrowser.hpath.text.lastIndexOf(Path.sep));
+				TabBrowser.hpath.text = TabBrowser.hpath.text.substr(0, TabBrowser.hpath.text.lastIndexOf(path_sep));
 			}
-			TabBrowser.known = TabBrowser.hpath.text.substr(TabBrowser.hpath.text.lastIndexOf(Path.sep)).indexOf(".") > 0;
+			TabBrowser.known = TabBrowser.hpath.text.substr(TabBrowser.hpath.text.lastIndexOf(path_sep)).indexOf(".") > 0;
 			///if krom_android
 			if (TabBrowser.hpath.text.endsWith("." + manifest_title.toLowerCase())) TabBrowser.known = false;
 			///end
@@ -201,8 +201,8 @@ class TabBrowser {
 				///end
 			}
 
-			for (let b of Config.raw.bookmarks) {
-				let folder: string = b.substr(b.lastIndexOf(Path.sep) + 1);
+			for (let b of config_raw.bookmarks) {
+				let folder: string = b.substr(b.lastIndexOf(path_sep) + 1);
 
 				if (zui_button(folder, zui_align_t.LEFT)) {
 					TabBrowser.hpath.text = b;
@@ -211,8 +211,8 @@ class TabBrowser {
 				if (ui.is_hovered && ui.input_released_r) {
 					UIMenu.draw((ui: zui_t) => {
 						if (UIMenu.menu_button(ui, tr("Delete"))) {
-							array_remove(Config.raw.bookmarks, b);
-							Config.save();
+							array_remove(config_raw.bookmarks, b);
+							config_save();
 						}
 					}, 1);
 				}

+ 42 - 42
base/Sources/TabBrushes.ts

@@ -9,13 +9,13 @@ class TabBrushes {
 			zui_begin_sticky();
 			zui_row([1 / 4, 1 / 4, 1 / 4]);
 			if (zui_button(tr("New"))) {
-				Context.raw.brush = SlotBrush.create();
-				Project.brushes.push(Context.raw.brush);
+				context_raw.brush = SlotBrush.create();
+				project_brushes.push(context_raw.brush);
 				MakeMaterial.parse_brush();
 				UINodes.hwnd.redraws = 2;
 			}
 			if (zui_button(tr("Import"))) {
-				Project.import_brush();
+				project_import_brush();
 			}
 			if (zui_button(tr("Nodes"))) {
 				UIBase.show_brush_nodes();
@@ -24,34 +24,34 @@ class TabBrushes {
 			zui_separator(3, false);
 
 			let slotw: i32 = Math.floor(51 * zui_SCALE(ui));
-			let num: i32 = Math.floor(Config.raw.layout[layout_size_t.SIDEBAR_W] / slotw);
+			let num: i32 = Math.floor(config_raw.layout[layout_size_t.SIDEBAR_W] / slotw);
 
-			for (let row: i32 = 0; row < Math.floor(Math.ceil(Project.brushes.length / num)); ++row) {
-				let mult: i32 = Config.raw.show_asset_names ? 2 : 1;
+			for (let row: i32 = 0; row < Math.floor(Math.ceil(project_brushes.length / num)); ++row) {
+				let mult: i32 = config_raw.show_asset_names ? 2 : 1;
 				let ar: f32[] = [];
 				for (let i: i32 = 0; i < num * mult; ++i) ar.push(1 / num);
 				zui_row(ar);
 
 				ui._x += 2;
-				let off: f32 = Config.raw.show_asset_names ? zui_ELEMENT_OFFSET(ui) * 10.0 : 6;
+				let off: f32 = config_raw.show_asset_names ? zui_ELEMENT_OFFSET(ui) * 10.0 : 6;
 				if (row > 0) ui._y += off;
 
 				for (let j: i32 = 0; j < num; ++j) {
 					let imgw: i32 = Math.floor(50 * zui_SCALE(ui));
 					let i: i32 = j + row * num;
-					if (i >= Project.brushes.length) {
+					if (i >= project_brushes.length) {
 						zui_end_element(imgw);
-						if (Config.raw.show_asset_names) zui_end_element(0);
+						if (config_raw.show_asset_names) zui_end_element(0);
 						continue;
 					}
-					let img: image_t = zui_SCALE(ui) > 1 ? Project.brushes[i].image : Project.brushes[i].image_icon;
-					let img_full: image_t = Project.brushes[i].image;
+					let img: image_t = zui_SCALE(ui) > 1 ? project_brushes[i].image : project_brushes[i].image_icon;
+					let img_full: image_t = project_brushes[i].image;
 
-					if (Context.raw.brush == Project.brushes[i]) {
+					if (context_raw.brush == project_brushes[i]) {
 						// Zui.fill(1, -2, img.width + 3, img.height + 3, ui.t.HIGHLIGHT_COL); // TODO
 						let off: i32 = row % 2 == 1 ? 1 : 0;
 						let w: i32 = 50;
-						if (Config.raw.window_scale > 1) w += Math.floor(Config.raw.window_scale * 2);
+						if (config_raw.window_scale > 1) w += Math.floor(config_raw.window_scale * 2);
 						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);
@@ -61,40 +61,40 @@ class TabBrushes {
 					let uix: f32 = ui._x;
 					//let uiy: f32 = ui._y;
 					let tile: i32 = zui_SCALE(ui) > 1 ? 100 : 50;
-					let state: zui_state_t = Project.brushes[i].preview_ready ? zui_image(img) : zui_image(Res.get("icons.k"), -1, -1.0, tile * 5, tile, tile, tile);
+					let state: zui_state_t = project_brushes[i].preview_ready ? zui_image(img) : zui_image(resource_get("icons.k"), -1, -1.0, tile * 5, tile, tile, tile);
 					if (state == zui_state_t.STARTED) {
-						if (Context.raw.brush != Project.brushes[i]) Context.select_brush(i);
-						if (time_time() - Context.raw.select_time < 0.25) UIBase.show_brush_nodes();
-						Context.raw.select_time = time_time();
+						if (context_raw.brush != project_brushes[i]) context_select_brush(i);
+						if (time_time() - context_raw.select_time < 0.25) UIBase.show_brush_nodes();
+						context_raw.select_time = time_time();
 						// app_drag_off_x = -(mouse_x - uix - ui._windowX - 3);
 						// app_drag_off_y = -(mouse_y - uiy - ui._windowY + 1);
-						// app_drag_brush = Context.raw.brush;
+						// app_drag_brush = raw.brush;
 					}
 					if (ui.is_hovered && ui.input_released_r) {
-						Context.select_brush(i);
-						let add: i32 = Project.brushes.length > 1 ? 1 : 0;
+						context_select_brush(i);
+						let add: i32 = project_brushes.length > 1 ? 1 : 0;
 						UIMenu.draw((ui: zui_t) => {
-							//let b: SlotBrushRaw = Project.brushes[i];
+							//let b: SlotBrushRaw = brushes[i];
 
 							if (UIMenu.menu_button(ui, tr("Export"))) {
-								Context.select_brush(i);
+								context_select_brush(i);
 								BoxExport.show_brush();
 							}
 
 							if (UIMenu.menu_button(ui, tr("Duplicate"))) {
 								let _init = () => {
-									Context.raw.brush = SlotBrush.create();
-									Project.brushes.push(Context.raw.brush);
-									let cloned: any = json_parse(json_stringify(Project.brushes[i].canvas));
-									Context.raw.brush.canvas = cloned;
-									Context.set_brush(Context.raw.brush);
+									context_raw.brush = SlotBrush.create();
+									project_brushes.push(context_raw.brush);
+									let cloned: any = json_parse(json_stringify(project_brushes[i].canvas));
+									context_raw.brush.canvas = cloned;
+									context_set_brush(context_raw.brush);
 									UtilRender.make_brush_preview();
 								}
 								app_notify_on_init(_init);
 							}
 
-							if (Project.brushes.length > 1 && UIMenu.menu_button(ui, tr("Delete"), "delete")) {
-								TabBrushes.delete_brush(Project.brushes[i]);
+							if (project_brushes.length > 1 && UIMenu.menu_button(ui, tr("Delete"), "delete")) {
+								TabBrushes.delete_brush(project_brushes[i]);
 							}
 						}, 2 + add);
 					}
@@ -102,26 +102,26 @@ class TabBrushes {
 					if (ui.is_hovered) {
 						if (img_full == null) {
 							app_notify_on_init(() => {
-								let _brush: SlotBrushRaw = Context.raw.brush;
-								Context.raw.brush = Project.brushes[i];
+								let _brush: SlotBrushRaw = context_raw.brush;
+								context_raw.brush = project_brushes[i];
 								MakeMaterial.parse_brush();
 								UtilRender.make_brush_preview();
-								Context.raw.brush = _brush;
+								context_raw.brush = _brush;
 							});
 						}
 						else {
 							zui_tooltip_image(img_full);
-							zui_tooltip(Project.brushes[i].canvas.name);
+							zui_tooltip(project_brushes[i].canvas.name);
 						}
 					}
 
-					if (Config.raw.show_asset_names) {
+					if (config_raw.show_asset_names) {
 						ui._x = uix;
 						ui._y += slotw * 0.9;
-						zui_text(Project.brushes[i].canvas.name, zui_align_t.CENTER);
-						if (ui.is_hovered) zui_tooltip(Project.brushes[i].canvas.name);
+						zui_text(project_brushes[i].canvas.name, zui_align_t.CENTER);
+						if (ui.is_hovered) zui_tooltip(project_brushes[i].canvas.name);
 						ui._y -= slotw * 0.9;
-						if (i == Project.brushes.length - 1) {
+						if (i == project_brushes.length - 1) {
 							ui._y += j == num - 1 ? imgw : imgw + zui_ELEMENT_H(ui) + zui_ELEMENT_OFFSET(ui);
 						}
 					}
@@ -132,17 +132,17 @@ class TabBrushes {
 
 			let in_focus: bool = ui.input_x > ui._window_x && ui.input_x < ui._window_x + ui._window_w &&
 						  		 ui.input_y > ui._window_y && ui.input_y < ui._window_y + ui._window_h;
-			if (in_focus && ui.is_delete_down && Project.brushes.length > 1) {
+			if (in_focus && ui.is_delete_down && project_brushes.length > 1) {
 				ui.is_delete_down = false;
-				TabBrushes.delete_brush(Context.raw.brush);
+				TabBrushes.delete_brush(context_raw.brush);
 			}
 		}
 	}
 
 	static delete_brush = (b: SlotBrushRaw) => {
-		let i: i32 = Project.brushes.indexOf(b);
-		Context.select_brush(i == Project.brushes.length - 1 ? i - 1 : i + 1);
-		Project.brushes.splice(i, 1);
+		let i: i32 = project_brushes.indexOf(b);
+		context_select_brush(i == project_brushes.length - 1 ? i - 1 : i + 1);
+		project_brushes.splice(i, 1);
 		UIBase.hwnds[1].redraws = 2;
 	}
 }

+ 10 - 10
base/Sources/TabConsole.ts

@@ -4,22 +4,22 @@ class TabConsole {
 	static draw = (htab: zui_handle_t) => {
 		let ui: zui_t = UIBase.ui;
 
-		let title: string = Console.message_timer > 0 ? Console.message + "        " : tr("Console");
-		let color: i32 = Console.message_timer > 0 ? Console.message_color : -1;
+		let title: string = console_message_timer > 0 ? console_message + "        " : tr("Console");
+		let color: i32 = console_message_timer > 0 ? console_message_color : -1;
 
-		let statush: i32 = Config.raw.layout[layout_size_t.STATUS_H];
+		let statush: i32 = config_raw.layout[layout_size_t.STATUS_H];
 		if (zui_tab(htab, title, false, color) && statush > UIStatus.default_status_h * zui_SCALE(ui)) {
 
 			zui_begin_sticky();
 			///if (krom_windows || krom_linux || krom_darwin) // Copy
-			if (Config.raw.touch_ui) {
+			if (config_raw.touch_ui) {
 				zui_row([1 / 4, 1 / 4, 1 / 4]);
 			}
 			else {
 				zui_row([1 / 14, 1 / 14, 1 / 14]);
 			}
 			///else
-			if (Config.raw.touch_ui) {
+			if (config_raw.touch_ui) {
 				zui_row([1 / 4, 1 / 4]);
 			}
 			else {
@@ -28,21 +28,21 @@ class TabConsole {
 			///end
 
 			if (zui_button(tr("Clear"))) {
-				Console.last_traces = [];
+				console_last_traces = [];
 			}
 			if (zui_button(tr("Export"))) {
-				let str: string = Console.last_traces.join("\n");
+				let str: string = console_last_traces.join("\n");
 				UIFiles.show("txt", true, false, (path: string) => {
 					let f: string = UIFiles.filename;
 					if (f == "") f = tr("untitled");
-					path = path + Path.sep + f;
+					path = path + path_sep + f;
 					if (!path.endsWith(".txt")) path += ".txt";
 					krom_file_save_bytes(path, sys_string_to_buffer(str));
 				});
 			}
 			///if (krom_windows || krom_linux || krom_darwin)
 			if (zui_button(tr("Copy"))) {
-				let str: string = Console.last_traces.join("\n");
+				let str: string = console_last_traces.join("\n");
 				krom_copy_to_clipboard(str);
 			}
 			///end
@@ -54,7 +54,7 @@ class TabConsole {
 			let f: g2_font_t = data_get_font("font_mono.ttf");
 			zui_set_font(ui, f);
 			ui.font_size = Math.floor(15 * zui_SCALE(ui));
-			for (let t of Console.last_traces) {
+			for (let t of console_last_traces) {
 				zui_text(t);
 			}
 			zui_set_font(ui, _font);

+ 36 - 36
base/Sources/TabFonts.ts

@@ -5,18 +5,18 @@ class TabFonts {
 
 	static draw = (htab: zui_handle_t) => {
 		let ui: zui_t = UIBase.ui;
-		let statush: i32 = Config.raw.layout[layout_size_t.STATUS_H];
+		let statush: i32 = config_raw.layout[layout_size_t.STATUS_H];
 		if (zui_tab(htab, tr("Fonts")) && statush > UIStatus.default_status_h * zui_SCALE(ui)) {
 
 			zui_begin_sticky();
-			if (Config.raw.touch_ui) {
+			if (config_raw.touch_ui) {
 				zui_row([1 / 4, 1 / 4]);
 			}
 			else {
 				zui_row([1 / 14, 1 / 14]);
 			}
 
-			if (zui_button(tr("Import"))) Project.import_asset("ttf,ttc,otf");
+			if (zui_button(tr("Import"))) project_import_asset("ttf,ttc,otf");
 			if (ui.is_hovered) zui_tooltip(tr("Import font file"));
 
 			if (zui_button(tr("2D View"))) {
@@ -25,35 +25,35 @@ class TabFonts {
 			zui_end_sticky();
 			zui_separator(3, false);
 
-			let statusw: i32 = sys_width() - UIToolbar.toolbar_w - Config.raw.layout[layout_size_t.SIDEBAR_W];
+			let statusw: i32 = sys_width() - UIToolbar.toolbar_w - config_raw.layout[layout_size_t.SIDEBAR_W];
 			let slotw: i32 = Math.floor(51 * zui_SCALE(ui));
 			let num: i32 = Math.floor(statusw / slotw);
 
-			for (let row: i32 = 0; row < Math.floor(Math.ceil(Project.fonts.length / num)); ++row) {
-				let mult: i32 = Config.raw.show_asset_names ? 2 : 1;
+			for (let row: i32 = 0; row < Math.floor(Math.ceil(project_fonts.length / num)); ++row) {
+				let mult: i32 = config_raw.show_asset_names ? 2 : 1;
 				let ar: f32[] = [];
 				for (let i: i32 = 0; i < num * mult; ++i) ar.push(1 / num);
 				zui_row(ar);
 
 				ui._x += 2;
-				let off: f32 = Config.raw.show_asset_names ? zui_ELEMENT_OFFSET(ui) * 10.0 : 6;
+				let off: f32 = config_raw.show_asset_names ? zui_ELEMENT_OFFSET(ui) * 10.0 : 6;
 				if (row > 0) ui._y += off;
 
 				for (let j: i32 = 0; j < num; ++j) {
 					let imgw: i32 = Math.floor(50 * zui_SCALE(ui));
 					let i: i32 = j + row * num;
-					if (i >= Project.fonts.length) {
+					if (i >= project_fonts.length) {
 						zui_end_element(imgw);
-						if (Config.raw.show_asset_names) zui_end_element(0);
+						if (config_raw.show_asset_names) zui_end_element(0);
 						continue;
 					}
-					let img: image_t = Project.fonts[i].image;
+					let img: image_t = project_fonts[i].image;
 
-					if (Context.raw.font == Project.fonts[i]) {
+					if (context_raw.font == project_fonts[i]) {
 						// Zui.fill(1, -2, img.width + 3, img.height + 3, ui.t.HIGHLIGHT_COL); // TODO
 						let off: i32 = row % 2 == 1 ? 1 : 0;
 						let w: i32 = 50;
-						if (Config.raw.window_scale > 1) w += Math.floor(Config.raw.window_scale * 2);
+						if (config_raw.window_scale > 1) w += Math.floor(config_raw.window_scale * 2);
 						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);
@@ -63,7 +63,7 @@ class TabFonts {
 					let uix: f32 = ui._x;
 					let tile: i32 = zui_SCALE(ui) > 1 ? 100 : 50;
 					let state: zui_state_t = zui_state_t.IDLE;
-					if (Project.fonts[i].preview_ready) {
+					if (project_fonts[i].preview_ready) {
 						// g2_set_pipeline(UIView2D.pipe); // L8
 						// ///if krom_opengl
 						// g4_set_pipeline(UIView2D.pipe);
@@ -73,50 +73,50 @@ class TabFonts {
 						// g2_set_pipeline(null);
 					}
 					else {
-						state = zui_image(Res.get("icons.k"), -1, -1.0, tile * 6, tile, tile, tile);
+						state = zui_image(resource_get("icons.k"), -1, -1.0, tile * 6, tile, tile, tile);
 					}
 
 					if (state == zui_state_t.STARTED) {
-						if (Context.raw.font != Project.fonts[i]) {
+						if (context_raw.font != project_fonts[i]) {
 							let _init = () => {
-								Context.select_font(i);
+								context_select_font(i);
 							}
 							app_notify_on_init(_init);
 						}
-						if (time_time() - Context.raw.select_time < 0.25) UIBase.show_2d_view(view_2d_type_t.FONT);
-						Context.raw.select_time = time_time();
+						if (time_time() - context_raw.select_time < 0.25) UIBase.show_2d_view(view_2d_type_t.FONT);
+						context_raw.select_time = time_time();
 					}
 					if (ui.is_hovered && ui.input_released_r) {
-						Context.select_font(i);
-						let add: i32 = Project.fonts.length > 1 ? 1 : 0;
+						context_select_font(i);
+						let add: i32 = project_fonts.length > 1 ? 1 : 0;
 						UIMenu.draw((ui: zui_t) => {
-							if (Project.fonts.length > 1 && UIMenu.menu_button(ui, tr("Delete"), "delete") && Project.fonts[i].file != "") {
-								TabFonts.delete_font(Project.fonts[i]);
+							if (project_fonts.length > 1 && UIMenu.menu_button(ui, tr("Delete"), "delete") && project_fonts[i].file != "") {
+								TabFonts.delete_font(project_fonts[i]);
 							}
 						}, 0 + add);
 					}
 					if (ui.is_hovered) {
 						if (img == null) {
 							app_notify_on_init(() => {
-								let _font: SlotFontRaw = Context.raw.font;
-								Context.raw.font = Project.fonts[i];
+								let _font: SlotFontRaw = context_raw.font;
+								context_raw.font = project_fonts[i];
 								UtilRender.make_font_preview();
-								Context.raw.font = _font;
+								context_raw.font = _font;
 							});
 						}
 						else {
 							zui_tooltip_image(img);
-							zui_tooltip(Project.fonts[i].name);
+							zui_tooltip(project_fonts[i].name);
 						}
 					}
 
-					if (Config.raw.show_asset_names) {
+					if (config_raw.show_asset_names) {
 						ui._x = uix;
 						ui._y += slotw * 0.9;
-						zui_text(Project.fonts[i].name, zui_align_t.CENTER);
-						if (ui.is_hovered) zui_tooltip(Project.fonts[i].name);
+						zui_text(project_fonts[i].name, zui_align_t.CENTER);
+						if (ui.is_hovered) zui_tooltip(project_fonts[i].name);
 						ui._y -= slotw * 0.9;
-						if (i == Project.fonts.length - 1) {
+						if (i == project_fonts.length - 1) {
 							ui._y += j == num - 1 ? imgw : imgw + zui_ELEMENT_H(ui) + zui_ELEMENT_OFFSET(ui);
 						}
 					}
@@ -127,19 +127,19 @@ class TabFonts {
 
 			let in_focus: bool = ui.input_x > ui._window_x && ui.input_x < ui._window_x + ui._window_w &&
 						    	 ui.input_y > ui._window_y && ui.input_y < ui._window_y + ui._window_h;
-			if (in_focus && ui.is_delete_down && Project.fonts.length > 1 && Context.raw.font.file != "") {
+			if (in_focus && ui.is_delete_down && project_fonts.length > 1 && context_raw.font.file != "") {
 				ui.is_delete_down = false;
-				TabFonts.delete_font(Context.raw.font);
+				TabFonts.delete_font(context_raw.font);
 			}
 		}
 	}
 
 	static delete_font = (font: SlotFontRaw) => {
-		let i: i32 = Project.fonts.indexOf(font);
+		let i: i32 = project_fonts.indexOf(font);
 		let _init = () => {
-			Context.select_font(i == Project.fonts.length - 1 ? i - 1 : i + 1);
-			data_delete_font(Project.fonts[i].file);
-			Project.fonts.splice(i, 1);
+			context_select_font(i == project_fonts.length - 1 ? i - 1 : i + 1);
+			data_delete_font(project_fonts[i].file);
+			project_fonts.splice(i, 1);
 		}
 		app_notify_on_init(_init);
 		UIBase.hwnds[2].redraws = 2;

+ 5 - 5
base/Sources/TabHistory.ts

@@ -6,21 +6,21 @@ class TabHistory {
 	static draw = (htab: zui_handle_t) => {
 		let ui: zui_t = UIBase.ui;
 		if (zui_tab(htab, tr("History"))) {
-			for (let i: i32 = 0; i < History.steps.length; ++i) {
-				let active: i32 = History.steps.length - 1 - History.redos;
+			for (let i: i32 = 0; i < history_steps.length; ++i) {
+				let active: i32 = history_steps.length - 1 - history_redos;
 				if (i == active) {
 					zui_fill(0, 0, ui._window_w, ui.t.ELEMENT_H, ui.t.HIGHLIGHT_COL);
 				}
-				zui_text(History.steps[i].name);
+				zui_text(history_steps[i].name);
 				if (ui.is_released) { // Jump to undo step
 					let diff: i32 = i - active;
 					while (diff > 0) {
 						diff--;
-						History.redo();
+						history_redo();
 					}
 					while (diff < 0) {
 						diff++;
-						History.undo();
+						history_undo();
 					}
 				}
 				zui_fill(0, 0, (ui._window_w / zui_SCALE(ui) - 2), 1 * zui_SCALE(ui), ui.t.SEPARATOR_COL);

+ 58 - 58
base/Sources/TabMaterials.ts

@@ -4,7 +4,7 @@
 class TabMaterials {
 
 	static draw = (htab: zui_handle_t) => {
-		let mini: bool = Config.raw.layout[layout_size_t.SIDEBAR_W] <= UIBase.sidebar_mini_w;
+		let mini: bool = config_raw.layout[layout_size_t.SIDEBAR_W] <= UIBase.sidebar_mini_w;
 		mini ? TabMaterials.draw_mini(htab) : TabMaterials.draw_full(htab);
 	}
 
@@ -29,7 +29,7 @@ class TabMaterials {
 
 			TabMaterials.button_new(tr("New"));
 			if (zui_button(tr("Import"))) {
-				Project.import_material();
+				project_import_material();
 			}
 			TabMaterials.button_nodes();
 
@@ -44,37 +44,37 @@ class TabMaterials {
 		if (zui_button(tr("Nodes"))) {
 			UIBase.show_material_nodes();
 		}
-		else if (ui.is_hovered) zui_tooltip(tr("Show Node Editor") + ` (${Config.keymap.toggle_node_editor})`);
+		else if (ui.is_hovered) zui_tooltip(tr("Show Node Editor") + ` (${config_keymap.toggle_node_editor})`);
 	}
 
 	static draw_slots = (mini: bool) => {
 		let ui: zui_t = UIBase.ui;
 		let slotw: i32 = Math.floor(51 * zui_SCALE(ui));
-		let num: i32 = Math.floor(Config.raw.layout[layout_size_t.SIDEBAR_W] / slotw);
+		let num: i32 = Math.floor(config_raw.layout[layout_size_t.SIDEBAR_W] / slotw);
 
-		for (let row: i32 = 0; row < Math.floor(Math.ceil(Project.materials.length / num)); ++row) {
-			let mult: i32 = Config.raw.show_asset_names ? 2 : 1;
+		for (let row: i32 = 0; row < Math.floor(Math.ceil(project_materials.length / num)); ++row) {
+			let mult: i32 = config_raw.show_asset_names ? 2 : 1;
 			let ar: f32[] = [];
 			for (let i = 0; i < num * mult; ++i) ar.push(1 / num);
 			zui_row(ar);
 
 			ui._x += 2;
-			let off: f32 = Config.raw.show_asset_names ? zui_ELEMENT_OFFSET(ui) * 10.0 : 6;
+			let off: f32 = config_raw.show_asset_names ? zui_ELEMENT_OFFSET(ui) * 10.0 : 6;
 			if (row > 0) ui._y += off;
 
 			for (let j: i32 = 0; j < num; ++j) {
 				let imgw: i32 = Math.floor(50 * zui_SCALE(ui));
 				let i: i32 = j + row * num;
-				if (i >= Project.materials.length) {
+				if (i >= project_materials.length) {
 					zui_end_element(imgw);
-					if (Config.raw.show_asset_names) zui_end_element(0);
+					if (config_raw.show_asset_names) zui_end_element(0);
 					continue;
 				}
-				let img: image_t = zui_SCALE(ui) > 1 ? Project.materials[i].image : Project.materials[i].image_icon;
-				let imgFull: image_t = Project.materials[i].image;
+				let img: image_t = zui_SCALE(ui) > 1 ? project_materials[i].image : project_materials[i].image_icon;
+				let imgFull: image_t = project_materials[i].image;
 
 				// Highligh selected
-				if (Context.raw.material == Project.materials[i]) {
+				if (context_raw.material == project_materials[i]) {
 					if (mini) {
 						let w: f32 = ui._w / zui_SCALE(ui);
 						zui_rect(0, -2, w - 2, w - 4, ui.t.HIGHLIGHT_COL, 3);
@@ -82,7 +82,7 @@ class TabMaterials {
 					else {
 						let off: i32 = row % 2 == 1 ? 1 : 0;
 						let w: i32 = 50;
-						if (Config.raw.window_scale > 1) w += Math.floor(Config.raw.window_scale * 2);
+						if (config_raw.window_scale > 1) w += Math.floor(config_raw.window_scale * 2);
 						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);
@@ -91,7 +91,7 @@ class TabMaterials {
 				}
 
 				///if krom_opengl
-				ui.image_invert_y = Project.materials[i].preview_ready;
+				ui.image_invert_y = project_materials[i].preview_ready;
 				///end
 
 				// Draw material icon
@@ -99,14 +99,14 @@ class TabMaterials {
 				let uiy: f32 = ui._y;
 				let tile: i32 = zui_SCALE(ui) > 1 ? 100 : 50;
 				let imgh: f32 = mini ? UIBase.default_sidebar_mini_w * 0.85 * zui_SCALE(ui) : -1.0;
-				let state = Project.materials[i].preview_ready ?
+				let state = project_materials[i].preview_ready ?
 					zui_image(img, 0xffffffff, imgh) :
-					zui_image(Res.get("icons.k"), 0xffffffff, -1.0, tile, tile, tile, tile);
+					zui_image(resource_get("icons.k"), 0xffffffff, -1.0, tile, tile, tile, tile);
 
 				// Draw material numbers when selecting a material via keyboard shortcut
 				let is_typing: bool = ui.is_typing || UIView2D.ui.is_typing || UINodes.ui.is_typing;
 				if (!is_typing) {
-					if (i < 9 && Operator.shortcut(Config.keymap.select_material, ShortcutType.ShortcutDown)) {
+					if (i < 9 && operator_shortcut(config_keymap.select_material, shortcut_type_t.DOWN)) {
 						let number: string = String(i + 1);
 						let width: i32 = g2_font_width(ui.font, ui.font_size, number) + 10;
 						let height: i32 = g2_font_height(ui.font, ui.font_size);
@@ -119,10 +119,10 @@ class TabMaterials {
 
 				// Select material
 				if (state == zui_state_t.STARTED && ui.input_y > ui._window_y) {
-					if (Context.raw.material != Project.materials[i]) {
-						Context.select_material(i);
+					if (context_raw.material != project_materials[i]) {
+						context_select_material(i);
 						///if is_paint
-						if (Context.raw.tool == workspace_tool_t.MATERIAL) {
+						if (context_raw.tool == workspace_tool_t.MATERIAL) {
 							let _init = () => {
 								base_update_fill_layers();
 							}
@@ -132,54 +132,54 @@ class TabMaterials {
 					}
 					base_drag_off_x = -(mouse_x - uix - ui._window_x - 3);
 					base_drag_off_y = -(mouse_y - uiy - ui._window_y + 1);
-					base_drag_material = Context.raw.material;
+					base_drag_material = context_raw.material;
 					// Double click to show nodes
-					if (time_time() - Context.raw.select_time < 0.25) {
+					if (time_time() - context_raw.select_time < 0.25) {
 						UIBase.show_material_nodes();
 						base_drag_material = null;
 						base_is_dragging = false;
 					}
-					Context.raw.select_time = time_time();
+					context_raw.select_time = time_time();
 				}
 
 				// Context menu
 				if (ui.is_hovered && ui.input_released_r) {
-					Context.select_material(i);
-					let add: i32 = Project.materials.length > 1 ? 1 : 0;
+					context_select_material(i);
+					let add: i32 = project_materials.length > 1 ? 1 : 0;
 
 					UIMenu.draw((ui: zui_t) => {
-						let m: SlotMaterialRaw = Project.materials[i];
+						let m: SlotMaterialRaw = project_materials[i];
 
 						if (UIMenu.menu_button(ui, tr("To Fill Layer"))) {
-							Context.select_material(i);
+							context_select_material(i);
 							base_create_fill_layer();
 						}
 
 						if (UIMenu.menu_button(ui, tr("Export"))) {
-							Context.select_material(i);
+							context_select_material(i);
 							BoxExport.show_material();
 						}
 
 						///if is_paint
 						if (UIMenu.menu_button(ui, tr("Bake"))) {
-							Context.select_material(i);
+							context_select_material(i);
 							BoxExport.show_bake_material();
 						}
 						///end
 
 						if (UIMenu.menu_button(ui, tr("Duplicate"))) {
 							let _init = () => {
-								Context.raw.material = SlotMaterial.create(Project.materials[0].data);
-								Project.materials.push(Context.raw.material);
-								let cloned: zui_node_canvas_t = json_parse(json_stringify(Project.materials[i].canvas));
-								Context.raw.material.canvas = cloned;
+								context_raw.material = SlotMaterial.create(project_materials[0].data);
+								project_materials.push(context_raw.material);
+								let cloned: zui_node_canvas_t = json_parse(json_stringify(project_materials[i].canvas));
+								context_raw.material.canvas = cloned;
 								TabMaterials.update_material();
-								History.duplicate_material();
+								history_duplicate_material();
 							}
 							app_notify_on_init(_init);
 						}
 
-						if (Project.materials.length > 1 && UIMenu.menu_button(ui, tr("Delete"), "delete")) {
+						if (project_materials.length > 1 && UIMenu.menu_button(ui, tr("Delete"), "delete")) {
 							TabMaterials.delete_material(m);
 						}
 
@@ -226,20 +226,20 @@ class TabMaterials {
 				}
 				if (ui.is_hovered) {
 					zui_tooltip_image(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 (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) {
+				if (config_raw.show_asset_names) {
 					ui._x = uix;
 					ui._y += slotw * 0.9;
-					zui_text(Project.materials[i].canvas.name, zui_align_t.CENTER);
+					zui_text(project_materials[i].canvas.name, zui_align_t.CENTER);
 					if (ui.is_hovered) {
-						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 (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) {
+					if (i == project_materials.length - 1) {
 						ui._y += j == num - 1 ? imgw : imgw + zui_ELEMENT_H(ui) + zui_ELEMENT_OFFSET(ui);
 					}
 				}
@@ -254,9 +254,9 @@ class TabMaterials {
 
 		let in_focus: bool = ui.input_x > ui._window_x && ui.input_x < ui._window_x + ui._window_w &&
 					    	 ui.input_y > ui._window_y && ui.input_y < ui._window_y + ui._window_h;
-		if (in_focus && ui.is_delete_down && Project.materials.length > 1) {
+		if (in_focus && ui.is_delete_down && project_materials.length > 1) {
 			ui.is_delete_down = false;
-			TabMaterials.delete_material(Context.raw.material);
+			TabMaterials.delete_material(context_raw.material);
 		}
 	}
 
@@ -264,11 +264,11 @@ class TabMaterials {
 		if (zui_button(text)) {
 			let current: image_t = _g2_current;
 			g2_end();
-			Context.raw.material = SlotMaterial.create(Project.materials[0].data);
-			Project.materials.push(Context.raw.material);
+			context_raw.material = SlotMaterial.create(project_materials[0].data);
+			project_materials.push(context_raw.material);
 			TabMaterials.update_material();
 			g2_begin(current);
-			History.new_material();
+			history_new_material();
 		}
 	}
 
@@ -278,7 +278,7 @@ class TabMaterials {
 		UINodes.group_stack = [];
 		MakeMaterial.parse_paint_material();
 		UtilRender.make_material_preview();
-		let decal: bool = Context.raw.tool == workspace_tool_t.DECAL || Context.raw.tool == workspace_tool_t.TEXT;
+		let decal: bool = context_raw.tool == workspace_tool_t.DECAL || context_raw.tool == workspace_tool_t.TEXT;
 		if (decal) UtilRender.make_decal_preview();
 	}
 
@@ -296,8 +296,8 @@ class TabMaterials {
 	}
 
 	static accept_swatch_drag = (swatch: swatch_color_t) => {
-		Context.raw.material = SlotMaterial.create(Project.materials[0].data);
-		for (let node of Context.raw.material.canvas.nodes) {
+		context_raw.material = SlotMaterial.create(project_materials[0].data);
+		for (let node of context_raw.material.canvas.nodes) {
 			if (node.type == "RGB" ) {
 				node.outputs[0].default_value = [
 					color_get_rb(swatch.base) / 255,
@@ -314,19 +314,19 @@ class TabMaterials {
 				node.inputs[7].default_value = swatch.height;
 			}
 		}
-		Project.materials.push(Context.raw.material);
+		project_materials.push(context_raw.material);
 		TabMaterials.update_material();
-		History.new_material();
+		history_new_material();
 	}
 
 	static delete_material = (m: SlotMaterialRaw) => {
-		let i: i32 = Project.materials.indexOf(m);
-		for (let l of Project.layers) if (l.fill_layer == m) l.fill_layer = null;
-		History.delete_material();
-		Context.select_material(i == Project.materials.length - 1 ? i - 1 : i + 1);
-		Project.materials.splice(i, 1);
+		let i: i32 = project_materials.indexOf(m);
+		for (let l of project_layers) if (l.fill_layer == m) l.fill_layer = null;
+		history_delete_material();
+		context_select_material(i == project_materials.length - 1 ? i - 1 : i + 1);
+		project_materials.splice(i, 1);
 		UIBase.hwnds[1].redraws = 2;
-		for (let m of Project.materials) TabMaterials.update_material_pointers(m.canvas.nodes, i);
+		for (let m of project_materials) TabMaterials.update_material_pointers(m.canvas.nodes, i);
 	}
 }
 

+ 39 - 39
base/Sources/TabMeshes.ts

@@ -3,13 +3,13 @@ class TabMeshes {
 
 	static draw = (htab: zui_handle_t) => {
 		let ui: zui_t = UIBase.ui;
-		let statush: i32 = Config.raw.layout[layout_size_t.STATUS_H];
+		let statush: i32 = config_raw.layout[layout_size_t.STATUS_H];
 		if (zui_tab(htab, tr("Meshes")) && statush > UIStatus.default_status_h * zui_SCALE(ui)) {
 
 			zui_begin_sticky();
 
 			///if (is_paint || is_sculpt)
-			if (Config.raw.touch_ui) {
+			if (config_raw.touch_ui) {
 				zui_row([1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6]);
 			}
 			else {
@@ -18,7 +18,7 @@ class TabMeshes {
 			///end
 
 			///if is_lab
-			if (Config.raw.touch_ui) {
+			if (config_raw.touch_ui) {
 				zui_row([1 / 7, 1 / 7, 1 / 7, 1 / 7, 1 / 7, 1 / 7, 1 / 7]);
 			}
 			else {
@@ -28,11 +28,11 @@ class TabMeshes {
 
 			if (zui_button(tr("Import"))) {
 				UIMenu.draw((ui: zui_t) => {
-					if (UIMenu.menu_button(ui, tr("Replace Existing"), `${Config.keymap.file_import_assets}`)) {
-						Project.import_mesh(true);
+					if (UIMenu.menu_button(ui, tr("Replace Existing"), `${config_keymap.file_import_assets}`)) {
+						project_import_mesh(true);
 					}
 					if (UIMenu.menu_button(ui, tr("Append"))) {
-						Project.import_mesh(false);
+						project_import_mesh(false);
 					}
 				}, 2);
 			}
@@ -51,93 +51,93 @@ class TabMeshes {
 
 			if (zui_button(tr("Flip Normals"))) {
 				UtilMesh.flip_normals();
-				Context.raw.ddirty = 2;
+				context_raw.ddirty = 2;
 			}
 
 			if (zui_button(tr("Calculate Normals"))) {
 				UIMenu.draw((ui: zui_t) => {
-					if (UIMenu.menu_button(ui, tr("Smooth"))) { UtilMesh.calc_normals(true); Context.raw.ddirty = 2; }
-					if (UIMenu.menu_button(ui, tr("Flat"))) { UtilMesh.calc_normals(false); Context.raw.ddirty = 2; }
+					if (UIMenu.menu_button(ui, tr("Smooth"))) { UtilMesh.calc_normals(true); context_raw.ddirty = 2; }
+					if (UIMenu.menu_button(ui, tr("Flat"))) { UtilMesh.calc_normals(false); context_raw.ddirty = 2; }
 				}, 2);
 			}
 
 			if (zui_button(tr("Geometry to Origin"))) {
 				UtilMesh.to_origin();
-				Context.raw.ddirty = 2;
+				context_raw.ddirty = 2;
 			}
 
 			if (zui_button(tr("Apply Displacement"))) {
 				///if is_paint
-				UtilMesh.apply_displacement(Project.layers[0].texpaint_pack);
+				UtilMesh.apply_displacement(project_layers[0].texpaint_pack);
 				///end
 				///if is_lab
-				let displace_strength: f32 = Config.raw.displace_strength > 0 ? Config.raw.displace_strength : 1.0;
-				let uv_scale: f32 = scene_meshes[0].data.scale_tex * Context.raw.brush_scale;
+				let displace_strength: f32 = config_raw.displace_strength > 0 ? config_raw.displace_strength : 1.0;
+				let uv_scale: f32 = scene_meshes[0].data.scale_tex * context_raw.brush_scale;
 				UtilMesh.apply_displacement(BrushOutputNode.inst.texpaint_pack, 0.05 * displace_strength, uv_scale);
 				///end
 
 				UtilMesh.calc_normals();
-				Context.raw.ddirty = 2;
+				context_raw.ddirty = 2;
 			}
 
 			if (zui_button(tr("Rotate"))) {
 				UIMenu.draw((ui: zui_t) => {
 					if (UIMenu.menu_button(ui, tr("Rotate X"))) {
 						UtilMesh.swap_axis(1, 2);
-						Context.raw.ddirty = 2;
+						context_raw.ddirty = 2;
 					}
 
 					if (UIMenu.menu_button(ui, tr("Rotate Y"))) {
 						UtilMesh.swap_axis(2, 0);
-						Context.raw.ddirty = 2;
+						context_raw.ddirty = 2;
 					}
 
 					if (UIMenu.menu_button(ui, tr("Rotate Z"))) {
 						UtilMesh.swap_axis(0, 1);
-						Context.raw.ddirty = 2;
+						context_raw.ddirty = 2;
 					}
 				}, 3);
 			}
 
 			zui_end_sticky();
 
-			for (let i: i32 = 0; i < Project.paint_objects.length; ++i) {
-				let o: mesh_object_t = Project.paint_objects[i];
+			for (let i: i32 = 0; i < project_paint_objects.length; ++i) {
+				let o: mesh_object_t = project_paint_objects[i];
 				let h: zui_handle_t = zui_handle("tabmeshes_0");
 				h.selected = o.base.visible;
 				o.base.visible = zui_check(h, o.base.name);
 				if (ui.is_hovered && ui.input_released_r) {
 					UIMenu.draw((ui: zui_t) => {
 						if (UIMenu.menu_button(ui, tr("Export"))) {
-							Context.raw.export_mesh_index = i + 1;
+							context_raw.export_mesh_index = i + 1;
 							BoxExport.show_mesh();
 						}
-						if (Project.paint_objects.length > 1 && UIMenu.menu_button(ui, tr("Delete"))) {
-							array_remove(Project.paint_objects, o);
+						if (project_paint_objects.length > 1 && UIMenu.menu_button(ui, tr("Delete"))) {
+							array_remove(project_paint_objects, o);
 							while (o.base.children.length > 0) {
 								let child: object_t = o.base.children[0];
 								object_set_parent(child, null);
-								if (Project.paint_objects[0].base != child) {
-									object_set_parent(child, Project.paint_objects[0].base);
+								if (project_paint_objects[0].base != child) {
+									object_set_parent(child, project_paint_objects[0].base);
 								}
 								if (o.base.children.length == 0) {
-									vec4_set_from(Project.paint_objects[0].base.transform.scale, o.base.transform.scale);
-									transform_build_matrix(Project.paint_objects[0].base.transform);
+									vec4_set_from(project_paint_objects[0].base.transform.scale, o.base.transform.scale);
+									transform_build_matrix(project_paint_objects[0].base.transform);
 								}
 							}
 							data_delete_mesh(o.data._.handle);
 							mesh_object_remove(o);
-							Context.raw.paint_object = Context.main_object();
+							context_raw.paint_object = context_main_object();
 							UtilMesh.merge_mesh();
-							Context.raw.ddirty = 2;
+							context_raw.ddirty = 2;
 						}
-					}, Project.paint_objects.length > 1 ? 2 : 1);
+					}, project_paint_objects.length > 1 ? 2 : 1);
 				}
 				if (h.changed) {
 					let visibles: mesh_object_t[] = [];
-					for (let p of Project.paint_objects) if (p.base.visible) visibles.push(p);
+					for (let p of project_paint_objects) if (p.base.visible) visibles.push(p);
 					UtilMesh.merge_mesh(visibles);
-					Context.raw.ddirty = 2;
+					context_raw.ddirty = 2;
 				}
 			}
 		}
@@ -147,8 +147,8 @@ class TabMeshes {
 	static set_default_mesh = (name: string) => {
 		let mo: mesh_object_t = null;
 		if (name == ".Plane" || name == ".Sphere") {
-			let res: i32 = Config.raw.rp_supersample > 1.0 ? 2048 : 1024;
-			let mesh: any = name == ".Plane" ? Geom.make_plane(1, 1, res, res) : Geom.make_uv_sphere(1.0, res, Math.floor(res / 2), false, 2.0);
+			let res: i32 = config_raw.rp_supersample > 1.0 ? 2048 : 1024;
+			let mesh: any = name == ".Plane" ? geom_make_plane(1, 1, res, res) : geom_make_uv_sphere(1.0, res, Math.floor(res / 2), false, 2.0);
 			let raw: any = {
 				name: "Tessellated",
 				vertex_arrays: [
@@ -159,11 +159,11 @@ class TabMeshes {
 				index_arrays: [
 					{ values: mesh.inda, material: 0 }
 				],
-				scale_pos: mesh.scalePos,
-				scale_tex: mesh.scaleTex
+				scale_pos: mesh.scale_pos,
+				scale_tex: mesh.scale_tex
 			};
 			let md: mesh_data_t = mesh_data_create(raw);
-			mo = mesh_object_create(md, Context.raw.paint_object.materials);
+			mo = mesh_object_create(md, context_raw.paint_object.materials);
 			array_remove(scene_meshes, mo);
 			mo.base.name = "Tessellated";
 		}
@@ -172,9 +172,9 @@ class TabMeshes {
 		}
 
 		mo.base.visible = true;
-		Context.raw.ddirty = 2;
-		Context.raw.paint_object = mo;
-		Project.paint_objects[0] = mo;
+		context_raw.ddirty = 2;
+		context_raw.paint_object = mo;
+		project_paint_objects[0] = mo;
 		if (UIHeader.worktab.position == space_type_t.SPACE3D) {
 			scene_meshes = [mo];
 		}

+ 1 - 1
base/Sources/TabPlugins.ts

@@ -21,7 +21,7 @@ class TabPlugins {
 			zui_end_sticky();
 
 			// Draw plugins
-			for (let p of Plugin.plugins.values()) if (p.draw_ui != null) p.draw_ui(ui);
+			for (let p of plugin_map.values()) if (p.draw_ui != null) p.draw_ui(ui);
 		}
 	}
 }

+ 4 - 4
base/Sources/TabScript.ts

@@ -6,11 +6,11 @@ class TabScript {
 
 	static draw = (htab: zui_handle_t) => {
 		let ui: zui_t = UIBase.ui;
-		let statush: i32 = Config.raw.layout[layout_size_t.STATUS_H];
+		let statush: i32 = config_raw.layout[layout_size_t.STATUS_H];
 		if (zui_tab(htab, tr("Script")) && statush > UIStatus.default_status_h * zui_SCALE(ui)) {
 
 			zui_begin_sticky();
-			if (Config.raw.touch_ui) {
+			if (config_raw.touch_ui) {
 				zui_row([1 / 4, 1 / 4, 1 / 4, 1 / 4]);
 			}
 			else {
@@ -21,7 +21,7 @@ class TabScript {
 					eval(TabScript.hscript.text);
 				}
 				catch(e: any) {
-					Console.log(e);
+					console_log(e);
 				}
 			}
 			if (zui_button(tr("Clear"))) {
@@ -39,7 +39,7 @@ class TabScript {
 				UIFiles.show("js", true, false, (path: string) => {
 					let f: string = UIFiles.filename;
 					if (f == "") f = tr("untitled");
-					path = path + Path.sep + f;
+					path = path + path_sep + f;
 					if (!path.endsWith(".js")) path += ".js";
 					krom_file_save_bytes(path, sys_string_to_buffer(str));
 				});

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels