1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef _B3D_B3DTRANS_HXX 25 #define _B3D_B3DTRANS_HXX 26 27 // Zu verwendender DephRange des Z-Buffers 28 #define ZBUFFER_DEPTH_RANGE ((double)(256L * 256L * 256L)) 29 30 #include <basegfx/matrix/b3dhommatrix.hxx> 31 #include <basegfx/range/b3drange.hxx> 32 #include <tools/gen.hxx> 33 #include <basegfx/matrix/b2dhommatrix.hxx> 34 #include <basegfx/point/b2dpoint.hxx> 35 #include <tools/toolsdllapi.h> 36 37 // Vorausdeklarationen 38 39 /************************************************************************* 40 |* 41 |* Unterstuetzte Methoden, um das Seitenverhaeltnis einzuhalten 42 |* 43 \************************************************************************/ 44 45 enum Base3DRatio 46 { 47 Base3DRatioGrow = 1, 48 Base3DRatioShrink, 49 Base3DRatioMiddle 50 }; 51 52 /************************************************************************* 53 |* 54 |* Typ der Projektion 55 |* 56 \************************************************************************/ 57 58 enum Base3DProjectionType 59 { 60 Base3DProjectionTypeParallel = 1, 61 Base3DProjectionTypePerspective 62 }; 63 64 /************************************************************************* 65 |* 66 |* Transformationen fuer alle 3D Ausgaben 67 |* 68 \************************************************************************/ 69 70 class TOOLS_DLLPUBLIC B3dTransformationSet 71 { 72 private: 73 // Object Matrix Object -> World 74 basegfx::B3DHomMatrix maObjectTrans; 75 basegfx::B3DHomMatrix maInvObjectTrans; 76 77 // Orientation Matrix 78 basegfx::B3DHomMatrix maOrientation; 79 basegfx::B3DHomMatrix maInvOrientation; 80 81 // Projection Matrix 82 basegfx::B3DHomMatrix maProjection; 83 basegfx::B3DHomMatrix maInvProjection; 84 85 // Texture Matrices 86 basegfx::B2DHomMatrix maTexture; 87 88 // Speziell zum Umwandeln von Punkten Objekt -> Device 89 basegfx::B3DHomMatrix maObjectToDevice; 90 91 // Transponierte Inverse fuer Vectortransformationen 92 basegfx::B3DHomMatrix maInvTransObjectToEye; 93 94 // Transformation World->View 95 basegfx::B3DHomMatrix maMatFromWorldToView; 96 basegfx::B3DHomMatrix maInvMatFromWorldToView; 97 98 // Parameters for ViewportTransformation 99 basegfx::B3DVector maScale; 100 basegfx::B3DVector maTranslate; 101 102 // ViewPlane DeviceRectangle (vom Benutzer gesetzt) 103 double mfLeftBound; 104 double mfRightBound; 105 double mfBottomBound; 106 double mfTopBound; 107 108 // Near and far clipping planes 109 double mfNearBound; 110 double mfFarBound; 111 112 // Seitenverhaeltnis der 3D Abbildung (Y / X) 113 // default ist 1:1 -> 1.0 114 // Deaktivieren mit 0.0 als Wert 115 double mfRatio; 116 117 // Der gesetzte Ausgabebereich (in logischen Koordinaten) 118 // und der dazugehoerige sichtbare Bereich 119 Rectangle maViewportRectangle; 120 Rectangle maVisibleRectangle; 121 122 // Die tatsaechlich von CalcViewport gesetzten Abmessungen 123 // des sichtbaren Bereichs (in logischen Koordinaten) 124 Rectangle maSetBound; 125 126 // Methode zur Aufrechterhaltung des Seitenverhaeltnisses 127 // default ist Base3DRatioGrow 128 Base3DRatio meRatio; 129 130 // Flags 131 unsigned mbPerspective : 1; 132 unsigned mbWorldToViewValid : 1; 133 unsigned mbInvTransObjectToEyeValid : 1; 134 unsigned mbObjectToDeviceValid : 1; 135 unsigned mbProjectionValid : 1; 136 137 public: 138 B3dTransformationSet(); 139 virtual ~B3dTransformationSet(); 140 141 // Zurueck auf Standard 142 void Reset(); 143 144 // ObjectTrans 145 void SetObjectTrans(const basegfx::B3DHomMatrix& rObj); GetObjectTrans()146 const basegfx::B3DHomMatrix& GetObjectTrans() { return maObjectTrans; } GetInvObjectTrans()147 const basegfx::B3DHomMatrix& GetInvObjectTrans() { return maInvObjectTrans; } 148 149 // Orientation 150 void SetOrientation( 151 basegfx::B3DPoint aVRP = basegfx::B3DPoint(0.0,0.0,1.0), 152 basegfx::B3DVector aVPN = basegfx::B3DVector(0.0,0.0,1.0), 153 basegfx::B3DVector aVUP = basegfx::B3DVector(0.0,1.0,0.0)); 154 void SetOrientation(basegfx::B3DHomMatrix& mOrient); GetOrientation()155 const basegfx::B3DHomMatrix& GetOrientation() { return maOrientation; } GetInvOrientation()156 const basegfx::B3DHomMatrix& GetInvOrientation() { return maInvOrientation; } 157 158 // Projection 159 void SetProjection(const basegfx::B3DHomMatrix& mProject); 160 const basegfx::B3DHomMatrix& GetProjection(); 161 const basegfx::B3DHomMatrix& GetInvProjection(); 162 163 // Texture 164 void SetTexture(const basegfx::B2DHomMatrix& rTxt); GetTexture()165 const basegfx::B2DHomMatrix& GetTexture() { return maTexture; } 166 167 // Seitenverhaeltnis und Modus zu dessen Aufrechterhaltung GetRatio()168 double GetRatio() { return mfRatio; } 169 void SetRatio(double fNew=1.0); GetRatioMode()170 Base3DRatio GetRatioMode() { return meRatio; } 171 void SetRatioMode(Base3DRatio eNew=Base3DRatioGrow); 172 173 // Parameter der ViewportTransformation 174 void SetDeviceRectangle(double fL=-1.0, double fR=1.0, double fB=-1.0, double fT=1.0, sal_Bool bBroadCastChange=sal_True); 175 void SetDeviceVolume(const basegfx::B3DRange& rVol, sal_Bool bBroadCastChange=sal_True); 176 void GetDeviceRectangle(double &fL, double &fR, double& fB, double& fT); 177 basegfx::B3DRange GetDeviceVolume(); GetDeviceRectangleWidth() const178 double GetDeviceRectangleWidth() const { return mfRightBound - mfLeftBound; } GetDeviceRectangleHeight() const179 double GetDeviceRectangleHeight() const { return mfTopBound - mfBottomBound; } 180 void SetFrontClippingPlane(double fF=0.0); GetFrontClippingPlane()181 double GetFrontClippingPlane() { return mfNearBound; } 182 void SetBackClippingPlane(double fB=1.0); GetBackClippingPlane()183 double GetBackClippingPlane() { return mfFarBound; } 184 void SetPerspective(sal_Bool bNew); GetPerspective()185 sal_Bool GetPerspective() { return mbPerspective; } 186 void SetViewportRectangle(Rectangle& rRect, Rectangle& rVisible); SetViewportRectangle(Rectangle & rRect)187 void SetViewportRectangle(Rectangle& rRect) { SetViewportRectangle(rRect, rRect); } GetViewportRectangle()188 const Rectangle& GetViewportRectangle() { return maViewportRectangle; } 189 void CalcViewport(); 190 191 // Spezielle Matritzen anfordern 192 basegfx::B3DHomMatrix GetMatFromObjectToView(); 193 194 // Transponierte Inverse fuer Vectortransformationen 195 const basegfx::B3DHomMatrix& GetInvTransObjectToEye(); 196 197 // Speziell zum Umwandeln von Punkten Objekt -> Device 198 const basegfx::B3DHomMatrix& GetObjectToDevice(); 199 200 // Speziell zum Umwandeln von Punkten World -> View 201 const basegfx::B3DHomMatrix& GetMatFromWorldToView(); 202 const basegfx::B3DHomMatrix& GetInvMatFromWorldToView(); 203 204 // Bounds des Viewports lesen 205 const Rectangle& GetLogicalViewportBounds(); 206 const basegfx::B3DVector& GetScale(); 207 const basegfx::B3DVector& GetTranslate(); 208 209 // Direkter Zugriff auf verschiedene Transformationen 210 const basegfx::B3DPoint WorldToEyeCoor(const basegfx::B3DPoint& rVec); 211 const basegfx::B3DPoint EyeToWorldCoor(const basegfx::B3DPoint& rVec); 212 const basegfx::B3DPoint EyeToViewCoor(const basegfx::B3DPoint& rVec); 213 const basegfx::B3DPoint ViewToEyeCoor(const basegfx::B3DPoint& rVec); 214 const basegfx::B3DPoint WorldToViewCoor(const basegfx::B3DPoint& rVec); 215 const basegfx::B3DPoint ViewToWorldCoor(const basegfx::B3DPoint& rVec); 216 const basegfx::B3DPoint DeviceToViewCoor(const basegfx::B3DPoint& rVec); 217 const basegfx::B3DPoint ViewToDeviceCoor(const basegfx::B3DPoint& rVec); 218 const basegfx::B3DPoint ObjectToWorldCoor(const basegfx::B3DPoint& rVec); 219 const basegfx::B3DPoint WorldToObjectCoor(const basegfx::B3DPoint& rVec); 220 const basegfx::B3DPoint ObjectToViewCoor(const basegfx::B3DPoint& rVec); 221 const basegfx::B3DPoint ViewToObjectCoor(const basegfx::B3DPoint& rVec); 222 const basegfx::B3DPoint ObjectToEyeCoor(const basegfx::B3DPoint& rVec); 223 const basegfx::B3DPoint EyeToObjectCoor(const basegfx::B3DPoint& rVec); 224 const basegfx::B3DPoint DeviceToEyeCoor(const basegfx::B3DPoint& rVec); 225 const basegfx::B3DPoint EyeToDeviceCoor(const basegfx::B3DPoint& rVec); 226 227 const basegfx::B3DPoint InvTransObjectToEye(const basegfx::B3DPoint& rVec); 228 const basegfx::B2DPoint TransTextureCoor(const basegfx::B2DPoint& rVec); 229 230 static void Frustum( 231 basegfx::B3DHomMatrix& rTarget, 232 double fLeft = -1.0, double fRight = 1.0, 233 double fBottom = -1.0, double fTop = 1.0, 234 double fNear = 0.001, double fFar = 1.0); 235 static void Ortho( 236 basegfx::B3DHomMatrix& rTarget, 237 double fLeft = -1.0, double fRight = 1.0, 238 double fBottom = -1.0, double fTop = 1.0, 239 double fNear = 0.0, double fFar = 1.0); 240 static void Orientation( 241 basegfx::B3DHomMatrix& rTarget, 242 basegfx::B3DPoint aVRP = basegfx::B3DPoint(0.0,0.0,1.0), 243 basegfx::B3DVector aVPN = basegfx::B3DVector(0.0,0.0,1.0), 244 basegfx::B3DVector aVUP = basegfx::B3DVector(0.0,1.0,0.0)); 245 246 protected: 247 void PostSetObjectTrans(); 248 void PostSetOrientation(); 249 void PostSetProjection(); 250 void PostSetTexture(); 251 void PostSetViewport(); 252 253 void CalcMatObjectToDevice(); 254 void CalcMatFromWorldToView(); 255 void CalcMatInvTransObjectToEye(); 256 257 virtual void DeviceRectangleChange(); 258 }; 259 260 /************************************************************************* 261 |* 262 |* Viewport fuer B3D 263 |* 264 |* Verwendet wird hier ein vereinfachtes System, bei dem der abzubildende 265 |* Punkt durch VRP repraesentiert wird 266 |* 267 \************************************************************************/ 268 269 class TOOLS_DLLPUBLIC B3dViewport : public B3dTransformationSet 270 { 271 private: 272 basegfx::B3DPoint aVRP; // View Reference Point 273 basegfx::B3DVector aVPN; // View Plane Normal 274 basegfx::B3DVector aVUV; // View Up Vector 275 276 public: 277 B3dViewport(); 278 virtual ~B3dViewport(); 279 280 void SetVRP(const basegfx::B3DPoint& rNewVRP); 281 void SetVPN(const basegfx::B3DVector& rNewVPN); 282 void SetVUV(const basegfx::B3DVector& rNewVUV); 283 void SetViewportValues( 284 const basegfx::B3DPoint& rNewVRP, 285 const basegfx::B3DVector& rNewVPN, 286 const basegfx::B3DVector& rNewVUV); 287 GetVRP() const288 const basegfx::B3DPoint& GetVRP() const { return aVRP; } GetVPN() const289 const basegfx::B3DVector& GetVPN() const { return aVPN; } GetVUV() const290 const basegfx::B3DVector& GetVUV() const { return aVUV; } 291 292 protected: 293 void CalcOrientation(); 294 }; 295 296 /************************************************************************* 297 |* 298 |* Kamera fuer B3D 299 |* 300 \************************************************************************/ 301 302 class TOOLS_DLLPUBLIC B3dCamera : public B3dViewport 303 { 304 private: 305 basegfx::B3DPoint aPosition; 306 basegfx::B3DPoint aCorrectedPosition; 307 basegfx::B3DVector aLookAt; 308 double fFocalLength; 309 double fBankAngle; 310 311 unsigned bUseFocalLength : 1; 312 313 public: 314 B3dCamera( 315 const basegfx::B3DPoint& rPos = basegfx::B3DPoint(0.0, 0.0, 1.0), 316 const basegfx::B3DVector& rLkAt = basegfx::B3DVector(0.0, 0.0, 0.0), 317 double fFocLen = 35.0, double fBnkAng = 0.0, 318 sal_Bool bUseFocLen = sal_False); 319 virtual ~B3dCamera(); 320 321 // Positionen 322 void SetPosition(const basegfx::B3DPoint& rNewPos); GetPosition() const323 const basegfx::B3DPoint& GetPosition() const { return aPosition; } 324 void SetLookAt(const basegfx::B3DVector& rNewLookAt); GetLookAt() const325 const basegfx::B3DVector& GetLookAt() const { return aLookAt; } 326 void SetPositionAndLookAt(const basegfx::B3DPoint& rNewPos, const basegfx::B3DVector& rNewLookAt); 327 328 // Brennweite in mm 329 void SetFocalLength(double fLen); GetFocalLength() const330 double GetFocalLength() const { return fFocalLength; } 331 332 // Neigung links/rechts 333 void SetBankAngle(double fAngle); GetBankAngle() const334 double GetBankAngle() const { return fBankAngle; } 335 336 // FocalLength Flag 337 void SetUseFocalLength(sal_Bool bNew); GetUseFocalLength() const338 sal_Bool GetUseFocalLength() const { return (sal_Bool)bUseFocalLength; } 339 340 protected: 341 void CalcNewViewportValues(); 342 sal_Bool CalcFocalLength(); 343 344 virtual void DeviceRectangleChange(); 345 }; 346 347 348 #endif // _B3D_B3DTRANS_HXX 349