Files
reilua-enhanced/src/rlgl.c

1916 lines
36 KiB
C

#include "main.h"
#include "state.h"
#include "lua_core.h"
#include "lrlgl.h"
/*
## RLGL - Matrix operations
*/
/*
> RL.rlMatrixMode( int mode )
Choose the current matrix to be transformed
*/
int lrlglMatrixMode( lua_State *L ) {
rlMatrixMode( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> RL.rlPushMatrix()
Push the current matrix to stack
*/
int lrlglPushMatrix( lua_State *L ) {
rlPushMatrix();
return 0;
}
/*
> RL.rlPopMatrix()
Pop latest inserted matrix from stack
*/
int lrlglPopMatrix( lua_State *L ) {
rlPopMatrix();
return 0;
}
/*
> RL.rlLoadIdentity()
Reset current matrix to identity matrix
*/
int lrlglLoadIdentity( lua_State *L ) {
rlLoadIdentity();
return 0;
}
/*
> RL.rlTranslatef( Vector3 translation )
Multiply the current matrix by a translation matrix
*/
int lrlglTranslatef( lua_State *L ) {
Vector3 translation = uluaGetVector3( L, 1 );
rlTranslatef( translation.x, translation.y, translation.z );
return 0;
}
/*
> RL.rlRotatef( float angle, Vector3 rotation )
Multiply the current matrix by a rotation matrix
*/
int lrlglRotatef( lua_State *L ) {
float angle = luaL_checknumber( L, 1 );
Vector3 rotation = uluaGetVector3( L, 2 );
rlRotatef( angle, rotation.x, rotation.y, rotation.z );
return 0;
}
/*
> RL.rlScalef( Vector3 scale )
Multiply the current matrix by a scaling matrix
*/
int lrlglScalef( lua_State *L ) {
Vector3 scale = uluaGetVector3( L, 1 );
rlScalef( scale.x, scale.y, scale.z );
return 0;
}
/*
> RL.rlMultMatrixf( Matrix matrix )
Multiply the current matrix by another matrix
*/
int lrlglMultMatrixf( lua_State *L ) {
Matrix matrix = uluaGetMatrix( L, 1 );
float matf[16] = {
matrix.m0, matrix.m4, matrix.m8, matrix.m12,
matrix.m1, matrix.m5, matrix.m9, matrix.m13,
matrix.m2, matrix.m6, matrix.m10, matrix.m14,
matrix.m3, matrix.m7, matrix.m11, matrix.m15
};
rlMultMatrixf( matf );
return 0;
}
/*
> RL.rlFrustum( float left, float right, float bottom, float top, float znear, float zfar )
Multiply the current matrix by a perspective matrix generated by parameters
*/
int lrlglFrustum( lua_State *L ) {
double left = luaL_checknumber( L, 1 );
double right = luaL_checknumber( L, 2 );
double bottom = luaL_checknumber( L, 3 );
double top = luaL_checknumber( L, 4 );
double znear = luaL_checknumber( L, 5 );
double zfar = luaL_checknumber( L, 6 );
rlFrustum( left, right, bottom, top, znear, zfar );
return 0;
}
/*
> RL.rlOrtho( float left, float right, float bottom, float top, float znear, float zfar )
Multiply the current matrix by an orthographic matrix generated by parameters
*/
int lrlglOrtho( lua_State *L ) {
double left = luaL_checknumber( L, 1 );
double right = luaL_checknumber( L, 2 );
double bottom = luaL_checknumber( L, 3 );
double top = luaL_checknumber( L, 4 );
double znear = luaL_checknumber( L, 5 );
double zfar = luaL_checknumber( L, 6 );
rlOrtho( left, right, bottom, top, znear, zfar );
return 0;
}
/*
> RL.rlViewport( Rectangle viewport )
Set the viewport area (transformation from normalized device coordinates to window coordinates)
NOTE: We store current viewport dimensions
*/
int lrlglViewport( lua_State *L ) {
Rectangle rect = uluaGetRectangle( L, 1 );
rlViewport( rect.x, rect.y, rect.width, rect.height );
return 0;
}
/*
## RLGL - Vertex level operations
*/
/*
> RL.rlBegin( int mode )
Initialize drawing mode (how to organize vertex)
*/
int lrlglBegin( lua_State *L ) {
rlBegin( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> RL.rlEnd()
Finish vertex providing
*/
int lrlglEnd( lua_State *L ) {
rlEnd();
return 0;
}
/*
> RL.rlVertex2f( Vector2 position )
Define one vertex (position)
*/
int lrlglVertex2f( lua_State *L ) {
Vector2 position = uluaGetVector2( L, 1 );
rlVertex2f( position.x, position.y );
return 0;
}
/*
> RL.rlVertex3f( Vector3 position )
Define one vertex (position)
*/
int lrlglVertex3f( lua_State *L ) {
Vector3 position = uluaGetVector3( L, 1 );
rlVertex3f( position.x, position.y, position.z );
return 0;
}
/*
> RL.rlTexCoord2f( Vector2 texCoord )
Define one vertex (texture coordinate) - 2 float
*/
int lrlglTexCoord2f( lua_State *L ) {
Vector2 texCoord = uluaGetVector2( L, 1 );
rlTexCoord2f( texCoord.x, texCoord.y );
return 0;
}
/*
> RL.rlNormal3f( Vector3 normal )
Define one vertex (normal) - 3 float
*/
int lrlglNormal3f( lua_State *L ) {
Vector3 normal = uluaGetVector3( L, 1 );
rlNormal3f( normal.x, normal.y, normal.z );
return 0;
}
/*
> RL.rlColor4ub( Color color )
Define one vertex (color) - 4 byte
*/
int lrlglColor4ub( lua_State *L ) {
Color color = uluaGetColor( L, 1 );
rlColor4ub( color.r, color.g, color.b, color.a );
return 0;
}
/*
> RL.rlColor3f( Vector3 color )
Define one vertex (color) - 3 float
*/
int lrlglColor3f( lua_State *L ) {
Vector3 color = uluaGetVector3( L, 1 );
rlColor3f( color.x, color.y, color.z );
return 0;
}
/*
> RL.rlColor4f( Vector4 color )
Define one vertex (color) - 4 float
*/
int lrlglColor4f( lua_State *L ) {
Vector4 color = uluaGetVector4( L, 1 );
rlColor4f( color.x, color.y, color.z, color.w );
return 0;
}
/*
## RLGL - Vertex buffers state
*/
/*
> supported = RL.rlEnableVertexArray( int vaoId )
Enable vertex array (VAO, if supported)
- Success return bool
*/
int lrlglEnableVertexArray( lua_State *L ) {
lua_pushboolean( L, rlEnableVertexArray( luaL_checkinteger( L, 1 ) ) );
return 1;
}
/*
> RL.rlDisableVertexArray()
Disable vertex array (VAO, if supported)
*/
int lrlglDisableVertexArray( lua_State *L ) {
rlDisableVertexArray();
return 0;
}
/*
> RL.rlEnableVertexBuffer( int id )
Enable vertex buffer (VBO)
- Failure return false
- Success return true
*/
int lrlglEnableVertexBuffer( lua_State *L ) {
rlEnableVertexBuffer( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> RL.rlDisableVertexBuffer()
Disable vertex buffer (VBO)
*/
int lrlglDisableVertexBuffer( lua_State *L ) {
rlDisableVertexBuffer();
return 0;
}
/*
> RL.rlEnableVertexBufferElement( int id )
Enable vertex buffer element (VBO element)
*/
int lrlglEnableVertexBufferElement( lua_State *L ) {
rlEnableVertexBufferElement( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> RL.rlDisableVertexBufferElement()
Disable vertex buffer element (VBO element)
*/
int lrlglDisableVertexBufferElement( lua_State *L ) {
rlDisableVertexBufferElement();
return 0;
}
/*
> RL.rlEnableVertexAttribute( int index )
Enable vertex attribute index
*/
int lrlglEnableVertexAttribute( lua_State *L ) {
rlEnableVertexAttribute( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> RL.rlDisableVertexAttribute( int index )
Disable vertex attribute index
*/
int lrlglDisableVertexAttribute( lua_State *L ) {
rlDisableVertexAttribute( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
## RLGL - Textures state
*/
/*
> RL.rlActiveTextureSlot( int slot )
Select and active a texture slot
*/
int lrlglActiveTextureSlot( lua_State *L ) {
rlActiveTextureSlot( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> RL.rlEnableTexture( int id )
Enable texture
*/
int lrlglEnableTexture( lua_State *L ) {
rlEnableTexture( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> RL.rlDisableTexture()
Disable texture
*/
int lrlglDisableTexture( lua_State *L ) {
rlDisableTexture();
return 0;
}
/*
> RL.rlEnableTextureCubemap( int id )
Enable texture cubemap
*/
int lrlglEnableTextureCubemap( lua_State *L ) {
rlEnableTextureCubemap( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> RL.rlDisableTextureCubemap()
Disable texture cubemap
*/
int lrlglDisableTextureCubemap( lua_State *L ) {
rlDisableTextureCubemap();
return 0;
}
/*
> RL.rlTextureParameters( int id, int param, int value )
Set texture parameters (filter, wrap)
*/
int lrlglTextureParameters( lua_State *L ) {
unsigned int id = luaL_checkinteger( L, 1 );
int param = luaL_checkinteger( L, 2 );
int value = luaL_checkinteger( L, 3 );
rlTextureParameters( id, param, value );
return 0;
}
/*
> RL.rlCubemapParameters( int id, int param, int value )
Set cubemap parameters (filter, wrap)
*/
int lrlglCubemapParameters( lua_State *L ) {
unsigned int id = luaL_checkinteger( L, 1 );
int param = luaL_checkinteger( L, 2 );
int value = luaL_checkinteger( L, 3 );
rlCubemapParameters( id, param, value );
return 0;
}
/*
## RLGL - Shader state
*/
/*
> RL.rlEnableShader( int id )
Enable shader program
*/
int lrlglEnableShader( lua_State *L ) {
rlEnableShader( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> RL.rlDisableShader()
Disable shader program
*/
int lrlglDisableShader( lua_State *L ) {
rlDisableShader();
return 0;
}
/*
## RLGL - Framebuffer state
*/
/*
> RL.rlEnableFramebuffer( int id )
Enable render texture (fbo)
*/
int lrlglEnableFramebuffer( lua_State *L ) {
rlEnableFramebuffer( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> RL.rlDisableFramebuffer()
Disable render texture (fbo), return to default framebuffer
*/
int lrlglDisableFramebuffer( lua_State *L ) {
rlDisableFramebuffer();
return 0;
}
/*
> RL.rlActiveDrawBuffers( int count )
Activate multiple draw color buffers
*/
int lrlglActiveDrawBuffers( lua_State *L ) {
rlActiveDrawBuffers( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
## RLGL - General render state
*/
/*
> RL.rlEnableColorBlend()
Enable color blending
*/
int lrlglEnableColorBlend( lua_State *L ) {
rlEnableColorBlend();
return 0;
}
/*
> RL.rlDisableColorBlend()
Disable color blending
*/
int lrlglDisableColorBlend( lua_State *L ) {
rlDisableColorBlend();
return 0;
}
/*
> RL.rlEnableDepthTest()
Enable depth test
*/
int lrlglEnableDepthTest( lua_State *L ) {
rlEnableDepthTest();
return 0;
}
/*
> RL.rlDisableDepthTest()
Disable depth test
*/
int lrlglDisableDepthTest( lua_State *L ) {
rlDisableDepthTest();
return 0;
}
/*
> RL.rlEnableDepthMask()
Enable depth write
*/
int lrlglEnableDepthMask( lua_State *L ) {
rlEnableDepthMask();
return 0;
}
/*
> RL.rlDisableDepthMask()
Disable depth write
*/
int lrlglDisableDepthMask( lua_State *L ) {
rlDisableDepthMask();
return 0;
}
/*
> RL.rlEnableBackfaceCulling()
Enable backface culling
*/
int lrlglEnableBackfaceCulling( lua_State *L ) {
rlEnableBackfaceCulling();
return 0;
}
/*
> RL.rlDisableBackfaceCulling()
Disable backface culling
*/
int lrlglDisableBackfaceCulling( lua_State *L ) {
rlDisableBackfaceCulling();
return 0;
}
/*
> RL.rlSetCullFace( int mode )
Set face culling mode
*/
int lrlglSetCullFace( lua_State *L ) {
rlSetCullFace( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> RL.rlEnableScissorTest()
Enable scissor test
*/
int lrlglEnableScissorTest( lua_State *L ) {
rlEnableScissorTest();
return 0;
}
/*
> RL.rlDisableScissorTest()
Disable scissor test
*/
int lrlglDisableScissorTest( lua_State *L ) {
rlDisableScissorTest();
return 0;
}
/*
> RL.rlScissor( Rectangle area )
Scissor test
*/
int lrlglScissor( lua_State *L ) {
Rectangle area = uluaGetRectangle( L, 1 );
rlScissor( area.x, area.y, area.width, area.height );
return 0;
}
/*
> RL.rlEnableWireMode()
Enable wire mode
*/
int lrlglEnableWireMode( lua_State *L ) {
rlEnableWireMode();
return 0;
}
/*
> RL.rlDisableWireMode()
Disable wire mode
*/
int lrlglDisableWireMode( lua_State *L ) {
rlDisableWireMode();
return 0;
}
/*
> RL.rlSetLineWidth( float width )
Set the line drawing width
*/
int lrlglSetLineWidth( lua_State *L ) {
rlSetLineWidth( luaL_checknumber( L, 1 ) );
return 0;
}
/*
> width = RL.rlGetLineWidth()
Get the line drawing width
- Success return float
*/
int lrlglGetLineWidth( lua_State *L ) {
lua_pushnumber( L, rlGetLineWidth() );
return 1;
}
/*
> RL.rlEnableSmoothLines()
Enable line aliasing
*/
int lrlglEnableSmoothLines( lua_State *L ) {
rlEnableSmoothLines();
return 0;
}
/*
> RL.rlDisableSmoothLines()
Disable line aliasing
*/
int lrlglDisableSmoothLines( lua_State *L ) {
rlDisableSmoothLines();
return 0;
}
/*
> RL.rlEnableStereoRender()
Enable stereo rendering
*/
int lrlglEnableStereoRender( lua_State *L ) {
rlEnableStereoRender();
return 0;
}
/*
> RL.rlDisableStereoRender()
Enable stereo rendering
*/
int lrlglDisableStereoRender( lua_State *L ) {
rlDisableStereoRender();
return 0;
}
/*
> enabled = RL.rlIsStereoRenderEnabled()
Check if stereo render is enabled
- Success return bool
*/
int lrlglIsStereoRenderEnabled( lua_State *L ) {
lua_pushboolean( L, rlIsStereoRenderEnabled() );
return 1;
}
/*
> RL.rlClearColor( Color color )
Clear color buffer with color
*/
int lrlglClearColor( lua_State *L ) {
Color color = uluaGetColor( L, 1 );
rlClearColor( color.r, color.g, color.b, color.a );
return 0;
}
/*
> RL.rlClearScreenBuffers()
Clear used screen buffers (color and depth)
*/
int lrlglClearScreenBuffers( lua_State *L ) {
rlClearScreenBuffers();
return 0;
}
/*
> RL.rlCheckErrors()
Check and log OpenGL error codes
*/
int lrlglCheckErrors( lua_State *L ) {
rlCheckErrors();
return 0;
}
/*
> RL.rlSetBlendMode( int mode )
Set blending mode
*/
int lrlglSetBlendMode( lua_State *L ) {
rlSetBlendMode( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> RL.rlSetBlendFactors( int glSrcFactor, int glDstFactor, int glEquation )
Set blending mode factor and equation (using OpenGL factors)
*/
int lrlglSetBlendFactors( lua_State *L ) {
int glSrcFactor = luaL_checkinteger( L, 1 );
int glDstFactor = luaL_checkinteger( L, 2 );
int glEquation = luaL_checkinteger( L, 3 );
rlSetBlendFactors( glSrcFactor, glDstFactor, glEquation );
return 0;
}
/*
> RL.rlSetBlendFactorsSeparate( int glSrcRGB, int glDstRGB, int glSrcAlpha, int glDstAlpha, int glEqRGB, int glEqAlpha )
Set blending mode factors and equations separately (using OpenGL factors)
*/
int lrlglSetBlendFactorsSeparate( lua_State *L ) {
int glSrcRGB = luaL_checkinteger( L, 1 );
int glDstRGB = luaL_checkinteger( L, 2 );
int glSrcAlpha = luaL_checkinteger( L, 3 );
int glDstAlpha = luaL_checkinteger( L, 4 );
int glEqRGB = luaL_checkinteger( L, 5 );
int glEqAlpha = luaL_checkinteger( L, 6 );
rlSetBlendFactorsSeparate( glSrcRGB, glDstRGB, glSrcAlpha, glDstAlpha, glEqRGB, glEqAlpha );
return 0;
}
/*
## RLGL - Initialization functions
*/
/*
> version = RL.rlGetVersion()
Get current OpenGL version
- Success return int
*/
int lrlglGetVersion( lua_State *L ) {
lua_pushinteger( L, rlGetVersion() );
return 1;
}
/*
> version = RL.rlSetFramebufferWidth( int width )
Set current framebuffer width
*/
int lrlglSetFramebufferWidth( lua_State *L ) {
int width = luaL_checkinteger( L, 1 );
rlSetFramebufferWidth( width );
return 0;
}
/*
> width = RL.rlGetFramebufferWidth()
Get default framebuffer width
- Success return int
*/
int lrlglGetFramebufferWidth( lua_State *L ) {
lua_pushinteger( L, rlGetFramebufferWidth() );
return 1;
}
/*
> version = RL.rlSetFramebufferHeight( int height )
Set current framebuffer height
*/
int lrlglSetFramebufferHeight( lua_State *L ) {
int height = luaL_checkinteger( L, 1 );
rlSetFramebufferWidth( height );
return 0;
}
/*
> height = RL.rlGetFramebufferHeight()
Get default framebuffer height
- Success return int
*/
int lrlglGetFramebufferHeight( lua_State *L ) {
lua_pushinteger( L, rlGetFramebufferHeight() );
return 1;
}
/*
> id = RL.rlGetTextureIdDefault()
Get default texture id
- Success return int
*/
int lrlglGetTextureIdDefault( lua_State *L ) {
lua_pushinteger( L, rlGetTextureIdDefault() );
return 1;
}
/*
> id = RL.rlGetShaderIdDefault()
Get default shader id
- Success return int
*/
int lrlglGetShaderIdDefault( lua_State *L ) {
lua_pushinteger( L, rlGetShaderIdDefault() );
return 1;
}
/*
> locations = RL.rlGetShaderLocsDefault()
Get default shader locations
- Success return int{}
*/
int lrlglGetShaderLocsDefault( lua_State *L ) {
int *locs = rlGetShaderLocsDefault();
lua_createtable( L, RL_MAX_SHADER_LOCATIONS, 0 );
for ( int i = 0; i < RL_MAX_SHADER_LOCATIONS; i++ ) {
lua_pushinteger( L, locs[i] );
lua_rawseti( L, -2, i + 1 );
}
return 1;
}
/*
## RLGL - Render batch management
*/
/*
> RL.rlDrawRenderBatchActive()
Update and draw internal render batch
*/
int lrlglDrawRenderBatchActive( lua_State *L ) {
rlDrawRenderBatchActive();
return 0;
}
/*
> overflow = RL.rlCheckRenderBatchLimit( int vCount )
Check internal buffer overflow for a given number of vertex and force a rlRenderBatch draw call if required
- Success return bool
*/
int lrlglCheckRenderBatchLimit( lua_State *L ) {
lua_pushboolean( L, rlCheckRenderBatchLimit( luaL_checkinteger( L, 1 ) ) );
return 1;
}
/*
> RL.rlSetTexture( int id )
Set current texture for render batch and check buffers limits
*/
int lrlglSetTexture( lua_State *L ) {
rlSetTexture( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
## RLGL - Vertex buffers management
*/
/*
> vaoId = RL.rlLoadVertexArray()
Load vertex array (vao) if supported
- Success return int
*/
int lrlglLoadVertexArray( lua_State *L ) {
lua_pushinteger( L, rlLoadVertexArray() );
return 1;
}
/*
> vboId = RL.rlLoadVertexBuffer( Buffer buffer, bool dynamic )
Load a vertex buffer attribute
- Success return int
*/
int lrlglLoadVertexBuffer( lua_State *L ) {
Buffer *buffer = uluaGetBuffer( L, 1 );
bool dynamic = uluaGetBoolean( L, 2 );
lua_pushinteger( L, rlLoadVertexBuffer( buffer->data, buffer->size, dynamic ) );
return 1;
}
/*
> vboId = RL.rlLoadVertexBufferElement( Buffer buffer, bool dynamic )
Load a new attributes element buffer
- Success return int
*/
int lrlglLoadVertexBufferElement( lua_State *L ) {
Buffer *buffer = uluaGetBuffer( L, 1 );
bool dynamic = uluaGetBoolean( L, 2 );
lua_pushinteger( L, rlLoadVertexBufferElement( buffer->data, buffer->size, dynamic ) );
return 1;
}
/*
> RL.rlUpdateVertexBuffer( int bufferId, Buffer buffer, int offset )
Update GPU buffer with new data
*/
int lrlglUpdateVertexBuffer( lua_State *L ) {
int bufferId = luaL_checkinteger( L, 1 );
Buffer *buffer = uluaGetBuffer( L, 2 );
int offset = luaL_checkinteger( L, 3 );
rlUpdateVertexBuffer( bufferId, buffer->data, buffer->size, offset );
return 0;
}
/*
> RL.rlUpdateVertexBufferElements( int id, Buffer buffer, int offset )
Update vertex buffer elements with new data
*/
int lrlglUpdateVertexBufferElements( lua_State *L ) {
int bufferId = luaL_checkinteger( L, 1 );
Buffer *buffer = uluaGetBuffer( L, 2 );
int offset = luaL_checkinteger( L, 3 );
rlUpdateVertexBufferElements( bufferId, buffer->data, buffer->size, offset );
return 0;
}
/*
> RL.rlUnloadVertexArray( int vaoId )
Unload vertex array object (VAO)
*/
int lrlglUnloadVertexArray( lua_State *L ) {
rlUnloadVertexArray( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> RL.rlUnloadVertexBuffer( int vboId )
Unload vertex buffer (VBO)
*/
int lrlglUnloadVertexBuffer( lua_State *L ) {
rlUnloadVertexBuffer( luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> RL.rlSetVertexAttribute( int index, int compSize, int type, bool normalized, int stride, int pointer )
Set vertex attribute
*/
int lrlglSetVertexAttribute( lua_State *L ) {
int index = luaL_checkinteger( L, 1 );
int compSize = luaL_checkinteger( L, 2 );
int type = luaL_checkinteger( L, 3 );
bool normalized = uluaGetBoolean( L, 4 );
int stride = luaL_checkinteger( L, 5 );
int pointer = luaL_checkinteger( L, 6 );
rlSetVertexAttribute( index, compSize, type, normalized, stride, &pointer );
return 0;
}
/*
> RL.rlSetVertexAttributeDivisor( int index, int divisor )
Set vertex attribute divisor
*/
int lrlglSetVertexAttributeDivisor( lua_State *L ) {
unsigned int index = (unsigned int)luaL_checkinteger( L, 1 );
int divisor = luaL_checkinteger( L, 2 );
rlSetVertexAttributeDivisor( index, divisor );
return 0;
}
/*
> RL.rlSetVertexAttributeDefault( int locIndex, float{} value, int attribType )
Set vertex attribute default value
*/
int lrlglSetVertexAttributeDefault( lua_State *L ) {
int locIndex = luaL_checkinteger( L, 1 );
int attribType = luaL_checkinteger( L, 3 );
int count = uluaGetTableLen( L, 2 );
float value[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
int t = 2;
int i = 0;
lua_pushnil( L );
while ( lua_next( L, t ) != 0 ) {
value[i] = luaL_checknumber( L, -1 );
lua_pop( L, 1 );
i++;
}
rlSetVertexAttributeDefault( locIndex, value, attribType, count );
return 0;
}
/*
> RL.rlDrawVertexArray( int offset, int count )
Draw vertex array
*/
int lrlglDrawVertexArray( lua_State *L ) {
int offset = luaL_checkinteger( L, 1 );
int count = luaL_checkinteger( L, 2 );
rlDrawVertexArray( offset, count );
return 0;
}
/*
> RL.rlDrawVertexArrayElements( int offset, int count, Buffer buffer )
Draw vertex array elements
*/
int lrlglDrawVertexArrayElements( lua_State *L ) {
int offset = luaL_checkinteger( L, 1 );
int count = luaL_checkinteger( L, 2 );
Buffer *buffer = uluaGetBuffer( L, 3 );
rlDrawVertexArrayElements( offset, count, buffer->data );
return 0;
}
/*
> RL.rlDrawVertexArrayInstanced( int offset, int count, int instances )
Draw vertex array instanced
*/
int lrlglDrawVertexArrayInstanced( lua_State *L ) {
int offset = luaL_checkinteger( L, 1 );
int count = luaL_checkinteger( L, 2 );
int instances = luaL_checkinteger( L, 3 );
rlDrawVertexArrayInstanced( offset, count, instances );
return 0;
}
/*
> RL.rlDrawVertexArrayElementsInstanced( int offset, int count, Buffer buffer, int instances )
Draw vertex array elements instanced
*/
int lrlglDrawVertexArrayElementsInstanced( lua_State *L ) {
int offset = luaL_checkinteger( L, 1 );
int count = luaL_checkinteger( L, 2 );
Buffer *buffer = uluaGetBuffer( L, 3 );
int instances = luaL_checkinteger( L, 4 );
rlDrawVertexArrayElementsInstanced( offset, count, buffer->data, instances );
return 0;
}
/*
## RLGL - Textures management
*/
/*
> id = RL.rlLoadTexture( Buffer data, Vector2 size, int format, int mipmapCount )
Load texture in GPU
- Success return int
*/
int lrlglLoadTexture( lua_State *L ) {
Buffer *data = uluaGetBuffer( L, 1 );
Vector2 size = uluaGetVector2( L, 2 );
int format = luaL_checkinteger( L, 3 );
int mipmapCount = luaL_checkinteger( L, 4 );
lua_pushinteger( L, rlLoadTexture( data->data, size.x, size.y, format, mipmapCount ) );
return 1;
}
/*
> id = RL.rlLoadTextureDepth( Vector2 size, bool useRenderBuffer )
Load depth texture/renderbuffer (to be attached to fbo)
- Success return int
*/
int lrlglLoadTextureDepth( lua_State *L ) {
Vector2 size = uluaGetVector2( L, 1 );
bool useRenderBuffer = uluaGetBoolean( L, 2 );
lua_pushinteger( L, rlLoadTextureDepth( size.x, size.y, useRenderBuffer ) );
return 1;
}
/*
> id = RL.rlLoadTextureCubemap( Buffer data, int size, int format )
Load texture cubemap
- Success return int
*/
int lrlglLoadTextureCubemap( lua_State *L ) {
Buffer *data = uluaGetBuffer( L, 1 );
int size = luaL_checkinteger( L, 2 );
int format = luaL_checkinteger( L, 3 );
lua_pushinteger( L, rlLoadTextureCubemap( data->data, size, format ) );
return 1;
}
/*
> RL.rlUpdateTexture( int id, Vector2 offset, Vector2 size, int format, Buffer data )
Update GPU texture with new data
*/
int lrlglUpdateTexture( lua_State *L ) {
unsigned int id = (unsigned int)luaL_checkinteger( L, 1 );
Vector2 offset = uluaGetVector2( L, 2 );
Vector2 size = uluaGetVector2( L, 3 );
int format = luaL_checkinteger( L, 4 );
Buffer *data = uluaGetBuffer( L, 5 );
rlUpdateTexture( id, (int)offset.x, (int)offset.y, (int)size.x, (int)size.y, format, data->data );
return 1;
}
/*
> glInternalFormat, glFormat, glType = RL.rlGetGlTextureFormats( int format )
Get OpenGL internal formats
- Success return int, int, int
*/
int lrlglGetGlTextureFormats( lua_State *L ) {
int format = luaL_checkinteger( L, 1 );
unsigned int glInternalFormat, glFormat, glType;
rlGetGlTextureFormats( format, &glInternalFormat, &glFormat, &glType );
lua_pushinteger( L, glInternalFormat );
lua_pushinteger( L, glFormat );
lua_pushinteger( L, glType );
return 3;
}
/*
> name = RL.rlGetPixelFormatName( int format )
Get name string for pixel format
- Success return string
*/
int lrlglGetPixelFormatName( lua_State *L ) {
int format = luaL_checkinteger( L, 1 );
lua_pushstring( L, rlGetPixelFormatName( format ) );
return 1;
}
/*
> RL.rlUnloadTexture( int id )
Unload texture from GPU memory
*/
int lrlglUnloadTexture( lua_State *L ) {
rlUnloadTexture( (unsigned int)luaL_checkinteger( L, 1 ) );
return 0;
}
/*
> mipmapCount = RL.rlGenTextureMipmaps( int id, Vector2 size, int format )
Generate mipmap data for selected texture
- Success return int
*/
int lrlglGenTextureMipmaps( lua_State *L ) {
unsigned int id = (unsigned int)luaL_checkinteger( L, 1 );
Vector2 size = uluaGetVector2( L, 2 );
int format = luaL_checkinteger( L, 3 );
int mipmaps = 0;
rlGenTextureMipmaps( id, (int)size.x, (int)size.y, format, &mipmaps );
lua_pushinteger( L, mipmaps );
return 1;
}
/*
> data = RL.rlReadTexturePixels( int id, Vector2 size, int format )
Read texture pixel data
- Success return Buffer
*/
int lrlglReadTexturePixels( lua_State *L ) {
unsigned int id = (unsigned int)luaL_checkinteger( L, 1 );
Vector2 size = uluaGetVector2( L, 2 );
int format = luaL_checkinteger( L, 3 );
size_t dataSize = GetPixelDataSize( size.x, size.y, format );
Buffer data = {
.type = BUFFER_UNSIGNED_CHAR,
.size = dataSize,
.data = malloc( dataSize )
};
data.data = rlReadTexturePixels( id, (int)size.x, (int)size.y, format );
uluaPushBuffer( L, data );
return 1;
}
/*
> data = RL.rlReadScreenPixels( Vector2 size )
Read screen pixel data (color buffer)
- Success return Buffer
*/
int lrlglReadScreenPixels( lua_State *L ) {
Vector2 size = uluaGetVector2( L, 1 );
size_t dataSize = (int)size.x * (int)size.y * 4 * sizeof(unsigned char);
Buffer data = {
.type = BUFFER_UNSIGNED_CHAR,
.size = dataSize,
.data = malloc( dataSize )
};
data.data = rlReadScreenPixels( (int)size.x, (int)size.y );
uluaPushBuffer( L, data );
return 1;
}
/*
## RLGL - Framebuffer management (fbo)
*/
/*
> fboId = RL.rlLoadFramebuffer( Vector2 size )
Load an empty framebuffer
- Success return int
*/
int lrlglLoadFramebuffer( lua_State *L ) {
Vector2 size = uluaGetVector2( L, 1 );
lua_pushinteger( L, rlLoadFramebuffer( size.x, size.y ) );
return 1;
}
/*
> RL.rlFramebufferAttach( int fboId, int texId, int attachType, int texType, int mipLevel )
Attach texture/renderbuffer to a framebuffer
*/
int lrlglFramebufferAttach( lua_State *L ) {
unsigned int fboId = luaL_checkinteger( L, 1 );
unsigned int texId = luaL_checkinteger( L, 2 );
int attachType = luaL_checkinteger( L, 3 );
int texType = luaL_checkinteger( L, 4 );
int mipLevel = luaL_checkinteger( L, 5 );
rlFramebufferAttach( fboId, texId, attachType, texType, mipLevel );
return 0;
}
/*
> isComplete = RL.rlFramebufferComplete( int id )
Verify framebuffer is complete
- Success return bool
*/
int lrlglFramebufferComplete( lua_State *L ) {
unsigned int id = luaL_checkinteger( L, 1 );
lua_pushboolean( L, rlFramebufferComplete( id ) );
return 1;
}
/*
> RL.rlUnloadFramebuffer( int id )
Delete framebuffer from GPU
*/
int lrlglUnloadFramebuffer( lua_State *L ) {
unsigned int id = luaL_checkinteger( L, 1 );
rlUnloadFramebuffer( id );
return 0;
}
/*
## RLGL - Shaders management
*/
/*
> shaderId = RL.rlLoadShaderCode( string vsCode, string fsCode )
Load shader from code strings
- Success return int
*/
int lrlglLoadShaderCode( lua_State *L ) {
lua_pushinteger( L, rlLoadShaderCode( luaL_checkstring( L, 1 ), luaL_checkstring( L, 2 ) ) );
return 1;
}
/*
> shaderId = RL.rlCompileShader( string shaderCode, int type )
Compile custom shader and return shader id (type: RL_VERTEX_SHADER, RL_FRAGMENT_SHADER, RL_COMPUTE_SHADER)
- Success return int
*/
int lrlglCompileShader( lua_State *L ) {
int type = luaL_checkinteger( L, 2 );
lua_pushinteger( L, rlCompileShader( luaL_checkstring( L, 1 ), type ) );
return 1;
}
/*
> shaderProgramId = RL.rlLoadShaderProgram( int vShaderId, int fShaderId )
Load custom shader program
- Success return int
*/
int lrlglLoadShaderProgram( lua_State *L ) {
unsigned int vShaderId = (unsigned int)luaL_checkinteger( L, 1 );
unsigned int fShaderId = (unsigned int)luaL_checkinteger( L, 2 );
lua_pushinteger( L, rlLoadShaderProgram( vShaderId, fShaderId ) );
return 1;
}
/*
> RL.rlUnloadShaderProgram( int id )
Unload shader program
*/
int lrlglUnloadShaderProgram( lua_State *L ) {
unsigned int id = (unsigned int)luaL_checkinteger( L, 1 );
rlUnloadShaderProgram( id );
return 0;
}
/*
> location = RL.rlGetLocationUniform( int shaderId, string uniformName )
Get shader location uniform
- Success return int
*/
int lrlglGetLocationUniform( lua_State *L ) {
unsigned int shaderId = (unsigned int)luaL_checkinteger( L, 1 );
lua_pushinteger( L, rlGetLocationUniform( shaderId, luaL_checkstring( L, 2 ) ) );
return 1;
}
/*
> location = RL.rlGetLocationAttrib( int shaderId, string attribName )
Get shader location attribute
- Success return int
*/
int lrlglGetLocationAttrib( lua_State *L ) {
unsigned int shaderId = (unsigned int)luaL_checkinteger( L, 1 );
lua_pushinteger( L, rlGetLocationAttrib( shaderId, luaL_checkstring( L, 2 ) ) );
return 1;
}
/*
> RL.rlSetUniform( int locIndex, Buffer value, int uniformType, int count )
Set shader value uniform
*/
int lrlglSetUniform( lua_State *L ) {
int locIndex = luaL_checkinteger( L, 1 );
Buffer *value = uluaGetBuffer( L, 2 );
int uniformType = luaL_checkinteger( L, 3 );
int count = luaL_checkinteger( L, 4 );
rlSetUniform( locIndex, value->data, uniformType, count );
return 0;
}
/*
> RL.rlSetUniformMatrix( int locIndex, Matrix mat )
Set shader value matrix
*/
int lrlglSetUniformMatrix( lua_State *L ) {
int locIndex = luaL_checkinteger( L, 1 );
Matrix mat = uluaGetMatrix( L, 2 );
rlSetUniformMatrix( locIndex, mat );
return 0;
}
/*
> RL.rlSetUniformSampler( int locIndex, int textureId )
Set shader value sampler
*/
int lrlglSetUniformSampler( lua_State *L ) {
int locIndex = luaL_checkinteger( L, 1 );
unsigned int textureId = (unsigned int)luaL_checkinteger( L, 2 );
rlSetUniformSampler( locIndex, textureId );
return 0;
}
/*
> RL.rlSetShader( int id, int{} locs )
Set shader currently active (id and locations)
*/
int lrlglSetShader( lua_State *L ) {
unsigned int id = (unsigned int)luaL_checkinteger( L, 1 );
int t = 2, i = 0;
lua_pushnil( L );
while ( lua_next( L, t ) != 0 ) {
if ( lua_isnumber( L, -1 ) ) {
if ( i < RL_MAX_SHADER_LOCATIONS ) {
state->RLGLcurrentShaderLocs[i] = lua_tointeger( L, -1 );
}
}
i++;
lua_pop( L, 1 );
}
rlSetShader( id, state->RLGLcurrentShaderLocs );
return 0;
}
/*
## RLGL - Compute shader management
*/
/*
> programId = RL.rlLoadComputeShaderProgram( int shaderId )
Load compute shader program
- Success return int
*/
int lrlglLoadComputeShaderProgram( lua_State *L ) {
unsigned int shaderId = (unsigned int)luaL_checkinteger( L, 1 );
lua_pushinteger( L, rlLoadComputeShaderProgram( shaderId ) );
return 1;
}
/*
> RL.rlComputeShaderDispatch( int groupX, int groupY, int groupZ )
Dispatch compute shader (equivalent to *draw* for graphics pipeline)
*/
int lrlglComputeShaderDispatch( lua_State *L ) {
unsigned int groupX = (unsigned int)luaL_checkinteger( L, 1 );
unsigned int groupY = (unsigned int)luaL_checkinteger( L, 2 );
unsigned int groupZ = (unsigned int)luaL_checkinteger( L, 3 );
rlComputeShaderDispatch( groupX, groupY, groupZ );
return 0;
}
/*
## RLGL - Shader buffer storage object management (ssbo)
*/
/*
> buffer = RL.rlLoadShaderBuffer( int size, Buffer data, int usageHint )
Load shader storage buffer object (SSBO)
- Success return int
*/
int lrlglLoadShaderBuffer( lua_State *L ) {
unsigned int size = (unsigned int)luaL_checkinteger( L, 1 );
Buffer *data = uluaGetBuffer( L, 2 );
int usageHint = luaL_checkinteger( L, 3 );
lua_pushinteger( L, rlLoadShaderBuffer( size, data->data, usageHint ) );
return 1;
}
/*
> RL.rlUnloadShaderBuffer( int ssboId )
Unload shader storage buffer object (SSBO)
*/
int lrlglUnloadShaderBuffer( lua_State *L ) {
unsigned int ssboId = (unsigned int)luaL_checkinteger( L, 1 );
rlUnloadShaderBuffer( ssboId );
return 0;
}
/*
> RL.rlUpdateShaderBuffer( int id, Buffer data, int offset )
Update SSBO buffer data
*/
int lrlglUpdateShaderBuffer( lua_State *L ) {
unsigned int id = (unsigned int)luaL_checkinteger( L, 1 );
Buffer *data = uluaGetBuffer( L, 2 );
unsigned int offset = (unsigned int)luaL_checkinteger( L, 3 );
rlUpdateShaderBuffer( id, data->data, data->size, offset );
return 0;
}
/*
> RL.rlBindShaderBuffer( int id, int index )
Bind SSBO buffer
*/
int lrlglBindShaderBuffer( lua_State *L ) {
unsigned int id = (unsigned int)luaL_checkinteger( L, 1 );
unsigned int index = (unsigned int)luaL_checkinteger( L, 2 );
rlBindShaderBuffer( id, index );
return 0;
}
/*
> data = RL.rlReadShaderBuffer( int id, int count, int offset )
Read SSBO buffer data (GPU->CPU)
- Success return Buffer
*/
int lrlglReadShaderBuffer( lua_State *L ) {
unsigned int id = (unsigned int)luaL_checkinteger( L, 1 );
unsigned int count = (unsigned int)luaL_checkinteger( L, 2 );
unsigned int offset = (unsigned int)luaL_checkinteger( L, 3 );
Buffer dest = {
.type = BUFFER_UNSIGNED_CHAR,
.size = count,
.data = malloc( count * sizeof( unsigned char ) )
};
rlReadShaderBuffer( id, &dest.data, count, offset );
uluaPushBuffer( L, dest );
return 1;
}
/*
> RL.rlCopyShaderBuffer( int destId, int srcId, int destOffset, int srcOffset, int count )
Copy SSBO data between buffers
*/
int lrlglCopyShaderBuffer( lua_State *L ) {
unsigned int destId = (unsigned int)luaL_checkinteger( L, 1 );
unsigned int srcId = (unsigned int)luaL_checkinteger( L, 2 );
unsigned int destOffset = (unsigned int)luaL_checkinteger( L, 3 );
unsigned int srcOffset = (unsigned int)luaL_checkinteger( L, 4 );
unsigned int count = (unsigned int)luaL_checkinteger( L, 5 );
rlCopyShaderBuffer( destId, srcId, destOffset, srcOffset, count );
return 0;
}
/*
> size = RL.rlGetShaderBufferSize( int id )
Get SSBO buffer size
- Success return int
*/
int lrlglGetShaderBufferSize( lua_State *L ) {
unsigned int id = (unsigned int)luaL_checkinteger( L, 1 );
lua_pushinteger( L, rlGetShaderBufferSize( id ) );
return 1;
}
/*
## RLGL - Buffer management
*/
/*
> RL.rlBindImageTexture( int id, int index, int format, bool readonly )
Bind image texture
*/
int lrlglBindImageTexture( lua_State *L ) {
unsigned int id = (unsigned int)luaL_checkinteger( L, 1 );
unsigned int index = (unsigned int)luaL_checkinteger( L, 2 );
int format = luaL_checkinteger( L, 3 );
bool readonly = uluaGetBoolean( L, 4 );
rlBindImageTexture( id, index, format, readonly );
return 0;
}
/*
## RLGL - Matrix state management
*/
/*
> modelview = RL.rlGetMatrixModelview()
Get internal modelview matrix
- Success return Matrix
*/
int lrlglGetMatrixModelview( lua_State *L ) {
uluaPushMatrix( L, rlGetMatrixModelview() );
return 1;
}
/*
> projection = RL.rlGetMatrixProjection()
Get internal projection matrix
- Success return Matrix
*/
int lrlglGetMatrixProjection( lua_State *L ) {
uluaPushMatrix( L, rlGetMatrixProjection() );
return 1;
}
/*
> transform = RL.rlGetMatrixTransform()
Get internal accumulated transform matrix
- Success return Matrix
*/
int lrlglGetMatrixTransform( lua_State *L ) {
uluaPushMatrix( L, rlGetMatrixTransform() );
return 1;
}
/*
> projection = RL.rlGetMatrixProjectionStereo( int eye )
Get internal projection matrix for stereo render (selected eye)
- Success return Matrix
*/
int lrlglGetMatrixProjectionStereo( lua_State *L ) {
uluaPushMatrix( L, rlGetMatrixProjectionStereo( luaL_checkinteger( L, 1 ) ) );
return 1;
}
/*
> viewOffset = RL.rlGetMatrixViewOffsetStereo( int eye )
Get internal view offset matrix for stereo render (selected eye)
- Success return Matrix
*/
int lrlglGetMatrixViewOffsetStereo( lua_State *L ) {
uluaPushMatrix( L, rlGetMatrixViewOffsetStereo( luaL_checkinteger( L, 1 ) ) );
return 1;
}
/*
> RL.rlSetMatrixProjection( Matrix proj )
Set a custom projection matrix (replaces internal projection matrix)
*/
int lrlglSetMatrixProjection( lua_State *L ) {
rlSetMatrixProjection( uluaGetMatrix( L, 1 ) );
return 0;
}
/*
> RL.rlSetMatrixModelview( Matrix view )
Set a custom modelview matrix (replaces internal modelview matrix)
*/
int lrlglSetMatrixModelview( lua_State *L ) {
rlSetMatrixModelview( uluaGetMatrix( L, 1 ) );
return 0;
}
/*
> RL.rlSetMatrixProjectionStereo( Matrix right, Matrix left )
Set eyes projection matrices for stereo rendering
*/
int lrlglSetMatrixProjectionStereo( lua_State *L ) {
rlSetMatrixProjectionStereo( uluaGetMatrix( L, 1 ), uluaGetMatrix( L, 2 ) );
return 0;
}
/*
> RL.rlSetMatrixViewOffsetStereo( Matrix right, Matrix left )
Set eyes view offsets matrices for stereo rendering
*/
int lrlglSetMatrixViewOffsetStereo( lua_State *L ) {
rlSetMatrixViewOffsetStereo( uluaGetMatrix( L, 1 ), uluaGetMatrix( L, 2 ) );
return 0;
}