Coup de gueule du jour : suite

28. mars 2010

Je suis obligé de blogguer sur ce que je viens de découvrir. Juste pour me calmer et ne pas avoir à tuer mon chien pour me passer les nerfs.

Donc résumé de l’épisode précédent : Direct3D11 ne fournit plus aucune API pour gérer le dessin de texte. Soit. Je veux bien. La solution semble être d’utiliser Direct2D et DirectWrite. Ok. Pas de soucis, je suis pas contrariant.

Le truc effarant, c’est que Direct2D ne supporte pas Direct3D11. Ce boulet ne sait pas dessiner sur une surface Direct3D11. Mais je suis MORT DE RIRE!!!! Mais comment on fait dans ces cas-la? On fait du GDI? On reste en Direct3D 10? On passe à OpenGL?

Mon dieu que j’en ai marre des ces mauvais qui sont pas foutus de garder une ligne de compatibilités fonctionnelles. Ca doit être la faute aux développeurs de jeux qui ne doivent pas écrire de textes dans leur application 3D.

DirectX

Coup de gueule du jour : Direct3D11

27. mars 2010

Il y avait longtemps! Direct3D 11 est soit disant une évolution de Direct3D 10 et le portage est rapide. Oui. Ou pas. Les charcutiers qui ont défini l’API de Direct3D11 devraient être lapidés avec des foies de faisans.

Alors prenons les choses pénibles dans l’ordre:

- Le framework Effect est maintenant un sample à coté. Bon soit, admettons.
- La gestion des fontes et des sprites nous a quitté après une longue maladie. Il faut vous démerder avec Direct2D et DirectWrite. Oui, pas de soucis.
- La classe Mesh a été supprimée parce que bon elle sentait le fioul. Parait-il que les développeurs de jeux (à dire avec une voix emplie de respect et d’admiration) ne s’en servent pas. Alors forcément. Pas grave, je m’en servais juste pour le calcul des intersections et pour les adjacencies. De toute manière on s’en fout on fait pas des jeux vidéos.

Bon là ca me broute de me taper des wrappers en chaine pour rajouter des fonctionnalités déjà présentes mais il faut quand même avouer que l’API est bien foutue et hormis les points du dessus ca coule assez vite à partir de Direct3D 10.

DirectX

BDC 2010 – Leak Preview

26. mars 2010

Je risque gros en faisant ce post mais mon devoir envers l’humanité est de faire passer la vérité!

Chez Bewise, les gens ne sont pas tout à fait normaux. Comme par exemple David Diop notre responsable de domaine métiers ASC.

J’ai même une vidéo sur le sujet :

.Net, Divers

SilverCollecto

24. mars 2010

Mon célèbre gestionnaire de collections (mondialement reconnu dans mon bureau et sur le tapis de la salle de bain) sort dans une nouvelle version en Silverlight 4.0.

Au menu des animations, des projections, des jolies couleurs, des projections, de l’entity framework, des projections, du WCF RIA Services et des projections.

Quelques captures de la bête:

image image

image image

SilverCollecto gère:

  • Liste des collections sous forme de TreeView
  • PictureFlow pour les images associées aux items
  • WCF RIA Services pour la synchro avec SQL Server
  • Drag’n’Drop

Je mettrai bientôt en ligne les sources mais on peut déjà tester le tout ici : http://collecto.catuhe.com (je crée des comptes utilisateurs sur simple demande).

Reste encore des bugs et surtout rien n’est sécurisé mais ca ne devrait plus tarder…

Silverlight

WPF : Chargement en asynchrone d’images dans un wrap panel

17. mars 2010

Déjà, juste le titre, ça calme bien. Un peu autant que le temps que j’ai passé à trouver la solution en fait.

Voici donc le problème : J’ai un wrap panel en WPF qui sert d’ItemPanel à une ListBox. Jusque là on ne se fatigue pas trop non plus:

<ListBox ItemsSource="{Binding}" x:Name="imagesList">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel>
                            </WrapPanel>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                </ListBox>

Toutefois, lorsque je veux binder une grosse liste d’images (plus de 300) en provenance de ma base de données à ma ListBox, je me récupére en supplément un bon gros lag car le gentil Wrap Panel ne sait pas virtualiser ses items et doit donc tous les créer pour s’afficher (contrairement par exemple à une ListView qui saura ne construire que les items qu’elles affichent en temps réel).

Donc, je me suis lancé à la recherche d’une solution qui me permettrait d’asynchroniser le remplissage de mon Wrap panel.

Première idée, on met benoitement notre imagesList.DataContext = maListe dans un ThreadPool.QueueUserWorkItem. Et là c’est le drame car WPF me bloque comme j’essaye d’accéder à un DispatcherObject depuis un autre thread que celui qui a servit à construire le contrôle.

La solution est un tantinet plus ardue:

Premièrement, il faut modifier notre objet qui porte l’image à afficher pour lui ajouter une propriété supplémentaire de type BitmapFrame (qui a l’énorme avantage de ne pas vérifier l’origine du thread appelant). Il est ici important de ne pas laisser le BitmapFrame se mettre en DelayLoad depuis le cache d’image d’ou l’utilisation du paramètre BitmapCacheOption.OnLoad:

    public partial class Card
    {
        BitmapFrame bitmapImage;

        public BitmapFrame Bitmap
        {
            get
            {
                return bitmapImage;
            }
        }

        public void GenerateBitmap()
        {
            if (bitmapImage != null)
            {
                return;
            }
            using (MemoryStream ms = new MemoryStream(Image))
            {
                bitmapImage = BitmapFrame.Create(ms, BitmapCreateOptions.None, 
BitmapCacheOption.OnLoad); } } }

Deuxièmement, avant d’affecter le DataContext de notre ListBox, nous allons appeler de manière asynchrone sur chacun de nos objets la méthode GenerateBitmap.

Finalement, il suffit de faire un petit Dispatcher.Invoke pour affecter notre DataContext:

ThreadPool.QueueUserWorkItem(o =>
          {
            foreach (Card card in list)
            {
               card.GenerateBitmap();
            }
            Dispatcher.Invoke(DispatcherPriority.Normal, new Action(()=>
            {
               imagesList.DataContext = source;
            }));
});

Le résultat fait plaisir à voir je vous l’assure :)

.Net, WPF

Le truc à la con du jour : Gérer le double clic en WPF

14. mars 2010

J’ai eu plusieurs fois la question : Maiiiiiis pourquoi WPF ne gère pas le double clic!!! C’est trop nul WPF.
Alors en fait oui mais non. Effectivement il n’y a pas un événement qui s’appelle “MouseDoubleClick”. Toutefois le double clic est bien géré ma bonne dame!

Et c’est même plutôt bien gérer. Car après tout, que se passerait-il si je voulais un MouseTripleClick? Il faudrait que je chiale auprès de l’équipe de développement de WPF ?

Alors pour couper court à ce suspens insoutenable, voici la solution : Abonnez vous à l’événement MouseDown (par exemple) et regarder le gentil paramètre MouseButtonEventArgs qui vous est fait passé. Notez surtout la propriété ClickCount. Et paf miracle:) Cette petite propriété gère le double clic (et plus) pour nous!

Un exemple en direct:

private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.ClickCount == 2)
    {
        if (FullImage.Visibility == Visibility.Hidden)
            FullImage.Visibility = Visibility.Visible;
        else
            FullImage.Visibility = Visibility.Hidden;
    }
}

 

Et voilou…

WPF, .Net

BDC 2010 – C’est reparti!

4. mars 2010

A la demande générale, la Bewise Day Conference est de retour pour une 4ème édition ! Encore une fois, venez découvrir ce qui se fait de mieux dans les technologies Microsoft.

Cette année, beaucoup de nouveautés, puisque Microsoft lance la gamme 2010 de ses produits, notamment Visual Studio, Sharepoint, mais aussi la version 4.0 de son framework .Net, MVC 2, Azure, Silverlight 4 et bien d’autres choses bien croustillantes.

J’animerai les plénières cette année et je vous conseille d’y participer car vous y découvrirez le grand secret de Bewise :).

Pour les inscriptions, rendez-vous sur le site officiel de la BDC 2010.

Bewise, .Net, 3D, Silverlight, Visual Studio, Windows Forms, Windows Mobile, WPF

Nova 2010 et le multi-provider

3. mars 2010

Parmi les nombreuses nouveautés de Nova 2010 (plus connu sous le nom de la Poutre 3D ©), il y en a une qui pour moi sort du lot : Le multi-provider.

En effet, Nova 2010 est livré en standard avec 3 providers de rendus : DirectX 9, DirectX 10 et DirectX 10 Software. Grâce à un mécanisme d’abstraction tout le système de rendu de Nova s’appuie sur des interfaces qui sont implémentées dans des assemblies indépendantes.

Ainsi, sur une même scène, l’utilisateur peut utiliser un des 3 providers de son choix :

image

Les providers fournissent un service de base identique mais ils fournissent également potentiellement des capacités supplémentaires. Ainsi le provider DirectX 10 donne par exemple accès à plusieurs post-processes avancés (Motion Blur, Depth of Field, etc..) ou bien encore permet d’utiliser des options telles que le fresnel ou les variances shadows maps.

Le provider DirectX 10 Software fournit le même niveau de fonctionnalités que le provider DirectX 10 mais fait tous les calculs sur le CPU et ne nécessitent donc pas de GPU.

Les futures versions de Nova ne manqueront donc pas d’enrichir cette collection.

Nova