En mode cppia (--cppia), le code projet est compilé en bytecode CLIENT, le
moteur reste natif dans le HOST. Or les shaders shade d'un projet sont des
classes Haxe (src/**/shaders/*.hx) transpilées en GLSL par une macro qui
tourne pendant la compile host. Comme ces classes vivent dans le CLIENT en
mode cppia, elles ne sont jamais transpilées → les fichiers *_shaders_*.frag/.vert
manquent du bundle → null reference en jeu (constaté sur zenith :
Failed to load asset zenith_shaders_lightingChannels, puis crash LevelScene).
Les shaders du moteur (textured/msdf/pixelArt), eux, fonctionnent : ils sont dans le host, donc transpilés normalement.
C'est la même classe de problème que les audio worklets custom (artefacts transpilés spécifiques au projet, générés à la compile) — déjà documentée comme limitation. Ce plan traite shade (le blocage réel de zenith) et pose le même schéma pour les worklets.
ClayBuild.hx:251-252: la compile principale (= HOST en cppia) reçoit--macro shade.macros.ShadeMacro.initRegister(<outTargetPath>).ShadeMacro.initRegister(shade) : pose unContext.onAfterGeneratequi écrit<outTargetPath>/shade/info.json= liste des shaders vus pendant CETTE compile (peuplée par le@:genericBuilddeshade.Shader<V,F>).ClayBuild.hx:562-644: après la compile, litshade/info.json, dédoublonne par hash, lance la taskshade(--in <fichier.hx> --target glsl --out shade/glsl) + variante instanced, gère un skip par comparaisonprev-info.json.copyTranspiledShadersToPlatformAssets()(:178-199) : copie toutshade/glsl/*dans les assets de la plateforme. Déjà appelée aussi quand la compile haxe est skippée.
En cppia, la compile CLIENT (ClayBuild.hx:698-708, clientArgs) n'a NI le
--macro initRegister, NI de passe de transpilation → shaders projet perdus.
Dans le bloc client cppia (clientArgs), ajouter le macro shade pointant vers
un dossier séparé pour ne pas écraser le shade/info.json du host :
clientArgs.push('--macro');
clientArgs.push('shade.macros.ShadeMacro.initRegister(' +
Json.stringify(Path.join([outTargetPath, 'shade-cppia'])) + ')');→ écrit shade-cppia/info.json (shaders du projet uniquement).
Sortir le bloc :562-644 en une fonction locale
transpileShadersFromInfos(infoPaths:Array<String>) qui :
- lit chaque
info.jsonfourni, unionne lesshaders[]par hash (dé-duplication déjà présente, juste étendue à plusieurs sources) ; - garde la même task
shade(une passe standard + une passe instanced) versshade/glsl; - garde le skip par
prev-info.json, mais la clé de comparaison devient l'union (host + client), pour que changer un shader projet réinvalide bien.
Le nom des fichiers GLSL vient du nom de la classe shader → engine et projet ne
collisionnent pas dans shade/glsl. Une seule passe = pas de
deleteRecursive(glsl) qui effacerait la moitié de l'autre.
- Build normal (non-cppia) :
transpileShadersFromInfos(['shade/info.json'])— comportement inchangé. - Build cppia : après une compile client réussie,
transpileShadersFromInfos(['shade/info.json', 'shade-cppia/info.json'])puiscopyTranspiledShadersToPlatformAssets(). (Le host cppia continue d'écrire sonshade/info.jsonpour les shaders moteur.)
La passe de transpilation ne tourne en cppia que si le client a été recompilé
(déjà géré par mustCompileClient) OU si shade/glsl est absent. Réutiliser la
comparaison prev-info.json sur l'union pour éviter une transpilation inutile
quand rien n'a changé.
AudioFiltersMacro.init() (ClayBuild.hx:258-259) a exactement le même
couplage. À traiter pareil : macro sur la compile client + collecte/transpile
worklets depuis le client. Hors périmètre immédiat (zenith ne semble pas
utiliser de worklet custom) — documenté ici pour la cohérence ; à activer si un
projet cppia en a besoin. Ne PAS régresser le chemin natif.
- Le path pur C++/HXCPP et le build natif ne doivent pas changer de
comportement (seul le branchement
cppiaFlagajoute des étapes). - La task
shadeest indépendante de cppia (elle transpile des.hxshader en GLSL) : rien à changer côté plugin shade. - Vérifier les shaders instanced (
#if shade_instanced) : la passe projet doit produire les variantes_instcomme la passe moteur. - Le
@:genericBuilddu shader tourne bien pendant la compile client puisque le code client référence les shaders (zenith : LevelScene) — à confirmer au 1er run.
ceramic clay run mac --cppiasur zenith : plus deFailed to load asset zenith_shaders_*, l'app atteint le gameplay sans null ref. Comparer le rendu au build natif (mêmes shaders visuellement).- Vérifier
shade/glslcontient bien engine + projet, et que les fichiers sont copiés dansproject/mac/<app>.app/Contents/Resources/assets/. - Itération : modifier un shader projet → rebuild cppia rapide → GLSL régénéré.
- Non-régression :
ceramic clay build mac(natif) sur zenith + GcBench — shaders transpilés comme avant, aucunshade-cppia/créé. - Instanced : un shader projet avec
#if shade_instancedproduit son_inst.
Une fois shade réglé sur zenith desktop, reste C3 (mobile) et, si besoin, le même traitement pour les audio worklets custom.