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;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |