BlitzMax Standard Library

Kommentare anzeigen Worklog abonnieren
Gehe zu Seite Zurück  1, 2

Worklogs BlitzMax Standard Library

Es werde Farbe

Dienstag, 8. Juni 2010 von ProfJake
Ein neues Mitglied der Familie ist die Farbklasse TColor. Sie benutzt intern 4 Floats und kann daher auch Alphawerte speichern. Ich habe mich diesmal degegen entscheiden eine TColorF und TColorB Klasse zu schreiben, weil ich denke, dass diese Variante hier am besten passt. Max2D benutzt zwar Werte von 0 bis 255, aber Ogre3D - an dem ich mich oft orientiere - nimmt immer 4 Floats. Dass hat ein paar nette Vorteile, nämlich dass man das schön mit toArray() in ein Array mit 4 Floats verpacken kann etc.

Außerdem wären viele Types wieder ein verdammter Aufwand, denn ..

Optimierung macht Spaß

Unter der Haube habe ich diesmal von Anfang an viel mit C gearbeitet um die Performance zu steigern, damit niemand auf die Idee kommt solche Späße wie colorRed, colorGreen & colorBlue anstatt einer TColor-Instanz zu benutzen. Die Ergebnisse sind dabei teils echt erstaunlich, so sind die Setter-Methoden, die den Farbwert clampen jetzt mehr als 10x so schnell, wie die BlitzMax Implementation.

Außerdem bildet sich die C Version so langsam heraus. Ich denke ich werde wirklich die ganze Library in C nachprogrammieren, damit man schon schnelle Bibliotheken schreiben kann. Danke an dieser Stelle auch an Farbfinsternis für seinen Denkanstoß.

Wichtig: Das C Interface ist eigentlich nicht zum Herumspielen gedacht, wenn man keine/wenig Ahnung von den internen Vorgängen hat und Garantie, dass es klappt gibt's natürlich auch keine. Das ganze ist nur dafür gedacht, die gesamte BSML zu beschleunigen (z.B Overhead zu vermeiden wenn man eine bs-Funktion aufruft anstatt einer Methode etc). Deshalb ist das ganze Zeug auch (noch?) nicht dokumentiert.

Mathe Update

Um das Ding zum Laufen zu bringen braucht ihr das neuste std.math Modul, da intern die wunderbar praktische Funktion bsMathClamp01F genutzt wird, die einen Float Wert zwischen 0 und 1 clamped - und das natürlich schneller als bsMathClampF(x, 0.0, 1.0) oder TMathF.clamp(x, 0.0, 1.0) - aber wie gesagt: keine Garantie.

Oh und das neuste std.core Modul braucht ihr auch, sorry. Vielleicht sollte ich wirklich bald mal auf SVN umsteigen..


Okay, dann lasst mal eure Meinung hören. Immerhin ist der Type ja schon 'n bisschen Un-BlitzMax Very Happy

Fabian

Download

Intervalle

Montag, 7. Juni 2010 von ProfJake
Nur mal ganz kurz:

Im std.math Modul gibt's jetzt mehrere Intervall-Types. TRange für Doubles, TRangeF und TRangeI für Floats und Integer. Die Handhabung ist eigentlich sehr intuitiv, daher hier nur mal ein kleines Beispiel (aus der Dokumentation kopiert):
BlitzMax: [AUSKLAPPEN]
Import std.math

Local range:TRange = TRange.Create(1.0, 3.0)
Local value:Int = TMath.random(1, 5)

If range.contains(value) Then
Print("Value " + value + " is in range.")
Else
Print("Value " + value + " is not in range.")
EndIf


Die Idee dazu ist mir gekommen, als ich im MiniB3D Quelltext auf das near/far Rumgewurschtel gestoßen bin.

EDIT

Die Methoden sind jetz getMaximum/setMaximum (gleiches für Minimum) anstatt getStartValue/setStartValue (und nochmal für endValue). Außerdem gibt's jetzt ein Type für Long Wert - TRangeL

Fabian

BlitzMax Wrapper

Mittwoch, 2. Juni 2010 von ProfJake
Hi Leute,

okay ein Wrapper für BlitzMax klingt zugegebenermaßen komisch, aber dazu gleich mehr.

Namensänderungen

Ich habe die Module ein bisschen verändern, jetzt heißen Types die Doubles benutzen z.B TVector3 statt TVector3d oder TMath statt TMathD. Ich hoffe so mehr Konsistenz zu bereits existierenden Lösungen schaffen zu können. Außerdem kann man die Typendungen jetzt nicht mit 2D/3D Suffixen verwechseln.

Dokumentation

Das gute alte Vektormodul hat jetzt endlich ein paar kurze Code Schnipsel im Gepäck, die seine Handhabung erklären. Außerdem gibt's jetzt die kleine, aber praktische Methode negate, die alle Werte negiert und den Vektor selbst zurückgibt. Ein Beispiel:

BlitzMax: [AUSKLAPPEN]
If player.isDrunk() Then
player.move(vector1.negate())
Else
player.move(vector1)
EndIf


BlitzMax Wrapper

Wie ihr vielleicht wisst baut BlitzMax auf einer kleinen Sammlung von C Dateien und Headern auf, die in brl.blitz liegen. Und genau darauf baut das Modul std.blitzmax auf, welches die Funktionen, Structs und Enums darin wrapt und ein bisschen aufräumt. Die Änderungen sind zwar minimal, kosten aber nichts und garantieren ein einheitliches Interface für C.

  • Präfix bb ersetzt durch bm (z.B bbStringToUTF8String() wird zu bmStringToUTF8())
  • Variablentypen geändert (z.B BBINT wird zu BMInt)
  • Structnamen geändert (z.B BBObject wird zu BMObject)
  • Nützliche Präprozessordirektiven (z.B BM_OS_WIN32, BM_ENDIAN_BIG oder BM_BUILD_DEBUG)
  • Konstanten für von BlitzMax genutzte Rückgabewerte (z.B BM_STRING_NOT_FOUND)
  • Noch mehr Konstanten für BlitzMax (z.B BM_INT_MAX und BM_INT_MIN)


Es sind zwar eigentlich nur kosmetische Änderungen, aber ich finde ein Standardheader für C Bibliotheken, die mit BlitzMax zusammenarbeiten kann nicht schaden.

Was denkt ihr davon? Ist so ein Header eine sinnvolle Erweiterung? (brl.blitz zu ersetzen wäre wahrscheinlich keine so gute Idee..)

Fabian


Download

Vektormodul nähert sich der Fertigstellung

Montag, 24. Mai 2010 von ProfJake
Diesmal nur ein kleiner Worklog, weil nicht allzuviel passiert ist. Folgende Punkte habe ich beim Vektormodul geändert:

  • Fehler im TVector2f Type gefixt
  • 4 dimensionalen Vektor-Type hinzugefügt: TVector4f
  • von allen Vektoren Double-Versionen hinzugefügt: TVector2d, TVector3d, TVector4d
  • kleine Fixes in der Dokumentation


Das wars auch schon. Das Modul sollte jetzt aber eigentlich schon ziemlich gut einsetzbar sein.

Fabian

Vektoren

Freitag, 21. Mai 2010 von ProfJake
Mit Vektoren hat eigentlich alles angefangen. Denn irgendwie war ich da nie mit den schon zahlreich existierenden Lösungen zufrieden. Meine Version ist natürlich auch nicht perfekt, aber sie ist auf alle Fälle sehr umfangreich.

Die Arten

Zur Zeit gibt es bereits TVector2f und TVector3f, die 2 bzw 3 Floats benutzen.
Später soll noch eine Klasse für 4 Werte dazukommen und natürlich noch die Version, die Doubles benutzt.
Da letzteres aber sehr einfach ist, Änderungen aber schwieriger macht, kommt das erst zum Schluss.

Die Konstruktion

Man kann einen Vektor mit der Create Funktion erstellen, oder ihn aus einem Array mit mindestens 3 Float Werten erzeugen. Dafür benutzt man die createFromArray Funktion.

BlitzMax: [AUSKLAPPEN]
Local v1:TVector3f	= TVector3f.Create(1.0, 1.0, 1.0)
Local v2:TVector3f = TVector3f.createFromArray([1.0, 1.0, 1.0])


Kopieren und Vergleichen

Man kann eine Kopie des Vektors mit copy erzeugen, die eine neue Instanz mit den gleichen Werten erzeugt. Dadurch ist die Kopie unabhängig vom Original.

Bei den Vergleichen fahre ich zweigleisig:

Es gibt sowohl compare als auch equals, isGreaterThan und isLesserThan.
Somit ist der folgende Code identisch, aber die erste Variante ist schneller.

BlitzMax: [AUSKLAPPEN]
If v1.equals(v2) Then [...]
If v1.compare(v2) = CompareIsEqual Then [...]


CompareIsEqual ist dabei eine Konstante, die in std.core definiert ist, um bei compare nicht mit -1, 0 und 1 arbeiten zu müssen.

Arithmetische Operatoren

Die arithmetischen Grundoperatoren (+-*/) sind nach folgendem Muster implementiert:

Name [add|subtract|divide|multiply] (+ Zuweisung [Assign]) (+ Skalar [Scalar])

Ich zeige das hier mal am Beispiel von "+":

BlitzMax: [AUSKLAPPEN]
' Addition mit einem anderen Vektor z.B v1 = v2 + v3
v1 = v2.add(v3)

' Addition mit einem Skalar z.B v1 = v2 + 5.0
v1 = v2.addScalar(5.0)

' Addition mit einem anderen Vektor und mit Zuweisung z.B v1 += v2
v1.addAssign(v2)

' Addition mit einem Skalar und mit Zuweisung z.B v1 += 5.0
v1.addAssignScalar(5.0)


Der Rest

Alles andere ist eigentlich Standard, auch wenn es noch nicht komplett ist. Erwähnenswert ist noch, dass ich nicht auf das brl.math Modul zurückgreife und auch nicht auf pub.stdc, weil es da nicht genügend Funktionen gibt. Ich benutze selbst gelinkte C Funktionen aus <math.h>, die das std.math Modul liefert. Der Vorteil davon ist, dass ich die Float Versionen aller Berechnungen (z.B Quadratwurzel) habe, was hoffentlich einen kleinen Geschwindigkeitsvorteil bringt.

Das std.math liefert diese Funktionalität mit der TMathF Klasse mit, die das Float-Äquivalent zu TMathD ist und alles bis zur letzten Konstante als Float liefert.

So das war's für heute, ich geh jetzt schlafen.
In nächster Zeit wird's vielleicht etwas ruhiger um das Projekt werden, oder auch nicht. Naja, jetzt seid ihr gewarnt Smile

Kommentare & Kritik sind wie immer erwünscht.

Fabian


Download

Am Anfang steht die Idee

Mittwoch, 19. Mai 2010 von ProfJake
Hallo Leute,

wie ihr ja sicher wisst ist BlitzMax schön simpel und daher auch so beliebt.
Aber im Vergleich mit Java/C#/C++ fehlen einige Sachen, die man schon vermisst. Klar dass vieles von dem der Sprache geschuldet ist, aber darum geht es mir hier gar nicht.

Ich vermisse bei BlitzMax eine Sammlung von Klassen (Types) die man immer wieder braucht, die aber von BRL nicht bereitgestellt werden. Zum Beispiel eine Klasse für Vektoren. Natürlich gibt es davon eine Menge in verschiedensten Code-Archiven, aber irgendwie scheint sich keine so richtig als "Standard" durchgesetzt zu haben und bei vielen fehlt einfach was.

Das Ziel ist also klar:

Eine Sammlung stabiler, umfangreicher und gut dokumentierter Standardklassen.

Dabei will ich nicht darauf hinaus ein Framework zu erstellen, wie das BlitzMax Community Framework, sondern etwas worauf solche Frameworks (und alles andere) aufbauen können. Das ganze wird natürlich OpenSource und unter der MIT Lizenz veröffentlicht, die sehr offen und simpel ist.

Okay, das ist also die Idee. Ich würde mich über Anregungen, Kritik etc freuen. Am besten wäre es aber, wenn ein paar von euch, die schon selbst solche Klassen für größere Projekte geschrieben haben, sich den Code durchgucken könnten. Bei Interesse einfach melden.

Zu finden ist das ganze unter Google Code. Zurzeit gibt es zwar noch nicht wirklich etwas zu sehen, aber ich denke, dass wird sich in den kommenden Wochen ändern.


Fabian

Gehe zu Seite Zurück  1, 2