forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			211 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| package kha.internal;
 | |
| 
 | |
| import haxe.Json;
 | |
| import haxe.macro.Context;
 | |
| import haxe.macro.Expr.Field;
 | |
| import haxe.Serializer;
 | |
| #if macro
 | |
| import sys.io.File;
 | |
| #end
 | |
| 
 | |
| using StringTools;
 | |
| 
 | |
| class ShadersBuilder {
 | |
| 	#if macro
 | |
| 	public static var files: Array<Dynamic>;
 | |
| 	#end
 | |
| 
 | |
| 	macro static public function build(): Array<Field> {
 | |
| 		var fields = Context.getBuildFields();
 | |
| 
 | |
| 		var manifestPath = AssetsBuilder.findResources() + "files.json";
 | |
| 		var content = Json.parse(File.getContent(manifestPath));
 | |
| 
 | |
| 		// rebuild Shaders module whenever manifest file is changed
 | |
| 		Context.registerModuleDependency(Context.getLocalModule(), manifestPath);
 | |
| 
 | |
| 		files = content.files;
 | |
| 
 | |
| 		var init = macro {};
 | |
| 
 | |
| 		for (file in files) {
 | |
| 			var name: String = file.name;
 | |
| 			var fixedName: String = name;
 | |
| 			var dataName = fixedName + "Data";
 | |
| 			var filenames: Array<String> = file.files;
 | |
| 
 | |
| 			if (file.type == "shader") {
 | |
| 				var serialized: Array<String> = [];
 | |
| 				for (filename in filenames) {
 | |
| 					serialized.push(Serializer.run(File.getBytes(AssetsBuilder.findResources() + filename)));
 | |
| 				}
 | |
| 				for (i in 0...filenames.length) {
 | |
| 					fields.push({
 | |
| 						name: dataName + i,
 | |
| 						doc: null,
 | |
| 						meta: [],
 | |
| 						access: [APrivate, AStatic],
 | |
| 						kind: FVar(macro : String, macro $v{serialized[i]}),
 | |
| 						pos: Context.currentPos()
 | |
| 					});
 | |
| 				}
 | |
| 
 | |
| 				if (name.endsWith("_comp")) {
 | |
| 					fields.push({
 | |
| 						name: fixedName,
 | |
| 						doc: null,
 | |
| 						meta: [],
 | |
| 						access: [APublic, AStatic],
 | |
| 						kind: FVar(macro : kha.compute.Shader, macro null),
 | |
| 						pos: Context.currentPos()
 | |
| 					});
 | |
| 
 | |
| 					init = macro {
 | |
| 						$init;
 | |
| 						{
 | |
| 							var blobs = new Array<Blob>();
 | |
| 							for (i in 0...$v{filenames.length}) {
 | |
| 								var data = Reflect.field(Shaders, $v{dataName} + i);
 | |
| 								var bytes: haxe.io.Bytes = haxe.Unserializer.run(data);
 | |
| 								blobs.push(kha.Blob.fromBytes(bytes));
 | |
| 							}
 | |
| 							$i{fixedName} = new kha.compute.Shader(blobs, $v{filenames});
 | |
| 						}
 | |
| 					};
 | |
| 				}
 | |
| 				else if (name.endsWith("_geom")) {
 | |
| 					fields.push({
 | |
| 						name: fixedName,
 | |
| 						doc: null,
 | |
| 						meta: [],
 | |
| 						access: [APublic, AStatic],
 | |
| 						kind: FVar(macro : kha.graphics4.GeometryShader, macro null),
 | |
| 						pos: Context.currentPos()
 | |
| 					});
 | |
| 
 | |
| 					init = macro {
 | |
| 						$init;
 | |
| 						{
 | |
| 							var blobs = new Array<Blob>();
 | |
| 							for (i in 0...$v{filenames.length}) {
 | |
| 								var data = Reflect.field(Shaders, $v{dataName} + i);
 | |
| 								var bytes: haxe.io.Bytes = haxe.Unserializer.run(data);
 | |
| 								blobs.push(kha.Blob.fromBytes(bytes));
 | |
| 							}
 | |
| 							$i{fixedName} = new kha.graphics4.GeometryShader(blobs, $v{filenames});
 | |
| 						}
 | |
| 					};
 | |
| 				}
 | |
| 				else if (name.endsWith("_tesc")) {
 | |
| 					fields.push({
 | |
| 						name: fixedName,
 | |
| 						doc: null,
 | |
| 						meta: [],
 | |
| 						access: [APublic, AStatic],
 | |
| 						kind: FVar(macro : kha.graphics4.TessellationControlShader, macro null),
 | |
| 						pos: Context.currentPos()
 | |
| 					});
 | |
| 
 | |
| 					init = macro {
 | |
| 						$init;
 | |
| 						{
 | |
| 							var blobs = new Array<Blob>();
 | |
| 							for (i in 0...$v{filenames.length}) {
 | |
| 								var data = Reflect.field(Shaders, $v{dataName} + i);
 | |
| 								var bytes: haxe.io.Bytes = haxe.Unserializer.run(data);
 | |
| 								blobs.push(kha.Blob.fromBytes(bytes));
 | |
| 							}
 | |
| 							$i{fixedName} = new kha.graphics4.TessellationControlShader(blobs, $v{filenames});
 | |
| 						}
 | |
| 					};
 | |
| 				}
 | |
| 				else if (name.endsWith("_tese")) {
 | |
| 					fields.push({
 | |
| 						name: fixedName,
 | |
| 						doc: null,
 | |
| 						meta: [],
 | |
| 						access: [APublic, AStatic],
 | |
| 						kind: FVar(macro : kha.graphics4.TessellationEvaluationShader, macro null),
 | |
| 						pos: Context.currentPos()
 | |
| 					});
 | |
| 
 | |
| 					init = macro {
 | |
| 						$init;
 | |
| 						{
 | |
| 							var blobs = new Array<Blob>();
 | |
| 							for (i in 0...$v{filenames.length}) {
 | |
| 								var data = Reflect.field(Shaders, $v{dataName} + i);
 | |
| 								var bytes: haxe.io.Bytes = haxe.Unserializer.run(data);
 | |
| 								blobs.push(kha.Blob.fromBytes(bytes));
 | |
| 							}
 | |
| 							$i{fixedName} = new kha.graphics4.TessellationEvaluationShader(blobs, $v{filenames});
 | |
| 						}
 | |
| 					};
 | |
| 				}
 | |
| 				else if (name.endsWith("_vert")) {
 | |
| 					fields.push({
 | |
| 						name: fixedName,
 | |
| 						doc: null,
 | |
| 						meta: [],
 | |
| 						access: [APublic, AStatic],
 | |
| 						kind: FVar(macro : kha.graphics4.VertexShader, macro null),
 | |
| 						pos: Context.currentPos()
 | |
| 					});
 | |
| 
 | |
| 					init = macro {
 | |
| 						$init;
 | |
| 						{
 | |
| 							var blobs = new Array<Blob>();
 | |
| 							for (i in 0...$v{filenames.length}) {
 | |
| 								var data = Reflect.field(Shaders, $v{dataName} + i);
 | |
| 								var bytes: haxe.io.Bytes = haxe.Unserializer.run(data);
 | |
| 								blobs.push(kha.Blob.fromBytes(bytes));
 | |
| 							}
 | |
| 							$i{fixedName} = new kha.graphics4.VertexShader(blobs, $v{filenames});
 | |
| 						}
 | |
| 					};
 | |
| 				}
 | |
| 				else {
 | |
| 					fields.push({
 | |
| 						name: fixedName,
 | |
| 						doc: null,
 | |
| 						meta: [],
 | |
| 						access: [APublic, AStatic],
 | |
| 						kind: FVar(macro : kha.graphics4.FragmentShader, macro null),
 | |
| 						pos: Context.currentPos()
 | |
| 					});
 | |
| 
 | |
| 					init = macro {
 | |
| 						$init;
 | |
| 						{
 | |
| 							var blobs = new Array<Blob>();
 | |
| 							for (i in 0...$v{filenames.length}) {
 | |
| 								var data = Reflect.field(Shaders, $v{dataName} + i);
 | |
| 								var bytes: haxe.io.Bytes = haxe.Unserializer.run(data);
 | |
| 								blobs.push(kha.Blob.fromBytes(bytes));
 | |
| 							}
 | |
| 							$i{fixedName} = new kha.graphics4.FragmentShader(blobs, $v{filenames});
 | |
| 						}
 | |
| 					};
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		fields.push({
 | |
| 			name: "init",
 | |
| 			doc: null,
 | |
| 			meta: [],
 | |
| 			access: [APublic, AStatic],
 | |
| 			kind: FFun({
 | |
| 				ret: null,
 | |
| 				params: null,
 | |
| 				expr: init,
 | |
| 				args: []
 | |
| 			}),
 | |
| 			pos: Context.currentPos()
 | |
| 		});
 | |
| 
 | |
| 		return fields;
 | |
| 	}
 | |
| }
 |