lundi 18 mars 2013

Une goutte

Une goutte très stylisée rendue avec Blender.

Rien de bien méchant, si ce n'est le fond transparent. C'est tout bête, mais encore faut-il savoir comment faire. Tout se passe dans le panneau de rendu. D'abord, désactiver le rendu du "ciel", c'est à dire du fond, dans la section "Layers". Ensuite, rendre l'image avec une composante de transparence en choisissant RGBA. Bien entendu, il faut que le format d'image supporte la transparence, mais PNG, le choix par défaut, le permet.

Et voilà. Fort pratique pour les icônes et logos.

jeudi 14 mars 2013

Reparlons de move semantics

Et voyons si cela change fortement la manière de passer ses paramètres en C++11. Imaginez que vous deviez implémenter une queue d'objets, par exemple pour la rendre thread safe. En c++03, l'on penserait immédiatement à écrire le "push" en passant son paramètre par référence constante, comme montré dans push1. Comparons donc cela avec push2, qui semble au premier abord moins optimal (notez que l'objet A affiche simplement quels sont ses constructeurs appelés):

class Queue
{
public:
  void push1(const A & a)
  {
    _deque.push_back(a);
  }

  void push2(A a)
  {
    _deque.push_back(std::move(a));
  }
  
private:
  std::deque<A> _deque;
};

Voyons ce que cela donne dans le cas général:

Queue q;
A a;
q.push1(a);

affiche

A::A()
A::A(const A &)

Alors que

Queue q;
A a;
q.push2(a);

affiche

A::A()
A::A(const A &)
A::A(const A &&)

C'est à peine pire si l'on part du principe qu'un constructeur move n'est pas cher. Mais maintenant, regardons dans le cas où le paramètre peut être déplacé:

Queue q;
q.push1(A());

affiche

A::A()
A::A(const A &)

ce qui n'est pas pire, mais

Queue q;  
q.push2(A());

affiche

A::A()
A::A(const A &&)

et là, c'est nettement mieux! L'on évite complètement la copie, et l'on déplace simplement l'objet jusqu'à la queue. Notez que

Queue q;
A a;
q.push2(std::move(a));

affiche

A::A()
A::A(const A &&)
A::A(const A &&)

En effet, le standard autorise le compilo à transformer un passage par copie en un move.

Je suis un tout petit peu ennuyé par cette nouvelle approche. En effet, la règle jusqu'ici était, passe par référence si tu peux, et par autre chose si tu dois. Et maintenant, il va falloir choisir entre un passage par référence et un passage par copie en fonction de ce que la fonction va faire avec le paramètre, ce qui me donne l'impression de casser l'encapsulation. Mais économiser des copies est plaisant.

Les labels du blog sont cassés!

Ou plus exactement, le label C++. D'après les forums, tout le monde a le même problème: cliquer sur un label contenant le caractère '+' ne retourne aucun article. En revanche, le compte du nombre d'articles fonctionne...

Ça fait des mois que ça dure. Espérons que Google nous corrige ça bientôt.

vendredi 8 mars 2013

Faire tourner blender + cycles sous Debian

J'avais bien envie d'essayer Cycles, le nouveau moteur de rendu de Blender. Problème: la version présente dans Debian Wheezy ne le supporte pas. En insistant un peu, j'ai quand même réussi à l'extraire des dépôts expérimentaux. Voilà comment:

Tout d'abord, installons la toute dernière version de Blender. Ajoutez les dépôts expérimentaux en éditant /etc/apt/sources.list et en ajoutant:

deb http://ftp.debian.org/debian experimental main

Puis, installons Blender:

aptitude update
aptitude -t experimental install blender

Si vous démarrez Blender maintenant, vous aurez un beau crash. C'est que le paquet expérimental est un peu cassé (du moins chez moi), et qu'il faut aller corriger quelques fichiers. En utilisant strace, j'ai réussi à retrouver les chemins manquants. Tout d'abord, corrigeons le crash en fournissant un répertoire pour les locales, lesquelles sont cherchées notamment dans /usr/share/blender/2.66/datafiles/locale:

cd /usr/share/blender
mkdir 2.66
cd 2.66
mkdir datafiles
cd datafiles
mkdir locale

Si vous démarrez Blender après ceci, il démarrera, mais tous les menus seront vides: en effet, il y a un autre souci de chemin et Blender ne trouve pas les scripts Python qui le font tourner, car il les cherche dans /usr/share/blender/2.66/scripts alors qu'ils sont directement dans /usr/share/blender/scripts. Recollons les wagons:

cd /usr/share/blender/2.66
ln -s ../scripts .

Et là miracle, Blender démarre correctement, et Cycles marche comme sur des roulettes.