129 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| package iron.data;
 | |
| 
 | |
| import haxe.Json;
 | |
| import kha.arrays.Float32Array;
 | |
| import iron.math.Vec4;
 | |
| import iron.data.SceneFormat;
 | |
| import iron.system.LnxPack;
 | |
| using StringTools;
 | |
| 
 | |
| class WorldData {
 | |
| 
 | |
| 	public var name: String;
 | |
| 	public var raw: TWorldData;
 | |
| 	public var envmap: kha.Image;
 | |
| 	public var probe: Probe;
 | |
| 
 | |
| 	static var emptyIrr: Float32Array = null;
 | |
| 
 | |
| 	public function new(raw: TWorldData, done: WorldData->Void) {
 | |
| 		this.raw = raw;
 | |
| 		this.name = raw.name;
 | |
| 
 | |
| 		// Parse probes
 | |
| 		if (raw.probe != null) {
 | |
| 			new Probe(raw.probe, function(self: Probe) {
 | |
| 				probe = self;
 | |
| 				#if lnx_skip_envmap
 | |
| 				done(this);
 | |
| 				#else
 | |
| 				loadEnvmap(done);
 | |
| 				#end
 | |
| 			});
 | |
| 		}
 | |
| 		else {
 | |
| 			#if lnx_skip_envmap
 | |
| 			done(this);
 | |
| 			#else
 | |
| 			loadEnvmap(done);
 | |
| 			#end
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public function loadEnvmap(done: WorldData->Void) {
 | |
| 		if (raw.envmap != null) {
 | |
| 			Data.getImage(raw.envmap, function(image: kha.Image) {
 | |
| 				envmap = image;
 | |
| 				done(this);
 | |
| 			});
 | |
| 		}
 | |
| 		else done(this);
 | |
| 	}
 | |
| 
 | |
| 	public static function parse(name: String, id: String, done: WorldData->Void) {
 | |
| 		Data.getSceneRaw(name, function(format: TSceneFormat) {
 | |
| 			var raw: TWorldData = Data.getWorldRawByName(format.world_datas, id);
 | |
| 			if (raw == null) {
 | |
| 				trace('World data "$id" not found!');
 | |
| 				done(null);
 | |
| 			}
 | |
| 			new WorldData(raw, done);
 | |
| 		});
 | |
| 	}
 | |
| 
 | |
| 	public static function getEmptyIrradiance(): Float32Array {
 | |
| 		if (emptyIrr == null) {
 | |
| 			emptyIrr = new Float32Array(28);
 | |
| 			for (i in 0...emptyIrr.length) emptyIrr.set(i, 0.0);
 | |
| 		}
 | |
| 		return emptyIrr;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| class Probe {
 | |
| 
 | |
| 	public var raw: TProbeData;
 | |
| 	public var radiance: kha.Image;
 | |
| 	public var radianceMipmaps: Array<kha.Image> = [];
 | |
| 	public var irradiance: Float32Array;
 | |
| 
 | |
| 	public function new(raw: TProbeData, done: Probe->Void) {
 | |
| 		this.raw = raw;
 | |
| 
 | |
| 		setIrradiance(function(irr: Float32Array) {
 | |
| 			irradiance = irr;
 | |
| 			if (raw.radiance != null) {
 | |
| 				Data.getImage(raw.radiance, function(rad: kha.Image) {
 | |
| 					radiance = rad;
 | |
| 					while (radianceMipmaps.length < raw.radiance_mipmaps) radianceMipmaps.push(null);
 | |
| 					var dot = raw.radiance.lastIndexOf(".");
 | |
| 					var ext = raw.radiance.substring(dot);
 | |
| 					var base = raw.radiance.substring(0, dot);
 | |
| 
 | |
| 					var mipsLoaded = 0;
 | |
| 					for (i in 0...raw.radiance_mipmaps) {
 | |
| 						Data.getImage(base + "_" + i + ext, function(mipimg: kha.Image) {
 | |
| 							radianceMipmaps[i] = mipimg;
 | |
| 							mipsLoaded++;
 | |
| 
 | |
| 							if (mipsLoaded == raw.radiance_mipmaps) {
 | |
| 								radiance.setMipmaps(radianceMipmaps);
 | |
| 								done(this);
 | |
| 							}
 | |
| 						}, true); // Readable
 | |
| 					}
 | |
| 				});
 | |
| 			}
 | |
| 			else done(this);
 | |
| 		});
 | |
| 	}
 | |
| 
 | |
| 	function setIrradiance(done: Float32Array->Void) {
 | |
| 		// Parse probe data
 | |
| 		if (raw.irradiance == null) {
 | |
| 			done(WorldData.getEmptyIrradiance());
 | |
| 		}
 | |
| 		else {
 | |
| 			var ext = raw.irradiance.endsWith(".json") ? "" : ".lnx";
 | |
| 			Data.getBlob(raw.irradiance + ext, function(b: kha.Blob) {
 | |
| 				var irradianceParsed: TSceneFormat = ext == "" ?
 | |
| 					Json.parse(b.toString()) :
 | |
| 					LnxPack.decode(b.toBytes());
 | |
| 				var irr = new Float32Array(28); // Align to mult of 4 - 27->28
 | |
| 				for (i in 0...27) irr[i] = irradianceParsed.irradiance[i];
 | |
| 				done(irr);
 | |
| 			});
 | |
| 		}
 | |
| 	}
 | |
| }
 |