IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

Afficher du texte en 2D mais avec opérations géométriques (dilatation ou contraction)


Sujet :

DirectX

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 171
    Points : 91
    Points
    91
    Par défaut Afficher du texte en 2D mais avec opérations géométriques (dilatation ou contraction)
    Bonjour,

    Je souhaite réaliser une appli très simple avec directx (en c++) qui consisterait à faire défiler horizontalement du texte en 2D, mais le texte doit être étiré pour entrer en dans le rectangle que je lui impose.

    Je pensais procéder ainsi : charger la font (LPD3DXFONT) par exemple Arial, créer un sprite, récupérer sa surface pour écrire dessus (en la mettant en target du device et en utilisant drawtext) puis afficher le sprite en l'étirant à ma guise.

    Seulement ca n'a pas l'air de marcher. D'abord parce que DrawText ne fonctionne pas (il renvoie erreur 13 : "média protégé en écriture") et ensuite car je ne sais pas comment étirer le sprite final.

    Est-ce que je pars sur une bonne piste par rapport à mon objectif ou voyez-vous une solution plus simple?
    Quelle est la procédure à utiliser pour drawtext?

    Vous l'aurez deviné, je débute en directX! Et je me sens un peu comme un poisson hors de l'eau face à ce monstre technique.

    Merci d'avance pour vos réponses!

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    'Alut.

    Il y a la fonction D3DXCreateText qui crée du texte sur un mesh. A toi ensuite d'appliquer les matrices World nécessaires. (voir le sample Text3D)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 171
    Points : 91
    Points
    91
    Par défaut
    D3DXCreatetexte est trop gourmande pour mon utilisation, je préfère en rester à des choses simples 2D.

    J'ai réussi à faire ce dont je vous parlais hier, à savoir écrire du texte dans une texture et l'appliquer à un sprite dont je spécifie les dimensions.

    Seulement j'ai un nouveau problème, de fuite mémoire cette fois. En effet, la font était créée à l'initialisation et je la gardais tout au long de l'exécution, mais ceci induit des énormes fuites mémoires (le programme monte rapidement à des centaines de Mo de ram). Au contraire, si je reconstruis la font à chaque Render, en la Releasant à la fin, aucune fuite mémoire mais un temps incroyable passé dans le render (40ms et donc un fps bien faible) et un processeur bien chargé.

    Vous voyez où peut-se situer le souci?

    Je ne comprends vraiment pas les fuites mémoires, car je suis certain qu'elles viennent de la font, comme si elle était recréée à chaque fois sans être relachée. D'un autre côté, je ne peux pas me permettre de recréer la font à chaque render.

    Désolé pour la longueur... et merci d'avance pour vos conseils éclairés!

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 171
    Points : 91
    Points
    91
    Par défaut
    Bon après recherche sur Internet, paraitrait-il que la fonction drawtext induirait des fuites mémoires pour certains caractères de certaines polices. Avec Swenson, les fuites mémoires étaient scandaleuses, et en revenant à Arial, tout se passe nickel.
    Mais c'est moche, bien entendu.

    Ca dit qq chose à qq'un cette histoire louche de fuite mémoire avec drawtext? Ce serait en rapport avec le cache de la font, mais je ne vois pas comment le vider...

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    Comme explique ici, DX garde en cache les mots utilisés afin de pouvoir les rendre plus rapidement les prochaines frames.

    Afin de vider le cache, il faut périodiquement releaser la font puis la recréer

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 171
    Points : 91
    Points
    91
    Par défaut
    Merci!
    je vais opter pour une autre solution : construction de la table des caractères dans une texture à l'initialisation et j'irais piocher dedans ensuite. Au moins je me débarasse de cette p*tain de font. Mais c'est vrai qeu ca risque d'être moins beau...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 171
    Points : 91
    Points
    91
    Par défaut
    Hey, c'est encore moi. Je me permets d'animer un peu ce topic.

    Bon, j'ai parlé un peu vite, c'est aps encore résolu. Je me heurte à un pb : les caractéristiques des caractères. C'est-à-dire que pour créer ma table de caractères (une texture en fait), je dois connaître avec précision les dimensions des caractères.
    J'ai essayé avec drawText en mode DT_CALCRECT mais le rectangle renvoyé est un poil trop court, et maintenant j'essaie avec getGlyphData pour récupérer la "Black Box" mais celle-ci a une largeur bcp trop grande!

    Quelqu'un aurait une idée pour récupérer les infos d'un caractère pour une font donnée?

    (Si vous voyez pas, vous en faites pas je reviendrai surement dans qq heures avec la réponse.)

    Merci d'avance pour vos réponses!

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    A mon avis tu devrais trouver la réponse quelque part ici...

    C'est un moteur 3D assez mal foutu et franchement dépassé, mais bon ça peut parfois aider....

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 171
    Points : 91
    Points
    91
    Par défaut
    Hum pas mal merci!

    Mais cette solution implique de créer une HFONT en plus de mon ID3DXFONT, ce qui fait bcp! personne ne sait comment récupérer les infos directement à partir d'une ID3DXFONT?
    Le cas contraire, j'adopterai ta solution je crois bien...

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    J'ai pas vérifié si c'est la bonne fonction, mais quelque part dans le tuto, il y a :

    // Tableau servant à stocker la taille de chaque caractère
    TVector2I CharSize[256];

    char Character = 0;
    for (int j = 0; j < 16; ++j)
    for (int i = 0; i < 16; ++i, ++Character)
    {
    // Stockage de la taille du caractère
    SIZE Size;
    GetTextExtentPoint32(Hdc, &Character, 1, &Size);
    CharSize[i + j * 16].x = Size.cx;
    CharSize[i + j * 16].y = Size.cy;

    // Affichage du caractère
    RECT Rect = {i * Quality, j * Quality, (i + 1) * Quality, (j + 1) * Quality};
    DrawText(Hdc, &Character, 1, &Rect, DT_LEFT);
    }
    Donc GetTextExtentPoint32 semble être ta fonction

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 171
    Points : 91
    Points
    91
    Par défaut
    Oui j'avais bien remarqué cette fonction mais c'est une fonction GDI, et moi je travaille avec directx donc j'ai pas de HDC avec une HFONT sélectionnée, j'ai juste un device IDirect3DDevice9 et une font ID3DXFONT...

    Après je ne connais pas, y a peut-être des correspondances!

    (Et, cela va sans dire, la réponse : "passe tout en GDI" ne sera pas prise en compte)

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    (Et, cela va sans dire, la réponse : "passe tout en GDI" ne sera pas prise en compte)
    Ah bon???

    Non tu utilise le GDI uniquement lors de l'initialisation pour récupérer les taiiles de ta(tes) police(s). Celà n'a lieu qu'une fois donc pas de problemes.

    D'ailleurs ID3DXFONT utilise le GDI (non?).

    PS: il y a aussi peut-être la fonction ID3DXFONT::GetTextMetrics, mais mon ordi ou il y a la doc du SDK n'est pas relié à internet. Je ne peux donc pas savoir ce que donne cette fonction...

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 171
    Points : 91
    Points
    91
    Par défaut
    J'y connais rien donc je te crois sur parole, mais comment je récupère mon HDC à partir de mon device Directx???

    Et effectivement, il existe la méthode GetTextMetrics mais elle renvoie des infos sur la police pas sur un caractère en particulier. Grace à elle je pourrais connaître la largeur du plus grand caractère mais pas plus....

    Tu saurais me dire comment utiliser ton GetTextExtentPoint32 avec mon device directx et ma font directx?


    (Je me demande si getglyphdata ne buguerait pas à cause du char que je lui donne en entrée. Il attend un glyph représenté par un UINT, j'ai supposé que ce UINT était le même que le code ascii du caractère... j'ai faux?)

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 171
    Points : 91
    Points
    91
    Par défaut
    Je continue de tenir en vie ce topic (ca ressemble à de l'acharnement thérapeutique). J'ai une nouvelle question :

    On entend bcp parler ici et là de la classe CD3DFont, qui supplanterait allègrement ID3DXFONT, mais quelles sont ses avantages? pourquoi je la trouve pas dans le sdk directx9? pourrais-je la trouver dans une version antérieure du sdk DX? Comment je fais si je veux rester avec DX9 et utiliser CD3DFont? Comment j'écris du texte dans mon device avec une telle police?
    J'ai également lu que cette classe se générait avec la classWizard : mythe urbain? Comment je fais si c'est vrai?

    Allez, y a bien une personne aux taquets là dessus...

    Merci bien!

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 171
    Points : 91
    Points
    91
    Par défaut
    Bon et bien je n'ai pas trouvé la CD3DFont officielle, mais une CD3D font artisanale très bien foutue.
    Elle est très docile, et affiche tout où je veux quand je veux.

    merci à tous pour tout, ce fut grandiose

    (je le passe pas encore en résolu car j'aurai surement d'autres soucis cette aprem. ce c'est qu'un premier au revoir)

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    CD3DFont se trouve dans les samples du SDK.

    Elle fait exactement ce que tu souhaitait. Je pensais que tu l'avais vu quand je t'ai parlé du sample Text3D, qui l'utilise.

    [EDIT] : je viens de lire les posts intermédiaires. Pour info, CD3DFont se sert aussi du GDI. Toutes les infos se trouvent dans la doc du Platform SDK, mais tu as tout ce qui te faut dans les fichiers CD3DFont.h et .cpp.

  17. #17
    Membre éclairé
    Avatar de Edouard Kaiser
    Profil pro
    Inscrit en
    Février 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2004
    Messages : 521
    Points : 756
    Points
    756
    Par défaut
    Citation Envoyé par Albenejean
    A mon avis tu devrais trouver la réponse quelque part ici...

    C'est un moteur 3D assez mal foutu et franchement dépassé, mais bon ça peut parfois aider....
    Franchement je ne vois vraiment pas en quoi les tutoriaux de Laurent sont mal foutus, au contraire ils exploitent toute la puissance du C++, certe c'est perfectible et il manque des choses mais de la à dire mal foutu...

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    Citation:
    Albenejean a écrit :
    A mon avis tu devrais trouver la réponse quelque part ici...

    C'est un moteur 3D assez mal foutu et franchement dépassé, mais bon ça peut parfois aider....

    Franchement je ne vois vraiment pas en quoi les tutoriaux de Laurent sont mal foutus, au contraire ils exploitent toute la puissance du C++, certe c'est perfectible et il manque des choses mais de la à dire mal foutu...
    D'où mon petit ange avec son air faussement naïf...
    Loin de moi l'envie de critiquer vu que j'ai lu et relu ces tutoriaux et que j'en suis pleinement saitisfait..................

    Bref Laurent, si tu l'avais mal pris, accepte un mélange de désolé et de bravo.............

    --
    Mais que devient l'humour si on doit se justifier..........

  19. #19
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Y a pas de souci.

    Vive l'humour, même au 3ème degré

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 171
    Points : 91
    Points
    91
    Par défaut
    Je me permets d'insiter : CD3DFont ne se trouve pas dans ma version du SDK directX (février 2007), ni dans la doc, ni dans les samples. Le sample text3D utilise ID3DXFont et non pas cd3dfont.
    Mais c'est pas grave la CD3DFont "artisanale" que j'ai trouvée est excellente donc mon pb est résolu.
    Merci pour vos réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 24/01/2011, 08h36
  2. [Lazarus] Afficher le texte d'un ComboBox avec ReadOnly
    Par Modulpro dans le forum Lazarus
    Réponses: 2
    Dernier message: 16/10/2010, 12h09
  3. Afficher du texte, tout simplement mais..
    Par MeTaLCaM dans le forum Java ME
    Réponses: 1
    Dernier message: 12/09/2009, 08h35
  4. [Dojo] Afficher le text d'un radioboutton avec dom
    Par sedik.h dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 09/09/2009, 00h27
  5. Comment afficher du texte avec swing ?
    Par meda dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 27/10/2004, 14h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo