skybox.odin 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package skybox
  2. import rl "vendor:raylib"
  3. import r3d "../r3d"
  4. main :: proc() {
  5. // Initialize window
  6. rl.InitWindow(800, 450, "[r3d] - Skybox example")
  7. defer rl.CloseWindow()
  8. rl.SetTargetFPS(60)
  9. // Initialize R3D
  10. r3d.Init(rl.GetScreenWidth(), rl.GetScreenHeight())
  11. defer r3d.Close()
  12. // Create sphere mesh
  13. sphere := r3d.GenMeshSphere(0.5, 32, 64)
  14. defer r3d.UnloadMesh(sphere)
  15. // Define procedural skybox parameters
  16. skyParams := r3d.CUBEMAP_SKY_BASE
  17. skyParams.groundEnergy = 2.0
  18. skyParams.skyEnergy = 2.0
  19. skyParams.sunEnergy = 2.0
  20. // Load and generate skyboxes
  21. skyProcedural := r3d.GenCubemapSky(512, skyParams)
  22. defer r3d.UnloadCubemap(skyProcedural)
  23. skyPanorama := r3d.LoadCubemap("./resources/panorama/sky.png", .AUTO_DETECT)
  24. defer r3d.UnloadCubemap(skyPanorama)
  25. // Generate ambient maps
  26. ambientProcedural := r3d.GenAmbientMap(skyProcedural, {.ILLUMINATION, .REFLECTION})
  27. defer r3d.UnloadAmbientMap(ambientProcedural)
  28. ambientPanorama := r3d.GenAmbientMap(skyPanorama, {.ILLUMINATION, .REFLECTION})
  29. defer r3d.UnloadAmbientMap(ambientPanorama)
  30. // Set default sky/ambient maps
  31. env := r3d.GetEnvironment()
  32. env.background.sky = skyPanorama
  33. env.ambient._map = ambientPanorama
  34. // Set tonemapping
  35. env.tonemap.mode = .AGX
  36. // Setup camera
  37. camera: rl.Camera3D = {
  38. position = {0, 0, 10},
  39. target = {0, 0, 0},
  40. up = {0, 1, 0},
  41. fovy = 60,
  42. }
  43. // Capture mouse
  44. rl.DisableCursor()
  45. // Main loop
  46. for !rl.WindowShouldClose()
  47. {
  48. rl.UpdateCamera(&camera, rl.CameraMode.FREE)
  49. rl.BeginDrawing()
  50. rl.ClearBackground(rl.RAYWHITE)
  51. env := r3d.GetEnvironment()
  52. if rl.IsMouseButtonPressed(.LEFT) {
  53. if env.background.sky.texture == skyPanorama.texture {
  54. env.background.sky = skyProcedural
  55. env.ambient._map = ambientProcedural
  56. } else {
  57. env.background.sky = skyPanorama
  58. env.ambient._map = ambientPanorama
  59. }
  60. }
  61. // Draw sphere grid
  62. r3d.Begin(camera)
  63. for x in 0..=8 {
  64. for y in 0..=8 {
  65. material := r3d.GetDefaultMaterial()
  66. material.orm.roughness = rl.Remap(f32(y), 0.0, 8.0, 0.0, 1.0)
  67. material.orm.metalness = rl.Remap(f32(x), 0.0, 8.0, 0.0, 1.0)
  68. r3d.DrawMesh(sphere, material, {f32(x - 4) * 1.25, f32(y - 4) * 1.25, 0.0}, 1.0)
  69. }
  70. }
  71. r3d.End()
  72. rl.EndDrawing()
  73. }
  74. }