Kurzer Zwischenstand:
Sie ist schon lauffähig, aber noch voller wirrer Bugs. Kein Wunder bei dem
Gepointere.
Hier ein paar Fakten:
Insgesamt 151.641 Bytes Quellcode für Engine, Testcode und
Startrequester. Die Engine alleine hat 130.722 Bytes. Da aber noch ein
paar Sachen implementiert werden sollen, wird das ja noch weiter
wachsen.
Hier die Interfaces, damit man sich ein Bild machen kann, wie alles
aufgebaut ist:
Das Haupt-Interface:
Code: Alles auswählen
Interface RT
Free()
NewCam(Width.l, Height.l)
NewObject(Type.l)
NewLight(Type.l)
NewTexture()
EnumCams(*CBProc = #RT_Ignore)
EnumObjects(*CBProc = #RT_Ignore)
EnumLights(*CBProc = #RT_Ignore)
EnumTextures(*CBProc = #RT_Ignore)
Background(*Color.RTC3F = #RT_Ignore)
BackgroundRGB(r.f, g.f, b.f)
AmbientLight(*Color.RTC3F = #RT_Ignore)
AmbientLightRGB(r.f, g.f, b.f)
MovePoint(*Pos.RTP3D, *angle.RTA3D, *Move.RTP3D)
EndInterface
Das Kamera-Interface:
Code: Alles auswählen
Interface RTCam
Free() ;Löscht die Kamera und gibt den Speicher wieder frei
Gamma(Gamma.f = #RT_Ignore) ;Setzt einen neuen Gammawert und gibt den alten zurück
Size(Width.l = #RT_Ignore, Height.l = #RT_Ignore)
;Setzt die Größe der Kamera
Width()
Height()
Position(*Position.RTP3D = #RT_Ignore) ;Setzt die neue Position und gibt den Pointer zur neuen zurück
Angle(*angle.RTA3D = #RT_Ignore) ;Setzt die neuen Winkel und gibt den Pointer zu den neuen zurück
RecursionDepth(RecursionDepth.l = #RT_Ignore)
;Setzt die neue Rekursionstiefe und gibt die alte zurück
FOV.d(FOV.d = #RT_Ignore) ;Setzt neuen FOV und gibt den alten zurück
Direction(*Direction.RTP3D) ;Gibt die Richtung der Kamera zurück
Move(*Move.RTP3D) ;Verschiebt die Kamera relativ zur Blickrichtung und Drehung
CalculateRays() ;Berechnet die Strahlen zum Rendern (muss nach jeder Positions- und
;Winkel-Änderung vor dem Rendern neu aufgerufen werden)
Draw(x.l = 0, y.l = 0) ;Rendert die Kamera auf einen Output, der mit StartDrawing()
;geöffnet wurde
EndInterface
Das Objekt-Interface:
Code: Alles auswählen
Interface RTObject
Free() ;Löscht das Objekt und gibt den Speicher wieder frei
Render(mode.l = #RT_Ignore) ;#RT_Activate:Rendern, #RT_Deactivate:Nicht rendern
;#RT_Toggle:Togglen, #RT_Ignore:Rückgabe
Type() ;Gibt den Typ des Objektes zurück
Radius.d(Radius.d = #RT_Ignore) ;Gibt den Radius für das Objekt an und den alten zurück
length.d(length.d = #RT_Ignore) ;Gibt die Länge für das Objekt an und die alte zurück
Angle.d(Angle.d = #RT_Ignore) ;Gibt den Öffnungswinkel des Objektes an (0..360)
Position(*Position.RTP3D = #RT_Ignore) ;Gibt die Position für das Objekt an und den Pointer dazu zurück
PositionN(n.l, *Position.RTP3D = #RT_Ignore)
;Gibt die Position einer bestimmten Ecke an und den Pointer dazu zurück
PositionXYZ(x.d, y.d, z.d)
PositionNXYZ(n.l, x.d, y.d, z.d)
Direction(*Direction.RTP3D = #RT_Ignore);Gibt die Richtung des Objektes an und gibt den Pointer dazu zurück
DirectionXYZ(x.d, y.d, z.d)
Normal(*Normal.RTP3D = #RT_Ignore) ;Gibt die Normale für das Objekt an und gibt den Pointer dazu zurück
NormalXYZ(x.d, y.d, z.d)
Color(*Color.RTC3F = #RT_Ignore) ;Gibt die Farbe für das Objekt an und gibt den Pointer dazu zurück
ColorN(n.l, *Color.RTC3F = #RT_Ignore) ;Gibt die Farbe eines bestimmten Punktes des Objektes an
;und gibt den Pointer zurück
ColorRGB(r.f, g.f, b.f)
ColorNRGB(n.l, r.f, g.f, b.f)
DirectLight.f(Direct.f = #RT_Ignore) ;Gibt die Stärke des direkten Lichts an (0..1) und die alte zurück
DirectLightN.f(n.l, Direct.f = #RT_Ignore);s.o.
Transparency.f(Transparency.f = #RT_Ignore)
;Gibt die Transparenz (Alpha) des Objektes an (0..1) und die alte zurück
TransparencyN.f(n.l, Transparency.f = #RT_Ignore) ;s.o.
Reflection.f(Reflection.f = #RT_Ignore) ;Gibt die Reflektion des Objektes an (0..1) und die alte zurück
ReflectionN.f(n.l, Reflection.f = #RT_Ignore)
Refraction.f(Refraction.f = #RT_Ignore) ;Gibt die Brechzahl des Objektes an (0..oo?) und die alte zurück
Attributes(Direct.f = #RT_Ignore, Reflection.f = #RT_Ignore, Transparency.f = #RT_Ignore, Refraction.f = #RT_Ignore)
Texture(*Texture = #RT_Ignore) ;Gibt die Texture für das Objekt an und die alte zurück
TextureOffset(*Offset.RTOffset = #RT_Ignore)
;Gibt das Offset zum Anzeigen der Textur an und den Pointer dazu zurück
TextureGamma.f(Gamma.f = #RT_Ignore) ;Gibt das Gamma zum Anzeigen der Texture an und das alte zurück
TextureScale.f(Scale.f = #RT_Ignore) ;Gibt die Skalierung zum Anzeigen der Texture an und die alte zurück
EndInterface
Das Licht-Interface:
Code: Alles auswählen
Interface RTLight
Free() ;Löscht das Licht und gibt den Speicher wieder frei
Render(mode.l = #RT_Toggle) ;#RT_Activate:Rendern, #RT_Deactivate:Nicht rendern
;#RT_Toggle:Togglen, #RT_Ignore:Rückgabe
Type() ;Gibt den Typ des Lichtes zurück
Color(*Color.RTC3F = #RT_Ignore) ;Setzt die Farbe des Lichtes und gibt den Pointer zurück
ColorRGB(r.f = #RT_Ignore, g.f = #RT_Ignore, b.f = #RT_Ignore)
;Setzt die Farbe des Lichtes und gibt den Pointer zurück
Position(*Position.RTP3D = #RT_Ignore) ;Setzt die neue Position und gibt den Pointer dazu zurück
PositionXYZ(x.d, y.d, z.d)
FOV.d(FOV.d = #PB_Ignore) ;Setzt neuen FOV (0..360) und gibt den alten zurück
Direction(*Direction.RTP3D = #RT_Ignore);Setzt die Richtung des Lichtes und gibt den Pointer zurück
DirectionXYZ(x.d, y.d, z.d)
Move(*Move.RTP3D) ;Bewegt ein Licht in Richtung des Vektors
EndInterface
Das Textur-Interface:
Code: Alles auswählen
Interface RTTexture
Free() ;Löscht die Textur und gibt den Speicher wieder frei
Render(mode.l = #RT_Ignore) ;#RT_Activate:Rendern, #RT_Deactivate:Nicht rendern
;#RT_Toggle:Togglen, #RT_Ignore:Rückgabe
Load(File.s) ;Läd eine Textur aus einer Bilddatei in den Speicher
Catch(*Pointer, length.l = #RT_Ignore) ;Läd eine Textur aus einer Bilddatei im Speicher
Offset(*Offset.RTOffset = #RT_Ignore) ;Ändert das Offset zum Anzeigen der Textur auf einem
;Objekt und gibt den Pointer dazu zurück
Gamma.f(Gamma.f = #RT_Ignore) ;Ändert den Gamma-Wert und gibt den alten zurück
EndInterface
Auch wenn ich glaube, dass es nicht grad sehr viele interessiert. Mir
macht's einfach Spaß sowas zu basteln.
