SetBufferData takes table of values.
This commit is contained in:
2
API.md
2
API.md
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
181
src/core.c
181
src/core.c
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user