Do you think God stays in heaven because he too lives in fear of what he's created?
Programming
Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!
Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.
Hope you enjoy the instance!
Rules
Rules
- Follow the programming.dev instance rules
- Keep content related to programming in some way
- If you're posting long videos try to add in some form of tldr for those who don't want to watch videos
Wormhole
Follow the wormhole through a path of communities !webdev@programming.dev
God comes over
creates some bullshit
stays in heaven
refuses to elaborate
AI killed like 10 whales for this.
I think I might love you
ily2 bb <3
this is fucking CONTENT, baby!!! Great work, honestly great code. This is an achievement.
One of my favourite things in the entire world is what I call "high effort shitposts". Running DOOM on absurd devices like pregnancy tests is the archetypical example I use when explaining this.
Well, congrats, because this is absurd enough that this makes the list too. You are ridiculous and delightful, and I am glad that you exist to create impressive horrors like this.
Thank you so much! I love high effort shitposts too!
And if you liked that, you're going to love this: A while ago I also wrote a 3d renderer from scratch inside the picotron, an emulated fantasy console that never existed, to display a 3d model of a pudu.
I have a few more of these you might appreciate, non 3d related.
Get this on the berg I wanna render my dice rolls over SSH stat
lol but it's not finished and everyone will see how stupid my code (and brain) is D:
It's bash. Everyone is expecting nightmare code, and that's why it's fun!
I'm curious why it seems the time slows down at the end compared to reality? Because more computation is needed to check if it's a stable state?
the final resolution stage was a huge headache and as you can see, one I didn't fully solve. Basically when the dice finally settle, particularly those with more sides, lots and lots of micro collisions happen in close sequence, each one having to apply friction and bounce back. As velocities come close to be rounded to 0, the bounce back effect and force of gravity no longer provide movement, but the final angle of the bottom face may not be fully settled on the floor. So basically if i don't ignore all these tiny collisions I get the frame rate drop you see and if I do, I can arrive at not fully settled states which can become ambiguous result-wise in, say, the 20-sided die.
Since you're rolling on a plane, can't you simplify the collisions to only check the corners? I think that should be all that's needed. There shouldn't be a time where the edges or faces are below the lowest corner on a plane, so they can be skipped I believe.
i need to check the corner collisions but when the die start settling and an entire edge comes close to the floor, gravity keeps pulling back on several of them making them bounce back just a tiny bit, not reaching the velocity that gets rounded to zero.
I fixed that on the current version doe!
why not save the state of the di(ce) in the settling phase and choose (or allow user assignable) value for how many consecutive identicle states before freezing the di(ce) and reporting the result?
my only concern would be a "spinning" di but short of colliding with other dice, that seems technically solved
that's one of the aspects of the current implementation
Are you often described as a masochist?
It looks neat. I can't imagine wanting to write it in bash, though, heh.
XD I am! And it was a complete nightmare. hahaha
I just woke up and this is the first thing I see. Did I really woke up?
(hopefully) Constructive critique:
- it looks like you're handling the dice in physics as a ball? Takes forever to settle at the end.
- the throw has a visual glitch.
Thanks! Yeah, there's definitely A LOT of room for improvement. collisions are handled per vertex, but torque is applied to angular impulse to the dice as a whole (like a ball I guess). The settling is a huge issue, yes. the visual glitches I've been trying to get rid of but man... fix one and then another one pops up in a different case. Thanks for your critique. :)
Haha nice! How long did it take you? Integer-only math?
All computer math is integer math if you go deep enough
I'm sure implementing floating point directly in bash would work great
I didn't have the patience to do it myself bit wanted to see just how complex it would get:
fp32_mul() {
local a=$1 b=$2
local sa=$(( (a >> 31) & 1 ))
local sb=$(( (b >> 31) & 1 ))
local sign=$((sa ^ sb))
local ea=$(( (a >> 23) & 0xff ))
local eb=$(( (b >> 23) & 0xff ))
local fa=$(( a & 0x7fffff ))
local fb=$(( b & 0x7fffff ))
# NaN / infinity / zero handling
if (( ea == 255 )); then
if (( fa != 0 )); then
printf '%08x\n' $((0x7fc00000))
return
fi
if (( eb == 0 && fb == 0 )); then
printf '%08x\n' $((0x7fc00000)) # inf * 0 = NaN
return
fi
printf '%08x\n' $(((sign << 31) | 0x7f800000))
return
fi
if (( eb == 255 )); then
if (( fb != 0 )); then
printf '%08x\n' $((0x7fc00000))
return
fi
if (( ea == 0 && fa == 0 )); then
printf '%08x\n' $((0x7fc00000))
return
fi
printf '%08x\n' $(((sign << 31) | 0x7f800000))
return
fi
if (( ea == 0 && fa == 0 || eb == 0 && fb == 0 )); then
printf '%08x\n' $((sign << 31))
return
fi
# Convert subnormals to a normalized significand/exponent.
# m is a 24-bit significand for normals.
local ma mb
if (( ea == 0 )); then
ma=$fa
ea=1
while (( (ma & 0x800000) == 0 )); do
ma=$((ma << 1))
((ea--))
done
else
ma=$((fa | 0x800000))
fi
if (( eb == 0 )); then
mb=$fb
eb=1
while (( (mb & 0x800000) == 0 )); do
mb=$((mb << 1))
((eb--))
done
else
mb=$((fb | 0x800000))
fi
# Multiply the two 24-bit significands.
# Product is up to 48 bits.
local p=$((ma * mb))
local e=$((ea + eb - 127))
# Normalize product.
#
# ma*mb has binary point after bit 46. If bit 47 is set,
# product is [2,4), otherwise [1,2).
local shift
if (( p & 0x800000000000 )); then
shift=24
((e++))
else
shift=23
fi
# Extract 23 fraction bits plus guard/round/sticky information.
local frac=$(( (p >> shift) & 0x7fffff ))
local guard=$(( (p >> (shift - 1)) & 1 ))
local round=$(( (p >> (shift - 2)) & 1 ))
local sticky=0
if (( shift >= 3 )); then
local mask=$(( (1 << (shift - 2)) - 1 ))
(( (p & mask) != 0 )) && sticky=1
fi
# Round-to-nearest, ties-to-even.
if (( guard && (round || sticky || (frac & 1)) )); then
((frac++))
if (( frac == 0x800000 )); then
frac=0
((e++))
fi
fi
# Overflow -> infinity.
if (( e >= 255 )); then
printf '%08x\n' $(((sign << 31) | 0x7f800000))
return
fi
# Normal result.
if (( e > 0 )); then
printf '%08x\n' $(((sign << 31) | (e << 23) | frac))
return
fi
# Underflow into the subnormal range.
#
# At this point the normalized significand represented by
# (1.frac) must be shifted right by 1-e positions.
local mant=$((0x800000 | frac))
local rshift=$((1 - e))
local lost=0
local halfway=0
local low=0
if (( rshift >= 25 )); then
# Everything rounds to zero (unless the exact value is
# sufficiently close, which it cannot be here).
mant=0
else
low=$((mant & ((1 << rshift) - 1)))
mant=$((mant >> rshift))
halfway=$((1 << (rshift - 1)))
if (( low > halfway || (low == halfway && (mant & 1)) )); then
((mant++))
fi
fi
# Rounding a subnormal can produce the smallest normal.
if (( mant >= 0x800000 )); then
printf '%08x\n' $(((sign << 31) | (1 << 23)))
else
printf '%08x\n' $(((sign << 31) | mant))
fi
}
1440 multiplications per second on my computer!
Wow, over a kiloflop!
Jebus I don't even know how long I've been working on this. It started out as a way to teach myself bash, combined with my long obsession with rendering platonic solids. I previously coded a huge galaxy of hundreds of thousands of polyhedra you could fly across in python with opengl shaders and got to reuse/translate a lot of that code. The quaternion stuff I was grateful to not have to rethink that much again. haha. And yes, integer-only! Some params are "floating point" but i just parse them and add a bunch of zeroes so i can later do all the operations with equally blown up values of pi and trig stuff from "lookup tables" (case matching).
Absolutely insane. Part of me wants to see the source code, but part of me is terrified of how complex it must be. Plus I've only been writing bash for 20 years, so it would probably look incomprehensible to me.
@Pudutr0n@lemmy.world - You are certifiably insane. There are a million more effective ways to achieve this, with less resources... I LOVE IT.
