instanced.odin 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package instanced
  2. import rl "vendor:raylib"
  3. import r3d "../r3d"
  4. INSTANCE_COUNT :: 1000
  5. main :: proc() {
  6. // Initialize window
  7. rl.InitWindow(800, 450, "[r3d] - Instanced rendering example")
  8. defer rl.CloseWindow()
  9. rl.SetTargetFPS(60)
  10. // Initialize R3D
  11. r3d.Init(rl.GetScreenWidth(), rl.GetScreenHeight())
  12. defer r3d.Close()
  13. // Set ambient light
  14. env := r3d.GetEnvironment()
  15. env.ambient.color = rl.DARKGRAY
  16. // Create cube mesh and default material
  17. mesh := r3d.GenMeshCube(1, 1, 1)
  18. defer r3d.UnloadMesh(mesh)
  19. material := r3d.GetDefaultMaterial()
  20. defer r3d.UnloadMaterial(material)
  21. // Generate random transforms and colors for instances
  22. instances := r3d.LoadInstanceBuffer(INSTANCE_COUNT, {.POSITION, .ROTATION, .SCALE, .COLOR})
  23. defer r3d.UnloadInstanceBuffer(instances)
  24. positions := cast([^]rl.Vector3)r3d.MapInstances(instances, {.POSITION})
  25. rotations := cast([^]rl.Quaternion)r3d.MapInstances(instances, {.ROTATION})
  26. scales := cast([^]rl.Vector3)r3d.MapInstances(instances, {.SCALE})
  27. colors := cast([^]rl.Color)r3d.MapInstances(instances, {.COLOR})
  28. for i in 0..<INSTANCE_COUNT
  29. {
  30. positions[i] = {
  31. f32(rl.GetRandomValue(-50000, 50000)) / 1000,
  32. f32(rl.GetRandomValue(-50000, 50000)) / 1000,
  33. f32(rl.GetRandomValue(-50000, 50000)) / 1000,
  34. }
  35. rotations[i] = rl.QuaternionFromEuler(
  36. f32(rl.GetRandomValue(-314000, 314000)) / 100000,
  37. f32(rl.GetRandomValue(-314000, 314000)) / 100000,
  38. f32(rl.GetRandomValue(-314000, 314000)) / 100000,
  39. )
  40. scales[i] = {
  41. f32(rl.GetRandomValue(100, 2000)) / 1000,
  42. f32(rl.GetRandomValue(100, 2000)) / 1000,
  43. f32(rl.GetRandomValue(100, 2000)) / 1000,
  44. }
  45. colors[i] = rl.ColorFromHSV(
  46. f32(rl.GetRandomValue(0, 360000)) / 1000, 1.0, 1.0,
  47. )
  48. }
  49. r3d.UnmapInstances(instances, {.POSITION, .ROTATION, .SCALE, .COLOR})
  50. // Setup directional light
  51. light := r3d.CreateLight(.DIR)
  52. r3d.SetLightDirection(light, {0, -1, 0})
  53. r3d.SetLightActive(light, true)
  54. // Setup camera
  55. camera: rl.Camera3D = {
  56. position = {0, 2, 2},
  57. target = {0, 0, 0},
  58. up = {0, 1, 0},
  59. fovy = 60,
  60. }
  61. // Capture mouse
  62. rl.DisableCursor()
  63. // Main loop
  64. for !rl.WindowShouldClose()
  65. {
  66. rl.UpdateCamera(&camera, rl.CameraMode.FREE)
  67. rl.BeginDrawing()
  68. rl.ClearBackground(rl.RAYWHITE)
  69. r3d.Begin(camera)
  70. r3d.DrawMeshInstanced(mesh, material, instances, INSTANCE_COUNT)
  71. r3d.End()
  72. rl.DrawFPS(10, 10)
  73. rl.EndDrawing()
  74. }
  75. }