2019-06-19 09:40:14 +02:00
|
|
|
package arm.io;
|
|
|
|
|
|
2019-06-20 11:23:01 +02:00
|
|
|
import haxe.Json;
|
|
|
|
|
import zui.Nodes;
|
2019-06-19 09:40:14 +02:00
|
|
|
import iron.data.SceneFormat;
|
2019-06-20 11:23:01 +02:00
|
|
|
import iron.system.ArmPack;
|
2020-03-18 20:26:28 +01:00
|
|
|
import arm.ui.UISidebar;
|
2019-11-13 15:17:10 +01:00
|
|
|
import arm.format.Lz4;
|
2019-11-13 13:51:17 +01:00
|
|
|
import arm.sys.Path;
|
2020-03-25 20:19:36 +01:00
|
|
|
import arm.ProjectFormat;
|
2020-03-18 20:26:28 +01:00
|
|
|
import arm.Enums;
|
2019-06-19 09:40:14 +02:00
|
|
|
|
|
|
|
|
class ExportArm {
|
|
|
|
|
|
2019-12-09 00:28:10 +01:00
|
|
|
public static function run(path: String) {
|
|
|
|
|
var raw: TSceneFormat = { mesh_datas: [ Context.paintObject.data.raw ] };
|
2019-06-20 11:23:01 +02:00
|
|
|
var b = ArmPack.encode(raw);
|
2019-06-20 12:30:31 +02:00
|
|
|
if (!path.endsWith(".arm")) path += ".arm";
|
2019-06-19 09:40:14 +02:00
|
|
|
Krom.fileSaveBytes(path, b.getData());
|
|
|
|
|
}
|
2019-06-19 18:45:36 +02:00
|
|
|
|
|
|
|
|
public static function runProject() {
|
2019-12-09 00:28:10 +01:00
|
|
|
var mnodes: Array<TNodeCanvas> = [];
|
|
|
|
|
var bnodes: Array<TNodeCanvas> = [];
|
2019-06-19 18:45:36 +02:00
|
|
|
|
2019-06-23 14:50:41 +02:00
|
|
|
for (m in Project.materials) {
|
2019-12-09 00:28:10 +01:00
|
|
|
var c: TNodeCanvas = Json.parse(Json.stringify(m.canvas));
|
2019-06-19 18:45:36 +02:00
|
|
|
for (n in c.nodes) {
|
2019-11-21 14:24:29 +01:00
|
|
|
if (n.type == "TEX_IMAGE") {
|
|
|
|
|
n.buttons[0].data = App.enumTexts(n.type)[n.buttons[0].default_value];
|
2019-06-19 18:45:36 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
mnodes.push(c);
|
|
|
|
|
}
|
2019-12-04 20:17:29 +01:00
|
|
|
for (b in Project.brushes) bnodes.push(b.canvas);
|
2019-06-19 18:45:36 +02:00
|
|
|
|
2019-12-09 00:28:10 +01:00
|
|
|
var md: Array<TMeshData> = [];
|
2019-06-24 22:35:17 +02:00
|
|
|
for (p in Project.paintObjects) md.push(p.data.raw);
|
2019-06-19 18:45:36 +02:00
|
|
|
|
2020-01-10 17:04:05 +01:00
|
|
|
var texture_files = assetsToFiles(Project.assets);
|
2019-12-09 00:28:10 +01:00
|
|
|
var mesh_files = meshesToFiles();
|
2019-06-19 18:45:36 +02:00
|
|
|
|
2019-12-11 21:30:29 +01:00
|
|
|
var bitsPos = App.bitsHandle.position;
|
2019-12-08 16:59:08 +01:00
|
|
|
var bpp = bitsPos == Bits8 ? 8 : bitsPos == Bits16 ? 16 : 32;
|
2019-07-10 07:59:58 +02:00
|
|
|
|
2019-12-09 00:28:10 +01:00
|
|
|
var ld: Array<TLayerData> = [];
|
2019-06-23 14:50:41 +02:00
|
|
|
for (l in Project.layers) {
|
2019-06-19 18:45:36 +02:00
|
|
|
ld.push({
|
2020-01-26 20:32:52 +01:00
|
|
|
res: l.texpaint != null ? l.texpaint.width : Project.layers[0].texpaint.width,
|
2019-07-10 07:59:58 +02:00
|
|
|
bpp: bpp,
|
2020-01-26 20:32:52 +01:00
|
|
|
texpaint: l.texpaint != null ? Lz4.encode(l.texpaint.getPixels()) : null,
|
|
|
|
|
texpaint_nor: l.texpaint_nor != null ? Lz4.encode(l.texpaint_nor.getPixels()) : null,
|
|
|
|
|
texpaint_pack: l.texpaint_pack != null ? Lz4.encode(l.texpaint_pack.getPixels()) : null,
|
2019-06-19 18:45:36 +02:00
|
|
|
texpaint_mask: l.texpaint_mask != null ? Lz4.encode(l.texpaint_mask.getPixels()) : null,
|
2020-03-16 22:07:24 +01:00
|
|
|
uv_scale: l.scale,
|
|
|
|
|
uv_rot: l.angle,
|
2019-10-15 11:49:23 +02:00
|
|
|
uv_type: l.uvType,
|
2019-06-19 18:45:36 +02:00
|
|
|
opacity_mask: l.maskOpacity,
|
2019-06-23 14:50:41 +02:00
|
|
|
material_mask: l.material_mask != null ? Project.materials.indexOf(l.material_mask) : -1,
|
2019-09-18 20:29:55 +02:00
|
|
|
object_mask: l.objectMask,
|
2020-01-26 20:32:52 +01:00
|
|
|
blending: l.blending,
|
|
|
|
|
parent: l.parent != null ? Project.layers.indexOf(l.parent) : -1
|
2019-06-19 18:45:36 +02:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-23 14:50:41 +02:00
|
|
|
Project.raw = {
|
2020-03-18 20:26:28 +01:00
|
|
|
version: Main.version,
|
2019-06-19 18:45:36 +02:00
|
|
|
material_nodes: mnodes,
|
|
|
|
|
brush_nodes: bnodes,
|
|
|
|
|
mesh_datas: md,
|
|
|
|
|
layer_datas: ld,
|
2019-09-17 22:28:15 +02:00
|
|
|
assets: texture_files,
|
|
|
|
|
mesh_assets: mesh_files
|
2019-06-19 18:45:36 +02:00
|
|
|
};
|
2019-10-06 19:03:59 +02:00
|
|
|
|
2019-06-23 14:50:41 +02:00
|
|
|
var bytes = ArmPack.encode(Project.raw);
|
|
|
|
|
Krom.fileSaveBytes(Project.filepath, bytes.getData());
|
2019-10-23 18:25:41 +02:00
|
|
|
|
2019-11-23 22:42:09 +01:00
|
|
|
Log.info("Project saved.");
|
2019-06-19 18:45:36 +02:00
|
|
|
}
|
2019-09-01 09:28:54 +02:00
|
|
|
|
2019-12-09 00:28:10 +01:00
|
|
|
public static function runMaterial(path: String) {
|
|
|
|
|
var mnodes: Array<TNodeCanvas> = [];
|
2019-09-01 09:28:54 +02:00
|
|
|
var m = Context.material;
|
2019-12-09 00:28:10 +01:00
|
|
|
var c: TNodeCanvas = Json.parse(Json.stringify(m.canvas));
|
2020-01-10 17:04:05 +01:00
|
|
|
var assets: Array<TAsset> = [];
|
2019-09-01 09:28:54 +02:00
|
|
|
for (n in c.nodes) {
|
2019-11-21 14:24:29 +01:00
|
|
|
if (n.type == "TEX_IMAGE") {
|
2020-01-10 17:04:05 +01:00
|
|
|
var index = n.buttons[0].default_value;
|
|
|
|
|
n.buttons[0].data = App.enumTexts(n.type)[index];
|
|
|
|
|
|
|
|
|
|
var asset = Project.assets[index];
|
|
|
|
|
if (assets.indexOf(asset) == -1) {
|
|
|
|
|
assets.push(asset);
|
|
|
|
|
}
|
2019-09-01 09:28:54 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
mnodes.push(c);
|
|
|
|
|
|
2020-01-10 17:04:05 +01:00
|
|
|
var texture_files = assetsToFiles(assets);
|
2019-12-09 00:28:10 +01:00
|
|
|
|
|
|
|
|
var raw = {
|
2020-03-18 20:26:28 +01:00
|
|
|
version: Main.version,
|
2019-12-09 00:28:10 +01:00
|
|
|
material_nodes: mnodes,
|
2020-01-28 00:02:07 +01:00
|
|
|
material_icons: [Lz4.encode(m.image.getPixels())],
|
2019-12-09 00:28:10 +01:00
|
|
|
assets: texture_files
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var bytes = ArmPack.encode(raw);
|
|
|
|
|
if (!path.endsWith(".arm")) path += ".arm";
|
|
|
|
|
Krom.fileSaveBytes(path, bytes.getData());
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-13 23:27:00 +01:00
|
|
|
public static function runBrush(path: String) {
|
|
|
|
|
var bnodes: Array<TNodeCanvas> = [];
|
|
|
|
|
var b = Context.brush;
|
|
|
|
|
var c: TNodeCanvas = Json.parse(Json.stringify(b.canvas));
|
|
|
|
|
var assets: Array<TAsset> = [];
|
|
|
|
|
for (n in c.nodes) {
|
|
|
|
|
if (n.type == "TEX_IMAGE") {
|
|
|
|
|
var index = n.buttons[0].default_value;
|
|
|
|
|
n.buttons[0].data = App.enumTexts(n.type)[index];
|
|
|
|
|
|
|
|
|
|
var asset = Project.assets[index];
|
|
|
|
|
if (assets.indexOf(asset) == -1) {
|
|
|
|
|
assets.push(asset);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
bnodes.push(c);
|
|
|
|
|
|
|
|
|
|
var texture_files = assetsToFiles(assets);
|
|
|
|
|
|
|
|
|
|
var raw = {
|
2020-03-18 20:26:28 +01:00
|
|
|
version: Main.version,
|
2020-03-13 23:27:00 +01:00
|
|
|
brush_nodes: bnodes,
|
|
|
|
|
brush_icons: [Lz4.encode(b.image.getPixels())],
|
|
|
|
|
assets: texture_files
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var bytes = ArmPack.encode(raw);
|
|
|
|
|
if (!path.endsWith(".arm")) path += ".arm";
|
|
|
|
|
Krom.fileSaveBytes(path, bytes.getData());
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-10 17:04:05 +01:00
|
|
|
static function assetsToFiles(assets: Array<TAsset>): Array<String> {
|
2019-12-09 00:28:10 +01:00
|
|
|
var texture_files: Array<String> = [];
|
2020-01-10 17:04:05 +01:00
|
|
|
for (a in assets) {
|
2019-09-01 09:28:54 +02:00
|
|
|
// Convert image path from absolute to relative
|
|
|
|
|
var sameDrive = Project.filepath.charAt(0) == a.file.charAt(0);
|
|
|
|
|
if (sameDrive) {
|
2019-09-17 22:28:15 +02:00
|
|
|
texture_files.push(Path.toRelative(Project.filepath, a.file));
|
2019-09-01 09:28:54 +02:00
|
|
|
}
|
|
|
|
|
else {
|
2019-09-17 22:28:15 +02:00
|
|
|
texture_files.push(a.file);
|
2019-09-01 09:28:54 +02:00
|
|
|
}
|
|
|
|
|
}
|
2019-12-09 00:28:10 +01:00
|
|
|
return texture_files;
|
|
|
|
|
}
|
2019-09-01 09:28:54 +02:00
|
|
|
|
2019-12-09 00:28:10 +01:00
|
|
|
static function meshesToFiles(): Array<String> {
|
|
|
|
|
var mesh_files: Array<String> = [];
|
|
|
|
|
for (file in Project.meshAssets) {
|
|
|
|
|
// Convert mesh path from absolute to relative
|
|
|
|
|
var sameDrive = Project.filepath.charAt(0) == file.charAt(0);
|
|
|
|
|
if (sameDrive) {
|
|
|
|
|
mesh_files.push(Path.toRelative(Project.filepath, file));
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
mesh_files.push(file);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return mesh_files;
|
2019-09-01 09:28:54 +02:00
|
|
|
}
|
2019-06-19 09:40:14 +02:00
|
|
|
}
|