Archive for June, 2010

Yet another Lite 3D Engine to release

Aucun commentaire

Je mettrai en ligne courant de l'été une première release de la librairie Tweened. Celle-ci contient notamment, des composants, des behaviors, un wrapper de tween (facilitant la conception d'animation par code) ainsi qu'un mini moteur 3D très simple d'utilisation. En voici un exemple concret téléchargeable ici :

Install Microsoft Silverlight

J'ai fais ce moteur avant tout pour des besoins personnels et afin de me remémorer les mathématiques projectives. Réinventer la poudre ne fais quelques fois pas de mal. L'idée est surtout de fournir une dll de moins de 40ko qui permet de faire de la 3D. Celle-ci sera utilisable pour les designers à travers Blend ou dans Visual Studio via C#.  Elle concentrera très vite toutes les fonctionnalités de base réellement utiles et que nous n'avons pas  actuellement via Blend : Caméra 3D, Container 3D, Scène 3D, détection des normales et z sorting intelligent (plus malin et performant que celui actuellement proposé dans Blend). J'y ajoute une classe utilitaire facilitant l'utilisation de mathématiques projectives.

Voilà ces composants :

  1. Un conteneur de type Scene3D (hérite de Panel).
    Tous les objets placés en sont sein voient leur propriétés Projection native lockée. Ceux-ci peuvent utilisées les propriétés attachées suivantes :

    • Scene3D.LocalOffsetX
    • Scene3D.LocalOffsetY
    • Scene3D.LocalOffsetZ
    • Scene3D.GlobalOffsetX
    • Scene3D.GlobalOffsetY
    • Scene3D.GlobalOffsetZ
    • Scene3D.RotationX
    • Scene3D.RotationY
    • Scene3D.RotationZ

    Ils sont associés à une instance de type Element3D. Celle-ci est récupérable (lorsque l'événement StartUp de la scène 3d est diffusé) via une méthode d'extension ajoutées pour les instances d'UIElement (GetElement3D).

  2. Une caméra associée au conteneur Scene3D. Celle-ci offre les propriétés suivantes :
    • FieldOfView
    • Plan de clipping proche : NearPlane
    • Plan de clipping éloigné : FarPlane
    • Point de fuite (XVanishingPoint, YVanishingPoint)
    • Déplacement (OffsetXCamera, OffsetYCamera, OffsetZCamera)
    • Rotation (RotateXCamera, RotateYCamera, RotateZCamera)

Détection du changement de direction de la normale (Backface culling) et du produit scalaire via les événements NormalDirectionChanged et DotProductChanged. Ces événements sont diffusés par les instances de type Element3D.

Je suis en cours de finition d'un algorithme de tri des profondeurs. Ce moteur devrait être assez optimisé car son rendu ne repose pas sur un DispatcherTimer. Deplus, le pipeline de rendu est assez optimisé car il n'est pas récursif par défaut. Lorsqu'un seul objet est modifié, ce dernier invoque en interne une méthode RenderElement. A contrario, lorsque la scène ou la caméra sont modifiées, il devient récursif et met à jour l'ensemble des objets de la scène... A bientôt donc pour la release finale de la librairie Tweened...

Expression Studio 4 version finale disponible

Aucun commentaire

    La nouvelle version de la suite Expression Studio est dans les bacs ! Cette nouvelle release est déclinée en 3 versions :

    • Expression Studio Ultimate
    • Expression Studio Premium
    • Expression Studio Web professional

    La version Expression Web n'intègre pas le logiciel Expression Blend mais uniquement Expression Design, Web et Encoder. Si vos développements s'orientent vers Silverlight ou WPF, il vous faudra acquérir la version Premium ou Ultimate. Cette politique possède l'avantage de s'adapter aux petits budgets. Pour la version Ultimate uniquement, vous bénéficierez également de Expression Encoder Pro qui offre le support d'une plus grande variété de codecs en import comme en export. Celui-ci pourra notamment gérer de la diffusion de vidéos Smooth Streaming live ou l'encodage H.264 (la comparaison des features est ici). Autre changement de politique côté MSDN, concernant cette fois l'arrivée de numéros de série. Ceux-ci vous permettent d'installer la suite un nombre limité de fois. Il n'y a plus qu'à faire son choix...

    Design Time Resources dans Blend 4

    Aucun commentaire

    Blend 4 nous offre de nouvelles fonctionnalités et l'une d'entre elles est assez obscure de prime abord. Dorénavant, il est possible dans Expression Blend de créer des ressources uniquement utilisées au design time (au moment de la conception sous Blend ou Visual Studio). Le problème est assez banal, Il est souvent nécessaire d'affecter des ressources graphiques qui ne sont définies qu'à l'exécution. Du coup, dans l'espace de travail graphique, sous Visual Studio ou Blend, celles-ci  ne sont pas résolues puisque pas encore définies. Cela occasionne des erreurs d'accès et quelques problèmes d'affichage. Blend 4 permet maintenant de résoudre cette problématique mais la manière de procéder n'est pas très évidente. L'objectif est de créer un dictionnaire de ressource contenant une ressource ou plusieurs ressources que vous utiliserez uniquement au design time. Le première chose à faire consiste à créer un projet ainsi qu'une ressource contenue dans un dictionnaire de ressource. Un dégradé ou un solidColorBrush fera bien l'affaire (voir ci-dessous).

    Ensuite supprimez le lien contenu par App.xaml, les ressources contenues sont désormais inaccessibles et vous obtenez des erreurs d'accès. Ce n'est pas grave, il vous faut passer par cette étape. Sauvegardez le projet puis ouvrez-le à nouveau sous Blend 4, vous obtenez une jolie boîte de dialogue vous indiquant si vous souhaitez créer un dictionnaire utilisable au design time (voir ci-dessous).

    Pour finir, créez la ressource via C#, c'est cette dernière qui sera utilisée par Silverlight à l'exécution.

    Au final vous obtenez deux rendus différents. Le premier concerne le design time, le second correspond au rendu final à l'exécution utilisant la ressource instanciée lors de l'initialisation :) Du coup, le designer est complètement autonomes. Au final, ce procédé n'est pas très orthodoxe mais il est très utile. Le principe ne repose sur rien d'autre qu'une compilation conditionnelle générée au niveau du projet(.csproj). Le code suivant :

    <Page Include="Properties\DesignTimeResources.xaml">
     <Generator>MSBuild:Compile</Generator>
     <SubType>Designer</SubType>
     </Page>

    est remplacé par celui-ci :

    <Page Include="Properties\DesignTimeResources.xaml"
    Condition="'$(DesignTime)'=='true'
    OR ('$(SolutionPath)'!='' AND Exists('$(SolutionPath)')
    AND '$(BuildingInsideVisualStudio)'!='true'
    AND '$(BuildingInsideExpressionBlend)'!='true')">
     <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
     <ContainsDesignTimeResources>true</ContainsDesignTimeResources>
     </Page>