O motor da Criogenio
Nossos jogos rodam no Campsur, o motor que nós mesmos escrevemos. Motor, editor e ferramentas são um só código em C++23, moldado pelos jogos que lançamos: um conjunto pequeno de sistemas explícitos e código legível, em vez de um motor que tenta fazer tudo.
- Linguagem
- C++23
- Plataforma
- SDL3
- Gráficos
- OpenGL
- Física
- Jolt
- Interface
- RmlUi
- Rede
- ENet, Steam
Renderização
Um renderizador OpenGL para 2D e 3D sobre SDL3. Modelos glTF com skinning na GPU, um sol e luzes pontuais que projetam sombras (cube maps para cada lanterna com sombra), brilho emissivo, bloom e tonemapping, um céu procedural com ciclo de dia e paredes que se apagam quando ficam entre a câmera e o grupo.
Entity component system
Entidades e componentes em sparse sets, sistemas rodando em fases ordenadas com passo fixo, consultas de vários componentes em cache e um mundo que salva e carrega níveis em JSON simples.
Física
Jolt Physics para 3D: corpos rígidos, controladores de personagem, objetos cinemáticos e veículos com rodas, sincronizados com o ECS a cada passo. Jogos de sprites têm um sistema leve de colisão 2D só para eles.
Animação esquelética
Conjuntos de animação ligam papéis (parado, correr, atacar, conjurar) a clipes, então o jogo pede um papel e nunca o nome de um clipe. O retargeting toca clipes entre famílias de esqueletos, como rigs no estilo Mixamo e no estilo Unreal. Transições suaves, controladores em camadas com máscaras, eventos de clipe para passos e janelas de golpe, locomoção que acompanha a velocidade, personagens montados com partes separadas e sockets de osso que mantêm nas mãos o que o personagem segura.
Cooperativo online
Rede ENet e Steam atrás de um mesmo transporte. O cooperativo online roda em lockstep determinístico: o anfitrião reúne a entrada de cada jogador a cada tick e os participantes comparam hashes do estado para pegar qualquer divergência. Também há replicação por snapshots com interpolação e predição no cliente, chat de voz com Opus, e transportes de loopback que simulam latência, jitter e perda nos testes.
Interface do jogo
Menus, painéis e HUDs são documentos RmlUi estilizados como páginas web, com data binding, navegação por controle e teclado, telas de um só jogador no cooperativo local, popups e avisos, e textos traduzidos.
Dados ao vivo
Os dados de ajuste de um jogo são descritos uma vez em C++ e salvos em JSON. Qualquer valor pode ser editado com o jogo rodando, pelo editor dentro do jogo, pelo console ou pela janela Data do editor, com faixas, unidades e dicas tiradas dessa mesma descrição, e os arquivos recarregam assim que mudam.
Efeitos
Os efeitos visuais também são dados: emissores de partículas, malhas como ondas de choque e cortes, e avisos no chão para os ataques dos inimigos, sempre fora da simulação, então nunca afetam o lockstep.
Editor
Um editor para todo projeto: uma viewport de cena 2D e 3D com jogar no editor, hierarquia, inspetor e um navegador de assets com miniaturas; uma janela Data para qualquer asset de dados; ferramentas de animação para eventos de clipe e controladores de animação; e uma janela de efeitos.
Import Animation Pack
Abra um pacote de clipes (.glb, .gltf, .fbx ou .blend), deixe o editor detectar a família do esqueleto e a pose de referência, veja qualquer clipe com retargeting no seu personagem, dê um papel aos clipes que quiser e importe-os, recortados, para o conjunto de animação do projeto.
O empacotador (cook)
Empacota um jogo só com os arquivos que ele usa: segue cada caminho citado nos dados, níveis e código do jogo, junta o executável com as bibliotecas que ele carrega e gera um zip por plataforma. Uma variante como a demo deixa de fora tudo o que vem depois do fim dela, e o empacotamento falha se um arquivo enviado ainda usar algo que ficou de fora.
Feito para os jogos
O Campsur cresceu junto com A Estalagem da Lanterna: os efeitos, o cooperativo em lockstep, os conjuntos de animação e o empacotador saíram do que o jogo precisava e depois viraram parte do motor para o próximo. Todo jogo abre com o logo do motor e com aquilo de que ele é feito.
Testado sem tela
Testes de unidade e de integração rodam sem janela a cada push, junto com testes de fumaça que abrem cada projeto no editor, uma verificação que inicia cada jogo de exemplo e acompanha o log, e imagens de referência da viewport do editor.