Coverage Report

Created: 2026-04-09 11:41

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/include/tools/b3dtrans.hxx
Line
Count
Source
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/*
3
 * This file is part of the LibreOffice project.
4
 *
5
 * This Source Code Form is subject to the terms of the Mozilla Public
6
 * License, v. 2.0. If a copy of the MPL was not distributed with this
7
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
 *
9
 * This file incorporates work covered by the following license notice:
10
 *
11
 *   Licensed to the Apache Software Foundation (ASF) under one or more
12
 *   contributor license agreements. See the NOTICE file distributed
13
 *   with this work for additional information regarding copyright
14
 *   ownership. The ASF licenses this file to you under the Apache
15
 *   License, Version 2.0 (the "License"); you may not use this file
16
 *   except in compliance with the License. You may obtain a copy of
17
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18
 */
19
20
#ifndef INCLUDED_TOOLS_B3DTRANS_HXX
21
#define INCLUDED_TOOLS_B3DTRANS_HXX
22
23
6.08k
#define ZBUFFER_DEPTH_RANGE         (double(256L * 256L * 256L))
24
25
#include <basegfx/matrix/b3dhommatrix.hxx>
26
#include <tools/gen.hxx>
27
#include <basegfx/matrix/b2dhommatrix.hxx>
28
#include <basegfx/point/b3dpoint.hxx>
29
#include <basegfx/vector/b3dvector.hxx>
30
#include <tools/toolsdllapi.h>
31
32
/// Transformation sets for 3D output
33
class SAL_WARN_UNUSED SAL_DLLPUBLIC_RTTI B3dTransformationSet
34
{
35
private:
36
    // Object Matrix Object -> World
37
    basegfx::B3DHomMatrix maObjectTrans;
38
    basegfx::B3DHomMatrix maInvObjectTrans;
39
40
    // Orientation Matrix
41
    basegfx::B3DHomMatrix maOrientation;
42
    basegfx::B3DHomMatrix maInvOrientation;
43
44
    // Projection Matrix
45
    basegfx::B3DHomMatrix maProjection;
46
    basegfx::B3DHomMatrix maInvProjection;
47
48
    // Texture Matrices
49
    basegfx::B2DHomMatrix maTexture;
50
51
    // Parameters for ViewportTransformation
52
    basegfx::B3DVector    maScale;
53
    basegfx::B3DVector    maTranslate;
54
55
    // ViewPlane DeviceRectangle (user-defined)
56
    double                mfLeftBound;
57
    double                mfRightBound;
58
    double                mfBottomBound;
59
    double                mfTopBound;
60
61
    // Aspect ratio of 3D transformation (Y / X)
62
    // default: 1:1 -> 1.0
63
    // Disable with value 0.0
64
    double                mfRatio;
65
66
    // Viewport area in logical coordinates
67
    tools::Rectangle             maViewportRectangle;
68
    // Visible area within viewport
69
    tools::Rectangle             maVisibleRectangle;
70
71
    // Actual coordinates as set by CalcViewport
72
    // of visible viewport area (logical coordinates)
73
    tools::Rectangle             maSetBound;
74
75
    // Flags
76
    bool mbPerspective              : 1;
77
    bool mbProjectionValid          : 1;
78
79
public:
80
    B3dTransformationSet();
81
    virtual ~B3dTransformationSet();
82
83
    B3dTransformationSet(B3dTransformationSet const &) = default;
84
    B3dTransformationSet(B3dTransformationSet &&) = default;
85
0
    B3dTransformationSet & operator =(B3dTransformationSet const &) = default;
86
    B3dTransformationSet & operator =(B3dTransformationSet &&) = default;
87
88
    void Reset();
89
90
    /** Set the orientation
91
92
        @param vVRP the View Reference Point (VRP)
93
        @param vVPN the View Plane Normal (VPN)
94
        @param vVUP the View Up Plane (VUP)
95
    */
96
    void SetOrientation(
97
        const basegfx::B3DPoint& rVRP = basegfx::B3DPoint(0.0,0.0,1.0),
98
        const basegfx::B3DVector& rVPN = basegfx::B3DVector(0.0,0.0,1.0),
99
        const basegfx::B3DVector& rVUP = basegfx::B3DVector(0.0,1.0,0.0));
100
101
    // Projection
102
    void SetProjection(const basegfx::B3DHomMatrix& mProject);
103
    const basegfx::B3DHomMatrix& GetProjection();
104
105
    // Texture
106
107
    // aspect ratio accessors and the defined method of keeping defined aspect ratio
108
3.04k
    double GetRatio() const { return mfRatio; }
109
    TOOLS_DLLPUBLIC void SetRatio(double fNew);
110
111
    // Parameters of ViewportTransformation
112
    TOOLS_DLLPUBLIC void SetDeviceRectangle(double fL=-1.0, double fR=1.0,
113
                            double fB=-1.0, double fT=1.0);
114
6.08k
    double GetDeviceRectangleWidth() const { return mfRightBound - mfLeftBound; }
115
116
    TOOLS_DLLPUBLIC void SetPerspective(bool bNew);
117
118
    TOOLS_DLLPUBLIC void SetViewportRectangle(tools::Rectangle const & rRect, tools::Rectangle const & rVisible);
119
15.2k
    void SetViewportRectangle(tools::Rectangle const & rRect) { SetViewportRectangle(rRect, rRect); }
120
121
    void CalcViewport();
122
123
    // Direct accessors for miscellaneous transformations
124
    basegfx::B3DPoint WorldToEyeCoor(const basegfx::B3DPoint& rVec);
125
    basegfx::B3DPoint EyeToWorldCoor(const basegfx::B3DPoint& rVec);
126
127
    static void Frustum(
128
        basegfx::B3DHomMatrix& rTarget,
129
        double fLeft = -1.0, double fRight = 1.0,
130
        double fBottom = -1.0, double fTop = 1.0,
131
        double fNear = 0.001, double fFar = 1.0);
132
    static void Ortho(
133
        basegfx::B3DHomMatrix& rTarget,
134
        double fLeft = -1.0, double fRight = 1.0,
135
        double fBottom = -1.0, double fTop = 1.0,
136
        double fNear = 0.0, double fFar = 1.0);
137
    static void Orientation(
138
        basegfx::B3DHomMatrix& rTarget,
139
        const basegfx::B3DPoint& aVRP = basegfx::B3DPoint(0.0,0.0,1.0),
140
        basegfx::B3DVector aVPN = basegfx::B3DVector(0.0,0.0,1.0),
141
        basegfx::B3DVector aVUP = basegfx::B3DVector(0.0,1.0,0.0));
142
143
protected:
144
    void PostSetObjectTrans();
145
    void PostSetOrientation();
146
    void PostSetProjection();
147
148
    virtual void DeviceRectangleChange();
149
};
150
151
/** Viewport for B3D
152
153
    Uses a simplified model, in which a point is described using a View
154
    Reference Point (VRP).
155
*/
156
class SAL_WARN_UNUSED TOOLS_DLLPUBLIC B3dViewport : public B3dTransformationSet
157
{
158
private:
159
    basegfx::B3DPoint           aVRP;   // View Reference Point
160
    basegfx::B3DVector          aVPN;   // View Plane Normal
161
    basegfx::B3DVector          aVUV;   // View Up Vector
162
163
public:
164
    B3dViewport();
165
    virtual ~B3dViewport() override;
166
167
    B3dViewport(B3dViewport const &) = default;
168
    B3dViewport(B3dViewport &&) = default;
169
0
    B3dViewport & operator =(B3dViewport const &) = default;
170
    B3dViewport & operator =(B3dViewport &&) = default;
171
172
    void SetVUV(const basegfx::B3DVector& rNewVUV);
173
    void SetViewportValues(
174
        const basegfx::B3DPoint& rNewVRP,
175
        const basegfx::B3DVector& rNewVPN,
176
        const basegfx::B3DVector& rNewVUV);
177
178
0
    const basegfx::B3DPoint&    GetVRP() const  { return aVRP; }
179
0
    const basegfx::B3DVector&   GetVPN() const  { return aVPN; }
180
0
    const basegfx::B3DVector&   GetVUV() const  { return aVUV; }
181
182
protected:
183
    void CalcOrientation();
184
};
185
186
// B3D camera
187
188
class SAL_WARN_UNUSED TOOLS_DLLPUBLIC B3dCamera final : public B3dViewport
189
{
190
public:
191
    B3dCamera(
192
        const basegfx::B3DPoint& rPos = basegfx::B3DPoint(0.0, 0.0, 1.0),
193
        const basegfx::B3DVector& rLkAt = basegfx::B3DVector(0.0, 0.0, 0.0),
194
        double fFocLen = 35.0, double fBnkAng = 0.0);
195
    virtual ~B3dCamera() override;
196
197
    B3dCamera(B3dCamera const &) = default;
198
    B3dCamera(B3dCamera &&) = default;
199
0
    B3dCamera & operator =(B3dCamera const &) = default;
200
    B3dCamera & operator =(B3dCamera &&) = default;
201
202
private:
203
    void CalcNewViewportValues();
204
    void CalcFocalLength();
205
206
    virtual void DeviceRectangleChange() override;
207
208
    basegfx::B3DPoint       aPosition;
209
    basegfx::B3DVector  aLookAt;
210
    double                  fFocalLength;
211
    double                  fBankAngle;
212
213
};
214
215
#endif
216
217
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */