animation.odin 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package animation
  2. import rl "vendor:raylib"
  3. import r3d "../r3d"
  4. main :: proc() {
  5. // Initialize window
  6. rl.InitWindow(800, 450, "[r3d] - Animation example")
  7. defer rl.CloseWindow()
  8. rl.SetTargetFPS(60)
  9. // Initialize R3D with FXAA
  10. r3d.Init(rl.GetScreenWidth(), rl.GetScreenHeight())
  11. defer r3d.Close()
  12. r3d.SetAntiAliasing(.FXAA)
  13. // Setup environment sky
  14. cubemap := r3d.LoadCubemap("./resources/panorama/indoor.png", .AUTO_DETECT)
  15. env := r3d.GetEnvironment()
  16. env.background.skyBlur = 0.3
  17. env.background.energy = 0.6
  18. env.background.sky = cubemap
  19. // Setup environment ambient
  20. ambientMap := r3d.GenAmbientMap(cubemap, {.ILLUMINATION})
  21. env.ambient._map = ambientMap
  22. env.ambient.energy = 0.25
  23. // Setup tonemapping
  24. env.tonemap.mode = .FILMIC
  25. env.tonemap.exposure = 1.5
  26. // Generate a ground plane and load the animated model
  27. plane := r3d.GenMeshPlane(10, 10, 1, 1)
  28. model := r3d.LoadModel("./resources/models/CesiumMan.glb")
  29. // Load animations
  30. modelAnims := r3d.LoadAnimationLib("./resources/models/CesiumMan.glb")
  31. modelPlayer := r3d.LoadAnimationPlayer(model.skeleton, modelAnims)
  32. // Setup animation playing
  33. r3d.SetAnimationWeight(&modelPlayer, 0, 1.0)
  34. r3d.SetAnimationLoop(&modelPlayer, 0, true)
  35. r3d.PlayAnimation(&modelPlayer, 0)
  36. // Create model instances
  37. instances := r3d.LoadInstanceBuffer(4, {.POSITION})
  38. positions := cast([^]rl.Vector3)r3d.MapInstances(instances, {.POSITION})
  39. for z in 0..<2 {
  40. for x in 0..<2 {
  41. positions[z*2 + x] = {f32(x) - 0.5, 0, f32(z) - 0.5}
  42. }
  43. }
  44. r3d.UnmapInstances(instances, {.POSITION})
  45. // Setup lights with shadows
  46. light := r3d.CreateLight(.DIR)
  47. r3d.SetLightDirection(light, {-1.0, -1.0, -1.0})
  48. r3d.SetLightActive(light, true)
  49. r3d.SetLightRange(light, 10.0)
  50. r3d.EnableShadow(light)
  51. // Setup camera
  52. camera: rl.Camera3D = {
  53. position = {0, 1.5, 3.0},
  54. target = {0, 0.75, 0.0},
  55. up = {0, 1, 0},
  56. fovy = 60
  57. }
  58. // Main loop
  59. for !rl.WindowShouldClose()
  60. {
  61. delta := rl.GetFrameTime()
  62. rl.UpdateCamera(&camera, rl.CameraMode.ORBITAL)
  63. r3d.UpdateAnimationPlayer(&modelPlayer, delta)
  64. rl.BeginDrawing()
  65. rl.ClearBackground(rl.RAYWHITE)
  66. r3d.Begin(camera)
  67. r3d.DrawMesh(plane, r3d.GetDefaultMaterial(), {0, 0, 0}, 1.0)
  68. r3d.DrawAnimatedModel(model, modelPlayer, {0, 0, 0}, 1.25)
  69. r3d.DrawAnimatedModelInstanced(model, modelPlayer, instances, 4)
  70. r3d.End()
  71. rl.EndDrawing()
  72. }
  73. // Cleanup
  74. r3d.UnloadAnimationPlayer(modelPlayer)
  75. r3d.UnloadAnimationLib(modelAnims)
  76. r3d.UnloadModel(model, true)
  77. r3d.UnloadMesh(plane)
  78. }