DirectX9 für Blitz3D & BlitzPlus

Kommentare anzeigen Worklog abonnieren

Worklogs DirectX9 für Blitz3D & BlitzPlus

Mitternachtsupdate die Zweite

Samstag, 3. April 2010 von Chester
Etwas, was ich ehrlichgesagt nie gedacht habe, dass ich das hinkriege, habe ich nun doch geschafft. Very Happy
Ich habe nun den Bug in Irrlicht beseitigt, der beim Rendern in einem externen Fenster ( in diesem Fall das Blitz3D Fenster) alle 2D-Befehle von Irrlicht fehlerhaft darstellte. Dies war zum Beispiel auch einer der Gründe, weshalb ich die ImageFonts rausschmiss und D3DXFonts einbaute. Da aber die Befehle basierend auf D3DXFonts genauso zu handhaben sind wie in BlitzBasic, habe ich sie nun drin gelassen und zusätzliche Befehle für ImageFonts hinzugefügt. Von der Perfomance sind diese natürlich besser, die ImageFonts müssen jedoch erst als Bitmap mit dem FontTool von Irrlicht erstellt werden. In diesem Sinne habe ich die 2D-Befehlspalette mal ein wenig erweitert. Ein Unterschied zu B3D habe ich aber extra eingebaut: Mich hat es immer gestört, dass GetColor die mit dem Befehl Color eingestellten Farben überschreibt. Bei mir sind diese zwei Befehle nun getrennt voneinander, aber noch ist alles offen. Wenn ihr wollt, könnt ihr hierzu natürlich gerne Kommentare schreiben Smile



  • Hinzugefügt:
    • Line
    • Plot
    • Rect

    • HandleImage
    • ImageXHandle
    • ImageYHandle
    • MidHandle
    • AutoMidHandle

    • CopyImage
    • DrawImageRect
    • ImageWidth
    • ImageHeight

    • LoadImageFont
    • SetImageFont
    • ImageText

    • GetColor
    • ColorRed
    • ColorGreen
    • ColorBlue

  • Bugfixes:
    • DrawImage gefixt
    • MaskImage gefixt


Update

Freitag, 2. April 2010 von Chester
Ich habe mir nun vorgenommen diesen Worklog mal ein wenig regelmäßiger zu führen, weshalb es nun wieder ein (Nach-)Mitternachtsupdate gibt. Smile

Als Leitfaden, um die Befehle zu portieren, setzte ich momentan das Driver-sample in eine DirectX 9 Variante um. Weit bin ich natürlich noch nicht, da erstmal diverse Baustellen abgearbeitet werden müssen. Eine davon ist z.B. das Thema Terrains. Da diese ein wenig anders als die üblichen sog. SceneNodes aufgebaut sind, müssen manche Befehle extra angepasst werden. Eine andere Baustelle ist das Parentsystem. Irrlicht bringt zwar von Haus aus ein solches System mit, dennoch müssen alle Befehle, die ohne bzw. mit Parent unterschiedliche Auswirkungen haben, selbst programmiert werden. Da ich jetzt eine zusätzliche Include Datei verwende und somit optionale Parameter möglich sind, ist die Verwendung wenigstens einfacher.

Hier noch ein Überblick:
  • Hinzugefügt:
    • TerrainSize
    • LoadTerrain

  • Updates:
    • Blitz3D Befehle werden nun per Include überschrieben (Danke an Silver_Knee!)
      • Vorteile:
        • Optionale Parameter
        • Codes größtenteils 1:1 identisch
        • Mehr Anpassungsmöglichkeiten

    • Befehle teilweise an Parentsystem angepasst (nun komfortabel durch optionale Parameter)
    • Transformationbefehle an Terrains angepasst
    • Standardfont an Blitz3D angepasst
    • Standardcolor an Blitz3D angepasst
    • Standardlichteinstellungen an Blitz3D angepasst

    • Bugfixes:
    • Gelegentliche Tastatureingabe-“Freezes“ beseitigt


Update auf 1.7.1

Donnerstag, 1. April 2010 von Chester
Nach über einem Monat mal wieder ein Update, dennoch kann ich leider nicht viel neues berichten.

Schuld daran war mein Plan die Engine an die neueste Irrlicht-Version anzupassen(von 1.5b auf 1.7.1), was sich als verdammt schwierig, verzwickt und zeitaufwendig herausstellte. Dies lag im Besonderen daran, dass ich mehr oder weniger einfach die ursprüngliche Irrlicht-Engine "mal hier, mal da & hier noch ein wenig" umprogrammierte, sodass in gefühlten 100-Dateien irgendwelche kleinen Änderungen und Ergänzungen drin steckten. Diese erst einmal wiederzufinden und deren Funktionsweise zu rekonstruieren war ja schon recht hart, aber dass die neue Version auch noch strukturelle Unterschiede aufwies, war der Alptraum... Größere Teile mussten neu- bzw. umgeschrieben werden, manche Funktionsweisen nochmal neu durchdacht werden... Da habe ich die Gelegenheit auch genutzt, um den Code vernünftig zu strukturieren.

Halleluja, kann ich da nur sagen, nachdem Visual C++ eben um 01:36 Uhr endlich die ersehnte Meldung brachte:
Zitat:
0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========


Damit ein Disaster in dieser Kategorie nicht nochmal kommt, habe ich nun schön sauber mit OpenOffice alle Änderungen und Ergänzungen genau dokumentiert. An alle Blitz3D-Anfänger da drausen, macht bei großen Projekten nicht den selben Fehler, sondern dokumentiert und schreibt euch alles was ihr macht auf. Das erspart euch später vieeeeel Arbeit Wink

Das einzige neue Feature, mit dem ich hier noch was konstruktives beitragen kann, ist die Unterstützung von Heightmaps à la LoadTerrain.

Abschließend möchte ich mich noch für euer sehr positives Feedback bedanken, das motiviert wirklich! Smile

Texturen

Freitag, 26. Februar 2010 von Chester
Hoi,

momentan bastele ich an den Texturebefehlen von BB rum.
  • ScaleTexture
  • PositionTexture
  • RotateTexture

Die Befehle erwarten allerdings keine Textur als Angabe, sondern das dazugehörige Mesh.
In Irrlicht besitzt nämlich jede Textur eines Objektes eine eigene TextureMatrix. Im Vergleich zu BB bringt dies einige Vorteile mit sich: Wenn man z.B. 5000 Objekte mit der selben Textur hat, deren Texturkoordinaten nur ein klein wenig in Rotation und Position abweichen, wie es z.B. in Gras-Engine's oft der Fall ist, muss man nicht, wie in BB für alle Vertices die UV Werte bearbeiten.
Der RotateTexture-Befehl ist jedoch noch fehlerhaft, da es bei 180° einen Winkel von 45° und bei 360° einen Winkel von -45° rendert. Werde wohl noch ein wenig die Irrlichtmatrizen studieren müssen... Smile



Dragon Sample in DirectX 9 - Die weiße Ebene ist die gerade Ebene(Spiegel gibts noch keine), die Texturen des Würfels sind absichtlich verdreht & verschoben:

user posted image

The show must go on

Sonntag, 7. Februar 2010 von Chester
Hi,

nach langer Pause packe ich dieses Projekt mal wieder aus dem Kühlschrank aus. Smile

Nun habe ich als erstes der Engine neue Text und Font Funktionen geschrieben, auf Basis der D3DXFont's. Dies war nötig, weil die Irrlicht internen Funktionen fehlerhaft in BlitzBasic dargestellt wurden(abgeschnittene Buchstaben, verrutschte Buchstaben etc..., auf den Screens unten hatte ich immer die Positionen ausgewählt, in denen die Schrift am saubersten aussah).
Infolge dessen musste ich die DirectX8 und OpenGL Teile aus Irrlicht rausnehmen, da es sont mit den D3DXFonts zu Konflikten kommt(und ich zu faul bin, alles anzupassen). Aber da von vornherein sowieso nur DirectX 9 geplant war, erübrigt sich das Problem.

Der Vorteil an D3DXFont ist, dass nun - wie in Blitz - ganz normal die Windows Fonts benutzt werden können.

Befehle:
Zitat:
Color9
ColorAlpha9
LoadFont9
SetFont9
Text9


Kleiner Wingdings Test:
user posted image

Samstag, 11. April 2009 von Chester
Hiho,
eine Woche ist vergangen seit dem letzten Eintrag, und es gibt Neuigkeiten zu vermelden.

1. TurnEntity
Da wir schulmäßig Vektoren- und Matrizenrechnung nach den beschissenen Lehrplänen in RLP erst in den nächsten Jahrgangsstufen behandeln, hab ich die letzte Zeit überwiegend mit Lesen & Ausprobieren verbracht - die Hauptschuld trägt hier meine TurnEntity Funktion, deren Verhalten bei einer Drehung um mehr als eine Achse deutlich vom Blitz-TurnEntity-Befehl abwich, da sie von der Funktionsweiße ungefähr folgendem entsprach: Code: [AUSKLAPPEN]
RotateEntity entity, EntityPitch(entity)+pitch, etc..
(im vorletzten Eintrag befindet sich ja ein kurzer Ausschnitt)

In diesem Sinne ein Hoch auf die Matrizenmultiplikation, die die Sache jetzt sauber auf den Schirm bringt Smile

2. EntityTexFilter
Ursprünglich aus reiner Neugier eingebaut, aber dennoch voll einsetzbar ist der Befehl EntityTexFilter, der - wie der Name vielleicht schon vermuten lässt - Texturfilter ins Spiel bringt.
Zitat:
EntityTexFilter entity, filter

filter:
0 = Point Sampling
1 = Bilineare Filterung(Standard)
2 = Trilineare Filterung
3 = Anisotrope Filterung


Zur Verdeutlichung eine Animation:
user posted image

3. EntityColor, Alpha, FX
Um Transparenz in den Haufen zu kriegen, musste ich ein paar kleine und größere Änderungen machen.
EntityColor funktioniert nun wie in Blitz, auf der Vertexfarbe basierend(als netter Nebeneffekt funktioniert jetzt EntityColor auch zusammen mit Texturen); genauso wie EntityAlpha den Vertexalpha Wert benutzt. Als weiteres Nebenprodukt entstand der EntityFX Befehl, allerdings bisjetzt nur mit den Flags 2,4,16 und 32, weil es bei mir bisjetzt weder Licht noch Nebel gibt Smile

4. Eine Million Vertices
Ein Produkt der Spielerei(oder eher Spinnerei) ist folgende kleine Demo mit 125.000 herumfliegenden Würfeln, mit insgesamt genau einer Million Vertices. Die Anregung dazu war übrigens eine Polygonenanzahl von 700.000 in Crytek's Sandbox 2 Editor.
Download!

user posted image
Wie man sieht: 11 FPS(bei fünf Millionen Vertices sind es immerhin auch noch 5 FPS Wink)

Samstag, 4. April 2009 von Chester
Hiho,
die letzte Zeit verlief ein wenig mühsam, aber wenigstens ist was vernünftiges dabei rausgekommen.
Wem Hardcore Modeling, mithilfe von AddVertex usw., schon immer so viel Spaß gemacht hat, der wird sich jetzt wohl freuen Wink

Die neuen Befehle:
Zitat:
CreateMesh9
CreateSurface9
AddTriangle9
AddSurface9
AddVertex9
CreateCone9



So kann man zum Beispiel einen Kegel erstellen:
Code: [AUSKLAPPEN]
; Mesh erstellen
mesh=CreateMesh9()

; Surface erstellen
surface=CreateSurface9(mesh)

; Den Winkel eines Kegelabschnittes errechnen
angleStep# = 360.0 / 30

; Kegelspitze
v0=AddVertex9(surface,0,1,0)

;  Vertices setzten
For a=1 To 30
   v1=AddVertex9(surface,Cos(anglestep#*a),-1,(Sin(anglestep#*a)))
   If a=1 Then vB=v1
   v2=AddVertex9(surface,Cos(anglestep#*(a+1)),-1,(Sin(anglestep#*(a+1))))
   AddTriangle9(surface,v0,v2,v1)
   AddTriangle9(surface,v1,v2,vB)
Next


EntityColor9 mesh, 255,255,0
PositionEntity9 mesh, 0,0,5
WireFrameMesh9 mesh, 1


user posted image

Immer wieder witzig...

Donnerstag, 2. April 2009 von Chester
... wenn man beim Programmieren nach dem "Stream of Consciousness" geht.
Als ich einfach mal die Neunen entfernt habe, um zu testen, ob es in der Blitz3D Engine genauso aussieht, war ich überrascht, dass es ja eigentlich fast gleich ist.
Allerdings war ich dann höchst irritiert, dass sich bei mir der Würfel nach links drehte und mit dem B3D Befehl nach rechts. Hab die Sache natürlich X-mal kontrolliert und überprüft, aber es war tatsächlich so. In B3D ist die Yaw Rotation rechtsläufig, wobei Pitch und Roll linksläufig sind. Eine Anpassung ist natürlich keine große Sache, aber gibt mir beim Durchscrollen jedesmal zu Denken:
Code: [AUSKLAPPEN]
   vNR.X = (vOR.X   +   fX);
   vNR.Y = (vOR.Y   -   fY); // WTF ?!
   vNR.Z = (vOR.Z   +   fZ);



Was ich insgesamt gemacht habe:
- Rotationen an BB angepasst
- Dimensionen an BB angepasst
- Die DeviceRun & Cls in dem Befehl RenderWorld9 integriert
- DropDevice und End zusammengefasst in End9
- Neue Befehle:
Zitat:
;- LoadMesh9
;- LoadAnimMesh9
;- LoadTexture9
;- EntityTexture9
;- CreateSphere9
;- End9
;- UseOpenGL
;- UseDirectX9
;- UseDirectX8 (VSync geht nicht)
;- WireFrameMesh9



Dazu wieder mal ein Beispielcode:
Code: [AUSKLAPPEN]
Graphics3D 800, 600, 32, 2

UseDirectX9
CreateDevice9(0,0,0,0,0,1,1) ; width, height, depth, fullscreen, stencilbuffer, vsync, antialias

; Titelleiste
AppTitle "Test - Device: " + GetDeviceName9()


; Bitmap Font laden
font = LoadFont9("fontcourier.bmp")
SetFont9 font


; Irrlicht Logo laden
img   = LoadImage9("irrlichtlogo.bmp")


; Kamera
cam      =   CreateCamera9()
CameraClsColor9 150,150,150

; Würfel
cube   =   CreateCube9()
PositionEntity9      cube, 0,-1,2
ScaleEntity9 cube, .5,.5,.5

; Würfel texturieren
cube_tex = LoadTexture9( "spheremap.bmp")
EntityTexture9 cube,cube_tex

;- Geosphere-Mesh
geo = LoadMesh9("geo1.3DS")
PositionEntity9 geo,0,0,5

;- Geosphere texturieren
geo_tex = LoadTexture9( "tex0.bmp")
EntityTexture9 geo,geo_tex

;- Teekanne
teapot = LoadMesh9("teapot.x")
EntityColor9 teapot, 255,255,0
PositionEntity9 teapot, 0,2.5,5

;- Kugel
sphere = CreateSphere9(50)
PositionEntity9 sphere, 0,2,6


; Wireframe Modus
WireFrameMesh9 sphere,1
WireFrameMesh9 teapot,1
WireFrameMesh9 cube,1


While Not(KeyHit(1))
   
   ; Kamerabewegung
   If KeyDown(17) Then MoveEntity9 cam, 0,0,.3
   If KeyDown(31) Then MoveEntity9 cam, 0,0,-.3
   If KeyDown(30) Then MoveEntity9 cam, -.3,0,0
   If KeyDown(32) Then MoveEntity9 cam, .3,0,0
   
   ;ein bisschen Bewegung
   Turnentity9 cube, 0,1,0
   Turnentity9 geo, 0,0,1
   Turnentity9 teapot, 1,1,1
   TurnEntity9 sphere,1,1,1
   
   ; Rendern
   RenderWorld9()
   
   ;- Debug Ausgabe vom Würfel
   Text9 10,10, "Würfel X: " + EntityX9(cube)
   Text9 10,28, "Würfel Y: " + EntityY9(cube)
   Text9 10,46, "Würfel Z: " + EntityZ9(cube)
   
   Text9 10,70, "Würfel Pitch: " + EntityPitch9(cube)
   Text9 10,88, "Würfel Yaw: " + EntityYaw9(cube)
   Text9 10,88+18, "Würfel Roll: " + EntityRoll9(cube)
   
   ;Fps
   Text9 10,150, "FPS: " + GetFps9()
   
   
   ;Irrlicht Logo malen
   DrawImage9 img,570,5
   
   ; Flippen
   Flip9
Wend

End9


Screen:
user posted image

------------------------------------------------------------------------------------------------------------

Gesamte Befehlsliste:
Code: [AUSKLAPPEN]
;-------------------
;--- System
;-------------------
;- GraphicsDx9 / CreateDevice9
;- RenderWorld9
;- Flip9
;- End9
;- UseOpenGL
;- UseDirectX9
;- UseDirectX8 (VSync geht nicht)

;------ Debug ------

;- GetFPS9
;- GetDeviceName9

;-------------------
;------- 2D --------
;-------------------
;- LoadFont9
;- SetFont9
;- Text9

;- LoadImage9
;- MaskImage9
;- DrawImage9

;-------------------
;------- 3D --------
;-------------------

;- WireFrameMesh9

;----- Kamera ------

;- CreateCamera9
;- CameraClsColor9

;---- Primitive ----

;- CreateSphere9
;- CreateCube9
;- EntityColor9

;----- Meshs -------

;- LoadMesh9
;- LoadAnimMesh9

;----- Textur ------

;- LoadTexture9
;- EntityTexture9

;---- Bewegung -----

;- PositionEntity9
;- TranslateEntity9
;- RotateEntity9
;- ScaleEntity9
;- MoveEntity9
;- TurnEntity9

;----- Status ------

;- EntityX9
;- EntityY9
;- EntityZ9
;- EntityPitch9
;- EntityYaw9
;- EntityRoll9
;-------------------

Bewegung

Montag, 30. März 2009 von Chester
Hiho,
hab überwiegend an Ausgabe und Bewegung gearbeitet und der Fortschritt ist bisjetzt sehr gut. Die 2D Funktionen haben zwar etliche Probleme gemacht - habe aus Versehen einen wichtigen Teil aus der Irrlicht Engine gelöscht, weshalb immer nur schwarze Balken erschienen - aber dies ist nun behoben. Ebenso ein kleiner Fehler, der Fehlermeldungen in der IDE beim Schließen des Testprogrammes verursachte.

Neu hinzugekommen sind Befehle wie MoveEntity, zur Kontrolle auch EntityX/Y/Z, damit verbunden natürlich eine Textfunktion und weil es gerade so schön war, noch Bildbefehle.( Genaue Liste steht weiter unten)

Wie im gestrigen Eintrag wieder ein Beispielcode:
Code: [AUSKLAPPEN]
Graphics3D 800, 600, 32, 2
CreateDevice9(0,0,0,0,0,1,1)

AppTitle "Test -- Device: "+ GetDeviceName9()

font = LoadFont9("fontcourier.bmp")
SetFont9 font

img   = LoadImage9("fontcourier.bmp")
MaskImage9 img, 0,0,0


cam      =   CreateCamera9()
CameraClsColor9 150,150,150

cube   =   CreateCube9()
PositionEntity9      cube, 0,0,5
EntityColor9       cube, 255,255,0

While Not(KeyHit(1)) And DeviceRun9()
   
   MoveEntity9 cube, 0,0,1
   Turnentity9 cube, 0,-10,0
   
   Cls9(True)
   
   RenderWorld9()
   
   Text9 10,10, "Würfel X: " + EntityX9(cube)
   Text9 10,28, "Würfel Y: " + EntityY9(cube)
   Text9 10,46, "Würfel Z: " + EntityZ9(cube)
   
   Text9 10,70, "Würfel Pitch: " + EntityPitch9(cube)
   Text9 10,88, "Würfel Yaw: " + EntityYaw9(cube)
   Text9 10,88+18, "Würfel Roll: " + EntityRoll9(cube)
   
   Text9 10,150, "FPS: " + GetFps9()
   
   DrawImage9 img, 544,0
   
   Flip9
Wend

DropDevice9()
End


Als Bilduser posted image
Das Gelbe ist der Würfel, der sich in hoher Geschwindigkeit im Kreis dreht und das Rechts ist die Schriftdatei als Bild, mit Schwarz als Transparenzfarbe. Die 60 FPS sind wegen eingeschaltetem VSync.

VSync An - AntiAlias An/Aus: 60 FPS
VSync Aus - AntiAlias An: ca. 1800 FPS
VSync Aus - AntiAlias Aus: ca. 5200 FPS



Neue Befehle:
Zitat:
;- GetFPS9
;- LoadFont9
;- SetFont9
;- Text9
;- LoadImage9
;- MaskImage9
;- DrawImage9
;- CameraClsColor9 von Hexcode auf Integer RGB
;- MoveEntity9
;- TurnEntity9
;- EntityX9
;- EntityY9
;- EntityZ9
;- EntityPitch9
;- EntityYaw9
;- EntityRoll9


Alle momentanen Befehle:
Code: [AUSKLAPPEN]
;-------------------
;--- System
;-------------------
;- GraphicsDx9 / CreateDevice9
;- DeviceRun9
;- RenderWorld9
;- Cls9
;- Flip9
;- DropDevice9
;- GetFPS
;- GetDeviceName
;- AppTitle9 !nicht benötigt!
;- KeyDown9 !nicht benötigt!
;-------------------
;--- Kamera
;-------------------
;- CreateCamera9
;- CameraClsColor9
;-------------------
;------- 2D --------
;-------------------
;- LoadFont9
;- SetFont9
;- Text9

;- LoadImage9
;- MaskImage9
;- DrawImage9
;-------------------
;------- 3D --------
;-------------------
;- CreateCube9
;- EntityColor9
;-------------------
;--- Bewegung
;-------------------
;- PositionEntity9
;- TranslateEntity9
;- RotateEntity9
;- ScaleEntity9
;- MoveEntity9
;- TurnEntity9
;-------------------
;--- Status
;-------------------
;- EntityX9
;- EntityY9
;- EntityZ9
;- EntityPitch9
;- EntityYaw9
;- EntityRoll9
;---------------

Blitz3D/Plus + DirectX 9(Irrlicht)

Sonntag, 29. März 2009 von Chester
Hiho alle zusammen,
nachdem endlich ein höchst kurioser Bug beseitigt ist, der mich fast zum Aufgeben gebracht hat( genau beim 85848.ten Frame hat sich die Applikation ohne irgendeine Fehlermeldungen beendet), möchte ich euch mein aktuelles Projekt vorstellen:
Eine auf komfortabilität optimierte Irrlicht Engine, deren Ziel es ist, genauso einfach anwendbar wie die Blitz3D Engine zu sein.

Der aktuelle Stand ist natürlich noch nicht allzuweit, aber ich hoffe hieraus wird mal noch was. Smile

So sieht es bisher aus:

Beispielcode:
Code: [AUSKLAPPEN]
GraphicsDx9 800,600,32,2

AppTitle "Test -- Device: "+ GetDeviceName9()

cam=CreateCamera9()
CameraClsColor9($969696)

cube=CreateCube9()


PositionEntity9 cube, 0,0,50
EntityColor9 cube, 255,255,0


While Not(KeyHit(1)) And DeviceRun9()
      
   If KeyDown(17) Then TranslateEntity9 cube, 0,0,1
   If KeyDown(31) Then TranslateEntity9 cube, 0,0,-1
   If KeyDown(30) Then TranslateEntity9 cube, -1,0,0
   If KeyDown(32) Then TranslateEntity9 cube, 1,0,0
   
 
   RotateEntity9(cube, rot,rot,rot)
   rot=rot+1
   
   Cls9(True) ; Param1: Clear ZBuffer
      RenderWorld9()
   Flip9
Wend

DropDevice9()
End

Function GraphicsDx9(width, height, bits, mode, bStencilBuffer=True, bVSync=False, bAntiAlias=True)
   If mode=0 Then mode=2
   Graphics3D width, height, bits, mode
   If mode>1 Then mode =0
   CreateDevice9(width,height,bits,mode,bStencilBuffer,bVSync,bAntiAlias)
End Function


Sieht folgendermaßen aus(FPS Anzeige von Fraps)
user posted image