forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			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);
							 | 
						||
| 
								 | 
							
											});
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |