map tests
This commit is contained in:
		@ -143,7 +143,7 @@ main :: proc() {
 | 
			
		||||
	}
 | 
			
		||||
	lights[0].power = 0.9
 | 
			
		||||
	lights[0].distanceNear = 0
 | 
			
		||||
	lights[0].distanceFar = 15
 | 
			
		||||
	lights[0].distanceFar = 25
 | 
			
		||||
	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)
 | 
			
		||||
@ -157,32 +157,55 @@ main :: proc() {
 | 
			
		||||
		material.shader = shader
 | 
			
		||||
	}
 | 
			
		||||
	Tri :: [3][3]f32
 | 
			
		||||
	tris := [dynamic]Tri{}
 | 
			
		||||
	Mesh :: struct {
 | 
			
		||||
		aabb:      [2][3]f32,
 | 
			
		||||
		triangles: [dynamic]Tri,
 | 
			
		||||
	}
 | 
			
		||||
	// tris := [dynamic]Tri{}
 | 
			
		||||
	meshes := [dynamic]Mesh{}
 | 
			
		||||
 | 
			
		||||
	// vtx := [dynamic]f32{}
 | 
			
		||||
	scale: f32 = 0.04
 | 
			
		||||
	for &mesh in mdl.meshes[:mdl.meshCount] {
 | 
			
		||||
		// mesh := mdl.meshes[mdl.meshCount-1]
 | 
			
		||||
		append(&meshes, Mesh{aabb = {{9999, 9999, 9999}, {-9999, -9999, -9999}}})
 | 
			
		||||
		m := &(meshes[len(meshes) - 1])
 | 
			
		||||
		fmt.printf("Mesh: %d %d\n", mesh.vertexCount, mesh.triangleCount)
 | 
			
		||||
		for i: i32 = 0; i < mesh.vertexCount * 3; i += 9 {
 | 
			
		||||
			tri := Tri{}
 | 
			
		||||
			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
 | 
			
		||||
					if value < m.aabb[0][k] {
 | 
			
		||||
						m.aabb[0][k] = value
 | 
			
		||||
					}
 | 
			
		||||
					if value > m.aabb[1][k] {
 | 
			
		||||
						m.aabb[1][k] = value
 | 
			
		||||
					}
 | 
			
		||||
					tri[j][k] = value
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			append(
 | 
			
		||||
				&tris,
 | 
			
		||||
				Tri {
 | 
			
		||||
					{
 | 
			
		||||
						mesh.vertices[i] * scale,
 | 
			
		||||
						mesh.vertices[i + 1] * scale,
 | 
			
		||||
						mesh.vertices[i + 2] * scale,
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						mesh.vertices[i + 3] * scale,
 | 
			
		||||
						mesh.vertices[i + 4] * scale,
 | 
			
		||||
						mesh.vertices[i + 5] * scale,
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						mesh.vertices[i + 6] * scale,
 | 
			
		||||
						mesh.vertices[i + 7] * scale,
 | 
			
		||||
						mesh.vertices[i + 8] * scale,
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				&m.triangles,
 | 
			
		||||
				tri,
 | 
			
		||||
				// Tri {
 | 
			
		||||
				// 	{
 | 
			
		||||
				// 		mesh.vertices[i] * scale,
 | 
			
		||||
				// 		mesh.vertices[i + 1] * scale,
 | 
			
		||||
				// 		mesh.vertices[i + 2] * scale,
 | 
			
		||||
				// 	},
 | 
			
		||||
				// 	{
 | 
			
		||||
				// 		mesh.vertices[i + 3] * scale,
 | 
			
		||||
				// 		mesh.vertices[i + 4] * scale,
 | 
			
		||||
				// 		mesh.vertices[i + 5] * scale,
 | 
			
		||||
				// 	},
 | 
			
		||||
				// 	{
 | 
			
		||||
				// 		mesh.vertices[i + 6] * scale,
 | 
			
		||||
				// 		mesh.vertices[i + 7] * scale,
 | 
			
		||||
				// 		mesh.vertices[i + 8] * scale,
 | 
			
		||||
				// 	},
 | 
			
		||||
				// },
 | 
			
		||||
			)
 | 
			
		||||
			// append(&vtx, mesh.vertices[i] * scale)
 | 
			
		||||
		}
 | 
			
		||||
@ -263,25 +286,35 @@ main :: proc() {
 | 
			
		||||
		vel *= 1.0 / (1.0 + delta * 2)
 | 
			
		||||
 | 
			
		||||
		// Collide
 | 
			
		||||
		for t in tris {
 | 
			
		||||
			closest := closest_point_on_triangle(cam.position, t[0], t[1], t[2])
 | 
			
		||||
			diff := cam.position - closest
 | 
			
		||||
			dist := linalg.length(diff)
 | 
			
		||||
			normal := diff / dist
 | 
			
		||||
			diff.xz *= 2
 | 
			
		||||
			dist = linalg.length(diff)
 | 
			
		||||
		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}
 | 
			
		||||
 | 
			
		||||
			rl.DrawCubeV(closest, 0.05, dist > RAD ? rl.ORANGE : rl.WHITE)
 | 
			
		||||
 | 
			
		||||
			if dist < RAD {
 | 
			
		||||
				cam.position += normal * (RAD - dist)
 | 
			
		||||
				// project velocity to the normal plane, if moving towards it
 | 
			
		||||
				vel_normal_dot := linalg.dot(vel, normal)
 | 
			
		||||
				if vel_normal_dot < 0 {
 | 
			
		||||
					vel -= normal * vel_normal_dot
 | 
			
		||||
					if normal.y > 0.6 && !moving {
 | 
			
		||||
						vel.xz = rl.Vector2MoveTowards(vel.xz, {}, 35 * delta)
 | 
			
		||||
						vel.y = 0
 | 
			
		||||
			for t in mesh.triangles {
 | 
			
		||||
				closest := closest_point_on_triangle(cam.position, t[0], t[1], t[2])
 | 
			
		||||
				diff := cam.position - closest
 | 
			
		||||
				dist := linalg.length(diff)
 | 
			
		||||
				normal := diff / dist
 | 
			
		||||
				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)
 | 
			
		||||
					// project velocity to the normal plane, if moving towards it
 | 
			
		||||
					vel_normal_dot := linalg.dot(vel, normal)
 | 
			
		||||
					if vel_normal_dot < 0 {
 | 
			
		||||
						vel -= normal * vel_normal_dot
 | 
			
		||||
						if normal.y > 0.6 && !moving {
 | 
			
		||||
							vel.xz = rl.Vector2MoveTowards(vel.xz, {}, 35 * delta)
 | 
			
		||||
							vel.y = 0
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
@ -320,6 +353,15 @@ main :: proc() {
 | 
			
		||||
		// 	rl.DrawSphere(tri[2], 0.5, rl.WHITE)
 | 
			
		||||
		// 	rl.DrawTriangle3D(tri[0], tri[1], tri[2], rl.RED)
 | 
			
		||||
		// }
 | 
			
		||||
		// for mesh in meshes {
 | 
			
		||||
		// 	// rl.DrawBoundingBox(rl.BoundingBox{min = mesh.aabb[0], max = mesh.aabb[1]}, rl.RED)
 | 
			
		||||
		// 	for &tri in mesh.triangles {
 | 
			
		||||
		// 		// rl.DrawSphere(tri[0], 0.5, rl.WHITE)
 | 
			
		||||
		// 		// rl.DrawSphere(tri[1], 0.5, rl.WHITE)
 | 
			
		||||
		// 		// rl.DrawSphere(tri[2], 0.5, rl.WHITE)
 | 
			
		||||
		// 		// rl.DrawTriangle3D(tri[0], tri[1], tri[2], {255, 255, 255, 10})
 | 
			
		||||
		// 	}
 | 
			
		||||
		// }
 | 
			
		||||
		rl.BeginShaderMode(shader)
 | 
			
		||||
		rl.DrawModelEx(mdl, {}, {}, 0, 0.04, rl.WHITE)
 | 
			
		||||
 | 
			
		||||
@ -343,6 +385,7 @@ main :: proc() {
 | 
			
		||||
			0,
 | 
			
		||||
			rl.WHITE,
 | 
			
		||||
		)
 | 
			
		||||
		rl.DrawFPS(0, 0)
 | 
			
		||||
		rl.EndDrawing()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user