See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: [tutorial] Mise à jour de votre addon pour DX9 ou DX11  (Read 3069 times)

0 Members and 1 Guest are viewing this topic.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 14991
  • Karma: 165
  • Hein, quoi !?
    • FsPassengers
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 !)
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 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]
//HFONT hFont;
//HBRUSH hBrush;
//HPEN hPen;

        // mise à jour sketchpad:

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]
               // 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:

Code: [Select]

// Nouveau sketchpad

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  , 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]
//HDC hDC = oapiGetDC (surf); // Ancien GDI
        //oapiReleaseDC (surf, hDC);    // Ancien GDI

        //Nouveaux sketchpad

         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]
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):

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)  // 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 ? :wonder: )




Message modifié ( 03-12-2012 01:18 )


Offline ea76620

  • Sr. Member
  • ****
  • Posts: 389
  • Country: France fr
  • Karma: 14
Reply #1 - 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+


Offline Pitx

  • Full Member
  • ***
  • Posts: 205
  • Country: France fr
  • Karma: 9
Reply #2 - 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


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 14991
  • Karma: 165
  • Hein, quoi !?
    • FsPassengers
Reply #3 - 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.

« Last Edit: 03 December 2012, 01:20:46 by DanSteph »

Offline Olrik_jhor

  • Full Member
  • ***
  • Posts: 183
  • Country: France fr
  • Karma: 12
Reply #4 - 23 November 2014, 14:16:22
Oui question ca marche comment pour Spacecraft 3 ? :)


Offline antoo

  • Legend
  • ******
  • Posts: 3328
  • Country: France fr
  • Karma: 134
  • 2, breaking left!
    • Forum de mon Asso d'Echasses Urbaines
Reply #5 - 23 November 2014, 14:24:31
Les bons térerrages comme on les aime :badsmile: !

---------------------------------------------------------------------------------------------------
"ET C´EST PARTI!!" Youri Gagarine au lancement de vostok 1 le 12 avril 1961
Ma chaîne Youtube : Airsoft, FPS, Simulation : http://www.youtube.com/channel/UCrzIPMeULZU6lR4M6DVsH2g