Files

209 lines
3.7 KiB
C
Raw Permalink Normal View History

2025-11-17 10:28:09 +01:00
#define GL_GLEXT_PROTOTYPES
#include <GL/glext.h>
#include <GL/gl.h> // GL 1.1 functions
#include <GL/glx.h>
#include "./texture2D.h"
#include "stdbool.h"
#include "../array.h"
#include "../vector3.h"
class sampler2D{
texture2D * texture;
array * textures = new array();
GLuint glTexture;
GLint binded = false;
GLint filter = GL_LINEAR;
GLint MIN_FILTER = GL_LINEAR;
GLint MAG_FILTER = GL_LINEAR;
GLint WRAP_S = GL_REPEAT;
GLint WRAP_T = GL_REPEAT;
GLint datatype = GL_RGBA;
GLint format = GL_RGBA;
GLint internalFormat = GL_RGBA;
GLint target = GL_TEXTURE_2D;
GLint type = GL_UNSIGNED_BYTE;//gl.FLOAT;
vector3 * cubeSize = NULL;
GLint border = false;
GLint generateMipmap = true;
bool UNPACK_ALIGNMENT = false;
//GLint FLIP_Y = true; pixelStorei
GLuint index = 0;
constructor() {
glGenTextures( 1, &this->glTexture );
}
addTexture( texture2D * texture ) {
this->textures->add( texture );
}
int getTextureIndex() {
int numberOfTextures = this->textures->length();
return numberOfTextures;
}
bind() {
this->binded = true;
/*
texture2D * texture = this->texture;
if( texture == NULL ) {
printf("Error: Texture not loaded.\n\n");
return ;
}
*/
//printf("Created sampler with id #%i\n", this->index);
glActiveTexture( GL_TEXTURE0 + this->index );
glBindTexture( this->target, this->glTexture );
glTexParameteri( this->target, GL_TEXTURE_WRAP_S, this->WRAP_S );
glTexParameteri( this->target, GL_TEXTURE_WRAP_T, this->WRAP_T );
glTexParameteri( this->target, GL_TEXTURE_MIN_FILTER, this->MIN_FILTER );
glTexParameteri( this->target, GL_TEXTURE_MAG_FILTER, this->MAG_FILTER );
if( this->target == GL_TEXTURE_2D_ARRAY ) {
//printf("create 2d array texture");
int offsetX = 0;
int offsetY = 0;
int offsetZ = 0;
int depth = 1;
int levelOfDetail = 0;
int layerCount = 2;
int mipLevelCount = 1;
int currentLayer = 0;
texture2D * texture1 = this->textures->get( 0 );
int numberOfTextures = this->textures->length();
if( this->cubeSize == NULL ) {
this->cubeSize = new vector3( texture1->width, texture1->height, numberOfTextures );
}
//glTexSubImage3D( this->target, levelOfDetail, offsetX, offsetY, offsetZ, texture->width, texture->height, depth, this->format, this->type, texture->data );
if( this->UNPACK_ALIGNMENT ) {
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
} else {
glPixelStorei( GL_UNPACK_ALIGNMENT, 0 );
}
glTexStorage3D( this->target, mipLevelCount, this->format, this->cubeSize->x, this->cubeSize->y, numberOfTextures );
GLint data[ texture1->width * texture1->height * numberOfTextures ];
glTexImage3D( GL_TEXTURE_2D_ARRAY, levelOfDetail, this->internalFormat, this->cubeSize->x, this->cubeSize->y, numberOfTextures, this->border, this->format, this->type, data);
for (int i = 0; i < numberOfTextures; ++i)
{
texture2D * currentTexture = this->textures->get( i );
float test = 0;//this->cubeSize->y - currentTexture->height - 1;
glTexSubImage3D( this->target,
0,
offsetX, test , i,
currentTexture->width, currentTexture->height, 1,
this->format,
this->type,
currentTexture->data );
}
} else {
texture2D * texture = this->textures->get( 0 );
glTexImage2D( this->target, 0, this->internalFormat, texture->width, texture->height, this->border, this->format, this->type, texture->data ); //GL_FLOAT
}
if( this->generateMipmap ) {
glGenerateMipmap( this->target );
}
//glBindTexture( this->target, NULL );
}
}