00001 00002 // 00003 // Copyright (C) 2006 James M. Lawrence. All rights reserved. 00004 // 00005 // software: esve-1.0.3 00006 // file: esve/engine/dim3/Camera_Details.hxx 00007 // 00008 // Redistribution and use in source and binary forms, with or without 00009 // modification, are permitted provided that the following conditions 00010 // are met: 00011 // 00012 // 1. Redistributions of source code must retain the above copyright 00013 // notice, this list of conditions and the following disclaimer. 00014 // 00015 // 2. The origin of this software must not be misrepresented; you must 00016 // not claim that you wrote the original software. If you use this 00017 // software in a product, an acknowledgment in the product 00018 // documentation would be appreciated but is not required. 00019 // 00020 // 3. Altered source versions must be plainly marked as such, and must 00021 // not be misrepresented as being the original software. 00022 // 00023 // 4. The name of the author may not be used to endorse or promote 00024 // products derived from this software without specific prior written 00025 // permission. 00026 // 00027 // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY, 00028 // AND WITH NO CLAIM AS TO ITS SUITABILITY FOR ANY PURPOSE. IN NO EVENT 00029 // SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM WHATSOEVER MADE IN CONNECTION 00030 // TO THIS SOFTWARE. 00031 // 00033 00034 #ifndef esve_engine_dim3_Camera_Details_hxx 00035 #define esve_engine_dim3_Camera_Details_hxx 00036 00037 #include <esve/types/real.hxx> 00038 00039 namespace esve { namespace engine { namespace dim3 { 00040 00045 00046 class Camera_Details 00047 { 00048 public: 00053 enum Projection 00054 { 00056 ORTHOGONAL, 00057 00059 PERSPECTIVE, 00060 00062 CUSTOM 00063 } ; 00064 00069 struct Orthogonal_Projection 00070 { 00072 types::real frustum_height ; 00073 00076 types::real near_clip ; 00077 types::real far_clip ; 00079 00081 Orthogonal_Projection( types::real frustum_height, 00082 types::real near_clip, 00083 types::real far_clip ) ; 00084 } ; 00085 00090 struct Perspective_Projection 00091 { 00093 types::real field_of_view ; 00094 00097 types::real near_clip ; 00098 types::real far_clip ; 00100 00102 Perspective_Projection( types::real field_of_view, 00103 types::real near_clip, 00104 types::real far_clip ) ; 00105 } ; 00106 00108 virtual Projection projection() const = 0 ; 00109 00111 00113 virtual void orthogonal_projection( const Orthogonal_Projection & ) = 0 ; 00114 00116 virtual void perspective_projection( const Perspective_Projection & ) = 0 ; 00117 00119 virtual void custom_projection() = 0 ; 00120 00122 00124 00126 virtual const Orthogonal_Projection & 00127 orthogonal_projection_data() const = 0 ; 00128 00130 virtual const Perspective_Projection & 00131 perspective_projection_data() const = 0 ; 00132 00134 00137 virtual types::real far_clip() const = 0 ; 00138 virtual void far_clip( types::real ) = 0 ; 00139 virtual types::real near_clip() const = 0 ; 00140 virtual void near_clip( types::real ) = 0 ; 00142 00143 virtual ~Camera_Details() = 0 ; 00144 00145 protected: 00146 Camera_Details() ; 00147 00159 virtual void compute_perspective_projection() = 0 ; 00160 virtual void compute_orthogonal_projection() = 0 ; 00161 virtual void compute_custom_projection() = 0 ; 00163 00164 // Allow aggregates to call compute_*_projection(). 00165 static void call_compute_projection( Camera_Details & ) ; 00166 00167 private: 00168 Camera_Details( const Camera_Details & ) ; 00169 Camera_Details & operator=( const Camera_Details & ) ; 00170 } ; 00171 00172 }}} // namespace esve::engine::dim3 00173 00174 #endif 00175
1.3.4