Bonjour,
Voilà, il y a une fonction que j'utilise intensivement dans mon application : irr::gui::IGUIFont::draw.
J'ai remarqué, que quand j'affiche du texte le nombre de FPS, chute brutalement.
J'ai donc été voir l'implémentation de cette fonction. La voici :
//! draws some text and clips it to the specified rectangle if wanted void CGUIFont::draw(const wchar_t* text, const core::rect<s32>& position, video::SColor color, bool hcenter, bool vcenter, const core::rect<s32>* clip) { if (!Driver) return; core::dimension2d<s32> textDimension; core::position2d<s32> offset = position.UpperLeftCorner; core::rect<s32> pos; if (hcenter || vcenter || clip) textDimension = getDimension(text); if (hcenter) offset.X = ((position.getWidth() - textDimension.Width)>>1) + offset.X; if (vcenter) offset.Y = ((position.getHeight() - textDimension.Height)>>1) + offset.Y; if (clip) { core::rect<s32> clippedRect(offset, textDimension); clippedRect.clipAgainst(*clip); if (!clippedRect.isValid()) return; } while(*text) { SFontArea& area = Areas[getAreaFromCharacter(*text)]; offset.X += area.underhang; SpriteBank->draw2DSprite(area.spriteno, offset, clip, color); offset.X += area.width + area.overhang + GlobalKerningWidth; ++text; } }
Dans mon application, je n'utilise pas les alignements (hcenter, vcenter etc...).
Donc j'ai fait une autre fonction. Je n'ai pas surcharger celle-ci, j'ai juste mis une autre fonction : display().
//! Draw a text // MODIFICATION // void CGUIFont::display(const wchar_t *text, const core::rect<s32> &position, video::SColor color) { core::position2d<s32> offset = position.UpperLeftCorner; while(*text) { SFontArea& area = Areas[getAreaFromCharacter(*text)]; offset.X += area.underhang; SpriteBank->draw2DSprite(area.spriteno, offset, 0, color); offset.X += area.width + area.overhang + GlobalKerningWidth; ++text; } }
J'ai recompilé Irrlicht, juste en debug pour l'instant. Je n'ai rien modifié d'autre mis à part l'ajout de cette fonction.
J'ai également modifié le nom de la dll générée, pour éviter de toucher à l'originale. (en passant)
J'ai recompilé mon application avec la version que j'ai modifié.
Et je me retrouve avec une " erreur de segmentation ".
Qui n'a à priori aucun rapport avec la modification que j'ai apportée dans le moteur.
Je ne demande pas à ce que vous tentiez de résoudre ce problème, je ne rajoute donc pas plus d'éléments.
Je voulais juste savoir comment vous y prendriez vous, pour modifier le moteur ?
Merci et a plus.
PS : Un truc bizarre dans la fonction issue d'Irrlicht est cette variable : core::rect<s32> pos;
elle ne semble pas être utilisée dans la fonction. Donc ??, je sais pas lol
EDIT : C'est un oubli, elle ne sera plus là dans la version 1.5
PS2 : Je suis bien conscient que cette modification n'améliorera pas miraculeusement la vitesse de l'application(quoique un peu quand même..) la question n'est pas là !
Dernière modification par Stobbyo (11-12-2008 18:08:16)
Hors ligne
Bonsoir Stobbyo. Je n'ai jamais ajouté de fonction au moteur pour le moment. Mais j'ai déjà compilé moi-même le moteur et sans soucis apparent.
Donc pas d'erreur lors de l'exécution des exemples avec la DLL compilée 'maison'. J'ai modifié deux trois truc pour le fun sans non plus rencontrer
de problèmes.
Avant d'intégrer ta propre fonction, as-tu déjà essayer de re-compiler le moteur tel qu'il est pour voir ce cela donne ?
Hors ligne
Salut
Je n'ai jamais compiler le moteur tel quel, je vais essayer de suite.
J'ai posté un message sur le forum anglais, mais je n'ai pas compris toute la réponse lol.
rogerborg :
Are you sure that you are linking against the rebuilt libIrrlicht.a? There's a problem in Irrlicht 1.4.2 in that the lib is actually built in /bin/Win32-gcc or /bin/Linux-gcc instead of /lib.
I'd delete all libIrrlicht.a / Irrlicht.dll / Irrlicht.so files in your /bin and /lib trees and build again to be sure.
Pour compiler, j'ai créé un nouveau dossier, j'ai copié/collé le répertoire " include ", et le fichier " source "
dans ce dossier.
J'ai ouvert l'espace de travail pour Code::Blocks contenu dans les fichiers sources, modifié les options du compilateur. Et voilà.
J'explique ça parce que c'est peut être pas comme ça qu'il faut faire.
En tout cas je te remercie pour ton aide.
Je donnerai des nouvelles dans ce sujet.
A la prochaine.
Hors ligne
Stobbyo :
J'ai ouvert l'espace de travail pour Code::Blocks contenu dans les fichiers sources, modifié les options du compilateur. Et voilà.
Arrrff, voilà déjà une différence entre nous deux, moi je n'utilise pas CodeBlock, mais VC++. Pour ce qui est de codeblock, effectivement, je ne vais pas
être d'un grand secours
Hors ligne
pour ton erreur de segmentation fait un petit rebuild des fois sa suffi
sinon pour modifier le moteur personnellement je préfère le faire a l'intérieur de mon application ...
sa permet de garder irrlicht intact ( pratique pour svn )et de pouvoir debuger plus rapidement
class MYGUIFont : public IGUIFont
{
.......
};
Hors ligne
Compilation réussie ..
Ok Magun, je suis d'accord. Je sais pas ce que j'ai contre l'héritage lol (cf : Pointeur fonctions dans une classe )
Merci à vous,
A plus.
Hors ligne