Historique des modifications - Message

Message #5173

Sujet: Modifier certaines fonctions du moteur


Type Date Auteur Contenu
Dernière modification 11-12-2008 17:08:16 Stobbyo
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 hmm
EDIT : C'est un oubli, elle ne sera plus là dans la version 1.5 smile

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à !
Création du message 11-12-2008 13:37:30 Stobbyo
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 hmm
EDIT : C'est un oubli, elle ne sera plus là dans la version 1.5 smile

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à !

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
114 invités en ligne
membre en ligne: -
RSS Feed