Code archives/3D Graphics - Misc/Carve through the fog

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

Download source code

Carve through the fog by Vorderman2002
A small program to test a method of making a cloud of wispy fog. As the player entity moves through the fog it will carve a slowly decaying trail behind it.

NOTE : you'll need to have a 16x16 BMP called "Fog Particle.bmp" in the same folder you run the program from. The BMP needs to be a greyscale blob such as used for lens flares or smoke particles.

Move the mouse around to move the player (orange blob).

Move slower for best results.

Could look cool if applied to the trail from a rocket or smoke around an explosion or similar.
AppTitle "Wispy Fog"
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
Color 255,255,255
SeedRnd MilliSecs()
HidePointer


;-------------- CONSTANTS ---------------------------
Const gameFPS 		= 50				;frame limiting
Const MAX_FOG		= 50
Const SPREAD#		= 5
Const GLOBAL_MUSH#  = 1.0


;-------------- GLOBALS -----------------------------
Global CAM_yaw#		= 0.0
Global CAM_zoom#	= 20
Global NULLPIVOT 	= CreatePivot()


;-------------- TYPES -------------------------------
Type TYPE_FOG
	Field x#,y#,z#
	Field xs#,zs#
	Field sprite
	Field ax#,az#
	Field mushiness#
End Type

Dim FOG.TYPE_FOG(MAX_FOG)
For a=1 To MAX_FOG
	FOG.TYPE_FOG(a) = New TYPE_FOG
	FOG(a)\sprite = LoadSprite("fog particle.bmp",1) ;load a 16x16 pixel greyscale sprite
	ScaleSprite FOG(a)\sprite,2.5,2.5
	FOG(a)\x# = Rnd#(-SPREAD#,SPREAD#)
	FOG(a)\y# = 1
	FOG(a)\z# = Rnd#(-SPREAD#,SPREAD#)
	FOG(a)\xs# = 0.0
	FOG(a)\zs# = 0.0
	FOG(a)\ax# = FOG(a)\x#
	FOG(a)\az# = FOG(a)\z#
	PositionEntity FOG(a)\sprite,FOG(a)\x#,FOG(a)\y#,FOG(a)\z#
	FOG(a)\mushiness# = 0.0
Next


;-------------- ENTITIES ------------------------------
Global player = CreateSphere()
PositionEntity player,0,1.0,20
EntityColor player,255,100,0

Global camera1=CreateCamera()
CameraViewport camera1,0,0,800,600
PositionEntity camera1,0,20,-20
CameraClsColor camera1,50,50,100
RotateEntity camera1,45,0,0

AmbientLight 150,150,150
light1 = CreateLight(2)
PositionEntity light1,500,500,-500


;-------------- PRE-GAME SETUP ---------------------------
framePeriod = 1000 / gameFPS
frameTime = MilliSecs () - framePeriod
MoveMouse 400,300


;-------------- M A I N  L O O P ---------------------------
While Not KeyHit(1)

	;frame limiting
    Repeat
        frameElapsed = MilliSecs () - frameTime
    Until frameElapsed
    frameTicks = frameElapsed / framePeriod
    frameTween# = Float (frameElapsed Mod framePeriod) / Float (framePeriod)

	;game logic loop
    For frameLimit = 1 To frameTicks

		;frame limiting    
        If frameLimit = frameTicks Then CaptureWorld
        frameTime = frameTime + framePeriod

		;mouse to move blob
		MoveEntity player,(MouseXSpeed() / 10.0),0,-(MouseYSpeed() / 10.0)
		MoveMouse 400,300
		
		;update the fog
		FUNC_process_fog()

		;update game world logic
        UpdateWorld

    Next


	;render
	RenderWorld frameTween


	;calculate FPS
	If (frameTicks>0) 
		FPS = gameFPS/frameTicks
	Else
		FPS = gameFPS
	EndIf


	;on-screen FPS counter
	Color 255,255,255
	Text 700,10,"FPS:"+FPS
	Text 350,10,"WISPY FOG TEST"
	
	Text 290,550,"USE MOUSE TO MOVE ORANGE BLOB"
	Color 255,0,0
	Text 295,562,"MOVE SLOWLY FOR BEST RESULTS"
	
	;flip buffers	
	Flip

Wend

End






Function FUNC_process_fog()

	For f.TYPE_FOG = Each TYPE_FOG

		dist# = EntityDistance(f\sprite , player)
		PositionEntity NULLPIVOT,f\ax#,1.0,f\az#
		dist2# = EntityDistance(f\sprite , NULLPIVOT)
				
		EntityAlpha f\sprite,((1.0/2.0)*(1.0-(dist2#/2.0)))

		If ( dist# < 2.0 ) And (dist2# < 2.0)
				
			PointEntity f\sprite , player
			TurnEntity f\sprite,0,180,0
			MoveEntity f\sprite ,0,0,(dist# / 5.0);0.1
			f\x# = EntityX#(f\sprite)
			f\z# = EntityZ#(f\sprite)
		
			f\mushiness# = GLOBAL_MUSH#
		Else

			If (f\mushiness# =< 0.0)
				PointEntity f\sprite,NULLPIVOT
				dist# = EntityDistance(f\sprite , NULLPIVOT)
				MoveEntity f\sprite,0,0,(dist#/30.0)
			Else
				f\mushiness# = f\mushiness - 0.1
			EndIf

			f\x# = EntityX#(f\sprite)
			f\z# = EntityZ#(f\sprite)
	
		EndIf	
	Next
	
End Function

Comments

_PJ_2009
Edit: oops nevermind.
---------------------
Nice effects though :)


Vorderman2009
Hahahaha, I think you get the award for "Oldest thread revivial for no reason" :)


Code Archives Forum