2019-09-17 17:03:42 +00:00
|
|
|
//
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Copyright(C) 2004-2016 Christoph Oelckers
|
|
|
|
// All rights reserved.
|
|
|
|
//
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
|
|
// along with this program. If not, see http://www.gnu.org/licenses/
|
|
|
|
//
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
|
2019-10-16 21:09:02 +00:00
|
|
|
#include <algorithm>
|
2019-09-17 17:03:42 +00:00
|
|
|
#include "glad/glad.h"
|
|
|
|
#include "glbackend.h"
|
2019-10-05 19:59:03 +00:00
|
|
|
#include "bitmap.h"
|
2019-09-17 17:03:42 +00:00
|
|
|
//#include "compat.h"
|
|
|
|
|
|
|
|
// Workaround to avoid including the dirty 'compat.h' header. This will hopefully not be needed anymore once the texture format uses something better.
|
|
|
|
# define B_LITTLE_ENDIAN 1
|
|
|
|
# define B_BIG_ENDIAN 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
//
|
|
|
|
// Allocates an empty texture
|
|
|
|
//
|
|
|
|
//===========================================================================
|
|
|
|
|
2019-10-19 21:14:36 +00:00
|
|
|
unsigned int FHardwareTexture::CreateTexture(int w, int h, int type, bool mipmapped)
|
2019-09-17 17:03:42 +00:00
|
|
|
{
|
2019-10-19 21:14:36 +00:00
|
|
|
static int gltypes[] = { GL_R8, GL_RGBA8, GL_RGB5_A1, GL_RGBA2 };
|
2019-09-17 17:03:42 +00:00
|
|
|
glTexID = GLInterface.GetTextureID();
|
|
|
|
glActiveTexture(GL_TEXTURE15);
|
|
|
|
glBindTexture(GL_TEXTURE_2D, glTexID);
|
|
|
|
int size = std::max(w, h);
|
|
|
|
int bits = 0;
|
|
|
|
while (size) bits++, size >>= 1;
|
2019-10-19 21:14:36 +00:00
|
|
|
internalType = type;
|
|
|
|
if (type == Indexed) mipmapped = false;
|
2019-09-17 17:03:42 +00:00
|
|
|
mWidth = w;
|
|
|
|
mHeight = h;
|
|
|
|
|
2019-10-19 21:14:36 +00:00
|
|
|
glTexStorage2D(GL_TEXTURE_2D, mipmapped? bits : 1, gltypes[type], w, h);
|
2019-09-17 17:03:42 +00:00
|
|
|
glBindTexture(GL_TEXTURE_2D, 0);
|
|
|
|
glActiveTexture(GL_TEXTURE0);
|
|
|
|
this->mipmapped = mipmapped;
|
|
|
|
return glTexID;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
//
|
|
|
|
// Loads the texture image into the hardware
|
|
|
|
//
|
|
|
|
//===========================================================================
|
|
|
|
|
2019-10-19 08:21:07 +00:00
|
|
|
unsigned int FHardwareTexture::LoadTexture(const unsigned char * buffer)
|
2019-10-07 20:11:09 +00:00
|
|
|
{
|
2019-10-19 08:21:07 +00:00
|
|
|
return LoadTexturePart(buffer, 0, 0, mWidth, mHeight);
|
2019-10-07 20:11:09 +00:00
|
|
|
}
|
|
|
|
|
2019-10-19 08:21:07 +00:00
|
|
|
unsigned int FHardwareTexture::LoadTexture(FBitmap& bmp)
|
2019-10-07 20:11:09 +00:00
|
|
|
{
|
2019-10-19 08:21:07 +00:00
|
|
|
return LoadTexture(bmp.GetPixels());
|
2019-10-07 20:11:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
//
|
|
|
|
// Loads the texture image into the hardware
|
|
|
|
//
|
|
|
|
//===========================================================================
|
|
|
|
|
2019-10-19 08:21:07 +00:00
|
|
|
unsigned int FHardwareTexture::LoadTexturePart(const unsigned char* buffer, int x, int y, int w, int h)
|
2019-09-17 17:03:42 +00:00
|
|
|
{
|
|
|
|
if (glTexID == 0) return 0;
|
2019-09-18 18:44:21 +00:00
|
|
|
|
2019-10-19 21:14:36 +00:00
|
|
|
int srcformat = internalType == Indexed ? GL_RED : GL_BGRA;// TexFormat[gl_texture_format];
|
2019-09-17 17:03:42 +00:00
|
|
|
|
|
|
|
glActiveTexture(GL_TEXTURE15);
|
|
|
|
glBindTexture(GL_TEXTURE_2D, glTexID);
|
|
|
|
|
2019-10-19 21:14:36 +00:00
|
|
|
if (internalType == Indexed) glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
2019-10-07 20:11:09 +00:00
|
|
|
|
|
|
|
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, srcformat, GL_UNSIGNED_BYTE, buffer);
|
2019-09-17 17:03:42 +00:00
|
|
|
if (mipmapped) glGenerateMipmap(GL_TEXTURE_2D);
|
|
|
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, 0);
|
|
|
|
glActiveTexture(GL_TEXTURE0);
|
2019-10-19 21:14:36 +00:00
|
|
|
if (internalType == Indexed) glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
2019-09-17 17:03:42 +00:00
|
|
|
return glTexID;
|
|
|
|
}
|
|
|
|
|
|
|
|
//===========================================================================
|
|
|
|
//
|
|
|
|
// Destroys the texture
|
|
|
|
//
|
|
|
|
//===========================================================================
|
|
|
|
FHardwareTexture::~FHardwareTexture()
|
|
|
|
{
|
|
|
|
if (glTexID != 0) glDeleteTextures(1, &glTexID);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
unsigned int FHardwareTexture::GetTextureHandle()
|
|
|
|
{
|
|
|
|
return glTexID;
|
|
|
|
}
|
|
|
|
|
|
|
|
|