forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			109 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			109 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package kha.graphics4; | ||
|  | 
 | ||
|  | import kha.arrays.Float32Array; | ||
|  | import kha.arrays.Int16Array; | ||
|  | import kha.graphics4.VertexData; | ||
|  | import kha.graphics4.VertexElement; | ||
|  | import kha.graphics4.VertexStructure; | ||
|  | 
 | ||
|  | @:headerCode("
 | ||
|  | #include <kinc/graphics4/vertexbuffer.h> | ||
|  | #include <khalib/g4.h> | ||
|  | ")
 | ||
|  | @:headerClassCode("kinc_g4_vertex_buffer_t buffer;") | ||
|  | class VertexBuffer { | ||
|  | 	var data: Float32Array; | ||
|  | 	@:keep var dataInt16: Int16Array; | ||
|  | 
 | ||
|  | 	public function new(vertexCount: Int, structure: VertexStructure, usage: Usage, instanceDataStepRate: Int = 0, canRead: Bool = false) { | ||
|  | 		init(vertexCount, structure, usage, instanceDataStepRate); | ||
|  | 		data = new Float32Array(0); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function delete(): Void { | ||
|  | 		untyped __cpp__("kinc_g4_vertex_buffer_destroy(&buffer);"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("
 | ||
|  | 		kinc_g4_vertex_structure_t structure2; | ||
|  | 		kinc_g4_vertex_structure_init(&structure2); | ||
|  | 		for (int i = 0; i < structure->size(); ++i) { | ||
|  | 			kinc_g4_vertex_data_t data = kha_convert_vertex_data(structure->get(i)->data); | ||
|  | 			kinc_g4_vertex_structure_add(&structure2, structure->get(i)->name, data); | ||
|  | 		} | ||
|  | 		kinc_g4_vertex_buffer_init(&buffer, vertexCount, &structure2, (kinc_g4_usage_t)usage, instanceDataStepRate); | ||
|  | 	")
 | ||
|  | 	function init(vertexCount: Int, structure: VertexStructure, usage: Int, instanceDataStepRate: Int) {} | ||
|  | 
 | ||
|  | 	@:functionCode("
 | ||
|  | 		data->self.data = (uint8_t*)kinc_g4_vertex_buffer_lock(&buffer, start, count); | ||
|  | 		data->byteArrayLength = count * kinc_g4_vertex_buffer_stride(&buffer); | ||
|  | 		data->byteArrayOffset = 0; | ||
|  | 		return data; | ||
|  | 	")
 | ||
|  | 	function lockPrivate(start: Int, count: Int): Float32Array { | ||
|  | 		return data; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	var lastLockCount: Int = 0; | ||
|  | 
 | ||
|  | 	public function lock(?start: Int, ?count: Int): Float32Array { | ||
|  | 		if (start == null) | ||
|  | 			start = 0; | ||
|  | 		if (count == null) | ||
|  | 			count = this.count() - start; | ||
|  | 		lastLockCount = count; | ||
|  | 		return lockPrivate(start, count); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("
 | ||
|  | 		dataInt16->self.data = (uint8_t*)kinc_g4_vertex_buffer_lock(&buffer, start, count); | ||
|  | 		dataInt16->byteArrayLength = count * kinc_g4_vertex_buffer_stride(&buffer); | ||
|  | 		dataInt16->byteArrayOffset = 0; | ||
|  | 		return dataInt16; | ||
|  | 	")
 | ||
|  | 	function lockInt16Private(start: Int, count: Int): Int16Array { | ||
|  | 		return dataInt16; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function lockInt16(?start: Int, ?count: Int): Int16Array { | ||
|  | 		if (start == null) | ||
|  | 			start = 0; | ||
|  | 		if (count == null) | ||
|  | 			count = this.count(); | ||
|  | 		lastLockCount = count; | ||
|  | 		if (dataInt16 == null) | ||
|  | 			dataInt16 = new Int16Array(0); | ||
|  | 		return lockInt16Private(start, count); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("kinc_g4_vertex_buffer_unlock(&buffer, count); data->self.data = nullptr; if (!hx::IsNull(dataInt16)) dataInt16->self.data = nullptr;") | ||
|  | 	function unlockPrivate(count: Int): Void {} | ||
|  | 
 | ||
|  | 	public function unlock(?count: Int): Void { | ||
|  | 		unlockPrivate(count == null ? lastLockCount : count); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("return kinc_g4_vertex_buffer_stride(&buffer);") | ||
|  | 	public function stride(): Int { | ||
|  | 		return 0; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("return kinc_g4_vertex_buffer_count(&buffer);") | ||
|  | 	public function count(): Int { | ||
|  | 		return 0; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:noCompletion | ||
|  | 	@:keep | ||
|  | 	public static function _unused1(): VertexElement { | ||
|  | 		return null; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:noCompletion | ||
|  | 	@:keep | ||
|  | 	public static function _unused2(): VertexData { | ||
|  | 		return VertexData.Float32_1X; | ||
|  | 	} | ||
|  | } |