1 /*************************************************************************
3 * OpenOffice.org - a multi-platform office productivity suite
5 * $RCSfile: sdrpolypolygonprimitive3d.cxx,v $
9 * last change: $Author: aw $ $Date: 2008-06-10 09:29:33 $
11 * The Contents of this file are made available subject to
12 * the terms of GNU Lesser General Public License Version 2.1.
15 * GNU Lesser General Public License Version 2.1
16 * =============================================
17 * Copyright 2005 by Sun Microsystems, Inc.
18 * 901 San Antonio Road, Palo Alto, CA 94303, USA
20 * This library is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU Lesser General Public
22 * License version 2.1, as published by the Free Software Foundation.
24 * This library is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27 * Lesser General Public License for more details.
29 * You should have received a copy of the GNU Lesser General Public
30 * License along with this library; if not, write to the Free Software
31 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
34 ************************************************************************/
36 // MARKER(update_precomp.py): autogen include statement, do not remove
37 #include "precompiled_drawinglayer.hxx"
39 #include <drawinglayer/primitive3d/sdrpolypolygonprimitive3d.hxx>
40 #include <drawinglayer/primitive3d/sdrdecompositiontools3d.hxx>
41 #include <drawinglayer/primitive3d/drawinglayer_primitivetypes3d.hxx>
42 #include <basegfx/polygon/b3dpolypolygontools.hxx>
43 #include <drawinglayer/attribute/sdrattribute.hxx>
44 #include <drawinglayer/primitive3d/hittestprimitive3d.hxx>
46 //////////////////////////////////////////////////////////////////////////////
48 using namespace com::sun::star
;
50 //////////////////////////////////////////////////////////////////////////////
52 namespace drawinglayer
56 Primitive3DSequence
SdrPolyPolygonPrimitive3D::createLocalDecomposition(const geometry::ViewInformation3D
& /*rViewInformation*/) const
58 Primitive3DSequence aRetval
;
60 if(getPolyPolygon3D().count())
62 ::std::vector
< basegfx::B3DPolyPolygon
> aFill
;
63 aFill
.push_back(getPolyPolygon3D());
66 const basegfx::B3DRange
aRange(getRangeFrom3DGeometry(aFill
));
68 // #i98295# normal creation
69 if(getSdrLFSAttribute().getFill())
71 if(::com::sun::star::drawing::NormalsKind_SPHERE
== getSdr3DObjectAttribute().getNormalsKind())
73 applyNormalsKindSphereTo3DGeometry(aFill
, aRange
);
75 else if(::com::sun::star::drawing::NormalsKind_FLAT
== getSdr3DObjectAttribute().getNormalsKind())
77 applyNormalsKindFlatTo3DGeometry(aFill
);
80 if(getSdr3DObjectAttribute().getNormalsInvert())
82 applyNormalsInvertTo3DGeometry(aFill
);
86 // #i98314# texture coordinates
87 if(getSdrLFSAttribute().getFill())
89 applyTextureTo3DGeometry(
90 getSdr3DObjectAttribute().getTextureProjectionX(),
91 getSdr3DObjectAttribute().getTextureProjectionY(),
97 if(getSdrLFSAttribute().getFill())
100 aRetval
= create3DPolyPolygonFillPrimitives(
104 getSdr3DObjectAttribute(),
105 *getSdrLFSAttribute().getFill(),
106 getSdrLFSAttribute().getFillFloatTransGradient());
110 // create simplified 3d hit test geometry
111 const attribute::SdrFillAttribute
aSimplifiedFillAttribute(0.0, basegfx::BColor(), 0, 0, 0);
113 aRetval
= create3DPolyPolygonFillPrimitives(
117 getSdr3DObjectAttribute(),
118 aSimplifiedFillAttribute
,
121 // encapsulate in HitTestPrimitive3D and add
122 const Primitive3DReference
xRef(new HitTestPrimitive3D(aRetval
));
123 aRetval
= Primitive3DSequence(&xRef
, 1L);
127 if(getSdrLFSAttribute().getLine())
129 basegfx::B3DPolyPolygon
aLine(getPolyPolygon3D());
130 aLine
.clearNormals();
131 aLine
.clearTextureCoordinates();
132 const Primitive3DSequence
aLines(create3DPolyPolygonLinePrimitives(aLine
, getTransform(), *getSdrLFSAttribute().getLine()));
133 appendPrimitive3DSequenceToPrimitive3DSequence(aRetval
, aLines
);
137 if(getSdrLFSAttribute().getShadow() && aRetval
.hasElements())
139 const Primitive3DSequence
aShadow(createShadowPrimitive3D(aRetval
, *getSdrLFSAttribute().getShadow(), getSdr3DObjectAttribute().getShadow3D()));
140 appendPrimitive3DSequenceToPrimitive3DSequence(aRetval
, aShadow
);
147 SdrPolyPolygonPrimitive3D::SdrPolyPolygonPrimitive3D(
148 const basegfx::B3DPolyPolygon
& rPolyPolygon3D
,
149 const basegfx::B3DHomMatrix
& rTransform
,
150 const basegfx::B2DVector
& rTextureSize
,
151 const attribute::SdrLineFillShadowAttribute
& rSdrLFSAttribute
,
152 const attribute::Sdr3DObjectAttribute
& rSdr3DObjectAttribute
)
153 : SdrPrimitive3D(rTransform
, rTextureSize
, rSdrLFSAttribute
, rSdr3DObjectAttribute
),
154 maPolyPolygon3D(rPolyPolygon3D
)
158 bool SdrPolyPolygonPrimitive3D::operator==(const BasePrimitive3D
& rPrimitive
) const
160 if(SdrPrimitive3D::operator==(rPrimitive
))
162 const SdrPolyPolygonPrimitive3D
& rCompare
= static_cast< const SdrPolyPolygonPrimitive3D
& >(rPrimitive
);
164 return (getPolyPolygon3D() == rCompare
.getPolyPolygon3D());
170 basegfx::B3DRange
SdrPolyPolygonPrimitive3D::getB3DRange(const geometry::ViewInformation3D
& /*rViewInformation*/) const
172 // added this implementation to make sure that non-visible objects of this
173 // kind will deliver their expansion. If not implemented, it would never deliver
174 // the used space for non-visible objects since the decomposition for that
175 // case will be empty (what is correct). To support chart ATM which relies on
176 // non-visible objects occupying space in 3D, this method was added
177 basegfx::B3DRange aRetval
;
179 if(getPolyPolygon3D().count())
181 aRetval
= basegfx::tools::getRange(getPolyPolygon3D());
182 aRetval
.transform(getTransform());
184 if(getSdrLFSAttribute().getLine())
186 const attribute::SdrLineAttribute
& rLine
= *getSdrLFSAttribute().getLine();
188 if(rLine
.isVisible() && !basegfx::fTools::equalZero(rLine
.getWidth()))
190 // expand by half LineWidth as tube radius
191 aRetval
.grow(rLine
.getWidth() / 2.0);
200 ImplPrimitrive3DIDBlock(SdrPolyPolygonPrimitive3D
, PRIMITIVE3D_ID_SDRPOLYPOLYGONPRIMITIVE3D
)
202 } // end of namespace primitive3d
203 } // end of namespace drawinglayer
205 //////////////////////////////////////////////////////////////////////////////