Desenvolvendo para o PlayStation em 2024
Lucas S. Vieira
19 de outubro de 2024
UaiDev Talks 2024
Desenvolvedor na Workalove EdTech
Interesses: Ciência cognitiva, teoria da computação, desenvolvimento de linguagens, desenvolvimento de jogos, programação bare-metal
Co-fundador da Common Lisp Brasil
lisp.com.br
luksamuk
https://luksamuk.codes/
luksamuk
Esta apresentação tem links interativos! QR Code ao final.
Figura: Ken Kutaragi e o Sony PlayStation
Quarta geração de consoles (1987)
3D já era uma realidade em filmes e simulações, e até em alguns jogos (principalmente em arcades).
Exemplo: StarFox (SNES, 1993)
Consoles de 32-bits que introduziam o CD-ROM como mídia física*.
Objetivo: Colocar milhares de polígonos na tela – 3D!
*Exceto o Nintendo 64.
Sonic R (Sega Saturn), Crash Bandicoot (Sony PlayStation) e The Legend of Zelda: Ocarina of Time (Nintendo 64).
Plataforma: Windows XP / Windows 98
Figura: Kit de desenvolvimento oficial do PS1.
Promoção da Sony para atrair hobbyistas / indie devs. Incluía um PlayStation para desenvolvimento, cabo serial, Psy-Q SDK, guias de desenvolvimento e de hardware…
Figura: Sony Net Yaroze com o SDK.
Plataforma: Windows 11 / Linux
Figura: Dashboard da extensão PSX.Dev para VSCode.
armips
)Figura: Placa-mãe de um PlayStation modelo SCPH-1000.
AO LADO: Dieshot do CXD8530Q (primeira revisão), tirado da apresentação do Ken Kutaragi na Hot Chips '99.
Fonte: PlayStation Dev Wiki
A especificação das CPUs MIPS 32-bit possuía um co-processador Cop1 para float, e um D-Cache para acesso à RAM.
O PlayStation 1 não possui nenhum dos dois.
Solução: fixed-points e scratchpad.
Jogo: Spider-Man (PSX). Tente notar os artefatos (polygon jittering, z-fighting, t-junctions…)
Fonte: PlayStation Hardware Reference
Esfera low-poly com reflexão especular.
Banjo, personagem de Banjo-Kazooie, como visto no Nintendo 64.
Figura: Detalhe do Psy-Q SDK.
Passo 1: Definir os vértices e a ordem deles para cada triângulo:
// NOTA: 64 = 0.015625
// (note que 4096 = 1.0)
SVECTOR vertices[] = {
{ -64, -64, -64 },
{ 64, -64, -64 },
{ 64, -64, 64 },
{ -64, -64, 64 },
{ -64, 64, -64 },
{ 64, 64, -64 },
{ 64, 64, 64 },
{ -64, 64, 64 }
};
short faces[] = {
0, 3, 2, // top
0, 2, 1,
4, 0, 1, // front
4, 1, 5,
7, 4, 5, // bottom
7, 5, 6,
5, 1, 2, // right
5, 2, 6,
2, 3, 7, // back
2, 7, 6,
0, 4, 7, // left
0, 7, 3
};
Passo 2: Popular a matriz do mundo com rotação, translação e escala
static SVECTOR rotation = {0, 0, 0}; // manipulado via código
static VECTOR translation = {0, 0, 700}; // 0.4375
static VECTOR scale = {ONE, ONE, ONE};
static MATRIX world = {0};
// Populate world matrix with rotation, translation,
// scale values
RotMatrix(&rotation, &world);
TransMatrix(&world, &translation);
ScaleMatrix(&world, &scale);
// Sets world matrix to be used by the GTE for rotation
// and translation
SetRotMatrix(&world);
SetTransMatrix(&world);
Passo 3: Para cada triângulo, transformar seus vértices e transformá-los em pontos 2D:
for(i = 0; i < NUM_FACES * 3; i += 3) {
POLY_G3 *poly = (POLY_G3*)nextprim;
setPolyG3(poly);
setRGB0(poly, 255, 0, 255);
setRGB1(poly, 255, 255, 0);
setRGB2(poly, 0, 255, 255);
nclip = RotAverageNclip3(
&vertices[faces[i + 0]],
&vertices[faces[i + 1]],
&vertices[faces[i + 2]],
(long*)&poly->x0,
(long*)&poly->x1,
(long*)&poly->x2,
&p, &otz, &flg);
// ...
}
Passo 4: Verificar se a primitiva deveria estar sendo desenhada na tela (normal clipping) e colocá-la na ordering table (lista de primitivas):
for(i = 0; i < NUM_FACES * 3; i += 3) {
// ...
if(nclip <= 0) continue;
if((otz > 0) && (otz < OT_LENGTH)) {
addPrim(ot[currbuff][otz], poly);
nextprim += sizeof(POLY_G3);
}
}
Passo 5: Esperar vsync; desenhar quadro anterior; realizar sorting dos polígonos.
DrawSync(0);
VSync(0);
PutDispEnv(
&screen.disp[currbuff]);
PutDrawEnv(
&screen.draw[currbuff]);
DrawOTag(
ot[currbuff] +
OT_LENGTH - 1);
Pequenos projetos que desenvolvi usando este aprendizado.
Clone parcial do jogo WipEout. Desenvolvido durante o curso PS1 Programming with MIPS Assembly & C.
ATENÇÃO: Os controles são ruins. Você foi avisado(a). :P
engine-psx
)Fan-game de Sonic The Hedgehog utilizando técnicas do hardware do PSX (áudio CD-XA, FMVs via MDEC, etc.)
ATENÇÃO: Este emulador não toca o áudio. Não é culpa minha…
Acesse esta apresentação:
https://luksamuk.codes/talks/psx-programming.html
lucasvieira@protonmail.com
luksamuk
https://luksamuk.codes/
luksamuk