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