217 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			217 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
package kha.internal;
 | 
						|
 | 
						|
import haxe.Json;
 | 
						|
import haxe.macro.Compiler;
 | 
						|
import haxe.macro.Context;
 | 
						|
import haxe.macro.Expr;
 | 
						|
#if macro
 | 
						|
import sys.io.File;
 | 
						|
#end
 | 
						|
 | 
						|
using StringTools;
 | 
						|
 | 
						|
class AssetsBuilder {
 | 
						|
	#if macro
 | 
						|
	public static var files: Array<Dynamic>;
 | 
						|
	#end
 | 
						|
 | 
						|
	public static function findResources(): String {
 | 
						|
		#if macro
 | 
						|
		var output = Compiler.getOutput();
 | 
						|
		if (output == "Nothing__" || output == "") { // For Haxe background compilation
 | 
						|
			#if kha_output
 | 
						|
			output = Compiler.getDefine("kha_output");
 | 
						|
			if (output.startsWith('"')) {
 | 
						|
				output = output.substr(1, output.length - 2);
 | 
						|
			}
 | 
						|
			#end
 | 
						|
		}
 | 
						|
		output = output.replace("\\", "/");
 | 
						|
		output = output.substring(0, output.lastIndexOf("/"));
 | 
						|
		if (output.endsWith("/Assets")) { // For Unity
 | 
						|
			output = output.substring(0, output.lastIndexOf("/"));
 | 
						|
		}
 | 
						|
		if (output.lastIndexOf("/") >= 0) {
 | 
						|
			var system = output.substring(output.lastIndexOf("/") + 1);
 | 
						|
			if (system.endsWith("-build"))
 | 
						|
				system = system.substr(0, system.length - "-build".length);
 | 
						|
			output = output.substring(0, output.lastIndexOf("/"));
 | 
						|
			return output + "/" + system + "-resources/";
 | 
						|
		}
 | 
						|
		else {
 | 
						|
			if (output.endsWith("-build"))
 | 
						|
				output = output.substr(0, output.length - "-build".length);
 | 
						|
			if (output == "")
 | 
						|
				output = "empty";
 | 
						|
			return output + "-resources/";
 | 
						|
		}
 | 
						|
		#else
 | 
						|
		return "";
 | 
						|
		#end
 | 
						|
	}
 | 
						|
 | 
						|
	macro static public function build(type: String): Array<Field> {
 | 
						|
		var fields = Context.getBuildFields();
 | 
						|
		if (files == null) {
 | 
						|
			var content = Json.parse(File.getContent(findResources() + "files.json"));
 | 
						|
			files = content.files;
 | 
						|
		}
 | 
						|
 | 
						|
		var names = new Array<Expr>();
 | 
						|
 | 
						|
		for (file in files) {
 | 
						|
			var name = file.name;
 | 
						|
			final pos = Context.currentPos();
 | 
						|
			var filesize: Int = file.file_sizes[0];
 | 
						|
 | 
						|
			if (file.type == type) {
 | 
						|
				names.push(macro $v{name});
 | 
						|
 | 
						|
				switch (type) {
 | 
						|
					case "image":
 | 
						|
						fields.push({
 | 
						|
							name: name,
 | 
						|
							meta: [{pos: pos, name: ":keep"}],
 | 
						|
							access: [APublic],
 | 
						|
							kind: FVar(macro : kha.Image, macro null),
 | 
						|
							pos: pos
 | 
						|
						});
 | 
						|
					case "sound":
 | 
						|
						fields.push({
 | 
						|
							name: name,
 | 
						|
							meta: [{pos: pos, name: ":keep"}],
 | 
						|
							access: [APublic],
 | 
						|
							kind: FVar(macro : kha.Sound, macro null),
 | 
						|
							pos: pos
 | 
						|
						});
 | 
						|
					case "blob":
 | 
						|
						fields.push({
 | 
						|
							name: name,
 | 
						|
							meta: [{pos: pos, name: ":keep"}],
 | 
						|
							access: [APublic],
 | 
						|
							kind: FVar(macro : kha.Blob, macro null),
 | 
						|
							pos: pos
 | 
						|
						});
 | 
						|
					case "font":
 | 
						|
						fields.push({
 | 
						|
							name: name,
 | 
						|
							meta: [{pos: pos, name: ":keep"}],
 | 
						|
							access: [APublic],
 | 
						|
							kind: FVar(macro : kha.Font, macro null),
 | 
						|
							pos: pos
 | 
						|
						});
 | 
						|
					case "video":
 | 
						|
						fields.push({
 | 
						|
							name: name,
 | 
						|
							meta: [{pos: pos, name: ":keep"}],
 | 
						|
							access: [APublic],
 | 
						|
							kind: FVar(macro : kha.Video, macro null),
 | 
						|
							pos: pos
 | 
						|
						});
 | 
						|
				}
 | 
						|
 | 
						|
				fields.push({
 | 
						|
					name: name + "Name",
 | 
						|
					meta: [],
 | 
						|
					access: [APublic],
 | 
						|
					kind: FVar(macro : String, macro $v{name}),
 | 
						|
					pos: pos
 | 
						|
				});
 | 
						|
 | 
						|
				fields.push({
 | 
						|
					name: name + "Description",
 | 
						|
					meta: [{pos: pos, name: ":keep"}],
 | 
						|
					access: [APublic],
 | 
						|
					kind: FVar(macro : Dynamic, macro $v{file}),
 | 
						|
					pos: pos
 | 
						|
				});
 | 
						|
 | 
						|
				fields.push({
 | 
						|
					name: name + "Size",
 | 
						|
					doc: null,
 | 
						|
					meta: [],
 | 
						|
					access: [APublic],
 | 
						|
					kind: FVar(macro : Dynamic, macro $v{filesize}),
 | 
						|
					pos: Context.currentPos()
 | 
						|
				});
 | 
						|
 | 
						|
				var loadExpressions = macro {};
 | 
						|
				switch (type) {
 | 
						|
					case "image":
 | 
						|
						loadExpressions = macro {
 | 
						|
							Assets.loadImage($v{name}, function(image: Image) done(), failure);
 | 
						|
						};
 | 
						|
					case "sound":
 | 
						|
						loadExpressions = macro {
 | 
						|
							Assets.loadSound($v{name}, function(sound: Sound) done(), failure);
 | 
						|
						};
 | 
						|
					case "blob":
 | 
						|
						loadExpressions = macro {
 | 
						|
							Assets.loadBlob($v{name}, function(blob: Blob) done(), failure);
 | 
						|
						};
 | 
						|
					case "font":
 | 
						|
						loadExpressions = macro {
 | 
						|
							Assets.loadFont($v{name}, function(font: Font) done(), failure);
 | 
						|
						};
 | 
						|
					case "video":
 | 
						|
						loadExpressions = macro {
 | 
						|
							Assets.loadVideo($v{name}, function(video: Video) done(), failure);
 | 
						|
						};
 | 
						|
				}
 | 
						|
 | 
						|
				fields.push({
 | 
						|
					name: name + "Load",
 | 
						|
					meta: [],
 | 
						|
					access: [APublic],
 | 
						|
					kind: FFun({
 | 
						|
						ret: null,
 | 
						|
						params: null,
 | 
						|
						expr: loadExpressions,
 | 
						|
						args: [
 | 
						|
							{
 | 
						|
								value: null,
 | 
						|
								type: Context.toComplexType(Context.getType("kha.internal.VoidCallback")),
 | 
						|
								opt: null,
 | 
						|
								name: "done"
 | 
						|
							},
 | 
						|
							{
 | 
						|
								value: null,
 | 
						|
								type: Context.toComplexType(Context.getType("kha.internal.AssetErrorCallback")),
 | 
						|
								opt: true,
 | 
						|
								name: "failure"
 | 
						|
							}
 | 
						|
						]
 | 
						|
					}),
 | 
						|
					pos: pos
 | 
						|
				});
 | 
						|
 | 
						|
				fields.push({
 | 
						|
					name: name + "Unload",
 | 
						|
					meta: [],
 | 
						|
					access: [APublic],
 | 
						|
					kind: FFun({
 | 
						|
						ret: null,
 | 
						|
						params: null,
 | 
						|
						expr: macro {
 | 
						|
							$i{name}.unload();
 | 
						|
							$i{name} = null;
 | 
						|
						},
 | 
						|
						args: []
 | 
						|
					}),
 | 
						|
					pos: pos
 | 
						|
				});
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		fields.push({
 | 
						|
			name: "names",
 | 
						|
			meta: [],
 | 
						|
			access: [APublic],
 | 
						|
			kind: FVar(macro : Array<String>, macro $a{names}),
 | 
						|
			pos: Context.currentPos()
 | 
						|
		});
 | 
						|
 | 
						|
		return fields;
 | 
						|
	}
 | 
						|
}
 |