Commit graph

3808 commits

Author SHA1 Message Date
Emi Gutekanst
17a830f857 object: add ability to tag arbitrary objects with arbitrary tags and values
Modules define lists of objects, e.g. a `SpriteRenderer` module may define

```zig
sprites: mach.Objects(struct {
    // ...
}),
```

Previously, the only way for another Mach module to 'attach data to a sprite object' or 'tag a sprite' would be to (ab)use the graph relations system, creating their own object and using parent/child relations to express that the sprite has some tag/data associated with it. For example:

```zig
// Game.zig

is_monster: mach.Object(struct{}), // empty object just to indicate 'some other object is a monster'

// ...

// Create a 'tag object'
const is_monster_tag_obj_id = game.is_monster.new(.{});

// Add the 'tag object' as a child of our sprite
sprite_renderer.sprites.addChild(my_sprite_id, is_monster_tag_obj_id);

// ...
```

This usage of the API was quite ugly/usage, and importantly eliminated your ability to use the parent/child relations for _other_ things where they are more appropriate. However, it did mean that you didn't have to go and fork+modify the `SpriteRenderer` module that you e.g. imported as a reusable package.

With this change, we add object _tags_ and _tags with values_. Any module can add their own tags or tags with values to any object, whether it is from their module or not. For example, the `is_monster` example above could now be written as:

```zig
// Game.zig

pub const mach_tags = .{ .is_monster };

// ...

try sprite_renderer.sprites.setTag(sprite_id, Game, .is_monster, null);
const is_monster: bool = sprite_renderer.sprites.hasTag(sprite_id, Game, .is_monster);
// is_monster == true!

// No longer a monster
try sprite_renderer.sprites.removeTag(sprite_id, Game, .is_monster);
```

This allows for effectively tagging objects as distinct kinds, states, etc. even though they aren't our object and we can't modify their `struct {}` type to include an `is_monster: bool` field of our own.

Internally, the implementation stores tags using a hashmap under the assumption that not all objects in a list will have a tag.

Tags with values work almost identically, the only difference is that the last parameter to `setTag` is set to another `mach.ObjectID` which points to whatever arbitrary data you'd like to attach to the object, and `getTag` returns it. For example:

```zig
// Game.zig

pub const mach_tags = .{
    /// Whether a sprite is a monster
    .is_monster,

    /// Whether a sprite has a friendly sprite attached to it
    .{ .friend, Sprite, .sprites },
};

// ...

try sprite_renderer.sprites.setTag(sprite_id, Game, .friend, friendly_sprite_id);

const has_friend: bool = sprite_renderer.sprites.hasTag(sprite_id, Game, .friend);
// has_friend == true!

// Get our friend
const friend_id: mach.ObjectID = sprite_renderer.sprites.getTag(sprite_id, Game, .friend);
// friend_id == friendly_sprite_id

// Delete our friend
try sprite_renderer.sprites.removeTag(sprite_id, Game, .friend);
```

Signed-off-by: Emi Gutekanst <emi@hexops.com>
2025-02-08 19:13:12 -07:00
Daniel
9749cd9a65 Add matrix rotation by quaternion 2025-02-01 20:00:03 -08:00
msg-programs
6fd6a8fa67 Add format function for vector and matrix types. 2025-02-01 19:55:19 -08:00
Emi Gutekanst
a812370f84
README: fix link 2025-02-01 20:53:42 -07:00
Emi Gutekanst
a8f873110c
README: clarify community focus 2025-02-01 20:22:33 -07:00
foxnne
8bd988d21d core: Update to latest mach-objc 2025-01-31 08:09:23 -08:00
Jonathan Marler
f9e1a9087f core: windows: refactor everything 2025-01-19 13:37:48 -07:00
Emi Gutekanst
1e2cbc4d71 module: improve error messages when systems are registered incorrectly
Signed-off-by: Emi Gutekanst <emi@hexops.com>
2025-01-17 21:23:07 -07:00
xdBronch
eb12b0f476 use multiarraylist more optimally in mach.Objects 2025-01-12 09:11:07 -07:00
Joshua Holmes
ab143504ab linux: improve logging when both backends fail 2025-01-12 09:10:24 -07:00
Joshua Holmes
377842aef8 gamemode: revert commit 41ddd22 for gamescope.zig 2025-01-12 09:10:24 -07:00
Joshua Holmes
db186847a7 core: remove core_platform build option and remove Null.zig 2025-01-12 09:05:09 -07:00
Joshua Holmes
caf297512c core: remove option to support non-blocking and only allow platform to control main loop 2025-01-12 09:05:09 -07:00
Joshua Holmes
710b5907a2 linux: remove deinit() because it doesn't seem like it's used in other platforms 2025-01-12 09:05:09 -07:00
Joshua Holmes
431684af7e linux: remove check_for_mach_updates because it was unnecessary refactoring 2025-01-12 09:05:09 -07:00
Emi Gutekanst
aab0eb62f2 {gfx,module}: fix Text update bug caused by anyUpdate reset, add peekAnyUpdate/peekUpdate
Signed-off-by: Emi Gutekanst <emi@hexops.com>
2025-01-10 20:10:58 -07:00
Emi Gutekanst
1d01c91536 gamemode: fix linux build
Signed-off-by: Emi Gutekanst <emi@hexops.com>
2024-12-31 19:14:56 -07:00
Tristan Crawford
41ddd2249f all: instrument library loading 2024-12-31 19:03:58 -07:00
Emi Gutekanst
c56d596ea9
github: update zig nomination template 2024-12-30 20:53:05 -07:00
Stephen Gutekanst
5dd8230f09 nominate Zig 2024.11.0-mach
Signed-off-by: Emi Gutekanst <emi@hexops.com>
2024-12-30 20:50:39 -07:00
Stephen Gutekanst
f5512d1750 update to latest zig version
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-30 20:50:20 -07:00
Stephen Gutekanst
ccd79dd1ef replace direct3d-headers (deprecated) with directx-headers
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-30 20:50:20 -07:00
Stephen Gutekanst
ff13976518 update to latest zig version
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-30 20:50:20 -07:00
Stephen Gutekanst
b3139fbb0a update to latest zig version
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-30 20:50:20 -07:00
Wrench[bot]
e7d538bf7c all: update Zig to version 0.14.0-dev.2577+271452d22
Signed-off-by: Wrench[bot] <wrench@hexops.com>
2024-12-30 20:50:20 -07:00
Emi Gutekanst
c4c916fcef
github: remove direct3d-headers from nomination template 2024-12-30 19:23:57 -07:00
Emi Gutekanst
eb90aff4d0
github: update zig nomination issue template 2024-12-30 12:25:33 -07:00
Aeden McClain
04d7238383
object: when cleaning up dropped items, only re-add ones that aren't already in the recycle bin. (#1324)
Signed-off-by: Aeden McClain <dev@platypro.net>
2024-12-30 11:15:15 -07:00
Stephen Gutekanst
6450e8abbf Audio: rewrite sample mixing to use SIMD properly
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-29 15:15:56 -07:00
Stephen Gutekanst
1a7753936b Audio: fix audio buffer SIMD alignment issues
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-29 13:48:18 -07:00
Stephen Gutekanst
d848d2e26e examples: add comment to piano example
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-29 13:48:18 -07:00
Aeden McClain
a350ae9ee9
sysgpu: linux: fix spir-v generation in hardware test example (#1323) 2024-12-29 11:54:05 -07:00
Stephen Gutekanst
d62650276f examples: update hardware-check example to use new object system
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-27 17:39:30 -07:00
Stephen Gutekanst
f352670464 module: fix object_name_id bug
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-27 17:32:06 -07:00
Stephen Gutekanst
e5f48580ba gfx: minor Sprite module cleanup/improvements
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-27 16:38:42 -07:00
Stephen Gutekanst
eda3e68b6e examples: text example updated to new object system
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-27 16:36:53 -07:00
Stephen Gutekanst
68251d95b7 gfx: rewrite Text module to use new object system
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-27 16:36:12 -07:00
Stephen Gutekanst
fda85f8268 examples: update glyphs example to use new object system
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-26 12:35:53 -07:00
Stephen Gutekanst
2529515cd8 examples: sprite example working with object system
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-26 11:52:32 -07:00
Stephen Gutekanst
47a8a0d98c gfx: rewrite Sprite module to use object system
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-26 11:51:01 -07:00
Stephen Gutekanst
c6602a7286 build: update zigimg
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-26 11:50:45 -07:00
Stephen Gutekanst
8f642097e5 module: fix anyUpdated; make fields default to updated=true
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-26 11:49:50 -07:00
Stephen Gutekanst
1b7398f580 module: cleanup Objects.updated() implementation; add anyUpdated() variant
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-24 23:04:27 -07:00
Stephen Gutekanst
df3091bfd5 examples: custom-renderer working
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-24 20:30:32 -07:00
Stephen Gutekanst
eae5aa40be module: correct Objects.is() checker
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-24 18:05:34 -07:00
Stephen Gutekanst
94f0648be5 examples: piano example working again
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-24 18:05:14 -07:00
Stephen Gutekanst
5ed75fb3ee module: remove error-prone "optimized" function variants for now
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-24 17:02:36 -07:00
Stephen Gutekanst
15c3f772ef module: perform type checking of object IDs to avoid subtle bugs
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-24 17:00:39 -07:00
Stephen Gutekanst
a28b9798a8 module: improve error message for use-after-delete of objects
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-24 16:51:23 -07:00
Stephen Gutekanst
30bba9d49e examples: play-opus: minor fixes
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
2024-12-24 16:15:36 -07:00