bloom.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include <r3d/r3d.h>
  2. #include <raymath.h>
  3. static bool IsKeyDownDelay(int key);
  4. static const char* GetBloomModeName(void);
  5. static void DrawTextRight(const char* text, int y, int fontSize, Color color);
  6. static void AdjustBloomParam(float* param, int direction, float step, float min, float max);
  7. int main(void)
  8. {
  9. // Initialize window
  10. InitWindow(800, 450, "[r3d] - Bloom example");
  11. SetTargetFPS(60);
  12. // Initialize R3D
  13. R3D_Init(GetScreenWidth(), GetScreenHeight());
  14. // Setup bloom and tonemapping
  15. R3D_ENVIRONMENT_SET(tonemap.mode, R3D_TONEMAP_ACES);
  16. R3D_ENVIRONMENT_SET(bloom.mode, R3D_BLOOM_MIX);
  17. R3D_ENVIRONMENT_SET(bloom.levels, 1.0f);
  18. // Set background
  19. R3D_ENVIRONMENT_SET(background.color, BLACK);
  20. // Create cube mesh and material
  21. R3D_Mesh cube = R3D_GenMeshCube(1.0f, 1.0f, 1.0f);
  22. R3D_Material material = R3D_GetDefaultMaterial();
  23. float hueCube = 0.0f;
  24. material.emission.color = ColorFromHSV(hueCube, 1.0f, 1.0f);
  25. material.emission.energy = 1.0f;
  26. material.albedo.color = BLACK;
  27. // Setup camera
  28. Camera3D camera = {
  29. .position = {0, 3.5f, 5},
  30. .target = {0, 0, 0},
  31. .up = {0, 1, 0},
  32. .fovy = 60
  33. };
  34. // Main loop
  35. while (!WindowShouldClose())
  36. {
  37. float delta = GetFrameTime();
  38. UpdateCamera(&camera, CAMERA_ORBITAL);
  39. // Change cube color
  40. if (IsKeyDown(KEY_C)) {
  41. hueCube = Wrap(hueCube + 45.0f * delta, 0, 360);
  42. material.emission.color = ColorFromHSV(hueCube, 1.0f, 1.0f);
  43. }
  44. // Adjust bloom parameters
  45. float intensity = R3D_ENVIRONMENT_GET(bloom.intensity);
  46. int intensityDir = IsKeyDownDelay(KEY_RIGHT) - IsKeyDownDelay(KEY_LEFT);
  47. AdjustBloomParam(&intensity, intensityDir, 0.01f, 0.0f, INFINITY);
  48. R3D_ENVIRONMENT_SET(bloom.intensity, intensity);
  49. float radius = R3D_ENVIRONMENT_GET(bloom.filterRadius);
  50. int radiusDir = IsKeyDownDelay(KEY_UP) - IsKeyDownDelay(KEY_DOWN);
  51. AdjustBloomParam(&radius, radiusDir, 0.1f, 0.0f, INFINITY);
  52. R3D_ENVIRONMENT_SET(bloom.filterRadius, radius);
  53. int levelDir = IsMouseButtonDown(MOUSE_BUTTON_RIGHT) - IsMouseButtonDown(MOUSE_BUTTON_LEFT);
  54. float levels = R3D_ENVIRONMENT_GET(bloom.levels);
  55. AdjustBloomParam(&levels, levelDir, 0.01f, 0.0f, 1.0f);
  56. R3D_ENVIRONMENT_SET(bloom.levels, levels);
  57. // Draw scene
  58. if (IsKeyPressed(KEY_SPACE)) {
  59. R3D_ENVIRONMENT_SET(bloom.mode, (R3D_ENVIRONMENT_GET(bloom.mode) + 1) % (R3D_BLOOM_SCREEN + 1));
  60. }
  61. BeginDrawing();
  62. ClearBackground(RAYWHITE);
  63. R3D_Begin(camera);
  64. R3D_DrawMesh(cube, material, Vector3Zero(), 1.0f);
  65. R3D_End();
  66. // Draw bloom info
  67. DrawTextRight(TextFormat("Mode: %s", GetBloomModeName()), 10, 20, LIME);
  68. DrawTextRight(TextFormat("Intensity: %.2f", R3D_ENVIRONMENT_GET(bloom.intensity)), 40, 20, LIME);
  69. DrawTextRight(TextFormat("Filter Radius: %.2f", R3D_ENVIRONMENT_GET(bloom.filterRadius)), 70, 20, LIME);
  70. DrawTextRight(TextFormat("Levels: %.2f", R3D_ENVIRONMENT_GET(bloom.levels)), 100, 20, LIME);
  71. EndDrawing();
  72. }
  73. R3D_UnloadMesh(cube);
  74. R3D_Close();
  75. CloseWindow();
  76. return 0;
  77. }
  78. bool IsKeyDownDelay(int key)
  79. {
  80. return IsKeyPressedRepeat(key) || IsKeyPressed(key);
  81. }
  82. const char* GetBloomModeName(void)
  83. {
  84. const char* modes[] = {"Disabled", "Mix", "Additive", "Screen"};
  85. int mode = R3D_ENVIRONMENT_GET(bloom.mode);
  86. return (mode >= 0 && mode <= R3D_BLOOM_SCREEN) ? modes[mode] : "Unknown";
  87. }
  88. void DrawTextRight(const char* text, int y, int fontSize, Color color)
  89. {
  90. int width = MeasureText(text, fontSize);
  91. DrawText(text, GetScreenWidth() - width - 10, y, fontSize, color);
  92. }
  93. void AdjustBloomParam(float* param, int direction, float step, float min, float max)
  94. {
  95. if (direction != 0)
  96. *param = Clamp(*param + direction * step, min, max);
  97. }