93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package kha.graphics5;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import kha.arrays.Float32Array;
							 | 
						||
| 
								 | 
							
								import kha.graphics5.VertexData;
							 | 
						||
| 
								 | 
							
								import kha.graphics5.VertexElement;
							 | 
						||
| 
								 | 
							
								import kha.graphics5.VertexStructure;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@:headerCode('
							 | 
						||
| 
								 | 
							
								#include <Kore/Graphics5/Graphics.h>
							 | 
						||
| 
								 | 
							
								')
							 | 
						||
| 
								 | 
							
								@:headerClassCode("Kore::Graphics5::VertexBuffer* buffer;")
							 | 
						||
| 
								 | 
							
								class VertexBuffer {
							 | 
						||
| 
								 | 
							
									private var data: Float32Array;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function new(vertexCount: Int, structure: VertexStructure, usage: Usage, instanceDataStepRate: Int = 0, canRead: Bool = false) {
							 | 
						||
| 
								 | 
							
										init(vertexCount, structure, usage, instanceDataStepRate);
							 | 
						||
| 
								 | 
							
										data = new Float32Array();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function delete(): Void {
							 | 
						||
| 
								 | 
							
										untyped __cpp__('delete buffer; buffer = nullptr;');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("
							 | 
						||
| 
								 | 
							
										Kore::Graphics4::VertexStructure structure2;
							 | 
						||
| 
								 | 
							
										for (int i = 0; i < structure->size(); ++i) {
							 | 
						||
| 
								 | 
							
											Kore::Graphics4::VertexData data;
							 | 
						||
| 
								 | 
							
											switch (structure->get(i)->data) {
							 | 
						||
| 
								 | 
							
											case 0:
							 | 
						||
| 
								 | 
							
												data = Kore::Graphics4::Float1VertexData;
							 | 
						||
| 
								 | 
							
												break;
							 | 
						||
| 
								 | 
							
											case 1:
							 | 
						||
| 
								 | 
							
												data = Kore::Graphics4::Float2VertexData;
							 | 
						||
| 
								 | 
							
												break;
							 | 
						||
| 
								 | 
							
											case 2:
							 | 
						||
| 
								 | 
							
												data = Kore::Graphics4::Float3VertexData;
							 | 
						||
| 
								 | 
							
												break;
							 | 
						||
| 
								 | 
							
											case 3:
							 | 
						||
| 
								 | 
							
												data = Kore::Graphics4::Float4VertexData;
							 | 
						||
| 
								 | 
							
												break;
							 | 
						||
| 
								 | 
							
											case 4:
							 | 
						||
| 
								 | 
							
												data = Kore::Graphics4::Float4x4VertexData;
							 | 
						||
| 
								 | 
							
												break;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											structure2.add(structure->get(i)->name, data);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										buffer = new Kore::Graphics5::VertexBuffer(vertexCount, structure2, false);
							 | 
						||
| 
								 | 
							
									")
							 | 
						||
| 
								 | 
							
									private function init(vertexCount: Int, structure: VertexStructure, usage: Int, instanceDataStepRate: Int) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode('
							 | 
						||
| 
								 | 
							
										data->self.data = buffer->lock() + start * buffer->stride() / 4;
							 | 
						||
| 
								 | 
							
										data->self.myLength = count * buffer->stride() / 4;
							 | 
						||
| 
								 | 
							
										return data;
							 | 
						||
| 
								 | 
							
									')
							 | 
						||
| 
								 | 
							
									private function lock2(start: Int, count: Int): Float32Array {
							 | 
						||
| 
								 | 
							
										return data;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function lock(?start: Int, ?count: Int): Float32Array {
							 | 
						||
| 
								 | 
							
										if (start == null)
							 | 
						||
| 
								 | 
							
											start = 0;
							 | 
						||
| 
								 | 
							
										if (count == null)
							 | 
						||
| 
								 | 
							
											count = this.count();
							 | 
						||
| 
								 | 
							
										return lock2(start, count);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode('buffer->unlock();')
							 | 
						||
| 
								 | 
							
									public function unlock(): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("return buffer->stride();")
							 | 
						||
| 
								 | 
							
									public function stride(): Int {
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("return buffer->count();")
							 | 
						||
| 
								 | 
							
									public function count(): Int {
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:noCompletion
							 | 
						||
| 
								 | 
							
									@:keep
							 | 
						||
| 
								 | 
							
									public static function _unused1(): VertexElement {
							 | 
						||
| 
								 | 
							
										return null;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:noCompletion
							 | 
						||
| 
								 | 
							
									@:keep
							 | 
						||
| 
								 | 
							
									public static function _unused2(): VertexData {
							 | 
						||
| 
								 | 
							
										return Float1;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |