Odin is on the journey to 1.0! You can read up on all changes in the monthly release notes.

Reddit #

Karl Zylinski opened up a reddit again! Check it out here Reddit. Personally I’ve left reddit but building up communities other than discord is good. The same applies to searching for odin help online.

Games #

We’ve got a whopping 3 Games this month! I’m very excited to show them off here, so please check them out.

Solar Storm from Jakub #

“Solar Storm steam page is live! It’s still fairly work-in-progress, the screenshots are outdated and there is no trailer, but I’m working on it! Wishlists are greatly appereciated!!”

Also I’m also doing a first public playtest this weekend, if anyone is interested, join solar storm discord server to participate: https://discord.com/invite/wn5jMMMYe4

Steam: https://store.steampowered.com/app/2754920/Solar_Storm/

The Legend of Ján Ïtor from Colin Bellino #

“Adventurers are spreading a lot of slime and other mess in the dungeon and you are the one tasked to clean it up before it becomes out of hand.

This game was created over a period of 2 weeks by a team of 3 people, this is a submission for the Pirate Game Jam 14.

Engine: This game was developed as an experiment and way of dog-fooding a custom, handmade game engine i am working on (written in the Odin language).”

CAT & ONION from karl_zylinski #

“My game CAT & ONION is now released on itch! https://zylinski.itch.io/cat-and-onion

It’s a warm adventure game where you play as a cat who goes on a surreal lil journey 🐱

It has taken me months to make and I’m very proud to have finished a game all by myself. It is written in Odin + Raylib.

When you buy on itch you also get a drop of the source code. It’s quite a chaotic code base, full of both good and bad things. The good parts is in my opinion the editor tools and the hot reloading etc. The bad parts is the entity system and the physics.”

Community Contributions #

Dynlib Helpers by Jeroen #

Useful new helper added to core:dynlib to automagically populate a struct with procedure and global pointers from a DLL (or other shared lib depending on platform).

package example

import "core:dynlib"
import "core:fmt"

Symbols :: struct {
    // `foo_` is prefixed, so we look for the symbol `foo_add`.
    add: proc "c" (int, int) -> int,
    // We use the tag here to override the symbol to look for, namely `bar_sub`.
    sub: proc "c" (int, int) -> int `dynlib:"bar_sub"`,

    // Exported global (if exporting an i32, the type must be ^i32 because the symbol is a pointer to the export.)
    // If it's not a pointer or procedure type, we'll skip the struct field.
    hellope: ^i32,

    // Handle to free library.
    // We can have more than one of these so we can match symbols for more than one DLL with one struct.
    _my_lib_handle: dynlib.Library,
}

main :: proc() {
    sym: Symbols

    // Load symbols from `lib.dll` into Symbols struct.
    // Each struct field is prefixed with `foo_` before lookup in the DLL's symbol table.
    // The library's Handle (to unload) will be stored in `sym._my_lib_handle`. This way you can load multiple DLLs in one struct.
    count, ok := dynlib.initialize_symbols(&sym, "lib.dll", "foo_", "_my_lib_handle")
    defer dynlib.unload_library(sym._my_lib_handle)
    fmt.printf("ok: %v. %v symbols loaded from lib.dll (%p).\n", ok, count, sym._my_lib_handle)

    if count > 0 {
        fmt.println("42 + 42 =", sym.add(42, 42))
        fmt.println("84 - 13 =", sym.sub(84, 13))
        fmt.println("hellope =", sym.hellope^)
    }
}

Output

Creating library W:\Odin\core\dynlib\example\lib.lib and object W:\Odin\core\dynlib\example\lib.exp
ok: true. 3 symbols loaded from lib.dll (7FFDCF510000).
42 + 42 = 84
84 - 13 = 71
hellope = 42

Odin / WASM / Webgl by thetarnav #

“I’ve been slowly getting into learning Odin, WASM and WebGL So I made a example project where I experiment with the three (and some js tooling for development/bundling) Maybe it could be useful for somebody for reference or as a template Also the wasm/js bindings there are rewritten into modules with types so it’s a bit easier to understand and extend them (no more random typos)”

Check it out here: https://thetarnav.github.io/odin-wasm

Community Showcase #

Repositories:

Gists:

Miscellaneous #

...

My x86 disassembler disassembling itself. Sheesh now im realizing how long the SSE instructions really are - flysand

Experimenting with a coroutine API for odin-http - laytan

...

Finally, got raylib running on the web - Christhofer

...

got a simple http server reading requests - fridge777

minor update: odin-mustache now supports an explicit layout to render a given template inside of - b3lm0nt mustache

Got an LED to blink on my RP4 - thanks to @irvin for adding the freestanding_arm64 target and sharing his example code! - markersniffen

Video visualization of linear vs binary search, made by generating ppms and then running x264 encoder - NicknEma Based on this article

brainf* interpreter 😄 - NicknEma

optimized brainf* interpreter 😄 - NicknEma

...

Its a mess but Hello world Jolt running in Odin. Bindings still have a looong way to go though. - Sumofat

Game Development #

juiced up analog detection for translating them into cardinal inputs. bonus points for use of quadrance instead of using square roots - Krzysztoφορος

...

Initial POC of Odin in Unity 😉 (DOTS is really making this easy :P) - Dani

Heres our latest update on our 2D game engine @Marko - ScottCastle

...

My Tilengine journey is continuing with great success. I've been writing a little "engine" to handle level loading, game logic, sprites etc. to use with the bindings... - Akuspel

...

Still a spinning Unity Cube, but more stuff has been moved to odin (SystemState, EntityQueries & ComponentHandle usage.. also, dynamic dll loading) - Dani

Source
...

first raylib + Odin experiment - gabs

Day 1 - ҽʅʅσɾα

Day 2 - ҽʅʅσɾα

Just a small prototype I have whipped up for a top down hack and slash game. Everything is very crude and basic but there is something emerging. So much to work on... - Perlind

Day 3 - ҽʅʅσɾα

doing some funky collision-pair debug visualization using immediate mode rendering. This actually showed me that i forgot to delete the enemies once they go out of screen on the bottom side - The Lua Whisperer

randomly sized big explosions - The Lua Whisperer

i've made hex-chess with odin/sdl2, i've also managed to "link" sdl2 to wasm target so there is a web build if u want to check out - шоськудись Source

...

Odin+SDL+GOL - Glennwiz

Graphics #

...

Got my GPU driven animations to work. Basically doing all the computation and blending on the compute shader. The cpu just finds the animations frames indices and calculates the weight and are then sent to the gpu - Draoz

i had recently implemented rxi's cached renderer in compute which overcomplicated things - so this version does tiles per draw call + instances calls within each tile - Skytrias

...

Got my first working build of odin bindings for the Spine-c runtime (with raylib)! - Zealous

...

After some struggles, I got working Tilengine bindings in Odin! 🥳 - Akuspel

...

Back at it again fighting with my voxel engine, first pass at getting light sources to work done - Chris

...

I know I'm not the first, but here it is a basic Webgpu "Hello Triangle" application using a recent version of wgpu-native and some hand-made bindings - Vicix

...

not super fancy, but I drew a fish with the gpu, loaded from a .obj file. This is my first gpu project that isn't secretly a software renderer - Stvff

Achieved using Odin + SDL2 + OpenGL + @Jesse Blender importer-exporter - Smilex

...

crudely animating my fish programmatically - Stvff

CPU rendering transparency unlocked - Krzysztoφορος

Tools & UI #

whats this? 👀 - Skytrias

...

Been getting quite annoyed with the sluggish windows file explorer recently... - Francis_the_cat

The Focus text editor inspired me to try making my own editor with some things it doesn't have like identifier type coloring. Here's basic demo of it mostly working. Still have a long way to go, this just parses the file you're editing. Will look into parsing packages you declare through import statements now. - CasualKyle