Skip to content

Commit 16d7938

Browse files
committed
swars: Cleanup in lvdraw_compute_lights()
1 parent e6deea7 commit 16d7938

3 files changed

Lines changed: 121 additions & 117 deletions

File tree

src/engindrwlstx.c

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,26 @@ int calculate_enginepoint_shade_2(struct PolyPoint *p_pt1, struct SingleObjectFa
407407
return p_pt1->S;
408408
}
409409

410+
uint cummulate_shade_from_quick_lights(ushort light_first)
411+
{
412+
struct QuickLight *p_qlight;
413+
ushort light;
414+
uint shade;
415+
short i;
416+
417+
shade = 0;
418+
for (light = light_first, i = 0; (light != 0) && (i <= 100); light = p_qlight->NextQuick, i++)
419+
{
420+
short intens;
421+
422+
p_qlight = &game_quick_lights[light];
423+
intens = game_full_lights[p_qlight->Light].Intensity;
424+
shade += intens * p_qlight->Ratio;
425+
}
426+
return shade;
427+
}
428+
429+
410430
/**
411431
* Draw triangular face with normally textured surface, but dark.
412432
*
@@ -465,21 +485,10 @@ void draw_object_face3_textrd_dk(ushort face)
465485
}
466486
else
467487
{
468-
ushort light, shade;
469-
short i;
488+
uint shade;
470489

471-
light = p_face->Light0;
472490
shade = p_face->Shade0 << 7;
473-
for (i = 0; (i <= 100) && (light != 0); i++)
474-
{
475-
struct QuickLight *p_qlight;
476-
short intens;
477-
478-
p_qlight = &game_quick_lights[light];
479-
intens = game_full_lights[p_qlight->Light].Intensity;
480-
light = p_qlight->NextQuick;
481-
shade += intens * p_qlight->Ratio;
482-
}
491+
shade += cummulate_shade_from_quick_lights(p_face->Light0);
483492
if (shade > 0x7E00)
484493
shade = 0x7F00;
485494
point1.S = shade << 7;

src/engindrwlstx.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ void draw_unkn1_scaled_alpha_sprite(ushort fr, int scr_x, int scr_y,
9191
ushort scale, ushort alpha);
9292
void draw_sorted_sprite1a(ushort frm, short x, short y, ubyte csel);
9393

94+
uint cummulate_shade_from_quick_lights(ushort light_first);
95+
9496
void draw_drawitem_1(ushort dihead);
9597
void draw_drawitem_2(ushort dihead);
9698

src/lvdraw3d.c

Lines changed: 97 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ void func_218D3(void)
534534
}
535535
}
536536

537-
void lvdraw_compute_lights(int prc_z_beg, int *smrang_x, struct ShEnginePoint *p_unknarrD)
537+
void lvdraw_compute_lights(int prc_z_beg, int ranges_len, struct Range *smrang_x, struct ShEnginePoint *p_unknarrD)
538538
{
539539
short v31;
540540
short v32;
@@ -543,20 +543,10 @@ void lvdraw_compute_lights(int prc_z_beg, int *smrang_x, struct ShEnginePoint *p
543543
int v36;
544544
int v37;
545545
int v38;
546-
int v39;
547-
int v40;
548-
int v41;
549-
ushort qlght;
550-
struct QuickLight *p_qlght1;
551-
int v44;
552-
ubyte Flags;
553546
int v46;
554-
int v118;
555-
int v119;
556547
int v120;
557548
int v121;
558549
int v122;
559-
ubyte flags_A;
560550
int v144;
561551
int v150;
562552
int v158;
@@ -569,105 +559,108 @@ void lvdraw_compute_lights(int prc_z_beg, int *smrang_x, struct ShEnginePoint *p
569559
v32 = engn_zc & 0xFF00;
570560
word_19CC66 = v32 - (render_area_b << 7);
571561
v172 = prc_z_beg;
572-
p_mapel9 = &game_my_big_map[128 * (prc_z_beg >> 8) + (smrang_x[0] >> 8)];
573-
v35 = &p_unknarrD[2 * (smrang_x[0] >> 8)];
562+
p_mapel9 = &game_my_big_map[128 * (prc_z_beg >> 8) + (smrang_x[0].beg >> 8)];
563+
v35 = &p_unknarrD[2 * (smrang_x[0].beg >> 8)];
574564
v159 = prc_z_beg >> 8;
575-
v150 = smrang_x[2 * 0 + 0];
576-
v36 = smrang_x[2 * 0 + 1];
565+
v150 = smrang_x[0].beg;
566+
v36 = smrang_x[0].fin;
577567
v144 = prc_z_beg >> 7;
578-
v37 = smrang_x[2 * 0 + 0];
568+
v37 = smrang_x[0].beg;
579569
v158 = 0;
580570
while ( v37 <= v36 )
581571
{
582-
v120 = v150 - engn_xc;
583-
if (game_perspective == 1)
584-
{
585-
v121 = 0;
586-
LABEL_55:
587-
v35->field_9 = 0;
588-
goto LABEL_56;
589-
}
590-
v121 = 8 * p_mapel9->Alt;
591-
Flags = p_mapel9->Flags;
592-
if ((Flags & 0x10) == 0)
593-
{
594-
if ((Flags & 0x40) != 0)
595-
v121 += waft_table[gameturn & 0x1F];
596-
goto LABEL_55;
597-
}
598-
v46 = ((*(int *)(&deep_radar_surface_col + 2 * (((ubyte)gameturn + (ubyte)(v150 >> 7)) & 0x1F)) >> 16)
599-
+ (*(int *)(&deep_radar_surface_col + 2 * (((ubyte)gameturn + (ubyte)v144) & 0x1F)) >> 16)
600-
+ (*(int *)(&deep_radar_surface_col + 2 * ((32 * gameturn
601-
/ ((((ubyte)bw_rotl32(0x5D3BA6C3, v159) ^ (ubyte)bw_rotr32(0xA7B4D8AC, (sbyte)(v150 >> 8))) & 0x7Fu)
602-
+ 140)) & 0x1F)) >> 16)) >> 3;
603-
v121 += 8 * (short)v46;
604-
v35->field_9 = ((ushort)v46 + 32) << 9;
605-
LABEL_56:
606-
v121 -= 8 * engn_yc;
607-
v160 = (dword_176D14 * v120 - dword_176D10 * (v172 - engn_zc)) >> 16;
608-
v38 = (dword_176D10 * v120 + dword_176D14 * (v172 - engn_zc)) >> 16;
609-
v122 = (dword_176D18 * v121 + dword_176D1C * v38) >> 16;
610-
flags_A = 0;
611-
v121 = (((dword_176D1C * v121 - v38 * dword_176D18) >> 16) * overall_scale) >> 8;
612-
v120 = (overall_scale * v160) >> 8;
613-
if ( v122 >= -500 )
614-
{
615-
v39 = ((1500 * ((overall_scale * v160) >> 8) / ((v122 >> 2) + 500)) >> 1) + dword_176D3C;
616-
v118 = v39;
617-
if (v39 < 0) {
618-
if (v39 < -2000)
619-
v118 = -2000;
620-
flags_A = 0x01;
621-
} else if (v39 >= vec_window_width) {
622-
if (v39 > 2000)
623-
v118 = 2000;
624-
flags_A |= 0x02;
572+
int scr_x, scr_y;
573+
uint shade;
574+
ubyte flags;
575+
576+
v120 = v150 - engn_xc;
577+
if (game_perspective == 1)
578+
{
579+
v121 = 0;
580+
v35->field_9 = 0;
625581
}
626-
v40 = dword_176D40 + (-(1500 * v121 / ((v122 >> 2) + 500)) >> 1);
627-
v119 = v40;
628-
if (v40 < 0) {
629-
if (v119 < -2000)
630-
v119 = -2000;
631-
flags_A |= 0x04;
632-
} else if (v40 >= vec_window_height) {
633-
if (v119 > 2000)
634-
v119 = 2000;
635-
flags_A |= 0x08;
582+
else if ((p_mapel9->Flags & 0x10) == 0)
583+
{
584+
v121 = 8 * p_mapel9->Alt;
585+
if ((p_mapel9->Flags & 0x40) != 0)
586+
v121 += waft_table[gameturn & 0x1F];
587+
v35->field_9 = 0;
636588
}
637-
flags_A |= 0x40;
638-
v122 /= (ushort)render_area_a / 20 + 1;
639-
}
640-
else
641-
{
642-
flags_A = 32;
643-
}
644-
645-
v35->Flags = flags_A;
646-
v35->X = v118;
647-
v35->Y = v119;
648-
v35->field_4 = v122;
649-
v41 = ((ushort)p_mapel9->Ambient << 7) + v35->field_9 + 256;
650-
for (qlght = p_mapel9->Shade; qlght; qlght = p_qlght1->NextQuick)
651-
{
652-
p_qlght1 = &game_quick_lights[qlght];
653-
v44 = p_qlght1->Ratio * game_full_lights[p_qlght1->Light].Intensity;
654-
v41 += v44;
655-
}
656-
if ( v122 > 3000 )
657-
{
658-
if ( 3512 - v122 > 0 )
659-
v41 = ((3512 - v122) * v41) >> 9;
660589
else
661-
v41 = 0;
662-
}
663-
if (v41 > 0x7E00)
664-
v41 = 0x7F00;
665-
v35->Shade = v41;
666-
v150 += 256;
667-
v37 = v150;
668-
v35 += 2;
669-
v36 = smrang_x[v158/4 + 1];
670-
++p_mapel9;
590+
{
591+
v121 = 8 * p_mapel9->Alt;
592+
v46 = ((*(int *)(&deep_radar_surface_col + 2 * (((ubyte)gameturn + (ubyte)(v150 >> 7)) & 0x1F)) >> 16)
593+
+ (*(int *)(&deep_radar_surface_col + 2 * (((ubyte)gameturn + (ubyte)v144) & 0x1F)) >> 16)
594+
+ (*(int *)(&deep_radar_surface_col + 2 * ((32 * gameturn
595+
/ ((((ubyte)bw_rotl32(0x5D3BA6C3, v159) ^ (ubyte)bw_rotr32(0xA7B4D8AC, (sbyte)(v150 >> 8))) & 0x7Fu)
596+
+ 140)) & 0x1F)) >> 16)) >> 3;
597+
v121 += 8 * (short)v46;
598+
v35->field_9 = ((ushort)v46 + 32) << 9;
599+
}
600+
v121 -= 8 * engn_yc;
601+
v160 = (dword_176D14 * v120 - dword_176D10 * (v172 - engn_zc)) >> 16;
602+
v38 = (dword_176D10 * v120 + dword_176D14 * (v172 - engn_zc)) >> 16;
603+
v122 = (dword_176D18 * v121 + dword_176D1C * v38) >> 16;
604+
v121 = (((dword_176D1C * v121 - v38 * dword_176D18) >> 16) * overall_scale) >> 8;
605+
v120 = (overall_scale * v160) >> 8;
606+
607+
flags = 0;
608+
if (v122 >= -500)
609+
{
610+
int scr_dx, scr_dy;
611+
612+
scr_dx = (1500 * ((overall_scale * v160) >> 8) / ((v122 >> 2) + 500)) >> 1;
613+
scr_x = dword_176D3C + scr_dx;
614+
if (scr_x < 0) {
615+
if (scr_x < -2000)
616+
scr_x = -2000;
617+
flags = 0x01;
618+
} else if (scr_x >= vec_window_width) {
619+
if (scr_x > 2000)
620+
scr_x = 2000;
621+
flags |= 0x02;
622+
}
623+
scr_dy = -(1500 * v121 / ((v122 >> 2) + 500)) >> 1;
624+
scr_y = dword_176D40 + scr_dy;
625+
if (scr_y < 0) {
626+
if (scr_y < -2000)
627+
scr_y = -2000;
628+
flags |= 0x04;
629+
} else if (scr_y >= vec_window_height) {
630+
if (scr_y > 2000)
631+
scr_y = 2000;
632+
flags |= 0x08;
633+
}
634+
flags |= 0x40;
635+
v122 /= (ushort)render_area_a / 20 + 1;
636+
}
637+
else
638+
{
639+
flags = 0x20;
640+
}
641+
642+
shade = ((ushort)p_mapel9->Ambient << 7) + v35->field_9 + 256;
643+
shade += cummulate_shade_from_quick_lights(p_mapel9->Shade);
644+
if (v122 > 3000) {
645+
if (3512 - v122 > 0)
646+
shade = ((3512 - v122) * shade) >> 9;
647+
else
648+
shade = 0;
649+
}
650+
if (shade > 0x7E00)
651+
shade = 0x7F00;
652+
653+
v35->Flags = flags;
654+
v35->X = scr_x;
655+
v35->Y = scr_y;
656+
v35->field_4 = v122;
657+
v35->Shade = shade;
658+
659+
v150 += 256;
660+
v35 += 2;
661+
v37 = v150;
662+
v36 = smrang_x[v158/8].fin;
663+
++p_mapel9;
671664
}
672665
}
673666

@@ -1128,9 +1121,9 @@ void func_2e440(void)
11281121

11291122
lvdraw_do_objects(prc_z_beg, ranges_x_len, ranges_x);
11301123

1131-
lvdraw_compute_lights(prc_z_beg, smrang_x, loc_unknarrD);
1124+
lvdraw_compute_lights(prc_z_beg, ranges_x_len, smrang_x, loc_unknarrD);
11321125

1133-
func_2e440_fill_drawlist(prc_z_beg, ranges_x_len, smrang_x, ranges_x, loc_unknarrD);
1126+
func_2e440_fill_drawlist(prc_z_beg, ranges_x_len, (int *)smrang_x, ranges_x, loc_unknarrD);
11341127

11351128
vec_map = vec_tmap[1];
11361129

0 commit comments

Comments
 (0)