Files
c-prime/application/demos/example.opengl/engine/block.c
2025-11-17 10:28:09 +01:00

584 lines
9.0 KiB
C

/*
* This file is automaticaly generated, Please dont edit this file!
*/
#include <engine/block.h>
void block_add( block * this, struct member * memberInstance ) {
array_add( this->members, memberInstance );
}
void block_enableAutoUpload( block * this ) {
this->autoUpload = 1;
}
char * block_getBufferTypeText( block * this ) {
switch( this->bufferType ) {
case GL_SHADER_STORAGE_BUFFER:
return "GL_SHADER_STORAGE_BUFFER";
break;
case GL_UNIFORM_BUFFER:
return "GL_UNIFORM_BUFFER";
break;
}
return "buffer message not found";
}
void block_createBuffer( block * this ) {
unsigned int blockBufferSize = this->bufferSize;
this->data = ( float * ) malloc( blockBufferSize );
glGenBuffers( 1, &this->buffer );
glBindBuffer( this->bufferType, this->buffer );
glBindBufferBase( this->bufferType, this->index, this->buffer );
glBufferData( this->bufferType, blockBufferSize, 0, GL_DYNAMIC_DRAW );
}
void block_upload( block * this ) {
glBindBuffer( this->bufferType, this->buffer );
glBindBufferBase( this->bufferType, this->bindingPoint, this->buffer );
glBufferSubData( this->bufferType, 0, this->bufferSize, this->data );
}
void block_mapBufferError( block * this, void * pointer ) {
if ( pointer == NULL ){
GLenum errorCode = glGetError();
switch( errorCode ) {
case GL_INVALID_ENUM:
printf("GL_INVALID_ENUM\n");
break;
case GL_INVALID_OPERATION:
printf("GL_INVALID_OPERATION\n");
break;
case GL_INVALID_VALUE:
printf("GL_INVALID_VALUE\n");
break;
}
printf("null pointer on buffer: %i\n", errorCode);
return;
}
}
void * block_getMemberArray( block * this, char * name ) {
glMemoryBarrier( GL_SHADER_STORAGE_BARRIER_BIT );
vector_vector2 * output = vector_vector2_newPointer();
int uniformCount = array_length( this->members );
for (int i = 0; i < uniformCount; ++i)
{
member * currentMember = array_get( this->members, i );
char * memberName = ( char * ) currentMember->name;
if( char_operator_compare( memberName , name) ) {
int size = currentMember->size * 8;
int offset = currentMember->offset / 4;
output->items = glMapBufferRange( GL_SHADER_STORAGE_BUFFER, 0, size, GL_MAP_WRITE_BIT );
output->total = currentMember->size;
block_mapBufferError( this, output->items );
}
}
glUnmapBuffer( GL_SHADER_STORAGE_BUFFER );
return output;
}
void block_setMemberArrayRow( block * this, char * name, int arrayIndex, float * data ) {
int memberCount = array_length( this->members );
for (int i = 0; i < memberCount; ++i)
{
member * currentMember = array_get( this->members, i );
char * memberName = ( char * ) currentMember->name;
if( char_operator_compare( memberName , name) ) {
int size = currentMember->size * 8;
int arrayStride = currentMember->arrayStride;
int offset = arrayStride * arrayIndex;
if( this->autoUpload ) {
glBindBuffer( this->bufferType, this->buffer );
glBindBufferBase( this->bufferType, this->bindingPoint, this->buffer );
glBufferSubData( this->bufferType, offset, arrayStride, data );
}
memcpy( this->data + offset, data, arrayStride );
}
}
}
void block_setMemberArray( block * this, char * name, float * data ) {
int memberCount = array_length( this->members );
for (int i = 0; i < memberCount; ++i)
{
member * currentMember = array_get( this->members, i );
char * memberName = ( char * ) currentMember->name;
if( char_operator_compare( memberName , name) ) {
int size = currentMember->size * 8;
int offset = currentMember->offset / 4;
memcpy( this->data + offset, data, size );
}
}
}
void block_setMemberItem( block * this, char * name, int index, void * value ) {
int uniformCount = array_length( this->members );
for (int i = 0; i < uniformCount; ++i)
{
member * currentMember = array_get( this->members, i );
char * memberName = ( char * ) currentMember->name;
if( char_operator_compare( memberName , name) ) {
int stride;
int strideNormalized;
int size;
int offset;
switch( currentMember->type ) {
case GL_FLOAT_VEC2:
stride = currentMember->arrayStride;
strideNormalized = stride / sizeof( float ) ;
vector2 * vector2Value = ( vector2 * ) value;
size = 8;
offset = currentMember->offset;
if( this->autoUpload ) {
GLint arrayIndex = ( strideNormalized * index * 2 * 8 );
float data[2] = { vector2Value->x, vector2Value->y };
printf("%i: (size:%i) %f %f\n", arrayIndex, data[0], data[1]);
glBindBuffer( this->bufferType, this->buffer );
glBindBufferBase( this->bufferType, this->bindingPoint, this->buffer );
glBufferSubData( this->bufferType, arrayIndex, size, data );
} else {
GLint dataOffset = offset / sizeof( float );
GLint arrayIndex = ( strideNormalized * index );
if( currentMember->topLevelSize == 1 ) {
}
this->data[ dataOffset + arrayIndex ] = vector2Value->x;
this->data[ dataOffset + 1 + arrayIndex ] = vector2Value->y;
}
break;
case GL_FLOAT_VEC3:
stride = currentMember->arrayStride;
strideNormalized = stride / sizeof( float ) ;
vector3 * vector3Value = ( vector3 * ) value;
size = 12;
offset = currentMember->offset;
if( this->autoUpload ) {
float data[3] = { vector3Value->x, vector3Value->y, vector3Value->z };
glBindBuffer( this->bufferType, this->buffer );
glBindBufferBase( this->bufferType, this->bindingPoint, this->buffer );
glBufferSubData( this->bufferType, offset, size, data );
} else {
GLint dataOffset = offset / sizeof( float );
GLint arrayIndex = ( strideNormalized * index );
this->data[ dataOffset + arrayIndex ] = vector3Value->x;
this->data[ dataOffset + 1 + arrayIndex ] = vector3Value->y;
this->data[ dataOffset + 2 + arrayIndex ] = vector3Value->z;
}
break;
case GL_SAMPLER_2D:
break;
}
}
}
}
void block_setData( block * this, float * data ) {
this->data = data;
}
void block_setMember( block * this, char * name, void * value ) {
int uniformCount = array_length( this->members );
for (int i = 0; i < uniformCount; ++i)
{
member * currentMember = array_get( this->members, i );
char * memberName = ( char * ) currentMember->name;
if( char_operator_compare( memberName , name) ) {
GLuint size = 8;
GLint offset = currentMember->offset;
switch( currentMember->type ) {
case GL_INT:
int intValue = *( int * ) value;
printf("set int value: %i offset: %i\n", intValue, offset);
if( this->autoUpload ) {
float data[1] = { value };
glBindBuffer( this->bufferType, this->buffer );
glBindBufferBase( this->bufferType, this->bindingPoint, this->buffer );
glBufferSubData( this->bufferType, offset, size, data );
} else {
GLint dataOffset = offset / sizeof( float );
this->data[ dataOffset ] = intValue;
}
break;
case GL_FLOAT:
float floatValue = *( float * ) value;
printf("set int value: %f offset: %i\n", floatValue, offset);
if( this->autoUpload ) {
float data[1] = { value };
glBindBuffer( this->bufferType, this->buffer );
glBindBufferBase( this->bufferType, this->bindingPoint, this->buffer );
glBufferSubData( this->bufferType, offset, size, data );
} else {
GLint dataOffset = offset / sizeof( float );
this->data[ dataOffset ] = floatValue;
}
break;
case GL_FLOAT_VEC2:
vector2 * vector2Value = ( vector2 * ) value;
if( this->autoUpload ) {
float data[2] = { vector2Value->x, vector2Value->y };
glBindBuffer( this->bufferType, this->buffer );
glBindBufferBase( this->bufferType, this->bindingPoint, this->buffer );
glBufferSubData( this->bufferType, offset, size, data );
} else {
GLint dataOffset = offset / sizeof( float );
this->data[ dataOffset ] = vector2Value->x;
this->data[ dataOffset + 1 ] = vector2Value->y;
}
break;
case GL_FLOAT_VEC3:
vector3 * vector3Value = ( vector3 * ) value;
break;
case GL_SAMPLER_2D:
break;
}
}
}
}
block block_new() {
block instance;
instance.members = array_newPointer();
instance.autoUpload = 0;
return instance;
}
block * block_newPointer() {
struct block * pointer = malloc( sizeof ( struct block ) );
pointer->members = array_newPointer();
pointer->autoUpload = 0;
return pointer;
}