SelixyCARD
Jeu de cartes type UNO en 3D dans le navigateur, moteur Rust en wasm
SelixyCARD est un jeu de cartes type UNO qui se joue dans le navigateur, sur une table en 3D. On peut y créer ses propres sets de cartes illustrés, activer des règles optionnelles et jouer à plusieurs.
Le jeu et les sets
Un set compte 108 emplacements. Une page de bibliothèque permet de les illustrer avec un éditeur à recadrage, et une carte sans image reçoit un visuel par défaut. Les règles de base et les options sont écrites une seule fois, dans un module Rust partagé, exécuté par le serveur, qui est le seul juge de la partie.
Le salon permet de créer ou de rejoindre une partie ; les échanges passent par une WebSocket.
Le moteur 3D en Rust et wasm
J’ai écrit le moteur en Rust, compilé en wasm. Il ne s’occupe que du rendu, de l’animation et du pointage : le JavaScript garde la WebSocket, l’état de la partie et l’interface. Le rendu passe par wgpu, avec des shaders en WGSL.
Quelques choix :
- toutes les cartes sont posées à plat et se superposent par décalage en hauteur, avec une caméra de table basse pour un point de vue immersif ;
- chaque carte rejoint sa pose cible par lissage exponentiel, indépendant du débit d’images, avec des trajets en arc pour les longs déplacements ;
- le pointage ne lance pas de rayon : il projette les coins des cartes et teste le quadrilatère, de la carte du dessus à celle du dessous ;
- l’éventail de la main s’adapte à la place visible, notamment en portrait sur téléphone.
Rendu et décor
Le plan de travail est une ardoise générée dans le shader, avec des traits de craie, sans texture. Les cartes projettent des ombres, et une carte jouée soulève un nuage de poussière de sa couleur à l’impact. Un second module, graphe_pbr, sert à décrire des matériaux sous forme de graphe de nœuds, traduit en GLSL et en WGSL.
Serveur et déploiement
Le serveur est en Rust (Axum) avec PostgreSQL : comptes, sets, images et salons. Le tout est livré dans un pod Podman derrière nginx, par un simple git push. Un audit modulaire et des tests (Rust et JavaScript) accompagnent le dépôt.