[icon ] blenderdumbass . org [icon scene] Articles

So Why The Hell this math NaNs out? Help me!

June 30, 2026

👁 7


#danisrace #moriasrace #game #gamedev #freesoftware #blender3d #python #programming #hacking #NAN


[avatar]by Blender Dumbass

Aka: J.Y. Amihud. A Jewish by blood, multifaceted artist with experience in film-making, visual effects, programming, game development, music and more. A philosopher at heart. An activist for freedom and privacy. Anti-Paternalist. A user of Libre Software. Speaking at least 3 human languages. The writer and director of the 2023 film "Moria's Race" and the lead developer of it's game sequel "Dani's Race".


33 Minute Read



Fucking NaN. A not a number value, invented in 1985 by computer people who had enough of error handling divisions by zero. A stupid concept. A thing so useless, and yet so dangerous, that I don't know how NaNs aren't considered bugs. What the actual fuck?! ↩ Reply

Rambling about NaNs


Okay let me explain from the beginning. I feel shit. You probably can tell that I feel shit. So NaNs... What the hell are they? And why the hell I feel so strongly about them? ↩ Reply

[embedded image]
↩ Reply

I develop a game called Dani's Race. It is a kind of silly GTA clone ( or something ) where you play as a little boy who steals cars and gets into all sorts of shenanigans. ↩ Reply

At one point, already long time ago, I started trying to make a multiplayer mode for this game. While developing the multiplayer mode I stumbled upon a bug that kept re-occurring that I couldn't comprehend. ↩ Reply

Here is a version of the same bug from much earlier. Probably one of the first recorded instances of it happening. ( I posted about it in the engine's bug-report page ). ↩ Reply

As you can see it is very early Dani's Race. Like from the first half of the first year of development. I drive a red car ( called "Redkiss" in the game ) and while trying desperately to control it I run into two strange issues: ↩ Reply

  • Then the whole frame becomes white. ↩ Reply
When I was in the mids of the height of the effort on the multiplayer for the game, I ran into this ( or very similar ) bugs constantly. And I couldn't explain or understand what the fuck was going on. Shit just kept breaking all the time. ↩ Reply

More then a year ago I published this video on Bugs in Dani's Race. It is an excellent starting point to comprehend what is going on with the NaNs. ↩ Reply

↩ Reply

In said video, which I hope you actually took time to watch, I explain the core mechanics of the NaN problem. The way I found out about it. And the way I ultimately gave up on trying to fix it. ↩ Reply

To recoup: While testing I found out that just standing in one spot for a long time, might make the shadows disappear. And with that ( which was not yet implemented in the version I ended up bug-reporting to the devs of the engine ) there were some sound issues. Mainly a noise of an engine sounded as if it was right next to the camera. ↩ Reply

I decided to look into this engine noise, trying to figure out what could get teleported to where the camera is, but what I found was more strange. Instead of a random car teleporting to camera, the random car teleported to coordinates of NaN x, NaN y and NaN z. ↩ Reply

Just to clarify. In 3D locations of objects are represented with 3 values: XY and Z. Those represent an arbitrary distance away from the center of the world. In Dani's Race those are measured in meters. So if a car in the game is at coordinates 100 x, -200 y and 55 z, it means that it is 100 meters to the right from the center, 200 meters backwards from the center, and 55 meters up from the center. ↩ Reply

The car, who's engine I heard loudly all of a sudden, was at coordinates NaN, NaN and NaN, which makes no bloody sense. NaN in computer science stands for "Not a Number". How the hell is this car, not a number meters away from the center? What? ↩ Reply

Well, the game-engine also was like "What?" and couldn't figure out where the sound of the car's motor should come from. So it gave up. And made the sound of the motor non-3D. Which I heard as if I was right next to it. ↩ Reply

Okay so, something happened. And a car ended up getting those Not numbers as coordinates. How does that effect the rest of the bug? ↩ Reply

Well here is the thing. Shadows are calculated using a voxel based shadowbox, that is stretched over the entire scene. All objects included. If one of those objects is at coordinates that are not a number, the stretching of the shadow-box collapses, and you ultimately get no shadows ( while technically they are still pretty much calculated ). ↩ Reply

And the white screen happens when the camera itself gets NaNed. ↩ Reply

At the time of that video I didn't care much about the NaN issue. So I patched it in a very round about way. I just made a function that runs every once in a while and searches for those NaNed objects. If it finds one. It deletes it. Problem solved. Shadows never go away for longer than a few seconds. And the annoying car engine is a temporary issue. ↩ Reply

Until the NaN plagued the game again! ↩ Reply

Not feeling much about the game, I focused on other projects for some time. Which faded interest in its multiplayer and other stuff in the eyes of people. And which ultimately made me forget about the whole NaN issue. ↩ Reply

Until I had time to burn all of a sudden. I'm pitching a movie script right now. I probably wrote about it here and there. In any case, dealing with producers involves a lot of waiting around. They like to take their time. ↩ Reply

So I started doing more Dani's Race, this time entering the so-called "Road Rage" phase of development. This time I'm not taking any of it seriously. I'm not "vibe-coding" it. God forbid I ever touch anything even remotely related to that shit. So don't worry about it. I even didn't update the version of the game-engine because they decided to use AI. I use the older, human-made version. And now ship a copy of it with the game. The beauty of "Libre Software" I suppose... anyway... what was I talking about? ↩ Reply

Yes... So I don't take the game seriously, which makes it ultimately a lot more fun in the end of the day. Both in terms of gameplay and in terms of development. I never thought, for example, that I would ever add weapons into the game. But fuck it. We have bazookas and mountable rocket launchers now. And you can shoot other racers. And the police can shoot you. Fuck yeah... Anyway... ↩ Reply

With the new life in the game itself, there came new interest from the public. And some people ( particularly Miner34 ) expressed an issue that I knew existed in the game. ↩ Reply

Sometimes when going to the garage ( where the game store your cars ) one or more of those cars will violently despawn from there. There will be a flash of light, a loud sound of the engine, and then a few seconds later, a huge freeze. ↩ Reply

Well this is the good old NaN bug. But this time not just being annoying. It literally steals cars you worked hard to get and save. ↩ Reply

When you exit the game it saves the savefile. If you don't know where it is, to back it up, this NaN bug can potentially ruin your whole progress, just like that. Just by being this nasty thing that keeps happening randomly. ↩ Reply

The flash of light, is the shadows. The engine is the collapsing 3D space. The freeze is the deletion of the car. The patch that I made earlier. This is a serious bug. ↩ Reply

The problem is, the bug seems very random. Sometimes it happens, sometimes it doesn't. I cannot predict when it will. I don't know what causes it. ↩ Reply

I was sure it was the multiplayer code. Hell, it started happening much more frequently after I worked on the multiplayer code. ↩ Reply

Finally today magic happened. I got a savefile ( that I backed up ) that consistently produces the bug. It was a sign. I had to fix it now. ↩ Reply

Fixing the NaN bug


So the setup was clear. I back up the file. I exit the game by killing it. I start the game and type GARAGE which is the cheat-code to teleport to the garage. As soon as I do that, the game spawns in the cars it has recorded into the save-file. And the NaN bug occurs. GOOD! Perfect. Now let's dig. ↩ Reply

To save and load the car I use a JSON formatted version of it, that I can dump into a file, generated by 2 functions in Scripts.Vehicle.py. Specifically the functions Encode and Decode. ↩ Reply

The Encode function is straight forward. It just takes whatever relevant info the car has and formats it such that it all could be dumped into JSON. ↩ Reply

The Decode part is interesting. ↩ Reply

It is both used to load in the saved cars from the garage, and both used for the multiplayer, to decode changes to cars, as received from the server. ↩ Reply

Maybe if this whole thing started with the Multiplayer, the bug is in the code dealing with the Multiplayer. ( Technically it is, but let's not go ahead of ourselves ). ↩ Reply

So I look into it and see 2 contenders: ↩ Reply

    if "position" in changed:
        newposition    = client.extrapolate(car.position.copy(),
                                            data.get("position",    (0,0,0)),
                                            obj = car)
        Reuse.Move(car, newposition)




We have these 2 functions that I clearly remember writing for the Multiplayer. The client.extrapolate function that tries to smooth out the positions of the cars received from the network. And the Reuse.Move function that tries to lower the impact of moving cars around on Depsgraph. ↩ Reply

Looking at Scripts.Reuse.py you can see that Reuse.Move function looks like this: ↩ Reply

def Move(object, position, times=1):

    # Moving object using applyMovement
    object.applyMovement( ( mathutils.Vector(position) - object.position ) * times )




Yes it looks a bit weird. Why not just write the location directly into car.position? And frankly I don't have enough science to see if it works the way it should. If anything, on paper it looks to be slower than writing the position directly. But... Depsgraph is a bitch. And it feels like using this actually improves performance a little bit. ↩ Reply

Why do I think that I might improve performance? ( I know, we will get to NaNs ). Well... it seems like whoever coded the engine ( UPBGE ) coded a more strict sort of recalculation thingie ( maybe not even Depsgraph, but I think it is Depsgraph ) when you assign things directly to variables on game objects. I talked about something like that in my optimization video. While running their functions seem to not do that. ↩ Reply

So think about it this way. If I assign a location to an object, this object needs to recalculate things internally to accommodate my assigning. If I run object.applyMovement instead, it doesn't need to recalculate anything. So I could give it only the difference of where it is, to where I want it to be ( which is trivial to calculate, as it is just 3 subtractions (xyz) ), and hopefully it will give me a way to move objects a little bit faster. ↩ Reply

The problem here is that I might be asking a function ( implemented in C++ internally in the game-engine ) to move an object zero meters away from where it is. Which internally might confuse it and result in a NaN. ↩ Reply

I know for a fact that the only way to make a NaN in python ( the language of the code of the game ) is to do float("nan"). As in, to literally tell python that I want specifically a NaN. I tried diving by zero and it just gave me errors. Like it should. I tried messing with precisions. It wouldn't budge. But I know at least one program in C++ susceptible to NaNs. Specifically Bullet Physics. Which coincidentally is the physics engine in the game engine I'm using for my game. And coincidentally the game engine is as well, written in C++. ↩ Reply

So maybe, by giving an object a request to move 0 meters I cause some calculation internally to collapse? Maybe I cause something on the C++ side of things to give me a NaN? ↩ Reply

No! I tried everything. The Reuse.Move function just won't budge. It is not it. It doesn't do the NaNs. ↩ Reply

Okay... what else is there? Right... client.extrapolate ↩ Reply

Well if you look into Scripts.Multiplayer.client.py you will see this function: ↩ Reply

def extrapolate(original, value, obj=None, objKey="position"):

    # This function will extrapolate motion
    # of objects.

    # Make sure both are Vectors

    if obj:
        try:
            original = obj["net-finals"][objKey].copy()
        except:
            pass
    
    original = mathutils.Vector(original)
    value    = mathutils.Vector(  value )

    # Calculate time offset
    
    offset   = time.time() - queue.get("time", time.time())
    frame    = queue.get("time", time.time()) - queue.get("tick", time.time())

    # caluclating the values

    diff     = value - original
    withext  = diff * ( frame + offset )
    final    = original + withext + diff

    # Smoothing data for the object.

    if obj:
        if "net-exp" not in obj:
            obj["net-exp"]        = {}
            obj["net-finals"]     = {}
            obj["net-originals"]  = {}
            
        obj["net-exp"][objKey] = ( diff + withext ) * ( ( 1 / ( frame + offset ) ) / bge.logic.getAverageFrameRate() )
        obj["net-exp"]["time"] = int(round(( frame + offset ) * bge.logic.getAverageFrameRate()))
        obj["net-exp"]["time-full"] = obj["net-exp"]["time"]
        obj["net-finals"][objKey] = final
        obj["net-originals"][objKey] = original
        
    return final




Look at this monstrosity. It is definitely it. I have FPS average stuff that I take from engine. I shove numbers back into engine. I do calculations with those numbers that could be unpredictable. It must be this function. ↩ Reply

No! I looked at the code a bit closer and found out that it not just not this function. This function doesn't even execute when loading cars from the garage. It is something else. ↩ Reply

I was desperate. I Decided to just dump locations of all cars per each frame of the game. And see what would happen. ↩ Reply

I see they spawn in. The locations are good. No NaNs. This is not even Decode. The cars spawns good. What the actual fuck? ↩ Reply

Next frame, the car is still there, still good. Next frame. Still there. Next frame? NaN! ↩ Reply

WHAT? ↩ Reply

WHAT? ↩ Reply

Sorry, WHAT? ↩ Reply

So the car spawns in normally. Doesn't break what so ever. 3 frames later suddenly decides to fucking NaN? ↩ Reply

I decided to comb through everything. ↩ Reply

What if I don't run it's Update function? ↩ Reply
Huh... the NaN problem disappears. ↩ Reply

Okay... what does the Update function run? ↩ Reply

PhysicsUpdate ? ↩ Reply

Not running just that... also no NaN. Hm... wait a second. ↩ Reply

I look inside. I see this: ↩ Reply

def PhysicsUpdate(car):
    
    # Updating the car physics to 
    # work with a more realistic
    # effect, while cheating at some
    # things.

    scene, car = GetSceneAndCar(car)
    toFPS = Opt.ToFPS()
    carD       = Opt.FastDict(car)
    
    # If car has no physics yet, give it physics
    initfirst = False
    if not getCarPhysics(car):
        InitCarPhysics(car)
        initfirst = True

    # Forces ( Drag Force, Down Force )
    
    x = 0
    z = -DownForce(car)
    df = DragForce(car)
    car.applyForce(df, False)
    car.applyForce([0, 0, z], not car.get("underwater", False))

    dirt = False
    ground = OnGround(car)
    if "ground" in str(ground).lower():
        dirt = True

        s = 50 * abs(car.localLinearVelocity.y)
        vec = (random.uniform(-s, s),
               random.uniform(-s, s),
               0)
        car.applyTorque(vec, True)

        
    if car.get("active") and ( dirt or ( abs(car.localLinearVelocity.x) > 2 and ground ) ) :

        speed = math.dist((0,0,0), car.localLinearVelocity)
        if speed > 10:
            Input.VibrateJoystick(speed/100, -car.localLinearVelocity.x)

    if car.get("active") or Opt.GoodFPS(str(id(car))+"_physics") or initfirst:
        
        GetPhysicsForces(car)
        SwingDoors(car)

        for n, wheel in enumerate(car["specs"]["wheels"]):

            wheelObject = car["wheels"][n]
            health      = wheelObject["health"] ** 2


            
            # Damping
            suspension = wheelObject["suspension"] * health   
            

            hbf = 1.0
            if car.get("handbraking"):
                if not wheel.get("front"): hbf = 0.5
                else:                      hbf = 0.6

            # Increasing suspension based on how much
            # the wheel is pressed against the bottom of the car.

            #if car["specs"].get("suspentionCorrect", True):
                #hight    = car.getVectTo(wheelObject.position)[2][2]
                #if hight > 0:
                #    suspension =  suspension * max(1, ( 1 + ( ( hight ) * 20 ) ))
                #suspension += abs(z)/10

            k = car["specs"]["suspentionDamping"]
            suspensionDamping = 2 * k * math.sqrt(suspension)
                
            getCarPhysics(car).setSuspensionStiffness(suspension, n)
            getCarPhysics(car).setSuspensionDamping(suspensionDamping, n)

            DFS = car["specs"].get("driftSpeed", 50)
            DRIFTINESS = car["specs"].get("driftiness", 1)

            DF  = max(0, min(1, abs(car.worldLinearVelocity.y) / DFS ) )
            if car.get("breaking"): DF = 1.0

            try:
                DFT = max(0, min(1, (math.dist((0,0,0),car.localAngularVelocity)
                                     / car["specs"].get("maxAngularVelocity", 1.5)) / DF ) )
            except: DFT = 0.0
            
            DF *= DFT
            
            
            grip = car["specs"]["grip"]

            
            if (car.localAngularVelocity.z > 0) != (car.localLinearVelocity.x > 0):
            
                dgrip = wheel.get("drift_grip", car["specs"]["grip"])
                grip = (grip*(1-DF)) + (dgrip * DF)

            car["DriftFactor"] = DF


            # if car.get("breaking"):
            #     DFS /= 10
            #     DRIFTINESS *= 10
            # DF = 1 / max(1, abs( car.localLinearVelocity.y ) / DFS )
            
            # if abs(car.localAngularVelocity.z) >= car["specs"].get("maxAngularVelocity", 1.5) * DF\
            #    and Turning(car) >= (DF/2) :
            #     grip = wheel.get("drift_grip", car["specs"]["grip"])
            #     car.applyTorque(car.localAngularVelocity*10*DRIFTINESS, True)
            # else:
            #     grip = car["specs"]["grip"]

            # Simulating sand and dirt and stuff.
            roll = car["specs"]["roll"]
            if dirt:
                grip *= 0.4
                roll += 0.8
            
            grip = grip*math.sqrt(car.mass)*hbf
            
            getCarPhysics(car).setTyreFriction(grip, n)
            getCarPhysics(car).setRollInfluence(roll, n)


            
    # Applying the engine acceleration
    # to the wheels.
    ApplyEngine(car)

    # Making sure to clear the acceleration
    # for the next frame.

    # if not car.get("braking"):
    #     car["driftturn"] = 0.0
    car["accelerating"] = False
    car["braking"]      = False


Surely somewhere here, somewhere in the getCarPhysics(car).setTyreFriction(grip, n) or something there is NaN. I disable all this code. No... Still NaNs. What? ↩ Reply

Where is the fucking NaN? ↩ Reply

ApplyEngine(car) ↩ Reply

Apply fucking Engine(car) !!! ↩ Reply

What? What could possibly be NaN worthy in Engine function? ↩ Reply

I look inside: ↩ Reply

def ApplyEngine(car):

    carD       = Opt.FastDict(car) 
    
    toFPS = Opt.ToFPS()
    
    hp = HorsePower(car)
    force = HorsePowerToWatts(hp) / 100
    grip = car["specs"]["grip"]

    # Here is a little cheat to help the car start
    notresistance = EngineResistance(car)
    if car.get("gear",0) == 0:
        notresistance = 1

    
    FO = force * notresistance / GetGearRatio(car) / grip

    T = time.time()

    if force > 0:
        D = max(0, FO - carD["prevF"])
    else:
        D = min(0, FO - carD["prevF"])

    # TODO, this is a temporary fix. For some reason small cars such
    # as scooter and kart overaccelerate when this is turned on.
    # The math is designed to give players the same acceleration across
    # different performances.

    # TODO, investigate this for causing strange NaN bugs.
    # So fart the car.get("accelerating") stops most of it
    # from happening. But maybe there is more to it.
    
    if car.get("accelerating") and car["specs"].get("type") not in ("skating vehicle", "kart"):
        try:
            
            calc = ( 1 / ( D * ( ( T - carD["prevT"] ) ** 2 ) ) )
            F = FO + calc
            
        except:
            F = FO
    else:
        F = FO
    
    carD["prevT"] = time.time()
    carD["prevF"] = FO
        
    for n, wheel in enumerate(car["specs"]["wheels"]):

        wheelObject = car["wheels"][n]
        health      = (wheelObject["health"] + carD["health"]) / 2
        
        rightwheel = ( wheel["front"] and force > 0 ) or ( not wheel["front"] and force < 0 )

        if rightwheel and ( not car.get("braking") or car.get("drifting") ):

            getCarPhysics(car).applyEngineForce(F * health, n)
        else:
            getCarPhysics(car).applyEngineForce(0, n)


    # Decrease RPMS
    if not car.get("accelerating") and not NetworkControlled(car):
        carD["rpm"] *= 0.98 * EngineResistance(car)



What do I see? ↩ Reply

Oh! ↩ Reply

I see this: ↩ Reply

( 1 / ( D * ( ( T - carD["prevT"] ) ** 2 ) ) )



This was another thing developed for the Multiplayer. It was co-developed with RowdyJoe. We were testing the multiplayer and found out that on the same car we had slightly different acceleration. ↩ Reply

The problem was with the granularity of the acceleration. See the physics updates were not happening in the same exact rate because we didn't have the same exact frame-rate. And therefor there was slight de-sync in the speed of the acceleration. Joe had an idea to use time-deltas to combat this problem. We would basically add a missing part of the acceleration to the engine, based on how much time was between this and the last frame. It worked. The cars felts much closer in speed. ↩ Reply

I tried removing this math operation for the test. And believe it or not, the NaN bug disappeared. I added a small check before it does this math, to see if the car is in fact trying to accelerate. And so far, there is no problems with this. ↩ Reply

But here is the problem I have. How? Why? What is it about this specific formula? Why this? ↩ Reply

When I ran the tests, the NaNed car, just before NaNing, had this formula output 1.63 ( roughly speaking ). This is not 0. This is nowhere near what should be NaN worthy. What the fuck? 1.63? And it fucked up? What? ↩ Reply

This NaN thing is a fucking rabbit-hole. What the fuck? WHAT THE FUCK?!!! ↩ Reply

Does anybody have a clue? A theory? Something? Please!!! I have to know!!! ↩ Reply

Happy Hacking!!! ↩ Reply

[icon unlike] 2
[icon right]
[icon terminal]
[icon markdown]

Find this post on Mastodon

[icon question]











[icon articles]Dani's Race and notgit.py ( Updater )

[thumbnail]

[avatar]  Blender Dumbass

👁 29 ❤ 4 🔄 1 💬 4



Not so long ago I decided to forgo the wisdom of using git for this game. Instead, most changes will be recorded via the notgit.py program I wrote for fun the other day.


#danisrace #moriasrace #game #gamedev #freesoftware #blender3d #git #python #programming #hacking


[icon videos]PeerTube | Making Addon Karts for SuperTuxKart

[thumbnail]

[avatar]  Blender Dumbass

👁 47 ❤ 12 🔄 3 💬 2



As you probably have guessed by my username, I know Blender. And I also know how to make SuperTuxKart addons. So I decided to make a Fedi-based series of tutorials explaining how I go from zero to a finished addon. This first part focuses on Karts ( since they are a bit simpler).


#supertuxkart #gamedev #freesoftware #tux #karting #racing #game #modding #addons #blender3d #b3d #tutorial #peertube #fediverse #opensource


[icon articles]Have I given up on Dani's Race?

[thumbnail]

[avatar]  Blender Dumbass

👁 28 ❤ 2 🔄 1 💬 1



Dani's Race development has been halted. The last changes to the project I've done maybe more than 6 months ago. The game still contains a lot of bugs and only 3 story missions. And it still runs like ass, averaging 20 fps on average laptops.



#danisrace #moriasrace #game #gamedev #freesoftware #blender3d #git


[icon videos]PeerTube | Bugs! How are they fixed? | Also First Person Mode | Dani's Race UPBGE Blender 3D on GNU / Linux

[thumbnail]

[avatar]  Blender Dumbass

👁 31 💬 16



In this video I fix some bugs in Dani's Race. And also implement a first person mode.


#DanisRace #MoriasRace #Game #UPBGE #blender3d #animation #GTAClone #programming #project #gamedev #freesoftware #gnu #linux #opensource


[icon videos]PeerTube | Optimization Nightmare when it comes to UPBGE Gamedev | Dani's Race | Blender 3D | Python

[thumbnail]

[avatar]  Blender Dumbass

👁 66



Working to make a game which is very hard to optimize a bit more respectable when it comes to performance. Which is easier said than done. This video is a journey of pain that is optimization in UPBGE ( the game engine chosen for Dani's Race ).

Featuring a new soundtracks for Dani's Race called "Light Driving" ( and another one with no proper title yet ) done using soundfont "Touhou" cc-by by Team Shanghai Alice. The tracks themselves are CC-BY-SA and for now a test version of them are available on my mastodon.

The video includes ( at 01:18:53 ) a section from the livestream of LogalDeveloper that happened on his Owncast on 02/05/2025.


#DanisRace #Optimization #MoriasRace #Game #UPBGE #blender3d #programming #project #gamedev #freesoftware #gnu #linux #opensource


[icon videos]PeerTube | I fixed the Curbs | Exercise in Pointlessness | Dani's Race GTA Clone | UPBGE Blender 3D on GNU / Linux

[thumbnail]

[avatar]  Blender Dumbass

👁 61



I'm punishing myself for being tired by doing a pointless work ( which ended up being only partially pointless ) on my GTA clone Dani's Race.



#DanisRace #MoriasRace #Game #UPBGE #blender3d #modeling #GTAClone #programming #project #gamedev #freesoftware #gnu #linux #opensource #philosophy


[icon articles]Path Finding in UPBGE for Dani's Race

[thumbnail]

[avatar]  Blender Dumbass

👁 112



Paps needs to walk from his room to a car, wait for you, the player to sit with him into said car, and then drive you across a town to a completely different location. Seamlessly.


#DanisRace #MoriasRace #Gamedev #Game #UPBGE #blender3d #animation #GTAClone #programming #project #Navigation #NPC #AI


[icon articles]Where do you draw the line? ( of Software User Freedom )

[thumbnail]

[avatar]  Blender Dumbass

👁 43 ❤ 3 🔄 1 💬 1



An article by Troler about Libre Software made me remember an email conversation I had with Richard Stallman the other day. I suggested to have a sort of freedom ladder analogue, to encourage non-libre software developers to, at least, move closer towards user-freedom. I thought ranking software based on how close they are at achieving user-freedom. How close they are to being Libre. If they have source code published, but no license. This is still better than having no source code published at all. Stallman firmly stood his ground against my idea, claiming that anything less than Libre, anything less than software that grants all 4 essential freedoms to the user, is automatically not good enough. But then in that article by @Troler I saw something interesting. Maybe merely granting the 4 essential freedoms, might be not good enough, either.


#freedom #userfreedom #software #freesoftware #programming #opensource


[icon articles]UPBGE - What is Depsgraph? And How to Optimize for Depsgraph?

[thumbnail]

[avatar]  Blender Dumbass

👁 214



You see things like "Physics", "Logic" and even "Rasterizer" and you immediately understand what you need to do to optimize you game. But "Depsgraph"?... It looks like a mysterious thing that nobody knows nothing about. Yet is it one the most problematic things there is in your game. And you are going mad just trying to figure it out.



#DanisRace #MoriasRace #Game #Gamedev #UPBGE #blender3d #animation #GTAClone #programming #python #project #performance #depsgraph


[icon videos]PeerTube | Dani's Race | First Year of Development

[thumbnail]

[avatar]  Blender Dumbass

👁 39 💬 1




The story of the First Year of development of Dani's Race.


#DanisRace #MoriasRace #Game #UPBGE #blender3d #animation #GTAClone #programming #project #gamedev #freesoftware #gnu #linux #opensource


[icon codeberg] Powered with BDServer [icon python] Plugins [icon theme] Themes [icon analytics] Analytics [icon email] Contact [icon mastodon] Mastodon
[icon unlock]