L'explication promise:(mais d'abord un peu de morale
)
Comme dis mustard tu t'attaque a gros et il est impossible de te guider pour tout,
ca prendrais des pages et des pages. Je vais donc laisser tomber la modélisation
pour ca tu a des tutos partout. Oublie pas juste un truc, tu est en 3D temps réel,
si ca fait plus de 10'000 poly c'est pas génial. (DGIV fait 10'000 poly avec le
nouvel equipage mais chaque poly est bien dépensé il y a 67 parties animée)
(Pictoooo iléou le tuto de la 3d ???)
Le post de Jekka à raison d'un certain coté mais si tu fait tout tout seul en partant de presque zéro
tu risque de ramer salement et de ne connaitre qu'un vague succès d'estime a la sortie de
ton addons... un peu décourageant. (pour le premier addons c'est soit pas fini
car on a vu trop gros, soit relativement basique quand meme, d'ou le succès moyen)
Vu qu'on a pleins de bon modeleurs mais très peu de programmeur de dll pourquoi
ne pas focuser la dessus ? La modélisation c'est long aussi pour connaitre toutes
les ficelles. La prog tu est déja dans le bain et tu serait immortel vu la rareté des
programmeurs.
Avec quelques petit add-ons pour ce faire la main tu pourrait devenir programmeur
des models de papyref ou d'autre modeleur de talent par exemple et nous sortir
des trucs d'enfer ? "addon by Apofis and Papyref" ca a de la gueule aussi non ?
Pour en rajouter, je dirais que les addons intteressant ne sont pas forcement ceux qui ont
les plus beau modèles. Un mesh apollo super bien fait mais sans aucune fonction tout le
monde va s'emmerder avec au bout de 5mn. Le DGIII est assez moche comme modele
carré, angulaire, mais avec 67 animation et un panel complet c'est un des plus plebiscité.
Bon je ne force personne, je vais te répondre pour la prog. Je part du principe
que tu connais bien la programmation objet en C++.
Il y a deux source d'info pour la prog,
les header file et
la doc pdf (
API_Reference.pdf).
Pour les header file les deux indispensables à lire c'est :
OrbiterAPI.h et
VesselAPI.h a charger dans VC pour avoir la mise en page et les codes
couleurs (sinon c'est indigeste)
OrbiterAPI.h :A partir de la ligne "Orbiter API interface methods" tu trouve toutes les fonctions générale d'orbiter
que tu peu appeler dans ta DLL:
exemple:
OAPIFUNC double oapiGetPlanetPeriod (OBJHANDLE hPlanet);
OAPIFUNC double oapiGetPlanetObliquity (OBJHANDLE hPlanet);
// Camera functions
OAPIFUNC bool oapiCameraInternal ();
OAPIFUNC int oapiCameraMode ();
OAPIFUNC int oapiCockpitMode ();
OAPIFUNC void oapiGetNavPos (NAVHANDLE hNav, VECTOR3 *gpos);
OAPIFUNC DWORD oapiGetNavChannel (NAVHANDLE hNav);
Et etc tu a de tout la dedans et les nom sont très explicite. Pour les fonctions vaisseaux
elles sont ancienne et permettent un accès par handle exterieur a la classe de ton vaisseaux
il vaut mieu pour celle la regarder dans:
VesselAPI.h :contient toutes les fonctions que tu peu appeler *depuis ta classe de vaisseau*
c'est la
le coeur de ce que tu a besoin.
Vitesse, position, camera, load des mesh, manipulation, transformation, animation,
strobe, thruster, reservoirs, dimension, poids, aile, surface de controle, panel,
remplacement et manipulation des textures, virtual cockpit et j'en passe et des meilleurs,
ils sont tous la.
Il y a même ceux que tu cherchais, nos amis les callback que je vais t'expliquer ci-dessous.
Avant tout le mieux c'est que tu charge un exemple basique de la SDK d'orbiter par exemple
nous allons prendre le SHUTTLEA qui est encore simple mais deja assez complexe.
Charge le dans VC je vais t'expliquer en gros.
Donc une DLL est chargée par Orbiter, comment fonctionne une DLL on s'en bat les sboubs, ce qui est
utile de savoir c'est comment Orbiter travaille avec.
Orbiter a defini un certains nombre de classe et fonctions "virtuelle" qui si elle sont declaré dans la DLL
vont etre appellee par Orbiter a différents moment.
La premiere chose a faire donc c'est de dériver une classe a nous de la classe "VESSEL2"
d'orbiter ce qui est fais dans ShuttlA.h ici:
class ShuttleA: public VESSEL2 {On pourrait aussi bien marquer :
class Apofis: public VESSEL2 {Dedans tu a au moins un constructeur et un destructeur et des fonctions dérivée de fonction virtuelle
d'orbiter (appellée par Orbiter) et des fonction à nous, c'est notre classe on est libre
de travailler comme on veut.
Le constructeur et le destructeur serviront seulement a crée des ressource GDI pour les
affichage sur les panels, font, pen etc etc. et le destructeur à les detruire proprement.
Apres tout le boulot sera fait depuis des callbacks appelés par Orbiter dont voici la liste
qui est dans "vesselAPI.h" (vers la fin)
virtual void clbkSetClassCaps (FILEHANDLE cfg);
virtual void clbkSaveState (FILEHANDLE scn);
virtual void clbkLoadStateEx (FILEHANDLE scn, void *status);
virtual void clbkSetStateEx (const void *status);
virtual void clbkPostCreation ();
virtual void clbkFocusChanged (bool getfocus, OBJHANDLE hNewVessel, OBJHANDLE hOldVessel);
virtual void clbkPreStep (double simt, double simdt, double mjd);
virtual void clbkPostStep (double simt, double simdt, double mjd);
virtual bool clbkPlaybackEvent (double simt, double event_t, const char *event_type, const char *event);
virtual void clbkVisualCreated (VISHANDLE vis, int refcount);
virtual void clbkVisualDestroyed (VISHANDLE vis, int refcount);
virtual void clbkDrawHUD (int mode, const HUDPAINTSPEC *hps, HDC hDC);
virtual void clbkRCSMode (int mode);
virtual void clbkADCtrlMode (DWORD mode);
virtual void clbkHUDMode (int mode);
virtual void clbkMFDMode (int mfd, int mode);
virtual void clbkNavMode (int mode, bool active);
virtual void clbkDockEvent (int dock, OBJHANDLE mate);
virtual void clbkAnimate (double simt);
virtual int clbkConsumeDirectKey (char *keystate);
virtual int clbkConsumeBufferedKey (DWORD key, bool down, char *keystate);
virtual bool clbkLoadGenericCockpit ();
virtual bool clbkLoadPanel (int id);
virtual bool clbkPanelMouseEvent (int id, int event, int mx, int my);
virtual bool clbkPanelRedrawEvent (int id, int event, SURFHANDLE surf);
virtual bool clbkLoadVC (int id);
virtual bool clbkVCMouseEvent (int id, int event, VECTOR3 &p);
virtual bool clbkVCRedrawEvent (int id, int event, SURFHANDLE surf);
Comme le "virtual" l'indique elle sont virtuelle, il faut le declarer dans notre classe
pour qu'elle soient appellée exemple:
class ShuttleA: public VESSEL2 {
void clbkSetClassCaps (FILEHANDLE cfg);
Et voila, maintenant dans le fichier CPP tu declare le corps de ta fonction:
void ShuttleA::clbkSetClassCaps (FILEHANDLE cfg)
{
}
Cette fonction étant virtuelle elle sera appellée par Orbiter en temp voulue, les principales
dont tu a besoins sont:
clbkSetClassCaps (FILEHANDLE cfg)Appellée quand Orbiter crée ton vaisseau, on crée la dedans les ressources comme les thrusters,
les reservoir, on defini son vaisseau, taille, poid, le mesh utilisé pour l'affichage, et enfin on initialise
les variables de notre classe. (par exemple une variable qui garde le status des trains
d'atterissage, on les veut sorti par defaut donc par exemple "float Anim_Gear;" dans
notre classe et dans "SetClassCap" Anim_Gear=1;
void clbkLoadStateEx (FILEHANDLE scn, void *status);void clbkSaveState (FILEHANDLE scn);Les fonctions qui chargent et sauvent les scenarios qui contiennent tout le status de ton vaisseau.
Si il est crée par l'editor la fonction "loadstateEx" ne sera pas appellée d'ou l'importance d'initialiser
tes variables dans le "setclasscap" pour voir comment ca marche regarde dans l'exemple shuttleA.
void clbkPostStep (double simt, double simdt, double mjd);Appellée a chaque image, c'est la que ton "runtime" code doit etre. dedans tout ce qui a trait
au fonctionnement, test de crash, animations, pilotr automatique, controle du vaisseau etc etc.
C'est le runtime quoi...
Le "Post" est executé APRES la construction de la scene le "PRE" avant. si tu fait pas de trucs
bizarres l'un ou l'autre sont bon.
int clbkConsumeBufferedKey (DWORD key, bool down, char *keystate);Et la tu traite les frappe clavier. Exemple Le gars appuie "G" comme "GEAR" dedans tu intercepte
cette frappe et tu inverse la variable que tu a definie dans ta classe: ""Anim_Gear=!Anim_Gear"
Et dans ton "clbkPostStep" tu teste chaque image ta variable et si elle a changé tu rentre les trains...
Voila , avec ca tu tourne deja.
Marche a suivre:1-Essayer de piger l'exemple ShuttleA, voir comment "ils ont fait"
2-Quand tu comprend pas une fonction tu regarde dans la doc PDF exemple cherche "clbkLoadPanel"
dans le fichier "API_Reference.pdf"
3-Essaire de modifier cette exemple (pour fair le DGII j'étais parti de deltaglider et j'avais rajouté un bouton)
4-Par d'un exemple basique et crée ton addon entièrement.
5-Revient dans le forum sous les viva de la foule.
Entre la doc API_Reference.pdf les deux header mentionné et les exemples, tu a tout ce qu'il faut
pour démarrer.
Attention: si tu voit un callback ou une fonction avec "ovc" comme prefixe c'est qu'elle date des ancienne
version d'orbiter. Elle remplissent les meme fonction que les "clbk" , marchent toujours mais vont
etre desactivée pour les prochaines version d'orbiter.
Donc vaut mieu utiliser les virtuelle "clbk" que les "ovc"
J'ai peut être pas assez insisté sur la doc:
Regarde les exemples et cherche ce que tu ne comprend pas
dans la doc de reference "API_Reference.pdf " par contre si tu cherche un fonction dans un but precis
il vaut peut etre mieux regarder dans les deux header, la c'est une liste et pas une doc de 200 pages. Plus facile.
Voila...
Bonne chance
Dan
Message modifié ( 19-12-2006 00:28 )