1*f6e50924SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*f6e50924SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*f6e50924SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*f6e50924SAndrew Rist * distributed with this work for additional information 6*f6e50924SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*f6e50924SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*f6e50924SAndrew Rist * "License"); you may not use this file except in compliance 9*f6e50924SAndrew Rist * with the License. You may obtain a copy of the License at 10*f6e50924SAndrew Rist * 11*f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*f6e50924SAndrew Rist * 13*f6e50924SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*f6e50924SAndrew Rist * software distributed under the License is distributed on an 15*f6e50924SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*f6e50924SAndrew Rist * KIND, either express or implied. See the License for the 17*f6e50924SAndrew Rist * specific language governing permissions and limitations 18*f6e50924SAndrew Rist * under the License. 19*f6e50924SAndrew Rist * 20*f6e50924SAndrew Rist *************************************************************/ 21*f6e50924SAndrew Rist 22*f6e50924SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_svx.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <svx/sdr/contact/viewcontactofe3dlathe.hxx> 28cdf0e10cSrcweir #include <svx/lathe3d.hxx> 29cdf0e10cSrcweir #include <drawinglayer/primitive3d/sdrlatheprimitive3d.hxx> 30cdf0e10cSrcweir #include <svx/sdr/primitive2d/sdrattributecreator.hxx> 31cdf0e10cSrcweir #include <svx/sdr/primitive3d/sdrattributecreator3d.hxx> 32cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygontools.hxx> 33cdf0e10cSrcweir 34cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 35cdf0e10cSrcweir 36cdf0e10cSrcweir namespace sdr 37cdf0e10cSrcweir { 38cdf0e10cSrcweir namespace contact 39cdf0e10cSrcweir { ViewContactOfE3dLathe(E3dLatheObj & rLathe)40cdf0e10cSrcweir ViewContactOfE3dLathe::ViewContactOfE3dLathe(E3dLatheObj& rLathe) 41cdf0e10cSrcweir : ViewContactOfE3d(rLathe) 42cdf0e10cSrcweir { 43cdf0e10cSrcweir } 44cdf0e10cSrcweir ~ViewContactOfE3dLathe()45cdf0e10cSrcweir ViewContactOfE3dLathe::~ViewContactOfE3dLathe() 46cdf0e10cSrcweir { 47cdf0e10cSrcweir } 48cdf0e10cSrcweir createViewIndependentPrimitive3DSequence() const49cdf0e10cSrcweir drawinglayer::primitive3d::Primitive3DSequence ViewContactOfE3dLathe::createViewIndependentPrimitive3DSequence() const 50cdf0e10cSrcweir { 51cdf0e10cSrcweir drawinglayer::primitive3d::Primitive3DSequence xRetval; 52cdf0e10cSrcweir const SfxItemSet& rItemSet = GetE3dLatheObj().GetMergedItemSet(); 53cdf0e10cSrcweir const drawinglayer::attribute::SdrLineFillShadowAttribute3D aAttribute( 54cdf0e10cSrcweir drawinglayer::primitive2d::createNewSdrLineFillShadowAttribute(rItemSet, false)); 55cdf0e10cSrcweir 56cdf0e10cSrcweir // get extrude geometry 57cdf0e10cSrcweir const basegfx::B2DPolyPolygon aPolyPolygon(GetE3dLatheObj().GetPolyPoly2D()); 58cdf0e10cSrcweir 59cdf0e10cSrcweir // get 3D Object Attributes 60cdf0e10cSrcweir drawinglayer::attribute::Sdr3DObjectAttribute* pSdr3DObjectAttribute = drawinglayer::primitive2d::createNewSdr3DObjectAttribute(rItemSet); 61cdf0e10cSrcweir 62cdf0e10cSrcweir // calculate texture size. Use the polygon length of the longest polygon for 63cdf0e10cSrcweir // height and the rotated radius for width (using polygon center) to get a good 64cdf0e10cSrcweir // texture mapping 65cdf0e10cSrcweir const sal_uInt32 nPolygonCount(aPolyPolygon.count()); 66cdf0e10cSrcweir double fPolygonMaxLength(0.0); 67cdf0e10cSrcweir 68cdf0e10cSrcweir for(sal_uInt32 a(0); a < nPolygonCount; a++) 69cdf0e10cSrcweir { 70cdf0e10cSrcweir const basegfx::B2DPolygon aCandidate(aPolyPolygon.getB2DPolygon(a)); 71cdf0e10cSrcweir const double fPolygonLength(basegfx::tools::getLength(aCandidate)); 72cdf0e10cSrcweir fPolygonMaxLength = std::max(fPolygonMaxLength, fPolygonLength); 73cdf0e10cSrcweir } 74cdf0e10cSrcweir 75cdf0e10cSrcweir const basegfx::B2DRange aPolyPolygonRange(basegfx::tools::getRange(aPolyPolygon)); 76cdf0e10cSrcweir const basegfx::B2DVector aTextureSize( 77cdf0e10cSrcweir F_PI * fabs(aPolyPolygonRange.getCenter().getX()), // PI * d 78cdf0e10cSrcweir fPolygonMaxLength); 79cdf0e10cSrcweir 80cdf0e10cSrcweir // get more data 81cdf0e10cSrcweir const sal_uInt32 nHorizontalSegments(GetE3dLatheObj().GetHorizontalSegments()); 82cdf0e10cSrcweir const sal_uInt32 nVerticalSegments(GetE3dLatheObj().GetVerticalSegments()); 83cdf0e10cSrcweir const double fDiagonal((double)GetE3dLatheObj().GetPercentDiagonal() / 100.0); 84cdf0e10cSrcweir const double fBackScale((double)GetE3dLatheObj().GetBackScale() / 100.0); 85cdf0e10cSrcweir const double fRotation(((double)GetE3dLatheObj().GetEndAngle() / 1800.0) * F_PI); 86cdf0e10cSrcweir const bool bSmoothNormals(GetE3dLatheObj().GetSmoothNormals()); // Plane itself 87cdf0e10cSrcweir const bool bSmoothLids(GetE3dLatheObj().GetSmoothLids()); // Front/back 88cdf0e10cSrcweir const bool bCharacterMode(GetE3dLatheObj().GetCharacterMode()); 89cdf0e10cSrcweir const bool bCloseFront(GetE3dLatheObj().GetCloseFront()); 90cdf0e10cSrcweir const bool bCloseBack(GetE3dLatheObj().GetCloseBack()); 91cdf0e10cSrcweir 92cdf0e10cSrcweir // create primitive and add 93cdf0e10cSrcweir const basegfx::B3DHomMatrix aWorldTransform; 94cdf0e10cSrcweir const drawinglayer::primitive3d::Primitive3DReference xReference( 95cdf0e10cSrcweir new drawinglayer::primitive3d::SdrLathePrimitive3D( 96cdf0e10cSrcweir aWorldTransform, aTextureSize, aAttribute, *pSdr3DObjectAttribute, 97cdf0e10cSrcweir aPolyPolygon, nHorizontalSegments, nVerticalSegments, 98cdf0e10cSrcweir fDiagonal, fBackScale, fRotation, 99cdf0e10cSrcweir bSmoothNormals, true, bSmoothLids, bCharacterMode, bCloseFront, bCloseBack)); 100cdf0e10cSrcweir xRetval = drawinglayer::primitive3d::Primitive3DSequence(&xReference, 1); 101cdf0e10cSrcweir 102cdf0e10cSrcweir // delete 3D Object Attributes 103cdf0e10cSrcweir delete pSdr3DObjectAttribute; 104cdf0e10cSrcweir 105cdf0e10cSrcweir return xRetval; 106cdf0e10cSrcweir } 107cdf0e10cSrcweir } // end of namespace contact 108cdf0e10cSrcweir } // end of namespace sdr 109cdf0e10cSrcweir 110cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////// 111cdf0e10cSrcweir // eof 112