@@ -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
2929unsigned 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]
989958void 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