SetBufferData takes table of values.

This commit is contained in:
jussi
2025-01-17 17:06:55 +02:00
parent 3cccee885e
commit 9a1161541d
5 changed files with 81 additions and 117 deletions

2
API.md
View File

@@ -6501,7 +6501,7 @@ Copy buffer data to another buffer. Size is in bytes
--- ---
> RL.SetBufferData( Buffer buffer, int position, any value ) > RL.SetBufferData( Buffer buffer, int position, any{} values )
Set buffer data value Set buffer data value

View File

@@ -2984,9 +2984,9 @@ function RL.CopyBufferData( dst, src, posDst, posSrc, size ) end
---Set buffer data value ---Set buffer data value
---@param buffer any ---@param buffer any
---@param position integer ---@param position integer
---@param value any ---@param values table
---@return any RL.SetBufferData ---@return any RL.SetBufferData
function RL.SetBufferData( buffer, position, value ) end function RL.SetBufferData( buffer, position, values ) end
---Swap buffer endianness from big endian to little endian and vice versa ---Swap buffer endianness from big endian to little endian and vice versa
---@param buffer any ---@param buffer any

View File

@@ -34,6 +34,7 @@ DETAILED CHANGES:
- ADDED: Reference lib. - ADDED: Reference lib.
- ADDED: BUFFER_UNSIGNED_LONG and BUFFER_LONG. - ADDED: BUFFER_UNSIGNED_LONG and BUFFER_LONG.
- FIXED: Bitwise functions now use 64 bit integers. - FIXED: Bitwise functions now use 64 bit integers.
- CHANGE: SetBufferData takes table of values.
------------------------------------------------------------------------ ------------------------------------------------------------------------
Release: ReiLua version 0.8.0 Using Raylib 5.0 and Forked Raygui 4.0 Release: ReiLua version 0.8.0 Using Raylib 5.0 and Forked Raygui 4.0

View File

@@ -27,10 +27,12 @@ local function writeDataFile( path )
local totalLength = 4 + RL.GetBufferLength( imgData.data ) / 4 local totalLength = 4 + RL.GetBufferLength( imgData.data ) / 4
local buffer = RL.LoadBufferFormatted( totalLength, RL.BUFFER_UNSIGNED_INT, 0 ) local buffer = RL.LoadBufferFormatted( totalLength, RL.BUFFER_UNSIGNED_INT, 0 )
RL.SetBufferData( buffer, 0, imgData.size.x ) RL.SetBufferData( buffer, 0, {
RL.SetBufferData( buffer, 1, imgData.size.y ) imgData.size.x,
RL.SetBufferData( buffer, 2, imgData.mipmaps ) imgData.size.y,
RL.SetBufferData( buffer, 3, imgData.format ) imgData.mipmaps,
imgData.format,
} )
RL.CopyBufferData( buffer, imgData.data, 4, 0, RL.GetBufferLength( imgData.data ) ) RL.CopyBufferData( buffer, imgData.data, 4, 0, RL.GetBufferLength( imgData.data ) )
if compress then if compress then

View File

@@ -20,6 +20,70 @@ static size_t getBufferElementSize( Buffer* buffer ) {
return 1; return 1;
} }
static void setBufferData( lua_State* L, Buffer* buffer, int index, size_t offset ) {
int t = index;
unsigned char* ucp = buffer->data + offset;
unsigned short* usp = buffer->data + offset;
unsigned int* uip = buffer->data + offset;
unsigned long* ulp = buffer->data + offset;
char* cp = buffer->data + offset;
short* sp = buffer->data + offset;
int* ip = buffer->data + offset;
long* lp = buffer->data + offset;
float* fp = buffer->data + offset;
double* dp = buffer->data + offset;
lua_pushnil( L );
while ( lua_next( L, t ) != 0 ) {
switch ( buffer->type ) {
case BUFFER_UNSIGNED_CHAR:
*ucp = (unsigned char)lua_tointeger( L, -1 );
ucp++;
break;
case BUFFER_UNSIGNED_SHORT:
*usp = (unsigned short)lua_tointeger( L, -1 );
usp++;
break;
case BUFFER_UNSIGNED_INT:
*uip = (unsigned int)lua_tointeger( L, -1 );
uip++;
break;
case BUFFER_UNSIGNED_LONG:
*ulp = (unsigned long)lua_tointeger( L, -1 );
ulp++;
break;
case BUFFER_CHAR:
*cp = (char)lua_tointeger( L, -1 );
cp++;
break;
case BUFFER_SHORT:
*sp = (short)lua_tointeger( L, -1 );
sp++;
break;
case BUFFER_INT:
*ip = (int)lua_tointeger( L, -1 );
ip++;
break;
case BUFFER_LONG:
*lp = (long)lua_tointeger( L, -1 );
lp++;
break;
case BUFFER_FLOAT:
*fp = (float)lua_tonumber( L, -1 );
fp++;
break;
case BUFFER_DOUBLE:
*dp = (double)lua_tonumber( L, -1 );
dp++;
break;
default:
break;
}
lua_pop( L, 1 );
}
}
void unloadBuffer( Buffer* buffer ) { void unloadBuffer( Buffer* buffer ) {
free( buffer->data ); free( buffer->data );
@@ -3628,69 +3692,7 @@ int lcoreLoadBuffer( lua_State* L ) {
buffer.size = len * getBufferElementSize( &buffer ); buffer.size = len * getBufferElementSize( &buffer );
buffer.data = malloc( buffer.size ); buffer.data = malloc( buffer.size );
int t = 1; setBufferData( L, &buffer, 1, 0 );
int i = 0;
unsigned char* ucp = buffer.data;
unsigned short* usp = buffer.data;
unsigned int* uip = buffer.data;
unsigned long* ulp = buffer.data;
char* cp = buffer.data;
short* sp = buffer.data;
int* ip = buffer.data;
long* lp = buffer.data;
float* fp = buffer.data;
double* dp = buffer.data;
lua_pushnil( L );
while ( lua_next( L, t ) != 0 ) {
switch ( type ) {
case BUFFER_UNSIGNED_CHAR:
*ucp = (unsigned char)lua_tointeger( L, -1 );
ucp++;
break;
case BUFFER_UNSIGNED_SHORT:
*usp = (unsigned short)lua_tointeger( L, -1 );
usp++;
break;
case BUFFER_UNSIGNED_INT:
*uip = (unsigned int)lua_tointeger( L, -1 );
uip++;
break;
case BUFFER_UNSIGNED_LONG:
*ulp = (unsigned long)lua_tointeger( L, -1 );
ulp++;
break;
case BUFFER_CHAR:
*cp = (char)lua_tointeger( L, -1 );
cp++;
break;
case BUFFER_SHORT:
*sp = (short)lua_tointeger( L, -1 );
sp++;
break;
case BUFFER_INT:
*ip = (int)lua_tointeger( L, -1 );
ip++;
break;
case BUFFER_LONG:
*lp = (long)lua_tointeger( L, -1 );
lp++;
break;
case BUFFER_FLOAT:
*fp = (float)lua_tonumber( L, -1 );
fp++;
break;
case BUFFER_DOUBLE:
*dp = (double)lua_tonumber( L, -1 );
dp++;
break;
default:
break;
}
lua_pop( L, 1 );
i++;
}
uluaPushBuffer( L, buffer ); uluaPushBuffer( L, buffer );
return 1; return 1;
@@ -3823,65 +3825,24 @@ int lcoreCopyBufferData( lua_State* L ) {
} }
/* /*
> RL.SetBufferData( Buffer buffer, int position, any value ) > RL.SetBufferData( Buffer buffer, int position, any{} values )
Set buffer data value Set buffer data value
*/ */
int lcoreSetBufferData( lua_State* L ) { int lcoreSetBufferData( lua_State* L ) {
Buffer* buffer = uluaGetBuffer( L, 1 ); Buffer* buffer = uluaGetBuffer( L, 1 );
size_t position = luaL_checkinteger( L, 2 ); size_t position = luaL_checkinteger( L, 2 );
luaL_checktype( L, 3, LUA_TTABLE );
if ( position < 0 || buffer->size / getBufferElementSize( buffer ) <= position ) { int len = uluaGetTableLen( L, 3 );
if ( position < 0 || buffer->size / getBufferElementSize( buffer ) <= ( position + len - 1 ) ) {
TraceLog( state->logLevelInvalid, "SetBufferData. position %d out of bounds", position ); TraceLog( state->logLevelInvalid, "SetBufferData. position %d out of bounds", position );
return 0; return 0;
} }
size_t offset = position * getBufferElementSize( buffer ); size_t offset = position * getBufferElementSize( buffer );
unsigned char* ucp = buffer->data + offset; setBufferData( L, buffer, 3, offset );
unsigned short* usp = buffer->data + offset;
unsigned int* uip = buffer->data + offset;
unsigned long* ulp = buffer->data + offset;
char* cp = buffer->data + offset;
short* sp = buffer->data + offset;
int* ip = buffer->data + offset;
long* lp = buffer->data + offset;
float* fp = buffer->data + offset;
double* dp = buffer->data + offset;
switch ( buffer->type ) {
case BUFFER_UNSIGNED_CHAR:
*ucp = (unsigned char)lua_tointeger( L, -1 );
break;
case BUFFER_UNSIGNED_SHORT:
*usp = (unsigned short)lua_tointeger( L, -1 );
break;
case BUFFER_UNSIGNED_INT:
*uip = (unsigned int)lua_tointeger( L, -1 );
break;
case BUFFER_UNSIGNED_LONG:
*ulp = (unsigned long)lua_tointeger( L, -1 );
break;
case BUFFER_CHAR:
*cp = (char)lua_tointeger( L, -1 );
break;
case BUFFER_SHORT:
*sp = (short)lua_tointeger( L, -1 );
break;
case BUFFER_INT:
*ip = (int)lua_tointeger( L, -1 );
break;
case BUFFER_LONG:
*lp = (long)lua_tointeger( L, -1 );
break;
case BUFFER_FLOAT:
*fp = (float)lua_tonumber( L, -1 );
break;
case BUFFER_DOUBLE:
*dp = (double)lua_tonumber( L, -1 );
break;
default:
break;
}
return 0; return 0;
} }