Skip to content

Commit 6d0ff63

Browse files
committed
- draw sky a bit more efficient on PSX
1 parent f025b90 commit 6d0ff63

1 file changed

Lines changed: 42 additions & 70 deletions

File tree

src_rebuild/Game/C/sky.c

Lines changed: 42 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ struct FLAREREC
2424
short gapmod;
2525
};
2626

27-
int sky_y_offset[4] = { 17, 17, 17, 17 };
27+
int sky_y_offset[4] = { -17, -17, -17, -17 };
2828

2929
unsigned char HorizonLookup[4][4] = {
3030
{0, 0, 20, 20},
@@ -824,10 +824,8 @@ DVECTORF scratchPad_skyVertices[35]; // 1f800044
824824
#define scratchPad_skyVertices ((DVECTOR*)getScratchAddr(0x11)) // 1f800044
825825
#endif
826826

827-
short scratchPad_zbuff[256];
828-
829827
// [D] [T]
830-
void PlotSkyPoly(POLYFT4* polys, int skytexnum, unsigned char r, unsigned char g, unsigned char b, int offset)
828+
void PlotSkyPoly(POLYFT4* polys, int skytexnum, unsigned char r, unsigned char g, unsigned char b)
831829
{
832830
POLYFT4* src;
833831
POLY_FT4* poly;
@@ -882,129 +880,103 @@ void PlotHorizonMDL(MODEL* model, int horizontaboffset)
882880
SVECTOR* verts;
883881

884882
#ifdef USE_PGXP
885-
DVECTORF* dv0;
886-
DVECTORF* dv1;
887-
DVECTORF* dv2;
883+
DVECTORF* dv;
888884
#else
889-
DVECTOR* dv0;
890-
DVECTOR* dv1;
891-
DVECTOR* dv2;
885+
DVECTOR* dv;
892886
#endif
893887

894-
SVECTOR* v0;
895-
SVECTOR* v1;
896-
SVECTOR* v2;
897-
898888
int count;
899-
900889
unsigned char* polys;
901-
902-
int green;
903-
int red;
904-
int blue;
905-
890+
int red, green, blue;
906891
int z;
907892

893+
z = -1;
908894
verts = (SVECTOR*)model->vertices;
909-
count = 0;
910-
911-
dv0 = scratchPad_skyVertices;
912-
dv1 = scratchPad_skyVertices + 1;
913-
dv2 = scratchPad_skyVertices + 2;
914-
915-
v0 = verts;
916-
v1 = verts + 1;
917-
v2 = verts + 2;
895+
dv = scratchPad_skyVertices;
896+
count = model->num_vertices;
918897

919898
#ifdef USE_PGXP
920899
PGXP_SetZOffsetScale(0.0f, 256.0f);
921900
#endif
922901

923-
while (count < model->num_vertices)
902+
do
924903
{
925-
SVECTOR sv0 = *v0;
926-
SVECTOR sv1 = *v1;
927-
SVECTOR sv2 = *v2;
928-
929-
sv0.vy -= sky_y_offset[GameLevel];
930-
sv1.vy -= sky_y_offset[GameLevel];
931-
sv2.vy -= sky_y_offset[GameLevel];
932-
933-
gte_ldv3(&sv0, &sv1, &sv2);
904+
gte_ldv3(verts, verts+1, verts+2);
934905
gte_rtpt();
935-
gte_stsxy3(dv0, dv1, dv2);
906+
gte_stsxy3(dv, dv+1, dv+2);
936907

937908
if(count == 15)
938909
gte_stszotz(&z);
939910

940911
#ifdef USE_PGXP
941912
// store PGXP index
942913
// HACK: -1 is needed here for some reason
943-
dv0->pgxp_index = dv1->pgxp_index = dv2->pgxp_index = PGXP_GetIndex() - 1;
914+
dv[0].pgxp_index = dv[1].pgxp_index = dv[2].pgxp_index = PGXP_GetIndex() - 1;
944915
#endif
945-
946-
dv2 += 3;
947-
dv1 += 3;
948-
dv0 += 3;
949-
950-
v2 += 3;
951-
v1 += 3;
952-
v0 += 3;
953-
954-
count += 3;
955-
}
916+
dv += 3;
917+
verts += 3;
918+
count -= 3;
919+
} while (count);
956920

957921
#ifdef USE_PGXP
958922
PGXP_SetZOffsetScale(0.0f, 1.0f);
959923
#endif
960924

961925
if (z > 0)
962926
{
927+
int polySize;
928+
u_char* horizonTex = &HorizonTextures[horizontaboffset];
963929
polys = (unsigned char*)model->poly_block;
930+
polySize = PolySizes[*polys];
964931

965932
red = skycolor.r;
966933
green = skycolor.g;
967934
blue = skycolor.b;
968935

969-
count = 0;
970-
971-
while (count < model->num_polys)
936+
// draw sky
937+
count = model->num_polys;
938+
do
972939
{
973-
if (count == 12)
974-
{
975-
red /= 2;
976-
green /= 2;
977-
blue /= 2;
978-
}
940+
PlotSkyPoly((POLYFT4*)polys, *horizonTex++, red, green, blue);
941+
polys += polySize;
942+
} while (--count > 8);
979943

980-
PlotSkyPoly((POLYFT4*)polys, HorizonTextures[horizontaboffset + count], red, green, blue, 0);
944+
red /= 2;
945+
green /= 2;
946+
blue /= 2;
981947

982-
polys += PolySizes[*polys];
983-
count++;
984-
}
948+
// draw it's reflection
949+
do
950+
{
951+
PlotSkyPoly((POLYFT4*)polys, *horizonTex++, red, green, blue);
952+
polys += polySize;
953+
} while (--count);
985954
}
986955
}
987956

988957
// [D] [T]
989958
void DrawSkyDome(void)
990959
{
960+
VECTOR skyOfs = dummy;
961+
skyOfs.vy = sky_y_offset[GameLevel];
962+
991963
gte_SetRotMatrix(&inv_camera_matrix);
992-
gte_SetTransVector(&dummy);
964+
gte_SetTransVector(&skyOfs);
993965

994966
calc_sky_brightness();
995967

996968
#ifdef PSX
997969
// FIXME: use frustrum angle instead?
998-
if (((camera_angle.vy - 1450U) & 0xFFF) > 2250)
970+
if (((camera_angle.vy - 1450U) & 4095) > 2250)
999971
PlotHorizonMDL(modelpointers[0], HorizonLookup[GameLevel][0]);
1000972

1001-
if (((camera_angle.vy - 651U) & 0xFFF) < 1799)
973+
if (((camera_angle.vy - 651U) & 4095) < 1799)
1002974
PlotHorizonMDL(modelpointers[2], HorizonLookup[GameLevel][1]);
1003975

1004-
if (((camera_angle.vy - 1701U) & 0xFFF) < 1749)
976+
if (((camera_angle.vy - 1701U) & 4095) < 1749)
1005977
PlotHorizonMDL(modelpointers[3], HorizonLookup[GameLevel][2]);
1006978

1007-
if (((camera_angle.vy - 400U) & 0xFFF) > 2300)
979+
if (((camera_angle.vy - 400U) & 4095) > 2300)
1008980
PlotHorizonMDL(modelpointers[1], HorizonLookup[GameLevel][3]);
1009981
#else
1010982
// draw full sky - no need in frustrum culling

0 commit comments

Comments
 (0)