#0 

15-05-2007 19:25:31

Ravine
Membre
Date d'inscription: 09-12-2006
Messages: 61

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


#1 

15-05-2007 19:53:13

DeusXL
Abonné
Lieu: Paris
Date d'inscription: 27-09-2006
Messages: 174

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 wink (même si bon, ça peut paraître lourdeau).


Fanatique d'Irrlicht + Fanatique de Mono + Fanatique de Linux => Créateur d'Irrlicht .NET CP bien sûr !
Version actuelle d'Irrlicht .NET CP : 0.8, Version en test : 0.9.

Hors ligne


#2 

15-05-2007 20:50:15

Ravine
Membre
Date d'inscription: 09-12-2006
Messages: 61

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 ....

wink

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 smile

Dernière modification par Ravine (15-05-2007 22:42:27)

Hors ligne


#3 

16-05-2007 00:32:00

Ravine
Membre
Date d'inscription: 09-12-2006
Messages: 61

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

Code:

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 :

Code:

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

Dernière modification par Ravine (16-05-2007 00:50:30)

Hors ligne


#4 

16-05-2007 07:51:21

DeusXL
Abonné
Lieu: Paris
Date d'inscription: 27-09-2006
Messages: 174

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 !


Fanatique d'Irrlicht + Fanatique de Mono + Fanatique de Linux => Créateur d'Irrlicht .NET CP bien sûr !
Version actuelle d'Irrlicht .NET CP : 0.8, Version en test : 0.9.

Hors ligne


#5 

16-05-2007 10:43:50

Ravine
Membre
Date d'inscription: 09-12-2006
Messages: 61

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


#6 

16-05-2007 16:17:49

DeusXL
Abonné
Lieu: Paris
Date d'inscription: 27-09-2006
Messages: 174

Autant pour moi alors c'est en effet une solution très sympathique à laquelle je n'avais pas pensé smile


Fanatique d'Irrlicht + Fanatique de Mono + Fanatique de Linux => Créateur d'Irrlicht .NET CP bien sûr !
Version actuelle d'Irrlicht .NET CP : 0.8, Version en test : 0.9.

Hors ligne


#7 

16-05-2007 22:12:05

Ravine
Membre
Date d'inscription: 09-12-2006
Messages: 61

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
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1426 sujets
11116 messages
Dernier membre inscrit: Bidule
14 invités en ligne
Aucun membre connecté
RSS Feed