xref: /trunk/main/drawinglayer/inc/drawinglayer/primitive3d/sdrextrudeprimitive3d.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
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_SDREXTRUDEPRIMITIVE3D_HXX
25 #define INCLUDED_DRAWINGLAYER_PRIMITIVE3D_SDREXTRUDEPRIMITIVE3D_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         /** SdrExtrudePrimitive3D class
38 
39             This 3D primitive expands the SdrPrimitive3D to a 3D extrude definition.
40             The given 2D PolyPolygon geometry is imagined as lying on the XY-plane in 3D
41             and gets extruded in Z-Direction by Depth.
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 SdrExtrudePrimitive3D : 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             double                                      mfDepth;
58             double                                      mfDiagonal;
59             double                                      mfBackScale;
60 
61             /// decomposition data when ReducedLineGeometry is used, see get3DDecomposition
62             geometry::ViewInformation3D*                mpLastRLGViewInformation;
63 
64             /// bitfield
65             unsigned                                    mbSmoothNormals : 1; // Plane self
66             unsigned                                    mbSmoothHorizontalNormals : 1; // always
67             unsigned                                    mbSmoothLids : 1; // Front/back
68             unsigned                                    mbCharacterMode : 1;
69             unsigned                                    mbCloseFront : 1;
70             unsigned                                    mbCloseBack : 1;
71 
72             /// create slices
73             void impCreateSlices();
74 
75             /// get (evtl. create) slices
76             const Slice3DVector& getSlices() const;
77 
78         protected:
79             /// local decomposition.
80             virtual Primitive3DSequence create3DDecomposition(const geometry::ViewInformation3D& rViewInformation) const;
81 
82         public:
83             /// constructor
84             SdrExtrudePrimitive3D(
85                 const basegfx::B3DHomMatrix& rTransform,
86                 const basegfx::B2DVector& rTextureSize,
87                 const attribute::SdrLineFillShadowAttribute3D& rSdrLFSAttribute,
88                 const attribute::Sdr3DObjectAttribute& rSdr3DObjectAttribute,
89                 const basegfx::B2DPolyPolygon& rPolyPolygon,
90                 double fDepth,
91                 double fDiagonal,
92                 double fBackScale,
93                 bool bSmoothNormals,
94                 bool bSmoothHorizontalNormals,
95                 bool bSmoothLids,
96                 bool bCharacterMode,
97                 bool bCloseFront,
98                 bool bCloseBack);
99             virtual ~SdrExtrudePrimitive3D();
100 
101             /// data read access
getPolyPolygon() const102             const basegfx::B2DPolyPolygon& getPolyPolygon() const { return maPolyPolygon; }
getDepth() const103             double getDepth() const { return mfDepth; }
getDiagonal() const104             double getDiagonal() const { return mfDiagonal; }
getBackScale() const105             double getBackScale() const { return mfBackScale; }
getSmoothNormals() const106             bool getSmoothNormals() const { return mbSmoothNormals; }
getSmoothHorizontalNormals() const107             bool getSmoothHorizontalNormals() const { return mbSmoothHorizontalNormals; }
getSmoothLids() const108             bool getSmoothLids() const { return mbSmoothLids; }
getCharacterMode() const109             bool getCharacterMode() const { return mbCharacterMode; }
getCloseFront() const110             bool getCloseFront() const { return mbCloseFront; }
getCloseBack() const111             bool getCloseBack() const { return mbCloseBack; }
112 
113             /// compare operator
114             virtual bool operator==(const BasePrimitive3D& rPrimitive) const;
115 
116             /// get range
117             virtual basegfx::B3DRange getB3DRange(const geometry::ViewInformation3D& rViewInformation) const;
118 
119             /// Overloaded to allow for reduced line mode to decide if to buffer decomposition or not
120             virtual Primitive3DSequence get3DDecomposition(const geometry::ViewInformation3D& rViewInformation) const;
121 
122             /// provide unique ID
123             DeclPrimitrive3DIDBlock()
124         };
125     } // end of namespace primitive3d
126 } // end of namespace drawinglayer
127 
128 //////////////////////////////////////////////////////////////////////////////
129 
130 #endif //INCLUDED_DRAWINGLAYER_PRIMITIVE3D_SDREXTRUDEPRIMITIVE3D_HXX
131 
132 //////////////////////////////////////////////////////////////////////////////
133 // eof
134