Project.hx 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. package arm;
  2. import kha.Window;
  3. import zui.Nodes;
  4. import zui.Canvas;
  5. import iron.data.SceneFormat;
  6. import iron.data.MeshData;
  7. import iron.data.Data;
  8. import iron.object.MeshObject;
  9. import iron.Scene;
  10. import arm.util.MeshUtil;
  11. import arm.util.RenderUtil;
  12. import arm.util.ViewportUtil;
  13. import arm.util.Path;
  14. import arm.ui.UITrait;
  15. import arm.ui.UINodes;
  16. import arm.ui.UIFiles;
  17. import arm.data.LayerSlot;
  18. import arm.data.BrushSlot;
  19. import arm.data.MaterialSlot;
  20. import arm.nodes.MaterialParser;
  21. import arm.io.ImportArm;
  22. using StringTools;
  23. class Project {
  24. public static var raw:TProjectFormat;
  25. public static var filepath = "";
  26. public static var assets:Array<TAsset> = [];
  27. public static var assetNames:Array<String> = [];
  28. public static var assetId = 0;
  29. public static var materials:Array<MaterialSlot> = null;
  30. public static var materialsScene:Array<MaterialSlot> = null;
  31. public static var brushes:Array<BrushSlot> = null;
  32. public static var layers:Array<LayerSlot> = null;
  33. public static var paintObjects:Array<MeshObject> = null;
  34. public static function projectOpen() {
  35. UIFiles.show = true;
  36. UIFiles.isSave = false;
  37. UIFiles.filters = "arm";
  38. UIFiles.filesDone = function(path:String) {
  39. if (!path.endsWith(".arm")) {
  40. UITrait.inst.showError(Strings.error5);
  41. return;
  42. }
  43. var current = @:privateAccess kha.graphics4.Graphics2.current;
  44. if (current != null) current.end();
  45. ImportArm.runProject(path);
  46. if (current != null) current.begin(false);
  47. };
  48. }
  49. public static function projectSave() {
  50. if (filepath == "") {
  51. projectSaveAs();
  52. return;
  53. }
  54. Window.get(0).title = UIFiles.filename + " - ArmorPaint";
  55. UITrait.inst.projectExport = true;
  56. }
  57. public static function projectSaveAs() {
  58. UIFiles.show = true;
  59. UIFiles.isSave = true;
  60. UIFiles.filters = "arm";
  61. UIFiles.filesDone = function(path:String) {
  62. var f = UIFiles.filename;
  63. if (f == "") f = "untitled";
  64. filepath = path + "/" + f;
  65. if (!filepath.endsWith(".arm")) filepath += ".arm";
  66. projectSave();
  67. };
  68. }
  69. public static function projectNew(resetLayers = true) {
  70. Window.get(0).title = "ArmorPaint";
  71. filepath = "";
  72. if (Context.mergedObject != null) {
  73. Context.mergedObject.remove();
  74. Data.deleteMesh(Context.mergedObject.data.handle);
  75. Context.mergedObject = null;
  76. }
  77. ViewportUtil.resetViewport();
  78. Context.layerPreviewDirty = true;
  79. Context.paintObject = Context.mainObject();
  80. Context.selectPaintObject(Context.mainObject());
  81. for (i in 1...paintObjects.length) {
  82. var p = paintObjects[i];
  83. if (p == Context.paintObject) continue;
  84. Data.deleteMesh(p.data.handle);
  85. p.remove();
  86. }
  87. var meshes = Scene.active.meshes;
  88. var len = meshes.length;
  89. for (i in 0...len) {
  90. var m = meshes[len - i - 1];
  91. if (UITrait.inst.projectObjects.indexOf(m) == -1) {
  92. Data.deleteMesh(m.data.handle);
  93. m.remove();
  94. }
  95. }
  96. var handle = Context.paintObject.data.handle;
  97. if (handle != "SceneSphere" && handle != "ScenePlane") {
  98. Data.deleteMesh(handle);
  99. }
  100. if (UITrait.inst.projectType > 0) {
  101. var mesh:Dynamic = UITrait.inst.projectType == 1 ?
  102. // new arm.format.proc.Sphere(1, 512, 256) :
  103. new arm.format.proc.Plane(1, 1, 512, 512) :
  104. new arm.format.proc.Plane(1, 1, 512, 512);
  105. var raw = {
  106. name: "Tesselated",
  107. vertex_arrays: [
  108. { values: mesh.posa, attrib: "pos" },
  109. { values: mesh.nora, attrib: "nor" },
  110. { values: mesh.texa, attrib: "tex" }
  111. ],
  112. index_arrays: [
  113. { values: mesh.inda, material: 0 }
  114. ],
  115. scale_pos: mesh.scalePos,
  116. scale_tex: mesh.scaleTex
  117. };
  118. var md = new MeshData(raw, function(md:MeshData) {});
  119. Data.cachedMeshes.set("SceneTesselated", md);
  120. if (UITrait.inst.projectType == 1 || UITrait.inst.projectType == 2) {
  121. ViewportUtil.setView(0, 0, 1, 0, 0, 0); // Top
  122. ViewportUtil.orbit(0, Math.PI / 6); // Orbit down
  123. }
  124. }
  125. var n = UITrait.inst.projectType == 0 ? "Cube" : "Tesselated";
  126. Data.getMesh("Scene", n, function(md:MeshData) {
  127. var current = @:privateAccess kha.graphics4.Graphics2.current;
  128. if (current != null) current.end();
  129. UITrait.inst.pickerMaskHandle.position = 0;
  130. Context.paintObject.setData(md);
  131. Context.paintObject.transform.scale.set(1, 1, 1);
  132. Context.paintObject.transform.buildMatrix();
  133. Context.paintObject.name = n;
  134. paintObjects = [Context.paintObject];
  135. Data.getMaterial("Scene", "Material", function(m:iron.data.MaterialData) {
  136. materials = [new MaterialSlot(m)];
  137. });
  138. Context.material = materials[0];
  139. UINodes.inst.canvasMap = new Map();
  140. UINodes.inst.canvasBrushMap = new Map();
  141. brushes = [new BrushSlot()];
  142. Context.brush = brushes[0];
  143. History.reset();
  144. UINodes.inst.updateCanvasMap();
  145. MaterialParser.parsePaintMaterial();
  146. RenderUtil.makeMaterialPreview();
  147. for (a in assets) Data.deleteImage(a.file);
  148. assets = [];
  149. assetNames = [];
  150. assetId = 0;
  151. Context.ddirty = 4;
  152. UITrait.inst.hwnd.redraws = 2;
  153. UITrait.inst.hwnd1.redraws = 2;
  154. UITrait.inst.hwnd2.redraws = 2;
  155. if (resetLayers) {
  156. // for (l in layers) l.unload();
  157. var layer = new LayerSlot();
  158. layers = [layer];
  159. Context.setLayer(layer);
  160. if (UITrait.inst.projectType == 1) {
  161. layer.material_mask = materials[0];
  162. Layers.updateFillLayers(4);
  163. }
  164. else {
  165. iron.App.notifyOnRender(Layers.initLayers);
  166. }
  167. }
  168. if (current != null) current.begin(false);
  169. });
  170. }
  171. }
  172. typedef TProjectFormat = {
  173. public var version:String;
  174. public var brush_nodes:Array<TNodeCanvas>;
  175. public var material_nodes:Array<TNodeCanvas>;
  176. public var assets:Array<String>;
  177. public var layer_datas:Array<TLayerData>;
  178. public var mesh_datas:Array<TMeshData>;
  179. }
  180. typedef TLayerData = {
  181. public var res:Int; // Width pixels
  182. public var bpp:Int; // Bits per pixel
  183. public var texpaint:haxe.io.Bytes;
  184. public var texpaint_nor:haxe.io.Bytes;
  185. public var texpaint_pack:haxe.io.Bytes;
  186. public var texpaint_mask:haxe.io.Bytes;
  187. public var opacity_mask:Float;
  188. public var material_mask:Int;
  189. public var object_mask:Int;
  190. }