Fixed software renderer; added vline,hline,trirect

This commit is contained in:
peony 2024-10-13 23:15:10 +02:00
parent ea8eca1089
commit de8000f596
6 changed files with 165 additions and 10 deletions

View file

@ -30,7 +30,10 @@ light_cyan := mode.light_cyan
put_pixel := mode.put_pixel put_pixel := mode.put_pixel
put_rect := mode.put_rect put_rect := mode.put_rect
put_filled_rect := mode.put_filled_rect put_filled_rect := mode.put_filled_rect
put_trirect := mode.put_trirect
put_line := mode.put_line put_line := mode.put_line
put_vline := mode.put_vline
put_hline := mode.put_hline
clear := mode.clear clear := mode.clear
put_img := mode.put_img put_img := mode.put_img

View file

@ -119,7 +119,7 @@ sync := fn(): void {
bb := ctx.buf bb := ctx.buf
fb := ctx.fb fb := ctx.fb
boundary := bb + ctx.pixels boundary := bb + ctx.pixels
loop if bb == boundary break else { loop if bb >= boundary break else {
*@as(^[Color; copy_pixels], @bitcast(fb)) = *@as(^[Color; copy_pixels], @bitcast(bb)) *@as(^[Color; copy_pixels], @bitcast(fb)) = *@as(^[Color; copy_pixels], @bitcast(bb))
bb += copy_pixels bb += copy_pixels
fb += copy_pixels fb += copy_pixels
@ -137,6 +137,9 @@ height := fn(): int {
} }
screenidx := fn(x: int, y: int): int { screenidx := fn(x: int, y: int): int {
/*if x < 0 || y < 0 || x >= ctx.width || y >= ctx.height {
return -1
}*/
return x + ctx.width * y return x + ctx.width * y
} }
@ -178,6 +181,27 @@ put_rect := fn(pos: Vec2(int), tr: Vec2(int), color: Color): void {
return return
} }
put_trirect := fn(pos: Vec2(int), size: Vec2(int), color0: Color, color1: Color): void {
step := Vec2(int).(1, 1)
if size.x < 0 {
step.x = -1
}
if size.y < 0 {
step.y = size.y / size.x
}
start_y := pos.y
target := pos + size
loop if pos.x == target.x break else {
put_vline(pos.x, pos.y, target.y, color0)
put_vline(pos.x, pos.y, start_y, color1)
pos += step
}
return
}
put_line_low := fn(p0: Vec2(int), p1: Vec2(int), color: Color): void { put_line_low := fn(p0: Vec2(int), p1: Vec2(int), color: Color): void {
dx := p1.x - p0.x dx := p1.x - p0.x
dy := p1.y - p0.y dy := p1.y - p0.y
@ -243,6 +267,38 @@ put_line := fn(p0: Vec2(int), p1: Vec2(int), color: Color): void {
return return
} }
put_vline := fn(x: int, y0: int, y1: int, color: Color): void {
if y1 < y0 {
tmp := y0
y0 = y1
y1 = tmp
}
y := y0
loop if y == y1 break else {
*(ctx.buf + @inline(screenidx, x, y)) = color
y += 1
}
return
}
put_hline := fn(y: int, x0: int, x1: int, color: Color): void {
if x1 < x0 {
tmp := x0
x0 = x1
x1 = tmp
}
x := x0
loop if x == x1 break else {
*(ctx.buf + @inline(screenidx, x, y)) = color
x += 1
}
return
}
set_height := fn(new: int): void { set_height := fn(new: int): void {
return return
} }

View file

@ -0,0 +1,83 @@
render := @use("../../../../libraries/render/src/lib.hb");
.{math, random} := @use("../../../../libraries/stn/src/lib.hb")
Vec2 := math.Vec2
/* expected result:
a grid of green lines scrolling from the left top corner to the right bottom one
with a "target" randomly apperaing in one of them and a "seeker" "catching" it*/
example := fn(): void {
render.init()
width := render.width()
height := render.height()
cell_size := 0
range := Vec2(int).(0, 0)
if width > height {
cell_size = width / 40
range = .(39, height / cell_size - 1)
} else {
cell_size = height / 40
range = .(width / cell_size - 1, 39)
}
width -= 1
height -= 1
scroll := 0
target := Vec2(int).(random.range(int, 0, range.x), random.range(int, 0, range.y))
halfcell := cell_size / 2
octcell := cell_size / 8
sevenoctcell := cell_size - octcell
seeker := Vec2(int).(random.range(int, 0, range.x), random.range(int, 0, range.y))
loop {
render.clear(render.black)
target_pixel_coord := target * .(cell_size, cell_size) + .(scroll, scroll)
render.put_trirect(target_pixel_coord, .(cell_size, cell_size), render.red, render.light_red)
render.put_hline(target_pixel_coord.y + halfcell, target_pixel_coord.x - octcell, target_pixel_coord.x - sevenoctcell, render.light_red)
render.put_hline(target_pixel_coord.y + halfcell, target_pixel_coord.x + cell_size + octcell, target_pixel_coord.x + cell_size + sevenoctcell, render.light_red)
render.put_vline(target_pixel_coord.x + halfcell, target_pixel_coord.y - octcell, target_pixel_coord.y - sevenoctcell, render.light_red)
render.put_vline(target_pixel_coord.x + halfcell, target_pixel_coord.y + cell_size + octcell, target_pixel_coord.y + cell_size + sevenoctcell, render.light_red)
x := scroll
loop if x > width break else {
render.put_vline(x, 0, height, .(0, 127, 0, 127))
x += cell_size
}
y := scroll
loop if y > height break else {
render.put_hline(y, 0, width, .(0, 127, 0, 127))
y += cell_size
}
render.put_hline(seeker.y * cell_size + halfcell + scroll, 0, width, render.light_green)
render.put_vline(seeker.x * cell_size + halfcell + scroll, 0, height, render.light_green)
render.sync()
if seeker.x < target.x {
seeker.x += 1
} else if seeker.x > target.x {
seeker.x -= 1
} else if seeker.y < target.y {
seeker.y += 1
} else if seeker.y > target.y {
seeker.y -= 1
} else {
target = .(random.range(int, 0, range.x), random.range(int, 0, range.y))
}
scroll += 1
if scroll > cell_size {
scroll = 0
target += .(1, 1)
seeker += .(1, 1)
}
}
return
}

View file

@ -1,4 +1,4 @@
.{example} := @use("./examples/amogus.hb") .{example} := @use("./examples/tactical_screen.hb")
main := fn(): void { main := fn(): void {
@inline(example) @inline(example)

View file

@ -1,14 +1,27 @@
.{memory, log, string, buffer} := @use("../../../libraries/stn/src/lib.hb") .{memory, log, string, buffer, math} := @use("../../../libraries/stn/src/lib.hb")
render := @use("../../../libraries/render/src/lib.hb")
Color := render.Color
Vec2 := math.Vec2
main := fn(): void { main := fn(): void {
storage := @as(u8, 0) input := @as(u8, 0)
output_buffer := memory.request_page(1) output_buffer := memory.request_page(1)
input_buffer := buffer.search("XKeyboard\0") input_buffer := buffer.search("XKeyboard\0")
render.init()
loop { loop {
buffer.recv(input_buffer, &storage, 1) render.clear(render.black)
if storage != 0 { render.put_vline(100, 255, 128, Color.(255, 255, 255, 255))
log.info(string.display_int(storage, output_buffer)) render.put_hline(64, 100 - 64, 164, Color.(255, 255, 255, 255))
storage = 0 render.put_trirect(Vec2(int).(128, 128 + 256), Vec2(int).(256, -256), Color.(147, 147, 147, 255), Color.(107, 107, 107, 255))
render.put_filled_rect(Vec2(int).(128 + 32, 128 + 32), Vec2(int).(256 - 64, 256 - 64), Color.(127, 127, 127, 127))
render.sync()
buffer.recv(input_buffer, &input, 1)
if input != 0 {
log.info(string.display_int(input, output_buffer))
input = 0
} }
} }
return return

View file

@ -3,7 +3,7 @@
default_entry = 1 default_entry = 1
timeout = 0 timeout = 0
verbose = false verbose = false
interface_resolution = "1024x768x24" interface_resolution = "1600x900x24"
# interface_resolution = "640x480x32" # interface_resolution = "640x480x32"
# Terminal related settings # Terminal related settings
term_wallpaper = "boot:///background.bmp" term_wallpaper = "boot:///background.bmp"
@ -16,7 +16,7 @@ protocol = "limine"
kernel_path = "boot:///kernel_${ARCH}" kernel_path = "boot:///kernel_${ARCH}"
kernel_cmdline = "" kernel_cmdline = ""
# resolution = "640x480x32" # resolution = "640x480x32"
resolution = "1024x768x24" resolution = "1600x900x24"
[boot.limine.ableos.modules] [boot.limine.ableos.modules]