pikario.fr

Five Nights at Super Toboggan

J'ai eu une idée. Un spin off d'horreur FNAF-like à Super Toboggan 3D (oui). Je vais tenter de le rélaiser en pas trop longtemps, et donc voilà le devlog ! Cette fois-ci il sera purement chronologique.

Mercredi 15 juillet 2026

21h

Début du projet, je vais partir de Mini3D+ non modifié, le fork sur github et je clone en local. J'hésitais à partir de ST3D mais j'ai trop modifié le moteur de rendu je pense, et j'ai envie d'une page blanche. Mais là je vais jouer avec des ami.es donc ce sera tout pour le moment.

Vendredi 17 juillet 2026

14h16

J'aimerai donc avoir une base 3D sur laquelle m'appuyer et pouvoir faire des transitions de caméra, et je rajouterai des détails en 2D. Mais donc pour pouvoir itérer sur la scène, ce serait chouette d'avoir un importeur de mesh. Je vais voir si je peux trouver ça pour de l'obj ou du gtlf en C.

Lundi 20 juillet 2026

12h12

J'ai trouvé une bliothèque C pour importer de l'obj, elle a l'air légère et rapide. Par contre elle ne marche pas direct, il faut j'arrive à lui passer l'allocateur de l'API playdate. Pareil pour l'accès au système de fichiers.

16h19

Ok ça compile! Maintenant j'essaye de charger un obj que j'ai fait dans blender (un cylidnre). À priori ça marche, maintenant il faut que je transforme ça en une shape Mini3D.

19h24

C'est bon j'ai réussi ! Voilà un cube moche (les vertex sont probablement pas dans le bon sens), mais il vient d'un OBJ ! La suite plus tard, j'arrête pour aujourd'hui.

La première image du projet, pour la postérité
La première image du projet, pour la postérité

Mercredi 22 juillet 2026

14h53

Je vais débugger le rendu des triangles voir si je fais les choses correctement ou pas. Dac j'ai enfin compris la structure que me passe la lib pour faire de l'obj ! J'ai un cylindre !

Waaaah
Waaaah

Prochaine étape : faire la scène que je veux dans blender et l'afficher sur playdate!

Jeudi 23 juillet 2026

18h05

C'est parti pour le modèle 3D du bureau, j'ai fait un premier jet et il est pété quand je le met en jeu (les triangles...), je vais voir si c'est l'export de blender ou ma lecture de l'obj. C'était l'export, je force à ce que soit triangulé à l'export comme ça toutes mes faces font 3.

21h58

J'essaie de gérer la couleur des faces directement dans blender que à l'import de transformer ça en noir et blanc pour la playdate. J'y suis presque, je creuse le fonctionnement de fichiers mtl.
Aucun rapport, mais à chaque fois je me fais avoir que la valeur de roation de la crank soit en degré et pas en radian....
J'ai réussi, c'est cool, une bonne base sur laquelle s'appuyer!

Mon mesh blender dans ma playdate!

Lundi 27 juillet 2026

18h49

Je travaille sur les transitions de caméra entre les différents postes. Je veux un poste central de travail où il faut se concentrer, un poste en bas où il faut surveiller le toboggan, et un poste de chaque côté où il faut surveiller des créatures qui tentent d'entrer. Mais avant de faire quoi que ce soit, il faut que j'ai un système de transition de caméra, avec de l'easing si possible.

Et voila un premier jet!
Et voila un premier jet!

Mecredi 29 juillet 2026

16h08

Maintenant l'étape d'après c'est de comprendre comment marchent les imposteurs de Mini3D+, ça va me permettre d'afficher un version image du toboggan par la fenêtre (car oui ce serait pas rentable en terme de perf de reprendre l'affichage 3D de ST3D je pense). Pour ça faut que je prendre une capture de ST3D depuis l'extérieur et de côté, je rouvre le projet.
J'ai une image, mais du coup je ne sais pas si je vais utiliser les imposteurs ou carrément direct passer par une texture sur un plane, puisque ça me seriva pour le reste.

01h

De retour après avoir vu Spiderman Brand New Day au ciné (il est très bien !). En fait il faut que je fasse une shape par mesh dans mon blend original pour pouvoir texturer correctement (pour l'instant je mettais tout dans la même shape, comme pour ST3D), du coup je change mon code de loading de l'obj en shape(s).
Après avoir réécrit l'import, tout fonctionne comme avant, mais je n'ai encore aucune texture qui s'affiche (au moins je n'ai pas de crash déjà...), ça fait juste du noir. Je vais dormir j'investiguerai ça demain.

Jeudi 30 juillet 2026

14h

J'ai redémarré mon PC donc j'ai du relancer le simulateur, et le jeu crash au démarrage... Probablement un pointeur pas alloué, j'investigue.

Vendredi 31 juillet 2026

18h

Je suis toujours sur le crash, je n'ai pas trouvé de solution hier. Il faudrait que j'utilise un debuggeur en fait (oui je n'en pas de setup ^^' ST3D a été fait 100% sans), je regarde s'il y a des resources sur le forum de la playdate. J'ai réussi à utiliser gdb avec le simulateur, en fait c'était vraiment pas dur, ça m'aurait sûrement fait gagner du temps sur ST3D x)
Enfin bref, ça vient de render_range de Mini3D+, les fonctions qui sont illisible tellement y'a de macro partout, les noms de variables sont pas explicites non plus :/ C'est trop compliqué à debug T.T Je tente le lancer la démo de Mini3D+ officielle avec ma texture pour voir si déjà c'est pas ma texture le problème. Ce n'est pas ça, ça réduit le debug, ça veut dire y'a un truc que je dois pas initialiser correctement. Mais ce n'est pas facile de comparer avec la démo de Mini3D+ puisqu'elle est faite en lua.

Dimanche 2 aout 2026

01h33

En relisant point par point l'initialisation d'une shape dans la démo de Mini3D+ je me suis rendu compte que la texture que je passais n'étais pas la bonne (juste pas le bon bon type...), d'où le crash. Ça vient notamment du fait que dans Mini3D+ une texture c'est juste un pointeur sur void, donc le compilateur ne me fait pas d'erreur, ce qui fait que je n'ai rien remarqué. J'ai réglé en passant le bon type et une texture apparait ! Par contre je n'ai pas les bons UVs mais c'est parce que je charge mal ceux de l'OBJ, prochaine chose à régler mais là je vais me coucher.

Premier affichage (cassé) d'une texture !
Premier affichage (cassé) d'une texture !

Mardi 4 aout 2026

03h08

Après quelques essaies/erreurs j'ai réussi à avoir les bonnes coordonnées de texture à passer à mini3D+ pour chaque face. Par contre ma texture ne s'affiche toujours pas correctement. J'ai par contre essayé avec celle "1234" de la démo, et elle s'affiche, je me demande si c'est quelque chose avec l'encodage (ne sauvagarder qu'en noir-et-blanc?), ou alors c'est la taille qui doit avoir un certain ratio? J'essaye de voir mes options avec Gimp.
On dirait que 256 c'est la valeur max de hauteur et de largeur pour l'image (la mienne originale faisait 400x240, une capture d'écran de Playdate), j'essaye de comprendre en lisant dans le code. Oui c'est bien ça, et c'est hard codé :/ Bon on va dire que c'est une contrainte de plus, et si c'est trop limitant je me renseignerai pour trouver une autre lib mais c'est beaucoup de taff après pour l'interfacer avec mini3D+.
J'ai un premier jet avec une texture en 256 par 256 (à peu près), il a fallut que je tweak le noir (car une capture playdate c'est pas du vrai noir pur) pour avoir le bon effet, et la texture est à l'envers (va savoir pourquoi), mais je progresse vers ce que je veux !

La texture du toboggan par la fenêtre !
La texture du toboggan par la fenêtre !

19h03

Je me suis couché beaucoup trop tard hier... Bref, je suis en train de rajouter le fait de pouvoir set les normales des faces dans Mini3D+, elles sont dans mon obj, autant les utiliser et ça me permet de les inverser dans Blender au besoin. Vu que ça risque de se répéter, je vais faire comme les vertex : avoir un tableau de normales et chaque face ne stocke qu'un id.
Après quelques heures de travail, ça ne marche pas très bien, en fait chaque frame les normales sont recalculées par mini3D en fonction du transform actuel, et j'ai du mal à m'interfacer là-dedans. Je met de côté pour le moment, je vais voir ce que je peux faire en gardant les normales automatique déjà en terme d'ambiance.

Lundi 10 aout 2026

13h47

Je reprends le projet aprs du temps passé à patcher ST3D et préparer la sortie sur itch. Aujourd'hui je veux voir si je peux facielment animer les textures (juste en mettant des images différentes). J'ai tenté l'approche naive de refaire un setTexture, ce n'est pas si simple que ça, je crois qu'il va falloir aussi que je la remplace dans les FaceInstance. Bon le crash venait juste d'un pointeur que j'avais mal initialisé, du coup juste ça n'update pas le visuel quand j'essaye de changer. En fait c'est bon ça fonctionne, je ne sais juste pas coder. C'est cool ! Par contre mes UV sont toujours inversés et je ne sais pas pourquoi. J'ai inversé le plan en attendant de comprendre. J'ai fait une petite animation.

Je suis content, c'est une première preuve de concept!
Je suis content, c'est une première preuve de concept!

23h44

Je vais améliorer un peu la scène pour la rapprocher de ce que je veux, notamment avec la vue bureau (en plus de la fenêtre et des deux portes). J'ai mis un ordinateur sur la table et je me rend compte que mon modèlé est inversé c'est bien ça, et je ne sais pas pourquoi. J'ai aussi un soucis avec le culling il est trop proche, la table et l'ordinateur y passe dès que j'approche la caméra.
Pour le mesh en mirroir, j'inverse toutes les valeurs de x au chargement (chut, ça reste entre nous!). Et pour le clipping j'ai trouvé comment changer le zoom de la caméra avec la valeur de scale, je met ma cam à un endroit et ensuite je joue avec ça. Je vais ajouter un state NOTHING en plus de WORK qui a plus de recul et qui sert de state par défaut. Le state TOBOGGAN va servir à réagir quand le monstre apparaitra dessus. Ça fait qu'il y a NOTHING au centre et un state dans chaque direction, ça parait pas mal.

Les différents states de caméra !
Les différents states de caméra !