forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			221 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			221 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package kha;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import kha.arrays.Float32Array;
							 | 
						||
| 
								 | 
							
								import haxe.io.Bytes;
							 | 
						||
| 
								 | 
							
								import haxe.io.BytesData;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@:headerCode("
							 | 
						||
| 
								 | 
							
								#include <kinc/input/keyboard.h>
							 | 
						||
| 
								 | 
							
								#include <kinc/system.h>
							 | 
						||
| 
								 | 
							
								#include <kinc/video.h>
							 | 
						||
| 
								 | 
							
								#include <khalib/loader.h>
							 | 
						||
| 
								 | 
							
								")
							 | 
						||
| 
								 | 
							
								class BlobCallback {
							 | 
						||
| 
								 | 
							
									public var success: Blob->Void;
							 | 
						||
| 
								 | 
							
									public var error: AssetError->Void;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function new(success: Blob->Void, error: AssetError->Void) {
							 | 
						||
| 
								 | 
							
										this.success = success;
							 | 
						||
| 
								 | 
							
										this.error = error;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class ImageCallback {
							 | 
						||
| 
								 | 
							
									public var success: Image->Void;
							 | 
						||
| 
								 | 
							
									public var error: AssetError->Void;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function new(success: Image->Void, error: AssetError->Void) {
							 | 
						||
| 
								 | 
							
										this.success = success;
							 | 
						||
| 
								 | 
							
										this.error = error;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SoundCallback {
							 | 
						||
| 
								 | 
							
									public var success: Sound->Void;
							 | 
						||
| 
								 | 
							
									public var error: AssetError->Void;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function new(success: Sound->Void, error: AssetError->Void) {
							 | 
						||
| 
								 | 
							
										this.success = success;
							 | 
						||
| 
								 | 
							
										this.error = error;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class LoaderImpl {
							 | 
						||
| 
								 | 
							
									static var blobCallbacks = new Map<haxe.Int64, BlobCallback>();
							 | 
						||
| 
								 | 
							
									static var imageCallbacks = new Map<haxe.Int64, ImageCallback>();
							 | 
						||
| 
								 | 
							
									static var soundCallbacks = new Map<haxe.Int64, SoundCallback>();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function loadSoundFromDescription(desc: Dynamic, done: kha.Sound->Void, failed: AssetError->Void) {
							 | 
						||
| 
								 | 
							
										soundCallbacks[loadSound(desc.files[0])] = new SoundCallback(done, failed);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("return kha_loader_load_sound(filename);")
							 | 
						||
| 
								 | 
							
									static function loadSound(filename: String): haxe.Int64 {
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function getSoundFormats(): Array<String> {
							 | 
						||
| 
								 | 
							
										return ["wav", "ogg"];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function loadImageFromDescription(desc: Dynamic, done: kha.Image->Void, failed: AssetError->Void) {
							 | 
						||
| 
								 | 
							
										var readable = Reflect.hasField(desc, "readable") ? desc.readable : false;
							 | 
						||
| 
								 | 
							
										// done(kha.Image.fromFile(desc.files[0], readable));
							 | 
						||
| 
								 | 
							
										imageCallbacks[loadImage(desc.files[0], readable)] = new ImageCallback(done, failed);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("return kha_loader_load_image(filename, readable);")
							 | 
						||
| 
								 | 
							
									static function loadImage(filename: String, readable: Bool): haxe.Int64 {
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function getImageFormats(): Array<String> {
							 | 
						||
| 
								 | 
							
										return ["png", "jpg", "hdr"];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function loadBlobFromDescription(desc: Dynamic, done: Blob->Void, failed: AssetError->Void) {
							 | 
						||
| 
								 | 
							
										blobCallbacks[loadBlob(desc.files[0])] = new BlobCallback(done, failed);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("return kha_loader_load_blob(filename);")
							 | 
						||
| 
								 | 
							
									static function loadBlob(filename: String): haxe.Int64 {
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function loadFontFromDescription(desc: Dynamic, done: Font->Void, failed: AssetError->Void): Void {
							 | 
						||
| 
								 | 
							
										loadBlobFromDescription(desc, function(blob: Blob) {
							 | 
						||
| 
								 | 
							
											done(new Kravur(blob));
							 | 
						||
| 
								 | 
							
										}, failed);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function loadVideoFromDescription(desc: Dynamic, done: Video->Void, failed: AssetError->Void) {
							 | 
						||
| 
								 | 
							
										done(new kha.kore.Video(desc.files[0]));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("return ::String(kinc_video_formats()[0]);")
							 | 
						||
| 
								 | 
							
									static function videoFormat(): String {
							 | 
						||
| 
								 | 
							
										return "";
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function getVideoFormats(): Array<String> {
							 | 
						||
| 
								 | 
							
										return [videoFormat()];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("kinc_keyboard_show();")
							 | 
						||
| 
								 | 
							
									public static function showKeyboard(): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("kinc_keyboard_hide();")
							 | 
						||
| 
								 | 
							
									public static function hideKeyboard(): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("kinc_load_url(url);")
							 | 
						||
| 
								 | 
							
									public static function loadURL(url: String): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:keep static function blobLoaded(index: haxe.Int64, bytes: BytesData) {
							 | 
						||
| 
								 | 
							
										blobCallbacks[index].success(new Blob(Bytes.ofData(bytes)));
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:keep static function blobErrored(index: haxe.Int64, filename: String) {
							 | 
						||
| 
								 | 
							
										blobCallbacks[index].error({url: filename});
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:keep static function soundLoadedCompressed(index: haxe.Int64, bytes: BytesData) {
							 | 
						||
| 
								 | 
							
										var sound = new Sound();
							 | 
						||
| 
								 | 
							
										sound.compressedData = Bytes.ofData(bytes);
							 | 
						||
| 
								 | 
							
										sound.uncompressedData = null;
							 | 
						||
| 
								 | 
							
										sound.channels = 0;
							 | 
						||
| 
								 | 
							
										sound.sampleRate = 0;
							 | 
						||
| 
								 | 
							
										sound.length = 0;
							 | 
						||
| 
								 | 
							
										soundCallbacks[index].success(sound);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:keep static function soundLoadedUncompressed(index: haxe.Int64, samples: Float32Array, channels: Int, sampleRate: Int, length: Float) {
							 | 
						||
| 
								 | 
							
										var sound = new Sound();
							 | 
						||
| 
								 | 
							
										sound.compressedData = null;
							 | 
						||
| 
								 | 
							
										sound.uncompressedData = samples;
							 | 
						||
| 
								 | 
							
										sound.channels = channels;
							 | 
						||
| 
								 | 
							
										sound.sampleRate = sampleRate;
							 | 
						||
| 
								 | 
							
										sound.length = length;
							 | 
						||
| 
								 | 
							
										soundCallbacks[index].success(sound);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:keep static function soundErrored(index: haxe.Int64, filename: String) {
							 | 
						||
| 
								 | 
							
										soundCallbacks[index].error({url: filename});
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:keep static function createFloat32Array() {
							 | 
						||
| 
								 | 
							
										return new Float32Array(0);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:keep static function createEmptyImage(readable: Bool, floatFormat: Bool) {
							 | 
						||
| 
								 | 
							
										return Image.createEmpty(readable, floatFormat);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:keep static function imageLoaded(index: haxe.Int64, image: Image) {
							 | 
						||
| 
								 | 
							
										imageCallbacks[index].success(image);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:keep static function imageErrored(index: haxe.Int64, filename: String) {
							 | 
						||
| 
								 | 
							
										imageCallbacks[index].error({url: filename});
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("
							 | 
						||
| 
								 | 
							
										kha_file_reference_t file = kha_loader_get_file();
							 | 
						||
| 
								 | 
							
										while (file.index != 0) {
							 | 
						||
| 
								 | 
							
											switch (file.type) {
							 | 
						||
| 
								 | 
							
												case KHA_FILE_TYPE_BLOB:
							 | 
						||
| 
								 | 
							
													if (file.error) {
							 | 
						||
| 
								 | 
							
														blobErrored(file.index, file.name);
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else {
							 | 
						||
| 
								 | 
							
														Array<unsigned char> buffer = Array_obj<unsigned char>::fromData(file.data.blob.bytes, file.data.blob.size);
							 | 
						||
| 
								 | 
							
														blobLoaded(file.index, buffer);
							 | 
						||
| 
								 | 
							
														kha_loader_cleanup_blob(file.data.blob);
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													break;
							 | 
						||
| 
								 | 
							
												case KHA_FILE_TYPE_IMAGE:
							 | 
						||
| 
								 | 
							
													if (file.error) {
							 | 
						||
| 
								 | 
							
														imageErrored(file.index, file.name);
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else {
							 | 
						||
| 
								 | 
							
														::kha::Image image = createEmptyImage(file.data.image.readable, file.data.image.image.format == KINC_IMAGE_FORMAT_RGBA128);
							 | 
						||
| 
								 | 
							
														kinc_image_t kincImage;
							 | 
						||
| 
								 | 
							
														kinc_image_init(&kincImage, file.data.image.image.data, file.data.image.image.width, file.data.image.image.height, (kinc_image_format_t)file.data.image.image.format);
							 | 
						||
| 
								 | 
							
														kinc_g4_texture_init_from_image(&image->texture, &kincImage);
							 | 
						||
| 
								 | 
							
														if (file.data.image.readable) {
							 | 
						||
| 
								 | 
							
															image->imageData = (uint8_t*)kincImage.data;
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
														else {
							 | 
						||
| 
								 | 
							
															free(file.data.image.image.data);
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
														kinc_image_destroy(&kincImage);
							 | 
						||
| 
								 | 
							
														image->imageType = KhaImageTypeTexture;
							 | 
						||
| 
								 | 
							
														image->originalWidth = file.data.image.image.width;
							 | 
						||
| 
								 | 
							
														image->originalHeight = file.data.image.image.height;
							 | 
						||
| 
								 | 
							
														imageLoaded(file.index, image);
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													break;
							 | 
						||
| 
								 | 
							
												case KHA_FILE_TYPE_SOUND:
							 | 
						||
| 
								 | 
							
													if (file.error) {
							 | 
						||
| 
								 | 
							
														soundErrored(file.index, file.name);
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else if (file.data.sound.samples != NULL) {
							 | 
						||
| 
								 | 
							
														::kha::arrays::ByteArrayPrivate buffer = createFloat32Array();
							 | 
						||
| 
								 | 
							
														buffer->self.data = (uint8_t*)file.data.sound.samples;
							 | 
						||
| 
								 | 
							
														buffer->byteArrayLength = file.data.sound.size * 4;
							 | 
						||
| 
								 | 
							
														buffer->byteArrayOffset = 0;
							 | 
						||
| 
								 | 
							
														soundLoadedUncompressed(file.index, buffer, file.data.sound.channels, file.data.sound.sample_rate, file.data.sound.length);
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													else {
							 | 
						||
| 
								 | 
							
														Array<unsigned char> buffer = Array_obj<unsigned char>::fromData(file.data.sound.compressed_samples, file.data.sound.size);
							 | 
						||
| 
								 | 
							
														soundLoadedCompressed(file.index, buffer);
							 | 
						||
| 
								 | 
							
														kha_loader_cleanup_sound(file.data.sound);
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													break;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											file = kha_loader_get_file();
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									")
							 | 
						||
| 
								 | 
							
									public static function tick(): Void {}
							 | 
						||
| 
								 | 
							
								}
							 |