February 2024 Newsletter

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

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

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

Play

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

Source

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

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

Play

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

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