sparrow3D - multi platform game engine


Ziz

Advanced Member
Joined
Jan 15, 2006
Messages
3,584
Guten Abend.

Nach langer langer Entwicklungszeit ist sparrow3d (erstmal) fertig!

Sparrow3d ist einen Spiele engine ähnlich wie Penjin, Fenix, glBasic oder das neue Pengyne engine.

Wieso noch eine Engine?

Zuerst wollte ich einfach einen 3D Software Renderer für den GP2X und andere open Handhelds machen. Den Rest habe ich einfach aus purer Faulheit gemacht, weil ich eine Basis für alle unterstützden Systeme braucht. Es begann mit Snowman über Puzzletube und endet nun hier bei diesem Release einer eigenständigen Engine, die komplett neu geschrieben, optimiert und erweitert wurde.

Der Fairness halber beginne ich mit den Nachteilen von sparrow3D anderen Spiele Engines (wie z.B. Penjin) gegenüber:
  • Kein OOP. pures C. (Du kannst es natürlich innerhalb von OOP verwenden, aber es ist nicht darauf ausgelegt.)
  • kein GL ES. Alles wird in Software gerendert aufgrund der Kompatibilität zu GP2X und Dingoo. Der Renderer ist natürlich langsamer als GL ES, aber läuft halt überall.
  • Nur 16 bit Grafik wird unterstützt (für bessere Optimierung)

Aber meine Engine hat natürlich massig Vorteile: ^^
  • pures C (faster)
  • Viele unterstützte Systeme (gp2x, open2x, wiz, dingoo, caanoo, pandora, linux, windows)
  • 3D Renderer mit Texturen, der auf jeder unterstützten Plattform läuft
  • Hardware Abstraktion, so dass man z.B. nicht wissen müssen, ob eine Zielplatform einen Analogstick oder ein D-Pad hat (oder Nubs...)
  • SDL Surface Blit Funktionen für 2D und 3D.
  • Rotozoom Funktionen für Surfaces (schneller als SDL-gfx)
  • einfache Primitive wie Rechtecke, Ellipsen oder Linien
  • Laden von Meshs (aus obj files)
  • eine einfache Sprite engine
  • Darstellung von Schrift (mithilfe von SDL-ttf)
  • Es basiert komplett auf SDL und hat somit keinen anderen Abhängigkeiten und läuft fast überall
  • Man kann es auch in schon fertigen Anwendungen benutzen (ich habe zum Beispiel die Idee einen 3D Visualisierung in Gmu von wejp einzubasteln. ^^)

Und ihr könnt die Engine sogar testen!

Cannoo
Dingoo
GP2X
Pandora
Pandora Repo
Open2X
WIZ

Source Code at Github

Außerdem habe ich eine "etwas" detailierte Beschreibung geschrieben, die primär für Leute ist, die mit dem Gedanken zu spielen, sparrow3D zu nutzen.

Code:
<i>
</i>+-----------+
|+---------+|
||sparrow3D||
|+---------+|
+-----------+

Dieses Dokument dient der Veranschaulichung der Zusammenhänge und
Logik der Funktionen von sparrow3D. Erstmal in Deutsch. Gerade mir wird
es hoffentlich helfen die Bibliothek auch für außenstehende logisch
erscheinen zu lassen.

+----------+
|Einleitung|
+----------+

Sparrow3D ist ein Software Renderer und eine (Spiele)Engine. Sie bietet
dir Möglichkeiten für das Eventhandling, 2D und 3D Funktionen, Anzeige
von Meshs, eine simple Spritesteuerung und Darstellung von Schrift.

Dabei basiert es komplett auf SDL - welches neben SDL-Image und SDL-Font
die einzige Abhängigkeit von sparrow3D ist. So läuft sparrow3D (bisher)
auf folgenden Systemen:
- GP2X
- WIZ
- Dingoo
- Cannoo
- Pandora
- PC (Linux und Windows)

Es verbessert SDL dahingehend, dass es nochmal abstrahiert. Das
bedeutet, dass man sich nicht mehr um unterschiedliche Buttonnamen,
Buttonanzahl oder verschiedene Achsen (D-Pad oder Analogstick z.B.)
kümmern muss. Man programmiert einfach für ein generisches Gerät.

Die Vorteile/Features von sparrow3D sind im Groben:
- schnell, da komplett in C geschrieben
- Abstraktion der Hardware
- nochmal abstrahierte Surface-Funktionen für Blitting
- schnellerer Rotozoom als z.B. SDL-gfx
- Primitive wie Rechtecke oder Ellipsen
- 3D Software Renderer, der auch auf GP2X und Dingoo läuft
- Sprite Engine
- Laden von Meshs
- Darstellung von Schrift aus ttf-Dateien (damit beliebig skalierbar)

Es folgt eine kurze Vorstellung der einzelnen Teile von sparrow3D. Man
kann, muss jedoch nicht alle nutzen. Es ist ohne weiteres möglich nur
den 3D Software Renderer in ein bestehendes SDL Programm einzubinden.

+-----------+
|sparrowCore|
+-----------+

Obwohl der Name es vermuten lässt, ist dieser Part der Bibliothek nicht
zwingend essentiell. Wer rein am Sprite oder 3D Handling interessiert
ist, kann sie getrost ignorieren.

Der Cort Part bietet einem ein Fenster, Eventhandling - einhergehend mit
einer Abstraktion für die verschiedenen Targets - und das Laden von
optimalen Surfaces für das System (schneller).

Außerdem gibt es eine Feedbackfunktion für die Größenänderung des
Hauptfensters. Diese ist dafür gedacht, falls man in dem Fall z.B.
größere oder kleinen Surfaces laden oder erstellen möchte.

+-----------+
|sparrowMath|
+-----------+

Viele Teile, mindestens jedoch _alle_ 3D Funktionalitäten, basieren auf
Festkommazahlen. Für Leute, die noch nie damit gearbeitet haben: Vom
Prinzip her sind Festkommazahlen wie normale Integer. Nur wird im Falle
von Festkommazahlen die Zahl noch durch 65536 geteilt. Das bedeutet
65536 ist als Festkommazahl 65536/65536 = 1.0, 128 ist 128/65536 =
0.001953125 usw. .

Festkommazahlen sind (wesentlich) ungenauer als die klassichen Fließ-
kommazahlen, aber auf ARM-Systemen ohne FPU um _Längen_ schneller.

Für Addition und Subtraktion ändert sich hierbei nichts. Nur die
Multiplikation und Division braucht extra Funktionen, die sparrowMath
definiert. Auch Kosinus und Sinus sind langsam. Deshalb gibt einem
sparrow3D die Möglichkeit vorberechnete und schon in das eigene Zahlen-
system umgewandelte Funktionen zu nutzen.

Außerdem bietet einem sparrowMath noch andere Vereinfachungen und z.B.
eine Umrechnung vom HSV Raum in eine 16 Bit Farbe.

+-----------------+
|sparrowPrimitives|
+-----------------+

Für viele wird sparrowPrimitives der wichtigste Bestandteil von
sparrow3D sein. Er kümmert sich um das Zeichnen aller möglicher
Primitive in 2D. Ein wichtiger Aspekt von sparrow3D ist, dass es auf
SDL aufbaut, es verbessert und erweitert. Zuerst muss man ein
Zeichenziel wählen. Das kann der Bildschirm sein, aber auch jedes andere
billibige Surface. Jedoch ist GANZ wichtig, ich wiederhole mich: SUPER
WICHTIG zu beachten, dass ALLE Ziele 16 Bit Surfaces sein müssen!
Solltest du z.B. in ein 32 Bit Surface rendern wollen, musst du ein 16
Bit Surface erstellen, dort rein rendern und dieses dann auf das 32 Bit
Surface blitten (mit SDL Mitteln). Das war aus Vereinfachungs-, aber
vor allem auch Optimierungsgründen notwendig.
Außerdem gibt es bei sparrow3D kein "echtes" Alphablending. Per
Definition ist die Farbe Rosa (definiert als SP_ALPHA_COLOR) komplett
durchsichtig, der Rest komplett sichtbar. Bei Bedarf kann der Alphatest
jedoch auch ausgeschaltet werden.

Es gibt kein Standardziel. Am Anfang MUSS eines gewählt werden! Danach
arbeiten alle Zeichenoperationen in dieses Surface. Weiterhin wird für
das Surface ein zBuffer erstellt, der sich die Tiefenpositionen von
Primitiven merkt. Sowohl das Überprüfen (beim Zeichnen) als auch das
Setzen des zBuffers sind einstellbar. Prinzipiell ist das Schreiben mit
ohne Beides am schnellsten. Aber spätestens bei dreidimensionalen Szenen
ist der zBuffer sehr wichtig für eine korrekte Darstellung der
Primitivreihenfolge.

Es gibt grob folgende Bereiche, die sparrowPrimitives abdeckt:
- Zeichnen von Dreiecken und Vierecken mit oder ohne Textur
- Rotozoom Zeichnen von Surfaces oder Surfaceteilen (Tiling)
- Blitten von Surfaces (ohne Rotation und Zoom, dafür schneller) oder
  Surfaceteilen (Tiling)
- Zeichnen von beliebig farbigen Linien, Rechtecken, Ellipsen und
  Rechteck- oder Ellipsenrändern

Alle diese Funktionen können je nach Belieben in den zBuffer schreiben.
Dieser sollte im Beginn des Zeichenvorganges deshalb genau wie der
gesamte Bildschirm komplett gelöscht werden, was sparrowPrimitives
auch vermag.

Eine Besonderheit ist das Culling. Die Dreiecks- und Vierecksfunktionen
(NICHT die Rechtecksfunktionen!) besitzen Cullingfähigkeiten.
D.h. wenn man die einzelnen Punkte der Primitves in der falschen Reihen-
folge angibt, werden sie nicht gezeichnet. Bei dreidimensionalen,
geschlossenen Körpern ist das sehr wichtig zur Optimierung, da man die
Rückseite einer Fläche nicht sehen kann. Die notwendig Reihenfolge ist
immer GEGEN den Urzeigersinn (im Zweifel einfach ausprobieren).

+-------------+
|sparrowRender|
+-------------+

Dieser wichtige Part von sparrow3D gibt der Engine ihrem Namen: Er sorgt
für die Dreidimensionalität. Aufbauend auf sparrowPrimitive gibt es
verschiedene Funktionalitäten. Genauso wie OpenGL benutzt sparrow3D
für die Orientierung Matrizen. Ein kurzes OpenGL Tutorial sollte einem
genug Einblick geben, um auch mit sparrow3D arbeiten zu können. Es ist
trotzdem nicht kompatibel zu OpenGL! Aus Geschwindigkeitsgründen wurde
dieser Gedanke schnell fallen gelassen.

Wie bei OpenGL gibt es zwei Matrizen für die Orientierung im Raum
(Modelviewmatrix) und die Projektion (Projektionsmatrix). Am einfachsten
stellt man sich die Modelviewmatrix wie einen unsichtbaren Robotergreif-
arm vor, den man beliebig bewegen kann. Dieses Beispiel ist wichtig zu
verinnerlichen, weil alle Positions-, Rotations- und Skalierungsangaben
relativ zueinander sind. D.h. wenn du den "Roboterarm" um 2 auf der
z-Achse bewegst und den Befehl noch einmal aufrufst, ist er nun bei z=4.
Das gilt auch für die Rotation. Hier gilt: Learning by Doing!

Man kann die ModelViewMatrix resetten, Translatieren, Rotieren und
Skalieren. Außerdem kann man die Matrix auch von Hand bearbeiten, wenn
es einem beliebt oder durch auslesen (und sichern!) der Matrix glPush
bzw. glPop nachbilden (siehe auch die Beispielanwendung testsparrow.c).

Mithilfe der Projektionsmatrix wandelt sparrow3D die Raumkoordinaten in
Bildschirmkoordinaten um. Das geschieht unter Beachtung des z-Wertes.
Ein Objekt, was weiter weg ist, erscheint auch kleiner.

Desweiteren bietet einem sparrow3D auch sehr einfache, farbige
Lichtquellen, die man beliebig im Raum setzen kann.

Es gibt grob drei Arten von 3D Grafikfunktionen:
- "echte" 3D Funktionen, wo man ein Dreieck oder Viereck (mit oder ohne
  Textur beliebig im Raum positionieren kann. Auf diese Objekte wirkt
  auch Licht. Außerdem Funktionen, um komplette Flächengebilde (Meshs
  oder Modell genannt) zu zeichnen. Diese Funktionen sind schneller als
  jede Fläche einzeln zu zeichnen. Das Laden erfolgt mit sparrowMesh.
  Nur bei diesen Funktionen wird Licht miteinberechnet!
- "Billboard" 3D Funktionen, die immer zum Bildschirm zeigen, aber in
  der xy-Ebene durchaus noch rotiert oder skaliert sein können. Hier
  gibt es z.B. wieder die Rechtecke, Ellipsen, Rechteck- oder
  Ellipsenrahmen und Surfaces aus der sparrowPrimitives.
- "Blit" 3D Funktionen, die zwar die Position richtig aus der ModelView-
  Matrix herleiten und projezieren, jedoch weder Größe noch Rotation
  der 3D Welt anpassen. Diese Funktionen sind dafür sehr schnell und 
  z.B. für Partikeleffekte geeignet, wo die Größe der Partikel nicht
  so wichtig ist.

+-----------+
|sparrowMesh|
+-----------+

sparrowMesh füllt die Meshstrukturen, die sparrowRender zeichnen kann
mit Leben. Es kann Meshes aus obj-files laden und löschen.

+-----------+
|sparrowFont|
+-----------+

Keine Anwendung ohne Schrift. Naja, fast keine. Aber die meisten werden
auf Schriftunterstützung nicht verzichten wollen. Diesen Part übernimmt
sparrowFont. Dieser Teil kann mithilfe von SDL_TTF ttf-Dateien öffnen
und einzelne Buchstaben (z.B. das gesamte deutsche Alphabet) speichern,
sodass diese dann sehr schnell gezeichnet werden können. Durch Caching
und eine schnelle Baumstruktur ist keine Geschwindigkeitseinbuße zu
bemerken.
Im Moment kann man (mit sparrow3D-Standard-Mitteln) Text weder im
3D-Raum unterbringen noch Rotieren oder Zoomen.

+-------------+
|sparrowSprite|
+-------------+

Für die meisten Spiele sind Sprites mehr oder minder essentiell. Bei
einem 2D Jump and Run wird man ohne gar nicht auskommen, aber auch bei
einem 3D-Spiel sind diese sehr gut für "Head-up-Display" (HUD) Anzeigen
geeignet.

Ein Sprite von sparrow3D besteht im Prinzip nur aus beliebig vielen
Surfaces oder nur Teilen davon (Tiling). Jede dieser Untereinheiten
hat eine fixe Zeit, die sie angezeigt wird ehe die nachfolgende
gezeichnet wird. Wenn ein Sprite komplett angezeigt wurde, beginnt es
von vorne. So sind sehr einfache Animationen möglich.

Sprites können zudem noch rotiert oder skaliert werden. Das ist zwar
langsamer, aber geschickt und einzeln eingesetzt kann es dem Spiel viel
Dynamik geben. Ein schönes Beispiel wäre hier z.B. das allseits bekannte
und beliebte Spiel Worms, wo meist nur die Projektile rotieren.

+---------+
|Abschluss|
+---------+

sparrow3D ist in ständiger Weiterentwicklung. Wenn du Fragen,
Anregungen oder Featurewünsche hast, fühl dich frei sie näherzubringen!

Außerdem gibt es morgen noch ein Video, aber heute müssen diese Screenshots erstmal reichen:
sparrow1.png


sparrow2.png



sparrow3.png



sparrow4.png



sparrow5.png



sparrow6.png


Vielleicht werde ich die engine auch für ein Spiel in der Rebirth Competition nutzen. Aber im Moment weiß ich nicht, ob ich genug Zeit für ein Spiel habe...

Mal sehen.

greetings, ZizBlitHead-up-Display
 
LGPL und MPL. Stimmt, hätte ich erwähnen können. :-D

Hier ist der Code:
https://github.com/theZiz/sparrow3d
 
Wirklich interessant und vielen Dank für die Bereitstellung des Quellcode. Ich könnte versuchen, einen Pascal - Header umsetzten, da du nur "C" verwendest. Enthält die Shared Library libsparrow3d.so alle beschriebene Abschnitte?

Meinst Du, deine Engine könnte ein Point & Click - Spiel auf dem Dingoo / GP2X á la Bathomets Fluch 1 mit 30 FPS anzeigen, wenn die Figuren und Gegenstände als 3D - Objekte realisiert werden?

Gruß
Thomas
 
Und auch von mir ein dickes Danke für die Bereitstellung des Quellcodes :)

Bin derzeit dabei, tiefer in C einzusteigen, da kommt mir so eine Library für's Selbststudium gerade recht.
 
Also einen Pascal Header zu schreiben, dürfte trivial sein. Gerade bei C Libs ist das ja urst billig.

@Point and Click: Maus habe ich bisher ausgeklammert. Da wollte ich mir noch eine schöne Methode einfallen lassen, wie die auf System realisiert wird, die keine Maus/Touchscreen haben (also GP2X). Aber du kannst natürlich SDL dafür nutzen.
Wenn du sagst, Figuren und Objekte 3D, meinst du damit den Hintergrund 2D? Dann geht das auf jeden Fall. Aber übertreib es nicht mit dem Polygoncount. ^^

-- Di Feb 28, 2012 21:01 --

Wie versprochen hier noch ein Video
[youtube]NRmPAYp9n8U[/youtube]

Im Prinzip nur die Demo von oben abgefilmt am PC. ^^

-- Do Mär 01, 2012 11:44 --

Ich hab ganz vergessen den github link zu erwähnen. Hab ihn mal in den Anfangspost gehauen.
 
Back
Top