forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			116 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| package kha.graphics4;
 | |
| 
 | |
| import kha.arrays.Float32Array;
 | |
| import kha.graphics4.Usage;
 | |
| import kha.graphics4.VertexStructure;
 | |
| import kha.graphics4.VertexData;
 | |
| 
 | |
| class VertexBuffer {
 | |
| 	static var lastId: Int = -1;
 | |
| 
 | |
| 	public var _id: Int;
 | |
| 	public var _data: Float32Array;
 | |
| 
 | |
| 	var mySize: Int;
 | |
| 	var myStride: Int;
 | |
| 	var sizes: Array<Int>;
 | |
| 	var offsets: Array<Int>;
 | |
| 	var usage: Usage;
 | |
| 	var instanceDataStepRate: Int;
 | |
| 	var lockStart: Int = 0;
 | |
| 	var lockCount: Int = 0;
 | |
| 
 | |
| 	public function new(vertexCount: Int, structure: VertexStructure, usage: Usage, instanceDataStepRate: Int = 0, canRead: Bool = false) {
 | |
| 		this.usage = usage;
 | |
| 		this.instanceDataStepRate = instanceDataStepRate;
 | |
| 		mySize = vertexCount;
 | |
| 		myStride = 0;
 | |
| 		for (element in structure.elements) {
 | |
| 			myStride += VertexStructure.dataByteSize(element.data);
 | |
| 		}
 | |
| 
 | |
| 		_data = new Float32Array(Std.int(vertexCount * myStride / 4));
 | |
| 
 | |
| 		sizes = new Array<Int>();
 | |
| 		offsets = new Array<Int>();
 | |
| 		sizes[structure.elements.length - 1] = 0;
 | |
| 		offsets[structure.elements.length - 1] = 0;
 | |
| 
 | |
| 		var offset = 0;
 | |
| 		var index = 0;
 | |
| 		for (element in structure.elements) {
 | |
| 			var size = 0;
 | |
| 			size += Std.int(VertexStructure.dataByteSize(element.data) / 4);
 | |
| 			sizes[index] = size;
 | |
| 			offsets[index] = offset;
 | |
| 			offset += VertexStructure.dataByteSize(element.data);
 | |
| 			++index;
 | |
| 		}
 | |
| 
 | |
| 		_id = ++lastId;
 | |
| 		var elements = new Array<Dynamic>();
 | |
| 		for (element in structure.elements) {
 | |
| 			elements.push({
 | |
| 				name: element.name,
 | |
| 				data: element.data
 | |
| 			});
 | |
| 		}
 | |
| 		Worker.postMessage({
 | |
| 			command: 'createVertexBuffer',
 | |
| 			id: _id,
 | |
| 			size: vertexCount,
 | |
| 			structure: {elements: elements},
 | |
| 			usage: usage
 | |
| 		});
 | |
| 	}
 | |
| 
 | |
| 	public function delete(): Void {
 | |
| 		_data = null;
 | |
| 	}
 | |
| 
 | |
| 	public function lock(?start: Int, ?count: Int): Float32Array {
 | |
| 		lockStart = start != null ? start : 0;
 | |
| 		lockCount = count != null ? count : mySize;
 | |
| 		return _data.subarray(Std.int(lockStart * stride() / 4), Std.int((lockStart + lockCount) * stride() / 4));
 | |
| 	}
 | |
| 
 | |
| 	public function unlock(?count: Int): Void {
 | |
| 		if (count != null)
 | |
| 			lockCount = count;
 | |
| 		Worker.postMessage({
 | |
| 			command: 'updateVertexBuffer',
 | |
| 			id: _id,
 | |
| 			data: _data.subarray(Std.int(lockStart * stride() / 4), Std.int((lockStart + lockCount) * stride() / 4)).buffer,
 | |
| 			start: lockStart,
 | |
| 			count: lockCount
 | |
| 		});
 | |
| 	}
 | |
| 
 | |
| 	public function stride(): Int {
 | |
| 		return myStride;
 | |
| 	}
 | |
| 
 | |
| 	public function count(): Int {
 | |
| 		return mySize;
 | |
| 	}
 | |
| 
 | |
| 	public function set(offset: Int): Int {
 | |
| 		var attributesOffset = 0;
 | |
| 		for (i in 0...sizes.length) {
 | |
| 			if (sizes[i] > 4) {
 | |
| 				var size = sizes[i];
 | |
| 				var addonOffset = 0;
 | |
| 				while (size > 0) {
 | |
| 					size -= 4;
 | |
| 					addonOffset += 4 * 4;
 | |
| 					++attributesOffset;
 | |
| 				}
 | |
| 			}
 | |
| 			else {
 | |
| 				++attributesOffset;
 | |
| 			}
 | |
| 		}
 | |
| 		return attributesOffset;
 | |
| 	}
 | |
| }
 |