Compiler Updates #
Monthly Release includes LLVM 17.0.1 support for linux and darwin.
Events #
Handmade Seattle is happening in November! Make sure to check out the event https://handmadecities.com/seattle/.
YouTube #
Rickard Andersson (gonz on Discord) continues on his odin videos
Here’s a list of what he went over this month:
- “Debugging Odin code” addendum - SeerGDB
- Command line arguments and dependencies in Odin
- Using functions from other languages (FFI) in Odin
- FFI example in Odin: Using Odin code in Erlang/Elixir
- Types and data in Odin
- Stream, Reader and data pointers
- Bytes, binary and hexadecimal
- Byte order / Endianness
- Bitwise operations - Extracting from and setting values in bytes
Gotta catch up on these!
Games #
SabeMakesGames released his first small game done with odin! Check it out here https://sabe09.itch.io/attack-of-the-goobers
He also made a short video on it:
Editors #
obiwan87 has added support of JetBrains editors! It’s still early and doesnt support everything but its a nice start.
New / Updated Projects #
I’ll try posting the comments or descriptions the authors posted for their packages.
Journey ECS - Raigon #
Read more on: https://github.com/KDahir247/Journey_ECS
Fast Minimal Sparse set for Odin Language Which is being used in Odin-Journey.
Features:
- Fast single component iteration & entity iteration (Dense array iteration)
- Unlimitied amount of component can be added
- Very minimal Only does what it needs and nothing more.
- SOA component dense array
- Extremely fast grouping and sub grouping query (eg. Entity with position and scale)
- Reduced memory consumption on sparse array
- Allow upto or more then 1 Million entity
package main
import ecs "foldername that has this single script"
main :: proc() {
  world := init_world()
  defer deinit_world(world)
  Position :: struct{
      val : #simd[4]f32,
  }
  Rotation :: struct{
      val : #simd[4]f32,
  }
  Scale :: struct{
      val : #simd[4]f32,
  }
  Velocity :: struct{
      val : #simd[4]f32,
  }
  register(world, Position)
  register(world, Rotation)
  register(world, Scale)
  register(world, Velocity)
  
  entity := create_entity(world)
  entity1 := create_entity(world) 
  entity2 := create_entity(world) 
  entity3 := create_entity(world) 
  entity4 := create_entity(world)
  velocityx := Velocity{
      val = {1.0, 0.0, 0.0, 0.0},
  }
  postion_x := Position{
      val = {2.0, 0.0, 0.0, 0.0},
  }
  postion_y := Position{
      val = {0.0,3.14,0.0,0.0},
  }
  position_xy := Position{
      val = {24.0,7.11,0.0,0.0},
  }
 
  Quaternion_IDENTITY := Rotation{
      val = {0.0,0.0,0.0,1.0},
  }
  add_soa_component(world, entity2, velocityx)
  add_soa_component(world, entity1, postion_x)
  add_soa_component(world, entity2, postion_y)
  add_soa_component(world, entity2, Quaternion_IDENTITY)
  add_soa_component(world, entity, position_xy)
  add_soa_component(world, entity, Quaternion_IDENTITY)
  postion_scale_query := query(world, Velocity, Scale) //register and sort using group
  position_rotation_query := query(world, Position, Rotation) //register and sort using group
  position_rotation_query1 := query(world, Position, Rotation) //doesn't register or sort using group uses the cache result
  postion_scale_query1 := query(world, Velocity, Scale) //doesn't register or sort using group uses the cache result
 
  for component_storage, index in run(&position_rotation_query){
    mut_component_storage := component_storage
    if component_storage.entities[index] == 2{
        fmt.println("Moving the player entity", component_storage.entities[index] , "Right by 100" )
        mut_component_storage.component_a[index].val += {100.0, 0.0, 0.0, 0.0}
    }
    fmt.print(component_storage.entities[index], " :\t")
    fmt.print(component_storage.component_a[index], "\t")
    fmt.print(component_storage.component_b[index])
    fmt.println()
  }
  fmt.println("\n")
}
Job Scheduler - jakubtomsu (Jacob) #
Read more on: https://github.com/jakubtomsu/jobs
I made a small job system for Odin. This is a port of my old fiber-based C++ job scheduler, but it’s much simpler and has less overhead. I also added a few examples, including boids simulation with Raylib. Features include:
- dispatching jobs
- waiting for jobs (while processing other queued jobs at the same time)
- nested jobs
- utilities for batch processing arrays/slices
- optional immediate-mode-style thread processing loop
main :: proc() {
    jobs.initialize()
    g: jobs.Group
    jobs.dispatch(.Medium, jobs.make_job(&g, hello_job))
    jobs.wait(&g)
    jobs.shutdown()
}
hello_job :: proc(_: rawptr) {
    fmt.println("Hello from thread", jobs.current_thread_index())
}
Cody: A simple code counter - JetDove #
Read more on: https://github.com/CoolDove/cody

Box2D v3 odin bindings - Cristhofer #
Read more on: https://github.com/cristhofermarques/odin-box2d/
package box2d_example
import b2 "box2d"
import "core:fmt"
main :: proc()
{
    world_def := b2.DEFAULT_WORLD_DEF
    world_def.gravity = b2.Vec2{0, -10}
    world_id := b2.create_world(&world_def)
    defer b2.destroy_world(world_id)
    
    ground_body_def := b2.DEFAULT_BODY_DEF
    ground_body_def.position = b2.Vec2{0, -10}
    ground_body_id := b2.world_create_body(world_id, &ground_body_def)
    ground_box := b2.make_box(50, 10)
    ground_shape_def := b2.DEFAULT_SHAPE_DEF
    b2.body_create_polygon(ground_body_id, &ground_shape_def, &ground_box)
    body_def := b2.DEFAULT_BODY_DEF
    body_def.type = .Dynamic
    body_def.position = b2.Vec2{0, 4}
    body_id := b2.world_create_body(world_id, &body_def)
    shape_def := b2.DEFAULT_SHAPE_DEF
    shape_def.density = 1
    shape_def.friction = 0.3
    circle: b2.Circle
    circle.radius = 1
    b2.body_create_circle(body_id, &shape_def, &circle)
    time_step: f32 = 1.0 / 60.0
    velocity_iterations: i32 = 6
    position_iterations: i32 = 2
    
    for i in 0..<60
    {
        b2.world_step(world_id, time_step, velocity_iterations, position_iterations)
        position := b2.body_get_position(body_id)
        angle := b2.body_get_angle(body_id)
        fmt.println(position, angle)
    }
}
MagicaVoxel .vox model Loader - jakubtomsu (Jacob) #
Read more on: https://github.com/jakubtomsu/odin-vox
A simple loader for .vox models from MagicaVoxel. The base format is fully implemented, but no extensions are supported yet.
// Load and parse data from file.
// Alternatively use `vox.load_from_data`.
if data, ok := vox.load_from_file("my_model.vox", context.temp_allocator); ok {
  for model, i in data.models {
    fmt.printf("Model %i:\n", i)
    fmt.printf("\tsize: %v\n", model.size)
    fmt.printf("\tvoxels:\n")
    for voxel, j in model.voxels {
      fmt.printf("\t[%i] %v: %i\n", j, voxel.pos, voxel.color_index)
    }
  }
}
Community Showcase #
Another month has passed - this time around there was less going on but we’re nearing the end of the year.
Game Development #
We are building a 2D engine and this is our progress so far. Right now we have a custom ECS, and we have a animation system, plus we have 2D point lights implemented - ScottCastle
building a small editor for the game I'm currently toying with. Normally I just do everything in code but its nice to be able to edit colliders and such while seeing the effect. - rhoeberg
Realized my game needed branching dialogue, so I made this editor + new gameplay code for handling dialogue choices! 😺 - karl_zylinski
Trying to make my little FPS engine based on Raylib - Nefrace
Starting to put together an in-game editor, added some window management features to make it comfy. - davidcergizan
started to implement window docking because I got jealous of how slick @davidcergizans editor is looking. Still a lot of work to get it nice but I think its doable - rhoeberg
Graphics #
Got the basics working. This is a window manager for linux, written in Odin - Smilex
working on a raymarching renderer! - sandwichman
new demo! sorry for the jumpy motion, it doesn't like sharing the GPU with my recording software quite yet 😠- sandwichman
Tools & UI #
my image splicer doing the most basic image splicing, just for the end of the jam - Stvff

After so many hours of headbanging against manpages and 3 odin internal compiler errors found, I've managed to start writing a debugger... - flysand
got custom win32 window borders working for my platform layer 🎉 - Skytrias
Miscellaneous #

Working on a MIPS assembler for a personal project. I'm really bad at parsing but here is my first progress update in which I am successfully validating token sequences that correspond to the instructions. - Heinrich
Made my go-to thing to make in a new language - a Brainfuck compiler - Only generates naïve code for linux-x64 but I might add more backends and some optimizations - Danie

My first test run of my MIPS assembler producing a binary usable by my emulator. - Heinrich

The true purpose of the emulator. I am associating part of the memory with a text display beginning at 0x400. - Heinrich