Crie com ChatGPT, Claude ou outra IA
Copie o prompt abaixo, troque a linha DESCRIÇÃO pelo que você imagina e cole no chat. A IA
devolve os arquivos; você salva nas pastas indicadas, roda python3 pack.py <pasta> e importa
pelo + na aba Instalados.
Dica: se a IA puder ler links, mande também https://engine.oprimo.dev/docs/llms-full.txt,
que traz a especificação completa num arquivo só.
Prompt: shader Metal (grátis, leve na bateria)
Você vai criar um wallpaper animado para o PrimoEngine (macOS) do tipo "metal".
DESCRIÇÃO: <descreva aqui, ex.: "aurora boreal suave em tons de verde e roxo sobre um céu estrelado">
Entregue EXATAMENTE dois blocos de código, nada mais:
1) manifest.json (salvo em <pasta>/manifest.json)
2) shader.metal (salvo em <pasta>/content/shader.metal)
Regras do manifest.json:
- {"schemaVersion": 1, "id": "com.user.<slug>", "version": "1.0.0", "title": "<título curto>",
"type": "metal", "entry": "content/shader.metal", "minMacOS": "26.0",
"config": [
{"key":"speed","type":"float","min":0.1,"max":3.0,"default":1.0,"label":"Speed"},
{"key":"tint","type":"color","default":"#FFFFFF","label":"Tint"}],
"capabilities": {"network": []}}
- Não inclua "checksum" (o pack.py calcula). Não adicione outros itens em config (o shader só recebe speed e tint).
Regras do shader.metal (Metal Shading Language, compilado em runtime no macOS 26):
- Comece com: #include <metal_stdlib> e using namespace metal;
- Declare exatamente:
struct Uniforms { float2 resolution; float time; float speed; float4 tint; };
struct VOut { float4 position [[position]]; };
vertex VOut v_main(uint vid [[vertex_id]]) {
float2 p = float2((vid << 1) & 2, vid & 2);
VOut o; o.position = float4(p * 2.0 - 1.0, 0.0, 1.0); return o; }
- Fragmento: fragment float4 f_main(float4 fragCoord [[position]], constant Uniforms& u [[buffer(0)]])
- fragCoord.xy está em pixels, origem no canto superior esquerdo (y cresce para baixo).
uv = fragCoord.xy / u.resolution. Anime com u.time * u.speed. Multiplique a cor final por u.tint.rgb.
Retorne alfa 1.0.
- PROIBIDO em qualquer lugar do código (inclusive em nomes): "kernel ", "[[kernel", "device ",
"threadgroup ", "atomic_", "#include \"". Sem texturas, sem samplers, sem buffers além do Uniforms,
sem iMouse.
- É MSL, não GLSL: use float2/float3/float4, fmod em vez de mod, fract, mix, smoothstep;
literais float com ponto (1.0); funções auxiliares antes de f_main; sem recursão.
- Deve ser bonito em tela cheia, animação suave e em loop contínuo, e barato para a GPU
(no máximo ~64 iterações por pixel).
Prompt: web / Canvas / WebGL (grátis)
Você vai criar um wallpaper animado para o PrimoEngine (macOS) do tipo "web".
DESCRIÇÃO: <descreva aqui>
Entregue EXATAMENTE dois blocos de código:
1) manifest.json (salvo em <pasta>/manifest.json)
2) index.html (salvo em <pasta>/content/web/index.html), um único arquivo, CSS e JS embutidos.
manifest.json:
- {"schemaVersion": 1, "id": "com.user.<slug>", "version": "1.0.0", "title": "<título>",
"type": "web", "entry": "content/web/index.html", "minMacOS": "26.0",
"config": [ ...2 a 5 ajustes úteis... ], "capabilities": {"network": []}}
- Tipos de ajuste permitidos: "float" e "int" (com min, max, default), "bool" (default true/false),
"color" (default "#RRGGBB"). Cada um com "key" e "label". Nada de "enum". Sem "checksum".
index.html:
- Roda num WKWebView (Safari/WebKit) em tela cheia, atrás dos ícones da mesa. SEM INTERNET:
nada de CDN, fetch, fontes externas ou imagens remotas. Sem mouse/teclado. Sem localStorage.
- Leia os ajustes assim, com padrões iguais aos do manifest:
const cfg = { /* padrões */ };
window.LiveWallpaper = window.LiveWallpaper || {};
function readConfig(c) { Object.assign(cfg, c || {}); /* reaplicar */ }
window.LiveWallpaper.onConfig = readConfig;
readConfig(window.LiveWallpaper.config);
Ajustes "int" chegam como decimal: use Math.round. "color" chega como "#RRGGBB".
- Anime com requestAnimationFrame; trate resize e devicePixelRatio; html/body sem margem,
overflow hidden, fundo escuro.
- Canvas 2D ou WebGL puro (sem bibliotecas externas). Leve para a bateria.
Se der erro
Cole a mensagem de erro do app (ou do pack.py) de volta na conversa, junto com a
tabela de erros, e peça a correção.