// Copyright (c) 2012-2017 VideoStitch SAS // Copyright (c) 2018 stitchEm #include "texture.hpp" Texture& Texture::getLeft() { static Texture leftTexture; return leftTexture; } Texture& Texture::getRight() { static Texture rightTexture; return rightTexture; } void activateTexture(GLenum targetTexture, GLuint textureId) { glEnable(targetTexture); glClear(GL_COLOR_BUFFER_BIT); glBindTexture(targetTexture, textureId); } void deactivateTexture(GLenum targetTexture) { glBindTexture(targetTexture, 0); glDisable(targetTexture); } void configureTextureParams(GLenum targetTexture) { glTexParameteri(targetTexture, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(targetTexture, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(targetTexture, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(targetTexture, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } void Texture::setPanoramicSize(int width, int height) { _type = Texture::Type::PANORAMIC; _needToRedefinePano |= (_width != width || _height != height); _width = width; _height = height; } void Texture::setCubemapSize(int width, int height, int length, Type type) { _type = type; _width = width; _height = height; _needToRedefineCubemap |= _length != length; _length = length; } void Texture::latePanoramaDef() { if (_needToRedefinePano) { activateTexture(GL_TEXTURE_2D, id); configureTextureParams(GL_TEXTURE_2D); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _width, _height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); deactivateTexture(GL_TEXTURE_2D); _needToRedefinePano = false; } } void Texture::lateCubemapDef() { if (_needToRedefineCubemap) { activateTexture(GL_TEXTURE_CUBE_MAP, id); configureTextureParams(GL_TEXTURE_CUBE_MAP); for (int i = 0; i < 6; ++i) { glTexImage2D(cube[i], 0, GL_RGBA8, (GLsizei)_length, (GLsizei)_length, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); } deactivateTexture(GL_TEXTURE_CUBE_MAP); _needToRedefineCubemap = false; } }