luboslenco 1 年之前
父节点
当前提交
23dcc340d2
共有 100 个文件被更改,包括 854 次插入827 次删除
  1. 3 3
      armorforge/Sources/arm/TabObjects.hx
  2. 2 3
      armorlab/Sources/arm/MakeMaterial.hx
  3. 2 7
      armorlab/Sources/arm/MakeMesh.hx
  4. 3 6
      armorlab/Sources/arm/MakePaint.hx
  5. 10 10
      armorlab/Sources/arm/NodesBrush.hx
  6. 5 6
      armorlab/Sources/arm/RenderPathPaint.hx
  7. 13 12
      armorlab/Sources/arm/UINodesExt.hx
  8. 2 2
      armorlab/Sources/arm/nodes/BrushOutputNode.hx
  9. 3 3
      armorlab/Sources/arm/nodes/ImageTextureNode.hx
  10. 4 4
      armorlab/Sources/arm/nodes/InpaintNode.hx
  11. 3 3
      armorlab/Sources/arm/nodes/PhotoToPBRNode.hx
  12. 4 4
      armorlab/Sources/arm/nodes/RGBNode.hx
  13. 5 4
      armorlab/Sources/arm/nodes/TextToPhotoNode.hx
  14. 4 4
      armorlab/Sources/arm/nodes/TilingNode.hx
  15. 3 3
      armorlab/Sources/arm/nodes/UpscaleNode.hx
  16. 4 4
      armorlab/Sources/arm/nodes/VarianceNode.hx
  17. 2 2
      armorpaint/Assets/plugins/embed/uv_unwrap.js
  18. 5 5
      armorpaint/Assets/plugins/hello_node.js
  19. 2 2
      armorpaint/Assets/plugins/hello_node_brush.js
  20. 2 2
      armorpaint/Assets/plugins/wasm/uv_unwrap.js
  21. 3 10
      armorpaint/Sources/arm/ImportFolder.hx
  22. 5 10
      armorpaint/Sources/arm/MakeBake.hx
  23. 1 3
      armorpaint/Sources/arm/MakeBlur.hx
  24. 1 4
      armorpaint/Sources/arm/MakeBrush.hx
  25. 1 3
      armorpaint/Sources/arm/MakeClone.hx
  26. 1 4
      armorpaint/Sources/arm/MakeColorIdPicker.hx
  27. 1 3
      armorpaint/Sources/arm/MakeDiscard.hx
  28. 21 29
      armorpaint/Sources/arm/MakeMaterial.hx
  29. 4 10
      armorpaint/Sources/arm/MakeMesh.hx
  30. 12 17
      armorpaint/Sources/arm/MakeMeshPreview.hx
  31. 18 21
      armorpaint/Sources/arm/MakeNodePreview.hx
  32. 18 23
      armorpaint/Sources/arm/MakePaint.hx
  33. 1 5
      armorpaint/Sources/arm/MakeParticle.hx
  34. 1 3
      armorpaint/Sources/arm/MakeTexcoord.hx
  35. 11 11
      armorpaint/Sources/arm/NodesBrush.hx
  36. 4 11
      armorpaint/Sources/arm/RenderPathPaint.hx
  37. 9 10
      armorpaint/Sources/arm/RenderPathPreview.hx
  38. 2 2
      armorpaint/Sources/arm/SlotBrush.hx
  39. 2 2
      armorpaint/Sources/arm/SlotFont.hx
  40. 18 24
      armorpaint/Sources/arm/SlotLayer.hx
  41. 3 4
      armorpaint/Sources/arm/SlotMaterial.hx
  42. 24 30
      armorpaint/Sources/arm/TabLayers.hx
  43. 6 6
      armorpaint/Sources/arm/nodes/BrushOutputNode.hx
  44. 2 2
      armorpaint/Sources/arm/nodes/InputNode.hx
  45. 3 3
      armorpaint/Sources/arm/nodes/TEX_IMAGE.hx
  46. 1 1
      armorsculpt/Sources/arm/ExportObj.hx
  47. 5 10
      armorsculpt/Sources/arm/ImportMesh.hx
  48. 1 3
      armorsculpt/Sources/arm/MakeBrush.hx
  49. 10 15
      armorsculpt/Sources/arm/MakeMaterial.hx
  50. 4 10
      armorsculpt/Sources/arm/MakeMesh.hx
  51. 12 17
      armorsculpt/Sources/arm/MakeMeshPreview.hx
  52. 2 7
      armorsculpt/Sources/arm/MakeSculpt.hx
  53. 13 19
      armorsculpt/Sources/arm/TabLayers.hx
  54. 5 5
      armorsculpt/Sources/arm/nodes/BrushOutputNode.hx
  55. 5 5
      base/Sources/Main.hx
  56. 0 16
      base/Sources/arm/Args.hx
  57. 67 77
      base/Sources/arm/Base.hx
  58. 2 10
      base/Sources/arm/BoxExport.hx
  59. 3 12
      base/Sources/arm/BoxPreferences.hx
  60. 7 10
      base/Sources/arm/BoxProjects.hx
  61. 0 1
      base/Sources/arm/Camera.hx
  62. 0 5
      base/Sources/arm/Config.hx
  63. 1 1
      base/Sources/arm/ConfigFormat.hx
  64. 0 1
      base/Sources/arm/Console.hx
  65. 14 33
      base/Sources/arm/Context.hx
  66. 7 14
      base/Sources/arm/ContextFormat.hx
  67. 3 8
      base/Sources/arm/ExportArm.hx
  68. 1 1
      base/Sources/arm/ExportGpl.hx
  69. 1 1
      base/Sources/arm/ExportMesh.hx
  70. 1 1
      base/Sources/arm/ExportObj.hx
  71. 10 21
      base/Sources/arm/ExportTexture.hx
  72. 1 1
      base/Sources/arm/File.hx
  73. 2 2
      base/Sources/arm/GeomPlane.hx
  74. 2 2
      base/Sources/arm/GeomUVSphere.hx
  75. 4 4
      base/Sources/arm/Gizmo.hx
  76. 12 23
      base/Sources/arm/History.hx
  77. 22 36
      base/Sources/arm/ImportArm.hx
  78. 1 10
      base/Sources/arm/ImportAsset.hx
  79. 5 13
      base/Sources/arm/ImportBlendMaterial.hx
  80. 3 4
      base/Sources/arm/ImportBlendMesh.hx
  81. 1 1
      base/Sources/arm/ImportEnvmap.hx
  82. 4 5
      base/Sources/arm/ImportFbx.hx
  83. 4 8
      base/Sources/arm/ImportFont.hx
  84. 1 1
      base/Sources/arm/ImportGpl.hx
  85. 3 6
      base/Sources/arm/ImportKeymap.hx
  86. 11 20
      base/Sources/arm/ImportMesh.hx
  87. 1 1
      base/Sources/arm/ImportObj.hx
  88. 2 5
      base/Sources/arm/ImportPlugin.hx
  89. 1 3
      base/Sources/arm/ImportTexture.hx
  90. 3 6
      base/Sources/arm/ImportTheme.hx
  91. 1 1
      base/Sources/arm/LineDraw.hx
  92. 1 1
      base/Sources/arm/LogicNode.hx
  93. 1 1
      base/Sources/arm/MakeVoxel.hx
  94. 1 1
      base/Sources/arm/NodeShader.hx
  95. 2 2
      base/Sources/arm/NodeShaderContext.hx
  96. 1 1
      base/Sources/arm/NodeShaderData.hx
  97. 14 14
      base/Sources/arm/NodesMaterial.hx
  98. 5 5
      base/Sources/arm/ParserBlend.hx
  99. 2 2
      base/Sources/arm/ParserExr.hx
  100. 315 5
      base/Sources/arm/ParserFbx.hx

+ 3 - 3
armorforge/Sources/arm/ui/TabObjects.hx → armorforge/Sources/arm/TabObjects.hx

@@ -1,4 +1,4 @@
-package arm.ui;
+package arm;
 
 import haxe.Json;
 import zui.Zui;
@@ -111,7 +111,7 @@ class TabObjects {
 								Data.getMaterial("Scene", "TempMaterial" + materialId, function(md: MaterialData) {
 									var mo: MeshObject = cast currentObject;
 									mo.materials = [md];
-									arm.shader.MakeMaterial.parseMeshPreviewMaterial(md);
+									MakeMaterial.parseMeshPreviewMaterial(md);
 								});
 							}
 						}, 1);
@@ -197,7 +197,7 @@ class TabObjects {
 						Context.raw.selectedObject.transform.rot.fromEuler(rot.x, rot.y, rot.z);
 						Context.raw.selectedObject.transform.buildMatrix();
 						// #if arm_physics
-						// var rb = Context.raw.selectedObject.getTrait(armory.trait.physics.RigidBody);
+						// var rb = Context.raw.selectedObject.getTrait(RigidBody);
 						// if (rb != null) rb.syncTransform();
 						// #end
 					}

+ 2 - 3
armorlab/Sources/arm/shader/MakeMaterial.hx → armorlab/Sources/arm/MakeMaterial.hx

@@ -1,10 +1,9 @@
-package arm.shader;
+package arm;
 
 import zui.Zui.Nodes;
 import iron.SceneFormat;
 import iron.ShaderData;
 import iron.MaterialData;
-import arm.shader.NodeShaderData;
 
 class MakeMaterial {
 
@@ -45,7 +44,7 @@ class MakeMaterial {
 		#end
 
 		#if (krom_direct3d12 || krom_vulkan)
-		arm.render.RenderPathRaytrace.dirty = 1;
+		RenderPathRaytrace.dirty = 1;
 		#end
 	}
 

+ 2 - 7
armorlab/Sources/arm/shader/MakeMesh.hx → armorlab/Sources/arm/MakeMesh.hx

@@ -1,9 +1,4 @@
-package arm.shader;
-
-import arm.shader.MaterialParser;
-import arm.shader.NodeShaderContext;
-import arm.shader.NodeShaderData;
-import arm.shader.ShaderFunctions;
+package arm;
 
 class MakeMesh {
 
@@ -234,7 +229,7 @@ class MakeMesh {
 		frag.write('vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;');
 		frag.write('fragColor[2] = vec4(posa - posb, texCoord.xy);');
 
-		MaterialParser.finalize(con_mesh);
+		ParserMaterial.finalize(con_mesh);
 		con_mesh.data.shader_from_source = true;
 		con_mesh.data.vertex_shader = vert.get();
 		con_mesh.data.fragment_shader = frag.get();

+ 3 - 6
armorlab/Sources/arm/shader/MakePaint.hx → armorlab/Sources/arm/MakePaint.hx

@@ -1,10 +1,7 @@
-package arm.shader;
+package arm;
 
 import iron.SceneFormat;
 import zui.Zui.Nodes;
-import arm.shader.MaterialParser;
-import arm.shader.NodeShaderContext;
-import arm.shader.NodeShaderData;
 
 class MakePaint {
 
@@ -273,8 +270,8 @@ class MakePaint {
 
 		frag.write('fragColor[3] = vec4(str, 0.0, 0.0, 1.0);');
 
-		MaterialParser.finalize(con_paint);
-		MaterialParser.sample_keep_aspect = false;
+		ParserMaterial.finalize(con_paint);
+		ParserMaterial.sample_keep_aspect = false;
 		con_paint.data.shader_from_source = true;
 		con_paint.data.vertex_shader = vert.get();
 		con_paint.data.fragment_shader = frag.get();

+ 10 - 10
armorlab/Sources/arm/logic/NodesBrush.hx → armorlab/Sources/arm/NodesBrush.hx

@@ -1,4 +1,4 @@
-package arm.logic;
+package arm;
 
 import zui.Zui.Nodes;
 import arm.Translator._tr;
@@ -9,16 +9,16 @@ class NodesBrush {
 
 	public static var list: Array<Array<zui.Zui.TNode>> = [
 		[ // Input
-			ImageTextureNode.def,
-			RGBNode.def,
+			arm.nodes.ImageTextureNode.def,
+			arm.nodes.RGBNode.def,
 		],
 		[ // Model
-			InpaintNode.def,
-			PhotoToPBRNode.def,
-			TextToPhotoNode.def,
-			TilingNode.def,
-			UpscaleNode.def,
-			VarianceNode.def,
+			arm.nodes.InpaintNode.def,
+			arm.nodes.PhotoToPBRNode.def,
+			arm.nodes.TextToPhotoNode.def,
+			arm.nodes.TilingNode.def,
+			arm.nodes.UpscaleNode.def,
+			arm.nodes.VarianceNode.def,
 		]
 	];
 
@@ -28,7 +28,7 @@ class NodesBrush {
 				if (n.type == nodeType) {
 					var canvas = Project.canvas;
 					var nodes = Project.nodes;
-					var node = arm.ui.UINodes.makeNode(n, nodes, canvas);
+					var node = arm.UINodes.makeNode(n, nodes, canvas);
 					canvas.nodes.push(node);
 					return node;
 				}

+ 5 - 6
armorlab/Sources/arm/render/RenderPathPaint.hx → armorlab/Sources/arm/RenderPathPaint.hx

@@ -1,4 +1,4 @@
-package arm.render;
+package arm;
 
 import iron.System;
 import iron.Mat4;
@@ -6,8 +6,7 @@ import iron.MeshObject;
 import iron.SceneFormat;
 import iron.RenderPath;
 import iron.Scene;
-import arm.ui.UIHeader;
-import arm.ui.UINodes;
+import iron.App;
 
 class RenderPathPaint {
 
@@ -270,7 +269,7 @@ class RenderPathPaint {
 		var canvas = UINodes.inst.getCanvas(true);
 		if (nodes.nodesSelectedId.length > 0) {
 			var node = nodes.getNode(canvas.nodes, nodes.nodesSelectedId[0]);
-			var brushNode = arm.logic.LogicParser.getLogicNode(node);
+			var brushNode = ParserLogic.getLogicNode(node);
 			if (brushNode != null) {
 				image = brushNode.getCachedImage();
 			}
@@ -304,8 +303,8 @@ class RenderPathPaint {
 			var node = nodes.getNode(canvas.nodes, nodes.nodesSelectedId[0]);
 			var inpaint = node.type == "InpaintNode";
 			if (inpaint) {
-				var brushNode = arm.logic.LogicParser.getLogicNode(node);
-				path.renderTargets.get("texpaint_node_target").image = cast(brushNode, arm.logic.InpaintNode).getTarget();
+				var brushNode = ParserLogic.getLogicNode(node);
+				path.renderTargets.get("texpaint_node_target").image = cast(brushNode, arm.nodes.InpaintNode).getTarget();
 			}
 		}
 		else {

+ 13 - 12
armorlab/Sources/arm/ui/UINodesExt.hx → armorlab/Sources/arm/UINodesExt.hx

@@ -1,7 +1,8 @@
-package arm.ui;
+package arm;
 
 import js.lib.DataView;
 import js.lib.ArrayBuffer;
+import iron.App;
 import iron.System;
 import iron.Time;
 import iron.Scene;
@@ -32,21 +33,21 @@ class UINodesExt {
 					App.removeRender2D(delayIdleSleep);
 
 					#if (krom_direct3d12 || krom_vulkan || krom_metal)
-					arm.render.RenderPathRaytrace.ready = false;
+					RenderPathRaytrace.ready = false;
 					#end
 				}
 			}
 
 			Base.notifyOnNextFrame(function() {
 				var timer = Time.time();
-				arm.logic.LogicParser.parse(Project.canvas);
+				ParserLogic.parse(Project.canvas);
 
-				arm.logic.PhotoToPBRNode.cachedSource = null;
-				arm.logic.BrushOutputNode.inst.getAsImage(ChannelBaseColor, function(texbase: Image) {
-				arm.logic.BrushOutputNode.inst.getAsImage(ChannelOcclusion, function(texocc: Image) {
-				arm.logic.BrushOutputNode.inst.getAsImage(ChannelRoughness, function(texrough: Image) {
-				arm.logic.BrushOutputNode.inst.getAsImage(ChannelNormalMap, function(texnor: Image) {
-				arm.logic.BrushOutputNode.inst.getAsImage(ChannelHeight, function(texheight: Image) {
+				arm.nodes.PhotoToPBRNode.cachedSource = null;
+				arm.nodes.BrushOutputNode.inst.getAsImage(ChannelBaseColor, function(texbase: Image) {
+				arm.nodes.BrushOutputNode.inst.getAsImage(ChannelOcclusion, function(texocc: Image) {
+				arm.nodes.BrushOutputNode.inst.getAsImage(ChannelRoughness, function(texrough: Image) {
+				arm.nodes.BrushOutputNode.inst.getAsImage(ChannelNormalMap, function(texnor: Image) {
+				arm.nodes.BrushOutputNode.inst.getAsImage(ChannelHeight, function(texheight: Image) {
 
 					if (texbase != null) {
 						var texpaint = RenderPath.active.renderTargets.get("texpaint").image;
@@ -94,7 +95,7 @@ class UINodesExt {
 						texpaint_pack.g4.end();
 
 						if (UIHeader.inst.worktab.position == Space3D &&
-							!Std.isOfType(arm.logic.BrushOutputNode.inst.inputs[ChannelHeight].node, arm.logic.FloatNode)) {
+							!Std.isOfType(arm.nodes.BrushOutputNode.inst.inputs[ChannelHeight].node, arm.nodes.FloatNode)) {
 
 							// Make copy of vertices before displacement
 							var o = Project.paintObjects[0];
@@ -120,8 +121,8 @@ class UINodesExt {
 									Console.progress(tr("Apply Displacement"));
 									Base.notifyOnNextFrame(function() {
 										var uv_scale = Scene.active.meshes[0].data.scaleTex * Context.raw.brushScale;
-										arm.util.MeshUtil.applyDisplacement(texpaint_pack, 0.05 * Config.raw.displace_strength, uv_scale);
-										arm.util.MeshUtil.calcNormals();
+										UtilMesh.applyDisplacement(texpaint_pack, 0.05 * Config.raw.displace_strength, uv_scale);
+										UtilMesh.calcNormals();
 										taskDone();
 									});
 								});

+ 2 - 2
armorlab/Sources/arm/logic/BrushOutputNode.hx → armorlab/Sources/arm/nodes/BrushOutputNode.hx

@@ -1,8 +1,8 @@
-package arm.logic;
+package arm.nodes;
 
 import iron.System;
 import iron.RenderPath;
-import arm.logic.LogicNode;
+import arm.LogicNode;
 
 @:keep
 class BrushOutputNode extends LogicNode {

+ 3 - 3
armorlab/Sources/arm/logic/ImageTextureNode.hx → armorlab/Sources/arm/nodes/ImageTextureNode.hx

@@ -1,9 +1,9 @@
-package arm.logic;
+package arm.nodes;
 
 import zui.Zui.Nodes;
 import iron.System;
-import arm.logic.LogicNode;
-import arm.logic.LogicParser.f32;
+import arm.LogicNode;
+import arm.ParserLogic.f32;
 import arm.Translator._tr;
 
 @:keep

+ 4 - 4
armorlab/Sources/arm/logic/InpaintNode.hx → armorlab/Sources/arm/nodes/InpaintNode.hx

@@ -1,11 +1,11 @@
-package arm.logic;
+package arm.nodes;
 
 import zui.Zui.Nodes;
 import iron.System;
 import iron.Data;
 import iron.ConstData;
-import arm.logic.LogicNode;
-import arm.logic.LogicParser.f32;
+import arm.LogicNode;
+import arm.ParserLogic.f32;
 import arm.Translator._tr;
 
 @:keep
@@ -219,7 +219,7 @@ class InpaintNode extends LogicNode {
 				output: 0
 			},
 			{
-				name: "arm.logic.InpaintNode.buttons",
+				name: "arm.nodes.InpaintNode.buttons",
 				type: "CUSTOM",
 				height: 0
 			}

+ 3 - 3
armorlab/Sources/arm/logic/PhotoToPBRNode.hx → armorlab/Sources/arm/nodes/PhotoToPBRNode.hx

@@ -1,10 +1,10 @@
-package arm.logic;
+package arm.nodes;
 
 import zui.Zui.Nodes;
 import iron.System;
 import iron.Data;
-import arm.logic.LogicNode;
-import arm.logic.LogicParser.f32;
+import arm.LogicNode;
+import arm.ParserLogic.f32;
 import arm.Translator._tr;
 
 @:keep

+ 4 - 4
armorlab/Sources/arm/logic/RGBNode.hx → armorlab/Sources/arm/nodes/RGBNode.hx

@@ -1,10 +1,10 @@
-package arm.logic;
+package arm.nodes;
 
 import zui.Zui.Nodes;
 import iron.System;
 import iron.Vec4;
-import arm.logic.LogicNode;
-import arm.logic.LogicParser.f32;
+import arm.LogicNode;
+import arm.ParserLogic.f32;
 import arm.Translator._tr;
 
 @:keep
@@ -24,7 +24,7 @@ class RGBNode extends LogicNode {
 		}
 
 		var f32 = new js.lib.Float32Array(4);
-		var raw = LogicParser.getRawNode(this);
+		var raw = ParserLogic.getRawNode(this);
 		var default_value = raw.outputs[0].default_value;
 		f32[0] = default_value[0];
 		f32[1] = default_value[1];

+ 5 - 4
armorlab/Sources/arm/logic/TextToPhotoNode.hx → armorlab/Sources/arm/nodes/TextToPhotoNode.hx

@@ -1,10 +1,11 @@
-package arm.logic;
+package arm.nodes;
 
 import zui.Zui.Nodes;
 import iron.System;
 import iron.Data;
-import arm.logic.LogicNode;
-import arm.logic.LogicParser.f32;
+import iron.App;
+import arm.LogicNode;
+import arm.ParserLogic.f32;
 import arm.Translator._tr;
 
 @:keep
@@ -276,7 +277,7 @@ class TextToPhotoNode extends LogicNode {
 				output: 0
 			},
 			{
-				name: "arm.logic.TextToPhotoNode.buttons",
+				name: "arm.nodes.TextToPhotoNode.buttons",
 				type: "CUSTOM",
 				height: 1
 			}

+ 4 - 4
armorlab/Sources/arm/logic/TilingNode.hx → armorlab/Sources/arm/nodes/TilingNode.hx

@@ -1,9 +1,9 @@
-package arm.logic;
+package arm.nodes;
 
 import zui.Zui.Nodes;
 import iron.System;
-import arm.logic.LogicNode;
-import arm.logic.LogicParser.f32;
+import arm.LogicNode;
+import arm.ParserLogic.f32;
 import arm.Translator._tr;
 
 @:keep
@@ -129,7 +129,7 @@ class TilingNode extends LogicNode {
 				output: 0
 			},
 			{
-				name: "arm.logic.TilingNode.buttons",
+				name: "arm.nodes.TilingNode.buttons",
 				type: "CUSTOM",
 				height: 0
 			}

+ 3 - 3
armorlab/Sources/arm/logic/UpscaleNode.hx → armorlab/Sources/arm/nodes/UpscaleNode.hx

@@ -1,10 +1,10 @@
-package arm.logic;
+package arm.nodes;
 
 import zui.Zui.Nodes;
 import iron.System;
 import iron.Data;
-import arm.logic.LogicNode;
-import arm.logic.LogicParser.f32;
+import arm.LogicNode;
+import arm.ParserLogic.f32;
 import arm.Translator._tr;
 
 @:keep

+ 4 - 4
armorlab/Sources/arm/logic/VarianceNode.hx → armorlab/Sources/arm/nodes/VarianceNode.hx

@@ -1,10 +1,10 @@
-package arm.logic;
+package arm.nodes;
 
 import zui.Zui.Nodes;
 import iron.System;
 import iron.Data;
-import arm.logic.LogicNode;
-import arm.logic.LogicParser.f32;
+import arm.LogicNode;
+import arm.ParserLogic.f32;
 import arm.Translator._tr;
 
 @:keep
@@ -123,7 +123,7 @@ class VarianceNode extends LogicNode {
 		],
 		buttons: [
 			{
-				name: "arm.logic.VarianceNode.buttons",
+				name: "arm.nodes.VarianceNode.buttons",
 				type: "CUSTOM",
 				height: 1
 			}

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

@@ -92,12 +92,12 @@ plugin.drawUI = function(ui) {
 				geom.ready = false;
 				geom.build();
 			}
-			arm.MeshUtil.mergeMesh();
+			arm.UtilMesh.mergeMesh();
 		}
 	}
 }
 
-let unwrappers = arm.MeshUtil.unwrappers;
+let unwrappers = arm.UtilMesh.unwrappers;
 unwrappers.h["uv_unwrap.js"] = unwrap_mesh;
 plugin.delete = function() {
 	unwrappers.h["uv_unwrap.js"] = null;

+ 5 - 5
armorpaint/Assets/plugins/hello_node.js

@@ -54,10 +54,10 @@ let nodes = [
 arm.NodesMaterial.list.push(nodes);
 
 // Node shader
-arm.MaterialParser.customNodes.set(nodeType, function(node, socket) {
-	let frag = arm.MaterialParser.frag;
-	let scale = arm.MaterialParser.parse_value_input(node.inputs[0]);
-	let my_out = arm.MaterialParser.node_name(node) + "_out";
+arm.ParserMaterial.customNodes.set(nodeType, function(node, socket) {
+	let frag = arm.ParserMaterial.frag;
+	let scale = arm.ParserMaterial.parse_value_input(node.inputs[0]);
+	let my_out = arm.ParserMaterial.node_name(node) + "_out";
 
 	frag.write(`
 		float ${my_out} = cos(sin(texCoord.x * 200.0 * ${scale}) + cos(texCoord.y * 200.0 * ${scale}));
@@ -73,7 +73,7 @@ arm.MaterialParser.customNodes.set(nodeType, function(node, socket) {
 
 // Cleanup
 plugin.delete = function() {
-	arm.MaterialParser.customNodes.delete(nodeType);
+	arm.ParserMaterial.customNodes.delete(nodeType);
 	arm.NodesMaterial.list.splice(arm.NodesMaterial.list.indexOf(nodes), 1);
 	categories.splice(categories.indexOf(categoryName), 1);
 };

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

@@ -46,13 +46,13 @@ let nodes = [
 arm.NodesBrush.list.push(nodes);
 
 // Brush node
-arm.LogicParser.customNodes.set(nodeType, function(node, from) {
+arm.ParserLogic.customNodes.set(nodeType, function(node, from) {
 	return Math.sin(iron.Time.time() * node.inputs[0].get(0));
 });
 
 // Cleanup
 plugin.delete = function() {
-	arm.LogicParser.customNodes.delete(nodeType);
+	arm.ParserLogic.customNodes.delete(nodeType);
 	arm.NodesBrush.list.splice(arm.NodesBrush.list.indexOf(nodes), 1);
 	categories.splice(categories.indexOf(categoryName), 1);
 };

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

@@ -114,12 +114,12 @@ plugin.drawUI = function(ui) {
 				geom.ready = false;
 				geom.build();
 			}
-			arm.MeshUtil.mergeMesh();
+			arm.UtilMesh.mergeMesh();
 		}
 	}
 }
 
-let unwrappers = arm.MeshUtil.unwrappers;
+let unwrappers = arm.UtilMesh.unwrappers;
 unwrappers.h["uv_unwrap.js"] = unwrap_mesh;
 plugin.delete = function() {
 	unwrappers.h["uv_unwrap.js"] = null;

+ 3 - 10
armorpaint/Sources/arm/io/ImportFolder.hx → armorpaint/Sources/arm/ImportFolder.hx

@@ -1,16 +1,9 @@
-package arm.io;
+package arm;
 
 import zui.Zui.Nodes;
 import zui.Zui.TNodeCanvas;
 import zui.Zui.TNode;
 import zui.Zui.TNodeLink;
-import arm.ui.UIBase;
-import arm.util.RenderUtil;
-import arm.sys.Path;
-import arm.sys.File;
-import arm.shader.NodesMaterial;
-import arm.shader.MakeMaterial;
-import arm.data.MaterialSlot;
 
 class ImportFolder {
 
@@ -74,7 +67,7 @@ class ImportFolder {
 		}
 
 		// Create material
-		Context.raw.material = new MaterialSlot(Project.materials[0].data);
+		Context.raw.material = new SlotMaterial(Project.materials[0].data);
 		Project.materials.push(Context.raw.material);
 		var nodes = Context.raw.material.nodes;
 		var canvas = Context.raw.material.canvas;
@@ -128,7 +121,7 @@ class ImportFolder {
 		}
 
 		MakeMaterial.parsePaintMaterial();
-		RenderUtil.makeMaterialPreview();
+		UtilRender.makeMaterialPreview();
 		UIBase.inst.hwnds[1].redraws = 2;
 		History.newMaterial();
 	}

+ 5 - 10
armorpaint/Sources/arm/shader/MakeBake.hx → armorpaint/Sources/arm/MakeBake.hx

@@ -1,9 +1,4 @@
-package arm.shader;
-
-import arm.shader.NodeShader;
-import arm.shader.NodeShaderContext;
-import arm.shader.ShaderFunctions;
-import arm.shader.MaterialParser;
+package arm;
 
 class MakeBake {
 
@@ -42,10 +37,10 @@ class MakeBake {
 			#end
 		}
 		else if (Context.raw.bakeType == BakeCurvature) {
-			var pass = MaterialParser.bake_passthrough;
-			var strength = pass ? MaterialParser.bake_passthrough_strength : Context.raw.bakeCurvStrength + "";
-			var radius = pass ? MaterialParser.bake_passthrough_radius : Context.raw.bakeCurvRadius + "";
-			var offset = pass ? MaterialParser.bake_passthrough_offset : Context.raw.bakeCurvOffset + "";
+			var pass = ParserMaterial.bake_passthrough;
+			var strength = pass ? ParserMaterial.bake_passthrough_strength : Context.raw.bakeCurvStrength + "";
+			var radius = pass ? ParserMaterial.bake_passthrough_radius : Context.raw.bakeCurvRadius + "";
+			var offset = pass ? ParserMaterial.bake_passthrough_offset : Context.raw.bakeCurvOffset + "";
 			strength = 'float($strength)';
 			radius = 'float($radius)';
 			offset = 'float($offset)';

+ 1 - 3
armorpaint/Sources/arm/shader/MakeBlur.hx → armorpaint/Sources/arm/MakeBlur.hx

@@ -1,6 +1,4 @@
-package arm.shader;
-
-import arm.shader.NodeShader;
+package arm;
 
 class MakeBlur {
 

+ 1 - 4
armorpaint/Sources/arm/shader/MakeBrush.hx → armorpaint/Sources/arm/MakeBrush.hx

@@ -1,7 +1,4 @@
-package arm.shader;
-
-import arm.shader.NodeShader;
-import arm.shader.ShaderFunctions;
+package arm;
 
 class MakeBrush {
 

+ 1 - 3
armorpaint/Sources/arm/shader/MakeClone.hx → armorpaint/Sources/arm/MakeClone.hx

@@ -1,6 +1,4 @@
-package arm.shader;
-
-import arm.shader.NodeShader;
+package arm;
 
 class MakeClone {
 

+ 1 - 4
armorpaint/Sources/arm/shader/MakeColorIdPicker.hx → armorpaint/Sources/arm/MakeColorIdPicker.hx

@@ -1,7 +1,4 @@
-package arm.shader;
-
-import arm.shader.ShaderFunctions;
-import arm.shader.NodeShader;
+package arm;
 
 class MakeColorIdPicker {
 

+ 1 - 3
armorpaint/Sources/arm/shader/MakeDiscard.hx → armorpaint/Sources/arm/MakeDiscard.hx

@@ -1,6 +1,4 @@
-package arm.shader;
-
-import arm.shader.NodeShader;
+package arm;
 
 class MakeDiscard {
 

+ 21 - 29
armorpaint/Sources/arm/shader/MakeMaterial.hx → armorpaint/Sources/arm/MakeMaterial.hx

@@ -1,4 +1,4 @@
-package arm.shader;
+package arm;
 
 import zui.Zui.Nodes;
 import zui.Zui.TNode;
@@ -8,14 +8,6 @@ import iron.SceneFormat;
 import iron.ShaderData;
 import iron.MaterialData;
 import iron.RenderPath;
-import arm.ui.UIHeader;
-import arm.ui.UINodes;
-import arm.shader.NodeShader;
-import arm.shader.NodeShaderData;
-import arm.shader.ShaderFunctions;
-import arm.shader.MaterialParser;
-import arm.render.RenderPathPaint;
-import arm.util.RenderUtil;
 
 class MakeMaterial {
 
@@ -113,7 +105,7 @@ class MakeMaterial {
 		#end
 
 		#if (krom_direct3d12 || krom_vulkan || krom_metal)
-		arm.render.RenderPathRaytrace.dirty = 1;
+		RenderPathRaytrace.dirty = 1;
 		#end
 	}
 
@@ -273,7 +265,7 @@ class MakeMaterial {
 
 	static function bakeNodePreview(node: TNode, group: TNodeCanvas, parents: Array<TNode>) {
 		if (node.type == "BLUR") {
-			var id = MaterialParser.node_name(node, parents);
+			var id = ParserMaterial.node_name(node, parents);
 			var image = Context.raw.nodePreviews.get(id);
 			Context.raw.nodePreviewsUsed.push(id);
 			var resX = Std.int(Config.getTextureResX() / 4);
@@ -284,12 +276,12 @@ class MakeMaterial {
 				Context.raw.nodePreviews.set(id, image);
 			}
 
-			MaterialParser.blur_passthrough = true;
-			RenderUtil.makeNodePreview(UINodes.inst.getCanvasMaterial(), node, image, group, parents);
-			MaterialParser.blur_passthrough = false;
+			ParserMaterial.blur_passthrough = true;
+			UtilRender.makeNodePreview(UINodes.inst.getCanvasMaterial(), node, image, group, parents);
+			ParserMaterial.blur_passthrough = false;
 		}
 		else if (node.type == "DIRECT_WARP") {
-			var id = MaterialParser.node_name(node, parents);
+			var id = ParserMaterial.node_name(node, parents);
 			var image = Context.raw.nodePreviews.get(id);
 			Context.raw.nodePreviewsUsed.push(id);
 			var resX = Std.int(Config.getTextureResX());
@@ -300,12 +292,12 @@ class MakeMaterial {
 				Context.raw.nodePreviews.set(id, image);
 			}
 
-			MaterialParser.warp_passthrough = true;
-			RenderUtil.makeNodePreview(UINodes.inst.getCanvasMaterial(), node, image, group, parents);
-			MaterialParser.warp_passthrough = false;
+			ParserMaterial.warp_passthrough = true;
+			UtilRender.makeNodePreview(UINodes.inst.getCanvasMaterial(), node, image, group, parents);
+			ParserMaterial.warp_passthrough = false;
 		}
 		else if (node.type == "BAKE_CURVATURE") {
-			var id = MaterialParser.node_name(node, parents);
+			var id = ParserMaterial.node_name(node, parents);
 			var image = Context.raw.nodePreviews.get(id);
 			Context.raw.nodePreviewsUsed.push(id);
 			var resX = Std.int(Config.getTextureResX());
@@ -317,7 +309,7 @@ class MakeMaterial {
 			}
 
 			if (RenderPathPaint.liveLayer == null) {
-				RenderPathPaint.liveLayer = new arm.data.LayerSlot("_live");
+				RenderPathPaint.liveLayer = new SlotLayer("_live");
 			}
 
 			var _space = UIHeader.inst.worktab.position;
@@ -327,15 +319,15 @@ class MakeMaterial {
 			Context.raw.tool = ToolBake;
 			Context.raw.bakeType = BakeCurvature;
 
-			MaterialParser.bake_passthrough = true;
-			MaterialParser.start_node = node;
-			MaterialParser.start_group = group;
-			MaterialParser.start_parents = parents;
+			ParserMaterial.bake_passthrough = true;
+			ParserMaterial.start_node = node;
+			ParserMaterial.start_group = group;
+			ParserMaterial.start_parents = parents;
 			parsePaintMaterial(false);
-			MaterialParser.bake_passthrough = false;
-			MaterialParser.start_node = null;
-			MaterialParser.start_group = null;
-			MaterialParser.start_parents = null;
+			ParserMaterial.bake_passthrough = false;
+			ParserMaterial.start_node = null;
+			ParserMaterial.start_group = null;
+			ParserMaterial.start_parents = null;
 			Context.raw.pdirty = 1;
 			RenderPathPaint.useLiveLayer(true);
 			RenderPathPaint.commandsPaint(false);
@@ -372,7 +364,7 @@ class MakeMaterial {
 	}
 
 	public static function parseBrush() {
-		arm.logic.LogicParser.parse(Context.raw.brush.canvas);
+		ParserLogic.parse(Context.raw.brush.canvas);
 	}
 
 	public static function blendMode(frag: NodeShader, blending: Int, cola: String, colb: String, opac: String): String {

+ 4 - 10
armorpaint/Sources/arm/shader/MakeMesh.hx → armorpaint/Sources/arm/MakeMesh.hx

@@ -1,10 +1,4 @@
-package arm.shader;
-
-import arm.shader.MaterialParser;
-import arm.shader.NodeShaderContext;
-import arm.shader.NodeShaderData;
-import arm.shader.ShaderFunctions;
-import arm.data.LayerSlot;
+package arm;
 
 class MakeMesh {
 
@@ -148,7 +142,7 @@ class MakeMesh {
 
 			// Get layers for this pass
 			layerPassCount = 1;
-			var layers: Array<LayerSlot> = [];
+			var layers: Array<SlotLayer> = [];
 			var startCount = textureCount;
 			var isMaterialTool = Context.raw.tool == ToolMaterial;
 			for (l in Project.layers) {
@@ -320,7 +314,7 @@ class MakeMesh {
 				frag.write('fragColor[0] = vec4(basecol, opacity);');
 				frag.write('fragColor[1] = vec4(ntex, matid);');
 				frag.write('fragColor[2] = vec4(occlusion, roughness, metallic, height);');
-				MaterialParser.finalize(con_mesh);
+				ParserMaterial.finalize(con_mesh);
 				con_mesh.data.shader_from_source = true;
 				con_mesh.data.vertex_shader = vert.get();
 				con_mesh.data.fragment_shader = frag.get();
@@ -478,7 +472,7 @@ class MakeMesh {
 		frag.write('vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;');
 		frag.write('fragColor[2] = vec4(posa - posb, texCoord.xy);');
 
-		MaterialParser.finalize(con_mesh);
+		ParserMaterial.finalize(con_mesh);
 		con_mesh.data.shader_from_source = true;
 		con_mesh.data.vertex_shader = vert.get();
 		con_mesh.data.fragment_shader = frag.get();

+ 12 - 17
armorpaint/Sources/arm/shader/MakeMeshPreview.hx → armorpaint/Sources/arm/MakeMeshPreview.hx

@@ -1,12 +1,7 @@
-package arm.shader;
+package arm;
 
 import iron.MeshObject;
 import iron.SceneFormat;
-import arm.ui.UINodes;
-import arm.shader.MaterialParser;
-import arm.shader.NodeShaderData;
-import arm.shader.NodeShaderContext;
-import arm.shader.ShaderFunctions;
 
 class MakeMeshPreview {
 
@@ -57,21 +52,21 @@ class MakeMeshPreview {
 		vert.write_attrib('texCoord = tex * float(${brushScale});');
 
 		var decal = Context.raw.decalPreview;
-		MaterialParser.sample_keep_aspect = decal;
-		MaterialParser.sample_uv_scale = brushScale;
-		MaterialParser.parse_height = MakeMaterial.heightUsed;
-		MaterialParser.parse_height_as_channel = true;
-		var sout = MaterialParser.parse(UINodes.inst.getCanvasMaterial(), con_mesh, vert, frag, matcon);
-		MaterialParser.parse_height = false;
-		MaterialParser.parse_height_as_channel = false;
-		MaterialParser.sample_keep_aspect = false;
+		ParserMaterial.sample_keep_aspect = decal;
+		ParserMaterial.sample_uv_scale = brushScale;
+		ParserMaterial.parse_height = MakeMaterial.heightUsed;
+		ParserMaterial.parse_height_as_channel = true;
+		var sout = ParserMaterial.parse(UINodes.inst.getCanvasMaterial(), con_mesh, vert, frag, matcon);
+		ParserMaterial.parse_height = false;
+		ParserMaterial.parse_height_as_channel = false;
+		ParserMaterial.sample_keep_aspect = false;
 		var base = sout.out_basecol;
 		var rough = sout.out_roughness;
 		var met = sout.out_metallic;
 		var occ = sout.out_occlusion;
 		var opac = sout.out_opacity;
 		var height = sout.out_height;
-		var nortan = MaterialParser.out_normaltan;
+		var nortan = ParserMaterial.out_normaltan;
 		frag.write('vec3 basecol = pow($base, vec3(2.2, 2.2, 2.2));');
 		frag.write('float roughness = $rough;');
 		frag.write('float metallic = $met;');
@@ -80,7 +75,7 @@ class MakeMeshPreview {
 		frag.write('vec3 nortan = $nortan;');
 		frag.write('float height = $height;');
 
-		// MaterialParser.parse_height_as_channel = false;
+		// ParserMaterial.parse_height_as_channel = false;
 		// vert.write('float vheight = $height;');
 		// vert.add_out('float height');
 		// vert.write('height = vheight;');
@@ -151,7 +146,7 @@ class MakeMeshPreview {
 		}
 		frag.write('fragColor[2] = vec4(0.0, 0.0, 0.0, 0.0);'); // veloc
 
-		MaterialParser.finalize(con_mesh);
+		ParserMaterial.finalize(con_mesh);
 
 		#if arm_skin
 		if (skin) {

+ 18 - 21
armorpaint/Sources/arm/shader/MakeNodePreview.hx → armorpaint/Sources/arm/MakeNodePreview.hx

@@ -1,13 +1,10 @@
-package arm.shader;
+package arm;
 
 import zui.Zui.Nodes;
 import zui.Zui.TNode;
 import zui.Zui.TNodeCanvas;
 import zui.Zui.TNodeLink;
 import iron.SceneFormat;
-import arm.shader.MaterialParser;
-import arm.shader.NodeShaderData;
-import arm.shader.NodeShaderContext;
 
 class MakeNodePreview {
 
@@ -35,32 +32,32 @@ class MakeNodePreview {
 		vert.write_attrib('texCoord.y = 1.0 - texCoord.y;');
 		#end
 
-		MaterialParser.init();
-		MaterialParser.canvases = [Context.raw.material.canvas];
-		MaterialParser.nodes = Context.raw.material.canvas.nodes;
-		MaterialParser.links = Context.raw.material.canvas.links;
+		ParserMaterial.init();
+		ParserMaterial.canvases = [Context.raw.material.canvas];
+		ParserMaterial.nodes = Context.raw.material.canvas.nodes;
+		ParserMaterial.links = Context.raw.material.canvas.links;
 		if (group != null) {
-			MaterialParser.push_group(group);
-			MaterialParser.parents = parents;
+			ParserMaterial.push_group(group);
+			ParserMaterial.parents = parents;
 		}
-		var links = MaterialParser.links;
+		var links = ParserMaterial.links;
 		var nodes = Context.raw.material.nodes;
 
 		var link: TNodeLink = { id: nodes.getLinkId(links), from_id: node.id, from_socket: Context.raw.nodePreviewSocket, to_id: -1, to_socket: -1 };
 		links.push(link);
 
-		MaterialParser.con = con_mesh;
-		MaterialParser.vert = vert;
-		MaterialParser.frag = frag;
-		MaterialParser.curshader = frag;
-		MaterialParser.matcon = matcon;
+		ParserMaterial.con = con_mesh;
+		ParserMaterial.vert = vert;
+		ParserMaterial.frag = frag;
+		ParserMaterial.curshader = frag;
+		ParserMaterial.matcon = matcon;
 
-		MaterialParser.transform_color_space = false;
-		var res = MaterialParser.write_result(link);
-		MaterialParser.transform_color_space = true;
+		ParserMaterial.transform_color_space = false;
+		var res = ParserMaterial.write_result(link);
+		ParserMaterial.transform_color_space = true;
 		var st = node.outputs[link.from_socket].type;
 		if (st != "RGB" && st != "RGBA" && st != "VECTOR") {
-			res = MaterialParser.to_vec3(res);
+			res = ParserMaterial.to_vec3(res);
 		}
 		links.remove(link);
 
@@ -72,7 +69,7 @@ class MakeNodePreview {
 		// vert.add_out('vec4 ndc');
 		// vert.write_attrib('ndc = vec4(gl_Position.xyz * vec3(0.5, 0.5, 0.0) + vec3(0.5, 0.5, 0.0), 1.0);');
 
-		MaterialParser.finalize(con_mesh);
+		ParserMaterial.finalize(con_mesh);
 
 		con_mesh.data.shader_from_source = true;
 		con_mesh.data.vertex_shader = vert.get();

+ 18 - 23
armorpaint/Sources/arm/shader/MakePaint.hx → armorpaint/Sources/arm/MakePaint.hx

@@ -1,11 +1,6 @@
-package arm.shader;
+package arm;
 
 import iron.SceneFormat;
-import arm.ui.UINodes;
-import arm.shader.MaterialParser;
-import arm.shader.NodeShaderContext;
-import arm.shader.NodeShaderData;
-import arm.shader.ShaderFunctions;
 
 class MakePaint {
 
@@ -198,24 +193,24 @@ class MakePaint {
 			}
 		}
 		else {
-			MaterialParser.parse_emission = Context.raw.material.paintEmis;
-			MaterialParser.parse_subsurface = Context.raw.material.paintSubs;
-			MaterialParser.parse_height = Context.raw.material.paintHeight;
-			MaterialParser.parse_height_as_channel = true;
+			ParserMaterial.parse_emission = Context.raw.material.paintEmis;
+			ParserMaterial.parse_subsurface = Context.raw.material.paintSubs;
+			ParserMaterial.parse_height = Context.raw.material.paintHeight;
+			ParserMaterial.parse_height_as_channel = true;
 			var uvType = Context.raw.layer.fill_layer != null ? Context.raw.layer.uvType : Context.raw.brushPaint;
-			MaterialParser.triplanar = uvType == UVTriplanar && !decal;
-			MaterialParser.sample_keep_aspect = decal;
-			MaterialParser.sample_uv_scale = 'brushScale';
-			var sout = MaterialParser.parse(UINodes.inst.getCanvasMaterial(), con_paint, vert, frag, matcon);
-			MaterialParser.parse_emission = false;
-			MaterialParser.parse_subsurface = false;
-			MaterialParser.parse_height_as_channel = false;
-			MaterialParser.parse_height = false;
+			ParserMaterial.triplanar = uvType == UVTriplanar && !decal;
+			ParserMaterial.sample_keep_aspect = decal;
+			ParserMaterial.sample_uv_scale = 'brushScale';
+			var sout = ParserMaterial.parse(UINodes.inst.getCanvasMaterial(), con_paint, vert, frag, matcon);
+			ParserMaterial.parse_emission = false;
+			ParserMaterial.parse_subsurface = false;
+			ParserMaterial.parse_height_as_channel = false;
+			ParserMaterial.parse_height = false;
 			var base = sout.out_basecol;
 			var rough = sout.out_roughness;
 			var met = sout.out_metallic;
 			var occ = sout.out_occlusion;
-			var nortan = MaterialParser.out_normaltan;
+			var nortan = ParserMaterial.out_normaltan;
 			var height = sout.out_height;
 			var opac = sout.out_opacity;
 			var emis = sout.out_emission;
@@ -348,7 +343,7 @@ class MakePaint {
 		if (Context.raw.pickerMaskHandle.position == MaskMaterial) {
 			matid = Context.raw.materialIdPicked / 255; // Keep existing material id in place when mask is set
 		}
-		var matidString = MaterialParser.vec1(matid * 3.0);
+		var matidString = ParserMaterial.vec1(matid * 3.0);
 		frag.write('float matid = $matidString;');
 
 		// matid % 3 == 0 - normal, 1 - emission, 2 - subsurface
@@ -473,9 +468,9 @@ class MakePaint {
 			MakeBake.run(con_paint, vert, frag);
 		}
 
-		MaterialParser.finalize(con_paint);
-		MaterialParser.triplanar = false;
-		MaterialParser.sample_keep_aspect = false;
+		ParserMaterial.finalize(con_paint);
+		ParserMaterial.triplanar = false;
+		ParserMaterial.sample_keep_aspect = false;
 		con_paint.data.shader_from_source = true;
 		con_paint.data.vertex_shader = vert.get();
 		con_paint.data.fragment_shader = frag.get();

+ 1 - 5
armorpaint/Sources/arm/shader/MakeParticle.hx → armorpaint/Sources/arm/MakeParticle.hx

@@ -1,8 +1,4 @@
-package arm.shader;
-
-import arm.shader.NodeShader;
-import arm.shader.NodeShaderContext;
-import arm.shader.NodeShaderData;
+package arm;
 
 class MakeParticle {
 

+ 1 - 3
armorpaint/Sources/arm/shader/MakeTexcoord.hx → armorpaint/Sources/arm/MakeTexcoord.hx

@@ -1,6 +1,4 @@
-package arm.shader;
-
-import arm.shader.NodeShader;
+package arm;
 
 class MakeTexcoord {
 

+ 11 - 11
armorpaint/Sources/arm/logic/NodesBrush.hx → armorpaint/Sources/arm/NodesBrush.hx

@@ -1,4 +1,4 @@
-package arm.logic;
+package arm;
 
 import zui.Zui.Nodes;
 import zui.Zui.TNode;
@@ -10,15 +10,15 @@ class NodesBrush {
 
 	public static var list: Array<Array<TNode>> = [
 		[ // Category 0
-			TEX_IMAGE.def,
-			InputNode.def,
-			MathNode.def,
-			RandomNode.def,
-			SeparateVectorNode.def,
-			TimeNode.def,
-			FloatNode.def,
-			VectorNode.def,
-			VectorMathNode.def
+			arm.nodes.TEX_IMAGE.def,
+			arm.nodes.InputNode.def,
+			arm.nodes.MathNode.def,
+			arm.nodes.RandomNode.def,
+			arm.nodes.SeparateVectorNode.def,
+			arm.nodes.TimeNode.def,
+			arm.nodes.FloatNode.def,
+			arm.nodes.VectorNode.def,
+			arm.nodes.VectorMathNode.def
 		]
 	];
 
@@ -28,7 +28,7 @@ class NodesBrush {
 				if (n.type == nodeType) {
 					var canvas = Context.raw.brush.canvas;
 					var nodes = Context.raw.brush.nodes;
-					var node = arm.ui.UINodes.makeNode(n, nodes, canvas);
+					var node = arm.UINodes.makeNode(n, nodes, canvas);
 					canvas.nodes.push(node);
 					return node;
 				}

+ 4 - 11
armorpaint/Sources/arm/render/RenderPathPaint.hx → armorpaint/Sources/arm/RenderPathPaint.hx

@@ -1,4 +1,4 @@
-package arm.render;
+package arm;
 
 import iron.App;
 import iron.Mat4;
@@ -14,17 +14,10 @@ import iron.Uniforms;
 import iron.MaterialData;
 import iron.ShaderData;
 import iron.ConstData;
-import arm.ui.UIView2D;
-import arm.Viewport;
-#if is_paint
-import arm.ui.UIHeader;
-import arm.ui.UIBase;
-import arm.shader.MakeMaterial;
-#end
 
 class RenderPathPaint {
 
-	public static var liveLayer: arm.data.LayerSlot = null;
+	public static var liveLayer: SlotLayer = null;
 	public static var liveLayerDrawn = 0;
 	public static var liveLayerLocked = false;
 	static var path: RenderPath;
@@ -436,7 +429,7 @@ class RenderPathPaint {
 		if (liveLayerLocked) return;
 
 		if (liveLayer == null) {
-			liveLayer = new arm.data.LayerSlot("_live");
+			liveLayer = new SlotLayer("_live");
 		}
 
 		var tid = Context.raw.layer.id;
@@ -930,7 +923,7 @@ class RenderPathPaint {
 	public static function dilate(base: Bool, nor_pack: Bool) {
 		#if is_paint
 		if (Config.raw.dilate_radius > 0 && !Context.raw.paint2d) {
-			arm.util.UVUtil.cacheDilateMap();
+			UtilUV.cacheDilateMap();
 			Base.makeTempImg();
 			var tid = Context.raw.layer.id;
 			if (base) {

+ 9 - 10
armorpaint/Sources/arm/render/RenderPathPreview.hx → armorpaint/Sources/arm/RenderPathPreview.hx

@@ -1,7 +1,6 @@
-package arm.render;
+package arm;
 
 import iron.RenderPath;
-import arm.util.RenderUtil;
 
 class RenderPathPreview {
 
@@ -32,8 +31,8 @@ class RenderPathPreview {
 		{
 			var t = new RenderTargetRaw();
 			t.name = "mtex";
-			t.width = Std.int(RenderUtil.materialPreviewSize * 2.0);
-			t.height = Std.int(RenderUtil.materialPreviewSize * 2.0);
+			t.width = Std.int(UtilRender.materialPreviewSize * 2.0);
+			t.height = Std.int(UtilRender.materialPreviewSize * 2.0);
 			t.format = "RGBA64";
 			t.scale = RenderPathBase.getSuperSampling();
 			#if krom_opengl
@@ -45,8 +44,8 @@ class RenderPathPreview {
 		{
 			var t = new RenderTargetRaw();
 			t.name = "mgbuffer0";
-			t.width = Std.int(RenderUtil.materialPreviewSize * 2.0);
-			t.height = Std.int(RenderUtil.materialPreviewSize * 2.0);
+			t.width = Std.int(UtilRender.materialPreviewSize * 2.0);
+			t.height = Std.int(UtilRender.materialPreviewSize * 2.0);
 			t.format = "RGBA64";
 			t.scale = RenderPathBase.getSuperSampling();
 			t.depth_buffer = "mmain";
@@ -56,8 +55,8 @@ class RenderPathPreview {
 		{
 			var t = new RenderTargetRaw();
 			t.name = "mgbuffer1";
-			t.width = Std.int(RenderUtil.materialPreviewSize * 2.0);
-			t.height = Std.int(RenderUtil.materialPreviewSize * 2.0);
+			t.width = Std.int(UtilRender.materialPreviewSize * 2.0);
+			t.height = Std.int(UtilRender.materialPreviewSize * 2.0);
 			t.format = "RGBA64";
 			t.scale = RenderPathBase.getSuperSampling();
 			path.createRenderTarget(t);
@@ -66,8 +65,8 @@ class RenderPathPreview {
 		{
 			var t = new RenderTargetRaw();
 			t.name = "mgbuffer2";
-			t.width = Std.int(RenderUtil.materialPreviewSize * 2.0);
-			t.height = Std.int(RenderUtil.materialPreviewSize * 2.0);
+			t.width = Std.int(UtilRender.materialPreviewSize * 2.0);
+			t.height = Std.int(UtilRender.materialPreviewSize * 2.0);
 			t.format = "RGBA64";
 			t.scale = RenderPathBase.getSuperSampling();
 			path.createRenderTarget(t);

+ 2 - 2
armorpaint/Sources/arm/data/BrushSlot.hx → armorpaint/Sources/arm/SlotBrush.hx

@@ -1,4 +1,4 @@
-package arm.data;
+package arm;
 
 import zui.Zui.Nodes;
 import zui.Zui.TNodeCanvas;
@@ -6,7 +6,7 @@ import iron.System;
 import iron.Data;
 import iron.ArmPack;
 
-class BrushSlot {
+class SlotBrush {
 	public var nodes = new Nodes();
 	public var canvas: TNodeCanvas;
 	public var image: Image = null; // 200px

+ 2 - 2
armorpaint/Sources/arm/data/FontSlot.hx → armorpaint/Sources/arm/SlotFont.hx

@@ -1,8 +1,8 @@
-package arm.data;
+package arm;
 
 import iron.System;
 
-class FontSlot {
+class SlotFont {
 	public var image: Image = null; // 200px
 	public var previewReady = false;
 	public var id = 0;

+ 18 - 24
armorpaint/Sources/arm/data/LayerSlot.hx → armorpaint/Sources/arm/SlotLayer.hx

@@ -1,21 +1,15 @@
-package arm.data;
+package arm;
 
 import iron.System;
 import iron.RenderPath;
 import iron.Mat4;
-import arm.ui.UIBase;
-import arm.ui.TabLayers;
-import arm.shader.MakeMaterial;
-#if is_paint
-import arm.util.RenderUtil;
-#end
-
-class LayerSlot {
+
+class SlotLayer {
 	public var id = 0;
 	public var name: String;
 	public var ext = "";
 	public var visible = true;
-	public var parent: LayerSlot = null; // Group (for layers) or layer (for masks)
+	public var parent: SlotLayer = null; // Group (for layers) or layer (for masks)
 
 	public var texpaint: Image = null; // Base or mask
 	#if is_paint
@@ -25,7 +19,7 @@ class LayerSlot {
 	#end
 
 	public var maskOpacity = 1.0; // Opacity mask
-	public var fill_layer: MaterialSlot = null;
+	public var fill_layer: SlotMaterial = null;
 	public var show_panel = true;
 	public var blending = BlendMix;
 	public var objectMask = 0;
@@ -45,7 +39,7 @@ class LayerSlot {
 	public var paintSubs = true;
 	public var decalMat = Mat4.identity(); // Decal layer
 
-	public function new(ext = "", type = SlotLayer, parent: LayerSlot = null) {
+	public function new(ext = "", type = SlotLayer, parent: SlotLayer = null) {
 		if (ext == "") {
 			id = 0;
 			for (l in Project.layers) if (l.id >= id) id = l.id + 1;
@@ -96,7 +90,7 @@ class LayerSlot {
 				texpaint_pack = RenderPath.active.createRenderTarget(t).image;
 			}
 
-			texpaint_preview = Image.createRenderTarget(RenderUtil.layerPreviewSize, RenderUtil.layerPreviewSize, TextureFormat.RGBA32);
+			texpaint_preview = Image.createRenderTarget(UtilRender.layerPreviewSize, UtilRender.layerPreviewSize, TextureFormat.RGBA32);
 			#end
 		}
 
@@ -115,7 +109,7 @@ class LayerSlot {
 				texpaint = RenderPath.active.createRenderTarget(t).image;
 			}
 
-			texpaint_preview = Image.createRenderTarget(RenderUtil.layerPreviewSize, RenderUtil.layerPreviewSize, TextureFormat.RGBA32);
+			texpaint_preview = Image.createRenderTarget(UtilRender.layerPreviewSize, UtilRender.layerPreviewSize, TextureFormat.RGBA32);
 		}
 		#end
 	}
@@ -173,7 +167,7 @@ class LayerSlot {
 		#end
 	}
 
-	public function swap(other: LayerSlot) {
+	public function swap(other: SlotLayer) {
 		if ((isLayer() || isMask()) && (other.isLayer() || other.isMask())) {
 			RenderPath.active.renderTargets.get("texpaint" + ext).image = other.texpaint;
 			RenderPath.active.renderTargets.get("texpaint" + other.ext).image = texpaint;
@@ -262,10 +256,10 @@ class LayerSlot {
 		delete();
 	}
 
-	public function duplicate(): LayerSlot {
+	public function duplicate(): SlotLayer {
 		var layers = Project.layers;
 		var i = layers.indexOf(this) + 1;
-		var l = new LayerSlot("", isLayer() ? SlotLayer : isMask() ? SlotMask : SlotGroup, parent);
+		var l = new SlotLayer("", isLayer() ? SlotLayer : isMask() ? SlotMask : SlotGroup, parent);
 		layers.insert(i, l);
 
 		if (Base.pipeMerge == null) Base.makePipe();
@@ -429,8 +423,8 @@ class LayerSlot {
 		return visible && (parent == null || parent.visible);
 	}
 
-	public function getChildren(): Array<LayerSlot> {
-		var children: Array<LayerSlot> = null; // Child layers of a group
+	public function getChildren(): Array<SlotLayer> {
+		var children: Array<SlotLayer> = null; // Child layers of a group
 		for (l in Project.layers) {
 			if (l.parent == this && l.isLayer()) {
 				if (children == null) children = [];
@@ -440,8 +434,8 @@ class LayerSlot {
 		return children;
 	}
 
-	public function getRecursiveChildren(): Array<LayerSlot> {
-		var children: Array<LayerSlot> = null;
+	public function getRecursiveChildren(): Array<SlotLayer> {
+		var children: Array<SlotLayer> = null;
 		for (l in Project.layers) {
 			if (l.parent == this) { // Child layers and group masks
 				if (children == null) children = [];
@@ -455,10 +449,10 @@ class LayerSlot {
 		return children;
 	}
 
-	public function getMasks(includeGroupMasks = true): Array<LayerSlot> {
+	public function getMasks(includeGroupMasks = true): Array<SlotLayer> {
 		if (this.isMask()) return null;
 
-		var children: Array<LayerSlot> = null;
+		var children: Array<SlotLayer> = null;
 		// Child masks of a layer
 		for (l in Project.layers) {
 			if (l.parent == this && l.isMask()) {
@@ -521,7 +515,7 @@ class LayerSlot {
 		return texpaint == null;
 	}
 
-	public function getContainingGroup(): LayerSlot {
+	public function getContainingGroup(): SlotLayer {
 		if (parent != null && parent.isGroup())
 			return parent;
 		else if (parent != null && parent.parent != null && parent.parent.isGroup())

+ 3 - 4
armorpaint/Sources/arm/data/MaterialSlot.hx → armorpaint/Sources/arm/SlotMaterial.hx

@@ -1,4 +1,4 @@
-package arm.data;
+package arm;
 
 import zui.Zui.Nodes;
 import zui.Zui.TNodeCanvas;
@@ -6,9 +6,8 @@ import iron.System;
 import iron.MaterialData;
 import iron.Data;
 import iron.ArmPack;
-import arm.util.RenderUtil;
 
-class MaterialSlot {
+class SlotMaterial {
 	public var nodes = new Nodes();
 	public var canvas: TNodeCanvas;
 	public var image: Image = null;
@@ -32,7 +31,7 @@ class MaterialSlot {
 		for (mat in Project.materials) if (mat.id >= id) id = mat.id + 1;
 		data = m;
 
-		var w = RenderUtil.materialPreviewSize;
+		var w = UtilRender.materialPreviewSize;
 		var wIcon = 50;
 		image = Image.createRenderTarget(w, w);
 		imageIcon = Image.createRenderTarget(wIcon, wIcon);

+ 24 - 30
armorpaint/Sources/arm/ui/TabLayers.hx → armorpaint/Sources/arm/TabLayers.hx

@@ -1,4 +1,4 @@
-package arm.ui;
+package arm;
 
 import zui.Zui;
 import zui.Zui.Nodes;
@@ -7,12 +7,6 @@ import iron.System;
 import iron.Time;
 import iron.Input;
 import iron.MeshObject;
-import arm.data.LayerSlot;
-import arm.shader.MakeMaterial;
-import arm.util.UVUtil;
-import arm.util.MeshUtil;
-import arm.util.RenderUtil;
-import arm.sys.Path;
 
 class TabLayers {
 
@@ -183,18 +177,18 @@ class TabLayers {
 				p.visible = Context.raw.layerFilter == 0 || p.name == ar[Context.raw.layerFilter] || Project.isAtlasObject(p);
 			}
 			if (Context.raw.layerFilter == 0 && Context.raw.mergedObjectIsAtlas) { // All
-				MeshUtil.mergeMesh();
+				UtilMesh.mergeMesh();
 			}
 			else if (Context.raw.layerFilter > Project.paintObjects.length) { // Atlas
 				var visibles: Array<MeshObject> = [];
 				for (p in Project.paintObjects) if (p.visible) visibles.push(p);
-				MeshUtil.mergeMesh(visibles);
+				UtilMesh.mergeMesh(visibles);
 			}
 			Base.setObjectMask();
-			UVUtil.uvmapCached = false;
+			UtilUV.uvmapCached = false;
 			Context.raw.ddirty = 2;
 			#if (krom_direct3d12 || krom_vulkan || krom_metal)
-			arm.render.RenderPathRaytrace.ready = false;
+			RenderPathRaytrace.ready = false;
 			#end
 		}
 	}
@@ -210,26 +204,26 @@ class TabLayers {
 		}
 	}
 
-	public static function initLayerMap(): Map<LayerSlot, Int> {
-		var res: Map<LayerSlot, Int> = [];
+	public static function initLayerMap(): Map<SlotLayer, Int> {
+		var res: Map<SlotLayer, Int> = [];
 		for (i in 0...Project.layers.length) res.set(Project.layers[i], i);
 		return res;
 	}
 
-	public static function fillLayerMap(map: Map<LayerSlot, Int>): Map<Int, Int> {
+	public static function fillLayerMap(map: Map<SlotLayer, Int>): Map<Int, Int> {
 		var res: Map<Int, Int> = [];
 		for (l in map.keys()) res.set(map.get(l), Project.layers.indexOf(l) > -1 ? Project.layers.indexOf(l) : 9999);
 		return res;
 	}
 
-	static function setDragLayer(layer: LayerSlot, offX: Float, offY: Float) {
+	static function setDragLayer(layer: SlotLayer, offX: Float, offY: Float) {
 		Base.dragOffX = offX;
 		Base.dragOffY = offY;
 		Base.dragLayer = layer;
 		Context.raw.dragDestination = Project.layers.indexOf(layer);
 	}
 
-	static function drawLayerSlot(l: LayerSlot, i: Int, mini: Bool) {
+	static function drawLayerSlot(l: SlotLayer, i: Int, mini: Bool) {
 		var ui = UIBase.inst.ui;
 
 		if (Context.raw.layerFilter > 0 &&
@@ -295,7 +289,7 @@ class TabLayers {
 		}
 	}
 
-	static function drawLayerSlotMini(l: LayerSlot, i: Int) {
+	static function drawLayerSlotMini(l: SlotLayer, i: Int) {
 		var ui = UIBase.inst.ui;
 
 		ui.row([1, 1]);
@@ -309,7 +303,7 @@ class TabLayers {
 		ui._y -= ui.ELEMENT_OFFSET();
 	}
 
-	static function drawLayerSlotFull(l: LayerSlot, i: Int) {
+	static function drawLayerSlotFull(l: SlotLayer, i: Int) {
 		var ui = UIBase.inst.ui;
 
 		var step = ui.t.ELEMENT_H;
@@ -463,7 +457,7 @@ class TabLayers {
 		ui._y -= ui.ELEMENT_OFFSET();
 	}
 
-	static function comboObject(ui: Zui, l: LayerSlot, label = false): Handle {
+	static function comboObject(ui: Zui, l: SlotLayer, label = false): Handle {
 		var ar = [tr("Shared")];
 		for (p in Project.paintObjects) ar.push(p.name);
 		var atlases = Project.getUsedAtlases();
@@ -489,7 +483,7 @@ class TabLayers {
 		return objectHandle;
 	}
 
-	static function comboBlending(ui: Zui, l: LayerSlot, label = false): Handle {
+	static function comboBlending(ui: Zui, l: SlotLayer, label = false): Handle {
 		var blendingHandle = Zui.handle("tablayers_3").nest(l.id);
 		blendingHandle.position = l.blending;
 		ui.combo(blendingHandle, [
@@ -521,13 +515,13 @@ class TabLayers {
 		return blendingHandle;
 	}
 
-	static function layerToggleVisible(l: LayerSlot) {
+	static function layerToggleVisible(l: SlotLayer) {
 		l.visible = !l.visible;
 		UIView2D.inst.hwnd.redraws = 2;
 		MakeMaterial.parseMeshMaterial();
 	}
 
-	static function drawLayerHighlight(l: LayerSlot, mini: Bool) {
+	static function drawLayerHighlight(l: SlotLayer, mini: Bool) {
 		var ui = UIBase.inst.ui;
 		var step = ui.t.ELEMENT_H;
 
@@ -545,7 +539,7 @@ class TabLayers {
 		}
 	}
 
-	static function handleLayerIconState(l: LayerSlot, i: Int, state: State, uix: Float, uiy: Float) {
+	static function handleLayerIconState(l: SlotLayer, i: Int, state: State, uix: Float, uiy: Float) {
 		var ui = UIBase.inst.ui;
 
 		#if is_paint
@@ -592,7 +586,7 @@ class TabLayers {
 		}
 	}
 
-	static function drawLayerIcon(l: LayerSlot, i: Int, uix: Float, uiy: Float, mini: Bool) {
+	static function drawLayerIcon(l: SlotLayer, i: Int, uix: Float, uiy: Float, mini: Bool) {
 		var ui = UIBase.inst.ui;
 		var icons = Res.get("icons.k");
 		var iconH = (ui.ELEMENT_H() - (mini ? 2 : 3)) * 2;
@@ -669,7 +663,7 @@ class TabLayers {
 		}
 	}
 
-	static function canMergeDown(l: LayerSlot) : Bool {
+	static function canMergeDown(l: SlotLayer) : Bool {
 		var index = Project.layers.indexOf(l);
 		// Lowest layer
 		if (index == 0) return false;
@@ -682,7 +676,7 @@ class TabLayers {
 		return true;
 	}
 
-	static function drawLayerContextMenu(l: LayerSlot, mini: Bool) {
+	static function drawLayerContextMenu(l: SlotLayer, mini: Bool) {
 		var add = 0;
 
 		if (l.fill_layer == null) add += 1; // Clear
@@ -991,10 +985,10 @@ class TabLayers {
 		}, menuElements);
 	}
 
-	public static function makeMaskPreviewRgba32(l: LayerSlot) {
+	public static function makeMaskPreviewRgba32(l: SlotLayer) {
 		#if is_paint
 		if (Context.raw.maskPreviewRgba32 == null) {
-			Context.raw.maskPreviewRgba32 = Image.createRenderTarget(RenderUtil.layerPreviewSize, RenderUtil.layerPreviewSize);
+			Context.raw.maskPreviewRgba32 = Image.createRenderTarget(UtilRender.layerPreviewSize, UtilRender.layerPreviewSize);
 		}
 		// Convert from R8 to RGBA32 for tooltip display
 		if (Context.raw.maskPreviewLast != l) {
@@ -1011,7 +1005,7 @@ class TabLayers {
 		#end
 	}
 
-	static function deleteLayer(l: LayerSlot) {
+	static function deleteLayer(l: SlotLayer) {
 		var pointers = initLayerMap();
 
 		if (l.isLayer() && l.hasMasks(false)) {
@@ -1071,7 +1065,7 @@ class TabLayers {
 		for (m in Project.materials) remapLayerPointers(m.canvas.nodes, fillLayerMap(pointers));
 	}
 
-	static function canDelete(l: LayerSlot) {
+	static function canDelete(l: SlotLayer) {
 		var numLayers = 0;
 
 		if (l.isMask()) return true;

+ 6 - 6
armorpaint/Sources/arm/logic/BrushOutputNode.hx → armorpaint/Sources/arm/nodes/BrushOutputNode.hx

@@ -1,11 +1,11 @@
-package arm.logic;
+package arm.nodes;
 
 import iron.Input;
-import arm.logic.LogicNode;
-import arm.shader.MakeMaterial;
-import arm.ui.UIToolbar;
-import arm.ui.UIBase;
-import arm.ui.UIView2D;
+import arm.LogicNode;
+import arm.MakeMaterial;
+import arm.UIToolbar;
+import arm.UIBase;
+import arm.UIView2D;
 
 @:keep
 class BrushOutputNode extends LogicNode {

+ 2 - 2
armorpaint/Sources/arm/logic/InputNode.hx → armorpaint/Sources/arm/nodes/InputNode.hx

@@ -1,11 +1,11 @@
-package arm.logic;
+package arm.nodes;
 
 import iron.App;
 import iron.Input;
 import iron.Vec4;
 import zui.Zui.Nodes;
 import zui.Zui.TNode;
-import arm.logic.LogicNode;
+import arm.LogicNode;
 import arm.Translator._tr;
 
 @:keep

+ 3 - 3
armorpaint/Sources/arm/logic/TEX_IMAGE.hx → armorpaint/Sources/arm/nodes/TEX_IMAGE.hx

@@ -1,9 +1,9 @@
-package arm.logic;
+package arm.nodes;
 
 import zui.Zui.Nodes;
 import zui.Zui.TNode;
-import arm.logic.LogicNode;
-import arm.logic.LogicParser.f32;
+import arm.LogicNode;
+import arm.ParserLogic.f32;
 import arm.Translator._tr;
 
 @:keep

+ 1 - 1
armorsculpt/Sources/arm/io/ExportObj.hx → armorsculpt/Sources/arm/ExportObj.hx

@@ -1,4 +1,4 @@
-package arm.io;
+package arm;
 
 import js.lib.Int16Array;
 import iron.MeshObject;

+ 5 - 10
armorsculpt/Sources/arm/io/ImportMesh.hx → armorsculpt/Sources/arm/ImportMesh.hx

@@ -1,16 +1,11 @@
-package arm.io;
+package arm;
 
 import iron.SceneFormat;
 import iron.MeshData;
 import iron.Data;
 import iron.Scene;
 import iron.System;
-import arm.util.MeshUtil;
-import arm.Viewport;
-import arm.sys.Path;
-import arm.ui.UIBase;
-import arm.ui.UIView2D;
-import arm.Project;
+import iron.App;
 
 class ImportMesh {
 
@@ -65,7 +60,7 @@ class ImportMesh {
 
 			// No mask by default
 			for (p in Project.paintObjects) p.visible = true;
-			if (Context.raw.mergedObject == null) MeshUtil.mergeMesh();
+			if (Context.raw.mergedObject == null) UtilMesh.mergeMesh();
 			Context.raw.paintObject.skip_context = "paint";
 			Context.raw.mergedObject.visible = true;
 		}
@@ -73,8 +68,8 @@ class ImportMesh {
 		Viewport.scaleToBounds();
 
 		if (Context.raw.paintObject.name == "") Context.raw.paintObject.name = "Object";
-		arm.shader.MakeMaterial.parsePaintMaterial();
-		arm.shader.MakeMaterial.parseMeshMaterial();
+		MakeMaterial.parsePaintMaterial();
+		MakeMaterial.parseMeshMaterial();
 
 		UIView2D.inst.hwnd.redraws = 2;
 

+ 1 - 3
armorsculpt/Sources/arm/shader/MakeBrush.hx → armorsculpt/Sources/arm/MakeBrush.hx

@@ -1,6 +1,4 @@
-package arm.shader;
-
-import arm.shader.NodeShader;
+package arm;
 
 class MakeBrush {
 

+ 10 - 15
armorsculpt/Sources/arm/shader/MakeMaterial.hx → armorsculpt/Sources/arm/MakeMaterial.hx

@@ -1,4 +1,4 @@
-package arm.shader;
+package arm;
 
 import zui.Zui;
 import zui.Zui.Nodes;
@@ -6,11 +6,6 @@ import iron.System;
 import iron.SceneFormat;
 import iron.ShaderData;
 import iron.MaterialData;
-import arm.ui.UINodes;
-import arm.shader.NodeShaderContext;
-import arm.shader.NodeShaderData;
-import arm.shader.MaterialParser;
-import arm.util.RenderUtil;
 
 class MakeMaterial {
 
@@ -264,7 +259,7 @@ class MakeMaterial {
 
 	static function bakeNodePreview(node: TNode, group: TNodeCanvas, parents: Array<TNode>) {
 		if (node.type == "BLUR") {
-			var id = MaterialParser.node_name(node, parents);
+			var id = ParserMaterial.node_name(node, parents);
 			var image = Context.raw.nodePreviews.get(id);
 			Context.raw.nodePreviewsUsed.push(id);
 			var resX = Std.int(Config.getTextureResX() / 4);
@@ -275,12 +270,12 @@ class MakeMaterial {
 				Context.raw.nodePreviews.set(id, image);
 			}
 
-			MaterialParser.blur_passthrough = true;
-			RenderUtil.makeNodePreview(UINodes.inst.getCanvasMaterial(), node, image, group, parents);
-			MaterialParser.blur_passthrough = false;
+			ParserMaterial.blur_passthrough = true;
+			UtilRender.makeNodePreview(UINodes.inst.getCanvasMaterial(), node, image, group, parents);
+			ParserMaterial.blur_passthrough = false;
 		}
 		else if (node.type == "DIRECT_WARP") {
-			var id = MaterialParser.node_name(node, parents);
+			var id = ParserMaterial.node_name(node, parents);
 			var image = Context.raw.nodePreviews.get(id);
 			Context.raw.nodePreviewsUsed.push(id);
 			var resX = Std.int(Config.getTextureResX());
@@ -291,9 +286,9 @@ class MakeMaterial {
 				Context.raw.nodePreviews.set(id, image);
 			}
 
-			MaterialParser.warp_passthrough = true;
-			RenderUtil.makeNodePreview(UINodes.inst.getCanvasMaterial(), node, image, group, parents);
-			MaterialParser.warp_passthrough = false;
+			ParserMaterial.warp_passthrough = true;
+			UtilRender.makeNodePreview(UINodes.inst.getCanvasMaterial(), node, image, group, parents);
+			ParserMaterial.warp_passthrough = false;
 		}
 	}
 
@@ -312,7 +307,7 @@ class MakeMaterial {
 	}
 
 	public static function parseBrush() {
-		arm.logic.LogicParser.parse(Context.raw.brush.canvas);
+		ParserLogic.parse(Context.raw.brush.canvas);
 	}
 
 	public static inline function getDisplaceStrength():Float {

+ 4 - 10
armorsculpt/Sources/arm/shader/MakeMesh.hx → armorsculpt/Sources/arm/MakeMesh.hx

@@ -1,10 +1,4 @@
-package arm.shader;
-
-import arm.shader.MaterialParser;
-import arm.shader.NodeShaderContext;
-import arm.shader.NodeShaderData;
-import arm.shader.ShaderFunctions;
-import arm.data.LayerSlot;
+package arm;
 
 class MakeMesh {
 
@@ -120,7 +114,7 @@ class MakeMesh {
 
 		// Get layers for this pass
 		layerPassCount = 1;
-		var layers: Array<LayerSlot> = [];
+		var layers: Array<SlotLayer> = [];
 		var startCount = textureCount;
 		for (l in Project.layers) {
 			if (!l.isLayer() || !l.isVisible()) continue;
@@ -226,7 +220,7 @@ class MakeMesh {
 				frag.write('fragColor[0] = vec4(basecol, opacity);');
 				frag.write('fragColor[1] = vec4(ntex, matid);');
 				frag.write('fragColor[2] = vec4(occlusion, roughness, metallic, height);');
-				MaterialParser.finalize(con_mesh);
+				ParserMaterial.finalize(con_mesh);
 				con_mesh.data.shader_from_source = true;
 				con_mesh.data.vertex_shader = vert.get();
 				con_mesh.data.fragment_shader = frag.get();
@@ -328,7 +322,7 @@ class MakeMesh {
 		frag.write('vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;');
 		frag.write('fragColor[2] = vec4(posa - posb, texCoord.xy);');
 
-		MaterialParser.finalize(con_mesh);
+		ParserMaterial.finalize(con_mesh);
 		con_mesh.data.shader_from_source = true;
 		con_mesh.data.vertex_shader = vert.get();
 		con_mesh.data.fragment_shader = frag.get();

+ 12 - 17
armorsculpt/Sources/arm/shader/MakeMeshPreview.hx → armorsculpt/Sources/arm/MakeMeshPreview.hx

@@ -1,12 +1,7 @@
-package arm.shader;
+package arm;
 
 import iron.MeshObject;
 import iron.SceneFormat;
-import arm.ui.UINodes;
-import arm.shader.MaterialParser;
-import arm.shader.NodeShaderData;
-import arm.shader.NodeShaderContext;
-import arm.shader.ShaderFunctions;
 
 class MakeMeshPreview {
 
@@ -58,21 +53,21 @@ class MakeMeshPreview {
 		vert.write_attrib('texCoord = tex * float(${brushScale});');
 
 		var decal = Context.raw.decalPreview;
-		MaterialParser.sample_keep_aspect = decal;
-		MaterialParser.sample_uv_scale = brushScale;
-		MaterialParser.parse_height = MakeMaterial.heightUsed;
-		MaterialParser.parse_height_as_channel = true;
-		// var sout = MaterialParser.parse(UINodes.inst.getCanvasMaterial(), con_mesh, vert, frag, matcon);
-		MaterialParser.parse_height = false;
-		MaterialParser.parse_height_as_channel = false;
-		MaterialParser.sample_keep_aspect = false;
+		ParserMaterial.sample_keep_aspect = decal;
+		ParserMaterial.sample_uv_scale = brushScale;
+		ParserMaterial.parse_height = MakeMaterial.heightUsed;
+		ParserMaterial.parse_height_as_channel = true;
+		// var sout = ParserMaterial.parse(UINodes.inst.getCanvasMaterial(), con_mesh, vert, frag, matcon);
+		ParserMaterial.parse_height = false;
+		ParserMaterial.parse_height_as_channel = false;
+		ParserMaterial.sample_keep_aspect = false;
 		var base = "vec3(1.0, 1.0, 1.0)";//sout.out_basecol;
 		var rough = "0.0";//sout.out_roughness;
 		var met = "0.0";//sout.out_metallic;
 		var occ = "0.0";//sout.out_occlusion;
 		var opac = "0.0";//sout.out_opacity;
 		var height = "0.0";//sout.out_height;
-		var nortan = "vec3(1.0, 1.0, 1.0)";//MaterialParser.out_normaltan;
+		var nortan = "vec3(1.0, 1.0, 1.0)";//ParserMaterial.out_normaltan;
 		frag.write('vec3 basecol = pow($base, vec3(2.2, 2.2, 2.2));');
 		frag.write('float roughness = $rough;');
 		frag.write('float metallic = $met;');
@@ -81,7 +76,7 @@ class MakeMeshPreview {
 		frag.write('vec3 nortan = $nortan;');
 		frag.write('float height = $height;');
 
-		// MaterialParser.parse_height_as_channel = false;
+		// ParserMaterial.parse_height_as_channel = false;
 		// vert.write('float vheight = $height;');
 		// vert.add_out('float height');
 		// vert.write('height = vheight;');
@@ -152,7 +147,7 @@ class MakeMeshPreview {
 		}
 		frag.write('fragColor[2] = vec4(0.0, 0.0, 0.0, 0.0);'); // veloc
 
-		MaterialParser.finalize(con_mesh);
+		ParserMaterial.finalize(con_mesh);
 
 		#if arm_skin
 		if (skin) {

+ 2 - 7
armorsculpt/Sources/arm/shader/MakeSculpt.hx → armorsculpt/Sources/arm/MakeSculpt.hx

@@ -1,12 +1,7 @@
-package arm.shader;
+package arm;
 
 import iron.SceneFormat;
 import zui.Zui.Nodes;
-import arm.ui.UINodes;
-import arm.shader.MaterialParser;
-import arm.shader.NodeShaderContext;
-import arm.shader.NodeShaderData;
-import arm.shader.ShaderFunctions;
 
 class MakeSculpt {
 
@@ -90,7 +85,7 @@ class MakeSculpt {
 
 		frag.write('fragColor[1] = vec4(str, 0.0, 0.0, 1.0);');
 
-		MaterialParser.finalize(con_paint);
+		ParserMaterial.finalize(con_paint);
 		con_paint.data.shader_from_source = true;
 		con_paint.data.vertex_shader = vert.get();
 		con_paint.data.fragment_shader = frag.get();

+ 13 - 19
armorsculpt/Sources/arm/ui/TabLayers.hx → armorsculpt/Sources/arm/TabLayers.hx

@@ -1,16 +1,10 @@
-package arm.ui;
+package arm;
 
 import zui.Zui;
 import zui.Zui.Nodes;
 import iron.Time;
 import iron.Input;
 import iron.MeshObject;
-import arm.data.LayerSlot;
-import arm.shader.MakeMaterial;
-import arm.util.UVUtil;
-import arm.util.MeshUtil;
-import arm.util.RenderUtil;
-import arm.sys.Path;
 
 class TabLayers {
 
@@ -114,26 +108,26 @@ class TabLayers {
 		}
 	}
 
-	public static function initLayerMap(): Map<LayerSlot, Int> {
-		var res: Map<LayerSlot, Int> = [];
+	public static function initLayerMap(): Map<SlotLayer, Int> {
+		var res: Map<SlotLayer, Int> = [];
 		for (i in 0...Project.layers.length) res.set(Project.layers[i], i);
 		return res;
 	}
 
-	public static function fillLayerMap(map: Map<LayerSlot, Int>): Map<Int, Int> {
+	public static function fillLayerMap(map: Map<SlotLayer, Int>): Map<Int, Int> {
 		var res: Map<Int, Int> = [];
 		for (l in map.keys()) res.set(map.get(l), Project.layers.indexOf(l) > -1 ? Project.layers.indexOf(l) : 9999);
 		return res;
 	}
 
-	static function setDragLayer(layer: LayerSlot, offX: Float, offY: Float) {
+	static function setDragLayer(layer: SlotLayer, offX: Float, offY: Float) {
 		Base.dragOffX = offX;
 		Base.dragOffY = offY;
 		Base.dragLayer = layer;
 		Context.raw.dragDestination = Project.layers.indexOf(layer);
 	}
 
-	static function drawLayerSlot(l: LayerSlot, i: Int, mini: Bool) {
+	static function drawLayerSlot(l: SlotLayer, i: Int, mini: Bool) {
 		var ui = UIBase.inst.ui;
 
 		if (Context.raw.layerFilter > 0 &&
@@ -199,7 +193,7 @@ class TabLayers {
 		}
 	}
 
-	static function drawLayerSlotMini(l: LayerSlot, i: Int) {
+	static function drawLayerSlotMini(l: SlotLayer, i: Int) {
 		var ui = UIBase.inst.ui;
 
 		ui.row([1, 1]);
@@ -212,7 +206,7 @@ class TabLayers {
 		ui._y -= ui.ELEMENT_OFFSET();
 	}
 
-	static function drawLayerSlotFull(l: LayerSlot, i: Int) {
+	static function drawLayerSlotFull(l: SlotLayer, i: Int) {
 		var ui = UIBase.inst.ui;
 
 		var step = ui.t.ELEMENT_H;
@@ -350,7 +344,7 @@ class TabLayers {
 		ui._y -= ui.ELEMENT_OFFSET();
 	}
 
-	static function comboObject(ui: Zui, l: LayerSlot, label = false): Handle {
+	static function comboObject(ui: Zui, l: SlotLayer, label = false): Handle {
 		var ar = [tr("Shared")];
 		var objectHandle = Zui.handle("tablayers_2").nest(l.id);
 		objectHandle.position = l.objectMask;
@@ -358,13 +352,13 @@ class TabLayers {
 		return objectHandle;
 	}
 
-	static function layerToggleVisible(l: LayerSlot) {
+	static function layerToggleVisible(l: SlotLayer) {
 		l.visible = !l.visible;
 		UIView2D.inst.hwnd.redraws = 2;
 		MakeMaterial.parseMeshMaterial();
 	}
 
-	static function drawLayerHighlight(l: LayerSlot, mini: Bool) {
+	static function drawLayerHighlight(l: SlotLayer, mini: Bool) {
 		var ui = UIBase.inst.ui;
 		var step = ui.t.ELEMENT_H;
 
@@ -382,7 +376,7 @@ class TabLayers {
 		}
 	}
 
-	static function canMergeDown(l: LayerSlot) : Bool {
+	static function canMergeDown(l: SlotLayer) : Bool {
 		var index = Project.layers.indexOf(l);
 		// Lowest layer
 		if (index == 0) return false;
@@ -395,7 +389,7 @@ class TabLayers {
 		return true;
 	}
 
-	static function drawLayerContextMenu(l: LayerSlot, mini: Bool) {
+	static function drawLayerContextMenu(l: SlotLayer, mini: Bool) {
 
 	}
 

+ 5 - 5
armorsculpt/Sources/arm/logic/BrushOutputNode.hx → armorsculpt/Sources/arm/nodes/BrushOutputNode.hx

@@ -1,10 +1,10 @@
-package arm.logic;
+package arm.nodes;
 
 import iron.Input;
-import arm.logic.LogicNode;
-import arm.shader.MakeMaterial;
-import arm.ui.UIBase;
-import arm.ui.UIView2D;
+import arm.LogicNode;
+import arm.MakeMaterial;
+import arm.UIBase;
+import arm.UIView2D;
 
 @:keep
 class BrushOutputNode extends LogicNode {

+ 5 - 5
base/Sources/Main.hx

@@ -5,11 +5,11 @@ import iron.System;
 import iron.Object;
 import iron.Scene;
 import iron.RenderPath;
-import arm.render.RenderPathBase;
-import arm.render.RenderPathForward;
-import arm.render.RenderPathDeferred;
-import arm.render.RenderPathRaytrace;
-import arm.render.UniformsExt;
+import arm.RenderPathBase;
+import arm.RenderPathForward;
+import arm.RenderPathDeferred;
+import arm.RenderPathRaytrace;
+import arm.UniformsExt;
 import arm.Config;
 import arm.Context;
 import arm.Res;

+ 0 - 16
base/Sources/arm/Args.hx

@@ -4,22 +4,6 @@ import haxe.Json;
 import iron.App;
 import iron.System;
 import iron.Data;
-import arm.sys.Path;
-import arm.io.ImportAsset;
-import arm.io.ImportArm;
-#if is_paint
-import arm.io.ExportArm;
-#end
-#if (is_paint || is_sculpt)
-import arm.io.ExportMesh;
-import arm.ui.UIFiles;
-import arm.ui.UIBase;
-#end
-#if (is_paint || is_lab)
-import arm.sys.File;
-import arm.io.ExportTexture;
-import arm.ui.BoxExport;
-#end
 
 class Args {
 

+ 67 - 77
base/Sources/arm/Base.hx

@@ -11,19 +11,9 @@ import iron.Data;
 import iron.Time;
 import iron.RenderPath;
 import iron.ConstData;
-import arm.ui.*;
-import arm.io.ImportAsset;
-import arm.shader.MakeMaterial;
-import arm.Viewport;
-import arm.Camera;
-import arm.Res;
-import arm.ProjectFormat;
-#if (is_paint || is_sculpt)
 import iron.Mat4;
-import arm.data.*;
-import arm.util.*;
-import arm.render.RenderPathPaint;
-#end
+import arm.ProjectFormat;
+import arm.Res;
 
 class Base {
 
@@ -59,8 +49,8 @@ class Base {
 	static var lastWindowWidth = 0;
 	static var lastWindowHeight = 0;
 	#if (is_paint || is_sculpt)
-	public static var dragMaterial: MaterialSlot = null;
-	public static var dragLayer: LayerSlot = null;
+	public static var dragMaterial: SlotMaterial = null;
+	public static var dragLayer: SlotLayer = null;
 	#end
 
 	public static var pipeCopy: PipelineState;
@@ -209,7 +199,7 @@ class Base {
 					new UIView2D();
 
 					#if is_lab
-					arm.logic.RandomNode.setSeed(Std.int(Time.time() * 4294967295));
+					arm.nodes.RandomNode.setSeed(Std.int(Time.time() * 4294967295));
 					#end
 
 					App.notifyOnUpdate(update);
@@ -247,7 +237,7 @@ class Base {
 					#end
 
 					if (Config.raw.splash_screen && hasProjects) {
-						arm.ui.BoxProjects.show();
+						BoxProjects.show();
 					}
 				});
 			});
@@ -264,12 +254,12 @@ class Base {
 	public static function w(): Int {
 		// Drawing material preview
 		if (UIBase.inst != null && Context.raw.materialPreview) {
-			return RenderUtil.materialPreviewSize;
+			return UtilRender.materialPreviewSize;
 		}
 
 		// Drawing decal preview
 		if (UIBase.inst != null && Context.raw.decalPreview) {
-			return RenderUtil.decalPreviewSize;
+			return UtilRender.decalPreviewSize;
 		}
 
 		var res = 0;
@@ -299,12 +289,12 @@ class Base {
 	public static function h(): Int {
 		// Drawing material preview
 		if (UIBase.inst != null && Context.raw.materialPreview) {
-			return RenderUtil.materialPreviewSize;
+			return UtilRender.materialPreviewSize;
 		}
 
 		// Drawing decal preview
 		if (UIBase.inst != null && Context.raw.decalPreview) {
-			return RenderUtil.decalPreviewSize;
+			return UtilRender.decalPreviewSize;
 		}
 
 		var res = System.height;
@@ -521,7 +511,7 @@ class Base {
 				else if (Context.inViewport()) {
 					if (dragAsset.file.toLowerCase().endsWith(".hdr")) {
 						var image = Project.getImage(dragAsset);
-						arm.io.ImportEnvmap.run(dragAsset.file, image);
+						ImportEnvmap.run(dragAsset.file, image);
 					}
 				}
 				#if (is_paint || is_sculpt)
@@ -629,12 +619,12 @@ class Base {
 		// Material drag and dropped onto viewport or layers tab
 		if (Context.inViewport()) {
 			var uvType = Input.getKeyboard().down("control") ? UVProject : UVMap;
-			var decalMat = uvType == UVProject ? RenderUtil.getDecalMat() : null;
+			var decalMat = uvType == UVProject ? UtilRender.getDecalMat() : null;
 			Base.createFillLayer(uvType, decalMat);
 		}
 		if (Context.inLayers() && TabLayers.canDropNewLayer(Context.raw.dragDestination)) {
 			var uvType = Input.getKeyboard().down("control") ? UVProject : UVMap;
-			var decalMat = uvType == UVProject ? RenderUtil.getDecalMat() : null;
+			var decalMat = uvType == UVProject ? UtilRender.getDecalMat() : null;
 			Base.createFillLayer(uvType, decalMat, Context.raw.dragDestination);
 		}
 		else if (Context.inNodes()) {
@@ -720,7 +710,7 @@ class Base {
 
 		if (Context.raw.frame == 2) {
 			#if (is_paint || is_sculpt)
-			RenderUtil.makeMaterialPreview();
+			UtilRender.makeMaterialPreview();
 			UIBase.inst.hwnds[TabSidebar1].redraws = 2;
 			#end
 
@@ -732,7 +722,7 @@ class Base {
 			if (History.undoLayers == null) {
 				History.undoLayers = [];
 				for (i in 0...Config.raw.undo_steps) {
-					var l = new LayerSlot("_undo" + History.undoLayers.length);
+					var l = new SlotLayer("_undo" + History.undoLayers.length);
 					History.undoLayers.push(l);
 				}
 			}
@@ -913,14 +903,14 @@ class Base {
 	}
 
 	public static function redrawStatus() {
-		if (arm.ui.UIStatus.inst != null) {
+		if (UIStatus.inst != null) {
 			UIBase.inst.hwnds[TabStatus].redraws = 2;
 		}
 	}
 
 	public static function redrawConsole() {
 		var statush = Config.raw.layout[LayoutStatusH];
-		if (arm.ui.UIStatus.inst != null && arm.ui.UIBase.inst != null && arm.ui.UIBase.inst.ui != null && statush > arm.ui.UIStatus.defaultStatusH * arm.ui.UIBase.inst.ui.SCALE()) {
+		if (UIStatus.inst != null && UIBase.inst != null && UIBase.inst.ui != null && statush > UIStatus.defaultStatusH * UIBase.inst.ui.SCALE()) {
 			UIBase.inst.hwnds[TabStatus].redraws = 2;
 		}
 	}
@@ -1117,7 +1107,7 @@ class Base {
 		}
 		if (RenderPathPaint.liveLayer != null) RenderPathPaint.liveLayer.resizeAndSetBits();
 		#if (krom_direct3d12 || krom_vulkan || krom_metal)
-		arm.render.RenderPathRaytrace.ready = false; // Rebuild baketex
+		RenderPathRaytrace.ready = false; // Rebuild baketex
 		#end
 		Context.raw.ddirty = 2;
 	}
@@ -1368,7 +1358,7 @@ class Base {
 		var l = Project.layers[0];
 		#end
 		#if is_lab
-		var l = arm.logic.BrushOutputNode.inst;
+		var l = arm.nodes.BrushOutputNode.inst;
 		#end
 
 		if (tempImage != null && (tempImage.width != l.texpaint.width || tempImage.height != l.texpaint.height || tempImage.format != l.texpaint.format)) {
@@ -1419,7 +1409,7 @@ class Base {
 		var l = Project.layers[0];
 		#end
 		#if is_lab
-		var l = arm.logic.BrushOutputNode.inst;
+		var l = arm.nodes.BrushOutputNode.inst;
 		#end
 
 		if (expa != null && (expa.width != l.texpaint.width || expa.height != l.texpaint.height || expa.format != l.texpaint.format)) {
@@ -1475,7 +1465,7 @@ class Base {
 	}
 
 	#if (is_paint || is_sculpt)
-	public static function duplicateLayer(l: LayerSlot) {
+	public static function duplicateLayer(l: SlotLayer) {
 		if (!l.isGroup()) {
 			var newLayer = l.duplicate();
 			Context.setLayer(newLayer);
@@ -1523,7 +1513,7 @@ class Base {
 		}
 	}
 
-	public static function applyMasks(l: LayerSlot) {
+	public static function applyMasks(l: SlotLayer) {
 		var masks = l.getMasks();
 
 		if (masks != null) {
@@ -1563,7 +1553,7 @@ class Base {
 		Context.raw.layerPreviewDirty = true;
 	}
 
-	public static function mergeGroup(l: LayerSlot) {
+	public static function mergeGroup(l: SlotLayer) {
 		if (!l.isGroup()) return null;
 
 		var children = l.getChildren();
@@ -1595,7 +1585,7 @@ class Base {
 		return children[0];
 	}
 
-	public static function mergeLayer(l0 : LayerSlot, l1: LayerSlot, use_mask = false) {
+	public static function mergeLayer(l0 : SlotLayer, l1: SlotLayer, use_mask = false) {
 		if (!l1.visible || l1.isGroup()) return;
 
 		if (pipeMerge == null) makePipe();
@@ -1689,7 +1679,7 @@ class Base {
 		}
 	}
 
-	public static function flatten(heightToNormal = false, layers: Array<LayerSlot> = null): Dynamic {
+	public static function flatten(heightToNormal = false, layers: Array<SlotLayer> = null): Dynamic {
 		if (layers == null) layers = Project.layers;
 		Base.makeTempImg();
 		Base.makeExportImg();
@@ -1829,7 +1819,7 @@ class Base {
 		return untyped l0;
 	}
 
-	public static function applyMask(l: LayerSlot, m: LayerSlot) {
+	public static function applyMask(l: SlotLayer, m: SlotLayer) {
 		if (!l.isLayer() || !m.isMask()) return;
 
 		if (Base.pipeMerge == null) Base.makePipe();
@@ -1888,7 +1878,7 @@ class Base {
 		#if is_paint
 		if (Context.raw.tool == ToolMaterial) {
 			if (RenderPathPaint.liveLayer == null) {
-				RenderPathPaint.liveLayer = new arm.data.LayerSlot("_live");
+				RenderPathPaint.liveLayer = new SlotLayer("_live");
 			}
 
 			current = Graphics2.current;
@@ -2019,18 +2009,18 @@ class Base {
 			var isAtlas = Context.raw.layer.getObjectMask() > 0 && Context.raw.layer.getObjectMask() <= Project.paintObjects.length;
 			if (Context.raw.mergedObject == null || isAtlas || Context.raw.mergedObjectIsAtlas) {
 				var visibles = isAtlas ? Project.getAtlasObjects(Context.raw.layer.getObjectMask()) : null;
-				MeshUtil.mergeMesh(visibles);
+				UtilMesh.mergeMesh(visibles);
 			}
 			Context.selectPaintObject(Context.mainObject());
 			Context.raw.paintObject.skip_context = "paint";
 			Context.raw.mergedObject.visible = true;
 		}
-		UVUtil.dilatemapCached = false;
+		UtilUV.dilatemapCached = false;
 	}
 
-	public static function newLayer(clear = true, position = -1): LayerSlot {
+	public static function newLayer(clear = true, position = -1): SlotLayer {
 		if (Project.layers.length > maxLayers) return null;
-		var l = new LayerSlot();
+		var l = new SlotLayer();
 		l.objectMask = Context.raw.layerFilter;
 		if (position == -1) {
 			if (Context.raw.layer.isMask()) Context.setLayer(Context.raw.layer.parent);
@@ -2053,9 +2043,9 @@ class Base {
 		return l;
 	}
 
-	public static function newMask(clear = true, parent: LayerSlot, position = -1): LayerSlot {
+	public static function newMask(clear = true, parent: SlotLayer, position = -1): SlotLayer {
 		if (Project.layers.length > maxLayers) return null;
-		var l = new LayerSlot("", SlotMask, parent);
+		var l = new SlotLayer("", SlotMask, parent);
 		if (position == -1) position = Project.layers.indexOf(parent);
 		Project.layers.insert(position, l);
 		Context.setLayer(l);
@@ -2064,9 +2054,9 @@ class Base {
 		return l;
 	}
 
-	public static function newGroup(): LayerSlot {
+	public static function newGroup(): SlotLayer {
 		if (Project.layers.length > maxLayers) return null;
-		var l = new LayerSlot("", SlotGroup);
+		var l = new SlotLayer("", SlotGroup);
 		Project.layers.push(l);
 		Context.setLayer(l);
 		return l;
@@ -2113,7 +2103,7 @@ class Base {
 			Base.resizeLayers();
 			var _layer = Context.raw.layer;
 			var _material = Context.raw.material;
-			for (l in arm.Project.layers) {
+			for (l in Project.layers) {
 				if (l.fill_layer != null) {
 					Context.raw.layer = l;
 					Context.raw.material = l.fill_layer;
@@ -2124,28 +2114,28 @@ class Base {
 			Context.raw.material = _material;
 			MakeMaterial.parsePaintMaterial();
 		});
-		UVUtil.uvmap = null;
-		UVUtil.uvmapCached = false;
-		UVUtil.trianglemap = null;
-		UVUtil.trianglemapCached = false;
-		UVUtil.dilatemapCached = false;
+		UtilUV.uvmap = null;
+		UtilUV.uvmapCached = false;
+		UtilUV.trianglemap = null;
+		UtilUV.trianglemapCached = false;
+		UtilUV.dilatemapCached = false;
 		#if (krom_direct3d12 || krom_vulkan || krom_metal)
-		arm.render.RenderPathRaytrace.ready = false;
+		RenderPathRaytrace.ready = false;
 		#end
 	}
 	#end
 
 	#if is_lab
 	public static function flatten(heightToNormal = false): Dynamic {
-		var texpaint = arm.logic.BrushOutputNode.inst.texpaint;
-		var texpaint_nor = arm.logic.BrushOutputNode.inst.texpaint_nor;
-		var texpaint_pack = arm.logic.BrushOutputNode.inst.texpaint_pack;
+		var texpaint = arm.nodes.BrushOutputNode.inst.texpaint;
+		var texpaint_nor = arm.nodes.BrushOutputNode.inst.texpaint_nor;
+		var texpaint_pack = arm.nodes.BrushOutputNode.inst.texpaint_pack;
 
 		var nodes = UINodes.inst.getNodes();
 		var canvas = UINodes.inst.getCanvas(true);
 		if (nodes.nodesSelectedId.length > 0) {
 			var node = nodes.getNode(canvas.nodes, nodes.nodesSelectedId[0]);
-			var brushNode = arm.logic.LogicParser.getLogicNode(node);
+			var brushNode = ParserLogic.getLogicNode(node);
 			if (brushNode != null && brushNode.getCachedImage() != null) {
 				texpaint = brushNode.getCachedImage();
 				texpaint_nor = RenderPath.active.renderTargets.get("texpaint_nor_empty").image;
@@ -2157,31 +2147,31 @@ class Base {
 	}
 
 	public static function onLayersResized() {
-		arm.logic.BrushOutputNode.inst.texpaint.unload();
-		arm.logic.BrushOutputNode.inst.texpaint = RenderPath.active.renderTargets.get("texpaint").image = Image.createRenderTarget(Config.getTextureResX(), Config.getTextureResY());
-		arm.logic.BrushOutputNode.inst.texpaint_nor.unload();
-		arm.logic.BrushOutputNode.inst.texpaint_nor = RenderPath.active.renderTargets.get("texpaint_nor").image = Image.createRenderTarget(Config.getTextureResX(), Config.getTextureResY());
-		arm.logic.BrushOutputNode.inst.texpaint_pack.unload();
-		arm.logic.BrushOutputNode.inst.texpaint_pack = RenderPath.active.renderTargets.get("texpaint_pack").image = Image.createRenderTarget(Config.getTextureResX(), Config.getTextureResY());
+		arm.nodes.BrushOutputNode.inst.texpaint.unload();
+		arm.nodes.BrushOutputNode.inst.texpaint = RenderPath.active.renderTargets.get("texpaint").image = Image.createRenderTarget(Config.getTextureResX(), Config.getTextureResY());
+		arm.nodes.BrushOutputNode.inst.texpaint_nor.unload();
+		arm.nodes.BrushOutputNode.inst.texpaint_nor = RenderPath.active.renderTargets.get("texpaint_nor").image = Image.createRenderTarget(Config.getTextureResX(), Config.getTextureResY());
+		arm.nodes.BrushOutputNode.inst.texpaint_pack.unload();
+		arm.nodes.BrushOutputNode.inst.texpaint_pack = RenderPath.active.renderTargets.get("texpaint_pack").image = Image.createRenderTarget(Config.getTextureResX(), Config.getTextureResY());
 
-		if (arm.logic.InpaintNode.image != null) {
-			arm.logic.InpaintNode.image.unload();
-			arm.logic.InpaintNode.image = null;
-			arm.logic.InpaintNode.mask.unload();
-			arm.logic.InpaintNode.mask = null;
-			arm.logic.InpaintNode.init();
+		if (arm.nodes.InpaintNode.image != null) {
+			arm.nodes.InpaintNode.image.unload();
+			arm.nodes.InpaintNode.image = null;
+			arm.nodes.InpaintNode.mask.unload();
+			arm.nodes.InpaintNode.mask = null;
+			arm.nodes.InpaintNode.init();
 		}
 
-		if (arm.logic.PhotoToPBRNode.images != null) {
-			for (image in arm.logic.PhotoToPBRNode.images) image.unload();
-			arm.logic.PhotoToPBRNode.images = null;
-			arm.logic.PhotoToPBRNode.init();
+		if (arm.nodes.PhotoToPBRNode.images != null) {
+			for (image in arm.nodes.PhotoToPBRNode.images) image.unload();
+			arm.nodes.PhotoToPBRNode.images = null;
+			arm.nodes.PhotoToPBRNode.init();
 		}
 
-		if (arm.logic.TilingNode.image != null) {
-			arm.logic.TilingNode.image.unload();
-			arm.logic.TilingNode.image = null;
-			arm.logic.TilingNode.init();
+		if (arm.nodes.TilingNode.image != null) {
+			arm.nodes.TilingNode.image.unload();
+			arm.nodes.TilingNode.image = null;
+			arm.nodes.TilingNode.init();
 		}
 
 		RenderPath.active.renderTargets.get("texpaint_blend0").image.unload();
@@ -2201,7 +2191,7 @@ class Base {
 		});
 
 		#if (krom_direct3d12 || krom_vulkan || krom_metal)
-		arm.render.RenderPathRaytrace.ready = false;
+		RenderPathRaytrace.ready = false;
 		#end
 	}
 	#end

+ 2 - 10
base/Sources/arm/ui/BoxExport.hx → base/Sources/arm/BoxExport.hx

@@ -1,19 +1,11 @@
-package arm.ui;
+package arm;
 
 import haxe.Json;
 import zui.Zui;
 import iron.App;
 import iron.System;
 import iron.Data;
-import arm.io.ExportMesh;
-import arm.sys.Path;
-#if (is_paint || is_sculpt)
-import arm.io.ExportArm;
-#end
-#if (is_paint || is_lab)
-import arm.io.ExportTexture;
-import arm.sys.File;
-#end
+import arm.ExportTexture;
 
 class BoxExport {
 

+ 3 - 12
base/Sources/arm/ui/BoxPreferences.hx → base/Sources/arm/BoxPreferences.hx

@@ -1,4 +1,4 @@
-package arm.ui;
+package arm;
 
 import haxe.Json;
 import zui.Zui;
@@ -6,15 +6,6 @@ import iron.App;
 import iron.System;
 import iron.Data;
 import iron.Scene;
-import arm.shader.MakeMaterial;
-import arm.io.ImportPlugin;
-import arm.io.ImportKeymap;
-import arm.io.ImportTheme;
-import arm.sys.Path;
-import arm.sys.File;
-#if (is_paint || is_sculpt)
-import arm.data.LayerSlot;
-#end
 
 class BoxPreferences {
 
@@ -292,7 +283,7 @@ class BoxPreferences {
 
 					#if (is_paint || is_sculpt)
 					while (History.undoLayers.length < Config.raw.undo_steps) {
-						var l = new LayerSlot("_undo" + History.undoLayers.length);
+						var l = new SlotLayer("_undo" + History.undoLayers.length);
 						History.undoLayers.push(l);
 					}
 					while (History.undoLayers.length > Config.raw.undo_steps) {
@@ -432,7 +423,7 @@ class BoxPreferences {
 				var hpathtracemode = Zui.handle("boxpreferences_40", { position: Context.raw.pathTraceMode });
 				Context.raw.pathTraceMode = ui.combo(hpathtracemode, [tr("Core"), tr("Full")], tr("Path Tracer"), true);
 				if (hpathtracemode.changed) {
-					arm.render.RenderPathRaytrace.ready = false;
+					RenderPathRaytrace.ready = false;
 				}
 
 				#end

+ 7 - 10
base/Sources/arm/ui/BoxProjects.hx → base/Sources/arm/BoxProjects.hx

@@ -1,12 +1,9 @@
-package arm.ui;
+package arm;
 
 import iron.App;
 import iron.System;
 import iron.Data;
 import zui.Zui;
-import arm.io.ImportArm;
-import arm.sys.Path;
-import arm.sys.File;
 
 class BoxProjects {
 
@@ -59,7 +56,7 @@ class BoxProjects {
 				var title = tr("untitled") + i;
 				while (j < Config.raw.recent_projects.length) {
 					var base = Config.raw.recent_projects[j];
-					base = base.substring(base.lastIndexOf(arm.sys.Path.sep) + 1, base.lastIndexOf("."));
+					base = base.substring(base.lastIndexOf(Path.sep) + 1, base.lastIndexOf("."));
 					j++;
 					if (title == base) {
 						i++;
@@ -139,16 +136,16 @@ class BoxProjects {
 							#end
 						}
 
-						var name = path.substring(path.lastIndexOf(arm.sys.Path.sep) + 1, path.lastIndexOf("."));
+						var name = path.substring(path.lastIndexOf(Path.sep) + 1, path.lastIndexOf("."));
 						if (ui.isHovered && ui.inputReleasedR) {
 							UIMenu.draw(function(ui: Zui) {
 								// if (UIMenu.menuButton(ui, tr("Duplicate"))) {}
 								if (UIMenu.menuButton(ui, tr("Delete"))) {
 									App.notifyOnInit(function() {
-										arm.sys.File.delete(path);
-										arm.sys.File.delete(iconPath);
+										File.delete(path);
+										File.delete(iconPath);
 										var dataPath = path.substr(0, path.length - 4);
-										arm.sys.File.delete(dataPath);
+										File.delete(dataPath);
 										recent_projects.splice(i, 1);
 									});
 								}
@@ -198,7 +195,7 @@ class BoxProjects {
 
 				if (file.toLowerCase().indexOf(hsearch.text.toLowerCase()) < 0) continue; // Search filter
 
-				if (ui.button(file, Left) && arm.sys.File.exists(path)) {
+				if (ui.button(file, Left) && File.exists(path)) {
 					var current = Graphics2.current;
 					if (current != null) current.end();
 

+ 0 - 1
base/Sources/arm/Camera.hx

@@ -6,7 +6,6 @@ import iron.Time;
 import iron.Vec4;
 import iron.Mat4;
 import iron.Scene;
-import arm.Viewport;
 
 class Camera {
 

+ 0 - 5
base/Sources/arm/Config.hx

@@ -4,11 +4,6 @@ import haxe.Json;
 import iron.System;
 import iron.Data;
 import zui.Zui;
-import arm.ui.UIBase;
-import arm.ui.UIHeader;
-import arm.render.RenderPathBase;
-import arm.sys.File;
-import arm.sys.Path;
 import arm.ConfigFormat;
 
 class Config {

+ 1 - 1
base/Sources/arm/ConfigFormat.hx

@@ -1,6 +1,6 @@
 package arm;
 
-@:structInit class TConfig {
+typedef TConfig = {
 	// The locale should be specified in ISO 639-1 format: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
 	// "system" is a special case that will use the system locale
 	@:optional public var locale: String;

+ 0 - 1
base/Sources/arm/Console.hx

@@ -2,7 +2,6 @@ package arm;
 
 import iron.App;
 import iron.System;
-import arm.Base;
 
 @:keep
 class Console {

+ 14 - 33
base/Sources/arm/Context.hx

@@ -7,27 +7,8 @@ import iron.Scene;
 import iron.MeshObject;
 import iron.Input;
 import iron.Data;
-import arm.render.RenderPathDeferred;
-import arm.render.RenderPathForward;
-import arm.shader.MakeMaterial;
-import arm.shader.NodeShader;
-import arm.ui.BoxPreferences;
-import arm.ui.UIHeader;
-import arm.ui.UIBase;
-import arm.ui.UINodes;
-import arm.ProjectFormat;
 import arm.ContextFormat;
-#if (is_paint || is_sculpt)
-import arm.data.MaterialSlot;
-import arm.data.LayerSlot;
-import arm.data.BrushSlot;
-import arm.data.FontSlot;
-import arm.util.UVUtil;
-import arm.util.RenderUtil;
-import arm.util.ParticleUtil;
-import arm.ui.UIToolbar;
-import arm.ui.UIView2D;
-#end
+import arm.ProjectFormat;
 
 class Context {
 
@@ -49,7 +30,7 @@ class Context {
 		setMaterial(Project.materials[i]);
 	}
 
-	public static function setMaterial(m: MaterialSlot) {
+	public static function setMaterial(m: SlotMaterial) {
 		if (Project.materials.indexOf(m) == -1) return;
 		raw.material = m;
 		MakeMaterial.parsePaintMaterial();
@@ -61,7 +42,7 @@ class Context {
 		var decal = raw.tool == ToolDecal || raw.tool == ToolText;
 		if (decal) {
 			function _next() {
-				RenderUtil.makeDecalPreview();
+				UtilRender.makeDecalPreview();
 			}
 			Base.notifyOnNextFrame(_next);
 		}
@@ -72,7 +53,7 @@ class Context {
 		setBrush(Project.brushes[i]);
 	}
 
-	public static function setBrush(b: BrushSlot) {
+	public static function setBrush(b: SlotBrush) {
 		if (Project.brushes.indexOf(b) == -1) return;
 		raw.brush = b;
 		MakeMaterial.parseBrush();
@@ -85,11 +66,11 @@ class Context {
 		setFont(Project.fonts[i]);
 	}
 
-	public static function setFont(f: FontSlot) {
+	public static function setFont(f: SlotFont) {
 		if (Project.fonts.indexOf(f) == -1) return;
 		raw.font = f;
-		RenderUtil.makeTextPreview();
-		RenderUtil.makeDecalPreview();
+		UtilRender.makeTextPreview();
+		UtilRender.makeDecalPreview();
 		UIBase.inst.hwnds[TabStatus].redraws = 2;
 		UIView2D.inst.hwnd.redraws = 2;
 	}
@@ -99,7 +80,7 @@ class Context {
 		setLayer(Project.layers[i]);
 	}
 
-	public static function setLayer(l: LayerSlot) {
+	public static function setLayer(l: SlotLayer) {
 		if (l == raw.layer) return;
 		raw.layer = l;
 		UIHeader.inst.headerHandle.redraws = 2;
@@ -139,13 +120,13 @@ class Context {
 		var decal = raw.tool == ToolDecal || raw.tool == ToolText;
 		if (decal) {
 			if (raw.tool == ToolText) {
-				RenderUtil.makeTextPreview();
+				UtilRender.makeTextPreview();
 			}
-			RenderUtil.makeDecalPreview();
+			UtilRender.makeDecalPreview();
 		}
 
 		else if (raw.tool == ToolParticle) {
-			ParticleUtil.initParticle();
+			UtilParticle.initParticle();
 			MakeMaterial.parseParticleMaterial();
 		}
 
@@ -182,9 +163,9 @@ class Context {
 		if (raw.mergedObject == null || mask > 0) {
 			raw.paintObject.skip_context = "";
 		}
-		UVUtil.uvmapCached = false;
-		UVUtil.trianglemapCached = false;
-		UVUtil.dilatemapCached = false;
+		UtilUV.uvmapCached = false;
+		UtilUV.trianglemapCached = false;
+		UtilUV.dilatemapCached = false;
 		#end
 
 		#if is_lab

+ 7 - 14
base/Sources/arm/ContextFormat.hx

@@ -5,17 +5,10 @@ import iron.System;
 import iron.Vec4;
 import iron.MeshObject;
 import iron.Tween;
-import arm.shader.NodeShader;
-import arm.ProjectFormat;
-#if (is_paint || is_sculpt)
 import iron.Mat4;
 import iron.Object;
 import iron.MaterialData;
-import arm.data.MaterialSlot;
-import arm.data.LayerSlot;
-import arm.data.BrushSlot;
-import arm.data.FontSlot;
-#end
+import arm.ProjectFormat;
 
 @:structInit class TContext {
 	@:optional public var texture: TAsset = null;
@@ -131,10 +124,10 @@ import arm.data.FontSlot;
 	@:optional public var penPaintingOnly = false; // Reject painting with finger when using pen
 
 	#if (is_paint || is_sculpt)
-	@:optional public var material: MaterialSlot;
-	@:optional public var layer: LayerSlot;
-	@:optional public var brush: BrushSlot;
-	@:optional public var font: FontSlot;
+	@:optional public var material: SlotMaterial;
+	@:optional public var layer: SlotLayer;
+	@:optional public var brush: SlotBrush;
+	@:optional public var font: SlotFont;
 	@:optional public var tool = ToolBrush;
 
 	@:optional public var layerPreviewDirty = true;
@@ -145,7 +138,7 @@ import arm.data.FontSlot;
 	@:optional public var nodePreviewsUsed: Array<String> = null;
 	@:optional public var nodePreviewName = "";
 	@:optional public var maskPreviewRgba32: Image = null;
-	@:optional public var maskPreviewLast: LayerSlot = null;
+	@:optional public var maskPreviewLast: SlotLayer = null;
 
 	@:optional public var colorIdPicked = false;
 	@:optional public var materialPreview = false; // Drawing material previews
@@ -193,7 +186,7 @@ import arm.data.FontSlot;
 	@:optional public var lastParticleHitY = 0.0;
 	@:optional public var lastParticleHitZ = 0.0;
 	@:optional public var particleTimer: TAnim = null;
-	@:optional public var paintBody: arm.plugin.PhysicsBody = null;
+	@:optional public var paintBody: PhysicsBody = null;
 	#end
 
 	@:optional public var layerFilter = 0;

+ 3 - 8
base/Sources/arm/io/ExportArm.hx → base/Sources/arm/ExportArm.hx

@@ -1,4 +1,4 @@
-package arm.io;
+package arm;
 
 import haxe.Json;
 import zui.Zui.Nodes;
@@ -13,12 +13,7 @@ import iron.RenderPath;
 import iron.Vec4;
 import iron.Lz4;
 import iron.App;
-import arm.sys.Path;
 import arm.ProjectFormat;
-#if (is_paint || is_sculpt)
-import arm.data.FontSlot;
-import arm.ui.UINodes;
-#end
 
 class ExportArm {
 
@@ -129,7 +124,7 @@ class ExportArm {
 			envmap: Project.raw.envmap != null ? (sameDrive ? Path.toRelative(Project.filepath, Project.raw.envmap) : Project.raw.envmap) : null,
 			envmap_strength: Scene.active.world.probe.raw.strength,
 			camera_world: Scene.active.camera.transform.local.toFloat32Array(),
-			camera_origin: vec3f32(arm.Camera.inst.origins[0]),
+			camera_origin: vec3f32(Camera.inst.origins[0]),
 			camera_fov: Scene.active.camera.data.raw.fov,
 
 			#if (is_paint || is_sculpt)
@@ -392,7 +387,7 @@ class ExportArm {
 		return mesh_files;
 	}
 
-	static function fontsToFiles(projectPath: String, fonts: Array<FontSlot>): Array<String> {
+	static function fontsToFiles(projectPath: String, fonts: Array<SlotFont>): Array<String> {
 		var font_files: Array<String> = [];
 		for (i in 1...fonts.length) {
 			var f = fonts[i];

+ 1 - 1
base/Sources/arm/io/ExportGpl.hx → base/Sources/arm/ExportGpl.hx

@@ -1,4 +1,4 @@
-package arm.io;
+package arm;
 
 import iron.System;
 import arm.ProjectFormat;

+ 1 - 1
base/Sources/arm/io/ExportMesh.hx → base/Sources/arm/ExportMesh.hx

@@ -1,4 +1,4 @@
-package arm.io;
+package arm;
 
 import iron.MeshObject;
 

+ 1 - 1
base/Sources/arm/io/ExportObj.hx → base/Sources/arm/ExportObj.hx

@@ -1,4 +1,4 @@
-package arm.io;
+package arm;
 
 import js.lib.Int16Array;
 import iron.MeshObject;

+ 10 - 21
base/Sources/arm/io/ExportTexture.hx → base/Sources/arm/ExportTexture.hx

@@ -1,4 +1,4 @@
-package arm.io;
+package arm;
 
 #if (is_paint || is_lab)
 
@@ -7,19 +7,8 @@ import iron.MeshObject;
 import iron.ConstData;
 import iron.RenderPath;
 import iron.Data;
-import arm.ui.UIFiles;
-import arm.ui.BoxExport;
-import arm.sys.Path;
-import arm.ProjectFormat;
-#if is_paint
 import iron.Scene;
-import arm.render.RenderPathPaint;
-import arm.shader.MakeMaterial;
-import arm.ui.UIHeader;
-#end
-#if is_paint
-import arm.data.LayerSlot;
-#end
+import arm.ProjectFormat;
 
 class ExportTexture {
 
@@ -73,7 +62,7 @@ class ExportTexture {
 			}
 			if (atlasExport) {
 				for (atlasIndex in 0...Project.atlasObjects.length) {
-					var layers: Array<LayerSlot> = [];
+					var layers: Array<SlotLayer> = [];
 					for (objectIndex in 0...Project.atlasObjects.length) {
 						if (Project.atlasObjects[objectIndex] == atlasIndex) {
 							for (l in Project.layers) {
@@ -91,7 +80,7 @@ class ExportTexture {
 		#end
 
 		#if is_lab
-		runLayers(path, [arm.logic.BrushOutputNode.inst]);
+		runLayers(path, [arm.nodes.BrushOutputNode.inst]);
 		#end
 
 		#if krom_ios
@@ -107,7 +96,7 @@ class ExportTexture {
 	#if is_paint
 	static function runBakeMaterial(path: String) {
 		if (RenderPathPaint.liveLayer == null) {
-			RenderPathPaint.liveLayer = new arm.data.LayerSlot("_live");
+			RenderPathPaint.liveLayer = new SlotLayer("_live");
 		}
 
 		var _tool = Context.raw.tool;
@@ -132,7 +121,7 @@ class ExportTexture {
 	#end
 
 	#if is_paint
-	static function runLayers(path: String, layers: Array<LayerSlot>, objectName = "", bakeMaterial = false) {
+	static function runLayers(path: String, layers: Array<SlotLayer>, objectName = "", bakeMaterial = false) {
 	#end
 
 	#if is_lab
@@ -288,9 +277,9 @@ class ExportTexture {
 		#end
 
 		#if is_lab
-		var texpaint = arm.logic.BrushOutputNode.inst.texpaint;
-		var texpaint_nor = arm.logic.BrushOutputNode.inst.texpaint_nor;
-		var texpaint_pack = arm.logic.BrushOutputNode.inst.texpaint_pack;
+		var texpaint = arm.nodes.BrushOutputNode.inst.texpaint;
+		var texpaint_nor = arm.nodes.BrushOutputNode.inst.texpaint_nor;
+		var texpaint_pack = arm.nodes.BrushOutputNode.inst.texpaint_pack;
 		#end
 
 		var pixpaint: js.lib.ArrayBuffer = null;
@@ -401,7 +390,7 @@ class ExportTexture {
 			Krom.writeJpg(file, pixels, resX, resY, format, Std.int(Context.raw.formatQuality));
 		}
 		else { // Exr
-			var b = arm.format.ExrWriter.run(resX, resY, pixels, bits, type, off);
+			var b = ParserExr.run(resX, resY, pixels, bits, type, off);
 			Krom.fileSaveBytes(file, b, b.byteLength);
 		}
 	}

+ 1 - 1
base/Sources/arm/sys/File.hx → base/Sources/arm/File.hx

@@ -1,4 +1,4 @@
-package arm.sys;
+package arm;
 
 import iron.System;
 

+ 2 - 2
base/Sources/arm/geom/Plane.hx → base/Sources/arm/GeomPlane.hx

@@ -1,6 +1,6 @@
-package arm.geom;
+package arm;
 
-class Plane {
+class GeomPlane {
 
 	public var posa: js.lib.Int16Array = null;
 	public var nora: js.lib.Int16Array = null;

+ 2 - 2
base/Sources/arm/geom/UVSphere.hx → base/Sources/arm/GeomUVSphere.hx

@@ -1,8 +1,8 @@
-package arm.geom;
+package arm;
 
 import iron.Vec4;
 
-class UVSphere {
+class GeomUVSphere {
 
 	public var posa: js.lib.Int16Array = null;
 	public var nora: js.lib.Int16Array = null;

+ 4 - 4
base/Sources/arm/render/Gizmo.hx → base/Sources/arm/Gizmo.hx

@@ -1,4 +1,4 @@
-package arm.render;
+package arm;
 
 import iron.Input;
 import iron.RayCaster;
@@ -91,7 +91,7 @@ class Gizmo {
 
 				paintObject.transform.buildMatrix();
 				#if arm_physics
-				var pb = paintObject.getTrait(arm.plugin.PhysicsBody);
+				var pb = paintObject.getTrait(PhysicsBody);
 				if (pb != null) pb.syncTransform();
 				#end
 			}
@@ -255,8 +255,8 @@ class Gizmo {
 			if (Context.raw.gizmoStarted) Context.raw.gizmoDragLast = Context.raw.gizmoDrag;
 
 			#if is_forge
-			arm.util.MeshUtil.removeMergedMesh();
-			arm.render.RenderPathRaytrace.ready = false;
+			UtilMesh.removeMergedMesh();
+			RenderPathRaytrace.ready = false;
 			#end
 		}
 

+ 12 - 23
base/Sources/arm/History.hx

@@ -6,18 +6,7 @@ import zui.Zui.TNodeCanvas;
 import iron.App;
 import iron.System;
 import iron.RenderPath;
-import arm.sys.Path;
-import arm.ui.UIFiles;
-import arm.ui.UINodes;
-#if (is_paint || is_sculpt)
-import arm.ui.UIBase;
-import arm.ui.UIView2D;
-import arm.ui.UIToolbar;
-import arm.data.LayerSlot;
-import arm.data.MaterialSlot;
-import arm.shader.MakeMaterial;
 import arm.Project;
-#end
 
 class History {
 
@@ -27,7 +16,7 @@ class History {
 	public static var redos = 0; // Redos available
 	#if (is_paint || is_sculpt)
 	public static var pushUndo = false; // Store undo on next paint
-	public static var undoLayers: Array<LayerSlot> = null;
+	public static var undoLayers: Array<SlotLayer> = null;
 	#end
 	#if is_sculpt
 	public static var pushUndo2 = false;
@@ -57,7 +46,7 @@ class History {
 			}
 			else if (step.name == tr("Delete Layer")) {
 				var parent = step.layer_parent > 0 ? Project.layers[step.layer_parent - 1] : null;
-				var l = new LayerSlot("", step.layer_type, parent);
+				var l = new SlotLayer("", step.layer_type, parent);
 				Project.layers.insert(step.layer, l);
 				Context.setLayer(l);
 				undoI = undoI - 1 < 0 ? Config.raw.undo_steps - 1 : undoI - 1;
@@ -107,7 +96,7 @@ class History {
 				Context.raw.layer.delete();
 
 				var parent = step.layer_parent > 0 ? Project.layers[step.layer_parent - 2] : null;
-				var l = new LayerSlot("", step.layer_type, parent);
+				var l = new SlotLayer("", step.layer_type, parent);
 				Project.layers.insert(step.layer, l);
 				Context.setLayer(l);
 
@@ -115,7 +104,7 @@ class History {
 				var lay = undoLayers[undoI];
 				Context.raw.layer.swap(lay);
 
-				var l = new LayerSlot("", step.layer_type, parent);
+				var l = new SlotLayer("", step.layer_type, parent);
 				Project.layers.insert(step.layer + 1, l);
 				Context.setLayer(l);
 
@@ -210,7 +199,7 @@ class History {
 				Context.raw.material.delete();
 			}
 			else if (step.name == tr("Delete Material")) {
-				Context.raw.material = new MaterialSlot(Project.materials[0].data);
+				Context.raw.material = new SlotMaterial(Project.materials[0].data);
 				Project.materials.insert(step.material, Context.raw.material);
 				Context.raw.material.canvas = step.canvas;
 				UINodes.inst.canvasChanged();
@@ -245,7 +234,7 @@ class History {
 
 			if (Config.raw.touch_ui) {
 				// Refresh undo & redo buttons
-				arm.ui.UIMenubar.inst.menuHandle.redraws = 2;
+				arm.UIMenubar.inst.menuHandle.redraws = 2;
 			}
 			#end
 		}
@@ -263,7 +252,7 @@ class History {
 			#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")) {
 				var parent = step.layer_parent > 0 ? Project.layers[step.layer_parent - 1] : null;
-				var l = new LayerSlot("", step.layer_type, parent);
+				var l = new SlotLayer("", step.layer_type, parent);
 				Project.layers.insert(step.layer, l);
 				if (step.name == tr("New Black Mask")) {
 					Base.notifyOnNextFrame(function() {
@@ -396,7 +385,7 @@ class History {
 				Project.materialGroups.remove(Project.materialGroups[step.canvas_group]);
 			}
 			else if (step.name == tr("New Material")) {
-				Context.raw.material = new MaterialSlot(Project.materials[0].data);
+				Context.raw.material = new SlotMaterial(Project.materials[0].data);
 				Project.materials.insert(step.material, Context.raw.material);
 				Context.raw.material.canvas = step.canvas;
 				UINodes.inst.canvasChanged();
@@ -409,7 +398,7 @@ class History {
 				Context.raw.material.delete();
 			}
 			else if (step.name == tr("Duplicate Material")) {
-				Context.raw.material = new MaterialSlot(Project.materials[0].data);
+				Context.raw.material = new SlotMaterial(Project.materials[0].data);
 				Project.materials.insert(step.material, Context.raw.material);
 				Context.raw.material.canvas = step.canvas;
 				UINodes.inst.canvasChanged();
@@ -437,7 +426,7 @@ class History {
 
 			if (Config.raw.touch_ui) {
 				// Refresh undo & redo buttons
-				arm.ui.UIMenubar.inst.menuHandle.redraws = 2;
+				arm.UIMenubar.inst.menuHandle.redraws = 2;
 			}
 			#end
 		}
@@ -619,7 +608,7 @@ class History {
 
 		if (Config.raw.touch_ui) {
 			// Refresh undo & redo buttons
-			arm.ui.UIMenubar.inst.menuHandle.redraws = 2;
+			arm.UIMenubar.inst.menuHandle.redraws = 2;
 		}
 
 		if (undos < Config.raw.undo_steps) undos++;
@@ -672,7 +661,7 @@ class History {
 		copyToUndo(lay.id, undoI, Context.raw.layer.isMask());
 	}
 
-	static function copyMergingLayers2(layers: Array<LayerSlot>) {
+	static function copyMergingLayers2(layers: Array<SlotLayer>) {
 		for (layer in layers)
 			copyToUndo(layer.id, undoI, layer.isMask());
 	}

+ 22 - 36
base/Sources/arm/io/ImportArm.hx → base/Sources/arm/ImportArm.hx

@@ -1,4 +1,4 @@
-package arm.io;
+package arm;
 
 import zui.Zui.Nodes;
 import zui.Zui.TNodeCanvas;
@@ -11,25 +11,11 @@ import iron.SceneFormat;
 import iron.Mat4;
 import iron.ArmPack;
 import iron.Scene;
-import arm.ProjectFormat;
-import arm.ui.UIFiles;
-import arm.ui.UIBase;
-import arm.sys.Path;
-import arm.sys.File;
-import arm.Viewport;
-#if (is_paint || is_sculpt)
 import iron.MaterialData;
 import iron.Lz4;
 import iron.MeshObject;
 import iron.RenderPath;
-import arm.util.RenderUtil;
-import arm.ui.UIStatus;
-import arm.util.MeshUtil;
-import arm.data.LayerSlot;
-import arm.data.BrushSlot;
-import arm.data.MaterialSlot;
-import arm.shader.MakeMaterial;
-#end
+import arm.ProjectFormat;
 
 class ImportArm {
 
@@ -195,7 +181,7 @@ class ImportArm {
 			#end
 
 			// No mask by default
-			if (Context.raw.mergedObject == null) MeshUtil.mergeMesh();
+			if (Context.raw.mergedObject == null) UtilMesh.mergeMesh();
 			#end
 
 			Context.selectPaintObject(Context.mainObject());
@@ -238,7 +224,7 @@ class ImportArm {
 				var isMask = false;
 				#end
 
-				var l = new LayerSlot("", isGroup ? SlotGroup : isMask ? SlotMask : SlotLayer);
+				var l = new SlotLayer("", isGroup ? SlotGroup : isMask ? SlotMask : SlotLayer);
 				if (ld.name != null) l.name = ld.name;
 				l.visible = ld.visible;
 				Project.layers.push(l);
@@ -339,13 +325,13 @@ class ImportArm {
 			Project.materials = [];
 			for (n in project.material_nodes) {
 				initNodes(n.nodes);
-				Context.raw.material = new MaterialSlot(m0, n);
+				Context.raw.material = new SlotMaterial(m0, n);
 				Project.materials.push(Context.raw.material);
 			}
 			#end
 
-			arm.ui.UINodes.inst.hwnd.redraws = 2;
-			arm.ui.UINodes.inst.groupStack = [];
+			arm.UINodes.inst.hwnd.redraws = 2;
+			arm.UINodes.inst.groupStack = [];
 			Project.materialGroups = [];
 			if (project.material_groups != null) {
 				for (g in project.material_groups) Project.materialGroups.push({ canvas: g, nodes: new Nodes() });
@@ -355,16 +341,16 @@ class ImportArm {
 			for (m in Project.materials) {
 				Context.raw.material = m;
 				MakeMaterial.parsePaintMaterial();
-				RenderUtil.makeMaterialPreview();
+				UtilRender.makeMaterialPreview();
 			}
 
 			Project.brushes = [];
 			for (n in project.brush_nodes) {
 				initNodes(n.nodes);
-				Context.raw.brush = new BrushSlot(n);
+				Context.raw.brush = new SlotBrush(n);
 				Project.brushes.push(Context.raw.brush);
 				MakeMaterial.parseBrush();
-				RenderUtil.makeBrushPreview();
+				UtilRender.makeBrushPreview();
 			}
 
 			// Fill layers
@@ -384,7 +370,7 @@ class ImportArm {
 			#if is_lab
 			initNodes(project.material.nodes);
 			Project.canvas = project.material;
-			arm.logic.LogicParser.parse(Project.canvas);
+			ParserLogic.parse(Project.canvas);
 			#end
 
 			Context.raw.ddirty = 4;
@@ -413,7 +399,7 @@ class ImportArm {
 				object.transform.buildMatrix();
 				object.name = md.name;
 				Project.paintObjects.push(object);
-				MeshUtil.mergeMesh();
+				UtilMesh.mergeMesh();
 				Viewport.scaleToBounds();
 			});
 		}
@@ -446,7 +432,7 @@ class ImportArm {
 			if (Data.cachedImages.get(abs) == null && !File.exists(abs)) {
 				makePink(abs);
 			}
-			arm.io.ImportTexture.run(abs);
+			arm.ImportTexture.run(abs);
 		}
 
 		var m0: MaterialData = null;
@@ -454,11 +440,11 @@ class ImportArm {
 			m0 = m;
 		});
 
-		var imported: Array<MaterialSlot> = [];
+		var imported: Array<SlotMaterial> = [];
 
 		for (c in project.material_nodes) {
 			initNodes(c.nodes);
-			Context.raw.material = new MaterialSlot(m0, c);
+			Context.raw.material = new SlotMaterial(m0, c);
 			Project.materials.push(Context.raw.material);
 			imported.push(Context.raw.material);
 			History.newMaterial();
@@ -476,12 +462,12 @@ class ImportArm {
 			for (m in imported) {
 				Context.setMaterial(m);
 				MakeMaterial.parsePaintMaterial();
-				RenderUtil.makeMaterialPreview();
+				UtilRender.makeMaterialPreview();
 			}
 		}
 		App.notifyOnInit(_init);
 
-		arm.ui.UINodes.inst.groupStack = [];
+		UINodes.inst.groupStack = [];
 		UIBase.inst.hwnds[TabSidebar1].redraws = 2;
 		Data.deleteBlob(path);
 	}
@@ -493,7 +479,7 @@ class ImportArm {
 		return false;
 	}
 
-	static function renameGroup(name: String, materials: Array<MaterialSlot>, groups: Array<TNodeCanvas>) {
+	static function renameGroup(name: String, materials: Array<SlotMaterial>, groups: Array<TNodeCanvas>) {
 		for (m in materials) {
 			for (n in m.canvas.nodes) {
 				if (n.type == "GROUP" && n.name == name) n.name += ".1";
@@ -532,14 +518,14 @@ class ImportArm {
 			if (Data.cachedImages.get(abs) == null && !File.exists(abs)) {
 				makePink(abs);
 			}
-			arm.io.ImportTexture.run(abs);
+			arm.ImportTexture.run(abs);
 		}
 
-		var imported: Array<BrushSlot> = [];
+		var imported: Array<SlotBrush> = [];
 
 		for (n in project.brush_nodes) {
 			initNodes(n.nodes);
-			Context.raw.brush = new BrushSlot(n);
+			Context.raw.brush = new SlotBrush(n);
 			Project.brushes.push(Context.raw.brush);
 			imported.push(Context.raw.brush);
 		}
@@ -547,7 +533,7 @@ class ImportArm {
 		function _init() {
 			for (b in imported) {
 				Context.setBrush(b);
-				RenderUtil.makeBrushPreview();
+				UtilRender.makeBrushPreview();
 			}
 		}
 		App.notifyOnInit(_init);

+ 1 - 10
base/Sources/arm/io/ImportAsset.hx → base/Sources/arm/ImportAsset.hx

@@ -1,13 +1,4 @@
-package arm.io;
-
-import arm.sys.Path;
-import arm.sys.File;
-import arm.ui.UINodes;
-import arm.ui.UIBox;
-import arm.Project;
-#if is_paint
-import arm.ui.UIHeader;
-#end
+package arm;
 
 class ImportAsset {
 

+ 5 - 13
base/Sources/arm/io/ImportBlendMaterial.hx → base/Sources/arm/ImportBlendMaterial.hx

@@ -1,24 +1,16 @@
-package arm.io;
+package arm;
 
 import iron.App;
 import iron.Data;
 import zui.Zui.Nodes;
 import zui.Zui.TNode;
 import zui.Zui.TNodeLink;
-import arm.format.BlendParser;
-import arm.ui.UIBase;
-import arm.ui.UINodes;
-import arm.shader.NodesMaterial;
-import arm.shader.MakeMaterial;
-import arm.sys.Path;
-import arm.util.RenderUtil;
-import arm.data.MaterialSlot;
 
 class ImportBlendMaterial {
 
 	public static function run(path: String) {
 		Data.getBlob(path, function(b: js.lib.ArrayBuffer) {
-			var bl = new BlendParser(b);
+			var bl = new ParserBlend(b);
 			if (bl.dna == null) {
 				Console.error(Strings.error3());
 				return;
@@ -30,11 +22,11 @@ class ImportBlendMaterial {
 				return;
 			}
 
-			var imported: Array<MaterialSlot> = [];
+			var imported: Array<SlotMaterial> = [];
 
 			for (mat in mats) {
 				// Material slot
-				Context.raw.material = new MaterialSlot(Project.materials[0].data);
+				Context.raw.material = new SlotMaterial(Project.materials[0].data);
 				Project.materials.push(Context.raw.material);
 				imported.push(Context.raw.material);
 				var nodes = Context.raw.material.nodes;
@@ -260,7 +252,7 @@ class ImportBlendMaterial {
 				for (m in imported) {
 					Context.setMaterial(m);
 					MakeMaterial.parsePaintMaterial();
-					RenderUtil.makeMaterialPreview();
+					UtilRender.makeMaterialPreview();
 				}
 			}
 			App.notifyOnInit(_init);

+ 3 - 4
base/Sources/arm/io/ImportBlendMesh.hx → base/Sources/arm/ImportBlendMesh.hx

@@ -1,4 +1,4 @@
-package arm.io;
+package arm;
 
 import js.lib.Uint32Array;
 import js.lib.Float32Array;
@@ -7,7 +7,6 @@ import iron.Data;
 import iron.Mat4;
 import iron.Vec4;
 import zui.Zui.Nodes;
-import arm.format.BlendParser;
 
 class ImportBlendMesh {
 
@@ -15,7 +14,7 @@ class ImportBlendMesh {
 
 	public static function run(path: String, replaceExisting = true) {
 		Data.getBlob(path, function(b: js.lib.ArrayBuffer) {
-			var bl = new BlendParser(b);
+			var bl = new ParserBlend(b);
 			if (bl.dna == null) {
 				Console.error(Strings.error3());
 				return;
@@ -282,7 +281,7 @@ class ImportBlendMesh {
 								var px = co[axis0];
 								var py = co[axis1];
 
-								if (arm.util.MeshUtil.pnpoly(v0x, v0y, v1x, v1y, v2x, v2y, px, py)) {
+								if (UtilMesh.pnpoly(v0x, v0y, v1x, v1y, v2x, v2y, px, py)) {
 									overlap = true;
 									break;
 								}

+ 1 - 1
base/Sources/arm/io/ImportEnvmap.hx → base/Sources/arm/ImportEnvmap.hx

@@ -1,4 +1,4 @@
-package arm.io;
+package arm;
 
 import js.lib.Float32Array;
 import iron.System;

+ 4 - 5
base/Sources/arm/io/ImportFbx.hx → base/Sources/arm/ImportFbx.hx

@@ -1,15 +1,14 @@
-package arm.io;
+package arm;
 
 import iron.Data;
-import arm.format.FbxParser;
 
 class ImportFbx {
 
 	public static function run(path: String, replaceExisting = true) {
 		Data.getBlob(path, function(b: js.lib.ArrayBuffer) {
-			FbxParser.parseTransform = Context.raw.parseTransform;
-			FbxParser.parseVCols = Context.raw.parseVCols;
-			var obj = new FbxParser(b);
+			ParserFbx.parseTransform = Context.raw.parseTransform;
+			ParserFbx.parseVCols = Context.raw.parseVCols;
+			var obj = new ParserFbx(b);
 			replaceExisting ? ImportMesh.makeMesh(obj, path) : ImportMesh.addMesh(obj);
 			while (obj.next()) {
 				ImportMesh.addMesh(obj);

+ 4 - 8
base/Sources/arm/io/ImportFont.hx → base/Sources/arm/ImportFont.hx

@@ -1,12 +1,8 @@
-package arm.io;
+package arm;
 
 import iron.App;
 import iron.System;
 import iron.Data;
-import arm.sys.Path;
-import arm.ui.UIBase;
-import arm.data.FontSlot;
-import arm.util.RenderUtil;
 
 class ImportFont {
 
@@ -20,13 +16,13 @@ class ImportFont {
 		Data.getFont(path, function(font: Font) {
 			font.init(); // Make sure font_ is ready
 			var count = Krom.g2_font_count(font.font_);
-			var fontSlots = new Array<FontSlot>();
+			var fontSlots = new Array<SlotFont>();
 			for (i in 0...count) {
 				var ar = path.split(Path.sep);
 				var name = ar[ar.length - 1];
 				var f = font.clone();
 				f.setFontIndex(i);
-				var fontSlot = new FontSlot(name, f, path);
+				var fontSlot = new SlotFont(name, f, path);
 				fontSlots.push(fontSlot);
 			}
 
@@ -34,7 +30,7 @@ class ImportFont {
 				for (f in fontSlots) {
 					Context.raw.font = f;
 					Project.fonts.push(f);
-					RenderUtil.makeFontPreview();
+					UtilRender.makeFontPreview();
 				}
 			}
 			App.notifyOnInit(_init);

+ 1 - 1
base/Sources/arm/io/ImportGpl.hx → base/Sources/arm/ImportGpl.hx

@@ -1,4 +1,4 @@
-package arm.io;
+package arm;
 
 import js.lib.ArrayBuffer;
 import js.lib.DataView;

+ 3 - 6
base/Sources/arm/io/ImportKeymap.hx → base/Sources/arm/ImportKeymap.hx

@@ -1,7 +1,4 @@
-package arm.io;
-
-import arm.sys.Path;
-import arm.sys.File;
+package arm;
 
 class ImportKeymap {
 
@@ -14,8 +11,8 @@ class ImportKeymap {
 		var filename = path.substr(path.lastIndexOf(Path.sep) + 1);
 		var dstPath = Path.data() + Path.sep + "keymap_presets" + Path.sep + filename;
 		File.copy(path, dstPath); // Copy to preset folder
-		arm.ui.BoxPreferences.fetchKeymaps(); // Refresh file list
-		arm.ui.BoxPreferences.presetHandle.position = arm.ui.BoxPreferences.getPresetIndex();
+		BoxPreferences.fetchKeymaps(); // Refresh file list
+		BoxPreferences.presetHandle.position = BoxPreferences.getPresetIndex();
 		Console.info(tr("Keymap imported:") + " " + filename);
 	}
 }

+ 11 - 20
base/Sources/arm/io/ImportMesh.hx → base/Sources/arm/ImportMesh.hx

@@ -1,4 +1,4 @@
-package arm.io;
+package arm;
 
 import iron.App;
 import iron.SceneFormat;
@@ -6,15 +6,6 @@ import iron.MeshData;
 import iron.Data;
 import iron.Scene;
 import iron.System;
-import arm.util.MeshUtil;
-import arm.sys.Path;
-import arm.Viewport;
-import arm.Project;
-#if (is_paint || is_sculpt)
-import arm.ui.UIBase;
-import arm.ui.UIView2D;
-import arm.util.UVUtil;
-#end
 
 class ImportMesh {
 
@@ -84,7 +75,7 @@ class ImportMesh {
 
 			// No mask by default
 			for (p in Project.paintObjects) p.visible = true;
-			if (Context.raw.mergedObject == null) MeshUtil.mergeMesh();
+			if (Context.raw.mergedObject == null) UtilMesh.mergeMesh();
 			Context.raw.paintObject.skip_context = "paint";
 			Context.raw.mergedObject.visible = true;
 		}
@@ -92,15 +83,15 @@ class ImportMesh {
 		Viewport.scaleToBounds();
 
 		if (Context.raw.paintObject.name == "") Context.raw.paintObject.name = "Object";
-		arm.shader.MakeMaterial.parsePaintMaterial();
-		arm.shader.MakeMaterial.parseMeshMaterial();
+		MakeMaterial.parsePaintMaterial();
+		MakeMaterial.parseMeshMaterial();
 
 		#if (is_paint || is_sculpt)
 		UIView2D.inst.hwnd.redraws = 2;
 		#end
 
 		#if (krom_direct3d12 || krom_vulkan || krom_metal)
-		arm.render.RenderPathRaytrace.ready = false;
+		RenderPathRaytrace.ready = false;
 		#end
 
 		#if arm_physics
@@ -151,9 +142,9 @@ class ImportMesh {
 			#if (is_paint || is_sculpt)
 			UIBase.inst.hwnds[TabSidebar0].redraws = 2;
 			UIBase.inst.hwnds[TabSidebar1].redraws = 2;
-			UVUtil.uvmapCached = false;
-			UVUtil.trianglemapCached = false;
-			UVUtil.dilatemapCached = false;
+			UtilUV.uvmapCached = false;
+			UtilUV.trianglemapCached = false;
+			UtilUV.dilatemapCached = false;
 			#end
 
 			// Wait for addMesh calls to finish
@@ -215,9 +206,9 @@ class ImportMesh {
 
 			#if (is_paint || is_sculpt)
 			UIBase.inst.hwnds[TabSidebar0].redraws = 2;
-			UVUtil.uvmapCached = false;
-			UVUtil.trianglemapCached = false;
-			UVUtil.dilatemapCached = false;
+			UtilUV.uvmapCached = false;
+			UtilUV.trianglemapCached = false;
+			UtilUV.dilatemapCached = false;
 			#end
 		});
 	}

+ 1 - 1
base/Sources/arm/io/ImportObj.hx → base/Sources/arm/ImportObj.hx

@@ -1,4 +1,4 @@
-package arm.io;
+package arm;
 
 import iron.Data;
 

+ 2 - 5
base/Sources/arm/io/ImportPlugin.hx → base/Sources/arm/ImportPlugin.hx

@@ -1,7 +1,4 @@
-package arm.io;
-
-import arm.sys.Path;
-import arm.sys.File;
+package arm;
 
 class ImportPlugin {
 
@@ -14,7 +11,7 @@ class ImportPlugin {
 		var filename = path.substr(path.lastIndexOf(Path.sep) + 1);
 		var dstPath = Path.data() + Path.sep + "plugins" + Path.sep + filename;
 		File.copy(path, dstPath); // Copy to plugin folder
-		arm.ui.BoxPreferences.filesPlugin = null; // Refresh file list
+		BoxPreferences.filesPlugin = null; // Refresh file list
 		Console.info(tr("Plugin imported:") + " " + filename);
 	}
 }

+ 1 - 3
base/Sources/arm/io/ImportTexture.hx → base/Sources/arm/ImportTexture.hx

@@ -1,9 +1,7 @@
-package arm.io;
+package arm;
 
 import iron.System;
 import iron.Data;
-import arm.ui.UIBase;
-import arm.sys.Path;
 import arm.ProjectFormat;
 
 class ImportTexture {

+ 3 - 6
base/Sources/arm/io/ImportTheme.hx → base/Sources/arm/ImportTheme.hx

@@ -1,7 +1,4 @@
-package arm.io;
-
-import arm.sys.Path;
-import arm.sys.File;
+package arm;
 
 class ImportTheme {
 
@@ -14,9 +11,9 @@ class ImportTheme {
 		var filename = path.substr(path.lastIndexOf(Path.sep) + 1);
 		var dstPath = Path.data() + Path.sep + "themes" + Path.sep + filename;
 		File.copy(path, dstPath); // Copy to preset folder
-		arm.ui.BoxPreferences.fetchThemes(); // Refresh file list
+		BoxPreferences.fetchThemes(); // Refresh file list
 		Config.raw.theme = filename;
-		arm.ui.BoxPreferences.themeHandle.position = arm.ui.BoxPreferences.getThemeIndex();
+		BoxPreferences.themeHandle.position = BoxPreferences.getThemeIndex();
 		Config.loadTheme(Config.raw.theme);
 		Console.info(tr("Theme imported:") + " " + filename);
 	}

+ 1 - 1
base/Sources/arm/render/LineDraw.hx → base/Sources/arm/LineDraw.hx

@@ -1,4 +1,4 @@
-package arm.render;
+package arm;
 
 import iron.System;
 import iron.Scene;

+ 1 - 1
base/Sources/arm/logic/LogicNode.hx → base/Sources/arm/LogicNode.hx

@@ -1,4 +1,4 @@
-package arm.logic;
+package arm;
 
 import iron.System;
 

+ 1 - 1
base/Sources/arm/shader/MakeVoxel.hx → base/Sources/arm/MakeVoxel.hx

@@ -1,4 +1,4 @@
-package arm.shader;
+package arm;
 
 import iron.System;
 import iron.ShaderData;

+ 1 - 1
base/Sources/arm/shader/NodeShader.hx → base/Sources/arm/NodeShader.hx

@@ -1,4 +1,4 @@
-package arm.shader;
+package arm;
 
 import zui.Zui.Nodes;
 import iron.SceneFormat;

+ 2 - 2
base/Sources/arm/shader/NodeShaderContext.hx → base/Sources/arm/NodeShaderContext.hx

@@ -1,8 +1,8 @@
-package arm.shader;
+package arm;
 
 import zui.Zui.Nodes;
 import iron.SceneFormat;
-import arm.shader.NodeShaderData;
+import arm.NodeShaderData;
 
 class NodeShaderContext {
 	public var vert: NodeShader;

+ 1 - 1
base/Sources/arm/shader/NodeShaderData.hx → base/Sources/arm/NodeShaderData.hx

@@ -1,4 +1,4 @@
-package arm.shader;
+package arm;
 
 import zui.Zui.Nodes;
 import zui.Zui.TNodeCanvas;

+ 14 - 14
base/Sources/arm/shader/NodesMaterial.hx → base/Sources/arm/NodesMaterial.hx

@@ -1,4 +1,4 @@
-package arm.shader;
+package arm;
 
 import haxe.Json;
 import iron.System;
@@ -2129,7 +2129,7 @@ class NodesMaterial {
 				],
 				buttons: [
 					{
-						name: "arm.shader.NodesMaterial.vectorCurvesButton",
+						name: "arm.NodesMaterial.vectorCurvesButton",
 						type: "CUSTOM",
 						default_value: [[f32([0.0, 0.0]), f32([0.0, 0.0])], [f32([0.0, 0.0]), f32([0.0, 0.0])], [f32([0.0, 0.0]), f32([0.0, 0.0])]],
 						output: 0,
@@ -2229,7 +2229,7 @@ class NodesMaterial {
 				],
 				buttons: [
 					{
-						name: "arm.shader.NodesMaterial.colorRampButton",
+						name: "arm.NodesMaterial.colorRampButton",
 						type: "CUSTOM",
 						default_value: [f32([1.0, 1.0, 1.0, 1.0, 0.0])],
 						data: 0,
@@ -2777,7 +2777,7 @@ class NodesMaterial {
 				outputs: [],
 				buttons: [
 					{
-						name: "arm.shader.NodesMaterial.newGroupButton",
+						name: "arm.NodesMaterial.newGroupButton",
 						type: "CUSTOM",
 						height: 1
 					}
@@ -2911,7 +2911,7 @@ class NodesMaterial {
 						outputs: [],
 						buttons: [
 							{
-								name: "arm.shader.NodesMaterial.groupInputButton",
+								name: "arm.NodesMaterial.groupInputButton",
 								type: "CUSTOM",
 								height: 1
 							}
@@ -2928,7 +2928,7 @@ class NodesMaterial {
 						outputs: [],
 						buttons: [
 							{
-								name: "arm.shader.NodesMaterial.groupOutputButton",
+								name: "arm.NodesMaterial.groupOutputButton",
 								type: "CUSTOM",
 								height: 1
 							}
@@ -2949,7 +2949,7 @@ class NodesMaterial {
 		}
 
 		if (ui.button(tr("Nodes"))) {
-			arm.ui.UINodes.inst.groupStack.push(group);
+			UINodes.inst.groupStack.push(group);
 		}
 	}
 
@@ -2965,18 +2965,18 @@ class NodesMaterial {
 
 	static function addSocketButton(ui: Zui, nodes: Nodes, node: TNode, sockets: Array<TNodeSocket>) {
 		if (ui.button(tr("Add"))) {
-			arm.ui.UIMenu.draw(function(ui: Zui) {
-				var groupStack = arm.ui.UINodes.inst.groupStack;
+			UIMenu.draw(function(ui: Zui) {
+				var groupStack = UINodes.inst.groupStack;
 				var c = groupStack[groupStack.length - 1].canvas;
-				if (arm.ui.UIMenu.menuButton(ui, tr("RGBA"))) {
+				if (UIMenu.menuButton(ui, tr("RGBA"))) {
 					sockets.push(createSocket(nodes, node, null, "RGBA", c));
 					syncSockets(node);
 				}
-				if (arm.ui.UIMenu.menuButton(ui, tr("Vector"))) {
+				if (UIMenu.menuButton(ui, tr("Vector"))) {
 					sockets.push(createSocket(nodes, node, null, "VECTOR", c));
 					syncSockets(node);
 				}
-				if (arm.ui.UIMenu.menuButton(ui, tr("Value"))) {
+				if (UIMenu.menuButton(ui, tr("Value"))) {
 					sockets.push(createSocket(nodes, node, null, "VALUE", c));
 					syncSockets(node);
 				}
@@ -2985,7 +2985,7 @@ class NodesMaterial {
 	}
 
 	public static function syncSockets(node: TNode) {
-		var groupStack = arm.ui.UINodes.inst.groupStack;
+		var groupStack = UINodes.inst.groupStack;
 		var c = groupStack[groupStack.length - 1].canvas;
 		for (m in Project.materials) syncGroupSockets(m.canvas, c.name, node);
 		for (g in Project.materialGroups) syncGroupSockets(g.canvas, c.name, node);
@@ -3045,7 +3045,7 @@ class NodesMaterial {
 		if (n == null) return null;
 		var canvas = group != null ? group.canvas : Context.raw.material.canvas;
 		var nodes = group != null ? group.nodes : Context.raw.material.nodes;
-		var node = arm.ui.UINodes.makeNode(n, nodes, canvas);
+		var node = UINodes.makeNode(n, nodes, canvas);
 		canvas.nodes.push(node);
 		return node;
 	}

+ 5 - 5
base/Sources/arm/format/BlendParser.hx → base/Sources/arm/ParserBlend.hx

@@ -3,16 +3,16 @@
 // https://github.com/fschutt/mystery-of-the-blend-backup
 // https://web.archive.org/web/20170630054951/http://www.atmind.nl/blender/mystery_ot_blend.html
 // Usage:
-// var bl = new BlendParser(blob: DataView);
+// var bl = new ParserBlend(blob: DataView);
 // Krom.log(bl.dir("Scene"));
 // var scenes = bl.get("Scene");
 // Krom.log(scenes[0].get("id").get("name"));
-package arm.format;
+package arm;
 
 import js.lib.ArrayBuffer;
 import js.lib.DataView;
 
-class BlendParser {
+class ParserBlend {
 
 	public var pos: Int;
 	var view: DataView;
@@ -251,7 +251,7 @@ class BlendParser {
 }
 
 class Block {
-	public var blend: BlendParser;
+	public var blend: ParserBlend;
 	public var code: String;
 	public var size: Int;
 	public var sdnaIndex: Int;
@@ -348,7 +348,7 @@ class Handle {
 				}
 				// Structure
 				var h = new Handle();
-				h.ds = BlendParser.getStruct(dna, typeIndex);
+				h.ds = ParserBlend.getStruct(dna, typeIndex);
 				var isPointer = dnaName.charAt(0) == "*";
 				if (isPointer) {
 					block.blend.pos = block.pos + newOffset;

+ 2 - 2
base/Sources/arm/format/ExrWriter.hx → base/Sources/arm/ParserExr.hx

@@ -1,9 +1,9 @@
 // Based on miniexr.cpp - public domain - 2013 Aras Pranckevicius / Unity Technologies
 // https://github.com/aras-p/miniexr
 // https://www.openexr.com/documentation/openexrfilelayout.pdf
-package arm.format;
+package arm;
 
-class ExrWriter {
+class ParserExr {
 
 	static function writeString(out: Array<Int>, str: String) {
 		for (i in 0...str.length) {

+ 315 - 5
base/Sources/arm/format/FbxLibrary.hx → base/Sources/arm/ParserFbx.hx

@@ -20,12 +20,321 @@
 // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-package arm.format;
+
+package arm;
 
 import iron.Mat4;
 import iron.Vec4;
 import iron.Quat;
 
+class ParserFbx {
+
+	public var posa: js.lib.Int16Array = null;
+	public var nora: js.lib.Int16Array = null;
+	public var texa: js.lib.Int16Array = null;
+	public var cola: js.lib.Int16Array = null;
+	public var inda: js.lib.Uint32Array = null;
+	public var scalePos = 1.0;
+	public var scaleTex = 1.0;
+	public var name = "";
+
+	public static var parseTransform = false;
+	public static var parseVCols = false;
+
+	// Transform
+	public var tx = 0.0;
+	public var ty = 0.0;
+	public var tz = 0.0;
+	public var rx = 0.0;
+	public var ry = 0.0;
+	public var rz = 0.0;
+	public var sx = 1.0;
+	public var sy = 1.0;
+	public var sz = 1.0;
+
+	var geoms: Array<Geometry>;
+	var current = 0;
+	var binary = true;
+
+	public function new(buffer: js.lib.ArrayBuffer) {
+		var view = new js.lib.DataView(buffer);
+		var magic = "Kaydara FBX Binary\x20\x20\x00\x1a\x00";
+		var s = "";
+		for (i in 0...magic.length) s += String.fromCharCode(view.getUint8(i));
+		binary = s == magic;
+
+		var fbx = binary ? FbxBinaryParser.parse(view) : Parser.parse(untyped String.fromCharCode.apply(null, new js.lib.Uint8Array(buffer)));
+		var lib = new FbxLibrary();
+		try {
+			lib.load(fbx);
+		}
+		catch (e: Dynamic) {
+			Krom.log(e);
+		}
+
+		geoms = lib.getAllGeometries();
+		next();
+	}
+
+	public function next(): Bool {
+		if (current >= geoms.length) return false;
+		var geom = geoms[current];
+		var lib = geom.lib;
+
+		tx = ty = tz = 0;
+		rx = ry = rz = 0;
+		sx = sy = sz = 1;
+		if (parseTransform) {
+			var connects = lib.invConnect.get(FbxTools.getId(geom.getRoot()));
+			for (c in connects) {
+				var node = lib.ids.get(c);
+				for (p in FbxTools.getAll(node, "Properties70.P")) {
+					switch (FbxTools.toString(p.props[0])) {
+						case "Lcl Translation": {
+							tx = FbxTools.toFloat(p.props[4]);
+							ty = FbxTools.toFloat(p.props[5]);
+							tz = FbxTools.toFloat(p.props[6]);
+						}
+						case "Lcl Rotation": {
+							rx = FbxTools.toFloat(p.props[4]) * Math.PI / 180;
+							ry = FbxTools.toFloat(p.props[5]) * Math.PI / 180;
+							rz = FbxTools.toFloat(p.props[6]) * Math.PI / 180;
+						}
+						case "Lcl Scaling": {
+							sx = FbxTools.toFloat(p.props[4]);
+							sy = FbxTools.toFloat(p.props[5]);
+							sz = FbxTools.toFloat(p.props[6]);
+						}
+					}
+				}
+			}
+		}
+
+		var res = geom.getBuffers(binary, this);
+		scalePos = res.scalePos;
+		posa = res.posa;
+		nora = res.nora;
+		texa = res.texa;
+		cola = res.cola;
+		inda = res.inda;
+		name = FbxTools.getName(geom.getRoot());
+		if (name.charCodeAt(0) == 0) name = name.substring(1); // null
+		if (name.charCodeAt(0) == 1) name = name.substring(1); // start of heading
+		if (name == "Geometry") name = "Object -Geometry";
+		name = name.substring(0, name.length - 10); // -Geometry
+
+		current++;
+		return true;
+	}
+}
+
+class FbxBinaryParser {
+
+	var pos: Int;
+	var view: js.lib.DataView;
+
+	var version: Int;
+	var is64: Bool;
+	var root: FbxNode;
+
+	function new(view: js.lib.DataView) {
+		this.view = view;
+		pos = 0;
+		var magic = "Kaydara FBX Binary\x20\x20\x00\x1a\x00";
+		var valid = readChars(magic.length) == magic;
+		if (!valid) return;
+		var version = read32();
+		is64 = version >= 7500;
+		root = {
+			name: "Root",
+			props: [PInt(0), PString("Root"), PString("Root")],
+			childs: parseNodes()
+		};
+	}
+
+	public static function parse(view: js.lib.DataView): FbxNode {
+		return new FbxBinaryParser(view).root;
+	}
+
+	function parseArray(readVal: Void->Dynamic, isFloat = false): FbxProp {
+		var len = read32();
+		var encoding = read32();
+		var compressedLen = read32();
+		var endPos = pos + compressedLen;
+		var _view = view;
+		if (encoding != 0) {
+			pos += 2;
+			var input = view.buffer.slice(pos, pos + compressedLen);
+			view = new js.lib.DataView(Krom.inflate(input, true));
+			pos = 0;
+		}
+		var res = isFloat ? parseArrayf(readVal, len) : parseArrayi(readVal, len);
+		if (encoding != 0) {
+			pos = endPos;
+			view = _view;
+		}
+		return res;
+	}
+
+	function parseArrayf(readVal: Void->Dynamic, len: Int): FbxProp {
+		var res: Array<Float> = [];
+		for (i in 0...len) res.push(readVal());
+		return PFloats(res);
+	}
+
+	function parseArrayi(readVal: Void->Dynamic, len: Int): FbxProp {
+		var res: Array<Int> = [];
+		for (i in 0...len) res.push(readVal());
+		return PInts(res);
+	}
+
+	function parseProp(): FbxProp {
+		switch (readChar()) {
+			case "C":
+				return PString(readChar());
+			case "Y":
+				return PInt(read16());
+			case "I":
+				return PInt(read32());
+			case "L":
+				return PInt(read64());
+			case "F":
+				return PFloat(readf32());
+			case "D":
+				return PFloat(readf64());
+			case "f":
+				return parseArray(readf32, true);
+			case "d":
+				return parseArray(readf64, true);
+			case "l":
+				return parseArray(read64);
+			case "i":
+				return parseArray(read32);
+			case "b":
+				return parseArray(readBool);
+			case "S":
+				var len = read32();
+				return PString(readChars(len));
+			case "R":
+				var b = readBytes(read32());
+				return null;
+			default:
+				return null;
+		}
+	}
+
+	function parseNode(): FbxNode {
+		var endPos = 0;
+		var numProps = 0;
+		var propListLen = 0;
+
+		if (is64) {
+			endPos = read64();
+			numProps = read64();
+			propListLen = read64();
+		}
+		else {
+			endPos = read32();
+			numProps = read32();
+			propListLen = read32();
+		}
+
+		var nameLen = read8();
+		var name = nameLen == 0 ? "" : readChars(nameLen);
+		if (endPos == 0) return null; // Null node
+
+		var props: Array<FbxProp> = null;
+		if (numProps > 0) props = [];
+		for (i in 0...numProps) props.push(parseProp());
+
+		var childs: Array<FbxNode> = null;
+		var listLen = endPos - pos;
+		if (listLen > 0) {
+			childs = [];
+			while (true) {
+				var nested = parseNode();
+				nested == null ? break : childs.push(nested);
+			}
+		}
+		return { name: name, props: props, childs: childs };
+	}
+
+	function parseNodes(): Array<FbxNode> {
+		var nodes = [];
+		while (true) {
+			var n = parseNode();
+			n == null ? break : nodes.push(n);
+		}
+		return nodes;
+	}
+
+	function read8(): Int {
+		var i = view.getUint8(pos);
+		pos += 1;
+		return i;
+	}
+
+	function read16(): Int {
+		var i = view.getInt16(pos, true);
+		pos += 2;
+		return i;
+	}
+
+	function read32(): Int {
+		var i = view.getInt32(pos, true);
+		pos += 4;
+		return i;
+	}
+
+	function read64(): Int {
+		var i = untyped view.getBigInt64(pos, true);
+		pos += 8;
+		return i;
+	}
+
+	function readf32(): Float {
+		var f = view.getFloat32(pos, true);
+		pos += 4;
+		return f;
+	}
+
+	function readf64(): Float {
+		var f = view.getFloat64(pos, true);
+		pos += 8;
+		return f;
+	}
+
+	function readString(): String {
+		var s = "";
+		while (true) {
+			var ch = read8();
+			if (ch == 0) break;
+			s += String.fromCharCode(ch);
+		}
+		return s;
+	}
+
+	function readChars(len: Int): String {
+		var s = "";
+		for (i in 0...len) s += readChar();
+		return s;
+	}
+
+	function readChar(): String {
+		return String.fromCharCode(read8());
+	}
+
+	function readBool(): Int {
+		return read8(); // return read8() == 1;
+	}
+
+	function readBytes(len: Int): js.lib.DataView {
+		var v = new js.lib.DataView(view.buffer, pos, len);
+		pos += len;
+		return v;
+	}
+}
+
 enum FbxProp {
 	PInt(v: Int);
 	PFloat(v: Float);
@@ -677,16 +986,16 @@ class Geometry {
 		return uvs;
 	}
 
-	public function getBuffers(binary: Bool, p: FbxParser) {
+	public function getBuffers(binary: Bool, p: ParserFbx) {
 		// triangulize indexes :
 		// format is  A,B,...,-X : negative values mark the end of the polygon
 		var pbuf = getVertices();
 		var nbuf = getNormals();
 		var tbuf = getUVs()[0];
-		var cbuf = FbxParser.parseVCols ? getColors() : null;
+		var cbuf = ParserFbx.parseVCols ? getColors() : null;
 		var polys = getPolygons();
 
-		if (FbxParser.parseTransform) {
+		if (ParserFbx.parseTransform) {
 			var m = Mat4.identity();
 			var v = new Vec4(p.tx, p.ty, p.tz);
 			var q = new Quat();
@@ -826,7 +1135,7 @@ class Geometry {
 							var j0 = polys[va[(i + 3 + j) % vi]] * 3;
 							var px = pbuf[j0 + axis0];
 							var py = pbuf[j0 + axis1];
-							if (arm.util.MeshUtil.pnpoly(v0x, v0y, v1x, v1y, v2x, v2y, px, py)) {
+							if (UtilMesh.pnpoly(v0x, v0y, v1x, v1y, v2x, v2y, px, py)) {
 								overlap = true;
 								break;
 							}
@@ -857,3 +1166,4 @@ class Geometry {
 		return { posa: posa, nora: nora, texa: texa, cola: cola, inda: inda, scalePos: scalePos };
 	}
 }
+

部分文件因为文件数量过多而无法显示