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: [C++] Faire un afficheur de données dans un cockpit virtuel  (Read 6131 times)

0 Members and 1 Guest are viewing this topic.

Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
28 October 2012, 16:19:04
Bonjour,

Toujours pour la capsule Daedalus je dois ajouter dans le cockpit virtuel un écran pour afficher différentes données tel que le remplissage des réservoirs, le pourcentage de charge des batteries, le statut de certain systèmes,...

J'ai regarder dans les exemples du deltaglider et du shuttleA afin d'essayer de comprendre le fonctionnement mais sans trop de résultats.

Je sais que je dois utiliser :

Code: [Select]
oapiVCRegisterArea (AID_CUSTOMDISPLAY, _R(0, 0, 256, 256), PANEL_REDRAW_ALWAYS, PANEL_MOUSE_LBDOWN, PANEL_MAP_BACKGROUND, tex2);
oapiVCSetAreaClickmode_Quadrilateral (AID_CUSTOMDISPLAY, _V(-0.46,1.504,2.34), _V(-0.44,1.504,2.34), _V(-0.46,1.334,2.34), _V(-0.44,1.334,2.34));

Code: [Select]
case AID_CUSTOMDISPLAY:
    La faut mettre quoi ???
    return true;

En fait je cherche a afficher des variables genre dO2lvl sur un mesh (enfin sa texture).

Merci d'avance

Au revoir



Message modifié ( 28-10-2012 16:23 )


Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #1 - 28 October 2012, 21:17:52
Bonjour,

J'ai trouvé avec l'aide du code du shuttleA

Je met ce que j'ai fait au cas ou quelqu'un a besoin.


D'abord il y a ça dans "clbkLoadVC"

Code: [Select]
oapiVCRegisterArea (AID_CUSTOMDISPLAY, _R(0, 0, 256, 256), PANEL_REDRAW_ALWAYS, PANEL_MOUSE_LBDOWN, PANEL_MAP_BACKGROUND, tex2);
oapiVCSetAreaClickmode_Quadrilateral (AID_CUSTOMDISPLAY, _V(-0.46,1.504,2.34), _V(-0.44,1.504,2.34), _V(-0.46,1.334,2.34), _V(-0.44,1.334,2.34));

puis dans "clbkVCRedrawEvent"

Code: [Select]
case AID_CUSTOMDISPLAY:
     return RedrawPanel_CustomDisplay (surf);

La fonction qui est appelé :

Code: [Select]
bool SMV_Daedalus::RedrawPanel_CustomDisplay (SURFHANDLE surf)
{
char cbuf[256];

HDC hDC = oapiGetDC (surf);
SelectObject (hDC, g_Param.hFont[1]);
SetTextColor (hDC, RGB(0, 200, 0));
SetTextAlign (hDC, TA_CENTER);
SetBkMode (hDC, TRANSPARENT);

sprintf (cbuf, "E.T téléphone maison");
TextOut (hDC, 128, 128, cbuf, strlen(cbuf));

oapiReleaseDC (surf, hDC);

return true;
}

A+



Message modifié ( 28-10-2012 21:18 )


Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #2 - 28 October 2012, 21:32:08
Tu es dans la bonne voie. Toutefois, je remplacerais toutes les fonctions GDI par le oapi::Sketchpad d'Orbiter, qui est compatible avec tous les clients graphiques. La méthode deviendrait :

Code: [Select]
bool SMV_Daedalus::RedrawPanel_CustomDisplay (SURFHANDLE surf)
{
char cbuf[256];

oapi::Sketchpad* skp = oapiGetSketchpad (surf);
skp->SetFont(g_Param.hFont[1]);
skp->SetTextColor(RGB(0, 200, 0));
skp->SetTextAlign (CENTER);
skp->SetBackgroundMode (BK_TRANSPARENT);

sprintf (cbuf, "E.T téléphone maison");
skp->Text(128, 128, cbuf, strlen(cbuf));

oapiReleaseSketchpad(skp);

return true;
}

Attention : g_Param.hFont[1] doit être un objet oapi::Font, créé avec oapiCreatePen() et libéré avec oapiReleasePen();



Message modifié ( 29-10-2012 00:27 )

Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #3 - 28 October 2012, 22:01:04
ok, je vais voir ça


Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #4 - 29 October 2012, 12:01:16
Juste une question, comment installer le sketchpad car je sais pas trop comment faire et je n'ai pas trouver d'exemple.



Message modifié ( 29-10-2012 12:01 )


Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #5 - 29 October 2012, 21:57:11
Tu n'as pas à l'installer, il fait partie de la SDK d'Orbiter. Regarde dans la documentation. Dans la section Classes, tu va trouver oapi::Sketchpad. Ce n'est qu'une simple classe dans le namespace oapi.


Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #6 - 29 October 2012, 21:58:50
ok, merci je regarde ça

(mais avant je corrige un gros bug)


Offline Maxorbiter

  • Orbiter-Forum: LadyCroussette
  • Legend
  • ******
  • Posts: 2391
  • Country: Canada ca
  • Karma: 215
Reply #7 - 29 October 2012, 22:08:35
Je serai j'amais capable de faire sa!
Tu est bon, j'espère que ton problème finira vite.
Bon travail.




Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #8 - 31 October 2012, 00:15:47
Bonjour,

J'ai mis le Sketchpad mais je ne parvient pas à avoir mon texte autrement que transparent (il y a juste un peu de vert sur les bord des lettres).




voici le code :

Code: [Select]
bool SMV_Daedalus::RedrawPanel_CustomDisplay (SURFHANDLE surf)
{
    oapi::Font *font = oapiCreateFont (38, true, "Sans", FONT_NORMAL);  
    oapi::Sketchpad *skp = oapiGetSketchpad (surf);
    char cbuf[1024];

    if (skp) {
        skp->SetFont(font);
        skp->SetTextColor(RGB(0, 200, 0));
        skp->SetTextAlign (oapi::Sketchpad::CENTER);
        skp->SetBackgroundMode (oapi::Sketchpad::BK_TRANSPARENT);

sprintf (cbuf, "E.T téléphone maison");
skp->Text(512, 512, cbuf, strlen(cbuf));

oapiReleaseSketchpad(skp);
}

    oapiReleaseFont (font);

    return true;
}

La texture est de 1024 x 1024

A+



Message modifié ( 31-10-2012 00:17 )


Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #9 - 31 October 2012, 00:57:53
Je crois t'avoir indu en erreur avec la macro RGB. Essaie de définir la couleur directement en hexadécimal. Pour du vert, c'est 0x00FF00.

Pour bien comprendre, tu n'as qu'à utiliser ce petit guide. 0xBBGGRR, où B = bleu, g = vert et r = rouge. En hexadécimal, on compte de 0 à F (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F), car on est en base 16, au lieu de 10. Si tu veux du rouge, 0x0000FF. Un rouge un peu plus foncé, 0x0000AA ou encore légèrement plus foncé avec : 0x0000A6 (parce que 6 est plus petit que A, la valeur est moins grande). Tu peux aussi mélanger les couleurs. Du violet : 0xFF00FF.

EDIT:
Je suis en train de douter de ce que j'ai écrit. La macro RGB devrait créer un DWORD en BGR comme Orbiter le veut...
Regarde dans ton mesh si le matériel associé au group sur lequel tu dessines est légèrement transparent.



Message modifié ( 31-10-2012 01:00 )

Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #10 - 31 October 2012, 03:03:21
Quote
ea76620 a écrit:
Bonjour,

J'ai mis le Sketchpad mais je ne parvient pas à avoir mon texte autrement que transparent (il y a juste un peu de vert sur les bord des lettres).




voici le code :

Code: [Select]
bool SMV_Daedalus::RedrawPanel_CustomDisplay (SURFHANDLE surf)
{
   oapi::Font *font = oapiCreateFont (38, true, "Sans", FONT_NORMAL);  
    oapi::Sketchpad *skp = oapiGetSketchpad (surf);
    char cbuf[1024];

    if (skp) {
        skp->SetFont(font);
        skp->SetTextColor(RGB(0, 200, 0));
        skp->SetTextAlign (oapi::Sketchpad::CENTER);
        skp->SetBackgroundMode (oapi::Sketchpad::BK_TRANSPARENT);

sprintf (cbuf, "E.T téléphone maison");
skp->Text(512, 512, cbuf, strlen(cbuf));

oapiReleaseSketchpad(skp);
}

   oapiReleaseFont (font);

    return true;
}

La texture est de 1024 x 1024

A+

Attention la tu créer la font 60 fois par seconde à 60 FPS ;)

Faut la créer dans InitModule et la releaser dans ExitModule, et garder le handle dans une variable globale. (Tu dois avoir une struct g_Param qui traine ? C'est parfait )

RGB c'est parfait mais c'est sur 255 donc rouge vert(green) bleu (RGB) RGB(255,255,255)=blanc
Sinon à part la font le code est bon.

EDIT: Ta font a pas une gueule de "38" du tout, j'ai l'impression que ta fonction marche pas, essaie de la globaliser dans init/exitmodule. De toute façon c'est la manière correcte.

Code: [Select]
DLLCLBK void InitModule (HINSTANCE hModule)
{
g_Param.hSkpFont=oapiCreateFont(12, true, "Sans");

Code: [Select]
DLLCLBK void ExitModule (HINSTANCE hModule)
{
oapiReleaseFont (g_Param.hSkpFont);

Et dans le code évidemment:

Code: [Select]
bool SMV_Daedalus::RedrawPanel_CustomDisplay (SURFHANDLE surf)
{
......
......
......

    if (skp) {
        skp->SetFont(g_Param.hSkpFont);
....
....
 ET oublie pas d'enlever:
         oapiReleaseFont (font);
}


A++

Dan



Message modifié ( 31-10-2012 03:12 )


Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #11 - 31 October 2012, 09:04:33
Bonjour,

J'ai essayer j'obtient un CTD lors de l'affichage du cockpit virtuel (et j'ai l'impression que que les lettres sont toujours transparentes).

voici le code :

Code: [Select]
bool SMV_Daedalus::RedrawPanel_CustomDisplay (SURFHANDLE surf)
{  
oapi::Sketchpad *skp = oapiGetSketchpad (surf);
char cbuf[1024];

        if (skp) {
            skp->SetFont(g_Param.hSkpFont);
            skp->SetTextColor(RGB(0, 255, 0));
            skp->SetTextAlign (oapi::Sketchpad::CENTER);
            skp->SetBackgroundMode (oapi::Sketchpad::BK_TRANSPARENT);

            sprintf (cbuf, "E.T téléphone maison");
   skp->Text(512, 512, cbuf, strlen(cbuf));

   oapiReleaseSketchpad(skp);
}

oapiReleaseFont (g_Param.hSkpFont);

return true;
}

Code: [Select]
DLLCLBK void InitModule (HINSTANCE hModule)
{
g_Param.hDLL = hModule;
oapiRegisterCustomControls (hModule);

// allocate GDI resources
g_Param.hFont[0] = CreateFont (-20, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, "Arial");

g_Param.hSkpFont=oapiCreateFont(12, true, "Sans");
}

Code: [Select]
DLLCLBK void ExitModule (HINSTANCE hModule)
{
int i;
// deallocate GDI resources
for (i = 0; i < 1; i++) DeleteObject (g_Param.hFont[i]);

oapiUnregisterCustomControls (g_Param.hDLL);

oapiReleaseFont (g_Param.hSkpFont);
}

Code: [Select]
typedef struct {
HINSTANCE hDLL;
HFONT hFont[1];   // utilisé par les labels mfd qui ne sont pas encore en sketchpad
oapi::Font *hSkpFont;
} GDIParams;

A+



Message modifié ( 31-10-2012 13:08 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #12 - 31 October 2012, 12:54:24
Quote
ea76620 a écrit:
Bonjour,

Code: [Select]
bool SMV_Daedalus::RedrawPanel_CustomDisplay (SURFHANDLE surf)
{  
oapi::Sketchpad *skp = oapiGetSketchpad (surf);
char cbuf[1024];

        if (skp) {
            skp->SetFont(g_Param.hSkpFont);
            skp->SetTextColor(RGB(0, 255, 0));
            skp->SetTextAlign (oapi::Sketchpad::CENTER);
            skp->SetBackgroundMode (oapi::Sketchpad::BK_TRANSPARENT);

            sprintf (cbuf, "E.T téléphone maison");
   skp->Text(512, 512, cbuf, strlen(cbuf));

   oapiReleaseSketchpad(skp);
}

oapiReleaseFont (g_Param.hSkpFont);

return true;
}

C'est normal tu release toujours ta font ici ^, accès suivant  handle qui pointe sur rien = CTD. J'avais marqué qu'il fallait aussi supprimer cette ligne.

Quote
DanSteph a écrit:
Code: [Select]
bool SMV_Daedalus::RedrawPanel_CustomDisplay (SURFHANDLE surf)
{
 ET oublie pas d'enlever:
         oapiReleaseFont (font);
}


A++

Dan



Message modifié ( 31-10-2012 12:55 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #13 - 31 October 2012, 13:21:55
Quote
 skp->Text(512, 512, cbuf, strlen(cbuf));

... et attention la t'est très vraisemblablement en dehors de ta texture qui fait 256x256.



Message modifié ( 31-10-2012 13:22 )


Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #14 - 31 October 2012, 13:30:24
Quote
DanSteph a écrit:
Quote
 skp->Text(512, 512, cbuf, strlen(cbuf));

... et attention la t'est très vraisemblablement en dehors de ta texture qui fait 256x256.

Non, ma texture fait 1024 x 1024 (peut être un peu trop gros).

Je n'ai plus de CTD (j'ai enlever la ligne en trop)

cependant bien que le texte s'affiche il est toujours transparent :



Quote
EDIT:
Regarde dans ton mesh si le matériel associé au group sur lequel tu dessines est légèrement transparent.

Si c'est ma texture qui est en cause comment je doit faire pour avoir une texture parfaite pour ce genre de chose?

En fait le texte est vert seulement sur les bords le reste est transparent.

Autre solution : comment faire pour que le texte ne soit pas en gras systématiquement?

A+



Message modifié ( 31-10-2012 13:31 )


Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #15 - 31 October 2012, 22:20:09
Bonjour,

Pour la transparence, c'est bien la texture (je l'avais mis en dds sans compression alors qu'il faut du dds DXT1)



Cependant une fois ce problème résolu, un autre arrive :

Au début l'écran du milieu affichait quelque chose mais dans le cockpit il y avait 1 FPS (pas super pratique pour piloter).

j'ai donc remplacé ma texture 1024 x 1024 par du 256 x 256 mais la rien ne s'affiche (mais le FPS est normal) j'ai essayé de placer le texte à différents endroits, sans succès.

Edit : j'ai oublié le code :

Code: [Select]
bool SMV_Daedalus::RedrawPanel_CustomDisplay (SURFHANDLE surf)
{  
    oapi::Sketchpad *skp = oapiGetSketchpad (surf);
    char cbufSD[256];

    if (skp) {
        skp->SetFont(g_Param.hSkpFont);
        skp->SetTextColor(RGB(0, 200, 0));
        skp->SetTextAlign (oapi::Sketchpad::CENTER);
        skp->SetBackgroundMode (oapi::Sketchpad::BK_TRANSPARENT);

sprintf (cbufSD, "E.T téléphone maison");
skp->Text(64, 64, cbufSD, strlen(cbufSD));

oapiReleaseSketchpad(skp);
    }

    return true;
}

Le font :

Code: [Select]
g_Param.hSkpFont=oapiCreateFont(25, true, "Sans");
Merci d'avance

Au revoir



Message modifié ( 31-10-2012 22:26 )


Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #16 - 01 November 2012, 00:17:33
ça marche !!

J'avais juste oublié de corriger ceci :

Code: [Select]
oapiVCRegisterArea (AID_CUSTOMDISPLAY, _R(0, 0, 256, 256), PANEL_REDRAW_ALWAYS, PANEL_MOUSE_LBDOWN, PANEL_MAP_BACKGROUND, tex2);


Je vais pouvoir mettre tout mes mfd en sketchpad

A+

ps : une des difficultés du c++, c'est qu'il faut penser à tout :)


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #17 - 01 November 2012, 07:35:54
Quote
ea76620 a écrit:
ps : une des difficultés du c++, c'est qu'il faut penser à tout :)

Yep :badsmile:

Oublie pas de mettre un "D" après les textures dynamique dans ton mesh, sinon ça risque de ramer.

Exemple:

Code: [Select]
TEXTURES 7
UniversalCars\ShuttleA\Indicator.dds D
UniversalCars\ShuttleA\fuelmgmt.dds D
UniversalCars\ShuttleA\MFD_buttons.dds D
UniversalCars\ShuttleA\A_VcInterior.dds
UniversalCars\ShuttleA\B_panel1.dds
UniversalCars\ShuttleA\C_panel2.dds
UniversalCars\ShuttleA\E_bordwindows.dds



Message modifié ( 01-11-2012 07:50 )


Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #18 - 01 November 2012, 13:21:45
Ok, je vais faire ça


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #19 - 01 November 2012, 16:17:49
Pour bien savoir ce que tu fais et pourquoi, juste l'extrait de la doc:

OrbiterSDK/Doc/3DModel.pdf
Quote
4.3  Texture list
...
...
...
If a texture is to be dynamically updated during the simulation (e.g. instrument pa
virtual cockpits), the texture name should be followed by the flag ‘D’. Orbiter will
decompress these textures to allow more efficient dynamic updates.

Dan



Message modifié ( 01-11-2012 16:18 )

« Last Edit: 01 November 2012, 16:44:01 by DanSteph »

Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #20 - 01 November 2012, 16:44:01
Ok, merci pour l'aide !!

J'ai essayer ça améliore les performances.



Message modifié ( 01-11-2012 16:44 )

« Last Edit: 01 November 2012, 16:44:01 by ea76620 »