Skip to content

Commit fcb257d

Browse files
authored
Fix calculation of apparent size (#6872)
1 parent fa5ee72 commit fcb257d

5 files changed

Lines changed: 17 additions & 14 deletions

File tree

code/model/modelrender.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2049,17 +2049,17 @@ void model_render_glow_points(const polymodel *pm, const polymodel_instance *pmi
20492049

20502050
// These scaling functions were adapted from Elecman's code.
20512051
// https://forum.unity.com/threads/this-script-gives-you-objects-screen-size-in-pixels.48966/#post-2107126
2052-
float convert_pixel_size_and_distance_to_diameter(float pixelsize, float distance, float field_of_view_deg, int screen_height)
2052+
float convert_pixel_size_and_distance_to_diameter(float pixelsize, float distance, float field_of_view, int screen_width)
20532053
{
2054-
float diameter = (pixelsize * distance * field_of_view_deg) / (fl_degrees(screen_height));
2054+
float diameter = (pixelsize * distance * tanf(field_of_view)) / (screen_width);
20552055
return diameter;
20562056
}
20572057

20582058
// These scaling functions were adapted from Elecman's code.
20592059
// https://forum.unity.com/threads/this-script-gives-you-objects-screen-size-in-pixels.48966/#post-2107126
2060-
float convert_distance_and_diameter_to_pixel_size(float distance, float diameter, float field_of_view_deg, int screen_height)
2060+
float convert_distance_and_diameter_to_pixel_size(float distance, float diameter, float field_of_view, int screen_width)
20612061
{
2062-
float pixel_size = (diameter * fl_degrees(screen_height)) / (distance * field_of_view_deg);
2062+
float pixel_size = (diameter * screen_width) / (distance * tanf(field_of_view));
20632063
return pixel_size;
20642064
}
20652065

@@ -2073,16 +2073,16 @@ float model_render_get_diameter_clamped_to_min_pixel_size(const vec3d* pos, floa
20732073
float current_pixel_size = convert_distance_and_diameter_to_pixel_size(
20742074
distance_to_eye,
20752075
diameter,
2076-
fl_degrees(g3_get_hfov(Eye_fov)),
2077-
gr_screen.max_h);
2076+
g3_get_hfov(Eye_fov),
2077+
gr_screen.max_w);
20782078

20792079
float scaled_diameter = diameter;
20802080
if (current_pixel_size < min_pixel_size) {
20812081
scaled_diameter = convert_pixel_size_and_distance_to_diameter(
20822082
min_pixel_size,
20832083
distance_to_eye,
2084-
fl_degrees(g3_get_hfov(Eye_fov)),
2085-
gr_screen.max_h);
2084+
g3_get_hfov(Eye_fov),
2085+
gr_screen.max_w);
20862086
}
20872087

20882088
return scaled_diameter;

code/model/modelrender.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ void model_render_arc(const vec3d* v1, const vec3d* v2, const SCP_vector<vec3d>
311311
void model_render_set_wireframe_color(const color* clr);
312312
bool render_tech_model(tech_render_type model_type, int x1, int y1, int x2, int y2, float zoom, bool lighting, int class_idx, const matrix* orient, const SCP_string& pof_filename = "", float closeup_zoom = 0, const vec3d* closeup_pos = &vmd_zero_vector, const SCP_string& tcolor = "");
313313

314-
float convert_distance_and_diameter_to_pixel_size(float distance, float diameter, float field_of_view_deg, int screen_height);
314+
float convert_distance_and_diameter_to_pixel_size(float distance, float diameter, float field_of_view, int screen_width);
315315

316316
float model_render_get_diameter_clamped_to_min_pixel_size(const vec3d* pos, float diameter, float min_pixel_size);
317317

code/particle/ParticleEffect.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ float ParticleEffect::getApproximateVisualSize(const vec3d& pos) const {
130130
return convert_distance_and_diameter_to_pixel_size(
131131
distance_to_eye,
132132
m_radius.avg() * 2.f,
133-
fl_degrees(g3_get_hfov(Eye_fov)),
134-
gr_screen.max_h);
133+
g3_get_hfov(Eye_fov),
134+
gr_screen.max_w);
135135
}
136136

137137
float ParticleEffect::getCurrentFrequencyMult(decltype(modular_curves_definition)::input_type_t source) const {

code/utils/RandomRange.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ class RandomRange {
144144
*/
145145
ValueType avg() const
146146
{
147+
if (m_constant)
148+
return m_minValue;
149+
147150
if constexpr (has_member(DistributionType, avg())) {
148151
return m_distribution.avg();
149152
}

code/weapon/weapons.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10200,7 +10200,7 @@ float weapon_get_apparent_size(const weapon& wp) {
1020010200

1020110201
return convert_distance_and_diameter_to_pixel_size(
1020210202
dist,
10203-
wep_objp->radius,
10204-
fl_degrees(g3_get_hfov(Eye_fov)),
10205-
gr_screen.max_h) / i2fl(gr_screen.max_h);
10203+
wep_objp->radius * 2.0f,
10204+
g3_get_hfov(Eye_fov),
10205+
gr_screen.max_w) / i2fl(gr_screen.max_w);
1020610206
}

0 commit comments

Comments
 (0)