diff --git a/CMakeLists.txt b/CMakeLists.txt index 3679967b..f28155af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,7 @@ if(CMAKE_COMPILER_IS_GNUCXX) endif() include_directories(".") +include_directories("./test/extenal") add_subdirectory(glm) add_subdirectory(test) diff --git a/glm/glm.hpp b/glm/glm.hpp index c6add60f..7380a718 100644 --- a/glm/glm.hpp +++ b/glm/glm.hpp @@ -73,12 +73,6 @@ /// These templetes are implementation details of GLM types and should not be used explicitly. /// /// @ingroup core -/// -/// @defgroup core_funcs Functions -/// -/// @brief The functions defined by the specification. -/// -/// @ingroup core /////////////////////////////////////////////////////////////////////////////////// #include "core/_fixes.hpp" diff --git a/test/external/gli/CMakeLists.txt b/test/external/gli/CMakeLists.txt new file mode 100644 index 00000000..6b91c288 --- /dev/null +++ b/test/external/gli/CMakeLists.txt @@ -0,0 +1,27 @@ +set(NAME gli) + +file(GLOB ROOT_SOURCE *.cpp) +file(GLOB ROOT_INLINE *.inl) +file(GLOB ROOT_HEADER *.hpp) + +file(GLOB_RECURSE CORE_SOURCE ./core/*.cpp) +file(GLOB_RECURSE CORE_INLINE ./core/*.inl) +file(GLOB_RECURSE CORE_HEADER ./core/*.hpp) + +file(GLOB_RECURSE GTX_SOURCE ./gtx/*.cpp) +file(GLOB_RECURSE GTX_INLINE ./gtx/*.inl) +file(GLOB_RECURSE GTX_HEADER ./gtx/*.hpp) + +source_group("Core Files" FILES ${CORE_SOURCE}) +source_group("Core Files" FILES ${CORE_INLINE}) +source_group("Core Files" FILES ${CORE_HEADER}) +source_group("GTX Files" FILES ${GTX_SOURCE}) +source_group("GTX Files" FILES ${GTX_INLINE}) +source_group("GTX Files" FILES ${GTX_HEADER}) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..) + +add_executable(${NAME} + ${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER} + ${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER} + ${GTX_SOURCE} ${GTX_INLINE} ${GTX_HEADER} ) diff --git a/test/external/gli/core/dummy.cpp b/test/external/gli/core/dummy.cpp new file mode 100644 index 00000000..0395e23b --- /dev/null +++ b/test/external/gli/core/dummy.cpp @@ -0,0 +1,4 @@ +int main() +{ + +} diff --git a/test/external/gli/core/generate_mipmaps.hpp b/test/external/gli/core/generate_mipmaps.hpp new file mode 100644 index 00000000..43409360 --- /dev/null +++ b/test/external/gli/core/generate_mipmaps.hpp @@ -0,0 +1,25 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2010-09-27 +// Updated : 2010-09-27 +// Licence : This source is under MIT License +// File : gli/core/generate_mipmaps.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLI_GENERATE_MIPMAPS_INCLUDED +#define GLI_GENERATE_MIPMAPS_INCLUDED + +#include "texture2d.hpp" + +namespace gli +{ + texture2D generateMipmaps( + texture2D const & Texture, + texture2D::level_type const & BaseLevel); + +}//namespace gli + +#include "generate_mipmaps.inl" + +#endif//GLI_GENERATE_MIPMAPS_INCLUDED diff --git a/test/external/gli/core/generate_mipmaps.inl b/test/external/gli/core/generate_mipmaps.inl new file mode 100644 index 00000000..93e535b6 --- /dev/null +++ b/test/external/gli/core/generate_mipmaps.inl @@ -0,0 +1,69 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2010-09-27 +// Updated : 2010-09-27 +// Licence : This source is under MIT License +// File : gli/core/generate_mipmaps.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace gli +{ + inline texture2D generateMipmaps + ( + texture2D const & Image, + texture2D::level_type const & BaseLevel + ) + { + assert(BaseLevel < Image.levels()); + texture2D::format_type Format = Image[BaseLevel].format(); + + assert(Format == R8U || Format == RG8U || Format == RGB8U || Format == RGBA8U); + texture2D::level_type Levels = std::size_t(glm::log2(float(glm::compMax(Image[0].dimensions())))) + 1; + + texture2D Result(Levels); + for(texture2D::level_type Level = 0; Level <= BaseLevel; ++Level) + Result[Level] = detail::duplicate(Image[Level]); + + for(texture2D::level_type Level = BaseLevel; Level < Levels - 1; ++Level) + { + std::size_t BaseWidth = Result[Level + 0].dimensions().x; + texture2D::value_type * DataSrc = Result[Level + 0].data(); + + texture2D::dimensions_type LevelDimensions = Result[Level + 0].dimensions() >> texture2D::dimensions_type(1); + LevelDimensions = glm::max(LevelDimensions, texture2D::dimensions_type(1)); + texture2D::size_type ValueSize = Result[Level + 0].value_size(); + texture2D::size_type Components = Result[Level + 0].components(); + + texture2D::data_type DataDst(glm::compMul(LevelDimensions) * Components); + + for(std::size_t j = 0; j < LevelDimensions.y; ++j) + for(std::size_t i = 0; i < LevelDimensions.x; ++i) + for(std::size_t c = 0; c < Components; ++c) + { + std::size_t x = (i << 1); + std::size_t y = (j << 1); + + std::size_t Index00 = ((x + 0) + (y + 0) * BaseWidth) * Components + c; + std::size_t Index01 = ((x + 0) + (y + 1) * BaseWidth) * Components + c; + std::size_t Index11 = ((x + 1) + (y + 1) * BaseWidth) * Components + c; + std::size_t Index10 = ((x + 1) + (y + 0) * BaseWidth) * Components + c; + + glm::u32 Data00 = reinterpret_cast(DataSrc)[Index00]; + glm::u32 Data01 = reinterpret_cast(DataSrc)[Index01]; + glm::u32 Data11 = reinterpret_cast(DataSrc)[Index11]; + glm::u32 Data10 = reinterpret_cast(DataSrc)[Index10]; + + texture2D::value_type Result = (Data00 + Data01 + Data11 + Data10) >> 2; + texture2D::value_type * Data = reinterpret_cast(DataDst.data()); + + *(Data + ((i + j * LevelDimensions.x) * Components + c)) = Result; + } + + Result[Level + 1] = image2D(LevelDimensions, Format, DataDst); + } + + return Result; + } + +}//namespace gli diff --git a/test/external/gli/core/image2d.hpp b/test/external/gli/core/image2d.hpp new file mode 100644 index 00000000..918514d5 --- /dev/null +++ b/test/external/gli/core/image2d.hpp @@ -0,0 +1,169 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2011-04-05 +// Updated : 2011-04-05 +// Licence : This source is under MIT License +// File : gli/core/image2d.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLI_CORE_IMAGE2D_INCLUDED +#define GLI_CORE_IMAGE2D_INCLUDED + +// STD +#include +#include +#include +#include + +// GLM +#include +#include +#include +#include +#include + +namespace gli +{ + enum format + { + FORMAT_NULL, + + // Unsigned integer formats + R8U, + RG8U, + RGB8U, + RGBA8U, + + R16U, + RG16U, + RGB16U, + RGBA16U, + + R32U, + RG32U, + RGB32U, + RGBA32U, + + // Signed integer formats + R8I, + RG8I, + RGB8I, + RGBA8I, + + R16I, + RG16I, + RGB16I, + RGBA16I, + + R32I, + RG32I, + RGB32I, + RGBA32I, + + // Floating formats + R16F, + RG16F, + RGB16F, + RGBA16F, + + R32F, + RG32F, + RGB32F, + RGBA32F, + + // Packed formats + RGBE8, + RGB9E5, + RG11B10F, + R5G6B5, + RGBA4, + RGB10A2, + + // Depth formats + D16, + D24X8, + D24S8, + D32F, + D32FS8X24, + + // Compressed formats + DXT1, + DXT3, + DXT5, + ATI1N_UNORM, + ATI1N_SNORM, + ATI2N_UNORM, + ATI2N_SNORM, + BP_UF16, + BP_SF16, + BP, + + FORMAT_MAX + }; + + enum size_type + { + LINEAR_SIZE, + BLOCK_SIZE, + BIT_PER_PIXEL, + COMPONENT + }; + + class image2D + { + public: + typedef glm::uvec2 dimensions_type; + typedef glm::vec2 texcoord_type; + typedef glm::uint32 size_type; + typedef glm::byte value_type; + typedef gli::format format_type; + typedef std::vector data_type; + + public: + image2D(); + image2D( + image2D const & Image); + + explicit image2D( + dimensions_type const & Dimensions, + format_type const & Format); + + template + explicit image2D( + dimensions_type const & Dimensions, + format_type const & Format, + genType const & Value); + + explicit image2D( + dimensions_type const & Dimensions, + format_type const & Format, + std::vector const & Data); + + ~image2D(); + + template + void setPixel( + dimensions_type const & TexelCoord, + genType const & TexelData); + + size_type value_size() const; + size_type capacity() const; + dimensions_type dimensions() const; + size_type components() const; + format_type format() const; + + value_type * data(); + value_type const * const data() const; + + private: + data_type Data; + dimensions_type Dimensions; + format_type Format; + }; + +}//namespace gli + +#include "image2d.inl" + +#endif//GLI_CORE_IMAGE2D_INCLUDED diff --git a/test/external/gli/core/image2d.inl b/test/external/gli/core/image2d.inl new file mode 100644 index 00000000..f363e022 --- /dev/null +++ b/test/external/gli/core/image2d.inl @@ -0,0 +1,231 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2011-04-05 +// Updated : 2011-04-05 +// Licence : This source is under MIT License +// File : gli/core/image2d.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace gli +{ + namespace detail + { + struct format_desc + { + image2D::size_type BlockSize; + image2D::size_type BBP; + image2D::size_type Component; + }; + + inline format_desc getFormatInfo(format const & Format) + { + format_desc Desc[FORMAT_MAX] = + { + { 0, 0, 0}, //FORMAT_NULL + + // Unsigned integer formats + { 1, 8, 1}, //R8U, + { 2, 16, 2}, //RG8U, + { 3, 24, 3}, //RGB8U, + { 4, 32, 4}, //RGBA8U, + + { 2, 16, 1}, //R16U, + { 4, 32, 2}, //RG16U, + { 6, 48, 3}, //RGB16U, + { 8, 64, 4}, //RGBA16U, + + { 4, 32, 1}, //R32U, + { 8, 64, 2}, //RG32U, + { 12, 96, 3}, //RGB32U, + { 16, 128, 4}, //RGBA32U, + + //// Signed integer formats + { 4, 32, 1}, //R8I, + { 8, 64, 2}, //RG8I, + { 12, 96, 3}, //RGB8I, + { 16, 128, 4}, //RGBA8I, + + { 2, 16, 1}, //R16I, + { 4, 32, 2}, //RG16I, + { 6, 48, 3}, //RGB16I, + { 8, 64, 4}, //RGBA16I, + + { 4, 32, 1}, //R32I, + { 8, 64, 2}, //RG32I, + { 12, 96, 3}, //RGB32I, + { 16, 128, 4}, //RGBA32I, + + //// Floating formats + { 2, 16, 1}, //R16F, + { 4, 32, 2}, //RG16F, + { 6, 48, 3}, //RGB16F, + { 8, 64, 4}, //RGBA16F, + + { 4, 32, 1}, //R32F, + { 8, 64, 2}, //RG32F, + { 12, 96, 3}, //RGB32F, + { 16, 128, 4}, //RGBA32F, + + //// Packed formats + { 4, 32, 3}, //RGBE8, + { 4, 32, 3}, //RGB9E5, + { 4, 32, 3}, //RG11B10F, + { 2, 16, 3}, //R5G6B5, + { 2, 16, 4}, //RGBA4, + { 4, 32, 3}, //RGB10A2, + + //// Depth formats + { 2, 16, 1}, //D16, + { 4, 32, 1}, //D24X8, + { 4, 32, 2}, //D24S8, + { 4, 32, 1}, //D32F, + { 8, 64, 2}, //D32FS8X24, + + //// Compressed formats + { 8, 4, 4}, //DXT1, + { 16, 8, 4}, //DXT3, + { 16, 8, 4}, //DXT5, + { 8, 4, 1}, //ATI1N_UNORM, + { 8, 4, 1}, //ATI1N_SNORM, + { 16, 8, 2}, //ATI2N_UNORM, + { 16, 8, 2}, //ATI2N_SNORM, + { 16, 8, 3}, //BP_UF16, + { 16, 8, 3}, //BP_SF16, + { 16, 8, 4}, //BP, + }; + + return Desc[Format]; + }; + + inline image2D::size_type sizeBlock + ( + format const & Format + ) + { + return getFormatInfo(Format).BlockSize; + } + + inline image2D::size_type sizeBitPerPixel + ( + format const & Format + ) + { + return getFormatInfo(Format).BBP; + } + + inline image2D::size_type sizeComponent + ( + format const & Format + ) + { + return getFormatInfo(Format).Component; + } + + inline image2D::size_type sizeLinear + ( + image2D const & Image + ) + { + image2D::dimensions_type Dimension = Image.dimensions(); + Dimension = glm::max(Dimension, image2D::dimensions_type(1)); + + image2D::size_type BlockSize = sizeBlock(Image.format()); + image2D::size_type BPP = sizeBitPerPixel(Image.format()); + image2D::size_type BlockCount = 0; + if((BlockSize << 3) == BPP) + BlockCount = Dimension.x * Dimension.y; + else + BlockCount = ((Dimension.x + 3) >> 2) * ((Dimension.y + 3) >> 2); + + return BlockCount * BlockSize; + } + }//namespace detail + + inline image2D::image2D() : + Data(0), + Dimensions(0), + Format(FORMAT_NULL) + {} + + inline image2D::image2D + ( + image2D const & Image + ) : + Data(Image.Data), + Dimensions(Image.Dimensions), + Format(Image.Format) + {} + + inline image2D::image2D + ( + dimensions_type const & Dimensions, + format_type const & Format + ) : + Data((glm::compMul(Dimensions) * detail::sizeBitPerPixel(Format)) >> 3), + Dimensions(Dimensions), + Format(Format) + { + std::size_t Size = (glm::compMul(Dimensions) * detail::sizeBitPerPixel(Format)) >> 3; + } + + inline image2D::image2D + ( + dimensions_type const & Dimensions, + format_type const & Format, + std::vector const & Data + ) : + Data(Data), + Dimensions(Dimensions), + Format(Format) + {} + + inline image2D::~image2D() + {} + + template + inline void image2D::setPixel + ( + dimensions_type const & TexelCoord, + genType const & TexelData + ) + { + size_type Index = this->dimensions().x * sizeof(genType) * TexelCoord.y + sizeof(genType) * TexelCoord.x; + memcpy(this->data() + Index, &TexelData[0], sizeof(genType)); + } + + inline image2D::size_type image2D::value_size() const + { + return detail::sizeBitPerPixel(this->format()); + } + + inline image2D::size_type image2D::capacity() const + { + return detail::sizeLinear(*this); + } + + inline image2D::dimensions_type image2D::dimensions() const + { + return this->Dimensions; + } + + inline image2D::size_type image2D::components() const + { + return detail::sizeComponent(this->format()); + } + + inline image2D::format_type image2D::format() const + { + return this->Format; + } + + inline image2D::value_type * image2D::data() + { + return &this->Data[0]; + } + + inline image2D::value_type const * const image2D::data() const + { + return &this->Data[0]; + } +}//namespace gli diff --git a/test/external/gli/core/operation.hpp b/test/external/gli/core/operation.hpp new file mode 100644 index 00000000..c23c29d7 --- /dev/null +++ b/test/external/gli/core/operation.hpp @@ -0,0 +1,82 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-12-19 +// Updated : 2010-01-09 +// Licence : This source is under MIT License +// File : gli/operation.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLI_OPERATION_INCLUDED +#define GLI_OPERATION_INCLUDED + +#include "texture2d.hpp" + +namespace gli +{ + texture2D duplicate(texture2D const & Texture); + texture2D flip(texture2D const & Texture); + texture2D mirror(texture2D const & Texture); + texture2D swizzle( + texture2D const & Texture, + glm::uvec4 const & Channel); + texture2D crop( + texture2D const & Texture, + texture2D::dimensions_type const & Position, + texture2D::dimensions_type const & Size); + + image2D crop( + image2D const & Image, + texture2D::dimensions_type const & Position, + texture2D::dimensions_type const & Size); + + image2D copy( + image2D const & SrcImage, + image2D::dimensions_type const & SrcPosition, + image2D::dimensions_type const & SrcSize, + image2D & DstImage, + image2D::dimensions_type const & DstPosition); + + //image operator+(image const & MipmapA, image const & MipmapB); + //image operator-(image const & MipmapA, image const & MipmapB); + //image operator*(image const & MipmapA, image const & MipmapB); + //image operator/(image const & MipmapA, image const & MipmapB); + + //namespace wip + //{ + // template class SURFACE> + // GENTYPE fetch(SURFACE const & Image) + // { + // return GENTYPE(); + // } + + // template + // < + // typename GENTYPE, + // template + // < + // typename + // > + // class SURFACE, + // template + // < + // typename, + // template + // < + // typename + // > + // class + // > + // class IMAGE + // > + // GENTYPE fetch(IMAGE const & Image) + // { + // return GENTYPE(); + // } + //}//namespace wip + +}//namespace gli + +#include "operation.inl" + +#endif//GLI_OPERATION_INCLUDED diff --git a/test/external/gli/core/operation.inl b/test/external/gli/core/operation.inl new file mode 100644 index 00000000..87999a81 --- /dev/null +++ b/test/external/gli/core/operation.inl @@ -0,0 +1,233 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-12-19 +// Updated : 2010-09-08 +// Licence : This source is under MIT License +// File : gli/core/operation.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#include + +namespace gli +{ + namespace detail + { + inline image2D duplicate(image2D const & Mipmap2D) + { + image2D Result(Mipmap2D.dimensions(), Mipmap2D.format()); + memcpy(Result.data(), Mipmap2D.data(), Mipmap2D.capacity()); + return Result; + } + + inline image2D flip(image2D const & Mipmap2D) + { + image2D Result(Mipmap2D.dimensions(), Mipmap2D.format()); + + std::size_t ValueSize = Result.value_size(); + glm::byte * DstPtr = Result.data(); + glm::byte const * const SrcPtr = Mipmap2D.data(); + + for(std::size_t j = 0; j < Result.dimensions().y; ++j) + for(std::size_t i = 0; i < Result.dimensions().x; ++i) + { + std::size_t DstIndex = (i + j * Result.dimensions().y) * ValueSize; + std::size_t SrcIndex = (i + (Result.dimensions().y - j) * Result.dimensions().x) * ValueSize; + memcpy(DstPtr + DstIndex, SrcPtr + SrcIndex, ValueSize); + } + + return Result; + } + + inline image2D mirror(image2D const & Mipmap2D) + { + image2D Result(Mipmap2D.dimensions(), Mipmap2D.format()); + + std::size_t ValueSize = Mipmap2D.value_size(); + glm::byte * DstPtr = Result.data(); + glm::byte const * const SrcPtr = Mipmap2D.data(); + + for(std::size_t j = 0; j < Result.dimensions().y; ++j) + for(std::size_t i = 0; i < Result.dimensions().x; ++i) + { + std::size_t DstIndex = (i + j * Result.dimensions().x) * ValueSize; + std::size_t SrcIndex = ((Result.dimensions().x - i) + j * Result.dimensions().x) * ValueSize; + memcpy(DstPtr + DstIndex, SrcPtr + SrcIndex, ValueSize); + } + + return Result; + } + + inline image2D swizzle + ( + image2D const & Mipmap, + glm::uvec4 const & Channel + ) + { + image2D Result = detail::duplicate(Mipmap); + + glm::byte * DataDst = Result.data(); + glm::byte const * const DataSrc = Mipmap.data(); + + gli::texture2D::size_type CompSize = Mipmap.value_size() / Mipmap.components(); + gli::texture2D::size_type TexelCount = Mipmap.capacity() / Mipmap.value_size(); + + for(gli::texture2D::size_type t = 0; t < TexelCount; ++t) + for(gli::texture2D::size_type c = 0; c < Mipmap.components(); ++c) + { + gli::texture2D::size_type IndexSrc = t * Mipmap.components() + Channel[glm::uvec4::size_type(c)]; + gli::texture2D::size_type IndexDst = t * Mipmap.components() + c; + + memcpy(DataDst + IndexDst, DataSrc + IndexSrc, CompSize); + } + + return Result; + } + + inline image2D crop + ( + image2D const & Image, + image2D::dimensions_type const & Position, + image2D::dimensions_type const & Size + ) + { + assert((Position.x + Size.x) <= Image.dimensions().x && (Position.y + Size.y) <= Image.dimensions().y); + + image2D Result(Size, Image.format()); + + glm::byte* DstData = Result.data(); + glm::byte const * const SrcData = Image.data(); + + for(std::size_t j = 0; j < Size.y; ++j) + { + std::size_t DstIndex = 0 + (0 + j) * Size.x * Image.value_size(); + std::size_t SrcIndex = Position.x * Image.value_size() + (Position.y + j) * Image.dimensions().x * Image.value_size(); + memcpy(DstData + DstIndex, SrcData + SrcIndex, Image.value_size() * Size.x); + } + + return Result; + } + + inline image2D copy + ( + image2D const & SrcMipmap, + image2D::dimensions_type const & SrcPosition, + image2D::dimensions_type const & SrcSize, + image2D & DstMipmap, + image2D::dimensions_type const & DstPosition + ) + { + assert((SrcPosition.x + SrcSize.x) <= SrcMipmap.dimensions().x && (SrcPosition.y + SrcSize.y) <= SrcMipmap.dimensions().y); + assert(SrcMipmap.format() == DstMipmap.format()); + + glm::byte * DstData = DstMipmap.data(); + glm::byte const * const SrcData = SrcMipmap.data(); + + std::size_t SizeX = std::min(std::size_t(SrcSize.x + SrcPosition.x), std::size_t(DstMipmap.dimensions().x + DstPosition.x)); + std::size_t SizeY = std::min(std::size_t(SrcSize.y + SrcPosition.y), std::size_t(DstMipmap.dimensions().y + DstPosition.y)); + + for(std::size_t j = 0; j < SizeY; ++j) + { + std::size_t DstIndex = DstPosition.x * DstMipmap.value_size() + (DstPosition.y + j) * DstMipmap.dimensions().x * DstMipmap.value_size(); + std::size_t SrcIndex = SrcPosition.x * SrcMipmap.value_size() + (SrcPosition.y + j) * SrcMipmap.dimensions().x * SrcMipmap.value_size(); + memcpy(DstData + DstIndex, SrcData + SrcIndex, SrcMipmap.value_size() * SizeX); + } + + return DstMipmap; + } + + }//namespace detail + + inline texture2D duplicate(texture2D const & Texture2D) + { + texture2D Result(Texture2D.levels()); + for(texture2D::level_type Level = 0; Level < Texture2D.levels(); ++Level) + Result[Level] = detail::duplicate(Texture2D[Level]); + return Result; + } + + inline texture2D flip(texture2D const & Texture2D) + { + texture2D Result(Texture2D.levels()); + for(texture2D::level_type Level = 0; Level < Texture2D.levels(); ++Level) + Result[Level] = detail::flip(Texture2D[Level]); + return Result; + } + + inline texture2D mirror(texture2D const & Texture2D) + { + texture2D Result(Texture2D.levels()); + for(texture2D::level_type Level = 0; Level < Texture2D.levels(); ++Level) + Result[Level] = detail::mirror(Texture2D[Level]); + return Result; + } + + inline texture2D crop + ( + texture2D const & Texture2D, + texture2D::dimensions_type const & Position, + texture2D::dimensions_type const & Size + ) + { + texture2D Result(Texture2D.levels()); + for(texture2D::level_type Level = 0; Level < Texture2D.levels(); ++Level) + Result[Level] = detail::crop( + Texture2D[Level], + Position >> texture2D::dimensions_type(Level), + Size >> texture2D::dimensions_type(Level)); + return Result; + } + + inline texture2D swizzle + ( + texture2D const & Texture2D, + glm::uvec4 const & Channel + ) + { + texture2D Result(Texture2D.levels()); + for(texture2D::level_type Level = 0; Level < Texture2D.levels(); ++Level) + Result[Level] = detail::swizzle(Texture2D[Level], Channel); + return Result; + } + + inline texture2D copy + ( + texture2D const & SrcImage, + texture2D::level_type const & SrcLevel, + texture2D::dimensions_type const & SrcPosition, + texture2D::dimensions_type const & SrcDimensions, + texture2D & DstMipmap, + texture2D::level_type const & DstLevel, + texture2D::dimensions_type const & DstDimensions + ) + { + detail::copy( + SrcImage[SrcLevel], + SrcPosition, + SrcDimensions, + DstMipmap[DstLevel], + DstDimensions); + return DstMipmap; + } + + //inline image operator+(image const & MipmapA, image const & MipmapB) + //{ + // + //} + + //inline image operator-(image const & MipmapA, image const & MipmapB) + //{ + // + //} + + //inline image operator*(image const & MipmapA, image const & MipmapB) + //{ + // + //} + + //inline image operator/(image const & MipmapA, image const & MipmapB) + //{ + // + //} + +}//namespace gli diff --git a/test/external/gli/core/operator.hpp b/test/external/gli/core/operator.hpp new file mode 100644 index 00000000..46f27321 --- /dev/null +++ b/test/external/gli/core/operator.hpp @@ -0,0 +1,28 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2010-01-19 +// Updated : 2010-01-19 +// Licence : This source is under MIT License +// File : gli/core/operator.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLI_OPERATOR_INCLUDED +#define GLI_OPERATOR_INCLUDED + +#include "texture2d.hpp" + +namespace gli{ +namespace detail +{ + +}//namespace detail + + texture2D operator+(texture2D const & TextureA, texture2D const & TextureB); + texture2D operator-(texture2D const & TextureA, texture2D const & TextureB); + +}//namespace gli + +#include "operator.inl" + +#endif//GLI_OPERATOR_INCLUDED diff --git a/test/external/gli/core/operator.inl b/test/external/gli/core/operator.inl new file mode 100644 index 00000000..1ac83281 --- /dev/null +++ b/test/external/gli/core/operator.inl @@ -0,0 +1,210 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2010-01-19 +// Updated : 2010-01-19 +// Licence : This source is under MIT License +// File : gli/core/operator.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace gli +{ + namespace detail + { + template + void element + ( + T & DataDst, + T const & DataSrcA, + T const & DataSrcB, + std::binary_function const & Func + ) + { + *DataDst = Func(DataSrcA, DataSrcB); + } + + void op + ( + texture2D::value_type * DataDst, + texture2D::value_type const * const DataSrcA, + texture2D::value_type const * const DataSrcB, + format Format + ) + { + std::plus<>() + switch(Format) + { + case R8U: + *((glm::u8*)DataDst) = *((glm::u8*)DataSrcA) + *((glm::u8*)DataSrcB); + break; + case RG8U: + *((glm::u8vec2*)DataDst) = *((glm::u8vec2*)DataSrcA) + *((glm::u8vec2*)DataSrcB); + break; + case RGB8U: + *((glm::u8vec3*)DataDst) = *((glm::u8vec3*)DataSrcA) + *((glm::u8vec3*)DataSrcB); + break; + case RGBA8U: + *((glm::u8vec4*)DataDst) = *((glm::u8vec4*)DataSrcA) + *((glm::u8vec4*)DataSrcB); + break; + + case R16U: + *((glm::u16*)DataDst) = *((glm::u16*)DataSrcA) + *((glm::u16*)DataSrcB); + break; + case RG16U: + *((glm::u16vec2*)DataDst) = *((glm::u16vec2*)DataSrcA) + *((glm::u16vec2*)DataSrcB); + break; + case RGB16U: + *((glm::u16vec3*)DataDst) = *((glm::u16vec3*)DataSrcA) + *((glm::u16vec3*)DataSrcB); + break; + case RGBA16U: + *((glm::u16vec4*)DataDst) = *((glm::u16vec4*)DataSrcA) + *((glm::u16vec4*)DataSrcB); + break; + + case R32U: + *((glm::u32*)DataDst) = *((glm::u32*)DataSrcA) + *((glm::u32*)DataSrcB); + break; + case RG32U: + *((glm::u32vec2*)DataDst) = *((glm::u32vec2*)DataSrcA) + *((glm::u32vec2*)DataSrcB); + break; + case RGB32U: + *((glm::u32vec3*)DataDst) = *((glm::u32vec3*)DataSrcA) + *((glm::u32vec3*)DataSrcB); + break; + case RGBA32U: + *((glm::u32vec4*)DataDst) = *((glm::u32vec4*)DataSrcA) + *((glm::u32vec4*)DataSrcB); + break; + + case R8I: + *((glm::i8*)DataDst) = *((glm::i8*)DataSrcA) + *((glm::i8*)DataSrcB); + break; + case RG8I: + *((glm::i8vec2*)DataDst) = *((glm::i8vec2*)DataSrcA) + *((glm::i8vec2*)DataSrcB); + break; + case RGB8I: + *((glm::i8vec3*)DataDst) = *((glm::i8vec3*)DataSrcA) + *((glm::i8vec3*)DataSrcB); + break; + case RGBA8I: + *((glm::i8vec4*)DataDst) = *((glm::i8vec4*)DataSrcA) + *((glm::i8vec4*)DataSrcB); + break; + + case R16I: + *((glm::i16*)DataDst) = *((glm::i16*)DataSrcA) + *((glm::i16*)DataSrcB); + break; + case RG16I: + *((glm::i16vec2*)DataDst) = *((glm::i16vec2*)DataSrcA) + *((glm::i16vec2*)DataSrcB); + break; + case RGB16I: + *((glm::i16vec3*)DataDst) = *((glm::i16vec3*)DataSrcA) + *((glm::i16vec3*)DataSrcB); + break; + case RGBA16I: + *((glm::i16vec4*)DataDst) = *((glm::i16vec4*)DataSrcA) + *((glm::i16vec4*)DataSrcB); + break; + + case R32I: + *((glm::i32*)DataDst) = *((glm::i32*)DataSrcA) + *((glm::i32*)DataSrcB); + break; + case RG32I: + *((glm::i32vec2*)DataDst) = *((glm::i32vec2*)DataSrcA) + *((glm::i32vec2*)DataSrcB); + break; + case RGB32I: + *((glm::i32vec3*)DataDst) = *((glm::i32vec3*)DataSrcA) + *((glm::i32vec3*)DataSrcB); + break; + case RGBA32I: + *((glm::i32vec4*)DataDst) = *((glm::i32vec4*)DataSrcA) + *((glm::i32vec4*)DataSrcB); + break; + + case R16F: + *((glm::f16*)DataDst) = *((glm::f16*)DataSrcA) + *((glm::f16*)DataSrcB); + break; + case RG16F: + *((glm::f16vec2*)DataDst) = *((glm::f16vec2*)DataSrcA) + *((glm::f16vec2*)DataSrcB); + break; + case RGB16F: + *((glm::f16vec3*)DataDst) = *((glm::f16vec3*)DataSrcA) + *((glm::f16vec3*)DataSrcB); + break; + case RGBA16F: + *((glm::f16vec4*)DataDst) = *((glm::f16vec4*)DataSrcA) + *((glm::f16vec4*)DataSrcB); + break; + + case R32F: + *((glm::f32*)DataDst) = *((glm::f32*)DataSrcA) + *((glm::f32*)DataSrcB); + break; + case RG32F: + *((glm::f32vec2*)DataDst) = *((glm::f32vec2*)DataSrcA) + *((glm::f32vec2*)DataSrcB); + break; + case RGB32F: + *((glm::f32vec3*)DataDst) = *((glm::f32vec3*)DataSrcA) + *((glm::f32vec3*)DataSrcB); + break; + case RGBA32F: + *((glm::f32vec4*)DataDst) = *((glm::f32vec4*)DataSrcA) + *((glm::f32vec4*)DataSrcB); + break; + default: + assert(0); + } + } + + void add + ( + texture2D::image & Result, + texture2D::image const & ImageA, + texture2D::image const & ImageB, + ) + { + + } + + }//namespace detail + + texture2D operator+ + ( + texture2D const & ImageA, + texture2D const & ImageB + ) + { + assert(ImageA.levels() == ImageB.levels()); + texture2D Result[ImageA.levels()]; + + for(texture2D::level_type Level = 0; Level < Result.levels(); ++Level) + { + assert(ImageA.capacity() == ImageB.capacity()); + assert(ImageA.format() == ImageB.format()); + + Result[Level] = texture2D::image(ImageA[Level].dimensions(), ImageA[Level].format()); + + add(Result[Level], ImageA[Level], ImageB[Level]); + + texture2D::size_type ValueSize = Result.value_size(); + texture2D::size_type TexelCount = this->capacity() / ValueSize; + for(texture2D::size_type Texel = 0; Texel < TexelCount; ++Texel) + { + texture2D::value_type * DataDst = Result[Level].data() + Texel * ValueSize; + texture2D::value_type const * const DataSrcA = ImageA[Level].data() + Texel * ValueSize; + texture2D::value_type const * const DataSrcB = ImageB[Level].data() + Texel * ValueSize; + + detail::op(DataDst, DataSrcA, DataSrcB, Result.format(), std::plus); + } + } + + return Result; + } + + texture2D operator- + ( + texture2D const & ImageA, + texture2D const & ImageB + ) + { + assert(ImageA.levels() == ImageB.levels()); + texture2D Result[ImageA.levels()]; + + + for(texture2D::level_type Level = 0; Level < ImageA.levels(); ++Level) + { + assert(ImageA.capacity() == ImageB.capacity()); + + + } + + return Result; + } + +}//namespace gli diff --git a/test/external/gli/core/shared_array.hpp b/test/external/gli/core/shared_array.hpp new file mode 100644 index 00000000..326a54af --- /dev/null +++ b/test/external/gli/core/shared_array.hpp @@ -0,0 +1,48 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-12-19 +// Updated : 2005-06-13 +// Licence : This source is under MIT License +// File : gli/shared_array.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLI_SHARED_ARRAY_INCLUDED +#define GLI_SHARED_ARRAY_INCLUDED + +namespace gli +{ + template + class shared_array + { + public: + + shared_array(); + shared_array(shared_array const & SharedArray); + shared_array(T * Pointer); + virtual ~shared_array(); + + void reset(); + void reset(T * Pointer); + + T & operator*(); + T * operator->(); + T const & operator*() const; + T const * const operator->() const; + + T * get(); + T const * const get() const; + + shared_array & operator=(shared_array const & SharedArray); + bool operator==(shared_array const & SharedArray) const; + bool operator!=(shared_array const & SharedArray) const; + + private: + int * Counter; + T * Pointer; + }; +}//namespace gli + +#include "shared_array.inl" + +#endif //GLI_SHARED_ARRAY_INCLUDED diff --git a/test/external/gli/core/shared_array.inl b/test/external/gli/core/shared_array.inl new file mode 100644 index 00000000..74edbb4a --- /dev/null +++ b/test/external/gli/core/shared_array.inl @@ -0,0 +1,151 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-12-19 +// Updated : 2005-06-13 +// Licence : This source is under MIT License +// File : gli/shared_array.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace gli +{ + template + shared_array::shared_array() : + Counter(0), + Pointer(0) + {} + + template + shared_array::shared_array + ( + shared_array const & SharedArray + ) + { + this->Counter = SharedArray.Counter; + this->Pointer = SharedArray.Pointer; + (*this->Counter)++; + } + + template + shared_array::shared_array + ( + T * Pointer + ) + { + this->reset(Pointer); + } + + template + shared_array::~shared_array() + { + this->reset(); + } + + template + void shared_array::reset() + { + if(this->Pointer) + { + (*this->Counter)--; + if(*this->Counter <= 0) + { + delete this->Counter; + this->Counter = 0; + delete[] this->Pointer; + this->Pointer = 0; + } + } + } + + template + void shared_array::reset(T * Pointer) + { + this->Counter = new int; + this->Pointer = Pointer; + *this->Counter = 1; + } + + template + shared_array& shared_array::operator= + ( + shared_array const & SharedArray + ) + { + this->reset(); + + this->Counter = SharedArray.Counter; + this->Pointer = SharedArray.Pointer; + (*this->Counter)++; + + return *this; + } + + //template + //shared_array & shared_array::operator=(T * Pointer) + //{ + // if(this->Pointer) + // { + // (*this->Counter)--; + // if(*this->Counter <= 0) + // { + // delete this->Counter; + // delete[] this->Pointer; + // } + // } + + // this->Counter = new int; + // this->Pointer = this->Pointer; + // (*this->Counter) = 1; + + // return *this; + //} + + template + bool shared_array::operator==(shared_array const & SharedArray) const + { + return this->Pointer == SharedArray.Pointer; + } + + template + bool shared_array::operator!=(shared_array const & SharedArray) const + { + return this->Pointer != SharedArray.Pointer; + } + + template + T & shared_array::operator*() + { + return *this->Pointer; + } + + template + T * shared_array::operator->() + { + return this->Pointer; + } + + template + T const & shared_array::operator*() const + { + return * this->Pointer; + } + + template + T const * const shared_array::operator->() const + { + return this->Pointer; + } + + template + T * shared_array::get() + { + return this->Pointer; + } + + template + T const * const shared_array::get() const + { + return this->Pointer; + } + +}//namespace gli diff --git a/test/external/gli/core/shared_ptr.hpp b/test/external/gli/core/shared_ptr.hpp new file mode 100644 index 00000000..533e33f5 --- /dev/null +++ b/test/external/gli/core/shared_ptr.hpp @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-12-19 +// Updated : 2005-06-13 +// Licence : This source is under MIT License +// File : gli/fetch.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLI_SHARED_PTR_INCLUDED +#define GLI_SHARED_PTR_INCLUDED + +namespace gli +{ + template + class shared_ptr + { + public: + shared_ptr(); + shared_ptr(shared_ptr const & SmartPtr); + shared_ptr(T* pPointer); + ~shared_ptr(); + + T& operator*(); + T* operator->(); + const T& operator*() const; + const T* operator->() const; + shared_ptr& operator=(shared_ptr const & SmartPtr); + shared_ptr& operator=(T* pPointer); + bool operator==(shared_ptr const & SmartPtr) const; + bool operator!=(shared_ptr const & SmartPtr) const; + + private: + int* m_pReference; + T* m_pPointer; + }; +}//namespace gli + +#include "shared_ptr.inl" + +#endif //GLI_SHARED_PTR_INCLUDED diff --git a/test/external/gli/core/shared_ptr.inl b/test/external/gli/core/shared_ptr.inl new file mode 100644 index 00000000..43974110 --- /dev/null +++ b/test/external/gli/core/shared_ptr.inl @@ -0,0 +1,125 @@ +/////////////////////////////////////////////////////////////////////////// +// Interstate Gangs : smart_ptr.inl +/////////////////////////////////////////////////////////////////////////// +// This file is under GPL licence +/////////////////////////////////////////////////////////////////////////// +// CHANGELOG +// Groove - 13/06/2005 : +// - Create file +/////////////////////////////////////////////////////////////////////////// + +namespace gli +{ + template + util::CSmartPtr::CSmartPtr() + { + m_pPointer = 0; + } + + template + util::CSmartPtr::CSmartPtr(const util::CSmartPtr & SmartPtr) + { + m_pReference = SmartPtr.m_pReference; + m_pPointer = SmartPtr.m_pPointer; + (*m_pReference)++; + } + + template + util::CSmartPtr::CSmartPtr(T* pPointer) + { + m_pReference = new int; + m_pPointer = pPointer; + (*m_pReference) = 1; + } + + template + util::CSmartPtr::~CSmartPtr() + { + if(!m_pPointer) + return; + + (*m_pReference)--; + if(*m_pReference <= 0) + { + delete m_pReference; + delete m_pPointer; + } + } + + template + util::CSmartPtr& util::CSmartPtr::operator=(const util::CSmartPtr & SmartPtr) + { + if(m_pPointer) + { + (*m_pReference)--; + if(*m_pReference <= 0) + { + delete m_pReference; + delete m_pPointer; + } + } + + m_pReference = SmartPtr.m_pReference; + m_pPointer = SmartPtr.m_pPointer; + (*m_pReference)++; + + return *this; + } + + template + util::CSmartPtr& util::CSmartPtr::operator=(T* pPointer) + { + if(m_pPointer) + { + (*m_pReference)--; + if(*m_pReference <= 0) + { + delete m_pReference; + delete m_pPointer; + } + } + + m_pReference = new int; + m_pPointer = pPointer; + (*m_pReference) = 1; + + return *this; + } + + template + bool util::CSmartPtr::operator==(const util::CSmartPtr & SmartPtr) const + { + return m_pPointer == SmartPtr.m_pPointer; + } + + template + bool util::CSmartPtr::operator!=(const util::CSmartPtr & SmartPtr) const + { + return m_pPointer != SmartPtr.m_pPointer; + } + + template + T& util::CSmartPtr::operator*() + { + return *m_pPointer; + } + + template + T* util::CSmartPtr::operator->() + { + return m_pPointer; + } + + template + const T& util::CSmartPtr::operator*() const + { + return *m_pPointer; + } + + template + const T* util::CSmartPtr::operator->() const + { + return m_pPointer; + } + +}//namespace gli diff --git a/test/external/gli/core/size.hpp b/test/external/gli/core/size.hpp new file mode 100644 index 00000000..3fe461ba --- /dev/null +++ b/test/external/gli/core/size.hpp @@ -0,0 +1,31 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2010-09-08 +// Updated : 2010-09-08 +// Licence : This source is under MIT License +// File : gli/core/size.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLI_CORE_SIZE_INCLUDED +#define GLI_CORE_SIZE_INCLUDED + +#include "texture2d.hpp" + +namespace gli +{ + //template + image2D::size_type size( + image2D const & Image, + image2D::size_type const & SizeType); + + //template + texture2D::size_type size( + texture2D const & Texture, + texture2D::size_type const & SizeType); + +}//namespace gli + +#include "size.inl" + +#endif//GLI_CORE_SIZE_INCLUDED diff --git a/test/external/gli/core/size.inl b/test/external/gli/core/size.inl new file mode 100644 index 00000000..dfb61238 --- /dev/null +++ b/test/external/gli/core/size.inl @@ -0,0 +1,47 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-12-19 +// Updated : 2010-09-08 +// Licence : This source is under MIT License +// File : gli/core/size.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace gli +{ + inline image2D::size_type size + ( + image2D const & Image, + image2D::size_type const & SizeType + ) + { + switch(SizeType) + { + case LINEAR_SIZE: + return detail::sizeLinear(Image); + case BLOCK_SIZE: + return detail::sizeBlock(Image.format()); + case BIT_PER_PIXEL: + return detail::sizeBitPerPixel(Image.format()); + case COMPONENT: + return detail::sizeComponent(Image.format()); + default: + assert(0); + return 0; + }; + } + + inline texture2D::size_type size + ( + texture2D const & Texture, + texture2D::size_type const & SizeType + ) + { + texture2D::size_type Size = 0; + for(texture2D::level_type Level = 0; Level < Texture.levels(); ++Level) + Size += size(Texture[Level], SizeType); + + return Size; + } + +}//namespace diff --git a/test/external/gli/core/texture2d.hpp b/test/external/gli/core/texture2d.hpp new file mode 100644 index 00000000..af2983e8 --- /dev/null +++ b/test/external/gli/core/texture2d.hpp @@ -0,0 +1,106 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Image Copyright (c) 2008 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2010-01-09 +// Updated : 2010-01-09 +// Licence : This source is under MIT License +// File : gli/core/texture2d.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLI_CORE_TEXTURE2D_INCLUDED +#define GLI_CORE_TEXTURE2D_INCLUDED + +#include "image2d.hpp" + +namespace gli +{ + //template