Einen Editor mit DX RenderTarget

Benutzeravatar
NeoArmageddon
Beiträge: 1165
Registriert: 13.02.2012 20:34
Wohnort: Göttingen
Kontaktdaten:

Einen Editor mit DX RenderTarget

Beitragvon NeoArmageddon » 23.04.2015 23:40

Aloha,

ich beschäftige mich momentan ein wenig mit Toolentwicklung und möchte einen Editor bauen, der jedoch auch über ein Fenster mit einem DirectX Rendertarget beinhaltet. Im Grunde möchte ich ein Layout wie in Visual Studio erzeugen und eine 3D Szene im zentralen (oder besser einem beliebigen) Fenster rendern.

Das allerdings so zum laufen zu bringen, hat sich als recht schwierig herausgestellt. Habe mir zuerst Qt angeschaut, was auch ein OpenGL und ein DirectX9 Widget (und per AddOn auch ein DirectX11) mitliefert, allerdings schränkt mich hier die LGPL Lizenz zu sehr ein. Und Qt dynamisch Linken bringt nochmal mehr als 60 MB an Daten mit sich... das muss ja nicht sein.

Dann hab ich mir wxWidgets angeschaut. Sieht echt nett aus aber da es sehr stark auf OpenGL baut, gibt es keine lauffähigen DirectX(11) Beispiele zu finden. Selbiges gilt für GTK+.

Für MFC habe ich ein Beispiel mit Hieroglyph3 gefunden, das schaut eigentlich recht brauchbar aus.

Ansonsten würde mir noch C# mit SharpDX und WPF in den Sinn kommen. Da scheint es auch einige Beispiele zu geben. Bin ja aber sonst nicht so fit in C#. Weiß jemand wie das mit dem Fenster-Docking in WPF aussieht? Hab da einige externe Libs gefunden, die sorgen aber alle dafür, dass man das UI nicht mehr in Blend designen kann.

Hat jemand von euch vielleicht eine Idee, wie ich das Problem am besten angeht? Hat vielleicht schon jemand hier sowas ähnliches implementiert und kann vllt sogar Beispielcode posten?

Am wichtigsten wäre mir beim UI der "Look and Feel" (Docking, schwebende Fenster, etc) und ein möglichst komfortables verwalten des Oberflächenlayouts (YAML ist da schon ganz okay ;) ).

Funktioniert das stlk schon mit WPF oder MFC?

Benutzeravatar
Razer
Beiträge: 834
Registriert: 24.02.2012 20:08
Wohnort: Bayern
Kontaktdaten:

Re: Einen Editor mit DX RenderTarget

Beitragvon Razer » 24.04.2015 14:03

Soweit ich weiß werden quasi keine Editoren in C++ geschrieben. C++ ist, was UI angeht, scheinbar immer noch in der Steinzeit.
WPF ist definitiv die beste Wahl. Das Problem mit dem Docking kenne ich, generell mit allen kostenlosen / OpenSource UI-Libraries.
Gibt zwar sehr gute wie Elysium, Fluent, ... aber die beißen sich alle gegenseitig. Ich hab hierfür Geld investiert und mir was professionelles gekauft,
damit arbeitet es sich auch deutlich effizienter da es sauber entwickelt ist. Fehlerfrei, schnell, einfach und komplett WPF kompatibel (Bindings, Commands, ...).

Kommt halt auf den Umfang an den du dir vorstellst. Wie gesagt, die Libraries sind selten untereinander kompatibel. Elysium und Fluent haben z.B. beide ein ModernWindow oder so,
beide quasi identisch jedoch ein paar Kleinigkeiten im Unterschied und sind somit absolut nicht castbar... bzw. wenn dann muss man ständig checken welcher Typ es ist.

Benutzeravatar
Glatzemann
Administrator
Beiträge: 3230
Registriert: 08.02.2012 13:35
Wohnort: Leverkusen
Kontaktdaten:

Re: Einen Editor mit DX RenderTarget

Beitragvon Glatzemann » 24.04.2015 15:12

Mit QT kann man schon ziemlich gut Benutzeroberflächen in C++ entwickeln... Der Unity Linux Desktop ist schliesslich damit entwickelt worden ;-) Und MFC ist zwar nicht so bequem wie WPF, aber trotzdem sehr nützlich... Aber das ist ein vollkommen anderes Thema...

Mit nativem DirectX kannst du praktisch in jedes Windows-Control rendern. Dazu brauchst du eigentlich nur das Handle. Die Herausforderung liegt eigentlich darin die Draw-Aufrufe vom GUI-System mit DirectX synchronisieren. Ich habe das auch mal mit Qt gemacht, aber leider habe ich den Code nicht mehr. Funktionierte relativ einfach...

SLTK unterstützt das auch. Man kann entweder ein RenderWindow öffnen, oder aber einfach ein Handle von einem Control übergeben. Darauf wird dann einfach gerendert. Ich habe das auch mal mit SharpDX und WPF gemacht, allerdings ist der Code noch nicht Production Ready. Schau doch mal in den Source...

Benutzeravatar
NeoArmageddon
Beiträge: 1165
Registriert: 13.02.2012 20:34
Wohnort: Göttingen
Kontaktdaten:

Re: Einen Editor mit DX RenderTarget

Beitragvon NeoArmageddon » 24.04.2015 16:27

Glatzemann hat geschrieben:SLTK unterstützt das auch. Man kann entweder ein RenderWindow öffnen, oder aber einfach ein Handle von einem Control übergeben. Darauf wird dann einfach gerendert. Ich habe das auch mal mit SharpDX und WPF gemacht, allerdings ist der Code noch nicht Production Ready. Schau doch mal in den Source...


Vom STLK? Klar, ich schau gleich mal rein.

Einzige Vorgabe die ich jetzt noch habe, wäre, dass ich C++ DLLs verwenden kann. Das geht aber soweit ich weiß mit C# ohne Probleme wenn man Interop verwendet, oder?

Razer, im Grunde machst du mit deinem Editor ja fast das selbe, was ich auch vorhabe... also UI technisch. Wie ist da denn dein Workflow? Hast du für jede Aktion Workerthreads, damit das UI flüssig bleibt? Wie synchronisierst du die untereinander? Und was kostet so eine DockingLib, von der du sprichst?

Benutzeravatar
NeoArmageddon
Beiträge: 1165
Registriert: 13.02.2012 20:34
Wohnort: Göttingen
Kontaktdaten:

Re: Einen Editor mit DX RenderTarget

Beitragvon NeoArmageddon » 26.04.2015 21:46

Ich habe noch weiter rumgeforscht und glaube ich werde es so machen:

Ich werde die Programmlogik und den Renderer in C++ schreiben und als statische Lib compilieren. Das UI werde ich als separates Projekt in C# mit WPF schreiben, welches dann Methoden der C++ Lib verwendet.
Das ganze liegt daran, dass ich eine große Abhängigkeit von unmanaged DLLs habe, für welche ich keine .NET Wrapper habe. Außerdem bin ich in C++ wesentlich fitter.

Was meint ihr dazu?

Benutzeravatar
Glatzemann
Administrator
Beiträge: 3230
Registriert: 08.02.2012 13:35
Wohnort: Leverkusen
Kontaktdaten:

Re: Einen Editor mit DX RenderTarget

Beitragvon Glatzemann » 27.04.2015 06:05

Ich glaube das ist ein Weg, der sehr häufig eingesetzt wird.

Benutzeravatar
NeoArmageddon
Beiträge: 1165
Registriert: 13.02.2012 20:34
Wohnort: Göttingen
Kontaktdaten:

Beitragvon NeoArmageddon » 27.04.2015 09:36

Glatzemann hat geschrieben:Ich glaube das ist ein Weg, der sehr häufig eingesetzt wird.


Ja, deswegen kam ich drauf. Bin bei meinen Recherchen da das eine oder andere mal drüber gestolpert.
Werde nun erstmal ein Test-UI bauen und eine Lib die ein Triangle auf eine D3D11_Textur rendert. Dann schaue ich wie das klappt.

Es bietet sich dann natürlich an, den Renderer (und die Geschäftslogik aus der Lib/Dll) in einem eigenen Thread aus zu lagern. Hat jemand Ideen für die Kommunikation zwischen UI und Lib? Ich würde einfach eine Queue bauen mit einer Eventstruktur.

Benutzeravatar
Glatzemann
Administrator
Beiträge: 3230
Registriert: 08.02.2012 13:35
Wohnort: Leverkusen
Kontaktdaten:

Re: Einen Editor mit DX RenderTarget

Beitragvon Glatzemann » 27.04.2015 10:21

Ich bin mir nicht sicher, ob du da zuviel Energie reinstecken solltest (Eventstruktur). Es gibt ja eigentlich nicht viele Berührungspunkte. Der Editor kann zwei Dinge ändern: Das was der Renderer darstellen soll (also die Szene mit Modellen, Shadern, etc.) und die eigentliche Renderer-Konfiguration (z.B. Wireframe, Auflösung, etc.). Das muss halt nur synchronisiert werden.

Bei den letzten Versuchen in der starLiGHT.Engine habe ich das so gemacht, daß wenn der Editor gestartet wird, dieser per TCP an die Engine meldet, daß diese sich initalisieren soll (die Engine wurde zuvor mit Thread.Start gestartet). Als Parameter habe ich einfach das Handle des Controls übergeben, auf welches gerendert werden soll. Die Engine hat dann (in einem eigenen Thread) einfach auf das Control gerendert wann immer sie wollte bzw. es für nötig gehalten hat (60x pro Sekunde). Auf Overlapped Regions etc. habe ich der Einfachheit halber erstmal komplett verzichtet.

Wenn der Editor irgendwas verändert hat, dann habe ich das einfach durch coconut gejagt (oder bei Szenenänderungen direkt an den Renderer gemeldet). Dazu habe ich einfach per TCP eine JSON-Meldung an den Renderer gesendet. Das macht coconut auch, wenn sich ein Modell geändert hat. Diese Meldungen habe ich dann tatsächlich im Renderer in eine Queue geschrieben und am Ende des Frames (da passt es DirectX am besten) abgearbeitet.

Der Vorteil dieser Vorgehensweise und vor allem für den Einsatz von TCP: Ich kann die Engine auf jedem beliebigen IP-fähigem Gerät starten (Smartphone, Tablet, Konsole, etc.) und den Editor auf meinem Windows-Rechner laufen lassen. Wenn die Engine auch auf dem gleichen Rechner läuft, dann rendere ich direkt in den Editor. Wenn die Engine woanders läuft, dann muss ich mir das Bild oder so übers Netz holen (z.B. VNC oder so, daß habe ich aber noch nicht realisiert) oder zwei Engines parallel laufen lassen (eine auf dem Remote-Gerät und eine andere lokal). So kann ich z.B. einen Szenen-Editor entwickeln, mit dem ich live auf einem Remote-Gerät previewen kann :-)

Benutzeravatar
NeoArmageddon
Beiträge: 1165
Registriert: 13.02.2012 20:34
Wohnort: Göttingen
Kontaktdaten:

Re: Einen Editor mit DX RenderTarget

Beitragvon NeoArmageddon » 27.04.2015 14:45

Ui, das klingt nach einer echt praktischen Lösung. Vor allem wird das ganze durch die TCP Verknüpfung echt skalierbar. Ich muss jedoch nicht nur die Szenendaten synchronisieren sondern auch wesentlich mehr. Da sganze wird ein Map/Terrain Editor, ich muss also noch Aktionen wie das "malen" auf dem Terrain und das Platzieren von Objekten synchronisieren, also im Grunde Klicks und Mausbewegungen etc übertragen. Dann muss ich natürlich noch UI Elemente wie Objektlisten etc aus dem "Backend" an das UI senden.

Damit das vielleicht ein wenig klarer wird, was ich genau vorhabe: Ich möchte einen Editor den ich bereits "Ingame" geschrieben habe nun gerne in ein externes Tool umwandeln. Den Ingame Editor findet ihr hier https://www.youtube.com/watch?v=A4_7LF7wwgQ oder hier http://www.map-builder.info
Zur Interaktion mit den Spieldaten (Terrain, Meshes, Texturen) habe ich bereits einen Satz Headerdateien und die passenden DLLs von einem anderen Entwickler erhalten.

Ist der Editor für die starLight.Engine denn schon irgendwo zu haben? Ich kannst du vielleicht ein Beispielprojekt hochladen? Das was du beschreibst, klingt ja fast so, als könnte ich das perfekt als Startpunkt verwenden. Würde dann halt nur coconut durch meine DLL Loader für die Gamedaten ersetzen.

Im Grunde wäre der Einsatz von starLight oder SLTK als Renderer auch denkbar.


Zurück zu „DirectX“

Wer ist online?

Mitglieder in diesem Forum: ahrefs (Bot) und 1 Gast