Main sections
X_SPOT_LT
X_SPOT_LT num#, col#, x#, y#, z#, dirx#, diry#, dirz#, cutoff#
Schaltet ein Spotlicht ein.
num# ist die Nummer des Lichts (0-7 erlaubt)
col# ist die Farbe. Siehe RGB()
x#, y#, z# sind die Koordinaten der Lichtposition
dirx#, diry#, dirz# spezifizieren einen Vektor, der die Richtung des Lichts angibt.
cutoff# ist der Winkel der Abblende des Lichts. Bei 180 wird ein paralleles Licht erzeugt.
Wird ein Winkel von 0 eingegeben, ist das Licht abgeschalten.
Spezialitäten
Mit X_SPOT_LT erzeugt man Lichtquellen für Spezialeffekte. Dabei ist num# entscheidend für den Effekt.
<B>Achtung</B>
Dabei muss der CULLMODE auf -1 oder 1 stehen!
num# = -1: Bump Mapping
Die 2. Textur wird als "Beulen" Textur verwendet. Dabei sind dunkle Pixel auf der Bump-Textur eine Senke und helle eine Erhebung.
Es werden nur die Koordinaten x#, y#, z# ausgewertet. Man müssen vorher mit LOADBUMPTEXTURE und LOADSPRITE 2 Texturen geladen worden sein und mit X_SETTEXTURE angegeben. Für ein Beispiel siehe LOADBUMPTEXTURE
num# = -2 : Toon Shading
Auch Cel-Shading order Cartoon Rendering genannt. Hier wird eine Lichtberechnung durchgeführt, die nicht linear, sondern in 2 Helligkeitsstufen geschieht. Dadurch wird ein Effekt erzielt, der einem Comic sehr ähnlich ist. Wenn man mit X_SETTEXTURE eine Texut angibt, so wird diese darübergelegt. Somit kann man z.B. Gesichter oder andere Details auf die Figur bringen. Es wird nur die Position des Lichts berücksichtigt: x#, y#, z#.
num# = -3: Schatten
Echtzeit Schatten mit Stencil Buffer. Funktioniert so:
- die ganze Szene zeichnen
- X_SPOT_LT -3, 0, x,y,z, 0,0,0, 360
dieses Licht ist die Lichtquelle und Schattenrichtung
- X_DRAWOBJ für alle schattenwerfende Objekte
- X_MAKE2D/SHOWSCREEN/X_MAKE3D
Das zeichnet die Schatten letztendlich.
- die Farbe wird zum färben des Schattenbereichs verwendet.
// --------------------------------- //
// Project: ToonShading
// Start: Wednesday, October 07, 2004
// IDE Version: 2.41007
 CreateTorus(1, 5, 10, 24, 24, 2, 2)
 // Bild-Daten / Image data
// LOADSPRITE      "image.bmp", 0
 DRAWRECT 0,0,64,64,RGB(0xff,0xff,0xff)
 DRAWRECT 0,28,64,9,RGB(0,0,0xff)
 PRINT "GLBASIC", 0,24
 GRABSPRITE 0, 0,0, 64,64
 // Hauptschleife / main loop
 WHILE TRUE
    DRAWRECT 0,0,640,480,RGB(0,0,200)
    phi=phi+GETTIMER()/30
    X_MAKE3D 1, 250, 45
    X_CAMERA 0, 10, 100, 0,0,0
    // Licht Nr. -2 is Cel-Shading Postition / Light no -1 is cel shading position
    X_SPOT_LT -2, 0, 0,0,100, 0,0,0,90
    X_SETTEXTURE 0, -1 // 0=Tex
    X_ROTATION 90, 1,0,0
    X_ROTATION phi, 0, 1, 0.1
    X_DRAWOBJ 1, 0
    SHOWSCREEN
 WEND
// ------------------------------------------------------------- //
// -=#  CREATETORUS  #=-
// Donut Objekt machen / Make a donut object
//
// By Samuel R. Buss
// http://math.ucsd.edu/~sbuss/MathCG
// ------------------------------------------------------------- //
FUNCTION CreateTorus: num, MinorRadius, MajorRadius, NumWraps, NumPerWrap, TextureWrapVert, TextureWrapHoriz
LOCAL i, di, j, wrapFrac, wrapFracTex, phi, thetaFrac, thetaFracTex, theta
LOCAL x, y, z, r
 X_AUTONORMALS 2 // smooth
 X_OBJSTART num
 FOR di=0 TO NumWraps-1
  FOR j=0 TO NumPerWrap
   FOR i=di+1 TO di STEP -1
    wrapFrac = MOD(j, NumPerWrap)/NumPerWrap
    wrapFracTex = j/NumPerWrap
    phi = 360*wrapFrac
    thetaFrac = (MOD(i, NumWraps + wrapFracTex)/NumWraps
    thetaFracTex = (i+wrapFracTex)/NumWraps
    theta = 360*thetaFrac
    r = MajorRadius + MinorRadius*COS(phi)
    x = SIN(theta)*r
    z = COS(theta)*r
    y = MinorRadius*SIN(phi)
    X_OBJADDVERTEX x,y,z,  thetaFracTex*TextureWrapVert, 1-wrapFracTex*TextureWrapHoriz, _
                    RGB(0xff,0xff,0xff)
   NEXT
  NEXT
  X_OBJNEWGROUP
 NEXT
 X_OBJEND
ENDFUNCTION // y

