diff options
| author | onelin <oscar@nelin.dk> | 2025-10-31 23:55:42 +0000 |
|---|---|---|
| committer | onelin <oscar@nelin.dk> | 2025-11-02 22:07:17 +0000 |
| commit | d38deeef3af2316a666f8fc0173940bd769b748e (patch) | |
| tree | 6e30d4a9eea18daa5705c894f28cd99ff047e8f9 /src/misc.c | |
| parent | 6c077751982ea2c7bd2d9262b01b9f8602f80dc8 (diff) | |
Flatten project structure
This will make it easier to break up the code into smaller chunks again
later.
One would think doing this seems fun to me at this point.
Diffstat (limited to 'src/misc.c')
| -rw-r--r-- | src/misc.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/misc.c b/src/misc.c new file mode 100644 index 0000000..16c0cfb --- /dev/null +++ b/src/misc.c @@ -0,0 +1,86 @@ +#include <stdint.h> +#include <stdlib.h> + +#include <string.h> + +#include <daw/logging.h> +#include <daw/utils.h> + +/* These should all be in some external facing module "tools" */ + +f32 lerp(f32 dt, f32 a, f32 b) { return (a * (1.0f - dt)) + (b * dt); } + +i32 int_lerp(f32 dt, i32 a, i32 b) { + return (i32)((f32)a * (1.0f - dt)) + (i32)((f32)b * dt); +} + +u32 hash(char* str) { + u32 sum = 0; + while (*str != '\0') { + sum ^= (u32)(*str) * 0xdeece66d + 0xb; + str++; + } + return sum; +} + +/* Populates dstmap + * on success: return pointer to dstmap + * on failure: return NULL */ +i32* kernmap(const void* map, i32* dstmap, const ivec2 mapsize, + predicate_t* predicate) { + const usize w = (usize)mapsize[0]; + const usize h = (usize)mapsize[1]; + i32 mask[w * h]; + + if (w * h < 1) return NULL; + + for (usize i = 0; i < w * h; i++) { + mask[i] = predicate((void*)((u64)map + sizeof(i32) * i)) ? 1 : 0; + } + + for (usize y = 1; y < h - 1; y++) { + for (usize x = 1; x < w - 1; x++) { + const usize global_idx = (y * w) + x; + const usize offs = global_idx - w - 1; + i32 _sum = 0; + + i32 shift = 0; + + /* We go in the following order */ + /* ....|0|1|2|....*/ + /* ....|3|4|5|....*/ + /* ....|6|7|8|....*/ + /* Where `4` is in the center, MASK_C */ + for (usize yy = offs; yy <= offs + w + w; yy += w) { + for (usize xx = yy; xx < yy + 3; xx++) { + _sum = _sum | (mask[xx] << shift++); + } + } + + dstmap[global_idx] = _sum; + } + } + return dstmap; +} + +/* Returns an index from the given weights. */ +i32 pick_from_sample(const i32* weights, i32 len) { + if (len <= 0) return 0; + + /* Cumulative sum */ + i32 cumweights[len]; + i32 sum = 0; + for (i32 i = 0; i < len; i++) { + sum += weights[i]; + cumweights[i] = sum; + } + + if (sum == 0) return 0; + + i32 pick = rand() % sum; + + for (i32 i = 0; i < len; i++) { + if (pick < cumweights[i]) return i; + } + return -1; +} |
