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;
 | 
						|
	}
 | 
						|
}
 |