skybox.c 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include <r3d/r3d.h>
  2. #include <raymath.h>
  3. #ifndef RESOURCES_PATH
  4. # define RESOURCES_PATH "./"
  5. #endif
  6. int main(void)
  7. {
  8. // Initialize window
  9. InitWindow(800, 450, "[r3d] - Skybox example");
  10. SetTargetFPS(60);
  11. // Initialize R3D
  12. R3D_Init(GetScreenWidth(), GetScreenHeight());
  13. // Create sphere mesh
  14. R3D_Mesh sphere = R3D_GenMeshSphere(0.5f, 32, 64);
  15. // Define procedural skybox parameters
  16. R3D_CubemapSky skyParams = R3D_CUBEMAP_SKY_BASE;
  17. skyParams.groundEnergy = 2.0f;
  18. skyParams.skyEnergy = 2.0f;
  19. skyParams.sunEnergy = 2.0f;
  20. // Load and generate skyboxes
  21. R3D_Cubemap skyProcedural = R3D_GenCubemapSky(512, skyParams);
  22. R3D_Cubemap skyPanorama = R3D_LoadCubemap(RESOURCES_PATH "panorama/sky.hdr", R3D_CUBEMAP_LAYOUT_AUTO_DETECT);
  23. // Generate ambient maps
  24. R3D_AmbientMap ambientProcedural = R3D_GenAmbientMap(skyProcedural, R3D_AMBIENT_ILLUMINATION | R3D_AMBIENT_REFLECTION);
  25. R3D_AmbientMap ambientPanorama = R3D_GenAmbientMap(skyPanorama, R3D_AMBIENT_ILLUMINATION | R3D_AMBIENT_REFLECTION);
  26. // Set default sky/ambient maps
  27. R3D_ENVIRONMENT_SET(background.sky, skyPanorama);
  28. R3D_ENVIRONMENT_SET(ambient.map, ambientPanorama);
  29. // Set tonemapping
  30. R3D_ENVIRONMENT_SET(tonemap.mode, R3D_TONEMAP_AGX);
  31. // Setup camera
  32. Camera3D camera = {
  33. .position = {0, 0, 10},
  34. .target = {0, 0, 0},
  35. .up = {0, 1, 0},
  36. .fovy = 60
  37. };
  38. // Capture mouse
  39. DisableCursor();
  40. // Main loop
  41. while (!WindowShouldClose())
  42. {
  43. UpdateCamera(&camera, CAMERA_FREE);
  44. BeginDrawing();
  45. ClearBackground(RAYWHITE);
  46. if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) {
  47. if (R3D_ENVIRONMENT_GET(background.sky.texture) == skyPanorama.texture) {
  48. R3D_ENVIRONMENT_SET(background.sky, skyProcedural);
  49. R3D_ENVIRONMENT_SET(ambient.map, ambientProcedural);
  50. }
  51. else {
  52. R3D_ENVIRONMENT_SET(background.sky, skyPanorama);
  53. R3D_ENVIRONMENT_SET(ambient.map, ambientPanorama);
  54. }
  55. }
  56. // Draw sphere grid
  57. R3D_Begin(camera);
  58. for (int x = 0; x <= 8; x++) {
  59. for (int y = 0; y <= 8; y++) {
  60. R3D_Material material = R3D_MATERIAL_BASE;
  61. material.orm.roughness = Remap((float)y, 0.0f, 8.0f, 0.0f, 1.0f);
  62. material.orm.metalness = Remap((float)x, 0.0f, 8.0f, 0.0f, 1.0f);
  63. R3D_DrawMesh(sphere, material, (Vector3) {(float)(x - 4) * 1.25f, ((float)y - 4) * 1.25f, 0.0f}, 1.0f);
  64. }
  65. }
  66. R3D_End();
  67. EndDrawing();
  68. }
  69. // Cleanup
  70. R3D_UnloadAmbientMap(ambientProcedural);
  71. R3D_UnloadAmbientMap(ambientPanorama);
  72. R3D_UnloadCubemap(skyProcedural);
  73. R3D_UnloadCubemap(skyPanorama);
  74. R3D_UnloadMesh(sphere);
  75. R3D_Close();
  76. CloseWindow();
  77. return 0;
  78. }