diff options
| author | jussi | 2023-10-26 20:09:16 +0300 |
|---|---|---|
| committer | jussi | 2023-10-26 20:09:16 +0300 |
| commit | 56c365c8cc88455d69df42e7842c986e760c776e (patch) | |
| tree | d4ad09280cdad3ad0e46146aa4cd149f5400b9b0 /src/core.c | |
| parent | 168f4959d4a265d7615a81b667917754ca85bfce (diff) | |
| download | reilua-enhanced-56c365c8cc88455d69df42e7842c986e760c776e.tar.gz reilua-enhanced-56c365c8cc88455d69df42e7842c986e760c776e.tar.bz2 reilua-enhanced-56c365c8cc88455d69df42e7842c986e760c776e.zip | |
Buffer userdata object and rlgl Vertex buffers management.
Diffstat (limited to 'src/core.c')
| -rw-r--r-- | src/core.c | 74 |
1 files changed, 74 insertions, 0 deletions
@@ -3558,3 +3558,77 @@ int lcoreGetScreenToWorld2D( lua_State *L ) { return 1; } + +/* +> buffer = RL.LoadBuffer( data{} buffer, int type ) + +Creates buffer as userdata. Type should be one of the Buffer types + +- Failure return false +- Success return Buffer +*/ +int lcoreLoadBuffer( lua_State *L ) { + if ( !lua_istable( L, 1 ) || !lua_isnumber( L, 2 ) ) { + TraceLog( state->logLevelInvalid, "%s", "Bad call of function. RL.LoadBuffer( data{} buffer, int type )" ); + lua_pushboolean( L, false ); + return 1; + } + int type = lua_tointeger( L, 2 ); + Buffer *buffer = lua_newuserdata( L, sizeof( Buffer ) ); + int len = uluaGetTableLenIndex( L, 1 ); + + switch ( type ) { + case BUFFER_UNSIGNED_CHAR: + buffer->size = len * sizeof( unsigned char ); + break; + case BUFFER_UNSIGNED_SHORT: + buffer->size = len * sizeof( unsigned short ); + break; + case BUFFER_UNSIGNED_INT: + buffer->size = len * sizeof( unsigned int ); + break; + case BUFFER_FLOAT: + buffer->size = len * sizeof( float ); + break; + default: + break; + } + buffer->data = malloc( buffer->size ); + + int t = 1; + int i = 0; + unsigned char *up = buffer->data; + unsigned short *sp = buffer->data; + unsigned int *ip = buffer->data; + float *fp = buffer->data; + + lua_pushnil( L ); + + while ( lua_next( L, t ) != 0 ) { + switch ( type ) { + case BUFFER_UNSIGNED_CHAR: + *up = (unsigned char)lua_tointeger( L, -1 ); + up++; + break; + case BUFFER_UNSIGNED_SHORT: + *sp = (unsigned short)lua_tointeger( L, -1 ); + up++; + break; + case BUFFER_UNSIGNED_INT: + *ip = (unsigned int)lua_tointeger( L, -1 ); + up++; + break; + case BUFFER_FLOAT: + *fp = (float)lua_tonumber( L, -1 ); + fp++; + break; + default: + break; + } + lua_pop( L, 1 ); + i++; + } + luaL_setmetatable( L, "Buffer" ); + + return 1; +} |
