1 #ifndef COIN_SBVIEWVOLUME_H
2 #define COIN_SBVIEWVOLUME_H
3 
4 /**************************************************************************\
5  * Copyright (c) Kongsberg Oil & Gas Technologies AS
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are
10  * met:
11  *
12  * Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  *
15  * Redistributions in binary form must reproduce the above copyright
16  * notice, this list of conditions and the following disclaimer in the
17  * documentation and/or other materials provided with the distribution.
18  *
19  * Neither the name of the copyright holder nor the names of its
20  * contributors may be used to endorse or promote products derived from
21  * this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 \**************************************************************************/
35 
36 #include <cstdio>
37 
38 #include <Inventor/SbBasic.h>
39 #include <Inventor/SbVec3f.h>
40 #include <Inventor/SbDPViewVolume.h>
41 
42 class SbBox3f;
43 class SbLine;
44 class SbMatrix;
45 class SbPlane;
46 class SbRotation;
47 class SbVec2f;
48 class SbVec3f;
49 
50 class COIN_DLL_API SbViewVolume {
51 public:
52   enum ProjectionType { ORTHOGRAPHIC = 0, PERSPECTIVE = 1 };
53 
54 public:
55   SbViewVolume(void);
56   ~SbViewVolume(void);
57   void getMatrices(SbMatrix& affine, SbMatrix& proj) const;
58   SbMatrix getMatrix(void) const;
59   SbMatrix getCameraSpaceMatrix(void) const;
60   void projectPointToLine(const SbVec2f& pt, SbLine& line) const;
61   void projectPointToLine(const SbVec2f& pt,
62                           SbVec3f& line0, SbVec3f& line1) const;
63   void projectToScreen(const SbVec3f& src, SbVec3f& dst) const;
64   SbPlane getPlane(const float distFromEye) const;
65   SbVec3f getSightPoint(const float distFromEye) const;
66   SbVec3f getPlanePoint(const float distFromEye,
67                         const SbVec2f& normPoint) const;
68   SbRotation getAlignRotation(SbBool rightAngleOnly = FALSE) const;
69   float getWorldToScreenScale(const SbVec3f& worldCenter,
70                               float normRadius) const;
71   SbVec2f projectBox(const SbBox3f& box) const;
72   SbViewVolume narrow(float left, float bottom,
73                       float right, float top) const;
74   SbViewVolume narrow(const SbBox3f& box) const;
75   void ortho(float left, float right,
76              float bottom, float top,
77              float nearval, float farval);
78   void perspective(float fovy, float aspect,
79                    float nearval, float farval);
80   void frustum(float left, float right,
81                float bottom, float top,
82                float nearval, float farval);
83   void rotateCamera(const SbRotation& q);
84   void translateCamera(const SbVec3f& v);
85   SbVec3f zVector(void) const;
86   SbViewVolume zNarrow(float nearval, float farval) const;
87   void scale(float factor);
88   void scaleWidth(float ratio);
89   void scaleHeight(float ratio);
90   ProjectionType getProjectionType(void) const;
91   const SbVec3f& getProjectionPoint(void) const;
92   const SbVec3f& getProjectionDirection(void) const;
93   float getNearDist(void) const;
94   float getWidth(void) const;
95   float getHeight(void) const;
96   float getDepth(void) const;
97 
98   void print(FILE * fp) const;
99   void getViewVolumePlanes(SbPlane planes[6]) const;
100   void transform(const SbMatrix &matrix);
101   SbVec3f getViewUp(void) const;
102 
103   SbBool intersect(const SbVec3f & p) const;
104   SbBool intersect(const SbVec3f & p0, const SbVec3f & p1,
105                    SbVec3f & closestpoint) const;
106   SbBool intersect(const SbBox3f & box) const;
107   SbBox3f intersectionBox(const SbBox3f & box) const;
108 
109   SbBool outsideTest(const SbPlane & p,
110                      const SbVec3f & bmin, const SbVec3f & bmax) const;
111   const SbDPViewVolume & getDPViewVolume(void) const;
112 
113 public:
114   // Warning! It's extremely bad design to keep these data members
115   // public, but we have no choice since this is how it's done in
116   // the original SGI Open Inventor. We've seen example code that
117   // use these variables directly so we'll have to be compatible
118   // here. Please don't use these variables directly unless you're
119   // very sure about what you're doing.
120   ProjectionType type;
121   SbVec3f projPoint;
122   SbVec3f projDir;
123   float nearDist;
124   float nearToFar;
125   SbVec3f llf;
126   SbVec3f lrf;
127   SbVec3f ulf;
128 
129 private:
130   void getPlaneRectangle(const float depth, SbVec3f & lowerleft,
131                          SbVec3f & lowerright, SbVec3f & upperleft,
132                          SbVec3f & upperright) const;
133 
134   SbDPViewVolume dpvv;
135 };
136 
137 #endif // !COIN_SBVIEWVOLUME_H
138