bloom.odin 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package bloom
  2. import rl "vendor:raylib"
  3. import "core:math"
  4. import r3d "../r3d"
  5. main :: proc() {
  6. // Initialize window
  7. rl.InitWindow(800, 450, "[r3d] - Bloom example")
  8. defer rl.CloseWindow()
  9. rl.SetTargetFPS(60)
  10. // Initialize R3D
  11. r3d.Init(rl.GetScreenWidth(), rl.GetScreenHeight())
  12. defer r3d.Close()
  13. // Setup bloom and tonemapping
  14. env := r3d.GetEnvironment()
  15. env.tonemap.mode = .ACES
  16. env.bloom.mode = .MIX
  17. env.bloom.levels = 1.0
  18. // Set background
  19. env.background.color = rl.BLACK
  20. // Create cube mesh and material
  21. cube := r3d.GenMeshCube(1.0, 1.0, 1.0)
  22. defer r3d.UnloadMesh(cube)
  23. material := r3d.GetDefaultMaterial()
  24. hueCube: f32 = 0.0
  25. material.emission.color = rl.ColorFromHSV(hueCube, 1.0, 1.0)
  26. material.emission.energy = 1.0
  27. material.albedo.color = rl.BLACK
  28. // Setup camera
  29. camera: rl.Camera3D = {
  30. position = {0, 3.5, 5},
  31. target = {0, 0, 0},
  32. up = {0, 1, 0},
  33. fovy = 60,
  34. }
  35. // Main loop
  36. for !rl.WindowShouldClose()
  37. {
  38. delta := rl.GetFrameTime()
  39. rl.UpdateCamera(&camera, rl.CameraMode.ORBITAL)
  40. // Change cube color
  41. if rl.IsKeyDown(.C) {
  42. hueCube = math.wrap(hueCube + 45.0 * delta, 360)
  43. material.emission.color = rl.ColorFromHSV(hueCube, 1.0, 1.0)
  44. }
  45. // Adjust bloom parameters
  46. env := r3d.GetEnvironment()
  47. intensityDir := i32(is_key_down_delay(.RIGHT)) - i32(is_key_down_delay(.LEFT))
  48. adjust_bloom_param(&env.bloom.intensity, intensityDir, 0.01, 0.0, math.F32_MAX)
  49. radiusDir := i32(is_key_down_delay(.UP)) - i32(is_key_down_delay(.DOWN))
  50. adjust_bloom_param(&env.bloom.filterRadius, radiusDir, 0.1, 0.0, math.F32_MAX)
  51. levelDir := i32(rl.IsMouseButtonDown(.RIGHT)) - i32(rl.IsMouseButtonDown(.LEFT))
  52. adjust_bloom_param(&env.bloom.levels, levelDir, 0.01, 0.0, 1.0)
  53. // Cycle bloom mode
  54. if rl.IsKeyPressed(.SPACE) {
  55. env.bloom.mode = r3d.Bloom((int(env.bloom.mode) + 1) % (int(r3d.Bloom.SCREEN) + 1))
  56. }
  57. rl.BeginDrawing()
  58. rl.ClearBackground(rl.RAYWHITE)
  59. r3d.Begin(camera)
  60. r3d.DrawMesh(cube, material, {0, 0, 0}, 1.0)
  61. r3d.End()
  62. // Draw bloom info
  63. draw_text_right(rl.TextFormat("Mode: %s", get_bloom_mode_name()), 10, 20, rl.LIME)
  64. draw_text_right(rl.TextFormat("Intensity: %.2f", env.bloom.intensity), 40, 20, rl.LIME)
  65. draw_text_right(rl.TextFormat("Filter Radius: %.2f", env.bloom.filterRadius), 70, 20, rl.LIME)
  66. draw_text_right(rl.TextFormat("Levels: %.2f", env.bloom.levels), 100, 20, rl.LIME)
  67. rl.EndDrawing()
  68. }
  69. }
  70. is_key_down_delay :: proc(key: rl.KeyboardKey) -> bool {
  71. return rl.IsKeyPressedRepeat(key) || rl.IsKeyPressed(key)
  72. }
  73. get_bloom_mode_name :: proc() -> cstring {
  74. modes := [?]cstring{"Disabled", "Mix", "Additive", "Screen"}
  75. env := r3d.GetEnvironment()
  76. mode := int(env.bloom.mode)
  77. return mode >= 0 && mode < len(modes) ? modes[mode] : "Unknown"
  78. }
  79. draw_text_right :: proc(text: cstring, y: i32, fontSize: i32, color: rl.Color) {
  80. width := rl.MeasureText(text, fontSize)
  81. rl.DrawText(text, rl.GetScreenWidth() - width - 10, y, fontSize, color)
  82. }
  83. adjust_bloom_param :: proc(param: ^f32, direction: i32, step: f32, min: f32, max: f32) {
  84. if direction != 0 {
  85. param^ = clamp(param^ + f32(direction) * step, min, max)
  86. }
  87. }