All pastes #252499 Raw Edit

Unnamed

public text v1 · immutable
#252499 ·published 2006-11-19 17:11 UTC
rendered paste body
SYNC ON:SYNC RATE 0:AUTOCAM OFF:HIDE MOUSE

`Set the random seed to make sure everything is truly random
RANDOMIZE TIMER()

DIM Clouds(300,3)
`Make 300 randomly sized, randomly positioned spheres
FOR x = 1 TO 300
   MAKE OBJECT SPHERE x,RND(100)
   POSITION OBJECT x, -400 + RND(800), -400 + RND(800), -400 + RND(800)
   GHOST OBJECT ON x
   `Here's where we store the cloud's movement angle. Basically the array Clouds() has 3 slots for each cloud,
   `these 3 slots are used to store the cloud's xyz angle. This xyz angle is a value inbetween 0 and 360. This
   `angle is the angle we'll move the clouds at.
   Clouds(x,1) = RND(360)
   Clouds(x,2) = RND(360)
   Clouds(x,3) = RND(360)
NEXT x

`vector method variable
`maxDist# = 500

`non-vector method variables
xRange# = 500
yRange# = 500
zRange# = 500

`setup math (only for vector method)
`math_setup()

`Main loop
DO

   MOVE CAMERA (UPKEY() - DOWNKEY())*0.5
   ROTATE CAMERA WRAPVALUE(CAMERA ANGLE X()+(MOUSEMOVEY()*0.1)), WRAPVALUE(CAMERA ANGLE Y()+(MOUSEMOVEX()*0.1)),0

   `Use a loop going from 1 to 300, checking each cloud object.
   FOR x = 1 TO 300
      `Store the clouds starting angle
      xA# = OBJECT ANGLE X(x)
      yA# = OBJECT ANGLE Y(x)
      zA# = OBJECT ANGLE Z(x)
      `Rotate the cloud to it's movement angle previously calculated
      ROTATE OBJECT x,Clouds(x,1),Clouds(x,2),Clouds(x,3)
      `Move the cloud a bit
      MOVE OBJECT x,0.5

      `Non vector method
      x# = OBJECT POSITION X(x)
      y# = OBJECT POSITION Y(x)
      z# = OBJECT POSITION Z(x)

      IF ABS(x#) > xRange#
         MOVE OBJECT x,-xRange#*2
      ENDIF

      IF ABS(y#) > yRange#
         MOVE OBJECT x,-yRange#*2
      ENDIF

      IF ABS(z#) > zRange#
         MOVE OBJECT x,-zRange#*2
      ENDIF

      `Vector method
      REMSTART
      dist# = math_getDist3D(x#,0,y#,0,z#,0)
      IF dist# > maxDist#
         MOVE OBJECT x,-maxDist#
      ENDIF
      REMEND

      `Rotate the cloud back to it's original angle
      ROTATE OBJECT x,xA#,yA#,zA#

   `Repeat
   NEXT x

   `Display some info text
   TEXT 0,0,"FPS: "+STR$(SCREEN FPS())
   TEXT 0,15,"Move with the arrow keys."
   TEXT 0,30,"Turn with the mouse"

   `Refresh the screen
   SYNC

`Repeat
LOOP

`Call this before using the math function.
FUNCTION math_setup()
   `setup required vectors for distance calculations
   null = MAKE VECTOR3(1)
   null = MAKE VECTOR2(2)
   #CONSTANT vecDist3D = 1
   #CONSTANT vecDist2D = 2
ENDFUNCTION

`Math functin for getting 3D distance between 2 points.
FUNCTION math_getDist3D(X1#,Y1#,Z1#,X2#,Y2#,Z2#)
   SET VECTOR3 vecDist3D,X1#-X2#,Y1#-Y2#,Z1#-Z2#
   dist# = LENGTH VECTOR3(vecDist3D)
ENDFUNCTION dist#