| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- package skybox
- import rl "vendor:raylib"
- import r3d "../r3d"
- main :: proc() {
- // Initialize window
- rl.InitWindow(800, 450, "[r3d] - Skybox example")
- defer rl.CloseWindow()
- rl.SetTargetFPS(60)
- // Initialize R3D
- r3d.Init(rl.GetScreenWidth(), rl.GetScreenHeight())
- defer r3d.Close()
- // Create sphere mesh
- sphere := r3d.GenMeshSphere(0.5, 32, 64)
- defer r3d.UnloadMesh(sphere)
- // Define procedural skybox parameters
- skyParams := r3d.CUBEMAP_SKY_BASE
- skyParams.groundEnergy = 2.0
- skyParams.skyEnergy = 2.0
- skyParams.sunEnergy = 2.0
- // Load and generate skyboxes
- skyProcedural := r3d.GenCubemapSky(512, skyParams)
- defer r3d.UnloadCubemap(skyProcedural)
- skyPanorama := r3d.LoadCubemap("./resources/panorama/sky.png", .AUTO_DETECT)
- defer r3d.UnloadCubemap(skyPanorama)
- // Generate ambient maps
- ambientProcedural := r3d.GenAmbientMap(skyProcedural, {.ILLUMINATION, .REFLECTION})
- defer r3d.UnloadAmbientMap(ambientProcedural)
- ambientPanorama := r3d.GenAmbientMap(skyPanorama, {.ILLUMINATION, .REFLECTION})
- defer r3d.UnloadAmbientMap(ambientPanorama)
- // Set default sky/ambient maps
- env := r3d.GetEnvironment()
- env.background.sky = skyPanorama
- env.ambient._map = ambientPanorama
- // Set tonemapping
- env.tonemap.mode = .AGX
- // Setup camera
- camera: rl.Camera3D = {
- position = {0, 0, 10},
- target = {0, 0, 0},
- up = {0, 1, 0},
- fovy = 60,
- }
- // Capture mouse
- rl.DisableCursor()
- // Main loop
- for !rl.WindowShouldClose()
- {
- rl.UpdateCamera(&camera, rl.CameraMode.FREE)
- rl.BeginDrawing()
- rl.ClearBackground(rl.RAYWHITE)
- env := r3d.GetEnvironment()
- if rl.IsMouseButtonPressed(.LEFT) {
- if env.background.sky.texture == skyPanorama.texture {
- env.background.sky = skyProcedural
- env.ambient._map = ambientProcedural
- } else {
- env.background.sky = skyPanorama
- env.ambient._map = ambientPanorama
- }
- }
- // Draw sphere grid
- r3d.Begin(camera)
- for x in 0..=8 {
- for y in 0..=8 {
- material := r3d.GetDefaultMaterial()
- material.orm.roughness = rl.Remap(f32(y), 0.0, 8.0, 0.0, 1.0)
- material.orm.metalness = rl.Remap(f32(x), 0.0, 8.0, 0.0, 1.0)
- r3d.DrawMesh(sphere, material, {f32(x - 4) * 1.25, f32(y - 4) * 1.25, 0.0}, 1.0)
- }
- }
- r3d.End()
- rl.EndDrawing()
- }
- }
|