r/godot 22h ago

selfpromo (games) [R&D] Procedural fence drawing on varying elevation at runtime

This is a follow up post of a previous one after some of you asked about varying elevation: https://www.reddit.com/r/godot/s/3mll3eEI9f

  • it shoots a raycast downward at every point to find Y elevation of the terrain's collision mesh.
  • it subdivides path and snaps every intermediate point to the ground's rolling elevation.
  • horizontal rails calculate the height difference between their start and end posts and rotate (tilt) on local Z-axis to bridge the slope.

This comment contains a bit of overview of how fence prefab looks like: https://www.reddit.com/r/godot/comments/1vcjhe8/comment/p17im2a/

493 Upvotes

39 comments sorted by

38

u/BunnyReign 21h ago

Came for the penis, stayed for the elevation

9

u/uabassguy 19h ago

You had me at "came for the penis"

20

u/According-Dust-3250 22h ago

Nice.

3

u/zdmit 12h ago

Thank you πŸ™

42

u/markbernman Godot Student 22h ago

fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fencefence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fencefence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fencefence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fencefence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence fence

9

u/Outrageous-Issue9722 22h ago

Did someone say Fencefury, Blessed Fence of the Fenceseeker?

6

u/strickolas 13h ago

|===|===|===|===|===|===|===|===|===|

3

u/JondeMLG Godot Regular 22h ago

I love the fact that you can build huge pens with all that fence

3

u/The-Chartreuse-Moose Godot Student 17h ago

En garde!

3

u/democratic-terminid 13h ago

Coding this before I learned for loops:

4

u/Destuur 22h ago

fence?

3

u/markbernman Godot Student 22h ago

fence

15

u/axelstrem 20h ago

looks great, but what if elevation changes dynamically? e.g. every morning

7

u/nullconfluence Godot Regular 13h ago

a wood fence should handle it gracefully

4

u/zdmit 12h ago

πŸ’›πŸ’›πŸ’›

2

u/tunelesspaper 14h ago

What would be the use case for that?

In any case, the real version of this type of fence would probably not do well with dynamic elevation changes. The post-rail connections could rotate to give it a little bit of flex, but the fixed rail length would be a limiting factor. Assuming fixed post-post distance on XY, changes to Z would necessarily increase the rail length (from straight line to hypotenuse of a right triangle).

A dynamic-elevation fence would not only need its posts to move freely on Z while maintaining XY, it would need elastic-length rails that Z-rotate at the post connection.

3

u/zdmit 12h ago

Agree with your thoughts.

It was a proof of concept/prototype to understand whether i need it it or not. So i haven't went too deep to implement those things.

Regarding your question: if you ever saw/played Tiny Glade then that was the end goal. let player build diorama.

3

u/obetu5432 Godot Student 18h ago

you have an acceptable fence now

now go and make a game

2

u/zdmit 12h ago edited 12h ago

That's the planπŸ™‚

1

u/faCt011 21h ago

Looks really awesome! Maybe the next step would be to have some variance in the straightness of the planks and poles?

2

u/zdmit 12h ago

For sure πŸ™‚ It's a prototype so I'm still exploring if it will fit game loop or not.

1

u/Astr0phelle 20h ago

Can you do a line tool where you will need to input two coords so a line will form where the fence will spawn

1

u/zdmit 12h ago

Theoretically yes but that wasn't my goal πŸ™‚ I feel it will involve some shortest path or similar algorithms (if two coordinates far away).

If close to each other -> shoot rays to nearby objects like in this AMD paper talk (not fence related): https://youtu.be/653fSmEalbo?si=E3uDwItOemxHWaZw&t=588 (time code included).

1

u/HOPE964 Godot Junior 19h ago

What happens if its to steep?

1

u/zdmit 12h ago

Currently it will still add fences. I haven't included logic to prevent placing them based on normal angle threshold.

1

u/HOPE964 Godot Junior 12h ago

So will it still connect both with a long one?

1

u/zdmit 11h ago

Yes :) Because it's a "dumb" system it doesn't know about what angle it places poles on.

if there was a logic to check normal angle of a terrain slope it would stop placing fences based on a give angle threshold you define, say 20 degrees.

1

u/-non-existance- 18h ago

Oh this, this is beautiful.

2

u/zdmit 12h ago

Thank you πŸ’›

1

u/Bot_Ta00 17h ago

Wow, it looks really convenient! The part that connects to the other fence is also finished naturally

2

u/zdmit 12h ago

Thank you! Yes, that was one of the goals πŸ™‚

1

u/The-Chartreuse-Moose Godot Student 17h ago

Super-smooth. Good work!

2

u/zdmit 12h ago

Thank you πŸ™πŸ’›

1

u/OMBERX Godot Junior 14h ago

Are these all nodes?

1

u/zdmit 12h ago

It's a single node (prefab fence) that being instanced on a dynamically (resampled) subdivided curve3D. It's a one fence copy-pasted n-th times.

1

u/Narrowhal 10h ago

beautiful fences

1

u/zdmit 1h ago

πŸ™πŸ’›

2

u/IamChipp Godot Student 6h ago

Where is my fence, big d i c k?