lights.odin 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package lights
  2. import rl "vendor:raylib"
  3. import "core:math/rand"
  4. import r3d "../r3d"
  5. NUM_LIGHTS :: 128
  6. GRID_SIZE :: 100
  7. randf :: proc(min: f32, max: f32) -> f32 {
  8. return min + (max - min) * rand.float32()
  9. }
  10. main :: proc() {
  11. // Initialize window
  12. rl.InitWindow(800, 450, "[r3d] - Many lights example")
  13. defer rl.CloseWindow()
  14. rl.SetTargetFPS(60)
  15. // Initialize R3D
  16. r3d.Init(rl.GetScreenWidth(), rl.GetScreenHeight())
  17. defer r3d.Close()
  18. // Set ambient light
  19. env := r3d.GetEnvironment()
  20. env.background.color = rl.BLACK
  21. env.ambient.color = {10, 10, 10, 255}
  22. // Create plane and cube meshes
  23. plane := r3d.GenMeshPlane(100, 100, 1, 1)
  24. defer r3d.UnloadMesh(plane)
  25. cube := r3d.GenMeshCube(0.5, 0.5, 0.5)
  26. defer r3d.UnloadMesh(cube)
  27. material := r3d.GetDefaultMaterial()
  28. // Allocate transforms for all spheres
  29. instances := r3d.LoadInstanceBuffer(GRID_SIZE * GRID_SIZE, {.POSITION})
  30. defer r3d.UnloadInstanceBuffer(instances)
  31. positions := cast([^]rl.Vector3)r3d.MapInstances(instances, {.POSITION})
  32. for x in -50..<50 {
  33. for z in -50..<50 {
  34. positions[(z+50)*GRID_SIZE + (x+50)] = {f32(x) + 0.5, 0, f32(z) + 0.5}
  35. }
  36. }
  37. r3d.UnmapInstances(instances, {.POSITION})
  38. // Create lights
  39. lights: [NUM_LIGHTS]r3d.Light
  40. for i in 0..<NUM_LIGHTS {
  41. lights[i] = r3d.CreateLight(.OMNI)
  42. r3d.SetLightPosition(lights[i], {randf(-50.0, 50.0), randf(1.0, 5.0), randf(-50.0, 50.0)})
  43. r3d.SetLightColor(lights[i], rl.ColorFromHSV(randf(0.0, 360.0), 1.0, 1.0))
  44. r3d.SetLightRange(lights[i], randf(8.0, 16.0))
  45. r3d.SetLightActive(lights[i], true)
  46. }
  47. // Setup camera
  48. camera: rl.Camera3D = {
  49. position = {0, 10, 10},
  50. target = {0, 0, 0},
  51. up = {0, 1, 0},
  52. fovy = 60,
  53. }
  54. // Main loop
  55. for !rl.WindowShouldClose()
  56. {
  57. rl.UpdateCamera(&camera, rl.CameraMode.ORBITAL)
  58. rl.BeginDrawing()
  59. rl.ClearBackground(rl.RAYWHITE)
  60. // Draw scene
  61. r3d.Begin(camera)
  62. r3d.DrawMesh(plane, material, {0, -0.25, 0}, 1.0)
  63. r3d.DrawMeshInstanced(cube, material, instances, GRID_SIZE*GRID_SIZE)
  64. r3d.End()
  65. // Optionally show lights shapes
  66. if rl.IsKeyDown(.F) {
  67. rl.BeginMode3D(camera)
  68. for i in 0..<NUM_LIGHTS {
  69. r3d.DrawLightShape(lights[i])
  70. }
  71. rl.EndMode3D()
  72. }
  73. rl.DrawFPS(10, 10)
  74. rl.DrawText("Press 'F' to show the lights", 10, rl.GetScreenHeight()-34, 24, rl.BLACK)
  75. rl.EndDrawing()
  76. }
  77. }