+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Nouveau Membre du Club
    Inscrit en
    novembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 65
    Points : 38
    Points
    38

    Par défaut Quelles libs de rendu 2D dans des buffers pour Mono C# pur ?

    Bonjour,

    je bosse sous mono (avec le logiciel unity3d) et je vois un gros pb arriver. Venant du C++ je suis habitué à trouver des dizaines de librairies qui permettent de faire du rendu dans des images 2D, etc... mais pour mono, je ne trouve rien en pur C#.

    C'est comme-ci personne n'avait implémenté de rendu de font avancé en c#, de libs de dessin 2D, etc...

    A chaque fois c'est des ports de (très bonnes) libs c / C++ (qt), que je trouve . Malheureusement, avec unity3d sur le web, je ne peux utiliser les plugins C++ externes.

    Donc, pouvez vous m'indiquer :
    - des framework C# Mono en c# pur , n'utilisant par exemple pas les libs WinForms et System.Drawing pour faire du rendu dans des buffers de byte?
    - des libs de rendu de fonts (par exemple pour dessiner de l'arabe) dans des buffers de bytes?

    Est-ce que je vais être obligé de réinventer la roue?

    Merci de vos retours!

    ElPedro

  2. #2
    Expert Confirmé Sénior Avatar de DonQuiche
    Inscrit en
    septembre 2010
    Messages
    2 179
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 2 179
    Points : 4 709
    Points
    4 709

    Par défaut

    Bonjour.

    Pourquoi ne pas vouloir utiliser System.Drawing ? Elle est dispo sur tous les environnements où Mono l'est et utilise le moteur de rendu du système, ce qui est en général l'idéal pour produire un résultat familier pour l'utilisateur (lissage des polices en particulier). Qui plus est ses capacités sont tout de même assez larges, suffisantes pour la plupart des cas.

  3. #3
    Nouveau Membre du Club
    Inscrit en
    novembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 65
    Points : 38
    Points
    38

    Par défaut

    Je serais content de pouvoir utiliser System.Drawing.
    Mais apparemment, "using System.Drawing;" => me dit que le namespace Drawing est inconnu. Tandis que par exemple "using System.Collections;" est OK.
    Donc il me semble que dans l'environnement que j'ai (unity3d + mono) System.Drawing n'est pas intégré. (j'ai le droit au plugin externe c# purs, mais pas a ceux qui ont des accès systèmes unsafe comme Drawing qui crée des fénêtres).

    EDIT : apres vérif, c'est effectivement désactivé car cela crée de nouvelles fenêtres qui ne peuvent être encaspulées en opengl/directX (unity3d étant un moteur de jeu 3D).

    Bref, j'ai besoin de rendu 2D dans des buffers, sans accès à l'OS sous-jacent.
    Quelqu'un a une idée ?

  4. #4
    Expert Confirmé Sénior Avatar de DonQuiche
    Inscrit en
    septembre 2010
    Messages
    2 179
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 2 179
    Points : 4 709
    Points
    4 709

    Par défaut

    Ok, le problème est en fait que ton code sera exécuté par le plugin Unity pour navigateurs, celui-ci embarquant sa propre version restreinte de dotnet qui interdit tout code natif ? Aïe.

    La meilleure solution semblerait être de se contenter de bitmap fonts : tu inclus dans tes ressources un bitmap contenant tous les caractères dessinés et tu t'en sers pour rendre le texte. Facile à réaliser même si tu devais tout faire à la main pour une raison quelconque. L'inconvénient c'est que niveau typographique tu seras assez limité, tu peux oublier le kerning et compagnie, à moins de l'implémenter toi-même. L'avantage c'est qu'il est beaucoup plus simple d'arriver au résultat que tu désires par cette méthode plutôt que par un rendu vectoriel puisque la plupart des jeux veulent des polices bien propres, avec outline, remplissage non-uniforme, etc. Et tout ça est très simple à faire correctement sous photoshop mais très difficile avec la plupart des moteurs 2D.

    Maintenant, si tu veux une solution vectorielle, je n'en connais pas, mais Unity intègre forcément quelque chose de ce genre. Et si comme je le présume tu ne peux pas l'exploiter pour une raison X ou Y, de toute façon, Unity est le seul à pouvoir accéder aux fontes du système, si bien que toute solution alternative devra inclure ses propres polices de caractère, avec les problèmes de droits associés. Ce qui te fait un problème supplémentaire à résoudre.

    Bref. Bitmap fonts.

  5. #5
    Nouveau Membre du Club
    Inscrit en
    novembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 65
    Points : 38
    Points
    38

    Par défaut

    Ok, merci pour ta réponse. Tu as bien compris mon problème.
    Manque de pot, j'ai déjà implémenté les bitmaps fonts et même si j'arrive à gérer le chinois, l'arabe est complètement hors de portée. En effet, la liste des lettres de l'alphabet arabe est insuffisante pour faire leur rendu. Quand 3 lettres successives sont écrites, il faut tracer la liaison en plus entre les 3 par exemple. Or le dessin correspondant à cette liaison n'est pas présent dans les tables de caractères. Il est calculé par le moteur de rendu du dessin.
    Je n'ai rien contre le vectoriel, mais c'est simplement que je me dis que depuis le temps, y'a forcément quelqu'un d'autre que moi qui a déjà implémenté tout ça dans une lib ?

    En C++ il y a des dizaines de librairies qui remplacent la lib standard. Pourquoi je ne trouve rien d'équivalent en C#? Les libs de rendu 2D se comptent par dizaines en C++. Je ne trouve rien en C# pur. J'espère que c'est juste que je ne sais pas chercher ?

  6. #6
    Expert Confirmé Sénior Avatar de DonQuiche
    Inscrit en
    septembre 2010
    Messages
    2 179
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 2 179
    Points : 4 709
    Points
    4 709

    Par défaut

    A mon avis tu ne trouveras rien, pour les raisons suivantes :
    * Peu de libs en C# car le framework répond déjà à 99% des besoins.
    * Peu de libs en C# pur car pourquoi réinventer la roue quand il suffit de créer un wrapper autour d'une biblio C/C++ qui sera utilisable pour 99% des projets.
    * Quand bien même une biblio en C# pur existerait, elle utiliserait sans doute du code unsafe, pour des raisons de performances, ce qui ne t'avancerait à rien.
    * Enfin, même si une biblio purement C# sans code unsafe existait, quelles sont les chances qu'elle ne s'appuie pas sur System.Drawing, dans la mesure où toutes les biblios de rendu visent d'abord un rendu à l'écran ?

    Désolé, j'aimerais être plus enthousiaste.

    Du coup, le mieux est de chercher un truc pour continuer à exploiter les bitmap fonts. Si ton problème est bien ce à quoi je pense tous les caractères sont liés à la même hauteur par une simple ligne horizontale et deux versions de chaque caractère suffiraient. Il te suffirait donc de générer deux bitmaps et de construire un index définissant les règles de liaison entre caractères. Si la règle est simple, pas de souci, mais si elle est plus complexe et requiert des infos stockées dans les fontes, je crois que WPF offre tout ce qu'il faut pour récupérer ces infos et construire ton index, cela t'éviterait au moins d'avoir à construire un parser truetype.

  7. #7
    Nouveau Membre du Club
    Inscrit en
    novembre 2009
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 65
    Points : 38
    Points
    38

    Par défaut

    Effectivement. Merci pour toutes ces explications.

    J'avais un peu peur de la combinatoire (je vais me renseigner sur des forums arabes), mais je vais partir là dessus alors.

    Parser du true type ne me fait pas peur. Par contre, se taper le rendu, ben j'aurai voulu l'éviter. Merci pour l'info sur WPF, je ne connais pas, je vais me renseigner.

    Merci encore pour ton temps.

    ElPedro

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •