Historique des modifications - Message

Message #2281

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


TypeDateAuteurContenu
Dernière modification15-05-2007 22:50:30Ravine
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 partwink
Création du message15-05-2007 22:32:00Ravine
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 partwink

Retour

OptionsLiens officielsCaractéristiquesStatistiquesCommunauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1441 sujets
11339 messages
Dernier membre inscrit: Saidov17
324 invités en ligne
membre en ligne: -
RSS Feed