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++][Meshes] Problème de texture de label mal placé  (Read 4586 times)

0 Members and 1 Guest are viewing this topic.

Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
12 August 2012, 16:23:00
Bonjour,

J'ai déjà résolue plusieurs problèmes avec les labels des MFD mais là j'ai vraiment un gros :





J'ai vérifié plusieurs fois les n° des groupes et ils sont bons pourtant la texture des labels s'affiche n'importe ou (voir photo).

Le code :

dans le .h

Code: [Select]
typedef struct {
HINSTANCE hDLL;
HFONT hFont[1];
HPEN hPen[2];
HBRUSH hBrush[1];
} GDIParams;

// Some mesh groups referenced in the code
#define MESHGRP_VC_LMFDDISP       2
#define MESHGRP_VC_RMFDDISP       3

#define AID_MFD1_LBUTTONS       7
#define AID_MFD1_RBUTTONS       6
#define AID_MFD2_LBUTTONS       4
#define AID_MFD2_RBUTTONS       5

#endif // !__HST_H

dans le .cpp

Code: [Select]
bool supplymodule::clbkLoadVC (int id)
{
     static VCMFDSPEC mfds_left  = {1, MESHGRP_VC_LMFDDISP};
static VCMFDSPEC mfds_right = {1, MESHGRP_VC_RMFDDISP};
     id = 0;
SetCameraDefaultDirection (_V(0,0,1));
oapiVCRegisterMFD (MFD_LEFT, &mfds_left);   // left MFD
oapiVCRegisterMFD (MFD_RIGHT, &mfds_right); // right MFD
SURFHANDLE tex1 = oapiGetTextureHandle (vcmesh_tpl, 7);
SURFHANDLE tex2 = oapiGetTextureHandle (vcmesh_tpl, 6);
SURFHANDLE tex3 = oapiGetTextureHandle (vcmesh_tpl, 4);
SURFHANDLE tex4 = oapiGetTextureHandle (vcmesh_tpl, 5);
oapiVCSetNeighbours (-1, 1, -1, 2);
//InitPanel(-1);// VC is -1

// MFD controls on the front panel
oapiVCRegisterArea (AID_MFD1_LBUTTONS, _R(0, 0, 254, 254), PANEL_REDRAW_MOUSE, PANEL_MOUSE_LBDOWN, PANEL_MAP_BACKGROUND, tex1);
oapiVCSetAreaClickmode_Quadrilateral (AID_MFD1_LBUTTONS, _V(1.37,-0.41,2.71), _V(1.37,-0.41,2.69), _V(1.37,-0.58,2.71), _V(1.37,-0.58,2.69)); //Top left, Top Right, Bottom Left, Bottom Right
oapiVCRegisterArea (AID_MFD1_RBUTTONS, _R(0, 0, 254, 254), PANEL_REDRAW_MOUSE, PANEL_MOUSE_LBDOWN, PANEL_MAP_BACKGROUND, tex2);
oapiVCSetAreaClickmode_Quadrilateral (AID_MFD1_RBUTTONS, _V(1.37,-0.41,2.31), _V(1.37,-0.41,2.29), _V(1.37,-0.58,2.31), _V(1.37,-0.58,2.29));
oapiVCRegisterArea (AID_MFD2_LBUTTONS, _R(0, 0, 254, 254), PANEL_REDRAW_MOUSE, PANEL_MOUSE_LBDOWN, PANEL_MAP_BACKGROUND, tex3);
oapiVCSetAreaClickmode_Quadrilateral (AID_MFD2_LBUTTONS, _V(1.37,-0.41,2.21), _V(1.37,-0.41,2.19), _V(1.37,-0.58,2.21), _V(1.37,-0.58,2.19));
oapiVCRegisterArea (AID_MFD2_RBUTTONS, _R(0, 0, 254, 254), PANEL_REDRAW_MOUSE, PANEL_MOUSE_LBDOWN, PANEL_MAP_BACKGROUND, tex4);
oapiVCSetAreaClickmode_Quadrilateral (AID_MFD2_RBUTTONS, _V(1.37,-0.41,1.81), _V(1.37,-0.41,1.79), _V(1.37,-0.58,1.81), _V(1.37,-0.58,1.79));
     return true;
}

bool supplymodule::clbkVCMouseEvent (int id, int event, VECTOR3 &p)
{
static int ctrl = 0, mode = 0;
static double py = 0;

// Process other controls
switch (id) {
case AID_MFD1_LBUTTONS:
case AID_MFD1_RBUTTONS:
case AID_MFD2_LBUTTONS:
case AID_MFD2_RBUTTONS:
{
double dp;
if (modf (p.y*23.0/4.0, &dp) < 0.75) {
int mfd = (id <= AID_MFD1_RBUTTONS ? MFD_LEFT : MFD_RIGHT);
int bt = (int)dp + (id == AID_MFD1_LBUTTONS || id == AID_MFD2_LBUTTONS ? 0 : 6);
oapiProcessMFDButton (mfd, bt, event);
return true;
}
} break;
        }
}

void supplymodule::clbkMFDMode (int mfd, int mode)
{
switch (mfd) {
case MFD_LEFT:
oapiTriggerRedrawArea (0, 0, AID_MFD1_LBUTTONS);
oapiTriggerRedrawArea (0, 0, AID_MFD1_RBUTTONS);
break;
case MFD_RIGHT:
oapiTriggerRedrawArea (0, 0, AID_MFD2_LBUTTONS);
oapiTriggerRedrawArea (0, 0, AID_MFD2_RBUTTONS);
break;
}
}

bool supplymodule::clbkVCRedrawEvent (int id, int event, SURFHANDLE surf)
{
switch (id) {
case AID_MFD1_LBUTTONS:
RedrawPanel_MFDButton (surf, MFD_LEFT, 0);
return true;
case AID_MFD1_RBUTTONS:
RedrawPanel_MFDButton (surf, MFD_LEFT, 1);
return true;
case AID_MFD2_LBUTTONS:
RedrawPanel_MFDButton (surf, MFD_RIGHT, 0);
return true;
case AID_MFD2_RBUTTONS:
RedrawPanel_MFDButton (surf, MFD_RIGHT, 1);
return true;
}
return false;
}
void supplymodule::RedrawPanel_MFDButton (SURFHANDLE surf, int mfd, int side)
{
HDC hDC = oapiGetDC (surf);
SelectObject (hDC, g_Param.hFont[0]);
SetTextColor (hDC, RGB(0, 200, 0));
SetTextAlign (hDC, TA_CENTER);
SetBkMode (hDC, TRANSPARENT);
const char *label;
for (int bt = 0; bt < 6; bt++) {
if (label = oapiMFDButtonLabel (mfd, bt+side*6))
TextOut (hDC, 256, 42*bt, label, strlen(label));
else break;
}
oapiReleaseDC (surf, hDC);
}

Code: [Select]
// ==============================================================
// API callback interface
// ==============================================================
// --------------------------------------------------------------
// Module initialisation
// --------------------------------------------------------------
DLLCLBK void InitModule (HINSTANCE hModule)
{
g_Param.hDLL = hModule;
oapiRegisterCustomControls (hModule);

// allocate GDI resources
g_Param.hFont[0] = CreateFont (-10, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 0, "Arial");
g_Param.hPen[0] = CreatePen (PS_SOLID, 3, RGB (120,220,120));
g_Param.hPen[1] = CreatePen (PS_SOLID, 1, RGB (220,220,120));
g_Param.hBrush[0] = CreateSolidBrush (RGB(0,128,0));
}

// --------------------------------------------------------------
// Module cleanup
// --------------------------------------------------------------
DLLCLBK void ExitModule (HINSTANCE hModule)
{
int i;
// deallocate GDI resources
for (i = 0; i < 1; i++) DeleteObject (g_Param.hFont[i]);
for (i = 0; i < 2; i++) DeleteObject (g_Param.hPen[i]);
for (i = 0; i < 1; i++) DeleteObject (g_Param.hBrush[i]);

oapiUnregisterCustomControls (g_Param.hDLL);
}

Se peut il que ce soit un problème dans ma mesh?

Je peux l'envoyer par mail, mais je ne la met pas dans le post, car elle comporte plus de 2000 lignes.

Merci d'avance

A+



Message modifié ( 12-08-2012 16:48 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #1 - 12 August 2012, 18:35:07
Si tu as changé des trucs dans le mesh c'est possible que les no de groupes soient tous décallés.
Pour éviter cela mon exporteur 3dsmax exporte aussi un fichier C++ header avec les no de groupe:
plus besoin de faire attention.

Si t'as pas ce genre de truc avec ton exporteur à chaque modif du mesh faudra controler les no de groupe.

Dan


Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #2 - 12 August 2012, 18:39:37
J'ai vérifié plusieurs fois les numéros des groupes avec mesh wizard et ils correspondent, c'est ça le pire.

J'utilise anim8tor et j'exporte avec 3ds2msh

Les labels s'affichent n'importe ou (mais plutôt sur des mesh assez grande).



Message modifié ( 12-08-2012 18:58 )


Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #3 - 12 August 2012, 19:10:56
Quelques images pour illustrer la situation :

Ici, on peut voir les numéros des groupes dans mesh wizard :



Ils correspondent bien à ceci :

Code: [Select]
#define AID_MFD1_LBUTTONS       7
#define AID_MFD1_RBUTTONS       6
#define AID_MFD2_LBUTTONS       4
#define AID_MFD2_RBUTTONS       5

Cependant j'ai ça :





Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #4 - 13 August 2012, 02:16:26
Attention ! La fonction oapiGetTextureHandle() demande l'index de la texture, et non du groupe ! L'index de texture commence à 1 (non pas à 0 comme les groupes) et peut être déterminé avec les dernières lignes d'un mesh. Par exemple, le mesh ShuttlePB.msh a ceci à la fin :

Code: [Select]
TEXTURES 2
shuttlepb.dds
shuttlepbwing.dds

La texture "shuttlepb.dds" est à l'index 1 et la texture shuttlepbwing.dds est à l'index 2.

Aussi, essaies d'éviter la GDI. Elle crée de l'incompatibilité avec les clients graphiques. Préfère utiliser le oapi::Sketchpad. Tu pourrais avoir quelque chose du genre :

Code: [Select]
oapi::Sketchpad* skp = oapiGetSketchpad (surf);
skp->SetFont(g_Param.hFont[0]);
skp->SetTextColor (RGB(0, 200, 0));
skp->SetTextAlign (CENTER, BASELINE);
skp->SetBackgroundMode (BK_TRANSPARENT);
const char *label;
for (int bt = 0; bt < 6; bt++) {
if (label = oapiMFDButtonLabel (mfd, bt+side*6))
skp->Text(256, 42*bt, label, strlen(label));
else break;
}
oapiReleaseSketchpad(skp);

Ce code n'a aucunement été testé et devra probablement être modifié, mais ça peut te donner une idée. Remarque qu'à skp->SetFont(), je présume que g_Param.hFont[0] a été créé avec la fonction oapiCreateFont qui retourne un oapi::Font.


É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 #5 - 13 August 2012, 10:47:21
Bonjour,

Merci pour la réponse.

Cependant je ne sais pas trop comment utiliser oapi::Sketchpad connaissez vous un exemple ou tuto pour l'utiliser?

Merci d'avance

Au revoir.


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #6 - 13 August 2012, 16:10:42
Quote
ea76620 a écrit:
Quelques images pour illustrer la situation :

Ici, on peut voir les numéros des groupes dans mesh wizard :

Ils correspondent bien à ceci :

Code: [Select]
#define AID_MFD1_LBUTTONS       7
#define AID_MFD1_RBUTTONS       6
#define AID_MFD2_LBUTTONS       4
#define AID_MFD2_RBUTTONS       5


Mhhh dépend l'exporteur ça peut ne plus correspondre du tout.
3DsMax les exportes dans l'ordre interne de numérotation et pas du tout selon un nom de groupe.
Quand à Orbiter lui c'est l'ordre dans le mesh.

C'est pour cela que mon exporteur crée un fichier "header" que j'integre dans mon projet C++. J'utilise plus du tout les no mais les noms de groupe.

MeshHeader.h
Code: [Select]
#define GRP_Lighted 0
#define GRP_GrisFonce 1
#define GRP_MainArriere 2
#define GRP_ANIM_BayDoorLeft 3
#define GRP_ANIM_BayDoorRight 4
#define GRP_ANIM_PorteAzure 5
#define GRP_Noir 6
#define GRP_ANIM_Ascensceur 7
#define GRP_ANIM_Roues 8
#define GRP_ANIM_VitreRoue 9

Regarde si ton exporteur à une fonctionnalité dans le genre ou une fonction de tri ?
Sinon à chaque export tu va devoir controller ou/et changer les no...



Message modifié ( 13-08-2012 16:12 )


Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #7 - 13 August 2012, 21:11:43
Quote
Regarde si ton exporteur à une fonctionnalité dans le genre ou une fonction de tri ?

Non je n'ai pas ça avec 3DStoMSH (j'utilise anim8or avec lequel j'exporte d'abord en .3DS

Quel exporteur utiliser vous ? Qu'est ce que vous  me conseiller avec anim8or?


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15410
  • Karma: 266
  • Hein, quoi !?
    • FsPassengers
Reply #8 - 14 August 2012, 00:06:06
Essaie cet exporteur qui t'évitera le process ->3DS->Msh
http://www.orbithangar.com/searchid.php?ID=2698

Avoir les bon outils et un environnement de travail efficace est un préalable.

Pour les groups number j'ai rien trouvé après une rapide recherche, ça ne passionne pas les foules visiblement. L'exporteur 3dsmax n'exportait pas non plus un fichier C++ header j'ai du le rajouter en éditant le script.

J'ai regardé le script de Urwump on peut rajouter cette fonctionnalité. Mais là je n'ai pas le temps et pas anim8tor en plus pour tester.

Va falloir que tu te casse un peu la nenette à retrouver tes no ou une méthode pour qu'il ne changent pas trop.
(Dans 3dsmax tant que tu delete pas un group au milieu ça change pas)


Dan



Message modifié ( 14-08-2012 00:11 )


Offline jacquesmomo

  • Le budget !!!
  • Legend
  • ******
  • Posts: 7896
  • Country: France fr
  • Karma: 731
  • Plus on rate, plus on a de chances de réussir !..
Reply #9 - 14 August 2012, 11:38:50
C'est vrai que cette histoire de n° de groupes...

Pour ma part, j'utilise donc animator averc le pluggin spécifié par Dan.
Mais là aussi, une fois convertis, les groupes ne sont pas forcément dans l'ordre initial, j'avoue ne pas avoir compris pourquoi, mais je n'ai pas cherché.

Donc pour remettre de l'ordre dans tout ça, après avoir transfomé objet.an8=>objet.msh soit j'édite "à la main" le fichier et je fais du copier/coller pour remettre un peu d'ordre, soit j'utilise MeshWizard qui a une fonction "swap group" qui permet de remettre de l'ordre, mais c'est assez fastidieux car c'est groupe par groupe...

Eh oui c'est long, mais on y arrive...


Mes add-ons sont là !

Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #10 - 14 August 2012, 11:43:42
Mais comment savoir les groupes qu'il faut intervertir?


Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #11 - 14 August 2012, 16:47:07
Mais il reste que tu n'as pas besoin des numéros de groupe, comme je l'ai écrit précédement. Pour obtenir une surface modifiable avec oapiGetTextureHandle(), il faut spécifier le numéro de texture. Relis mon dernier post pour l'explication des numéros de texture.


« Last Edit: 14 August 2012, 18:38:40 by Bibi Uncle »
É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 #12 - 14 August 2012, 18:00:34
Ah oui Bibi à raison sur ce bug, c'est bien le No de texture. Désolé je fais 12'000 trucs en même temps

Par contre t'as gagné un exporteur bien moins chiant ;)

Sinon pour retrouver les no, texture ou groupe y a que l'examen du fichier mesh ou le test empirique. Avec peu de groupes /textures c'est pas trop chiant.

« Last Edit: 14 August 2012, 18:38:40 by DanSteph »

Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #13 - 14 August 2012, 18:38:40
Quote
il faut spécifier le numéro de texture. Relis mon dernier post pour l'explication des numéros de texture.

Quote
Ah oui Bibi à raison sur ce bug, c'est bien le No de texture

Merci, à vous deux, c'était bien ça. Vous gagnez un voyage orbital gratos à bord de la futur capsule "deadalus" en projet.

« Last Edit: 14 August 2012, 18:38:40 by ea76620 »