PCGfx_DrawQuad2D

This commit is contained in:
krystalgamer 2024-09-19 18:57:02 +02:00
parent 3d19d640e1
commit 3f0bf8d00f
4 changed files with 203 additions and 20 deletions

View File

@ -1224,7 +1224,7 @@ INLINE void renderScene(void)
g_D3DDevice7->DrawPrimitive(
D3DPT_TRIANGLEFAN,
324,
&pPoly->field_10,
&pPoly->field_10[0],
pPoly->field_C,
0);
@ -1251,7 +1251,7 @@ void validate_DXsound(void)
void validate_DXPOLY(void)
{
VALIDATE_SIZE(DXPOLY, 0x14);
VALIDATE_SIZE(DXPOLY, 0xF0);
VALIDATE(DXPOLY, pNext, 0x0);
VALIDATE(DXPOLY, field_4, 0x4);
@ -1261,3 +1261,16 @@ void validate_DXPOLY(void)
VALIDATE(DXPOLY, field_C, 0xC);
VALIDATE(DXPOLY, field_10, 0x10);
}
void validate_SDXPolyField(void)
{
VALIDATE_SIZE(SDXPolyField, 0x1C);
VALIDATE(SDXPolyField, field_0, 0x0);
VALIDATE(SDXPolyField, field_4, 0x4);
VALIDATE(SDXPolyField, field_8, 0x8);
VALIDATE(SDXPolyField, field_C, 0xC);
VALIDATE(SDXPolyField, field_10, 0x10);
VALIDATE(SDXPolyField, field_14, 0x14);
VALIDATE(SDXPolyField, field_18, 0x18);
}

View File

@ -21,6 +21,17 @@ typedef void* DIDEVICEINSTANCEA;
*/
#endif
struct SDXPolyField
{
float field_0;
float field_4;
float field_8;
float field_C;
u32 field_10;
float field_14;
float field_18;
};
struct DXPOLY
{
DXPOLY* pNext;
@ -28,7 +39,9 @@ struct DXPOLY
u16 mBlendMode;
u16 field_A;
DWORD field_C;
char field_10;
SDXPolyField field_10[4];
u8 padBottom[0x6D];
};
@ -94,5 +107,6 @@ EXPORT extern LPDIRECTINPUT8 g_pDI;
void validate_DXsound(void);
void validate_DXPOLY(void);
void validate_SDXPolyField(void);
#endif

176
PCGfx.cpp
View File

@ -10,6 +10,23 @@
#include <cmath>
EXPORT i8 gPcGfxBrightnessValues[256];
EXPORT u8 gProcessTextureRelated;
EXPORT u16 gChosenBlendingMode;
EXPORT u16 gProcessedTextureFlags;
EXPORT i32 gUseTextureRelated = 0x0FFFFFFFF;
EXPORT DCGfx_BlendingMode gTextureBlendingMode;
EXPORT i32 gPcGfxBlendModeRelated;
EXPORT DXPOLY gDxPolys[15360];
EXPORT float gRenderInitOne[3] = { 10.0f, 8048.0f, 276.0f };
EXPORT float gRenderInitTwo[2] = { 8038.0f, 1.9624f };
EXPORT i32 gPcGfxDrawRelated = 1;
EXPORT i32 gPcGfxSlotNumber = 0x0FFFFFFFF;
EXPORT u8 gIsRenderSettingE = 1;
EXPORT u8 gNonRendderSettingE;
@ -85,10 +102,152 @@ void PCGfx_DrawQPoly3D(float,float,float,float,float,u32,float,float,float,float
printf("PCGfx_DrawQPoly3D(float,float,float,float,float,u32,float,float,float,float,float,u32,float,float,float,float,float,u32,float,float,float,float,float,u32)");
}
// @MEDIUMTODO
void PCGfx_DrawQuad2D(float,float,float,float,float,float,float,float,u32,float,bool)
// @NotOk
// missing low graphics
// might be wrong too
void PCGfx_DrawQuad2D(
float a1,
float a2,
float a3,
float a4,
float a5,
float a6,
float a7,
float a8,
u32 color,
float a10,
bool)
{
printf("PCGfx_DrawQuad2D(float,float,float,float,float,float,float,float,u32,float,bool)");
gPcGfxDrawRelated &= 0xFFFFFFFB;
if (a10 <= 6.0f)
gPcGfxSlotNumber = a10;
float v13 = a10;
if (a10 < 0.0f)
v13 = v13 * a10 + gRenderInitOne[1];
else
v13 = v13 * a10 + gRenderInitOne[0];
float v24 = v13;
print_if_false(v24 > 0.0f, "invalid zOffset!");
SDXPolyField *pDxPolyFields[4];
SDXPolyField dxPolyFields[4];
dxPolyFields[0].field_18 = a6;
dxPolyFields[0].field_4 = a2;
dxPolyFields[1].field_4 = a2;
dxPolyFields[0].field_10 = color;
dxPolyFields[1].field_10 = color;
dxPolyFields[2].field_10 = color;
dxPolyFields[3].field_10 = color;
dxPolyFields[0].field_0 = a1;
dxPolyFields[0].field_14 = a5;
dxPolyFields[3].field_0 = a1;
dxPolyFields[3].field_14 = a5;
pDxPolyFields[2] = &dxPolyFields[2];
float v27 = (v24 - gRenderInitOne[0]) / gRenderInitTwo[0];
dxPolyFields[0].field_8 = v27;
dxPolyFields[1].field_8 = v27;
dxPolyFields[2].field_8 = v27;
dxPolyFields[3].field_8 = v27;
pDxPolyFields[0] = dxPolyFields;
pDxPolyFields[3] = &dxPolyFields[3];
float v32 = gRenderInitOne[2] / v24;
dxPolyFields[0].field_C = v32;
dxPolyFields[1].field_C = v32;
dxPolyFields[2].field_C = v32;
dxPolyFields[3].field_C = v32;
float v28 = a1 + a3;
dxPolyFields[1].field_0 = v28;
dxPolyFields[2].field_0 = v28;
pDxPolyFields[1] = &dxPolyFields[1];
float v25 = a5 + a7;
dxPolyFields[1].field_14 = v25;
dxPolyFields[1].field_18 = a6;
dxPolyFields[2].field_14 = v25;
float v29 = a2 + a4;
dxPolyFields[2].field_4 = v29;
dxPolyFields[3].field_4 = v29;
float v30 = a6 + a8;
dxPolyFields[2].field_18 = v30;
dxPolyFields[3].field_18 = v30;
if (gEndSceneRelatedTwo >= 15360)
{
gEndSceneRelatedTwo++;
return;
}
float v26 = 0.0;
DXPOLY* v16 = &gDxPolys[gEndSceneRelatedTwo++];
i32 v31 = gPcGfxBlendModeRelated;
if (gLowGraphics)
{
// @FIXME: TODO
}
else
{
LPDIRECTDRAWSURFACE7 Direct3DTexture;
if (gUseTextureRelated < 0)
Direct3DTexture = 0;
else
Direct3DTexture = PCTex_GetDirect3DTexture(gUseTextureRelated);
v16->field_4 = Direct3DTexture;
v16->mBlendMode = gChosenBlendingMode;
v16->field_A = gProcessedTextureFlags;
v16->field_C = 4;
SDXPolyField **v21 = pDxPolyFields;
SDXPolyField *v22 = v16->field_10;
for (i32 i = 0; i < 4; i++)
{
memcpy(&v22[i], v21[i], sizeof(SDXPolyField));
i32 v23;
if (gProcessTextureRelated)
v23 = 128;
else
v23 = (v22[i].field_10 >> 24) & 0xFF;
v22[i].field_10 =
gPcGfxBrightnessValues[v22[i].field_10 & 0xFF] |
gPcGfxBrightnessValues[(v22[i].field_10 >> 8) & 0xFF] << 8 |
gPcGfxBrightnessValues[(v22[i].field_10 >> 16) & 0xFF] << 16 |
v23 << 24;
if (v22[i].field_8 < 0.0f)
{
v22[i].field_8 = 0.0f;
}
else if (v22[i].field_8 > 0.99989998f)
{
v22[i].field_8 = 0.99989998f;
v26 = v22[i].field_8;
}
else if (v26 < v22[i].field_8)
{
v26 = v22[i].field_8;
}
}
if ( gChosenBlendingMode )
{
v31 = 0;
}
}
DXPOLY_DrawPoly(v16, gPcGfxSlotNumber, v31, v26);
gPcGfxSlotNumber = -1;
}
// @MEDIUMTODO
@ -184,10 +343,6 @@ EXPORT i32 gBlendingModes[DCGfx_BlendingMode_MAX + 1] =
0, 1, 2, 3, 4
};
EXPORT u8 gProcessTextureRelated;
EXPORT u16 gChosenBlendingMode;
EXPORT u16 gProcessedTextureFlags;
// @NotOk
// missing low graphics stuff
void PCGfx_ProcessTexture(
@ -243,9 +398,6 @@ void PCGfx_ProcessTexture(
}
}
EXPORT float gRenderInitOne[3] = { 10.0f, 8048.0f, 276.0f };
EXPORT float gRenderInitTwo[2] = { 8038.0f, 1.9624f };
// @Ok
// @Matching
void PCGfx_RenderInit(float a1, float a2, float a3)
@ -300,7 +452,6 @@ void PCGfx_RenderModelPreview(
PCGfx_EndScene(1);
}
EXPORT i8 gPcGfxBrightnessValues[256];
EXPORT float gPcGfxBrightnessPower[8] =
{
0.80000001f,
@ -415,9 +566,6 @@ INLINE void PCGfx_SetSkyColor(u32 a1)
DXPOLY_SetBackgroundColor(a1 | 0xFF000000);
}
EXPORT i32 gUseTextureRelated = 0x0FFFFFFFF;
EXPORT DCGfx_BlendingMode gTextureBlendingMode;
// @Ok
// @Matching
void PCGfx_UseTexture(i32 a1, DCGfx_BlendingMode a2)

View File

@ -1,6 +1,6 @@
#include "non_win32.h"
// #define BOOT_GAME
#define BOOT_GAME
#include "main.h"
#include "ob.h"
@ -80,6 +80,8 @@
#include "pack.h"
#include "pal.h"
#include "db.h"
#include "ps2m3d.h"
#include "PCGfx.h"
extern int FAIL_VALIDATION;
@ -98,9 +100,14 @@ void SpideyMain(void)
{
while(1)
{
gWideScreen = 16;
DXPOLY_SetBackgroundColor(0xFF800080);
DXPOLY_BeginScene();
DXPOLY_EndScene(true);
gWideScreen = 16;
PCGfx_BeginScene(1, -1);
gWideScreen = 16;
M3d_RenderCleanup();
gWideScreen = 16;
PCGfx_EndScene(1);
}
}
@ -408,6 +415,7 @@ i32 validate(void)
validate_tag_S_Pal();
validate_SViewport();
validate_SDoubleBuffer();
validate_SDXPolyField();
puts("[*] Validation done!");