sponza.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include <r3d/r3d.h>
  2. #ifndef RESOURCES_PATH
  3. # define RESOURCES_PATH "./"
  4. #endif
  5. int main(void)
  6. {
  7. // Initialize window
  8. InitWindow(800, 450, "[r3d] - Sponza example");
  9. SetTargetFPS(60);
  10. // Initialize R3D
  11. R3D_Init(GetScreenWidth(), GetScreenHeight(), 0);
  12. // Post-processing setup
  13. R3D_ENVIRONMENT_SET(ssao.enabled, true);
  14. R3D_ENVIRONMENT_SET(ssao.radius, 2.0f);
  15. R3D_ENVIRONMENT_SET(ssao.power, 1.5f);
  16. R3D_ENVIRONMENT_SET(bloom.mode, R3D_BLOOM_MIX);
  17. // Background and ambient
  18. R3D_ENVIRONMENT_SET(background.color, SKYBLUE);
  19. R3D_ENVIRONMENT_SET(ambient.color, DARKGRAY);
  20. // Load Sponza model
  21. R3D_Model sponza = R3D_LoadModel(RESOURCES_PATH "sponza.glb");
  22. // Load skybox (disabled by default)
  23. R3D_Skybox skybox = R3D_LoadSkybox(RESOURCES_PATH "sky/skybox3.png", CUBEMAP_LAYOUT_AUTO_DETECT);
  24. bool skyEnabled = false;
  25. // Setup lights
  26. R3D_Light lights[2];
  27. for (int i = 0; i < 2; i++) {
  28. lights[i] = R3D_CreateLight(R3D_LIGHT_OMNI);
  29. R3D_SetLightPosition(lights[i], (Vector3){ i ? -10.0f : 10.0f, 20.0f, 0.0f });
  30. R3D_SetLightActive(lights[i], true);
  31. R3D_SetLightEnergy(lights[i], 4.0f);
  32. R3D_SetShadowUpdateMode(lights[i], R3D_SHADOW_UPDATE_MANUAL);
  33. R3D_EnableShadow(lights[i], 4096);
  34. }
  35. // Setup camera
  36. Camera3D camera = {
  37. .position = {8.0f, 1.0f, 0.5f},
  38. .target = {0.0f, 2.0f, -2.0f},
  39. .up = {0.0f, 1.0f, 0.0f},
  40. .fovy = 60.0f
  41. };
  42. // Capture mouse
  43. DisableCursor();
  44. // Main loop
  45. while (!WindowShouldClose())
  46. {
  47. UpdateCamera(&camera, CAMERA_FREE);
  48. // Toggle skybox
  49. if (IsKeyPressed(KEY_ZERO)) {
  50. if (skyEnabled) R3D_ENVIRONMENT_SET(background.sky, (R3D_Skybox){0});
  51. else R3D_ENVIRONMENT_SET(background.sky, skybox);
  52. skyEnabled = !skyEnabled;
  53. }
  54. // Toggle SSAO
  55. if (IsKeyPressed(KEY_ONE)) {
  56. R3D_ENVIRONMENT_SET(ssao.enabled, !R3D_ENVIRONMENT_GET(ssao.enabled));
  57. }
  58. // Toggle SSIL
  59. if (IsKeyPressed(KEY_TWO)) {
  60. R3D_ENVIRONMENT_SET(ssil.enabled, !R3D_ENVIRONMENT_GET(ssil.enabled));
  61. }
  62. // Toggle fog
  63. if (IsKeyPressed(KEY_THREE)) {
  64. R3D_ENVIRONMENT_SET(fog.mode, R3D_ENVIRONMENT_GET(fog.mode) == R3D_FOG_DISABLED ? R3D_FOG_EXP : R3D_FOG_DISABLED);
  65. }
  66. // Toggle FXAA
  67. if (IsKeyPressed(KEY_FOUR)) {
  68. if (R3D_HasState(R3D_FLAG_FXAA)) R3D_ClearState(R3D_FLAG_FXAA);
  69. else R3D_SetState(R3D_FLAG_FXAA);
  70. }
  71. // Cycle tonemapping
  72. if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) {
  73. R3D_Tonemap mode = R3D_ENVIRONMENT_GET(tonemap.mode);
  74. R3D_ENVIRONMENT_SET(tonemap.mode, (mode + R3D_TONEMAP_COUNT - 1) % R3D_TONEMAP_COUNT);
  75. }
  76. if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT)) {
  77. R3D_Tonemap mode = R3D_ENVIRONMENT_GET(tonemap.mode);
  78. R3D_ENVIRONMENT_SET(tonemap.mode, (mode + 1) % R3D_TONEMAP_COUNT);
  79. }
  80. BeginDrawing();
  81. ClearBackground(RAYWHITE);
  82. // Draw Sponza model
  83. R3D_Begin(camera);
  84. R3D_DrawModel(&sponza, (Vector3){0,0,0}, 1.0f);
  85. R3D_End();
  86. // Draw lights
  87. BeginMode3D(camera);
  88. DrawSphere(R3D_GetLightPosition(lights[0]), 0.5f, WHITE);
  89. DrawSphere(R3D_GetLightPosition(lights[1]), 0.5f, WHITE);
  90. EndMode3D();
  91. // Display tonemapping
  92. R3D_Tonemap tonemap = R3D_ENVIRONMENT_GET(tonemap.mode);
  93. const char* tonemapText = "";
  94. switch (tonemap)
  95. {
  96. case R3D_TONEMAP_LINEAR: tonemapText = "< TONEMAP LINEAR >"; break;
  97. case R3D_TONEMAP_REINHARD: tonemapText = "< TONEMAP REINHARD >"; break;
  98. case R3D_TONEMAP_FILMIC: tonemapText = "< TONEMAP FILMIC >"; break;
  99. case R3D_TONEMAP_ACES: tonemapText = "< TONEMAP ACES >"; break;
  100. case R3D_TONEMAP_AGX: tonemapText = "< TONEMAP AGX >"; break;
  101. default: break;
  102. }
  103. DrawText(tonemapText, GetScreenWidth() - MeasureText(tonemapText, 20) - 10, 10, 20, LIME);
  104. DrawFPS(10, 10);
  105. EndDrawing();
  106. }
  107. // Cleanup
  108. R3D_UnloadModel(&sponza, true);
  109. R3D_UnloadSkybox(skybox);
  110. R3D_Close();
  111. CloseWindow();
  112. return 0;
  113. }