Historique des modifications - Message

Message #2281

Sujet: Changement de résolution a la volée.


Type Date Auteur Contenu
Dernière modification 15-05-2007 22:50:30 Ravine
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. smile

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 wink
Création du message 15-05-2007 22:32:00 Ravine
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. smile

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 wink

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
129 invités en ligne
membre en ligne: -
RSS Feed