Skip to content

Instantly share code, notes, and snippets.

View Clemapfel's full-sized avatar

Clem Cords Clemapfel

View GitHub Profile
@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 ([email protected])
# 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)
#include <thread>
#include <chrono>
#include <jluna.hpp>
// references https://github.com/Clemapfel/jluna/issues/33
int main()
{
using namespace jluna;
initialize(2);