Prepping to allow textures to have different render modes/types. Prepping for freetype support

This commit is contained in:
2023-05-21 23:35:39 -07:00
parent bb0eb2d7fa
commit 4a0c817a1c
17 changed files with 344 additions and 48 deletions

View File

@ -7,10 +7,18 @@
using namespace Dawn;
Texture::Texture() : ITexture() {
}
void Texture::bind(textureslot_t slot) {
assertTrue(this->id != -1);
glActiveTexture(GL_TEXTURE0 + slot);
glBindTexture(GL_TEXTURE_2D, this->id);
if(this->texturePropertiesNeedUpdating) {
this->updateTextureProperties();
this->texturePropertiesNeedUpdating = false;
}
}
int32_t Texture::getWidth() {
@ -21,56 +29,140 @@ int32_t Texture::getHeight() {
return this->height;
}
void Texture::setSize(int32_t width, int32_t height) {
void Texture::setSize(int32_t width, int32_t height, enum TextureFormat format) {
if(this->id != -1) glDeleteTextures(1, &this->id);
this->width = width;
this->height = height;
this->format = format;
glGenTextures(1, &this->id);
if(this->id <= 0) throw "Texture generation failed!";
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, this->id);
// Setup our preferred texture params, later this will be configurable.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Initialize the texture to blank
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA,
width, height,
0, GL_RGBA, GL_UNSIGNED_BYTE, NULL
);
glActiveTexture(GL_TEXTURE0);
this->bufferRaw(NULL);
}
void Texture::fill(struct Color color) {
struct Color *pixels = (struct Color *)memoryAllocate(
sizeof(struct Color) * this->width * this->height
);
this->buffer(pixels);
memoryFree(pixels);
}
bool_t Texture::isReady() {
return this->id != -1;
}
void Texture::buffer(struct Color pixels[]) {
void Texture::updateTextureProperties() {
switch(((enum TextureWrapMode)this->wrapModeX)) {
case TEXTURE_WRAP_MODE_REPEAT:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
break;
case TEXTURE_WRAP_MODE_MIRRORED_REPEAT:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
break;
case TEXTURE_WRAP_MODE_CLAMP_TO_EDGE:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
break;
case TEXTURE_WRAP_MODE_CLAMP_TO_BORDER:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
break;
default:
assertUnreachable();
}
switch(((enum TextureWrapMode)this->wrapModeY)) {
case TEXTURE_WRAP_MODE_REPEAT:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T ,GL_REPEAT);
break;
case TEXTURE_WRAP_MODE_MIRRORED_REPEAT:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
break;
case TEXTURE_WRAP_MODE_CLAMP_TO_EDGE:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
break;
case TEXTURE_WRAP_MODE_CLAMP_TO_BORDER:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
break;
default:
assertUnreachable();
}
switch(((enum TextureFilterMode)this->filterModeMin)) {
case TEXTURE_FILTER_MODE_NEAREST:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
break;
case TEXTURE_FILTER_MODE_LINEAR:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
break;
default:
assertUnreachable();
}
switch(((enum TextureFilterMode)this->filterModeMag)) {
case TEXTURE_FILTER_MODE_NEAREST:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);
break;
case TEXTURE_FILTER_MODE_LINEAR:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
break;
default:
assertUnreachable();
}
}
void Texture::bufferRaw(void *data) {
assertTrue(this->isReady());
glBindTexture(GL_TEXTURE_2D, this->id);
GLenum format;
switch(this->format) {
case TEXTURE_FORMAT_R:
format = GL_RED;
break;
case TEXTURE_FORMAT_RG:
format = GL_RG;
break;
case TEXTURE_FORMAT_RGB:
format = GL_RGB;
break;
case TEXTURE_FORMAT_RGBA:
format = GL_RGBA;
break;
default:
assertUnreachable();
}
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA,
GL_TEXTURE_2D, 0, format,
this->width, this->height,
0, GL_RGBA, GL_UNSIGNED_BYTE, (void *)pixels
0, format, GL_UNSIGNED_BYTE, data
);
glGenerateMipmap(GL_TEXTURE_2D);
this->texturePropertiesNeedUpdating = true;
}
void Texture::buffer(struct Color pixels[]) {
this->bufferRaw((void*)pixels);
}
Texture::~Texture() {

View File

@ -19,11 +19,16 @@ namespace Dawn {
int32_t width = -1;
int32_t height = -1;
GLuint id = -1;
enum TextureFormat format;
void updateTextureProperties();
void bufferRaw(void *data);
public:
Texture();
int32_t getWidth() override;
int32_t getHeight() override;
void setSize(int32_t width, int32_t height) override;
void setSize(int32_t width, int32_t height, enum TextureFormat format) override;
void fill(struct Color) override;
bool_t isReady() override;
void buffer(struct Color pixels[]) override;

View File

@ -26,7 +26,7 @@ void TextureRenderTarget::setSize(float_t width, float_t height) {
if(this->fboId != -1) glDeleteFramebuffers(1, &this->fboId);
// Resize texture
this->texture.setSize((int32_t)width, (int32_t) height);
this->texture.setSize((int32_t)width, (int32_t)height, TEXTURE_FORMAT_RGBA);
this->eventRenderTargetResized.invoke(this, width, height);
// Create Frame Buffer