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