diff options
author | ubq323 <ubq323@ubq323.website> | 2024-04-22 00:34:20 +0100 |
---|---|---|
committer | ubq323 <ubq323@ubq323.website> | 2024-04-22 00:34:20 +0100 |
commit | 11c8b134d7de3d7b2249d74b26a87bc9d6acc27d (patch) | |
tree | 7d6d646c73c893f1e978a6f4aecbeeb41a7f80c4 | |
parent | c13872d6ef54af30fa476cb690ebc7d5725c0537 (diff) |
rle
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | client/pictures.ha | 1 | ||||
-rw-r--r-- | drawing/drawing.ha | 1 | ||||
-rw-r--r-- | packet_reader/packet_reader.ha | 6 | ||||
-rw-r--r-- | packet_reader/rle.ha | 65 | ||||
-rw-r--r-- | server/main.ha | 2 |
7 files changed, 76 insertions, 3 deletions
@@ -1,2 +1,3 @@ *.ppm +*.png e/* @@ -4,6 +4,9 @@ nothing: client: hare run -lSDL2 client/ +build_client: + hare build -o garden -lSDL2 client/ + server: hare run server/ diff --git a/client/pictures.ha b/client/pictures.ha index f139b28..ce6c600 100644 --- a/client/pictures.ha +++ b/client/pictures.ha @@ -102,6 +102,7 @@ fn process_chunk_loadedness( const pic = pmgr.pictures[i]; if (!is_picture_visible(camera_pos, pic.world_pos)) { fmt::printfln("## unloading {},{}", pic.world_pos.0, pic.world_pos.1)!; + sdl2::SDL_FreeSurface(pmgr.pictures[i].surface); delete(pmgr.pictures[i]); }; }; diff --git a/drawing/drawing.ha b/drawing/drawing.ha index ae36501..729b441 100644 --- a/drawing/drawing.ha +++ b/drawing/drawing.ha @@ -113,7 +113,6 @@ export fn stroke(picture: *picture, c0: pos, c1: pos, r: i32, color: u32) void = circle(picture, c1, r, color); return; }; - fmt::printfln("count: {}",count)!; const sx = dx: f64 / (count): f64; const sy = dy: f64 / (count): f64; diff --git a/packet_reader/packet_reader.ha b/packet_reader/packet_reader.ha index 6d8c315..a1b5b8f 100644 --- a/packet_reader/packet_reader.ha +++ b/packet_reader/packet_reader.ha @@ -4,21 +4,25 @@ use endian; use drawing; use drawing::{pos,CHUNKSIZE}; -export def VERSION: u8 = 1; +export def VERSION: u8 = 2; export type error = !str; export type packet_reader = struct { buf: []u8, good: []u8, + wbuf: []u8, + wgood: []u8, }; export fn new() packet_reader = { let pr = packet_reader { buf = alloc([0...],512*512*4*2), // ehhh + wbuf = alloc([0...], 512*512*4*2), // ehhhh ... }; pr.good = pr.buf[0..0]; + pr.wgood = pr.wbuf[0..0]; return pr; }; diff --git a/packet_reader/rle.ha b/packet_reader/rle.ha new file mode 100644 index 0000000..af9f080 --- /dev/null +++ b/packet_reader/rle.ha @@ -0,0 +1,65 @@ + +use fmt; + +fn item_encode(count: int, val: u32) u32 = + ((count-1)<<24):u32 | (val&0xffffff); +fn item_decode(c: u32) (int, u32) = + ((((c&0xff000000)>>24)+1):int, c&0xffffff); + +// caller freeeee +export fn rle_encode(d: []u32) []u32 = { + let out: []u32 = []; + let start = 0z; + for (start < len(d)) { + let this = d[start]; + let ix = start + 1; + for (ix < len(d) && d[ix] == this) ix += 1; + const val = this; + let count = (ix - start): int; + fmt::printfln("#{:_06x} x{}",val, count)!; + for (count > 0) { + append(out, item_encode(count%256, val)); + count -= 256; + }; + start = ix; + }; + return out; +}; + +// ooooo caller freeeeeee meee +export fn rle_decode(d: []u32) []u32 = { + let out: []u32 = []; + for (const k .. d) { + const (count, val) = item_decode(k); + append(out, [val...], count: size); + }; + return out; +}; + +fn dotest(eu: []u32) void = { + const ee = rle_encode(eu); + defer free(ee); + // for (const k .. ee) { + // const (count, val) = item_decode(k); + // fmt::printfln("0x{:_08x} | #{:_06x} x{}", k, val, count)!; + // }; + + const dd = rle_decode(ee); + defer free(dd); + + assert(len(eu) == len(dd), "length mismatch??"); + let good = true; + for (let i = 0z; i < len(eu); i += 1) { + assert(eu[i] == dd[i], "value wrong"); + // fmt::printfln("{} vs {}",eu[i], dd[i])!; + // if (eu[i] != dd[i]) { good=false; fmt::println("uh oh")!; }; + }; + // if (good) fmt::printfln("good yay")!; + +}; + +@test fn euou() void = dotest([1,1,1,1,1,2,2,2,3,3,3,3,3,4,4,5,5,5,666,69,9,9]); +@test fn oeuoeu2() void = dotest([1,2,3,4,5]); +@test fn oeuoeu2() void = dotest([1,1,1]); +@test fn oeuoeu2() void = dotest([1,6]); +@test fn oeuoeu2() void = dotest([1]); diff --git a/server/main.ha b/server/main.ha index 41e6b6a..475d19a 100644 --- a/server/main.ha +++ b/server/main.ha @@ -69,7 +69,6 @@ export fn main() void = { for (state.running) { const timeout = time::diff(now, next); - fmt::printfln("running loop, timeout {} sec",timeout/time::SECOND)!; loop(&state, timeout); now = time::now(time::clock::MONOTONIC); @@ -289,6 +288,7 @@ fn unload_distant_chunks(state: *server_state) void = { fmt::printfln("unloading {},{}", state.pictures[i].world_pos.0, state.pictures[i].world_pos.1)!; + free(state.pictures[i].d); delete(state.pictures[i]); }; }; |