separate posterizer shader, new testing map

This commit is contained in:
2025-05-22 06:30:12 +03:00
parent 156cc384cc
commit 346a8d0e65
227 changed files with 2638 additions and 39 deletions

View File

@ -113,6 +113,7 @@ lights := [MAX_LIGHTS]Light{}
main :: proc() {
rl.SetConfigFlags({.WINDOW_RESIZABLE, .MSAA_4X_HINT})
rl.InitWindow(900, 600, "flash")
// rl.SetTargetFPS(60)
// rl.ToggleBorderlessWindowed()
checker := rl.GenImageChecked(128, 128, 32, 32, {128, 128, 128, 255}, {150, 150, 150, 255})
@ -126,7 +127,7 @@ main :: proc() {
w, h := rl.GetScreenWidth(), rl.GetScreenHeight()
pixelize: i32 = 2
pixelize: i32 = 4
target := rl.LoadRenderTexture(w / pixelize, h / pixelize)
posttarget := rl.LoadRenderTexture(w / pixelize, h / pixelize)
@ -139,20 +140,24 @@ main :: proc() {
checkmtl.shader = shader
for i := 0; i < 4; i += 1 {
light_new(&shader, {}, 0, 10, 0.8)
light_new(&shader, {}, 0, 6, 0.8)
hsvcol := rl.ColorFromHSV((f32(i) - 1.0) * 360 / 3, 1, 1)
col := rl.ColorNormalize(hsvcol)
if i > 0 do lights[i].color = col
light_update_uniforms(&lights[i])
}
lights[0].power = 0.9
lights[0].distanceNear = 0
lights[0].distanceFar = 25
lights[0].distanceFar = 6
light_update_uniforms(&lights[0])
rl.SetShaderValue(shader, lights[0].distanceNearLoc, &(lights[0].distanceNear), .FLOAT)
rl.SetShaderValue(shader, lights[0].powerLoc, &(lights[0].power), .FLOAT)
// rl.SetShaderValue(shader, lights[0].distanceNearLoc, &(lights[0].distanceNear), .FLOAT)
// rl.SetShaderValue(shader, lights[0].powerLoc, &(lights[0].power), .FLOAT)
// sponza := rl.LoadModel("assets/models/sponza.glb")
// for &material in sponza.materials[:sponza.materialCount] {
// material.shader = shader
// }
mdl := rl.LoadModel("assets/models/unnamed.obj")
mdl := rl.LoadModel("assets/mapping/testdungeon.obj")
for &material in mdl.materials[:mdl.materialCount] {
material.shader = shader
}
@ -165,7 +170,7 @@ main :: proc() {
meshes := [dynamic]Mesh{}
// vtx := [dynamic]f32{}
scale: f32 = 0.04
scale: f32 = 32
for &mesh in mdl.meshes[:mdl.meshCount] {
// mesh := mdl.meshes[mdl.meshCount-1]
append(&meshes, Mesh{aabb = {{9999, 9999, 9999}, {-9999, -9999, -9999}}})
@ -176,7 +181,7 @@ main :: proc() {
for j: i32 = 0; j < 3; j += 1 {
c := j * 3
for k: i32 = 0; k < 3; k += 1 {
value := mesh.vertices[i + c + k] * scale
value := mesh.vertices[i + c + k] / scale
if value < m.aabb[0][k] {
m.aabb[0][k] = value
}
@ -218,7 +223,7 @@ main :: proc() {
look_angles: rl.Vector2 = 0
cam := rl.Camera3D {
position = {0, 5, 0},
position = {0, 2, 0},
target = {1, 2, 0},
up = {0, 1, 0},
fovy = 90,
@ -252,8 +257,8 @@ main :: proc() {
look_angles.y -= rl.GetMouseDelta().x * 0.0015
look_angles.x += rl.GetMouseDelta().y * 0.0015
SPEED :: 40
RAD :: 1
SPEED :: 20
RAD :: 0.5
moving := false
if rl.IsKeyDown(.W) {
@ -272,7 +277,7 @@ main :: proc() {
vel.xz += right.xz * delta * SPEED
moving = true
}
vel.xz = rl.Vector2ClampValue(vel.xz, 0, 5)
vel.xz = rl.Vector2ClampValue(vel.xz, 0, 3)
if rl.IsKeyDown(.E) do vel.y += delta * SPEED
if rl.IsKeyDown(.Q) do vel.y -= delta * SPEED
@ -285,28 +290,30 @@ main :: proc() {
// damping
vel *= 1.0 / (1.0 + delta * 2)
campos := cam.position + {0, -0.4, 0}
// Collide
for mesh in meshes {
if cam.position.x + RAD < mesh.aabb[0].x &&
cam.position.y + RAD < mesh.aabb[0].y &&
cam.position.z + RAD < mesh.aabb[0].z &&
cam.position.x - RAD > mesh.aabb[1].x &&
cam.position.y - RAD > mesh.aabb[1].y &&
cam.position.z - RAD > mesh.aabb[1].z {continue}
// if cam.position.x + RAD < mesh.aabb[0].x &&
// cam.position.y + RAD < mesh.aabb[0].y &&
// cam.position.z + RAD < mesh.aabb[0].z &&
// cam.position.x - RAD > mesh.aabb[1].x &&
// cam.position.y - RAD > mesh.aabb[1].y &&
// cam.position.z - RAD > mesh.aabb[1].z {continue}
for t in mesh.triangles {
closest := closest_point_on_triangle(cam.position, t[0], t[1], t[2])
diff := cam.position - closest
closest := closest_point_on_triangle(campos, t[0], t[1], t[2])
diff := campos - closest
dist := linalg.length(diff)
normal := diff / dist
diff.xz *= 2
// diff.xz *= 2
dist = linalg.length(diff)
rl.DrawCubeV(closest, 0.05, dist > RAD ? rl.ORANGE : rl.WHITE)
if dist < RAD {
cam.position += normal * (RAD - dist)
if dist <= RAD {
// cam.position += normal * (RAD - dist)
cam.position = closest + normal * RAD - {0, -0.4, 0}
// project velocity to the normal plane, if moving towards it
vel_normal_dot := linalg.dot(vel, normal)
if vel_normal_dot < 0 {
@ -339,9 +346,9 @@ main :: proc() {
move_light(
&light,
{
math.cos_f32(rotation + (f32(i) / f32(3)) * math.PI * 2) * 5,
3,
math.sin_f32(rotation + (f32(i) / f32(3)) * math.PI * 2) * 5,
math.cos_f32(rotation + (f32(i) / f32(3)) * math.PI * 2) * 3,
2,
-1.5 + math.sin_f32(rotation + (f32(i) / f32(3)) * math.PI * 2) * 3,
},
)
rl.DrawSphere(light.position, 0.1, transmute(rl.Color)color)
@ -363,7 +370,7 @@ main :: proc() {
// }
// }
rl.BeginShaderMode(shader)
rl.DrawModelEx(mdl, {}, {}, 0, 0.04, rl.WHITE)
rl.DrawModelEx(mdl, {}, {}, 0, 1 / scale, rl.WHITE)
rl.EndShaderMode()
rl.EndMode3D()
@ -385,7 +392,7 @@ main :: proc() {
0,
rl.WHITE,
)
rl.DrawFPS(0, 0)
rl.DrawFPS(10, 10)
rl.EndDrawing()
}
}
@ -393,7 +400,7 @@ main :: proc() {
vshader: cstring = #load("../assets/shaders/vshader.glsl", cstring)
fshader: cstring = #load("../assets/shaders/fshader.glsl", cstring)
postprocess: cstring = #load("../assets/shaders/postprocess.glsl", cstring)
postprocess: cstring = #load("../assets/shaders/posterizer.glsl", cstring)
// Real Time collision detection 5.1.5