From ba4595305fe426f81233ebbb20fc94cd86d07af9 Mon Sep 17 00:00:00 2001 From: jussi Date: Thu, 14 Dec 2023 23:08:19 +0200 Subject: RLGL Hello triangle example. --- API.md | 18 +++- ReiLua_API.lua | 14 ++- changelog | 4 + examples/rlgl/main.lua | 83 ---------------- examples/rlgl_hello_triangle/main.lua | 177 ++++++++++++++++++++++++++++++++++ include/core.h | 1 + include/textures.h | 1 + src/core.c | 15 +++ src/lua_core.c | 2 + src/rlgl.c | 4 +- src/textures.c | 22 +++++ 11 files changed, 254 insertions(+), 87 deletions(-) delete mode 100644 examples/rlgl/main.lua create mode 100644 examples/rlgl_hello_triangle/main.lua diff --git a/API.md b/API.md index 387c9e4..f6acb27 100644 --- a/API.md +++ b/API.md @@ -3984,6 +3984,14 @@ Check if a shader is ready --- +> shaderId = RL.GetShaderId( Shader shader ) + +Get shader program id + +- Success return int + +--- + > location = RL.GetShaderLocation( Shader shader, string uniformName ) Get shader uniform location @@ -5842,6 +5850,14 @@ Get image pixel color at (x, y) position --- +> imageData = RL.GetImageData( Image image ) + +Get image data as Buffer + +- Success return Buffer + +--- + > size = RL.GetImageSize( Image image ) Get image size @@ -9573,7 +9589,7 @@ Unload vertex buffer (VBO) > RL.rlSetVertexAttribute( int index, int compSize, int type, bool normalized, int stride, int pointer ) -Set vertex attribute +Set vertex attribute. Note! Pointer should be given in size of bytes --- diff --git a/ReiLua_API.lua b/ReiLua_API.lua index 1e35277..2c72ded 100644 --- a/ReiLua_API.lua +++ b/ReiLua_API.lua @@ -1564,6 +1564,12 @@ function RL.LoadShaderFromMemory( vsCode, fsCode ) end ---@return any isReady function RL.IsShaderReady( shader ) end +---Get shader program id +---- Success return int +---@param shader any +---@return any shaderId +function RL.GetShaderId( shader ) end + ---Get shader uniform location ---- Success return int ---@param shader any @@ -3248,6 +3254,12 @@ function RL.GetImageColor( image, pixelPos ) end -- Textures - Image configuration functions +---Get image data as Buffer +---- Success return Buffer +---@param image any +---@return any imageData +function RL.GetImageData( image ) end + ---Get image size ---- Success return Vector2 ---@param image any @@ -6615,7 +6627,7 @@ function RL.rlUnloadVertexArray( vaoId ) end ---@return any RL.rlUnloadVertexBuffer function RL.rlUnloadVertexBuffer( vboId ) end ----Set vertex attribute +---Set vertex attribute. Note! Pointer should be given in size of bytes ---@param index integer ---@param compSize integer ---@param type integer diff --git a/changelog b/changelog index e90f80f..424ef69 100644 --- a/changelog +++ b/changelog @@ -23,6 +23,7 @@ KEY CHANGES: - ADDED: More Model management functions. - ADDED: More Model animations management functions. - ADDED: 2D lightmap example. + - ADDED: RLGL Hello triangle example. DETAILED CHANGES: - REMOVED: DrawLineBezierQuad, DrawLineBezierCubic. @@ -44,6 +45,9 @@ DETAILED CHANGES: - CHANGE: Renamed ExportBufferAsCode to ExportDataAsCode. - ADDED: BoneInfo. - ADDED: Transform. + - ADDED: GetShaderId. + - FIXED: rlSetVertexAttribute pointer offset. + - ADDED: GetImageData. ------------------------------------------------------------------------ Release: ReiLua version 0.6.0 Using Raylib 4.5 diff --git a/examples/rlgl/main.lua b/examples/rlgl/main.lua deleted file mode 100644 index 4b59419..0000000 --- a/examples/rlgl/main.lua +++ /dev/null @@ -1,83 +0,0 @@ --- Work In Progress! - -local monitor = 0 -local texture = -1 -local triSize = 32.0 -local vertices = { - 0.0, 0.0, 0.0, - 0.0, 0.0, triSize, - triSize, 0.0, triSize -} -local colors = { - 255, 0, 0, - 0, 255, 0, - 0, 0, 255 -} - -local VBO_VERTEX_POS = 0 -local VBO_COLOR_POS = 1 - -local mesh = { - vaoId = -1, - vboIds = { - vertices = -1, - colors = -1, - } -} - -local function uploadMesh() - mesh.vaoId = RL.rlLoadVertexArray() - - RL.rlEnableVertexArray( mesh.vaoId ) - - -- Vertices. - local vertexBuffer = RL.LoadBuffer( vertices, RL.BUFFER_FLOAT ) - mesh.vboIds.vertices = RL.rlLoadVertexBuffer( vertexBuffer, false ) - RL.rlSetVertexAttribute( VBO_VERTEX_POS, 3, RL.RL_FLOAT, false, 0, 0 ) - RL.rlEnableVertexAttribute( VBO_VERTEX_POS ) - - -- Colors. - local colorBuffer = RL.LoadBuffer( colors, RL.BUFFER_UNSIGNED_CHAR ) - mesh.vboIds.colors = RL.rlLoadVertexBuffer( colorBuffer, false ) - RL.rlSetVertexAttribute( VBO_COLOR_POS, 4, RL.RL_UNSIGNED_BYTE, false, 0, 0 ) - RL.rlEnableVertexAttribute( VBO_COLOR_POS ) - - RL.rlDisableVertexArray() - - print( "\nMesh:" ) - print( "\tvaoId: "..mesh.vaoId ) - print( "\tvboIds.vertices: "..mesh.vboIds.vertices ) - print( "\tvboIds.colors: "..mesh.vboIds.colors ) -end - -function RL.init() - local mPos = RL.GetMonitorPosition( monitor ) - local mSize = RL.GetMonitorSize( monitor ) - local winSize = RL.GetScreenSize() - - RL.SetWindowState( RL.FLAG_WINDOW_RESIZABLE ) - RL.SetWindowState( RL.FLAG_VSYNC_HINT ) - RL.SetWindowPosition( { mPos[1] + mSize[1] / 2 - winSize[1] / 2, mPos[2] + mSize[2] / 2 - winSize[2] / 2 } ) - - uploadMesh() -end - -local function drawMesh() -end - -function RL.draw() - RL.ClearBackground( { 100, 150, 100 } ) -end - --- You need to manually free resources. -function RL.exit() - if 0 <= mesh.vaoId then - RL.rlUnloadVertexArray( mesh.vaoId ) - end - - for _, vboId in pairs( mesh.vboIds ) do - if 0 <= vboId then - RL.rlUnloadVertexBuffer( vboId ) - end - end -end \ No newline at end of file diff --git a/examples/rlgl_hello_triangle/main.lua b/examples/rlgl_hello_triangle/main.lua new file mode 100644 index 0000000..571acb0 --- /dev/null +++ b/examples/rlgl_hello_triangle/main.lua @@ -0,0 +1,177 @@ +package.path = package.path..";"..RL.GetBasePath().."../resources/lib/?.lua" + +Util = require( "utillib" ) +Vec2 = require( "vector2" ) + +local res = Vec2:new( 1024, 720 ) +local winScale = 1 +local winSize = res:scale( winScale ) +local monitor = 0 + +local triangle = { + texture = { + id = -1, + data = nil, + size = Vec2:new(), + mipmaps = 0, + format = 0, + }, + vao = -1, + vbos = { + positions = -1, + texcoords = -1, + colors = -1, + }, +} + +local vertexShader = [[ + #version 330 core + layout (location = 0) in vec3 aPos; + layout (location = 1) in vec4 aColor; + layout (location = 2) in vec2 aTexCoord; + + out vec4 flagColor; + out vec2 fragTexCoord; + + void main() { + flagColor = aColor; + fragTexCoord = aTexCoord; + gl_Position = vec4( aPos, 1.0 ); + } +]] +local fragmentShader = [[ + #version 330 core + out vec4 FragColor; + + in vec4 flagColor; + in vec2 fragTexCoord; + + uniform sampler2D ourTexture; + + void main() { + FragColor = texture( ourTexture, fragTexCoord ) * flagColor; + } +]] + +local shaderProgram = -1 + +-- Let's make our own custom texture. +local function loadTexture( path ) + local image = RL.LoadImage( path ) + + triangle.texture.data = RL.GetImageData( image ) + triangle.texture.size = Vec2:new( RL.GetImageSize( image ) ) + triangle.texture.format = RL.GetImageFormat( image ) + triangle.texture.mipmaps = RL.GetImageMipmaps( image ) + + triangle.texture.id = RL.rlLoadTexture( + triangle.texture.data, + triangle.texture.size, + triangle.texture.format, + triangle.texture.mipmaps + ) +end + +local function createTriangle() + loadTexture( RL.GetBasePath().."../resources/images/monkey_tex.png" ) + -- Set texture to shader uniform. + local shaderLoc = RL.rlGetLocationUniform( shaderProgram, "ourTexture" ) + + RL.rlEnableShader( shaderProgram ) + -- NOTE: Default texture is always activated as GL_TEXTURE0 so our slot will be 1. + RL.rlSetUniformSampler( shaderLoc, triangle.texture.id ) + RL.rlDisableShader() + + -- Setup triangle buffers. + triangle.vao = RL.rlLoadVertexArray() + RL.rlEnableVertexArray( triangle.vao ) + + -- Positions. + local vertexBuffer = RL.LoadBuffer( + { + -0.5, -0.5, 0.0, + 0.5, -0.5, 0.0, + 0.0, 0.5, 0.0 + }, + RL.BUFFER_FLOAT + ) + triangle.vbos.positions = RL.rlLoadVertexBuffer( vertexBuffer, false ) + RL.rlSetVertexAttribute( 0, 3, RL.RL_FLOAT, false, 0, 0 ) + RL.rlEnableVertexAttribute( 0 ) + + -- Colors. + local colors = RL.LoadBuffer( + { + 1, 0, 0, 1, + 0, 1, 0, 1, + 0, 0, 1, 1 + }, + RL.BUFFER_FLOAT + ) + triangle.vbos.colors = RL.rlLoadVertexBuffer( colors, false ) + RL.rlSetVertexAttribute( 1, 4, RL.RL_FLOAT, false, 0, 0 ) + RL.rlEnableVertexAttribute( 1 ) + + -- Texcoords. + local texcoors = RL.LoadBuffer( + { + 0, 0, + 1, 0, + 0.5, 1, + }, + RL.BUFFER_FLOAT + ) + triangle.vbos.texcoors = RL.rlLoadVertexBuffer( texcoors, false ) + RL.rlSetVertexAttribute( 2, 2, RL.RL_FLOAT, false, 0, 0 ) + RL.rlEnableVertexAttribute( 2 ) + + -- Disable. + RL.rlDisableVertexBuffer() + RL.rlDisableVertexArray() +end + +function RL.init() + local monitorPos = Vec2:new( RL.GetMonitorPosition( monitor ) ) + local monitorSize = Vec2:new( RL.GetMonitorSize( monitor ) ) + + RL.SetWindowTitle( "RLGL Hello Triangle" ) + RL.SetWindowState( RL.FLAG_WINDOW_RESIZABLE ) + RL.SetWindowState( RL.FLAG_VSYNC_HINT ) + RL.SetWindowSize( winSize ) + RL.SetWindowPosition( { monitorPos.x + monitorSize.x / 2 - winSize.x / 2, monitorPos.y + monitorSize.y / 2 - winSize.y / 2 } ) + + RL.rlViewport( { 0, 0, res.x ,res.y } ) + shaderProgram = RL.rlLoadShaderCode( vertexShader, fragmentShader ) + + createTriangle() +end + +local function drawTriangle() + -- Texture slot 0 is the default texture. + RL.rlActiveTextureSlot( 1 ) + RL.rlEnableTexture( triangle.texture.id ) + + RL.rlEnableShader( shaderProgram ) + + RL.rlEnableVertexArray( triangle.vao ) + RL.rlDrawVertexArray( 0, 3 ) + + -- Disable. + RL.rlDisableVertexArray() + RL.rlDisableVertexBuffer() + RL.rlDisableTexture() + RL.rlDisableShader() +end + +function RL.draw() + RL.ClearBackground( RL.BLACK ) + drawTriangle() +end + +function RL.exit() + RL.rlUnloadVertexArray( triangle.vao ) + RL.rlUnloadVertexBuffer( triangle.vbos.positions ) + RL.rlUnloadVertexBuffer( triangle.vbos.colors ) + RL.rlUnloadVertexBuffer( triangle.vbos.texcoords ) + RL.rlUnloadTexture( triangle.texture.id ) +end diff --git a/include/core.h b/include/core.h index 5103cb8..ddfefb1 100644 --- a/include/core.h +++ b/include/core.h @@ -71,6 +71,7 @@ int lcoreEndScissorMode( lua_State *L ); int lcoreLoadShader( lua_State *L ); int lcoreLoadShaderFromMemory( lua_State *L ); int lcoreIsShaderReady( lua_State *L ); +int lcoreGetShaderId( lua_State *L ); int lcoreGetShaderLocation( lua_State *L ); int lcoreGetShaderLocationAttrib( lua_State *L ); int lcoreSetShaderLocationIndex( lua_State *L ); diff --git a/include/textures.h b/include/textures.h index 90c7bb8..288a536 100644 --- a/include/textures.h +++ b/include/textures.h @@ -56,6 +56,7 @@ int ltexturesLoadImagePalette( lua_State *L ); int ltexturesGetImageAlphaBorder( lua_State *L ); int ltexturesGetImageColor( lua_State *L ); /* Image configuration functions. */ +int ltexturesGetImageData( lua_State *L ); int ltexturesGetImageSize( lua_State *L ); int ltexturesGetImageMipmaps( lua_State *L ); int ltexturesGetImageFormat( lua_State *L ); diff --git a/src/core.c b/src/core.c index 2513649..9dfbe01 100644 --- a/src/core.c +++ b/src/core.c @@ -884,6 +884,21 @@ int lcoreIsShaderReady( lua_State *L ) { return 1; } +/* +> shaderId = RL.GetShaderId( Shader shader ) + +Get shader program id + +- Success return int +*/ +int lcoreGetShaderId( lua_State *L ) { + Shader *shader = uluaGetShader( L, 1 ); + + lua_pushinteger( L, shader->id ); + + return 1; +} + /* > location = RL.GetShaderLocation( Shader shader, string uniformName ) diff --git a/src/lua_core.c b/src/lua_core.c index 6195c9f..68fb05b 100644 --- a/src/lua_core.c +++ b/src/lua_core.c @@ -1225,6 +1225,7 @@ void luaRegister() { assingGlobalFunction( "LoadShader", lcoreLoadShader ); assingGlobalFunction( "LoadShaderFromMemory", lcoreLoadShaderFromMemory ); assingGlobalFunction( "IsShaderReady", lcoreIsShaderReady ); + assingGlobalFunction( "GetShaderId", lcoreGetShaderId ); assingGlobalFunction( "GetShaderLocation", lcoreGetShaderLocation ); assingGlobalFunction( "GetShaderLocationAttrib", lcoreGetShaderLocationAttrib ); assingGlobalFunction( "SetShaderLocationIndex", lcoreSetShaderLocationIndex ); @@ -1497,6 +1498,7 @@ void luaRegister() { assingGlobalFunction( "GetImageAlphaBorder", ltexturesGetImageAlphaBorder ); assingGlobalFunction( "GetImageColor", ltexturesGetImageColor ); /* Image configuration functions. */ + assingGlobalFunction( "GetImageData", ltexturesGetImageData ); assingGlobalFunction( "GetImageSize", ltexturesGetImageSize ); assingGlobalFunction( "GetImageMipmaps", ltexturesGetImageMipmaps ); assingGlobalFunction( "GetImageFormat", ltexturesGetImageFormat ); diff --git a/src/rlgl.c b/src/rlgl.c index 65a57a1..a71aa61 100644 --- a/src/rlgl.c +++ b/src/rlgl.c @@ -1105,7 +1105,7 @@ int lrlglUnloadVertexBuffer( lua_State *L ) { /* > RL.rlSetVertexAttribute( int index, int compSize, int type, bool normalized, int stride, int pointer ) -Set vertex attribute +Set vertex attribute. Note! Pointer should be given in size of bytes */ int lrlglSetVertexAttribute( lua_State *L ) { int index = luaL_checkinteger( L, 1 ); @@ -1115,7 +1115,7 @@ int lrlglSetVertexAttribute( lua_State *L ) { int stride = luaL_checkinteger( L, 5 ); int pointer = luaL_checkinteger( L, 6 ); - rlSetVertexAttribute( index, compSize, type, normalized, stride, &pointer ); + rlSetVertexAttribute( index, compSize, type, normalized, stride, (void*)( pointer * sizeof( char ) ) ); return 0; } diff --git a/src/textures.c b/src/textures.c index 717db91..8a99b34 100644 --- a/src/textures.c +++ b/src/textures.c @@ -839,6 +839,28 @@ int ltexturesGetImageColor( lua_State *L ) { ## Textures - Image configuration functions */ +/* +> imageData = RL.GetImageData( Image image ) + +Get image data as Buffer + +- Success return Buffer +*/ +int ltexturesGetImageData( lua_State *L ) { + Image *image = uluaGetImage( L, 1 ); + + Buffer buffer = (Buffer){ + .type = BUFFER_UNSIGNED_CHAR, + .size = GetPixelDataSize( image->width, image->height, image->format ), + }; + buffer.data = malloc( buffer.size * sizeof( unsigned char ) ); + memcpy( buffer.data, image->data, buffer.size ); + + uluaPushBuffer( L, buffer ); + + return 1; +} + /* > size = RL.GetImageSize( Image image ) -- cgit v1.2.3