From 3506c8353540ac1d4566b05182f2de1c5d00e842 Mon Sep 17 00:00:00 2001
From: koniifer <koniifer@proton.me>
Date: Mon, 16 Dec 2024 14:20:50 +0000
Subject: [PATCH] math changes & compiler update

---
 .../horizon_api/src/widgets/label.hb          | 10 +--
 sysdata/libraries/stn/src/math.hb             | 65 +++++++++++++------
 sysdata/programs/ablefetch/src/main.hb        |  8 +--
 .../render_example/src/examples/mandelbrot.hb | 28 ++++----
 sysdata/programs/sunset_server/src/main.hb    | 18 ++---
 sysdata/system_config.toml                    |  6 +-
 6 files changed, 75 insertions(+), 60 deletions(-)

diff --git a/sysdata/libraries/horizon_api/src/widgets/label.hb b/sysdata/libraries/horizon_api/src/widgets/label.hb
index 75cd7af..aa8b97e 100644
--- a/sysdata/libraries/horizon_api/src/widgets/label.hb
+++ b/sysdata/libraries/horizon_api/src/widgets/label.hb
@@ -38,9 +38,9 @@ Label := struct {
 }
 
 render_label_to_surface := fn(surface: Surface, label: Label, font: Font, pos: Vec2(uint)): void {
-	// if label.is_dirty {
-	// render.clear(label.surface, label.bg)
-	// render.put_text(label.surface, font, .(0, 0), label.fg, label.text)
-	// }
-	// render.put_surface(surface, label.surface, pos, false)
+	if label.is_dirty {
+		label.surface.clear(label.bg)
+		label.surface.put_text(font, .(0, 0), label.fg, label.text)
+	}
+	surface.put_surface(label.surface, pos, false)
 }
\ No newline at end of file
diff --git a/sysdata/libraries/stn/src/math.hb b/sysdata/libraries/stn/src/math.hb
index a234256..b967579 100644
--- a/sysdata/libraries/stn/src/math.hb
+++ b/sysdata/libraries/stn/src/math.hb
@@ -33,7 +33,6 @@ $sign := fn($T: type, x: T): i8 {
 		sign_bit := @as(float_bytes(T), @bitcast(x)) >> @sizeof(T) * 8 - 1
 		return (1 - 2 * @intcast(sign_bit)) * (x != 0)
 	}
-	return 1
 }
 log := fn($T: type, base: T, x: T): T {
 	if integer(T) {
@@ -47,6 +46,19 @@ log := fn($T: type, base: T, x: T): T {
 		return ln(T, x) / ln(T, base)
 	}
 }
+pow := fn($T: type, base: T, x: T): T {
+	if integer(T) {
+		result := base
+		i := 1
+		loop if i == x break else {
+			result *= x
+			i += 1
+		}
+		return result
+	} else if float(T) {
+		return exp(T, x * ln(T, base))
+	}
+}
 $lerp := fn($T: type, v0: T, v1: T, t: T): T {
 	if float(T) {
 		return v0 + t * (v1 - v0)
@@ -90,19 +102,29 @@ tan := fn(theta: f32): f32 {
 
 exp := fn($T: type, x: T): T {
 	if float(T) {
-		result := @as(T, 1.0)
+		if x == 0.0 return 1.0
+		if x > 709.0 return 100000000000000000000000.0
+		if x < -709.0 return 0.0
+
+		sum := @as(T, 1.0)
 		term := @as(T, 1.0)
+		c := @as(T, 0.0)
+
 		n := @as(int, 1)
-
 		loop if n == 20 break else {
+			prev_term := term
 			term = term * x / @itf(n)
-			result += term
 
-			if abs(T, term) < 0.0000000001 break
+			y := term - c
+			t := sum + y
+			c = t - sum - y
+			sum = t
+
+			if abs(T, term) < 0.00000000000001 * abs(T, sum) break
 			n += 1
 		}
 
-		return result
+		return sum
 	}
 }
 
@@ -113,32 +135,33 @@ ln := fn($T: type, x: T): T {
 		if x == E return 1.0
 
 		scale := @as(T, 0.0)
-		scaled_x := x
 
-		if scaled_x > 2.0 {
-			loop if scaled_x <= 2.0 break else {
-				scaled_x = scaled_x / E
+		if x > 2.0 {
+			loop if x <= 2.0 break else {
+				x /= E
 				scale += 1.0
 			}
-		} else if scaled_x < 1.0 {
-			loop if scaled_x >= 1.0 {
-				scaled_x = scaled_x * E
+		} else if x < 1.0 {
+			loop if x >= 1.0 break else {
+				x *= E
 				scale -= 1.0
 			}
 		}
 
-		guess := (scaled_x - 1.0) / (scaled_x + 1.0)
+		y := x - 1.0
+		z := y / (x + 1.0)
+		z2 := z * z
+
+		guess := z * (1.0 + z2 * (1.0 / 3.0 + z2 * (1.0 / 5.0 + z2 * 1.0 / 7.0)))
 
-		max_iter := 30
 		i := 0
-		loop if i == max_iter break else {
-			exp_g := exp(T, guess)
-			f := exp_g - scaled_x
-			f_prime := exp_g
+		loop if i == 10 break else {
+			exp_val := exp(T, guess)
+			f := exp_val - x
+			f_prime := exp_val
 
 			delta := f / (f_prime * (1.0 - 0.5 * f * f_prime / (f_prime * f_prime)))
-
-			guess = guess - delta
+			guess -= delta
 
 			if abs(T, delta) < 0.0000000001 break
 			i += 1
diff --git a/sysdata/programs/ablefetch/src/main.hb b/sysdata/programs/ablefetch/src/main.hb
index 5b09c6b..ea7e38d 100644
--- a/sysdata/programs/ablefetch/src/main.hb
+++ b/sysdata/programs/ablefetch/src/main.hb
@@ -31,17 +31,13 @@ main := fn(): void {
 	pos1 := Vec2(uint).(1, 1)
 	pos2 := Vec2(uint).(1, 20)
 	pos3 := Vec2(uint).(1, 40)
-	// render.clear(window.surface, render.black)
+
 	render_label_to_surface(window.surface, text_label, font, pos1)
 	render_label_to_surface(window.surface, text_label_2, font, pos2)
 	render_label_to_surface(window.surface, text_label_3, font, pos3)
 	loop {
 		// stn.log.info("AAAA\0")
-		// render.put_text(text_label.surface, font, pos1, text_label.fg, text_label.text)
-		// render.put_text(text_label_2.surface, font, pos2, text_label_2.fg, text_label_2.text)
-		// render.put_text(text_label_3.surface, font, pos3, text_label_3.fg, text_label_3.text)
-
 		_ = sunset.client.send_frame(window)
-		//	stn.sleep.sleep_until_interrupt(100)
+		// stn.sleep.sleep_until_interrupt(100)
 	}
 }
\ No newline at end of file
diff --git a/sysdata/programs/render_example/src/examples/mandelbrot.hb b/sysdata/programs/render_example/src/examples/mandelbrot.hb
index 7a6eaf2..b88805f 100644
--- a/sysdata/programs/render_example/src/examples/mandelbrot.hb
+++ b/sysdata/programs/render_example/src/examples/mandelbrot.hb
@@ -3,30 +3,25 @@ sunset := @use("lib:sunset_proto");
 .{math, log} := @use("stn")
 
 // full mandelbrot
-$X_MIN := -2.0
-$X_MAX := 0.47
-$Y_MIN := -1.12
-$Y_MAX := 1.12
+// $X_MIN := -2.0
+// $X_MAX := 0.47
+// $Y_MIN := -1.12
+// $Y_MAX := 1.12
 
 // a minibrot
-// $X_MIN := -0.94
-// $X_MAX := -0.93
-// $Y_MIN := 0.31
-// $Y_MAX := 0.306
+$X_MIN := -0.94
+$X_MAX := -0.93
+$Y_MIN := 0.31
+$Y_MAX := 0.306
 
 $MAX_ITERATION := 300
 
-$USE_SUNSET := false
+$USE_SUNSET := true
 
 palette := [render.Color].(render.LIGHT_RED, render.LIGHT_YELLOW, render.LIGHT_GREEN, render.LIGHT_CYAN, render.LIGHT_BLUE, render.LIGHT_MAGENTA)
 $LEN_PALETTE := @sizeof(@TypeOf(palette)) / @sizeof(render.Color)
 
 example := fn(): void {
-	z := math.log(f32, 10.0, 100.0)
-	z2 := math.sign(f32, 10.0)
-	z = math.min(f32, 10.0, 100.0)
-	z = math.max(f32, 10.0, 100.0)
-
 	screen := @as(render.Surface, idk)
 	window := @as(?sunset.Window, null)
 	if USE_SUNSET {
@@ -91,4 +86,7 @@ example := fn(): void {
 			_ = sunset.client.send_frame(window)
 		}
 	}
-}
+	if USE_SUNSET loop {
+		_ = sunset.client.send_frame(window)
+	}
+}
\ No newline at end of file
diff --git a/sysdata/programs/sunset_server/src/main.hb b/sysdata/programs/sunset_server/src/main.hb
index 6767e7f..5b3e191 100644
--- a/sysdata/programs/sunset_server/src/main.hb
+++ b/sysdata/programs/sunset_server/src/main.hb
@@ -1,15 +1,15 @@
-sunset := @use("../../../libraries/sunset_proto/src/lib.hb")
-render := @use("../../../libraries/render/src/lib.hb")
-intouch := @use("../../../libraries/intouch/src/lib.hb")
+sunset := @use("lib:sunset_proto")
+render := @use("lib:render")
+intouch := @use("lib:intouch")
 
-horizon_api := @use("../../../libraries/horizon_api/src/lib.hb");
+horizon_api := @use("lib:horizon_api");
 .{set_color, render_label_to_surface, Label} := horizon_api.widgets.label
 
-stn := @use("../../../libraries/stn/src/lib.hb");
+stn := @use("stn");
 .{Vec2} := stn.math
 
-psf := @embed("../../../assets/consolefonts/tamsyn/10x20r.psf")
-img := @embed("../../../assets/wallpaper.qoi")
+psf := @embed("sysdata:assets/consolefonts/tamsyn/10x20r.psf")
+img := @embed("sysdata:assets/wallpaper.qoi")
 
 Mouse := struct {
 	x: uint,
@@ -119,8 +119,8 @@ main := fn(): int {
 
 		// Mouse cursor
 		{
-			render.put_filled_circle(screen, .(mouse.x, mouse.y), mouse.cursor_width, sunset.server.DECO_COLOUR_DARKER)
-			render.put_circle(screen, .(mouse.x, mouse.y), mouse.cursor_width, sunset.server.DECO_COLOUR)
+			screen.put_filled_circle(.(mouse.x, mouse.y), mouse.cursor_width, sunset.server.DECO_COLOUR_DARKER)
+			screen.put_circle(.(mouse.x, mouse.y), mouse.cursor_width, sunset.server.DECO_COLOUR)
 		}
 
 		screen.sync()
diff --git a/sysdata/system_config.toml b/sysdata/system_config.toml
index 721269e..aded1e2 100644
--- a/sysdata/system_config.toml
+++ b/sysdata/system_config.toml
@@ -25,13 +25,11 @@ resolution = "1024x768x24"
 
 [boot.limine.ableos.modules.render_example]
 path = "boot:///render_example.hbf"
-
-
 [boot.limine.ableos.modules.sunset_server]
 path = "boot:///sunset_server.hbf"
 
-# [boot.limine.ableos.modules.ps2_mouse_driver]
-# path = "boot:///ps2_mouse_driver.hbf"
+[boot.limine.ableos.modules.ps2_mouse_driver]
+path = "boot:///ps2_mouse_driver.hbf"
 
 # [boot.limine.ableos.modules.ps2_keyboard_driver]
 # path = "boot:///ps2_keyboard_driver.hbf"