TUTO EN COURS DE CREATION/PAS FINI
[tutorial] Mise à jour de votre addon pour DX9 ou DX11L'avenir d'Orbiter sont dans les clients DX9 ou DX11 (voir le post ici:
Orbiter avec DX9 ou DX11 - boostez le rendu !)La différence de rendu est implacable (voir post plus haut aussi)
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 sketchpadUtiliser 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:
//HFONT hFont;
//HBRUSH hBrush;
//HPEN hPen;
// mise à jour sketchpad:
oapi::Font * hFont;
oapi::Brush * hBrush;
oapi::Pen * hPen;
Compilez, festival d'erreur !

, c'est normal
...ce n'est pas saleLes 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.
// 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
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 il ne reconnait que "fixed","sans" et "serif" Évidemment il faut changer aussi les
DeleteObject par leur contrepartie sketchpad:
// Nouveau sketchpad
oapiReleaseFont(hFont);
oapiReleaseBrush(hBrush);
oapiReleasePen(hPen);
"Mais ou trouve-t-il tout ces fonctions ?"

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

, 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:
//HDC hDC = oapiGetDC (surf); // Ancien GDI
//oapiReleaseDC (surf, hDC); // Ancien GDI
//Nouveaux sketchpad
oapi::Sketchpad *skp = oapiGetSketchpad(surf);
oapiReleaseSketchpad(skp);
Compilez, festival d'erreur !

Mais là on va commencer à remplacer en masse:

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:
SelectObject (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:
SetTextColor ? ça marche encore mieux ! Voila qui va changer en une fois vos 4753 "SetTextColor"
TextOut ? quelle grosse rigolade ! Hop 7324 changements en un coup !
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):
[s]SelectObject (hDC, GetStockObject (BLACK_PEN));[/s]
[s]oapiReleaseDC (surf, hDC);[/s]
Et on remplace les anciens callback par les nouveaux exemple:
clbkDrawHUD (int mode, const HUDPAINTSPEC *hps, HDC hDC) // ancien
clbkDrawHUD (int mode, const HUDPAINTSPEC *hps, oapi::Sketchpad *skp) // nouveau
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
JE CONTINUE DEMAIN OU A L'OCCASE (y a des types que ça intéresse ?
)
Message modifié ( 03-12-2012 01:18 )