@@ -658,250 +658,268 @@ int Invert_Value(int value)
658
658
}
659
659
}
660
660
661
+ /* *
662
+ * Update the center of the HeightMapRenderObjClass.
663
+ *
664
+ * @param camera Pointer to the CameraClass object.
665
+ * @param lights Pointer to the RefMultiListIterator<RenderObjClass> object.
666
+ */
661
667
void HeightMapRenderObjClass::Update_Center (CameraClass *camera, RefMultiListIterator<RenderObjClass> *lights)
662
668
{
669
+ // Check if the height map, updating flag, and vertex buffer are valid
663
670
if (m_map != nullptr && !m_updating && m_vertexBufferTiles != nullptr ) {
671
+ // Update the center of the base height map render object
664
672
BaseHeightMapRenderObjClass::Update_Center (camera, lights);
665
673
m_updating = true ;
666
674
675
+ // Perform a full update if necessary
667
676
if (m_needFullUpdate) {
668
677
m_needFullUpdate = false ;
669
678
Update_Block (0 , 0 , m_x - 1 , m_y - 1 , m_map, lights);
670
679
m_updating = false ;
671
680
return ;
672
681
}
673
682
683
+ // Check if the dimensions of the height map have been reached
674
684
if (m_x >= m_map->Get_X_Extent () && m_y >= m_map->Get_Y_Extent ()) {
675
685
m_updating = false ;
676
686
return ;
677
687
}
678
688
679
- int i1 = 1 ;
689
+ // Initialize variables
690
+ int increment = 1 ;
680
691
Matrix3D camera_transform = camera->Get_Transform ();
681
692
Vector3 camera_pos = camera->Get_Position ();
682
- Vector3 v1 ;
683
- Vector3 v2 ;
693
+ Vector3 view_direction ;
694
+ Vector3 intersection_point ;
684
695
const ViewportClass &viewport = camera->Get_Viewport ();
685
- int height = WorldHeightMap::Get_Max_Height_Value ();
696
+ int max_height = WorldHeightMap::Get_Max_Height_Value ();
686
697
698
+ // Find the minimum display height in the height map
687
699
for (int x = 0 ; x < m_x; x++) {
688
700
for (int y = 0 ; y < m_y; y++) {
689
701
unsigned char display_height = m_map->Get_Display_Height (x, y);
690
702
691
- if (display_height < height ) {
692
- height = display_height;
703
+ if (display_height < max_height ) {
704
+ max_height = display_height;
693
705
}
694
706
}
695
707
}
696
708
697
- float z = height;
698
- Vector2 min;
699
- Vector2 max;
700
- camera->Get_View_Plane (min, max);
701
- float x_dist = max.X - min.X ;
702
- float y_dist = max.Y - min.Y ;
703
- float f1 = -1 .0f ;
704
- float f2 = 200000 .0f ;
705
- float f3 = -200000 .0f ;
706
- float f4 = 200000 .0f ;
707
- float f5 = f3;
708
-
709
+ float z = max_height;
710
+ Vector2 viewport_min;
711
+ Vector2 viewport_max;
712
+ camera->Get_View_Plane (viewport_min, viewport_max);
713
+ float x_dist = viewport_max.X - viewport_min.X ;
714
+ float y_dist = viewport_max.Y - viewport_min.Y ;
715
+ float scale_factor = -1 .0f ;
716
+ float min_x = 200000 .0f ;
717
+ float max_x = -200000 .0f ;
718
+ float min_y = 200000 .0f ;
719
+ float max_y = max_x;
720
+
721
+ // Calculate the frustum corners
709
722
for (int x = 0 ; x < 2 ; x++) {
710
723
for (int y = 0 ; y < 2 ; y++) {
711
- float f6 = (-x + 0 .5f + viewport.m_min .X ) * f1 * x_dist;
712
- float f7 = (y - 0 .5f - viewport.m_min .Y ) * f1 * y_dist;
713
- float f8 = f1 * camera_transform[0 ][2 ];
714
- float f9 = f6 * camera_transform[0 ][0 ] + f8;
715
- float f10 = f7 * camera_transform[0 ][1 ] + f9;
716
- float f11 = f1 * camera_transform[1 ][2 ];
717
- float f12 = f6 * camera_transform[1 ][0 ] + f11;
718
- float f13 = f7 * camera_transform[1 ][1 ] + f12;
719
- float f14 = f1 * camera_transform[2 ][2 ];
720
- float f15 = f6 * camera_transform[2 ][0 ] + f14;
721
- float f16 = f7 * camera_transform[2 ][1 ] + f15;
722
- v1.Set (f10, f13, f16);
723
- v1.Normalize ();
724
- v2 = camera_pos + v1;
725
- f10 = Vector3::Find_X_At_Z (z, camera_pos, v2);
726
- f13 = Vector3::Find_Y_At_Z (z, camera_pos, v2);
727
-
728
- if (f10 < f2) {
729
- f2 = f10;
724
+ float viewport_x_distance = (-x + 0 .5f + viewport.m_min .X ) * scale_factor * x_dist;
725
+ float viewport_y_distance = (y - 0 .5f - viewport.m_min .Y ) * scale_factor * y_dist;
726
+ float camera_transform_x = scale_factor * camera_transform[0 ][2 ];
727
+ float x_transformed = viewport_x_distance * camera_transform[0 ][0 ] + camera_transform_x;
728
+ float intersection_x = viewport_y_distance * camera_transform[0 ][1 ] + x_transformed;
729
+ float camera_transform_y = scale_factor * camera_transform[1 ][2 ];
730
+ float y_transformed = viewport_x_distance * camera_transform[1 ][0 ] + camera_transform_y;
731
+ float intersection_y = viewport_y_distance * camera_transform[1 ][1 ] + y_transformed;
732
+ float camera_transform_z = scale_factor * camera_transform[2 ][2 ];
733
+ float z_transformed = viewport_x_distance * camera_transform[2 ][0 ] + camera_transform_z;
734
+ float intersection_z = viewport_y_distance * camera_transform[2 ][1 ] + z_transformed;
735
+ view_direction.Set (intersection_x, intersection_y, intersection_z);
736
+ view_direction.Normalize ();
737
+ intersection_point = camera_pos + view_direction;
738
+ intersection_x = Vector3::Find_X_At_Z (z, camera_pos, intersection_point);
739
+ intersection_y = Vector3::Find_Y_At_Z (z, camera_pos, intersection_point);
740
+
741
+ // Update the frustum boundaries
742
+ if (intersection_x < min_x) {
743
+ min_x = intersection_x;
730
744
}
731
745
732
- if (f10 > f3 ) {
733
- f3 = f10 ;
746
+ if (intersection_x > max_x ) {
747
+ max_x = intersection_x ;
734
748
}
735
749
736
- if (f13 < f4 ) {
737
- f4 = f13 ;
750
+ if (intersection_y < min_y ) {
751
+ min_y = intersection_y ;
738
752
}
739
753
740
- if (f13 > f5 ) {
741
- f5 = f13 ;
754
+ if (intersection_y > max_y ) {
755
+ max_y = intersection_y ;
742
756
}
743
757
}
744
758
}
745
759
746
- f2 = f2 / 10 .0f ;
747
- f3 = f3 / 10 .0f ;
748
- f4 = f4 / 10 .0f ;
749
- f5 = f5 / 10 .0f ;
750
- f2 = m_map->Border_Size () + f2;
751
- f3 = m_map->Border_Size () + f3;
752
- f4 = m_map->Border_Size () + f4;
753
- f5 = m_map->Border_Size () + f5;
754
-
760
+ // Adjust the frustum boundaries
761
+ min_x = min_x / 10 .0f ;
762
+ max_x = max_x / 10 .0f ;
763
+ min_y = min_y / 10 .0f ;
764
+ max_y = max_y / 10 .0f ;
765
+ min_x = m_map->Border_Size () + min_x;
766
+ max_x = m_map->Border_Size () + max_x;
767
+ min_y = m_map->Border_Size () + min_y;
768
+ max_y = m_map->Border_Size () + max_y;
769
+
770
+ // Initialize the visibility boundaries
755
771
s_visMinX = m_map->Get_X_Extent ();
756
772
s_visMinY = m_map->Get_Y_Extent ();
757
773
s_visMaxX = 0 ;
758
774
s_visMaxY = 0 ;
759
775
760
- if (f2 < 0 .0f ) {
761
- f2 = 0 .0f ;
776
+ // Adjust frustum boundaries if necessary
777
+ if (min_x < 0 .0f ) {
778
+ min_x = 0 .0f ;
762
779
}
763
780
764
- if (f4 < 0 .0f ) {
765
- f4 = 0 .0f ;
781
+ if (min_y < 0 .0f ) {
782
+ min_y = 0 .0f ;
766
783
}
767
784
768
- if (s_visMinX < f3 ) {
769
- f3 = s_visMinX;
785
+ if (s_visMinX < max_x ) {
786
+ max_x = s_visMinX;
770
787
}
771
788
772
- if (s_visMinY < f5 ) {
773
- f5 = s_visMinY;
789
+ if (s_visMinY < max_y ) {
790
+ max_y = s_visMinY;
774
791
}
775
792
776
793
const FrustumClass &frustum = camera->Get_Frustum ();
777
- int limit = ((f3 - f2 ) / 2 .0f );
794
+ int limit = ((max_x - min_x ) / 2 .0f );
778
795
779
796
if (limit > 16 ) {
780
797
limit = 16 ;
781
798
}
782
799
783
- Calc_Vis (frustum, m_map, (f2 - 16 .0f ), (f4 - 16 .0f ), (f3 + 16 .0f ), (f5 + 16 .0f ), limit);
800
+ Calc_Vis (frustum, m_map, (min_x - 16 .0f ), (min_y - 16 .0f ), (max_x + 16 .0f ), (max_y + 16 .0f ), limit);
784
801
785
802
if (m_map != nullptr ) {
786
- int x_org ;
787
- int y_org ;
803
+ int x_origin ;
804
+ int y_origin ;
788
805
789
806
if (s_visMaxX - s_visMinX <= m_x) {
790
- x_org = (((s_visMinX + s_visMaxX) / 2 ) - m_x / 2 .0f );
807
+ x_origin = (((s_visMinX + s_visMaxX) / 2 ) - m_x / 2 .0f );
791
808
} else {
792
- x_org = ((f3 + f2 ) / 2 .0f - m_x / 2 .0f );
809
+ x_origin = ((max_x + min_x ) / 2 .0f - m_x / 2 .0f );
793
810
}
794
811
795
812
if (s_visMaxY - s_visMinY <= m_y) {
796
- y_org = (((s_visMinY + s_visMaxY) / 2 ) - m_y / 2 .0f );
813
+ y_origin = (((s_visMinY + s_visMaxY) / 2 ) - m_y / 2 .0f );
797
814
} else {
798
- y_org = s_visMinY + 1 ;
815
+ y_origin = s_visMinY + 1 ;
799
816
}
800
817
801
818
if (g_theTacticalView->Get_Field_Of_View () != 0 .0f ) {
802
- x_org = (((s_visMinX + s_visMaxX) / 2 ) - m_x / 2 .0f );
803
- y_org = (((s_visMinY + s_visMaxY) / 2 ) - m_y / 2 .0f );
819
+ x_origin = (((s_visMinX + s_visMaxX) / 2 ) - m_x / 2 .0f );
820
+ y_origin = (((s_visMinY + s_visMaxY) / 2 ) - m_y / 2 .0f );
804
821
}
805
822
806
- int i2 = x_org - m_map->Get_Draw_Origin_X ();
807
- int i3 = y_org - m_map->Get_Draw_Origin_Y ();
823
+ int origin_offset_x = x_origin - m_map->Get_Draw_Origin_X ();
824
+ int origin_offset_y = y_origin - m_map->Get_Draw_Origin_Y ();
808
825
809
- if (Invert_Value (i2) > m_x / 2 || Invert_Value (i3) > m_x / 2 ) {
810
- m_map->Set_Draw_Origin (x_org, y_org);
826
+ // Check if the origin needs to be updated
827
+ if (Invert_Value (origin_offset_x) > m_x / 2 || Invert_Value (origin_offset_y) > m_x / 2 ) {
828
+ m_map->Set_Draw_Origin (x_origin, y_origin);
811
829
m_originY = 0 ;
812
830
m_originX = 0 ;
813
831
Update_Block (0 , 0 , m_x - 1 , m_y - 1 , m_map, lights);
814
832
m_updating = false ;
815
833
return ;
816
834
}
817
835
818
- if (abs (i2 ) > 2 || abs (i3 ) > 2 ) {
819
- if (abs (i3 ) >= 2 ) {
820
- if (m_map->Set_Draw_Origin (m_map->Get_Draw_Origin_X (), y_org )) {
821
- int i4 = 0 ;
822
- int i5 = 0 ;
823
- i3 -= y_org - m_map->Get_Draw_Origin_Y ();
824
- m_originY += i3 ;
836
+ if (abs (origin_offset_x ) > 2 || abs (origin_offset_y ) > 2 ) {
837
+ if (abs (origin_offset_y ) >= 2 ) {
838
+ if (m_map->Set_Draw_Origin (m_map->Get_Draw_Origin_X (), y_origin )) {
839
+ int y_start_tile = 0 ;
840
+ int y_end_tile = 0 ;
841
+ origin_offset_y -= y_origin - m_map->Get_Draw_Origin_Y ();
842
+ m_originY += origin_offset_y ;
825
843
826
844
if (m_originY >= m_y - 1 ) {
827
845
m_originY -= m_y - 1 ;
828
846
}
829
847
830
- if (i3 >= 0 ) {
831
- i4 = m_originY - i3 ;
832
- i5 = m_originY;
848
+ if (origin_offset_y >= 0 ) {
849
+ y_start_tile = m_originY - origin_offset_y ;
850
+ y_end_tile = m_originY;
833
851
} else {
834
- i4 = m_originY;
835
- i5 = m_originY - i3 ;
852
+ y_start_tile = m_originY;
853
+ y_end_tile = m_originY - origin_offset_y ;
836
854
}
837
855
838
- i4 -= i1 ;
856
+ y_start_tile -= increment ;
839
857
840
858
if (m_originY < 0 ) {
841
859
m_originY = m_originY + m_y - 1 ;
842
860
}
843
861
844
- if (i4 >= 0 ) {
845
- Update_Block (0 , i4 , m_x - 1 , i5 , m_map, lights);
862
+ if (y_start_tile >= 0 ) {
863
+ Update_Block (0 , y_start_tile , m_x - 1 , y_end_tile , m_map, lights);
846
864
} else {
847
- i4 = i4 + m_y - 1 ;
865
+ y_start_tile = y_start_tile + m_y - 1 ;
848
866
849
- if (i4 < 0 ) {
850
- i4 = 0 ;
867
+ if (y_start_tile < 0 ) {
868
+ y_start_tile = 0 ;
851
869
}
852
870
853
- Update_Block (0 , i4 , m_x - 1 , m_y - 1 , m_map, lights);
854
- Update_Block (0 , 0 , m_x - 1 , i5 , m_map, lights);
871
+ Update_Block (0 , y_start_tile , m_x - 1 , m_y - 1 , m_map, lights);
872
+ Update_Block (0 , 0 , m_x - 1 , y_end_tile , m_map, lights);
855
873
}
856
874
}
857
875
858
- if (abs (i2 ) < 16 && !m_doXNextTime) {
876
+ if (abs (origin_offset_x ) < 16 && !m_doXNextTime) {
859
877
m_updating = false ;
860
878
m_doXNextTime = true ;
861
879
return ;
862
880
}
863
881
}
864
882
865
- if (abs (i2 ) > 2 ) {
883
+ if (abs (origin_offset_x ) > 2 ) {
866
884
m_doXNextTime = false ;
867
- x_org = i2 + m_map->Get_Draw_Origin_X ();
885
+ x_origin = origin_offset_x + m_map->Get_Draw_Origin_X ();
868
886
869
- if (m_map->Set_Draw_Origin (x_org , m_map->Get_Draw_Origin_Y ())) {
870
- int i6 = 0 ;
871
- int i7 = 0 ;
872
- i2 -= x_org - m_map->Get_Draw_Origin_X ();
873
- m_originX += i2 ;
887
+ if (m_map->Set_Draw_Origin (x_origin , m_map->Get_Draw_Origin_Y ())) {
888
+ int x_start_tile = 0 ;
889
+ int x_end_tile = 0 ;
890
+ origin_offset_x -= x_origin - m_map->Get_Draw_Origin_X ();
891
+ m_originX += origin_offset_x ;
874
892
875
893
if (m_originX >= m_x - 1 ) {
876
894
m_originX -= m_x - 1 ;
877
895
}
878
896
879
- if (i2 >= 0 ) {
880
- i6 = m_originX - i2 ;
881
- i7 = m_originX;
897
+ if (origin_offset_x >= 0 ) {
898
+ x_start_tile = m_originX - origin_offset_x ;
899
+ x_end_tile = m_originX;
882
900
} else {
883
- i6 = m_originX;
884
- i7 = m_originX - i2 ;
901
+ x_start_tile = m_originX;
902
+ x_end_tile = m_originX - origin_offset_x ;
885
903
}
886
904
887
- i6 -= i1 ;
888
- i7 += i1 ;
905
+ x_start_tile -= increment ;
906
+ x_end_tile += increment ;
889
907
890
908
if (m_originX < 0 ) {
891
909
m_originX = m_originX + m_x - 1 ;
892
910
}
893
911
894
- if (i6 >= 0 ) {
895
- Update_Block (i6 , 0 , i7 , m_y - 1 , m_map, lights);
912
+ if (x_start_tile >= 0 ) {
913
+ Update_Block (x_start_tile , 0 , x_end_tile , m_y - 1 , m_map, lights);
896
914
} else {
897
- i6 = i6 + m_x - 1 ;
915
+ x_start_tile = x_start_tile + m_x - 1 ;
898
916
899
- if (i6 < 0 ) {
900
- i6 = 0 ;
917
+ if (x_start_tile < 0 ) {
918
+ x_start_tile = 0 ;
901
919
}
902
920
903
- Update_Block (i6 , 0 , m_x - 1 , m_y - 1 , m_map, lights);
904
- Update_Block (0 , 0 , i7 , m_y - 1 , m_map, lights);
921
+ Update_Block (x_start_tile , 0 , m_x - 1 , m_y - 1 , m_map, lights);
922
+ Update_Block (0 , 0 , x_end_tile , m_y - 1 , m_map, lights);
905
923
}
906
924
}
907
925
}
0 commit comments