Bonjour bonjour.
Je suis actuellement en train de bosser sur une petite appli de type map builder (une sorte de Aurora Toolset de Neverwinter Nights, en super simple et totalement dédié a mon projet de jeu). Comme je prévois d'utiliser irrlicht dans le jeu, je me dis que ça serait foncierement idiot de ne pas faire de meme dans cet outil. Hop hop, je fais mes pitites bidouilles avec les winforms hop, ça prend forme
ça donne ça pour l'instant
Un souci cependant. Bon c'est un outil, donc ça demande de pouvoir etre resize et tout, en fonction des besoins, etc.
Ok, je resize. Ok y'a un souci.. L'a pas l'air tres cubique ce cube. Bon en farfouillant, vu que je crée le device au shown du bouzin, c'est normal, il a prit commes parametres de width / height ceux de son panel (je l'ai attaché au handler d'un panel). Ok. Maintenant je suis un peu embeté, parce que je ne trouve pas où dire au device de changer de resolution a la volée.
Si quelqu'un a la réponse a cette petite colle, il gagnera ma reconnaissance éternelle.
Hors ligne
Sauf erreur c'est impossible de resizer le tout... Maintenant le plus simple est de faire un Render To Texture et de changer la taille de la texture à la volée (même si bon, ça peut paraître lourdeau).
Hors ligne
Hum, je craignais ce genre de réponse. Je pense que je vais faire encore plus lourd (a savoir recreer le device sur un resize). Aaah c'est casse bonbon ce genre de trucs ....
EDIT : en cherchant des infos sur une hypothétique méthode de changement de résolution a la volée, je suis tombé sur les viewport. Je vais creuser dans cette direction, il se peut que ça convienne a ce que je souhaite faire.
RE-EDIT : quelques soucis avec les viewports, j'ai laissé tombé. Cependant, en explorant, je suis tombé sur l'aspect ratio de la camera... expérimentations en cours
Dernière modification par Ravine (15-05-2007 22:42:27)
Hors ligne
Je me réponds a moi meme apres recherches et tests.
Donc, je résume : j'ai mon irrlicht dans un control winform (ici dans un panel, dont on peut récuperer aisément les width et height). Quand je resize mon winform, je veux garder le ratio. Toute la subtilité est dans la caméra (et non pas dans le device, qui est bien ou il est).
C'est d'une telle simplicité que j'en suis presque vexé d'avoir passé autant de temps dessus (bon j'ai surtout perdu du temps sur un détail, dont je vous ferai mention un peu plus loin).
J'ai mon device de créé, un sceneManager et une camera d'attaché. Pour des besoins de tests, je mets donc un cube. Le tout est donc de remettre a jour l'aspect ratio de la camera
private void UpdateAspectRatio(CameraSceneNode camera, float x, float y) { float aspect = (x / y); camera.AspectRatio = aspect; }
vala. C'est tout con, c'est juste ça.
La subtilité (qui m'a fait perdre 2 /3 bonnes heures) c'est le choix de l'event qui doit appeler cette méthode. Comme dans ma tete c'etait "en resizant, je mets a jour", j'avais calé ça sur l'event "ResizeEnd" du winform. Ok, ça marche quand on resize a la main, mais quand on passe en Fullscreen, cet event n'est jamais appelé (on a pas resize, on est passé en fullscreen, détail non négligeable). Donc on se dit "raaah ça marche pas c'est nul !" et on cherche des heures sur des histoires de fov ou de merdouilles du genre alors qu'en faisant :
private void Panel_SizeChanged(object sender, EventArgs e) { UpdateAspectRatio(cam, (float)this.Panel1.Width, (float)this.Panel1.Height); }
tout marche au poil. Vous noterez le cast en float sur le width et height du panel. En effet, si on cast le float dans UpdateAspectRatio, sur le résultat de x/y (c.a.d float aspect = (float) x/y; ) on cast sur la partie entiere de cette division (les valeurs width et height des controles winform etant en int), et donc on recup soit 1, soit 2 (ou 0, ce qui est vachement moins fun)
EDIT : ahaha comme quoi, rien ne marche jamais comme il faut. Du coup j'appelle ça sur le Panel_SizeChanged, parce que quand je m'amuse a bouger les splitter, forcément, je ne touche pas au winform... grmlmlml... comme c'est parti, dans 1h je re-édite parce que je viens de tilter que je me suis encore planté quelque part
Dernière modification par Ravine (16-05-2007 00:50:30)
Hors ligne
Très bonne idée pour ne pas déformer... Cependant la taille du viewport n'a pas changé et tu risque de voir le tout se pixelliser... M'enfin c'est déjà ça !
Hors ligne
Hum, je n'utilise pas explicitement de viewport. Tu parles de la projection créée par la camera ? En tout cas, pour voir large, j'initialise mon device a la creation de la winform (au moment de l'event shown), avec les parametres du bureau courant (SystemInformation.PrimaryMonitorSize.Width, et SystemInformation.PrimaryMonitorSize.Height). J'ai donc mon device qui est créé avec "la plus grande résolution courante possible". (oui, si l'utilisateur change de résolution, c'est plus vrai, mais on va dire que ça marche). Tout de suite apres, j'appelle mon update de camera.
Enfin, je ne vois pas trop ce qui pourrait se pixelliser. Tu peux développer un peu ?
Hors ligne
Autant pour moi alors c'est en effet une solution très sympathique à laquelle je n'avais pas pensé
Hors ligne
Bon, par contre je seche sur un autre probleme. Comme ecrit dans le tuto, on a un beau while(device.Run() ) { update du screen,etc } a la fin du shown
c'est génant du coup, parce que dans le cas de mon appli winform, ça n'est pas irrlicht qui drive l'appli. L'attente ne se fait pas dans cette boucle device.Run(), mais au niveau de l'application et de son point d'entrée (le Application.Run(new Form1() ); de Program.cs.). Du coup j'ai "une boucle dans ma boucle". J'ai bien essayé de passer par une méthode "a la managed DirectX", a savoir creer un timer et appeler l'update dans le OnPaint de la winform, mais j'ai un gros peak sur le CPU, je perds le focus, bref c'est le bazar.
Coup de fatigue et tout, je suis a court d'idée pour eviter de dépendre de cette boucle. "ça marche", mais pas comme je voudrais. Si vous avez des idées...
Hors ligne
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 56 invités en ligne Aucun membre connecté RSS Feed |