PS2: 3D renders something now

This commit is contained in:
UnknownShadow200 2023-11-22 20:56:11 +11:00
parent 2f58a44e31
commit 1c5f90285b
5 changed files with 149 additions and 23 deletions

View File

@ -149,6 +149,8 @@ vita:
$(MAKE) -f misc/vita/Makefile PLAT=vita $(MAKE) -f misc/vita/Makefile PLAT=vita
ps3: ps3:
$(MAKE) -f misc/ps3/Makefile PLAT=ps3 $(MAKE) -f misc/ps3/Makefile PLAT=ps3
ps2:
$(MAKE) -f misc/ps2/Makefile PLAT=ps2
3ds: 3ds:
$(MAKE) -f misc/3ds/Makefile PLAT=3ds $(MAKE) -f misc/3ds/Makefile PLAT=3ds
wii: wii:

View File

@ -318,6 +318,7 @@ typedef cc_uint8 cc_bool;
#define CC_BUILD_OPENAL #define CC_BUILD_OPENAL
#define CC_BUILD_PS2 #define CC_BUILD_PS2
#define CC_BUILD_LOWMEM #define CC_BUILD_LOWMEM
#define CC_BUILD_COOPTHREADED
#undef CC_BUILD_FREETYPE #undef CC_BUILD_FREETYPE
#endif #endif
#endif #endif

View File

@ -15,6 +15,7 @@
static void* gfx_vertices; static void* gfx_vertices;
static framebuffer_t fb_color; static framebuffer_t fb_color;
static zbuffer_t fb_depth; static zbuffer_t fb_depth;
static float vp_hwidth, vp_hheight;
// double buffering // double buffering
static packet_t* packets[2]; static packet_t* packets[2];
@ -31,6 +32,7 @@ void Gfx_FreeState(void) {
FreeDefaultResources(); FreeDefaultResources();
} }
// TODO: Maybe move to Window backend and just initialise once ??
static void InitBuffers(void) { static void InitBuffers(void) {
fb_color.width = DisplayInfo.Width; fb_color.width = DisplayInfo.Width;
fb_color.height = DisplayInfo.Height; fb_color.height = DisplayInfo.Height;
@ -53,7 +55,7 @@ static void InitDrawingEnv(void) {
q = draw_setup_environment(q, 0, &fb_color, &fb_depth); q = draw_setup_environment(q, 0, &fb_color, &fb_depth);
// GS can render from 0 to 4096, so set primitive origin to centre of that // GS can render from 0 to 4096, so set primitive origin to centre of that
q = draw_primitive_xyoffset(q, 0, 2048 - DisplayInfo.Width / 2, 2048 - DisplayInfo.Height / 2); q = draw_primitive_xyoffset(q, 0, 2048 - vp_hwidth, 2048 - vp_hheight);
q = draw_finish(q); q = draw_finish(q);
@ -64,8 +66,8 @@ static void InitDrawingEnv(void) {
} }
static void InitDMABuffers(void) { static void InitDMABuffers(void) {
packets[0] = packet_init(100, PACKET_NORMAL); packets[0] = packet_init(10000, PACKET_NORMAL);
packets[1] = packet_init(100, PACKET_NORMAL); packets[1] = packet_init(10000, PACKET_NORMAL);
} }
static void FlipContext(void) { static void FlipContext(void) {
@ -78,6 +80,9 @@ static void FlipContext(void) {
} }
void Gfx_Create(void) { void Gfx_Create(void) {
vp_hwidth = DisplayInfo.Width / 2;
vp_hheight = DisplayInfo.Height / 2;
InitBuffers(); InitBuffers();
InitDrawingEnv(); InitDrawingEnv();
InitDMABuffers(); InitDMABuffers();
@ -234,11 +239,18 @@ void Gfx_DeleteDynamicVb(GfxResourceID* vb) { Gfx_DeleteVb(vb); }
/*########################################################################################################################* /*########################################################################################################################*
*---------------------------------------------------------Matrices--------------------------------------------------------* *---------------------------------------------------------Matrices--------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
static struct Matrix _view, _proj, mvp;
void Gfx_LoadMatrix(MatrixType type, const struct Matrix* matrix) { void Gfx_LoadMatrix(MatrixType type, const struct Matrix* matrix) {
if (type == MATRIX_VIEW) _view = *matrix;
if (type == MATRIX_PROJECTION) _proj = *matrix;
Matrix_Mul(&mvp, &_view, &_proj);
// TODO // TODO
} }
void Gfx_LoadIdentityMatrix(MatrixType type) { void Gfx_LoadIdentityMatrix(MatrixType type) {
Gfx_LoadMatrix(type, &Matrix_Identity);
// TODO // TODO
} }
@ -292,17 +304,126 @@ void Gfx_SetVertexFormat(VertexFormat fmt) {
gfx_stride = strideSizes[fmt]; gfx_stride = strideSizes[fmt];
} }
typedef struct Vector4 { float X, Y, Z, W; } Vector4;
static cc_bool NotClipped(Vector4 pos) {
return
pos.X >= -pos.W && pos.X <= pos.W &&
pos.Y >= -pos.W && pos.Y <= pos.W &&
pos.Z >= -pos.W && pos.Z <= pos.W;
}
static Vector4 TransformVertex(struct VertexTextured* pos) {
Vector4 coord;
coord.X = pos->X * mvp.row1.X + pos->Y * mvp.row2.X + pos->Z * mvp.row3.X + mvp.row4.X;
coord.Y = pos->X * mvp.row1.Y + pos->Y * mvp.row2.Y + pos->Z * mvp.row3.Y + mvp.row4.Y;
coord.Z = pos->X * mvp.row1.Z + pos->Y * mvp.row2.Z + pos->Z * mvp.row3.Z + mvp.row4.Z;
coord.W = pos->X * mvp.row1.W + pos->Y * mvp.row2.W + pos->Z * mvp.row3.W + mvp.row4.W;
return coord;
}
#define VCopy(dst, src) dst.x = (vp_hwidth/2048) * (src.X / src.W); dst.y = (vp_hheight/2048) * (src.Y / src.W); dst.z = src.Z / src.W; dst.w = src.W;
//#define VCopy(dst, src) dst.x = vp_hwidth * (1 + src.X / src.W); dst.y = vp_hheight * (1 - src.Y / src.W); dst.z = src.Z / src.W; dst.w = src.W;
#define CCopy(dst) dst.r = PackedCol_R(v->Col) / 255.0f; dst.g = PackedCol_G(v->Col) / 255.0f; dst.b = PackedCol_B(v->Col) / 255.0f; dst.a = PackedCol_A(v->Col) / 255.0f;
static void DrawTriangle(Vector4 v0, Vector4 v1, Vector4 v2, struct VertexTextured* v) {
vertex_f_t in_vertices[3];
color_f_t in_color[3];
//Platform_Log4("X: %f3, Y: %f3, Z: %f3, W: %f3", &v0.X, &v0.Y, &v0.Z, &v0.W);
xyz_t out_vertices[3];
color_t out_color[3];
VCopy(in_vertices[0], v0);
VCopy(in_vertices[1], v1);
VCopy(in_vertices[2], v2);
//Platform_Log4(" X: %f3, Y: %f3, Z: %f3, W: %f3", &in_vertices[0].x, &in_vertices[0].y, &in_vertices[0].z, &in_vertices[0].w);
CCopy(in_color[0]);
CCopy(in_color[1]);
CCopy(in_color[2]);
prim_t prim;
color_t color;
// Define the triangle primitive we want to use.
prim.type = PRIM_TRIANGLE;
prim.shading = PRIM_SHADE_GOURAUD;
prim.mapping = DRAW_DISABLE;
prim.fogging = DRAW_DISABLE;
prim.blending = DRAW_DISABLE;
prim.antialiasing = DRAW_DISABLE;
prim.mapping_type = PRIM_MAP_ST;
prim.colorfix = PRIM_UNFIXED;
color.r = 0x80;
color.g = 0x80;
color.b = 0x80;
color.a = 0x80;
color.q = 1.0f;
draw_convert_rgbaq(out_color, 3, in_vertices, in_color);
draw_convert_xyz(out_vertices, 2048, 2048, 32, 3, in_vertices);
// Draw the triangles using triangle primitive type.
q = draw_prim_start(q, 0, &prim, &color);
for(int i = 0; i < 3; i++)
{
q->dw[0] = out_color[i].rgbaq;
q->dw[1] = out_vertices[i].xyz;
q++;
}
q = draw_prim_end(q,2,DRAW_RGBAQ_REGLIST);
}
static void DrawTriangles(int verticesCount, int startVertex) {
if (gfx_format == VERTEX_FORMAT_COLOURED) return;
struct VertexTextured* v = (struct VertexTextured*)gfx_vertices + startVertex;
for (int i = 0; i < verticesCount / 4; i++, v += 4)
{
Vector4 V0 = TransformVertex(v + 0);
Vector4 V1 = TransformVertex(v + 1);
Vector4 V2 = TransformVertex(v + 2);
Vector4 V3 = TransformVertex(v + 3);
//Platform_Log3("X: %f3, Y: %f3, Z: %f3", &v[0].X, &v[0].Y, &v[0].Z);
//Platform_Log3("X: %f3, Y: %f3, Z: %f3", &v[1].X, &v[1].Y, &v[1].Z);
//Platform_Log3("X: %f3, Y: %f3, Z: %f3", &v[2].X, &v[2].Y, &v[2].Z);
//Platform_Log3("X: %f3, Y: %f3, Z: %f3", &v[3].X, &v[3].Y, &v[3].Z);
//Platform_LogConst(">>>>>>>>>>");
if (NotClipped(V0) && NotClipped(V1) && NotClipped(V2)) {
DrawTriangle(V0, V1, V2, v);
}
if (NotClipped(V2) && NotClipped(V3) && NotClipped(V0)) {
DrawTriangle(V2, V3, V0, v);
}
//Platform_LogConst("-----");
}
}
void Gfx_DrawVb_Lines(int verticesCount) { } /* TODO */ void Gfx_DrawVb_Lines(int verticesCount) { } /* TODO */
void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) { void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex) {
// TODO // TODO
DrawTriangles(verticesCount, startVertex);
} }
void Gfx_DrawVb_IndexedTris(int verticesCount) { void Gfx_DrawVb_IndexedTris(int verticesCount) {
DrawTriangles(verticesCount, 0);
// TODO // TODO
} }
void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) { void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) {
DrawTriangles(verticesCount, startVertex);
// TODO // TODO
} }
@ -318,12 +439,8 @@ cc_bool Gfx_WarnIfNecessary(void) {
return false; return false;
} }
static int FRAME;
void Gfx_BeginFrame(void) { void Gfx_BeginFrame(void) {
Platform_LogConst("--- Frame ---"); //Platform_LogConst("--- Frame ---");
Gfx_ClearCol(PackedCol_Make(200 + FRAME, 51, 42, 255));
// TODO
FRAME++;
} }
void Gfx_EndFrame(void) { void Gfx_EndFrame(void) {

View File

@ -50,7 +50,7 @@ void Platform_Log(const char* msg, int len) {
len = min(len, 2048); len = min(len, 2048);
Mem_Copy(tmp, msg, len); tmp[len] = '\0'; Mem_Copy(tmp, msg, len); tmp[len] = '\0';
_print("%s\n", tmp); _print("%s", tmp);
} }
#define UnixTime_TotalMS(time) ((cc_uint64)time.tv_sec * 1000 + UNIX_EPOCH + (time.tv_usec / 1000)) #define UnixTime_TotalMS(time) ((cc_uint64)time.tv_sec * 1000 + UNIX_EPOCH + (time.tv_usec / 1000))

View File

@ -24,8 +24,6 @@
static cc_bool launcherMode; static cc_bool launcherMode;
static char padBuf[256] __attribute__((aligned(64))); static char padBuf[256] __attribute__((aligned(64)));
static framebuffer_t win_fb;
static void InitFramebuffer(void);
struct _DisplayData DisplayInfo; struct _DisplayData DisplayInfo;
struct _WinData WindowInfo; struct _WinData WindowInfo;
@ -42,16 +40,14 @@ static void LoadModules(void) {
} }
void Window_Init(void) { void Window_Init(void) {
InitFramebuffer(); DisplayInfo.Width = 640;
DisplayInfo.Height = graph_get_region() == GRAPH_MODE_PAL ? 512 : 448;
DisplayInfo.Width = win_fb.width;
DisplayInfo.Height = win_fb.height;
DisplayInfo.Depth = 4; // 32 bit DisplayInfo.Depth = 4; // 32 bit
DisplayInfo.ScaleX = 1; DisplayInfo.ScaleX = 1;
DisplayInfo.ScaleY = 1; DisplayInfo.ScaleY = 1;
WindowInfo.Width = win_fb.width; WindowInfo.Width = DisplayInfo.Width;
WindowInfo.Height = win_fb.height; WindowInfo.Height = DisplayInfo.Height;
WindowInfo.Focused = true; WindowInfo.Focused = true;
WindowInfo.Exists = true; WindowInfo.Exists = true;
@ -63,12 +59,18 @@ void Window_Init(void) {
padPortOpen(0, 0, padBuf); padPortOpen(0, 0, padBuf);
} }
void Window_Create2D(int width, int height) { static cc_bool hasCreated;
launcherMode = true; static void ResetGfxState(void) {
Gfx_Create(); // launcher also uses RSX to draw if (!hasCreated) { hasCreated = true; return; }
graph_shutdown();
graph_vram_clear();
dma_channel_shutdown(DMA_CHANNEL_GIF,0);
} }
void Window_Create3D(int width, int height) { void Window_Create3D(int width, int height) {
ResetGfxState();
launcherMode = false; launcherMode = false;
} }
@ -162,11 +164,15 @@ void Window_DisableRawMouse(void) { Input.RawMode = false; }
/*########################################################################################################################* /*########################################################################################################################*
*------------------------------------------------------Framebuffer--------------------------------------------------------* *------------------------------------------------------Framebuffer--------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
static framebuffer_t win_fb;
static struct Bitmap fb_bmp; static struct Bitmap fb_bmp;
static void InitFramebuffer(void) { void Window_Create2D(int width, int height) {
win_fb.width = 640; ResetGfxState();
win_fb.height = graph_get_region() == GRAPH_MODE_PAL ? 512 : 448; launcherMode = true;
win_fb.width = DisplayInfo.Width;
win_fb.height = DisplayInfo.Height;
win_fb.mask = 0; win_fb.mask = 0;
win_fb.psm = GS_PSM_32; win_fb.psm = GS_PSM_32;
win_fb.address = graph_vram_allocate(win_fb.width, win_fb.height, win_fb.psm, GRAPH_ALIGN_PAGE); win_fb.address = graph_vram_allocate(win_fb.width, win_fb.height, win_fb.psm, GRAPH_ALIGN_PAGE);