Chris Biscardi's Avatar

Chris Biscardi

@chrisbiscardi.bsky.social

Rustlang and Rustlang accessories * YouTube: https://www.youtube.com/@chrisbiscardi * Learn Rust: https://www.rustadventure.dev/ * Rust Discord: https://discord.gg/GJ5UfxzUcP * Party Corgi Content Discord: https://discord.gg/partycorgi

5,279 Followers  |  339 Following  |  540 Posts  |  Joined: 24.04.2023  |  1.754

Latest posts by chrisbiscardi.bsky.social on Bluesky

Post image

Bevy lookin good

28.10.2025 17:29 โ€” ๐Ÿ‘ 33    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0
Preview
Extreme Bevy 6: Sprite animations In this part, we'll add sprites for our main characters and animate them.

I've updated Extreme Bevy, my tutorial series on creating a p2p web game to Bevy 0.17.

I also added a brand new chapter on sprite animations. It's starting to look like a real game now :)

Playable embeds at the end

johanhelsing.studio/posts/extrem...

#bevyengine #rustlang #gamedev

25.10.2025 17:39 โ€” ๐Ÿ‘ 27    ๐Ÿ” 9    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0
Post image

updated the low-poly terrain chunk management demo to 0.17 and made it use bevy_malek_async, which is *awesome*.

github.com/rust-adventu...

25.10.2025 23:12 โ€” ๐Ÿ‘ 3    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0
Video thumbnail

2d visibility mesh, passed into a post-process shader and obscuring non-visible areas

21.10.2025 20:05 โ€” ๐Ÿ‘ 19    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Starting a patreon is one thing, but building the community that funds the patreon typically has to be the first concern.

For example: if everything you do is locked behind a patreon paywall, then nobody will be able to share that with others and it's hard to grow the group of patreon members.

21.10.2025 18:53 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

(The latest was a wasm document and related code examples)

20.10.2025 23:14 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

jeez I have scripts and workshops that I completely wrote, finished, and forgot to ever publish.

20.10.2025 23:14 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Yeah that's a problem in the "pick the closest wall" section of the demo. Given two rays with a series of hits each, how do you pick the right wall to draw the triangle on

19.10.2025 12:07 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Yeah definitely an open question, and I think with some use case based answers

19.10.2025 12:05 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

nope, that's it. Its nothing special. I'll do some profiling and maybe some optimizations after I fix the bugs that are left. will look into more serious optimizations like bvh, etc if I need to.

19.10.2025 02:03 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

I'm only shooting rays at the vertices so they're all guaranteed "hits" from that perspective. I'm not firing arbitrary numbers of rays hoping they hit, thus there's no resolution issues with number of rays that may or may not hit a vertex, etc.

19.10.2025 01:57 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

I mean, in a 2d game how many vertices are you actually drawing? Its not 3d and there's no million+ vertex meshes.

19.10.2025 01:50 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

oh and the "algorithm to get the points to raytrace towards" is just "grab the vertices from the meshes".

19.10.2025 01:45 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

So there's plenty of things to optimize but I'm not shooting any rays that don't hit. I haven't noticed any issues while I've been working on it, so its sitting somewhere well under 120fps frame budget with all that said.

19.10.2025 01:45 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

I haven't finished the implementation, so haven't benchmarked anything yet.

The algorithm iterates over the vertices in sorted angle order, doing line/segment intersection for each. There's no bvh, I'm naively redoing all the work every frame, and I'm running in dev profile with no optimizations

19.10.2025 01:45 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Yes

19.10.2025 01:31 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

nothing in this is an sdf

19.10.2025 01:27 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0
Video thumbnail

and with rnadom shapes

19.10.2025 01:27 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0
Post image

with wireframes

19.10.2025 01:23 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0
Video thumbnail

getting closer

19.10.2025 01:21 โ€” ๐Ÿ‘ 3    ๐Ÿ” 1    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0
Video thumbnail

progress on the 2d visibility mesh demo.

We built out raytracing from scratch, now just need to take advantage of it to fill in the rest of the triangles

18.10.2025 23:01 โ€” ๐Ÿ‘ 24    ๐Ÿ” 1    ๐Ÿ’ฌ 2    ๐Ÿ“Œ 0
trigger C; queue D

trigger C; queue D

queue D; trigger C;

queue D; trigger C;

Post image

Now what *does* happen, is that because observers are recursive, if you "trigger C; queue D" vs "queue D; trigger C" you will see different behavior.

This is because the observer will always run to completion before continuing. One of these images is the former, and the other is the latter.

18.10.2025 22:56 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Observers run their command queues recursively, immediately. So you don't need to "place apply_deferred in the right spot".

For example, if you trigger observer A and B in sequence, then in A's handler you trigger Observer C and queue a command D; C and D run before B.

18.10.2025 22:56 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0
Store migration guides in the repository by Jondolf ยท Pull Request #867 ยท avianphysics/avian Objective Closes #742. Until now, we have had the following process: Each PR that has a breaking change is marked with C-Breaking-Change, and gets a ## Migration Guide section At the end of the re...

Avian is getting pretty big nowadays! To mark the start of a new release cycle, I spent some time improving our processes moving forward.

Notably, Avian now stores migration guides in-repo, similar to Bevy:
github.com/avianphysics...

18.10.2025 18:16 โ€” ๐Ÿ‘ 38    ๐Ÿ” 4    ๐Ÿ’ฌ 2    ๐Ÿ“Œ 0

there's so much cool ui in pokemon za

18.10.2025 21:20 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Cinnog is what I use for This Week in Bevy.

thisweekinbevy.com

18.10.2025 14:18 โ€” ๐Ÿ‘ 17    ๐Ÿ” 1    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

re: gotchas in the proposed solution.

I haven't tested this at all in that capacity, so just don't know.

That said, it uses a queued command to power the behavior, which works well with observers and their recursive execution. So no frame delay but maybe something more subtle?

18.10.2025 14:17 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

re: upstreaming, something that has the behavior people expect will be upstreamed. Alice is very aware of this and wants it to happen.

18.10.2025 14:17 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

That slice is empty by default, so It won't fire any observers that have filters.

If you fill that slice, it will fire for *all* components you put in that slice.

So the article shows how to identify which components from a pre-set list are actually on the entity, and only include those

18.10.2025 14:17 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

The tricky part is that you as the user calling trigger have to call trigger_with, and place the components you want to trigger in the components slice. Which means you can put *any* components in that slice, even components that do/don't exist on that entity.

18.10.2025 14:17 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

@chrisbiscardi is following 20 prominent accounts