Code archives/Graphics/Blobby Object Plasma

This code has been declared by its author to be Public Domain code.

Download source code

Blobby Object Plasma by ImaginaryHuman2007
This simple but attractive effect is produced by the interactions of numerous blobby object particle fields. For a 1024x768 display I have set it up to use 60 blobby objects. Each field consumes a 512x512 area.

The blobby energy field, which is a gradient with a squared falloff, is rendered into a 2 dimensional array in the form of an image. The image is then pasted onto the screen with additive blending. The values of all overlapping fields add up and the curvature of their gradients produces a gently curved contour. This is done on 255 energy levels in 3 separate color components, whereby every level of energy is rendered and not just those beyond a threshold. This produces a plasma effect and the changes in color further animate the contours.

This code was originally a 512-byte program and has been re-expanded into more human-readable form. As a result, calculation of colors is done based on object coordinates and rotation angles, and you will notice the red component eventually goes out of range, resulting in a mainly blue-green palette. There are many better ways to generate and maintain colors but I was short on space originally.

This should run well on even mid-low-range graphics cards since it is mainly just drawing images with additive blending. Enjoy.
'Set these to what you want
Const Objects:Int=60
Const ScrWidth:Int=1024
Const ScrHeight:Int=768
Const RotationSpeed:Float=0.2

'Open a screen and draw a blobby energy field with squared falloff
Graphics ScrWidth,ScrHeight,32
For Local Radius:Float=1 Until 512 Step 0.5
    Local Energy:Float=(Radius*Radius)/1024.0
    SetColor Energy,Energy,Energy
    DrawOval Radius/2.0,Radius/2.0,512-Radius,512-Radius     'Try DrawRect
Next

'Turn it into an image/texture
Local Image:TImage=CreateImage(512,512)
GrabImage(Image,0,0)

'Set up the positions and movement directions/speeds/angles of objects
Local XPos:Float[Objects],YPos:Float[Objects]
Local XMove:Float[Objects],YMove:Float[Objects]
Local Rotation:Float[Objects]
Local Obj:Int
For Obj=0 Until Objects
    XPos[Obj]=Rand(0,ScrWidth)
    Ypos[Obj]=Rand(0,ScrHeight)
    XMove[Obj]=(RndFloat()-0.5)*4
    YMove[Obj]=(RndFloat()-0.5)*4
    Rotation[Obj]=RndFloat()*360
Next

'Additive blending to combine blob fields
SetBlend LIGHTBLEND

'Do a demo
Repeat
    Cls

    For Obj=0 Until Objects
        'Move the objects
        XPos[Obj]:+XMove[Obj]
        YPos[Obj]:+YMove[Obj]
        
        'Bounce the objects off the screen edges
        If XPos[Obj]<0 or XPos[Obj]>ScrWidth Then XMove[Obj]=-XMove[Obj]
        If YPos[Obj]<0 or YPos[Obj]>ScrHeight then YMove[Obj]=-YMove[Obj]
        
        'Rotate the objects around their corners
        Rotation[Obj]:+RotationSpeed
        
        'Set object color based on coords/angles
        SetColor 1024-(Rotation[Obj] Mod 256),512-XPos[Obj],512-YPos[Obj]
        
        'Draw the blobby object
        SetRotation Rotation[Obj]
        DrawImage Image,XPos[Obj],YPos[Obj]
    Next

    Flip 1
Until KeyHit(KEY_ESCAPE)

Comments

Boiled Sweets2007
Many thanks for this!


mindstorms2007
Here is a blitz3d port of it...not a direct port, had to change some things, but it should look the same (I don't have blitzmax, but the screenshots look the same). It uses an additive blended mesh with each "blob" being a seperate surface for ease of vertex manipulation :)



ImaginaryHuman2007
Cool. I can't see the Blitz3D version but the code is an interesting adaptation.

You are welcome, too, Boiled Man. Enjoy.


Boiled Sweets2007
@mindstorm - awesome.

Screen saver in the pipeline :-)


Code Archives Forum