gs-vertexbuffer: Fix and improve various problematic locations
This commit is contained in:
		
							parent
							
								
									45d2431ef5
								
							
						
					
					
						commit
						0ef94aad0f
					
				|  | @ -32,6 +32,35 @@ | |||
| #pragma warning(pop) | ||||
| #endif | ||||
| 
 | ||||
| void gs::vertex_buffer::initialize(size_t capacity, size_t layers) | ||||
| { | ||||
| 	if (capacity > MAXIMUM_VERTICES) { | ||||
| 		throw std::out_of_range("capacity too large"); | ||||
| 	} | ||||
| 	if (layers > MAXIMUM_UVW_LAYERS) { | ||||
| 		throw std::out_of_range("too many layers"); | ||||
| 	} | ||||
| 
 | ||||
| 	// Allocate memory for data.
 | ||||
| 	_data          = gs_vbdata_create(); | ||||
| 	_data->num     = _capacity; | ||||
| 	_data->num_tex = _layers; | ||||
| 	_data->points = _positions = (vec3*)util::malloc_aligned(16, sizeof(vec3) * _capacity); | ||||
| 	_data->normals = _normals = (vec3*)util::malloc_aligned(16, sizeof(vec3) * _capacity); | ||||
| 	_data->tangents = _tangents = (vec3*)util::malloc_aligned(16, sizeof(vec3) * _capacity); | ||||
| 	_data->colors = _colors = (uint32_t*)util::malloc_aligned(16, sizeof(uint32_t) * _capacity); | ||||
| 	if (_layers > 0) { | ||||
| 		_data->tvarray = _layer_data = (gs_tvertarray*)util::malloc_aligned(16, sizeof(gs_tvertarray) * _layers); | ||||
| 		for (size_t n = 0; n < _layers; n++) { | ||||
| 			_layer_data[n].array = _uvs[n] = (vec4*)util::malloc_aligned(16, sizeof(vec4) * _capacity); | ||||
| 			_layer_data[n].width           = 4; | ||||
| 			memset(_uvs[n], 0, sizeof(vec4) * _capacity); | ||||
| 		} | ||||
| 	} else { | ||||
| 		_data->tvarray = nullptr; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| gs::vertex_buffer::~vertex_buffer() | ||||
| { | ||||
| 	if (_positions) { | ||||
|  | @ -82,6 +111,8 @@ gs::vertex_buffer::vertex_buffer(uint32_t vertices, uint8_t uvlayers) | |||
| 	: _size(vertices), _capacity(vertices), _layers(uvlayers), _positions(nullptr), _normals(nullptr), | ||||
| 	  _tangents(nullptr), _colors(nullptr), _data(nullptr), _buffer(nullptr), _layer_data(nullptr) | ||||
| { | ||||
| 	initialize(vertices, uvlayers); | ||||
| 
 | ||||
| 	if (vertices > MAXIMUM_VERTICES) { | ||||
| 		throw std::out_of_range("vertices out of range"); | ||||
| 	} | ||||
|  | @ -89,34 +120,6 @@ gs::vertex_buffer::vertex_buffer(uint32_t vertices, uint8_t uvlayers) | |||
| 		throw std::out_of_range("uvlayers out of range"); | ||||
| 	} | ||||
| 
 | ||||
| 	// Allocate memory for data.
 | ||||
| 	_data         = gs_vbdata_create(); | ||||
| 	_data->num    = _capacity; | ||||
| 	_data->points = _positions = (vec3*)util::malloc_aligned(16, sizeof(vec3) * _capacity); | ||||
| 	_data->normals = _normals = (vec3*)util::malloc_aligned(16, sizeof(vec3) * _capacity); | ||||
| 	_data->tangents = _tangents = (vec3*)util::malloc_aligned(16, sizeof(vec3) * _capacity); | ||||
| 	_data->colors = _colors = (uint32_t*)util::malloc_aligned(16, sizeof(uint32_t) * _capacity); | ||||
| 
 | ||||
| 	// cppcheck-suppress memsetClassFloat
 | ||||
| 	memset(_positions, 0, sizeof(vec3) * _capacity); | ||||
| 	// cppcheck-suppress memsetClassFloat
 | ||||
| 	memset(_normals, 0, sizeof(vec3) * _capacity); | ||||
| 	// cppcheck-suppress memsetClassFloat
 | ||||
| 	memset(_tangents, 0, sizeof(vec3) * _capacity); | ||||
| 	memset(_colors, 0, sizeof(uint32_t) * _capacity); | ||||
| 
 | ||||
| 	_data->num_tex = _layers; | ||||
| 	if (_layers > 0) { | ||||
| 		_data->tvarray = _layer_data = (gs_tvertarray*)util::malloc_aligned(16, sizeof(gs_tvertarray) * _layers); | ||||
| 		for (size_t n = 0; n < _layers; n++) { | ||||
| 			_layer_data[n].array = _uvs[n] = (vec4*)util::malloc_aligned(16, sizeof(vec4) * _capacity); | ||||
| 			_layer_data[n].width           = 4; | ||||
| 			memset(_uvs[n], 0, sizeof(vec4) * _capacity); | ||||
| 		} | ||||
| 	} else { | ||||
| 		_data->tvarray = nullptr; | ||||
| 	} | ||||
| 
 | ||||
| 	// Allocate GPU
 | ||||
| 	auto gctx = gs::context(); | ||||
| 	_buffer   = gs_vertexbuffer_create(_data, GS_DYNAMIC); | ||||
|  | @ -130,29 +133,30 @@ gs::vertex_buffer::vertex_buffer(uint32_t vertices, uint8_t uvlayers) | |||
| 
 | ||||
| // cppcheck-suppress uninitMemberVar
 | ||||
| gs::vertex_buffer::vertex_buffer(gs_vertbuffer_t* vb) | ||||
| 	: _size(0), _capacity(0), _layers(0), _positions(nullptr), _normals(nullptr), _tangents(nullptr), _colors(nullptr), | ||||
| 	  _uvs(), _data(nullptr), _buffer(nullptr), _layer_data(nullptr) | ||||
| { | ||||
| 	auto        gctx = gs::context(); | ||||
| 	gs_vb_data* vbd  = gs_vertexbuffer_get_data(vb); | ||||
| 	if (!vbd) | ||||
| 		throw std::runtime_error("vertex buffer with no data"); | ||||
| 
 | ||||
| 	vertex_buffer((uint32_t)vbd->num); | ||||
| 	this->set_uv_layers((uint32_t)vbd->num_tex); | ||||
| 	initialize(vbd->num, vbd->num_tex); | ||||
| 
 | ||||
| 	if (vbd->points != nullptr) | ||||
| 	if (_positions && vbd->points) | ||||
| 		memcpy(_positions, vbd->points, vbd->num * sizeof(vec3)); | ||||
| 	if (vbd->normals != nullptr) | ||||
| 	if (_normals && vbd->normals) | ||||
| 		memcpy(_normals, vbd->normals, vbd->num * sizeof(vec3)); | ||||
| 	if (vbd->tangents != nullptr) | ||||
| 	if (_tangents && vbd->tangents) | ||||
| 		memcpy(_tangents, vbd->tangents, vbd->num * sizeof(vec3)); | ||||
| 	if (vbd->colors != nullptr) | ||||
| 	if (_colors && vbd->colors) | ||||
| 		memcpy(_colors, vbd->colors, vbd->num * sizeof(uint32_t)); | ||||
| 	if (vbd->tvarray != nullptr) { | ||||
| 		for (size_t n = 0; n < vbd->num_tex; n++) { | ||||
| 			if (vbd->tvarray[n].array != nullptr && vbd->tvarray[n].width <= 4 && vbd->tvarray[n].width > 0) { | ||||
| 				if (vbd->tvarray[n].width == 4) { | ||||
| 					memcpy(_uvs[n], vbd->tvarray[n].array, vbd->num * sizeof(vec4)); | ||||
| 				} else { | ||||
| 				} else if (vbd->tvarray[n].width < 4) { | ||||
| 					for (size_t idx = 0; idx < _capacity; idx++) { | ||||
| 						float* mem = reinterpret_cast<float*>(vbd->tvarray[n].array) + (idx * vbd->tvarray[n].width); | ||||
| 						// cppcheck-suppress memsetClassFloat
 | ||||
|  | @ -178,7 +182,7 @@ gs::vertex_buffer::vertex_buffer(vertex_buffer const& other) : vertex_buffer(oth | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| gs::vertex_buffer::vertex_buffer(vertex_buffer const&& other) | ||||
| gs::vertex_buffer::vertex_buffer(vertex_buffer const&& other) noexcept : _uvs() | ||||
| { | ||||
| 	// Move Constructor
 | ||||
| 	_capacity  = other._capacity; | ||||
|  | @ -187,6 +191,7 @@ gs::vertex_buffer::vertex_buffer(vertex_buffer const&& other) | |||
| 	_positions = other._positions; | ||||
| 	_normals   = other._normals; | ||||
| 	_tangents  = other._tangents; | ||||
| 	_colors    = other._colors; | ||||
| 	for (size_t n = 0; n < MAXIMUM_UVW_LAYERS; n++) { | ||||
| 		_uvs[n] = other._uvs[n]; | ||||
| 	} | ||||
|  | @ -195,7 +200,7 @@ gs::vertex_buffer::vertex_buffer(vertex_buffer const&& other) | |||
| 	_layer_data = other._layer_data; | ||||
| } | ||||
| 
 | ||||
| void gs::vertex_buffer::operator=(vertex_buffer const&& other) | ||||
| void gs::vertex_buffer::operator=(vertex_buffer const&& other) noexcept | ||||
| { | ||||
| 	// Move Assignment
 | ||||
| 	/// First self-destruct (semi-destruct itself).
 | ||||
|  |  | |||
|  | @ -52,6 +52,8 @@ namespace gs { | |||
| 		gs_vertbuffer_t* _buffer; | ||||
| 		gs_tvertarray*   _layer_data; | ||||
| 
 | ||||
| 		void initialize(size_t capacity, size_t layers); | ||||
| 
 | ||||
| 		public: | ||||
| 		virtual ~vertex_buffer(); | ||||
| 
 | ||||
|  | @ -109,7 +111,7 @@ namespace gs { | |||
| 		* | ||||
| 		* \param other | ||||
| 		*/ | ||||
| 		vertex_buffer(vertex_buffer const&& other); | ||||
| 		vertex_buffer(vertex_buffer const&& other) noexcept; | ||||
| 
 | ||||
| 		/*!
 | ||||
| 		* \brief Move Assignment | ||||
|  | @ -117,7 +119,7 @@ namespace gs { | |||
| 		* | ||||
| 		* \param other | ||||
| 		*/ | ||||
| 		void operator=(vertex_buffer const&& other); | ||||
| 		void operator=(vertex_buffer const&& other) noexcept; | ||||
| 
 | ||||
| 		void resize(uint32_t new_size); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue