xref: /AOO41X/main/svx/source/sdr/primitive3d/sdrattributecreator3d.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir #include <svx/sdr/primitive3d/sdrattributecreator3d.hxx>
29*cdf0e10cSrcweir #include <svx/svx3ditems.hxx>
30*cdf0e10cSrcweir #include <svl/itemset.hxx>
31*cdf0e10cSrcweir #include <com/sun/star/drawing/NormalsKind.hpp>
32*cdf0e10cSrcweir #include <com/sun/star/drawing/TextureProjectionMode.hpp>
33*cdf0e10cSrcweir #include <com/sun/star/drawing/TextureKind2.hpp>
34*cdf0e10cSrcweir #include <com/sun/star/drawing/TextureMode.hpp>
35*cdf0e10cSrcweir #include <svx/xflclit.hxx>
36*cdf0e10cSrcweir #include <drawinglayer/attribute/materialattribute3d.hxx>
37*cdf0e10cSrcweir #include <drawinglayer/attribute/sdrobjectattribute3d.hxx>
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
40*cdf0e10cSrcweir 
41*cdf0e10cSrcweir namespace drawinglayer
42*cdf0e10cSrcweir {
43*cdf0e10cSrcweir 	namespace primitive2d
44*cdf0e10cSrcweir 	{
45*cdf0e10cSrcweir 		attribute::Sdr3DObjectAttribute* createNewSdr3DObjectAttribute(const SfxItemSet& rSet)
46*cdf0e10cSrcweir 		{
47*cdf0e10cSrcweir 			// get NormalsKind
48*cdf0e10cSrcweir 			::com::sun::star::drawing::NormalsKind aNormalsKind(::com::sun::star::drawing::NormalsKind_SPECIFIC);
49*cdf0e10cSrcweir 			const sal_uInt16 nNormalsValue(((const Svx3DNormalsKindItem&)rSet.Get(SDRATTR_3DOBJ_NORMALS_KIND)).GetValue());
50*cdf0e10cSrcweir 
51*cdf0e10cSrcweir 			if(1L == nNormalsValue)
52*cdf0e10cSrcweir 			{
53*cdf0e10cSrcweir 				aNormalsKind = ::com::sun::star::drawing::NormalsKind_FLAT;
54*cdf0e10cSrcweir 			}
55*cdf0e10cSrcweir 			else if(2L == nNormalsValue)
56*cdf0e10cSrcweir 			{
57*cdf0e10cSrcweir 				aNormalsKind = ::com::sun::star::drawing::NormalsKind_SPHERE;
58*cdf0e10cSrcweir 			}
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir 			// get NoermalsInvert flag
61*cdf0e10cSrcweir 			const bool bInvertNormals(((const Svx3DNormalsInvertItem&)rSet.Get(SDRATTR_3DOBJ_NORMALS_INVERT)).GetValue());
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir 			// get TextureProjectionX
64*cdf0e10cSrcweir 			::com::sun::star::drawing::TextureProjectionMode aTextureProjectionX(::com::sun::star::drawing::TextureProjectionMode_OBJECTSPECIFIC);
65*cdf0e10cSrcweir 			const sal_uInt16 nTextureValueX(((const Svx3DTextureProjectionXItem&)rSet.Get(SDRATTR_3DOBJ_TEXTURE_PROJ_X)).GetValue());
66*cdf0e10cSrcweir 
67*cdf0e10cSrcweir 			if(1L == nTextureValueX)
68*cdf0e10cSrcweir 			{
69*cdf0e10cSrcweir 				aTextureProjectionX = ::com::sun::star::drawing::TextureProjectionMode_PARALLEL;
70*cdf0e10cSrcweir 			}
71*cdf0e10cSrcweir 			else if(2L == nTextureValueX)
72*cdf0e10cSrcweir 			{
73*cdf0e10cSrcweir 				aTextureProjectionX = ::com::sun::star::drawing::TextureProjectionMode_SPHERE;
74*cdf0e10cSrcweir 			}
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir 			// get TextureProjectionY
77*cdf0e10cSrcweir 			::com::sun::star::drawing::TextureProjectionMode aTextureProjectionY(::com::sun::star::drawing::TextureProjectionMode_OBJECTSPECIFIC);
78*cdf0e10cSrcweir 			const sal_uInt16 nTextureValueY(((const Svx3DTextureProjectionYItem&)rSet.Get(SDRATTR_3DOBJ_TEXTURE_PROJ_Y)).GetValue());
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir 			if(1L == nTextureValueY)
81*cdf0e10cSrcweir 			{
82*cdf0e10cSrcweir 				aTextureProjectionY = ::com::sun::star::drawing::TextureProjectionMode_PARALLEL;
83*cdf0e10cSrcweir 			}
84*cdf0e10cSrcweir 			else if(2L == nTextureValueY)
85*cdf0e10cSrcweir 			{
86*cdf0e10cSrcweir 				aTextureProjectionY = ::com::sun::star::drawing::TextureProjectionMode_SPHERE;
87*cdf0e10cSrcweir 			}
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir 			// get DoubleSided flag
90*cdf0e10cSrcweir 			const bool bDoubleSided(((const Svx3DDoubleSidedItem&)rSet.Get(SDRATTR_3DOBJ_DOUBLE_SIDED)).GetValue());
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir 			// get Shadow3D flag
93*cdf0e10cSrcweir 			const bool bShadow3D(((const Svx3DShadow3DItem&)rSet.Get(SDRATTR_3DOBJ_SHADOW_3D)).GetValue());
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir 			// get TextureFilter flag
96*cdf0e10cSrcweir 			const bool bTextureFilter(((const Svx3DTextureFilterItem&)rSet.Get(SDRATTR_3DOBJ_TEXTURE_FILTER)).GetValue());
97*cdf0e10cSrcweir 
98*cdf0e10cSrcweir 			// get texture kind
99*cdf0e10cSrcweir 			// TextureKind: 1 == Base3DTextureLuminance, 2 == Base3DTextureIntensity, 3 == Base3DTextureColor
100*cdf0e10cSrcweir 			::com::sun::star::drawing::TextureKind2 aTextureKind(::com::sun::star::drawing::TextureKind2_LUMINANCE);
101*cdf0e10cSrcweir 			const sal_uInt16 nTextureKind(((const Svx3DTextureKindItem&)rSet.Get(SDRATTR_3DOBJ_TEXTURE_KIND)).GetValue());
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir 			if(2 == nTextureKind)
104*cdf0e10cSrcweir 			{
105*cdf0e10cSrcweir 				aTextureKind = ::com::sun::star::drawing::TextureKind2_INTENSITY;
106*cdf0e10cSrcweir 			}
107*cdf0e10cSrcweir 			else if(3 == nTextureKind)
108*cdf0e10cSrcweir 			{
109*cdf0e10cSrcweir 				aTextureKind = ::com::sun::star::drawing::TextureKind2_COLOR;
110*cdf0e10cSrcweir 			}
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir 			// get texture mode
113*cdf0e10cSrcweir 			// TextureMode: 1 == Base3DTextureReplace, 2 == Base3DTextureModulate, 3 == Base3DTextureBlend
114*cdf0e10cSrcweir 			::com::sun::star::drawing::TextureMode aTextureMode(::com::sun::star::drawing::TextureMode_REPLACE);
115*cdf0e10cSrcweir 			const sal_uInt16 nTextureMode(((const Svx3DTextureModeItem&)rSet.Get(SDRATTR_3DOBJ_TEXTURE_MODE)).GetValue());
116*cdf0e10cSrcweir 
117*cdf0e10cSrcweir 			if(2 == nTextureMode)
118*cdf0e10cSrcweir 			{
119*cdf0e10cSrcweir 				aTextureMode = ::com::sun::star::drawing::TextureMode_MODULATE;
120*cdf0e10cSrcweir 			}
121*cdf0e10cSrcweir 			else if(3 == nTextureMode)
122*cdf0e10cSrcweir 			{
123*cdf0e10cSrcweir 				aTextureMode = ::com::sun::star::drawing::TextureMode_BLEND;
124*cdf0e10cSrcweir 			}
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir 			// get object color
127*cdf0e10cSrcweir 			const ::basegfx::BColor aObjectColor(((const XFillColorItem&)rSet.Get(XATTR_FILLCOLOR)).GetColorValue().getBColor());
128*cdf0e10cSrcweir 
129*cdf0e10cSrcweir 			// get specular color
130*cdf0e10cSrcweir 			const ::basegfx::BColor aSpecular(((const Svx3DMaterialSpecularItem&)rSet.Get(SDRATTR_3DOBJ_MAT_SPECULAR)).GetValue().getBColor());
131*cdf0e10cSrcweir 
132*cdf0e10cSrcweir 			// get emissive color
133*cdf0e10cSrcweir 			const ::basegfx::BColor aEmission(((const Svx3DMaterialEmissionItem&)rSet.Get(SDRATTR_3DOBJ_MAT_EMISSION)).GetValue().getBColor());
134*cdf0e10cSrcweir 
135*cdf0e10cSrcweir 			// get specular intensity
136*cdf0e10cSrcweir 			sal_uInt16 nSpecularIntensity(((const Svx3DMaterialSpecularIntensityItem&)rSet.Get(SDRATTR_3DOBJ_MAT_SPECULAR_INTENSITY)).GetValue());
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir 			if(nSpecularIntensity > 128)
139*cdf0e10cSrcweir 			{
140*cdf0e10cSrcweir 				nSpecularIntensity = 128;
141*cdf0e10cSrcweir 			}
142*cdf0e10cSrcweir 
143*cdf0e10cSrcweir 			// get reduced line geometry
144*cdf0e10cSrcweir 			const bool bReducedLineGeometry(((const Svx3DReducedLineGeometryItem&)rSet.Get(SDRATTR_3DOBJ_REDUCED_LINE_GEOMETRY)).GetValue());
145*cdf0e10cSrcweir 
146*cdf0e10cSrcweir 			// prepare material
147*cdf0e10cSrcweir 			attribute::MaterialAttribute3D aMaterial(aObjectColor, aSpecular, aEmission, nSpecularIntensity);
148*cdf0e10cSrcweir 
149*cdf0e10cSrcweir 			return new attribute::Sdr3DObjectAttribute(
150*cdf0e10cSrcweir 				aNormalsKind, aTextureProjectionX, aTextureProjectionY,
151*cdf0e10cSrcweir 				aTextureKind, aTextureMode, aMaterial,
152*cdf0e10cSrcweir 				bInvertNormals, bDoubleSided, bShadow3D, bTextureFilter, bReducedLineGeometry);
153*cdf0e10cSrcweir 		}
154*cdf0e10cSrcweir 	} // end of namespace primitive2d
155*cdf0e10cSrcweir } // end of namespace sdr
156*cdf0e10cSrcweir 
157*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
158*cdf0e10cSrcweir // eof
159