Browse Source

straighten out min_fov with film_size and focal_length

David Rose 19 years ago
parent
commit
ab895aaab6
1 changed files with 51 additions and 25 deletions
  1. 51 25
      panda/src/gobj/lens.cxx

+ 51 - 25
panda/src/gobj/lens.cxx

@@ -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);
 }
 
 ////////////////////////////////////////////////////////////////////