1*464702f4SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*464702f4SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*464702f4SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*464702f4SAndrew Rist * distributed with this work for additional information 6*464702f4SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*464702f4SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*464702f4SAndrew Rist * "License"); you may not use this file except in compliance 9*464702f4SAndrew Rist * with the License. You may obtain a copy of the License at 10*464702f4SAndrew Rist * 11*464702f4SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*464702f4SAndrew Rist * 13*464702f4SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*464702f4SAndrew Rist * software distributed under the License is distributed on an 15*464702f4SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*464702f4SAndrew Rist * KIND, either express or implied. See the License for the 17*464702f4SAndrew Rist * specific language governing permissions and limitations 18*464702f4SAndrew Rist * under the License. 19*464702f4SAndrew Rist * 20*464702f4SAndrew Rist *************************************************************/ 21*464702f4SAndrew Rist 22*464702f4SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_drawinglayer.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <drawinglayer/primitive2d/embedded3dprimitive2d.hxx> 28cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygon.hxx> 29cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygontools.hxx> 30cdf0e10cSrcweir #include <basegfx/color/bcolor.hxx> 31cdf0e10cSrcweir #include <drawinglayer/primitive2d/polygonprimitive2d.hxx> 32cdf0e10cSrcweir #include <basegfx/tools/canvastools.hxx> 33cdf0e10cSrcweir #include <drawinglayer/geometry/viewinformation2d.hxx> 34cdf0e10cSrcweir #include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx> 35cdf0e10cSrcweir #include <drawinglayer/geometry/viewinformation3d.hxx> 36cdf0e10cSrcweir #include <drawinglayer/processor3d/shadow3dextractor.hxx> 37cdf0e10cSrcweir 38cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 39cdf0e10cSrcweir 40cdf0e10cSrcweir using namespace com::sun::star; 41cdf0e10cSrcweir 42cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 43cdf0e10cSrcweir 44cdf0e10cSrcweir namespace drawinglayer 45cdf0e10cSrcweir { 46cdf0e10cSrcweir namespace primitive2d 47cdf0e10cSrcweir { impGetShadow3D(const geometry::ViewInformation2D &) const48cdf0e10cSrcweir bool Embedded3DPrimitive2D::impGetShadow3D(const geometry::ViewInformation2D& /*rViewInformation*/) const 49cdf0e10cSrcweir { 50cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex ); 51cdf0e10cSrcweir 52cdf0e10cSrcweir // create on demand 53cdf0e10cSrcweir if(!mbShadow3DChecked && getChildren3D().hasElements()) 54cdf0e10cSrcweir { 55cdf0e10cSrcweir // create shadow extraction processor 56cdf0e10cSrcweir processor3d::Shadow3DExtractingProcessor aShadowProcessor( 57cdf0e10cSrcweir getViewInformation3D(), 58cdf0e10cSrcweir getObjectTransformation(), 59cdf0e10cSrcweir getLightNormal(), 60cdf0e10cSrcweir getShadowSlant(), 61cdf0e10cSrcweir getScene3DRange()); 62cdf0e10cSrcweir 63cdf0e10cSrcweir // process local primitives 64cdf0e10cSrcweir aShadowProcessor.process(getChildren3D()); 65cdf0e10cSrcweir 66cdf0e10cSrcweir // fetch result and set checked flag 67cdf0e10cSrcweir const_cast< Embedded3DPrimitive2D* >(this)->maShadowPrimitives = aShadowProcessor.getPrimitive2DSequence(); 68cdf0e10cSrcweir const_cast< Embedded3DPrimitive2D* >(this)->mbShadow3DChecked = true; 69cdf0e10cSrcweir } 70cdf0e10cSrcweir 71cdf0e10cSrcweir // return if there are shadow primitives 72cdf0e10cSrcweir return maShadowPrimitives.hasElements(); 73cdf0e10cSrcweir } 74cdf0e10cSrcweir create2DDecomposition(const geometry::ViewInformation2D & rViewInformation) const75cdf0e10cSrcweir Primitive2DSequence Embedded3DPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const 76cdf0e10cSrcweir { 77cdf0e10cSrcweir // use info to create a yellow 2d rectangle, similar to empty 3d scenes and/or groups 78cdf0e10cSrcweir const basegfx::B2DRange aLocal2DRange(getB2DRange(rViewInformation)); 79cdf0e10cSrcweir const basegfx::B2DPolygon aOutline(basegfx::tools::createPolygonFromRect(aLocal2DRange)); 80cdf0e10cSrcweir const basegfx::BColor aYellow(1.0, 1.0, 0.0); 81cdf0e10cSrcweir const Primitive2DReference xRef(new PolygonHairlinePrimitive2D(aOutline, aYellow)); 82cdf0e10cSrcweir 83cdf0e10cSrcweir return Primitive2DSequence(&xRef, 1L); 84cdf0e10cSrcweir } 85cdf0e10cSrcweir Embedded3DPrimitive2D(const primitive3d::Primitive3DSequence & rxChildren3D,const basegfx::B2DHomMatrix & rObjectTransformation,const geometry::ViewInformation3D & rViewInformation3D,const basegfx::B3DVector & rLightNormal,double fShadowSlant,const basegfx::B3DRange & rScene3DRange)86cdf0e10cSrcweir Embedded3DPrimitive2D::Embedded3DPrimitive2D( 87cdf0e10cSrcweir const primitive3d::Primitive3DSequence& rxChildren3D, 88cdf0e10cSrcweir const basegfx::B2DHomMatrix& rObjectTransformation, 89cdf0e10cSrcweir const geometry::ViewInformation3D& rViewInformation3D, 90cdf0e10cSrcweir const basegfx::B3DVector& rLightNormal, 91cdf0e10cSrcweir double fShadowSlant, 92cdf0e10cSrcweir const basegfx::B3DRange& rScene3DRange) 93cdf0e10cSrcweir : BufferedDecompositionPrimitive2D(), 94cdf0e10cSrcweir mxChildren3D(rxChildren3D), 95cdf0e10cSrcweir maObjectTransformation(rObjectTransformation), 96cdf0e10cSrcweir maViewInformation3D(rViewInformation3D), 97cdf0e10cSrcweir maLightNormal(rLightNormal), 98cdf0e10cSrcweir mfShadowSlant(fShadowSlant), 99cdf0e10cSrcweir maScene3DRange(rScene3DRange), 100cdf0e10cSrcweir maShadowPrimitives(), 101cdf0e10cSrcweir maB2DRange(), 102cdf0e10cSrcweir mbShadow3DChecked(false) 103cdf0e10cSrcweir { 104cdf0e10cSrcweir maLightNormal.normalize(); 105cdf0e10cSrcweir } 106cdf0e10cSrcweir operator ==(const BasePrimitive2D & rPrimitive) const107cdf0e10cSrcweir bool Embedded3DPrimitive2D::operator==(const BasePrimitive2D& rPrimitive) const 108cdf0e10cSrcweir { 109cdf0e10cSrcweir if(BufferedDecompositionPrimitive2D::operator==(rPrimitive)) 110cdf0e10cSrcweir { 111cdf0e10cSrcweir const Embedded3DPrimitive2D& rCompare = static_cast< const Embedded3DPrimitive2D& >(rPrimitive); 112cdf0e10cSrcweir 113cdf0e10cSrcweir return (primitive3d::arePrimitive3DSequencesEqual(getChildren3D(), rCompare.getChildren3D()) 114cdf0e10cSrcweir && getObjectTransformation() == rCompare.getObjectTransformation() 115cdf0e10cSrcweir && getViewInformation3D() == rCompare.getViewInformation3D() 116cdf0e10cSrcweir && getLightNormal() == rCompare.getLightNormal() 117cdf0e10cSrcweir && getShadowSlant() == rCompare.getShadowSlant() 118cdf0e10cSrcweir && getScene3DRange() == rCompare.getScene3DRange()); 119cdf0e10cSrcweir } 120cdf0e10cSrcweir 121cdf0e10cSrcweir return false; 122cdf0e10cSrcweir } 123cdf0e10cSrcweir getB2DRange(const geometry::ViewInformation2D & rViewInformation) const124cdf0e10cSrcweir basegfx::B2DRange Embedded3DPrimitive2D::getB2DRange(const geometry::ViewInformation2D& rViewInformation) const 125cdf0e10cSrcweir { 126cdf0e10cSrcweir if(maB2DRange.isEmpty()) 127cdf0e10cSrcweir { 128cdf0e10cSrcweir // use the 3d transformation stack to create a projection of the 3D range 129cdf0e10cSrcweir basegfx::B3DRange a3DRange(primitive3d::getB3DRangeFromPrimitive3DSequence(getChildren3D(), getViewInformation3D())); 130cdf0e10cSrcweir a3DRange.transform(getViewInformation3D().getObjectToView()); 131cdf0e10cSrcweir 132cdf0e10cSrcweir // create 2d range from projected 3d and transform with scene's object transformation 133cdf0e10cSrcweir basegfx::B2DRange aNewRange; 134cdf0e10cSrcweir aNewRange.expand(basegfx::B2DPoint(a3DRange.getMinX(), a3DRange.getMinY())); 135cdf0e10cSrcweir aNewRange.expand(basegfx::B2DPoint(a3DRange.getMaxX(), a3DRange.getMaxY())); 136cdf0e10cSrcweir aNewRange.transform(getObjectTransformation()); 137cdf0e10cSrcweir 138cdf0e10cSrcweir // cehck for 3D shadows and their 2D projections. If those exist, they need to be 139cdf0e10cSrcweir // taken into account 140cdf0e10cSrcweir if(impGetShadow3D(rViewInformation)) 141cdf0e10cSrcweir { 142cdf0e10cSrcweir const basegfx::B2DRange aShadow2DRange(getB2DRangeFromPrimitive2DSequence(maShadowPrimitives, rViewInformation)); 143cdf0e10cSrcweir 144cdf0e10cSrcweir if(!aShadow2DRange.isEmpty()) 145cdf0e10cSrcweir { 146cdf0e10cSrcweir aNewRange.expand(aShadow2DRange); 147cdf0e10cSrcweir } 148cdf0e10cSrcweir } 149cdf0e10cSrcweir 150cdf0e10cSrcweir // assign to buffered value 151cdf0e10cSrcweir const_cast< Embedded3DPrimitive2D* >(this)->maB2DRange = aNewRange; 152cdf0e10cSrcweir } 153cdf0e10cSrcweir 154cdf0e10cSrcweir return maB2DRange; 155cdf0e10cSrcweir } 156cdf0e10cSrcweir 157cdf0e10cSrcweir // provide unique ID 158cdf0e10cSrcweir ImplPrimitrive2DIDBlock(Embedded3DPrimitive2D, PRIMITIVE2D_ID_EMBEDDED3DPRIMITIVE2D) 159cdf0e10cSrcweir 160cdf0e10cSrcweir } // end of namespace primitive2d 161cdf0e10cSrcweir } // end of namespace drawinglayer 162cdf0e10cSrcweir 163cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 164cdf0e10cSrcweir // eof 165