Cartoon Shading

Blitz3D Forums/Blitz3D Programming/Cartoon Shading

Here's a nice and simple one by Norc:
; norcs 3D Outline demo

Graphics3D 640,480,16,2
SetBuffer BackBuffer()
camera=CreateCamera()
MoveEntity camera,0,0,-3
CameraRange camera,1,2000
CameraClsColor camera,20,50,100
light=CreateLight()
RotateEntity light,30,30,30

n=200
Dim cubei(n),cubeo(n),sx#(n),sy#(n),sz#(n),x#(n),y#(n),z#(n)
min100=-30
max100=30
For i=0 To n
 cubei(i)=CreateSphere(7)
 EntityFX cubei(i),8 Or 4 					; no fog + flat shaded
 cubeo(i)=CreateSphere(7,cubei(i))
 EntityFX cubeo(i),1								; full bright
 FlipMesh cubeo(i)									; inverted
 EntityColor cubeo(i),0,0,0					; black
 x(i)=Rnd(min100,max100) : y(i)=Rnd(min100,max100) : z(i)=Rnd(max100)
 sx(i)=Rnd(.1,.2) : sy(i)=Rnd(.1,.2) : sz(i)=Rnd(.1,.2)
 EntityColor cubei(i),Rand(20,255),Rand(20,255),Rand(20,255)
Next

correct=1

While KeyDown(1)=0
 If KeyHit(57)
  correct=correct Xor 1
 EndIf
 For i=0 To n
  x(i)=x(i)+sx(i)
  If x(i)>max100 Then sx(i)=-Rnd(.1,.2)
  If x(i)<min100 Then sx(i)=Rnd(.1,.2)  
  y(i)=y(i)+sy(i)
  If y(i)>max100 Then sy(i)=-Rnd(.1,.2)
  If y(i)<min100 Then sy(i)=Rnd(.1,.2)
  z(i)=z(i)+sz(i)
  If z(i)>max100 Then sz(i)=-Rnd(.1,.2)
  If z(i)<1 Then sz(i)=Rnd(.1,.2)
  PositionEntity cubei(i),x(i),y(i),z(i),1
  TurnEntity cubei(i),1,1,1
  ; d#=EntityDistance(camera,cubei(i)) ; for a mobile camera
  d#=Abs(EntityZ(camera)-EntityZ(cubei(i))) ; pretty accureate, but only for a north-pointing camera
  s#=1.01+(d/80.0)
  If s>2 Then s=2
  If correct=1
   ScaleEntity cubeo(i),s,s,s
  Else
   ScaleEntity cubeo(i),1.2,1.2,1.2
  EndIf
 Next
 RenderWorld()
 Text 0,0,"Hit Space to toggle Scaling Correcture"
 If correct
  Text 0,16,"Correcture is on"
 Else
  Text 0,16,"Correcture is off"
 EndIf
 Flip
Wend

End