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"
 |