Skip to content

Instantly share code, notes, and snippets.

View Clemapfel's full-sized avatar

Clem Cords Clemapfel

View GitHub Profile
@Clemapfel
Clemapfel / main.lua
Last active December 16, 2025 12:06
Frame Interpolation in Love2D
--[[
Frame Interpolation in Love2D
Author: Clem Cords (github.com/clemapfel), licensed MIT, free to use in commercial projects
This is a demonstration of how to run a game at a fixed frame rate while
keeping drawing smooth. If a game is out of sync with the monitor refresh rate,
stuttering can occur. To address this, we need to perform what is called
*frame interpolation*, which predicts the objects current position independent
of the games frame rate. We then use this predicted position for drawing, which vastly reduces
stuttering, especially when the game refresh rate is lower than the monitor refresh rate.
@Clemapfel
Clemapfel / merging.lua
Last active September 17, 2025 19:10
tile mergin algorithm: takes sparse matrix of which tiles are solid and returns merged rectangles, drastically reducing the number of shapes
local tile_width, tile_height = -- tile size, for example 32x32
local is_solid_matrix = -- sparse matrix for whom get(x, y) returns true if a tile at position x, y (1-indexed) is solid, false otherwise
local min_x, min_y, max_x, max_y = -- index range of is_solid_matrix, for example -32, -15, 125, 268, depending on map chunking
local visited = {} -- dense 2d matrix, keeps track of which tiles are already merged
local function is_visited(x, y)
return visited[y] and visited[y][x]
end
local function find_rectangle(x, y)
@Clemapfel
Clemapfel / main.lua
Created August 12, 2025 01:15
pre-computed randomized tesselations in love2d
local _tesselations = {
[1] = {
[1] = {
[1] = 0,
[2] = 0.24519416500785,
[3] = 0.30925435412093,
[4] = 0.23119115908206,
[5] = 0.16389692708811,
[6] = 0.4900034953275,
[7] = 0,
-- ### BENCHMARK CONFIG
n_runs = 10 -- number of total runs
n_vectors = 10e4 -- number of vectors per run
n_adds = 200 -- number of operations per vector
io.stdout:setvbuf("no")
-- ### NAIVE VECTOR ###
@Clemapfel
Clemapfel / 01_thread_pool.lua
Last active April 1, 2024 22:36
ThreadPool in love2D
-- licensed MIT, created by https://github.com/clemapfel
if rt == nil then rt = {} end
--- @class rt.ThreadPool
rt.ThreadPool = {}
--- @brief constructor
--- @param n_threads Number number of threads, default: 1
--- @return rt.ThreadPool
function rt.ThreadPool:new(n_threads)
@Clemapfel
Clemapfel / main.lua
Last active December 9, 2023 22:04
Powder Snow effect in löve2d using geometry instancing
-- Author: C. Cords (https://github.com/clemapfel/)
-- licensed MIT, see https://opensource.org/license/mit/
rt = {}
rt.snow_effect_shader_source = [[
#pragma language glsl3
// GPU-side random generator
vec3 mod289(vec3 x) {
return x - floor(x * (1.0 / 289.0)) * 289.0;
#
# Author: C. Cords (mail@clemens-cords.com)
# https://github.com/clemapfel/mousetrap.jl
#
# Copyright © 2023, Licensed under lGPL3-0
#
using Test
using mousetrap
using BenchmarkTools
function meshgrid(a, b)
x = a' .* ones(length(b))
y = ones(length(a))' .* b
return x, y
end
savetxt(filename, array) = open(filename, "w") do io
for row in eachrow(array)
@Clemapfel
Clemapfel / complex_iterator.jl
Last active February 7, 2023 22:30
Julia Complex Iterator Example
using Random
# The iterable instance
struct Iterable
_ids::Vector{Int64}
_other::Vector{String}
Iterable() = new(rand(Int64, 10), [Random.randstring(3) for i in 1:10])
end
# Iterator, holds reference to instance
@Clemapfel
Clemapfel / julia_swizzling_hello_world.jl
Last active September 11, 2022 18:29
Swizzling in Julia: Basic Mechanism
# Basic mechanism for how to implement GLSL-like swizzling in Julia
mutable struct Vec2
_private_00::Float32
_private_01::Float32
Vec2(x, y) = new(x, y)
end
function Base.getproperty(instance::Vec2, sym::Symbol)