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 INCLUDED_DRAWINGLAYER_PRIMITIVE3D_SDRLATHEPRIMITIVE3D_HXX 25 #define INCLUDED_DRAWINGLAYER_PRIMITIVE3D_SDRLATHEPRIMITIVE3D_HXX 26 27 #include <drawinglayer/drawinglayerdllapi.h> 28 #include <drawinglayer/primitive3d/sdrprimitive3d.hxx> 29 #include <basegfx/polygon/b2dpolypolygon.hxx> 30 31 ////////////////////////////////////////////////////////////////////////////// 32 33 namespace drawinglayer 34 { 35 namespace primitive3d 36 { 37 /** SdrLathePrimitive3D class 38 39 This 3D primitive expands the SdrPrimitive3D to a 3D rotation definition. 40 The given 2D PolyPolygon geometry is imagined as lying on the XY-plane in 3D 41 and gets rotated around the Y-Axis. 42 43 Various possibilities e.g. for creating diagonals (edge roudings in 3D) 44 and similar are given. 45 46 The decomposition will create all necessary 3D planes for visualisation. 47 */ 48 class DRAWINGLAYER_DLLPUBLIC SdrLathePrimitive3D : public SdrPrimitive3D 49 { 50 private: 51 /// geometry helper for slices 52 basegfx::B2DPolyPolygon maCorrectedPolyPolygon; 53 Slice3DVector maSlices; 54 55 /// primitive geometry data 56 basegfx::B2DPolyPolygon maPolyPolygon; 57 sal_uInt32 mnHorizontalSegments; 58 sal_uInt32 mnVerticalSegments; 59 double mfDiagonal; 60 double mfBackScale; 61 double mfRotation; 62 63 /// decomposition data when ReducedLineGeometry is used, see get3DDecomposition 64 geometry::ViewInformation3D* mpLastRLGViewInformation; 65 66 /// bitfield 67 unsigned mbSmoothNormals : 1; // Plane self 68 unsigned mbSmoothHorizontalNormals : 1; // always 69 unsigned mbSmoothLids : 1; // Front/back 70 unsigned mbCharacterMode : 1; 71 unsigned mbCloseFront : 1; 72 unsigned mbCloseBack : 1; 73 74 /// create slices 75 void impCreateSlices(); 76 77 /// get (evtl. create) slices 78 const Slice3DVector& getSlices() const; 79 80 protected: 81 /// local helpers 82 void impCreateOutlines( 83 const geometry::ViewInformation3D& rViewInformation, 84 const basegfx::B3DPolygon& rLoopA, 85 const basegfx::B3DPolygon& rLoopB, 86 basegfx::B3DPolyPolygon& rTarget) const; 87 88 bool impHasCutWith( 89 const basegfx::B2DPolygon& rPoly, 90 const basegfx::B2DPoint& rStart, 91 const basegfx::B2DPoint& rEnd) const; 92 93 /// local decomposition. 94 virtual Primitive3DSequence create3DDecomposition(const geometry::ViewInformation3D& rViewInformation) const; 95 96 public: 97 /// constructor 98 SdrLathePrimitive3D( 99 const basegfx::B3DHomMatrix& rTransform, 100 const basegfx::B2DVector& rTextureSize, 101 const attribute::SdrLineFillShadowAttribute3D& rSdrLFSAttribute, 102 const attribute::Sdr3DObjectAttribute& rSdr3DObjectAttribute, 103 const basegfx::B2DPolyPolygon& rPolyPolygon, 104 sal_uInt32 nHorizontalSegments, 105 sal_uInt32 nVerticalSegments, 106 double fDiagonal, 107 double fBackScale, 108 double fRotation, 109 bool bSmoothNormals, 110 bool bSmoothHorizontalNormals, 111 bool bSmoothLids, 112 bool bCharacterMode, 113 bool bCloseFront, 114 bool bCloseBack); 115 virtual ~SdrLathePrimitive3D(); 116 117 /// data read access getPolyPolygon() const118 const basegfx::B2DPolyPolygon& getPolyPolygon() const { return maPolyPolygon; } getHorizontalSegments() const119 sal_uInt32 getHorizontalSegments() const { return mnHorizontalSegments; } getVerticalSegments() const120 sal_uInt32 getVerticalSegments() const { return mnVerticalSegments; } getDiagonal() const121 double getDiagonal() const { return mfDiagonal; } getBackScale() const122 double getBackScale() const { return mfBackScale; } getRotation() const123 double getRotation() const { return mfRotation; } getSmoothNormals() const124 bool getSmoothNormals() const { return mbSmoothNormals; } getSmoothHorizontalNormals() const125 bool getSmoothHorizontalNormals() const { return mbSmoothHorizontalNormals; } getSmoothLids() const126 bool getSmoothLids() const { return mbSmoothLids; } getCharacterMode() const127 bool getCharacterMode() const { return mbCharacterMode; } getCloseFront() const128 bool getCloseFront() const { return mbCloseFront; } getCloseBack() const129 bool getCloseBack() const { return mbCloseBack; } 130 131 /// compare operator 132 virtual bool operator==(const BasePrimitive3D& rPrimitive) const; 133 134 /// get range 135 virtual basegfx::B3DRange getB3DRange(const geometry::ViewInformation3D& rViewInformation) const; 136 137 /// Overloaded to allow for reduced line mode to decide if to buffer decomposition or not 138 virtual Primitive3DSequence get3DDecomposition(const geometry::ViewInformation3D& rViewInformation) const; 139 140 /// provide unique ID 141 DeclPrimitrive3DIDBlock() 142 }; 143 } // end of namespace primitive3d 144 } // end of namespace drawinglayer 145 146 ////////////////////////////////////////////////////////////////////////////// 147 148 #endif //INCLUDED_DRAWINGLAYER_PRIMITIVE3D_SDRLATHEPRIMITIVE3D_HXX 149 150 ////////////////////////////////////////////////////////////////////////////// 151 // eof 152