summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjussi2025-03-17 21:51:49 +0200
committerjussi2025-03-17 21:51:49 +0200
commitd0bfd1f71d852eb55ec0e94792a02c7291080633 (patch)
tree9470401863a64edb689ca7692b0a7d4810f3b9ed
parent7d59796907b4582eb8a64e7e52a3a428f0d7434d (diff)
downloadreilua-enhanced-d0bfd1f71d852eb55ec0e94792a02c7291080633.tar.gz
reilua-enhanced-d0bfd1f71d852eb55ec0e94792a02c7291080633.tar.bz2
reilua-enhanced-d0bfd1f71d852eb55ec0e94792a02c7291080633.zip
Fast tilemap example.
-rw-r--r--changelog1
-rw-r--r--examples/events/main.lua165
-rw-r--r--examples/fast_tilemap/main.lua103
-rw-r--r--src/platforms/core_desktop_sdl3.c2
4 files changed, 187 insertions, 84 deletions
diff --git a/changelog b/changelog
index 3102ae3..9ab0e2f 100644
--- a/changelog
+++ b/changelog
@@ -43,6 +43,7 @@ DETAILED CHANGES:
- FIXED: Added rlDisableShader for SetShaderValue* functions to prevent bugs.
Should be removed if added back in raylib.
- ADDED: SDL3 Events.
+ - ADDED: Fast tilemap example.
------------------------------------------------------------------------
Release: ReiLua version 0.8.0 Using Raylib 5.0 and Forked Raygui 4.0
diff --git a/examples/events/main.lua b/examples/events/main.lua
index 4e37e5d..3cd09e5 100644
--- a/examples/events/main.lua
+++ b/examples/events/main.lua
@@ -8,9 +8,6 @@ function RL.init()
RL.SetWindowState( RL.FLAG_VSYNC_HINT )
RL.SetTextLineSpacing( 24 )
-
- -- RL.EnableEventWaiting()
- -- RL.DisableEventWaiting()
end
local function getEventType( event )
@@ -70,54 +67,54 @@ end
local mousePos = { 0, 0 }
local cursorMode = 1
-local pen = {
- state = RL.SDL_EVENT_PEN_UP,
- pos = { 0, 0 },
- pressure = 0,
- down = false,
- eraser = false,
-}
+-- local pen = {
+-- state = RL.SDL_EVENT_PEN_UP,
+-- pos = { 0, 0 },
+-- pressure = 0,
+-- down = false,
+-- eraser = false,
+-- }
function RL.event( event )
- -- text = "Event: "..getEventType( event ).."\n"
-
- -- if event.type == RL.GLFW_WINDOW_SIZE_EVENT then
- -- text = text.."width: "..event.width.." height: "..event.height
- -- elseif event.type == RL.GLFW_WINDOW_MAXIMIZE_EVENT then
- -- text = text.."maximized: "..event.maximized
- -- elseif event.type == RL.GLFW_WINDOW_ICONYFY_EVENT then
- -- text = text.."iconified: "..event.iconified
- -- elseif event.type == RL.GLFW_WINDOW_FOCUS_EVENT then
- -- text = text.."focused: "..event.focused
- -- elseif event.type == RL.GLFW_WINDOW_DROP_EVENT then
- -- text = text.."count: "..event.count.."\n"
- -- for _, path in ipairs( event.paths ) do
- -- text = text..path.."\n"
- -- end
- -- elseif event.type == RL.GLFW_KEY_EVENT then
- -- text = text.."key: "..event.key.." scancode: "..event.scancode.." action: "..getAction( event.action ).." mods: "..event.mods
- -- text = text .."\nkeyName: "..keyName( event.key )
- -- elseif event.type == RL.GLFW_CHAR_EVENT then
- -- text = text.."key: "..event.key
- -- -- text = text .."\nchar: "..string.char( event.key )
- -- text = text .."\nchar: "..utf8.char( event.key )
- -- elseif event.type == RL.GLFW_MOUSE_BUTTON_EVENT then
- -- text = text.."button: "..event.button.." action: "..getAction( event.action ).." mods: "..event.mods
- -- elseif event.type == RL.GLFW_MOUSE_CURSOR_POS_EVENT then
- -- text = text.."x: "..event.x.." y: "..event.y
- -- elseif event.type == RL.GLFW_MOUSE_SCROLL_EVENT then
- -- text = text.."xoffset: "..event.xoffset.." yoffset: "..event.yoffset
- -- elseif event.type == RL.GLFW_CURSOR_ENTER_EVENT then
- -- text = text.."enter: "..event.enter
- -- cursorIn = event.enter
- -- elseif event.type == RL.EVENT_JOYSTICK then
- -- text = text.."jid: "..event.jid.." event: "..event.event
- -- if event.event == RL.GLFW_CONNECTED then
- -- text = text.."\nConnected"
- -- elseif event.event == RL.GLFW_DISCONNECTED then
- -- text = text.."\nDisconnected"
- -- end
- -- end
+ text = "Event: "..getEventType( event ).."\n"
+
+ if event.type == RL.GLFW_WINDOW_SIZE_EVENT then
+ text = text.."width: "..event.width.." height: "..event.height
+ elseif event.type == RL.GLFW_WINDOW_MAXIMIZE_EVENT then
+ text = text.."maximized: "..event.maximized
+ elseif event.type == RL.GLFW_WINDOW_ICONYFY_EVENT then
+ text = text.."iconified: "..event.iconified
+ elseif event.type == RL.GLFW_WINDOW_FOCUS_EVENT then
+ text = text.."focused: "..event.focused
+ elseif event.type == RL.GLFW_WINDOW_DROP_EVENT then
+ text = text.."count: "..event.count.."\n"
+ for _, path in ipairs( event.paths ) do
+ text = text..path.."\n"
+ end
+ elseif event.type == RL.GLFW_KEY_EVENT then
+ text = text.."key: "..event.key.." scancode: "..event.scancode.." action: "..getAction( event.action ).." mods: "..event.mods
+ text = text .."\nkeyName: "..keyName( event.key )
+ elseif event.type == RL.GLFW_CHAR_EVENT then
+ text = text.."key: "..event.key
+ -- text = text .."\nchar: "..string.char( event.key )
+ text = text .."\nchar: "..utf8.char( event.key )
+ elseif event.type == RL.GLFW_MOUSE_BUTTON_EVENT then
+ text = text.."button: "..event.button.." action: "..getAction( event.action ).." mods: "..event.mods
+ elseif event.type == RL.GLFW_MOUSE_CURSOR_POS_EVENT then
+ text = text.."x: "..event.x.." y: "..event.y
+ elseif event.type == RL.GLFW_MOUSE_SCROLL_EVENT then
+ text = text.."xoffset: "..event.xoffset.." yoffset: "..event.yoffset
+ elseif event.type == RL.GLFW_CURSOR_ENTER_EVENT then
+ text = text.."enter: "..event.enter
+ cursorIn = event.enter
+ elseif event.type == RL.EVENT_JOYSTICK then
+ text = text.."jid: "..event.jid.." event: "..event.event
+ if event.event == RL.GLFW_CONNECTED then
+ text = text.."\nConnected"
+ elseif event.event == RL.GLFW_DISCONNECTED then
+ text = text.."\nDisconnected"
+ end
+ end
-- Some SDL events.
@@ -162,43 +159,43 @@ function RL.event( event )
-- Some SDL3 events.
- text = event.type.."\n\n"
-
- if event.type == RL.SDL_EVENT_KEY_DOWN or event.type == RL.SDL_EVENT_KEY_UP then
- text = text.."key: "..event.key.." repeat: "..tostring( event.repeating )
- elseif event.type == RL.SDL_EVENT_PEN_AXIS then
- text = text.."pen_state: "..event.pen_state.." axis: "..event.axis.." value: "..event.value
- pen.pressure = event.value
- pen.state = event.pen_state
- pen.pos[1] = event.x
- pen.pos[2] = event.y
- elseif event.type == RL.SDL_EVENT_PEN_MOTION then
- text = text.."pen_state: "..event.pen_state.." pos: "..event.x..", "..event.y
- pen.pos[1] = event.x
- pen.pos[2] = event.y
- elseif event.type == RL.SDL_EVENT_PEN_DOWN or event.type == RL.SDL_EVENT_PEN_UP then
- pen.down = event.down
- pen.eraser = event.eraser
- elseif event.type == RL.SDL_EVENT_CLIPBOARD_UPDATE then
- print( "SDL_EVENT_CLIPBOARD_UPDATE:" )
- for i, t in ipairs( event.mime_types ) do
- print( i, t )
- end
- elseif event.type == RL.SDL_EVENT_GAMEPAD_AXIS_MOTION then
- text = text.."axis: "..event.axis.."value: "..event.value
- print( "axis: "..event.axis.." value: "..event.value )
- elseif event.type == RL.SDL_EVENT_GAMEPAD_ADDED then
- print( "SDL_EVENT_GAMEPAD_ADDED" )
- end
+ -- text = event.type.."\n\n"
+
+ -- if event.type == RL.SDL_EVENT_KEY_DOWN or event.type == RL.SDL_EVENT_KEY_UP then
+ -- text = text.."key: "..event.key.." repeat: "..tostring( event.repeating )
+ -- elseif event.type == RL.SDL_EVENT_PEN_AXIS then
+ -- text = text.."pen_state: "..event.pen_state.." axis: "..event.axis.." value: "..event.value
+ -- pen.pressure = event.value
+ -- pen.state = event.pen_state
+ -- pen.pos[1] = event.x
+ -- pen.pos[2] = event.y
+ -- elseif event.type == RL.SDL_EVENT_PEN_MOTION then
+ -- text = text.."pen_state: "..event.pen_state.." pos: "..event.x..", "..event.y
+ -- pen.pos[1] = event.x
+ -- pen.pos[2] = event.y
+ -- elseif event.type == RL.SDL_EVENT_PEN_DOWN or event.type == RL.SDL_EVENT_PEN_UP then
+ -- pen.down = event.down
+ -- pen.eraser = event.eraser
+ -- elseif event.type == RL.SDL_EVENT_CLIPBOARD_UPDATE then
+ -- print( "SDL_EVENT_CLIPBOARD_UPDATE:" )
+ -- for i, t in ipairs( event.mime_types ) do
+ -- print( i, t )
+ -- end
+ -- elseif event.type == RL.SDL_EVENT_GAMEPAD_AXIS_MOTION then
+ -- text = text.."axis: "..event.axis.."value: "..event.value
+ -- print( "axis: "..event.axis.." value: "..event.value )
+ -- elseif event.type == RL.SDL_EVENT_GAMEPAD_ADDED then
+ -- print( "SDL_EVENT_GAMEPAD_ADDED" )
+ -- end
end
-local function drawSDL3PenCircle()
- RL.DrawCircleLines( pen.pos, 32, RL.GREEN )
+-- local function drawSDL3PenCircle()
+-- RL.DrawCircleLines( pen.pos, 32, RL.GREEN )
- if pen.down then
- RL.DrawCircle( pen.pos, pen.pressure * 32, pen.eraser and RL.YELLOW or RL.BLUE )
- end
-end
+-- if pen.down then
+-- RL.DrawCircle( pen.pos, pen.pressure * 32, pen.eraser and RL.YELLOW or RL.BLUE )
+-- end
+-- end
function RL.draw()
if 0 < cursorIn then
@@ -207,7 +204,7 @@ function RL.draw()
RL.ClearBackground( RL.RED )
end
- drawSDL3PenCircle()
+ -- drawSDL3PenCircle()
RL.DrawText( text, textPos, 20, RL.BLACK )
end
diff --git a/examples/fast_tilemap/main.lua b/examples/fast_tilemap/main.lua
new file mode 100644
index 0000000..da7fdbf
--- /dev/null
+++ b/examples/fast_tilemap/main.lua
@@ -0,0 +1,103 @@
+--[[
+ We can use mesh to draw tilemap in one draw call.
+ On large maps you could devide the tilemap in sections to cull tiles that are not
+ in view.
+--]]
+
+package.path = package.path..";"..RL.GetBasePath().."../resources/lib/?.lua"
+
+Util = require( "utillib" )
+Vector2 = require( "vector2" )
+Vector3 = require( "vector3" )
+
+QUAD = {
+ VERTICES = {
+ Vector3:new( 0, 0, 0 ), Vector3:new( 0, 1, 0 ), Vector3:new( 1, 1, 0 ),
+ Vector3:new( 0, 0, 0 ), Vector3:new( 1, 1, 0 ), Vector3:new( 1, 0, 0 )
+ },
+ TEXCOORDS = {
+ Vector2:new( 0, 0 ), Vector2:new( 0, 1 ), Vector2:new( 1, 1 ),
+ Vector2:new( 0, 0 ), Vector2:new( 1, 1 ), Vector2:new( 1, 0 )
+ },
+}
+
+local res = Vector2:new( 1024, 720 )
+local winScale = 1
+local winSize = res:scale( winScale )
+local monitor = 0
+
+local tilemap = {
+ texture = nil,
+ texSize = Vector2:new(),
+ mesh = nil,
+ material = nil,
+ tileSize = 32,
+ tilecount = 0,
+}
+
+local function setTile( meshData, pos, texcoord )
+ local texelSize = Vector2:new( 1 / tilemap.texSize.x, 1 / tilemap.texSize.y )
+
+ for i, v in ipairs( QUAD.VERTICES ) do
+ table.insert( meshData.vertices, ( pos + v ):scale( tilemap.tileSize ) )
+ table.insert( meshData.texcoords, ( QUAD.TEXCOORDS[i] + texcoord ) * texelSize:scale( tilemap.tileSize ) )
+ table.insert( meshData.colors, RL.WHITE )
+ end
+
+ tilemap.tilecount = tilemap.tilecount + 1
+end
+
+local function genTilemap()
+ local meshData = { vertices = {}, texcoords = {}, colors = {} }
+ -- Ground.
+ for x = 0, winSize.x / tilemap.tileSize do
+ for y = 0, winSize.y / tilemap.tileSize do
+ setTile( meshData, Vector2:new( x, y ), Vector2:new( 4, 0 ) )
+ end
+ end
+ -- House. Will be overdrawn to ground but we don't care we are so efficient! (You should though.)
+ for x = 0, 6 do
+ for y = 0, 10 do
+ local tilePos = Vector2:new( x, y ) + Vector2:new( 8, 6 )
+
+ if ( x == 0 or x == 6 or y == 0 or y == 10 ) and y ~= 4 then
+ setTile( meshData, tilePos, Vector2:new( 0, 0 ) )
+ else
+ setTile( meshData, tilePos, Vector2:new( 1, 0 ) )
+ end
+ end
+ end
+ -- Characters. You probably would not do this, but we do it here to get some variation.
+ setTile( meshData, Vector2:new( 4, 3 ), Vector2:new( 3, 0 ) )
+ setTile( meshData, Vector2:new( 8, 4 ), Vector2:new( 3, 1 ) )
+ setTile( meshData, Vector2:new( 10, 8 ), Vector2:new( 1, 1 ) )
+
+ tilemap.mesh = RL.GenMeshCustom( meshData, false )
+end
+
+function RL.init()
+ local monitorPos = Vector2:newT( RL.GetMonitorPosition( monitor ) )
+ local monitorSize = Vector2:newT( RL.GetMonitorSize( monitor ) )
+
+ RL.SetWindowTitle( "Fast tilemap" )
+ 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 } )
+
+ local path = RL.GetBasePath().."../resources/images/tiles.png"
+
+ tilemap.texture = RL.LoadTexture( path )
+ tilemap.texSize:setT( RL.GetTextureSize( tilemap.texture ) )
+
+ tilemap.material = RL.LoadMaterialDefault()
+ RL.SetMaterialTexture( tilemap.material, RL.MATERIAL_MAP_ALBEDO, tilemap.texture )
+
+ genTilemap()
+end
+
+function RL.draw()
+ RL.ClearBackground( RL.BLACK )
+ RL.DrawMesh( tilemap.mesh, tilemap.material, RL.MatrixIdentity() )
+ RL.DrawText( "Tile count: "..tostring( tilemap.tilecount ), { 3, 3 }, 20, RL.GREEN )
+end
diff --git a/src/platforms/core_desktop_sdl3.c b/src/platforms/core_desktop_sdl3.c
index be8d281..b85c8b7 100644
--- a/src/platforms/core_desktop_sdl3.c
+++ b/src/platforms/core_desktop_sdl3.c
@@ -166,6 +166,8 @@ static void platformSendEvents() {
return;
}
+ lua_pop( L, -1 );
+
for ( int i = 0; i < state->SDL_eventQueueLen; i++ ) {
bool call = false;
lua_getglobal( L, "RL" );