Dan's Orbiter page

Orbiter Francophone => Création Orbiter Francophone => Topic started by: DanSteph on 02 December 2012, 02:52:00

Title: [tutorial] Mise à jour de votre addon pour DX9 ou DX11
Post by: DanSteph on 02 December 2012, 02:52:00

TUTO EN COURS DE CREATION/PAS FINI



[tutorial] Mise à jour de votre addon pour DX9 ou DX11


L'avenir d'Orbiter sont dans les clients DX9 ou DX11 (voir le post ici: Orbiter avec DX9 ou DX11 - boostez le rendu !) (http://orbiter.dansteph.com/forum/index.php?topic=5827.msg82623#msg82623)
La différence de rendu est implacable (voir post plus haut aussi)
(http://orbiter.dansteph.com/screenshot/dansteph/tutoupdatedx7dx9dx11.jpg)


Mise à jour:

Si votre addon n'utilise pas du code C++ pour l'affichage de texte avec GDI et/ou du tripotage de mesh ou textures avec les fonctions GetMesh ou des fonctions qui utilisent un MESHHANDLE,vous n'avez rien à faire, votre addon est compatible.

Sinon c'est relativement simple:

Changer l'affichage de GDI en sketchpad

Utiliser le GDI ne va pas planter Orbiter mais les windows 7 et autre vista ont vraiment de la peine avec l'émulation. (Genre diapositive) Les fonctions sont à peu prêt pareil le changement n'est pas monstrueux il faut juste être méticuleux !

Pensez à compiler avec la dernière SDK d'Orbiter 2010 quand même (hein ;) )

Le moyen le plus simple est de "couper" toutes les variables GDI et de compiler: toutes les erreurs seront des fonctions à changer, pas de panique, on va utiliser des search/replace pour faire une mise à jour en masse de tout le code. En général le tout prend 10 minutes.

Cherchez toutes les fonctions GDI comme CreateFont, CreateSolidBrush, CreatePen, si votre code est bien rangé vous aurez mis les handles GDI au même endroit (dans une structure globale), commentez les variables et rajoutez leurs contrepartie sketchpad:

Exemple:

Code: [Select]
[color=green] //HFONT hFont;
//HBRUSH hBrush;
//HPEN hPen;

        // mise à jour sketchpad:[/color]
oapi::Font * hFont;
oapi::Brush * hBrush;
oapi::Pen * hPen;
Compilez, festival d'erreur !  :arg:, c'est normal :zen: ...ce n'est pas sale


Les fonctions de création de font/brush/pen sont à changer manuellement parce les paramètres ne sont pas pareil, un exemple est très parlant. Pour adapter vos paramètres clique droit sur la fonction + "Atteindre la définition", vous verrez la fonction et les commentaires qui vous expliquent les paramètres.

Code: [Select]
[color=green]                // ancien GDI
//hFont= CreateFont (-13, 0, 0, 0, FW_LIGHT, 0, 0, 0, 0, 0, 0,0, 0, "Arial");
//hBrush= CreateSolidBrush (RGB(0,255,0));    // green
//hPen= CreatePen (PS_SOLID, 1, RGB(224,224,224));
// Nouveau sketchpad[/color]
hFont= oapiCreateFont(12, false, "sans",FONT_NORMAL);
hBrush= oapiCreateBrush(RGB (0,128,0));
hPen= oapiCreatePen(1,1,RGB (220,220,120));
N'essayez pas de mettre des fonts exotique, la fonction a un bug/limitation voir ici (http://www.orbiter-forum.com/showthread.php?p=319004&postcount=6) il ne reconnait que "fixed","sans" et "serif"

Évidemment il faut changer aussi les DeleteObject par leur contrepartie sketchpad:

Code: [Select]
[color=green]
// Nouveau sketchpad[/color]
oapiReleaseFont(hFont);
oapiReleaseBrush(hBrush);
oapiReleasePen(hPen);
"Mais ou trouve-t-il tout ces fonctions ?" :wonder: Vous demandez-vous-je ? Facile, elles sont toutes dans un header évidemment (En l’occurrence "OrbiterApi.h"), pour arriver dessus clique droit sur une fonction sketchpad "Atteindre...", voir une recherche  (http://orbiter.dansteph.com/screenshot/dansteph/TutoSDKRecherche1.jpg), ou alors si vous êtes vraiment débutant trouvez ce fichier dans le folder SDK et faites une recherche avec le mot clé "sketchpad".

Ensuite on cherche tout les oapiGetDC et oapiReleaseDC et on les remplace de tel manière:

Code: [Select]
[color=green] //HDC hDC = oapiGetDC (surf); // Ancien GDI
        //oapiReleaseDC (surf, hDC);    // Ancien GDI

        //Nouveaux sketchpad[/color]
         oapi::Sketchpad *skp = oapiGetSketchpad(surf);
         oapiReleaseSketchpad(skp);
Compilez, festival d'erreur ! :arg: Mais là on va commencer à remplacer en masse: :badfinger:

C'est le moment de réfléchir 30 secondes: A chaque erreur il y a moyen de faire un rechercher/remplacer en masse puisque toutes les fonction GDI ont des contreparties sketchpad qui prennent les mêmes paramètres.

Prenez celle là par exemple:
Code: [Select]
[color=blue]SelectObject[/color] (hDC, g_Param.hPen);On voit que c'est un sélection de "pen", on voit qu'on a une fonction SetPen de sketchpad. Un petit essai pour la première et on remplace en masse avec rechercher/remplacer:

(http://orbiter.dansteph.com/screenshot/dansteph/Tuto20121203000932.jpg)

SetTextColor ? ça marche encore mieux ! Voila qui va changer en une fois vos 4753 "SetTextColor"

(http://orbiter.dansteph.com/screenshot/dansteph/Tuto20121203001716.jpg)

TextOut ? quelle grosse rigolade ! Hop 7324 changements en un coup !

(http://orbiter.dansteph.com/screenshot/dansteph/Tuto20121203002341.jpg)

Bon faut pas s’appeler Einstein pour faire la suite hein ? Vous captez le principe ? Un petit essai d'abord en local sur une ligne (sinon merci les 7453 fonctions fausse) et après HOP! rechercher/remplacer.


Le grand nettoyage final ! Que GDI retourne à jamais dans les profondeurs infernâââle !

En sketchpad il n'y a pas besoin de resélectionner les objets originaux contrairement à GDI et certains callback qui avaient des paramètres "HDC" ont leurs contrepartie en sketchpad.

Donc on fait une recherche avec le texte "HDC" et on vire tout ce qui ressemble à une reselection d'un objet (ils sont juste avant les oapiReleaseDC en général):

Code: [Select]
[s]SelectObject (hDC, GetStockObject (BLACK_PEN));[/s]
[s]oapiReleaseDC (surf, hDC);[/s]

Et on remplace les anciens callback par les nouveaux exemple:

Code: [Select]
clbkDrawHUD (int mode, const HUDPAINTSPEC *hps, HDC hDC)  [color=green]// ancien[/color]
clbkDrawHUD (int mode, const HUDPAINTSPEC *hps, oapi::Sketchpad *skp)  [color=green]// nouveau[/color]

Il faut évidemment remplacer ces callback dans le header et dans les cpp. De plus il faut que votre class vessel hérite du nouveau VESSEL3 et plus de VESSEL2

(http://orbiter.dansteph.com/screenshot/dansteph/Tuto20121203010030.jpg)



JE CONTINUE DEMAIN OU A L'OCCASE (y a des types que ça intéresse ? :wonder: )




Message modifié ( 03-12-2012 01:18 )
Title: Re: [tutorial] Mise à jour de votre addon pour DX9 ou DX11
Post by: ea76620 on 02 December 2012, 09:44:03
Bonjour,

Quote
DanSteph a écrit:
y a des types que ça intéresse ?

Oui, je vais essayer de faire en sorte que mes addons c++ puissent être utilisés en DX9 ou DX11 ça peut toujours être utile.

A+
Title: Re: [tutorial] Mise à jour de votre addon pour DX9 ou DX11
Post by: Pitx on 02 December 2012, 19:53:49
Hello,

Quote
DanSteph a écrit:
y a des types que ça intéresse ?

Oui, moi! :)
Presque tous les exemples trouvés sont pour DX7.

Très bonne idée de tuto.

A+
Pitx
Title: Re: [tutorial] Mise à jour de votre addon pour DX9 ou DX11
Post by: DanSteph on 03 December 2012, 01:20:46
Bon, j'ai avancé un bout, pour GDI, je continue demain pour les GetMesh et je réorganiserais tout le fil en sections avec un index.

En attendant vous pouvez poser vos questions/remarques sur le tuto je deleterais le tout pour la mise en forme du fil de toute façon.
Title: Re: [tutorial] Mise à jour de votre addon pour DX9 ou DX11
Post by: Olrik_jhor on 23 November 2014, 14:16:22
Oui question ca marche comment pour Spacecraft 3 ? :)
Title: Re: [tutorial] Mise à jour de votre addon pour DX9 ou DX11
Post by: antoo on 23 November 2014, 14:24:31
Les bons térerrages comme on les aime :badsmile: !