Daddy needs a new pair of RAM!

edit: the fps are way better in smaller terminal windows with lower character count but then it’s hard to make out the dice. D:

edit2: code here (expires in 2 weeks)

  • AnarchistArtificer@lemmy.world
    link
    fedilink
    English
    arrow-up
    29
    ·
    12 hours ago

    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.

    • Pudutr0n@lemmy.worldOP
      link
      fedilink
      arrow-up
      11
      ·
      11 hours ago

      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.

  • adhocfungus@midwest.social
    link
    fedilink
    arrow-up
    12
    ·
    16 hours ago

    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.

      • glizzyguzzler@piefed.blahaj.zone
        link
        fedilink
        English
        arrow-up
        2
        ·
        4 hours ago

        When I opened the code I immediately scrolled to the bottom to see how many lines, and hell yeah. I read through it and I’m horrified, but I’m even more horrified it works. This is truly an chievement

        Here it is running over SSH https://files.catbox.moe/qkwd4q.mp4 what more could I ask for, thank you for making this insane thing and sharing it!

        • Pudutr0n@lemmy.worldOP
          link
          fedilink
          arrow-up
          2
          ·
          4 hours ago

          holy shit, I’m so flattered! Thank you for your kind support and encouragement!

          It’s crazy that it looks okaish right? quaternions, dude. I have implemented them in 3 projects and still have no fucking idea how they work.

          Also, you can run it in --quality low if you’re struggling with framerate. :)

          • glizzyguzzler@piefed.blahaj.zone
            link
            fedilink
            English
            arrow-up
            2
            ·
            edit-2
            2 hours ago

            It’s insane how many features this has for being insane in of itself!

            Edit: that was running on anemic “1 core” (1 very shared core) VPS, bumping it up to 4, hooboy do those dice fly

      • glizzyguzzler@piefed.blahaj.zone
        link
        fedilink
        English
        arrow-up
        2
        ·
        10 hours ago

        Haha there is no shame in shell code, it’s already monstrous to start!

        I’ve written things in shell that would look sooo nice and concise in any other language, but it became a Cthulu-ass demigorgon so quick in shell! Have no fear, fear is the mind killer, the little death!

      • KeenFlame@feddit.nu
        link
        fedilink
        arrow-up
        6
        ·
        15 hours ago

        The only way to do it is to do it - me, 2026

        Nah, but seriously, that insecurity is a disease that will actually make you produce embarrassing code. As soon as you feel confidence feedback take off, you will paint the functions brilliant once you de-neuter your inner codebeast. It wants to fuck. Let it.

      • BasedMaquisEddington@lemmy.dbzer0.com
        link
        fedilink
        arrow-up
        9
        arrow-down
        1
        ·
        18 hours ago

        I hope you change your mind.

        Most people care about features, not the implementation.

        Those who dislike your code are probably going to generally dislike others’ code anyways, so in a sense they don’t even need to see your code to already disapprove of it 🤷‍♀️

      • promitheas@programming.dev
        link
        fedilink
        arrow-up
        9
        ·
        19 hours ago

        My suggestion is do it. Its a cool project, and clearly there is interest from others who could contribute to the project by suggestions, bug fixing, or general collaboration, helping you learn. Just add some kind of disclaimer in the project that its not ready yet, and that youre still learning and it should be fine.

  • farmgineer@nord.pub
    link
    fedilink
    English
    arrow-up
    20
    ·
    20 hours ago

    Are you often described as a masochist?

    It looks neat. I can’t imagine wanting to write it in bash, though, heh.

  • MonkderVierte@lemmy.zip
    link
    fedilink
    arrow-up
    16
    ·
    19 hours ago

    (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.
    • Pudutr0n@lemmy.worldOP
      link
      fedilink
      arrow-up
      14
      ·
      19 hours ago

      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. :)

      • Atherel@lemmy.dbzer0.com
        link
        fedilink
        arrow-up
        6
        ·
        17 hours ago

        I first read it as “there’s a lot of DOOM for improvement” but as the rest of your comment confirmed this, I’ll keep it that way in my head!

  • Mike Wooskey@lemmy.thewooskeys.com
    link
    fedilink
    English
    arrow-up
    8
    ·
    18 hours ago

    I’m viewing this thread in Lemmy and am unable to find any mention of a link to the source code or a demo, and I can’t see the attached media (genetic image icon - is it an animated gif or a video?).

    Based on all the comments, I appear to be in the [significant] minority. Would you mind posting a link to your source or demo or image/video?

    • Pudutr0n@lemmy.worldOP
      link
      fedilink
      arrow-up
      17
      ·
      18 hours ago

      I haven’t shared the source code yet because criticism is terrifying and I’m a horrible coder, but with the encouragement of the the community I might give it a shot. I don’t even have a codeberg account yet though.

      The post contains these two video links: https://files.catbox.moe/8rz9m7.mp4 https://files.catbox.moe/5d3n2k.mp4

      If you still can’t see them, maybe you can suggest a different hosting service, one that works for you? Or if you really really want the source code I suppose I could send it by DM on the meantime.

      • vrek@programming.dev
        link
        fedilink
        English
        arrow-up
        6
        ·
        17 hours ago

        Just letting you know the original post video didn’t load and gave a 500 error in jerboa but those two links work. Looks impressive but I’m confused on how to read the die. Yes there is a giant banner telling me the value it chose but I’m struggling to figure out how the visuals map to those values, can you give some details on how to read the die?

        • Pudutr0n@lemmy.worldOP
          link
          fedilink
          arrow-up
          6
          ·
          edit-2
          17 hours ago

          Yes, the values are rendered on top of each face with “pixel” maps (ascii art) that have the character of the digit they represent as each pixel. These are later manipulated by the perspective projection.

          For example on this d6 you can see the top face has 1s written down (in the shape of a sideways one) and the front one has 4s written down in the shape of a skewed and sideways 4.

          In this specific color scheme there’s not a lot of contrast between the values, but even in the palettes with better contrast, good readability is something I’m kind of giving up on solving well.

          edit: might be clearer here:

          • vrek@programming.dev
            link
            fedilink
            English
            arrow-up
            2
            ·
            8 hours ago

            In the second picture (with the d20) I’m guessing the face with “999” is actually a 9 but what is the value of the face with “999#111”…there is no value of 91 on a d20 :)

  • Gsus4@mander.xyz
    link
    fedilink
    arrow-up
    8
    ·
    edit-2
    16 hours ago

    3D dice rolling…ok…😐 … in bash …🤨 !?

    PS: I remember seeing something vaguely like this recently…this you?

        • RheumatoidArthritis@mander.xyz
          link
          fedilink
          arrow-up
          17
          ·
          21 hours ago

          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
          }
          
    • Pudutr0n@lemmy.worldOP
      link
      fedilink
      arrow-up
      14
      ·
      20 hours ago

      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).