This file is indexed.

/usr/include/libwildmagic/Wm5Camera.h is in libwildmagic-dev 5.13-1+b2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
// Geometric Tools, LLC
// Copyright (c) 1998-2014
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
// http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
//
// File Version: 5.0.3 (2011/08/25)

#ifndef WM5CAMERA_H
#define WM5CAMERA_H

#include "Wm5GraphicsLIB.h"
#include "Wm5Object.h"
#include "Wm5HMatrix.h"

namespace Wm5
{

class WM5_GRAPHICS_ITEM Camera : public Object
{
    WM5_DECLARE_RTTI;
    WM5_DECLARE_NAMES;
    WM5_DECLARE_STREAM(Camera);

public:
    // Construction and destruction.
    Camera (bool isPerspective = true);
    virtual ~Camera ();

    // The camera frame is always in world coordinates.
    //   default position  P = (0, 0,  0; 1)
    //   default direction D = (0, 0, -1; 0)
    //   default up        U = (0, 1,  0; 0)
    //   default right     R = (1, 0,  0; 0)
    void SetFrame (const APoint& position, const AVector& dVector,
        const AVector& uVector, const AVector& rVector);

    void SetPosition (const APoint& position);

    void SetAxes (const AVector& dVector, const AVector& uVector,
        const AVector& rVector);

    inline APoint GetPosition () const;
    inline AVector GetDVector () const;
    inline AVector GetUVector () const;
    inline AVector GetRVector () const;

    // Access the view matrix of the camera.  If D = (d0,d1,d2),
    // U = (u0,u1,u2), and R = (r0,r1,r2), then the view matrix is
    //   +-                     -+
    //   | r0  r1  r2  -Dot(R,P) |
    //   | u0  u1  u2  -Dot(U,P) |
    //   | d0  d1  d2  -Dot(D,P) |
    //   |  0   0   0          1 |
    //   +-                     -+
    // The view matrix multiplies vectors on its right, viewMat*vector4.
    inline const HMatrix& GetViewMatrix () const;

    // The view frustum has parameters [rmin,rmax], [umin,umax], and
    // [dmin,dmax].  The interval [rmin,rmax] is measured in the right
    // direction R.  These are the "left" and "right" frustum values.  The
    // interval [umin,umax] is measured in the up direction U.  These are
    // the "bottom" and "top" values.  The interval [dmin,dmax] is measured
    // in the view direction D.  These are the "near" and "far" values.
    // The frustum values are stored in an array with the following mappings:
    enum
    {
        VF_DMIN     = 0,  // near
        VF_DMAX     = 1,  // far
        VF_UMIN     = 2,  // bottom
        VF_UMAX     = 3,  // top
        VF_RMIN     = 4,  // left
        VF_RMAX     = 5,  // right
        VF_QUANTITY = 6
    };

    // The default view frustum has an up field-of-view of 90 degrees, an
    // aspect ratio of 1, near value 1, and far value 10000.

    inline bool IsPerspective () const;

    // Set the view frustum.  The interval [rmin,rmax] is measured in the
    // right direction R.  These are the "left" and "right" frustum values.
    // The interval [umin,umax] is measured in the up direction U.  These are
    // the "bottom" and "top" values.  The interval [dmin,dmax] is measured
    // in the view direction D.  These are the "near" and "far" values.
    void SetFrustum (float dMin, float dMax, float uMin, float uMax,
        float rMin, float rMax);

    // Set all the view frustum values simultaneously.  The input array must
    // have the order:  dmin, dmax, umin, umax, rmin, rmax.
    void SetFrustum (const float* frustum);

    // Set a symmetric view frustum (umin = -umax, rmin = -rmax) using a field
    // of view in the "up" direction and an aspect ratio "width/height".  This
    // call is the equivalent of gluPerspective in OpenGL.  As such, the field
    // of view in this function must be specified in degrees and be in the
    // interval (0,180).
    void SetFrustum (float upFovDegrees, float aspectRatio, float dMin,
        float dMax);

    // Get the view frustum.
    void GetFrustum (float& dMin, float& dMax, float& uMin, float& uMax,
        float& rMin, float& rMax) const;

    // Get all the view frustum values simultaneously.
    inline const float* GetFrustum () const;

    // Get the parameters for a symmetric view frustum.  The return value is
    // 'true' iff the current frustum is symmetric, in which case the output
    // parameters are valid.
    bool GetFrustum (float& upFovDegrees, float& aspectRatio, float& dMin,
        float& dMax) const;

    // Get the individual frustum values.
    inline float GetDMin () const;
    inline float GetDMax () const;
    inline float GetUMin () const;
    inline float GetUMax () const;
    inline float GetRMin () const;
    inline float GetRMax () const;

    // Access the projection matrices of the camera.  The projection matrix
    // that maps to depths [0,1] is what Direct3D uses.  The view matrix that
    // maps to depths [-1,1] is what OpenGL uses.
    enum WM5_GRAPHICS_ITEM DepthType
    {
        PM_DEPTH_ZERO_TO_ONE,       // [0,1]
        PM_DEPTH_MINUS_ONE_TO_ONE,  // [-1,1]
        PM_DEPTH_QUANTITY
    };

    inline DepthType GetDepthType () const;

    // The frustum values are N (near), F (far), B (bottom), T (top),
    // L (left), and R (right).  The various matrices are as follows.
    //
    // perspective, depth [0,1]
    //   +-                                               -+
    //   | 2*N/(R-L)  0           -(R+L)/(R-L)  0          |
    //   | 0          2*N/(T-B)   -(T+B)/(T-B)  0          |
    //   | 0          0           F/(F-N)       -N*F/(F-N) |
    //   | 0          0           1             0          |
    //   +-                                               -+
    //
    // perspective, depth [-1,1]
    //   +-                                                 -+
    //   | 2*N/(R-L)  0           -(R+L)/(R-L)  0            |
    //   | 0          2*N/(T-B)   -(T+B)/(T-B)  0            |
    //   | 0          0           (F+N)/(F-N)   -2*F*N/(F-N) |
    //   | 0          0           1             0
    //   +-                                                 -+
    //
    // orthographic, depth [0,1]
    //   +-                                       -+
    //   | 2/(R-L)  0  0              -(R+L)/(R-L) |
    //   | 0        2/(T-B)  0        -(T+B)/(T-B) |
    //   | 0        0        1/(F-N)  -N/(F-N)  0  |
    //   | 0        0        0        1            |
    //   +-                                       -+
    //
    // orthographic, depth [-1,1]
    //   +-                                       -+
    //   | 2/(R-L)  0        0        -(R+L)/(R-L) |
    //   | 0        2/(T-B)  0        -(T+B)/(T-B) |
    //   | 0        0        2/(F-N)  -(F+N)/(F-N) |
    //   | 0        0        0        1            |
    //   +-                                       -+
    //
    // The projection matrix multiplies vectors on its right, projMat*vector4.

    // The returned matrix depends on the values of msDepthType and
    // mIsPerspective.
    inline const HMatrix& GetProjectionMatrix () const;

    // Support for advanced effects.  The first function allows you to set the
    // projection matrix anyway you like.  The second function specifies a
    // convex quadrilateral viewport.  The points must be in camera
    // coordinates and are counterclockwise ordered as viewed from the
    // eyepoint.  The plane of the quadrilateral is the view plane and has an
    // "extrude" value of 1.  The nearExtrude value is in (0,infinity); this
    // specifies the fraction from the eyepoint to the view plane at which to
    // place the near-face of the cuboidal view volume.  The farExtrude value
    // is in (nearExtrude,infinity); this specifies the fraction from the
    // eyepoint at which to place the far-face of the cuboidal view volume.
    inline void SetProjectionMatrix (const HMatrix& projMatrix);
    void SetProjectionMatrix (const APoint& p00, const APoint& p10,
        const APoint& p11, const APoint& p01, float nearExtrude,
        float farExtrude);

    // The projection-view-world matrix is commonly used in the shader
    // programs to transform model-space data to clip-space data.  To avoid
    // repeatedly computing the projection-view matrix for each geometric
    // object, the product is stored and maintained in this class.
    inline const HMatrix& GetProjectionViewMatrix () const;

    // The preview matrix is applied after the model-to-world but before the
    // view matrix.  It is used for transformations such as reflections of
    // world objects.  The default value is the identity matrix.
    void SetPreViewMatrix (const HMatrix& preViewMatrix);
    inline const HMatrix& GetPreViewMatrix () const;
    inline bool PreViewIsIdentity () const;

    // The postprojection matrix is used for screen-space transformations such
    // as reflection of the rendered image.  The default value is the identity
    // matrix.
    void SetPostProjectionMatrix (const HMatrix& postProjMatrix);
    inline const HMatrix& GetPostProjectionMatrix () const;
    inline bool PostProjectionIsIdentity () const;

    // Compute the axis-aligned bounding rectangle in normalized display
    // space, [-1,1]x[-1,1], for a set of vertices.  The input 'vertices' is a
    // pointer to triples of 'float' values, each triple representing a vertex.
    // The stride is the number of bytes from the first position channel of one
    // vertex to the first position channel of the next vertex.  If the
    // vertices are packed contiguously, the stride is 3*sizeof(float).  The
    // vertices are in model space.  The input 'worldMatrix' transforms the
    // model space to world space.
    void ComputeBoundingAABB (int numVertices, const char* vertices,
        int stride, const HMatrix& worldMatrix, float& xmin, float& xmax,
        float& ymin, float& ymax);

protected:
    // Compute the view matrix after the frame changes.
    void OnFrameChange ();

    // Compute the projection matrices after the frustum changes.
    void OnFrustumChange ();

    // Compute the product postproj-proj-view-preview.
    void UpdatePVMatrix ();

    // The world coordinate frame.
    APoint mPosition;
    AVector mDVector, mUVector, mRVector;

    // The view matrix for the camera.  The matrix is stored so that you
    // apply it to vectors on the right:  viewMatrix*someVector4.
    HMatrix mViewMatrix;

    // The view frustum, stored in order as dmin (near), dmax (far),
    // umin (bottom), umax (top), rmin (left), and rmax (right).
    float mFrustum[VF_QUANTITY];

    // The projection matrices for the camera.  The matrices are stored so
    // that you apply it to vectors on the right:  projMatrix*someVector4.
    HMatrix mProjectionMatrix[PM_DEPTH_QUANTITY];

    // The product of the projection and view matrix.  This includes the
    // post-projection and/or pre-view whenever those are not the identity
    // matrix.
    HMatrix mProjectionViewMatrix[PM_DEPTH_QUANTITY];

    // The preview matrix for the camera.
    HMatrix mPreViewMatrix;
    bool mPreViewIsIdentity;

    // The postprojection matrix for the camera.
    HMatrix mPostProjectionMatrix;
    bool mPostProjectionIsIdentity;

    // This member is 'true' for a perspective camera or 'false' for an
    // orthographic camera.
    bool mIsPerspective;

    // This object's depth type.  The value is initialized to
    // msDefaultDepthType during the constructor call.  Camera does not
    // stream this value.  The Projector derived class overrides the depth
    // type and does stream it, because you might want a projector of a
    // type that does not match the graphics API type.
    DepthType mDepthType;

    // Specify the type of projection matrix (different between DirectX and
    // OpenGL).  This value is used to initialize mDepthType during the
    // constructor call.
    static DepthType msDefaultDepthType;

public_internal:
    // Set this to one of the previously mentioned enumerations.  You should
    // do so in the platform-dependent application layer.  This guarantees
    // that you access the correct projection matrix in GetProjection().
    inline static void SetDefaultDepthType (DepthType type);
    inline static DepthType GetDefaultDepthType ();

// Read the comments in Wm5GraphicsLIB.h about this define.
private_internal:
#ifdef WM5_VALIDATE_CAMERA_FRAME_ONCE
    bool mValidateCameraFrame;
#endif
};

WM5_REGISTER_STREAM(Camera);
typedef Pointer0<Camera> CameraPtr;
#include "Wm5Camera.inl"

}

#endif