mirror of
https://github.com/Linloir/SceneEditor.git
synced 2025-12-16 23:18:12 +08:00
60 lines
2.1 KiB
C++
60 lines
2.1 KiB
C++
#pragma once
|
|
#define STB_IMAGE_IMPLEMENTATION
|
|
|
|
#include <STBImage/stb_image.h>
|
|
#include <qopengl.h>
|
|
#include <qopenglcontext.h>
|
|
|
|
#include "texture.h"
|
|
#include "logger.h"
|
|
|
|
QOpenGLContext* sharedContext;
|
|
|
|
// Must set context before calling this function
|
|
Texture::Texture(TextureType type, std::string path) {
|
|
_type = type;
|
|
_path = path.substr(path.find_last_of('/') + 1);
|
|
|
|
OPENGL_FUNCTIONS->glGenTextures(1, &_id);
|
|
OPENGL_FUNCTIONS->glBindTexture(GL_TEXTURE_2D, _id);
|
|
|
|
// Set the texture wrapping parameters
|
|
OPENGL_FUNCTIONS->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // Set texture wrapping to GL_REPEAT (usually basic wrapping method)
|
|
OPENGL_FUNCTIONS->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
// Set texture filtering parameters
|
|
OPENGL_FUNCTIONS->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
OPENGL_FUNCTIONS->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
// Set stbi to reverse the y-axis
|
|
stbi_set_flip_vertically_on_load(true);
|
|
|
|
// Load image, create texture and generate mipmaps
|
|
int width, height, nrChannels;
|
|
unsigned char* data = stbi_load(path.c_str(), &width, &height, &nrChannels, 0);
|
|
if (data) {
|
|
GLenum format;
|
|
if (nrChannels == 1) {
|
|
Logger::debug("Texture " + _path + " is a grayscale image");
|
|
format = GL_RED;
|
|
}
|
|
else if (nrChannels == 3) {
|
|
Logger::debug("Texture " + _path + " is a RGB image");
|
|
format = GL_RGB;
|
|
}
|
|
else if (nrChannels == 4) {
|
|
Logger::debug("Texture " + _path + " is a RGBA image");
|
|
format = GL_RGBA;
|
|
}
|
|
else {
|
|
Logger::error("Unexpected channel count");
|
|
return;
|
|
}
|
|
|
|
OPENGL_FUNCTIONS->glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
|
|
OPENGL_FUNCTIONS->glGenerateMipmap(GL_TEXTURE_2D);
|
|
}
|
|
else {
|
|
Logger::error("Failed to load texture: " + path);
|
|
}
|
|
stbi_image_free(data);
|
|
} |