mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 10:54:24 -04:00
straighten out min_fov with film_size and focal_length
This commit is contained in:
parent
7a41d118c7
commit
ab895aaab6
@ -310,6 +310,9 @@ set_min_fov(float min_fov) {
|
||||
} else {
|
||||
// Otherwise, throw out film size.
|
||||
nassertv(_film_size_seq == 0);
|
||||
|
||||
// Make sure we save the aspect ratio first.
|
||||
compute_aspect_ratio();
|
||||
adjust_user_flags(UF_film_width | UF_film_height | UF_vfov | UF_hfov,
|
||||
UF_min_fov);
|
||||
}
|
||||
@ -343,6 +346,9 @@ set_fov(float hfov) {
|
||||
} else {
|
||||
// Otherwise, throw out film size.
|
||||
nassertv(_film_size_seq == 0);
|
||||
|
||||
// Make sure we save the aspect ratio first.
|
||||
compute_aspect_ratio();
|
||||
adjust_user_flags(UF_film_width | UF_film_height | UF_vfov | UF_min_fov,
|
||||
UF_hfov);
|
||||
}
|
||||
@ -1419,34 +1425,54 @@ project_impl(const LPoint3f &point3d, LPoint3f &point2d) const {
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void Lens::
|
||||
compute_film_size() {
|
||||
if ((_user_flags & UF_film_width) == 0) {
|
||||
if ((_user_flags & (UF_hfov | UF_focal_length)) == (UF_hfov | UF_focal_length)) {
|
||||
_film_size[0] = fov_to_film(_fov[0], _focal_length, true);
|
||||
if ((_user_flags & (UF_min_fov | UF_focal_length)) == (UF_min_fov | UF_focal_length)) {
|
||||
// If we just have a min FOV and a focal length, that determines
|
||||
// the smaller of the two film_sizes, and the larger is simply
|
||||
// chosen according to the aspect ratio.
|
||||
float fs = fov_to_film(_min_fov, _focal_length, true);
|
||||
nassertv((_user_flags & UF_aspect_ratio) != 0 ||
|
||||
(_comp_flags & CF_aspect_ratio) != 0);
|
||||
|
||||
if (_aspect_ratio < 1.0f) {
|
||||
_film_size[1] = fs / _aspect_ratio;
|
||||
_film_size[0] = fs;
|
||||
|
||||
} else {
|
||||
_film_size[0] = 1.0f;
|
||||
_film_size[0] = fs * _aspect_ratio;
|
||||
_film_size[1] = fs;
|
||||
}
|
||||
}
|
||||
|
||||
if ((_user_flags & UF_film_height) == 0) {
|
||||
if ((_user_flags & (UF_vfov | UF_focal_length)) == (UF_vfov | UF_focal_length)) {
|
||||
_film_size[1] = fov_to_film(_fov[1], _focal_length, false);
|
||||
|
||||
} else if ((_user_flags & (UF_hfov | UF_vfov)) == (UF_hfov | UF_vfov)) {
|
||||
// If we don't have a focal length, but we have an explicit vfov
|
||||
// and hfov, we can infer the focal length is whatever makes the
|
||||
// film width, above, be what it is.
|
||||
if ((_comp_flags & CF_focal_length) == 0) {
|
||||
_focal_length = fov_to_focal_length(_fov[0], _film_size[0], true);
|
||||
adjust_comp_flags(0, CF_focal_length);
|
||||
} else {
|
||||
if ((_user_flags & UF_film_width) == 0) {
|
||||
if ((_user_flags & (UF_hfov | UF_focal_length)) == (UF_hfov | UF_focal_length)) {
|
||||
_film_size[0] = fov_to_film(_fov[0], _focal_length, true);
|
||||
} else {
|
||||
_film_size[0] = 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
if ((_user_flags & UF_film_height) == 0) {
|
||||
if ((_user_flags & (UF_vfov | UF_focal_length)) == (UF_vfov | UF_focal_length)) {
|
||||
_film_size[1] = fov_to_film(_fov[1], _focal_length, false);
|
||||
|
||||
} else if ((_user_flags & (UF_hfov | UF_vfov)) == (UF_hfov | UF_vfov)) {
|
||||
// If we don't have a focal length, but we have an explicit vfov
|
||||
// and hfov, we can infer the focal length is whatever makes the
|
||||
// film width, above, be what it is.
|
||||
if ((_comp_flags & CF_focal_length) == 0) {
|
||||
_focal_length = fov_to_focal_length(_fov[0], _film_size[0], true);
|
||||
adjust_comp_flags(0, CF_focal_length);
|
||||
}
|
||||
_film_size[1] = fov_to_film(_fov[1], _focal_length, false);
|
||||
|
||||
} else if ((_user_flags & UF_aspect_ratio) != 0 ||
|
||||
(_comp_flags & CF_aspect_ratio) != 0) {
|
||||
_film_size[1] = _film_size[0] / _aspect_ratio;
|
||||
|
||||
} else {
|
||||
// Default is an aspect ratio of 1.
|
||||
_film_size[1] = _film_size[0];
|
||||
}
|
||||
_film_size[1] = fov_to_film(_fov[1], _focal_length, false);
|
||||
|
||||
} else if ((_user_flags & UF_aspect_ratio) != 0) {
|
||||
_film_size[1] = _film_size[0] / _aspect_ratio;
|
||||
|
||||
} else {
|
||||
// Default is an aspect ratio of 1.
|
||||
_film_size[1] = _film_size[0];
|
||||
}
|
||||
}
|
||||
|
||||
@ -1564,8 +1590,8 @@ compute_aspect_ratio() {
|
||||
} else {
|
||||
_aspect_ratio = film_size[0] / film_size[1];
|
||||
}
|
||||
adjust_comp_flags(0, CF_aspect_ratio);
|
||||
}
|
||||
adjust_comp_flags(0, CF_aspect_ratio);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
Loading…
x
Reference in New Issue
Block a user