93 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| 
 | |
| // STD
 | |
| #include <vector>
 | |
| #include <queue>
 | |
| #include <string>
 | |
| #include <cassert>
 | |
| #include <cmath>
 | |
| #include <cstring>
 | |
| #include <memory>
 | |
| 
 | |
| #include "../type.hpp"
 | |
| #include "../format.hpp"
 | |
| 
 | |
| // GLM
 | |
| #include <glm/gtc/round.hpp>
 | |
| #include <glm/gtx/component_wise.hpp>
 | |
| #include <glm/gtx/integer.hpp>
 | |
| #include <glm/gtx/bit.hpp>
 | |
| #include <glm/gtx/raw_data.hpp>
 | |
| #include <glm/gtx/wrap.hpp>
 | |
| 
 | |
| static_assert(GLM_VERSION >= 97, "GLI requires at least GLM 0.9.7");
 | |
| 
 | |
| namespace gli
 | |
| {
 | |
| 	class storage_linear
 | |
| 	{
 | |
| 	public:
 | |
| 		typedef extent3d extent_type;
 | |
| 		typedef size_t size_type;
 | |
| 		typedef gli::format format_type;
 | |
| 		typedef glm::byte data_type;
 | |
| 
 | |
| 	public:
 | |
| 		storage_linear();
 | |
| 
 | |
| 		storage_linear(
 | |
| 			format_type Format,
 | |
| 			extent_type const & Extent,
 | |
| 			size_type Layers,
 | |
| 			size_type Faces,
 | |
| 			size_type Levels);
 | |
| 
 | |
| 		bool empty() const;
 | |
| 		size_type size() const; // Express is bytes
 | |
| 		size_type layers() const;
 | |
| 		size_type levels() const;
 | |
| 		size_type faces() const;
 | |
| 
 | |
| 		size_type block_size() const;
 | |
| 		extent_type block_extent() const;
 | |
| 		extent_type block_count(size_type Level) const;
 | |
| 		extent_type extent(size_type Level) const;
 | |
| 
 | |
| 		data_type* data();
 | |
| 		data_type const* const data() const;
 | |
| 
 | |
| 		/// Compute the relative memory offset to access the data for a specific layer, face and level
 | |
| 		size_type base_offset(
 | |
| 			size_type Layer,
 | |
| 			size_type Face,
 | |
| 			size_type Level) const;
 | |
| 
 | |
| 		/// Copy a subset of a specific image of a texture 
 | |
| 		void copy(
 | |
| 			storage_linear const& StorageSrc,
 | |
| 			size_t LayerSrc, size_t FaceSrc, size_t LevelSrc, extent_type const& BlockIndexSrc,
 | |
| 			size_t LayerDst, size_t FaceDst, size_t LevelDst, extent_type const& BlockIndexDst,
 | |
| 			extent_type const& BlockCount);
 | |
| 
 | |
| 		size_type level_size(
 | |
| 			size_type Level) const;
 | |
| 		size_type face_size(
 | |
| 			size_type BaseLevel, size_type MaxLevel) const;
 | |
| 		size_type layer_size(
 | |
| 			size_type BaseFace, size_type MaxFace,
 | |
| 			size_type BaseLevel, size_type MaxLevel) const;
 | |
| 
 | |
| 	private:
 | |
| 		size_type const Layers;
 | |
| 		size_type const Faces;
 | |
| 		size_type const Levels;
 | |
| 		size_type const BlockSize;
 | |
| 		extent_type const BlockCount;
 | |
| 		extent_type const BlockExtent;
 | |
| 		extent_type const Extent;
 | |
| 		std::vector<data_type> Data;
 | |
| 	};
 | |
| }//namespace gli
 | |
| 
 | |
| #include "storage_linear.inl"
 | 
