summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRĂ¼diger Timm <rt@openoffice.org>2009-02-23 07:59:24 +0000
committerRĂ¼diger Timm <rt@openoffice.org>2009-02-23 07:59:24 +0000
commitfd96a21876dd23ea3d55ef993eb4cc6e8eef4d91 (patch)
tree814e37820ce9660259d2ac011a35ef98364cda19
parent6dd5fa4a48346ea9b7ff330204feb4f9817dca80 (diff)
CWS-TOOLING: integrate CWS aw064_OOO310
2009-02-10 17:39:02 +0100 aw r267569 : #i98314# adapted texture size to object size 2009-02-05 15:26:16 +0100 aw r267427 : #i98532# added mirroring of redline info when RTL is on 2009-02-04 16:31:27 +0100 aw r267392 : #i98314# corrected texturing for E3dPolygonObj's primitive creation 2009-02-02 17:58:49 +0100 aw r267285 : #i98295# corrected orientation of E3dPolygonObj's polygon definition on it's way to prmitives 2009-02-02 17:57:32 +0100 aw r267283 : #i98295# optimized SdrPolyPolygonPrimitive3D::createLocalDecomposition data flow
-rw-r--r--drawinglayer/inc/drawinglayer/primitive3d/sdrdecompositiontools3d.hxx15
-rw-r--r--drawinglayer/source/primitive3d/sdrdecompositiontools3d.cxx87
-rw-r--r--drawinglayer/source/primitive3d/sdrextrudeprimitive3d.cxx75
-rw-r--r--drawinglayer/source/primitive3d/sdrlatheprimitive3d.cxx75
-rw-r--r--drawinglayer/source/primitive3d/sdrpolypolygonprimitive3d.cxx32
-rw-r--r--drawinglayer/source/processor3d/defaultprocessor3d.cxx83
-rw-r--r--svx/inc/svx/sdr/overlay/overlaymanager.hxx2
-rw-r--r--svx/source/sdr/contact/viewcontactofe3dpolygon.cxx53
-rw-r--r--svx/source/sdr/overlay/overlaymanager.cxx2
-rw-r--r--svx/source/svdraw/svdotextdecomposition.cxx11
10 files changed, 263 insertions, 172 deletions
diff --git a/drawinglayer/inc/drawinglayer/primitive3d/sdrdecompositiontools3d.hxx b/drawinglayer/inc/drawinglayer/primitive3d/sdrdecompositiontools3d.hxx
index 9e3ac6e3aa..22bc7db0bf 100644
--- a/drawinglayer/inc/drawinglayer/primitive3d/sdrdecompositiontools3d.hxx
+++ b/drawinglayer/inc/drawinglayer/primitive3d/sdrdecompositiontools3d.hxx
@@ -37,6 +37,7 @@
#define INCLUDED_DRAWINGLAYER_PRIMITIVE3D_SDRDECOMPOSITIONTOOLS3D_HXX
#include <drawinglayer/primitive3d/baseprimitive3d.hxx>
+#include <com/sun/star/drawing/TextureProjectionMode.hpp>
#include <vector>
//////////////////////////////////////////////////////////////////////////////
@@ -62,6 +63,20 @@ namespace drawinglayer
{
namespace primitive3d
{
+ // #i98295#
+ basegfx::B3DRange getRangeFrom3DGeometry(::std::vector< basegfx::B3DPolyPolygon >& rFill);
+ void applyNormalsKindSphereTo3DGeometry(::std::vector< basegfx::B3DPolyPolygon >& rFill, const basegfx::B3DRange& rRange);
+ void applyNormalsKindFlatTo3DGeometry(::std::vector< basegfx::B3DPolyPolygon >& rFill);
+ void applyNormalsInvertTo3DGeometry(::std::vector< basegfx::B3DPolyPolygon >& rFill);
+
+ // #i98314#
+ void applyTextureTo3DGeometry(
+ ::com::sun::star::drawing::TextureProjectionMode eModeX,
+ ::com::sun::star::drawing::TextureProjectionMode eModeY,
+ ::std::vector< basegfx::B3DPolyPolygon >& rFill,
+ const basegfx::B3DRange& rRange,
+ const basegfx::B2DVector& rTextureSize);
+
Primitive3DSequence create3DPolyPolygonLinePrimitives(
const basegfx::B3DPolyPolygon& rUnitPolyPolygon,
const basegfx::B3DHomMatrix& rObjectTransform,
diff --git a/drawinglayer/source/primitive3d/sdrdecompositiontools3d.cxx b/drawinglayer/source/primitive3d/sdrdecompositiontools3d.cxx
index 7eb1d0548f..df15cc8a3c 100644
--- a/drawinglayer/source/primitive3d/sdrdecompositiontools3d.cxx
+++ b/drawinglayer/source/primitive3d/sdrdecompositiontools3d.cxx
@@ -64,6 +64,93 @@ namespace drawinglayer
{
namespace primitive3d
{
+ basegfx::B3DRange getRangeFrom3DGeometry(::std::vector< basegfx::B3DPolyPolygon >& rFill)
+ {
+ basegfx::B3DRange aRetval;
+
+ for(sal_uInt32 a(0); a < rFill.size(); a++)
+ {
+ aRetval.expand(basegfx::tools::getRange(rFill[a]));
+ }
+
+ return aRetval;
+ }
+
+ void applyNormalsKindSphereTo3DGeometry(::std::vector< basegfx::B3DPolyPolygon >& rFill, const basegfx::B3DRange& rRange)
+ {
+ // create sphere normals
+ const basegfx::B3DPoint aCenter(rRange.getCenter());
+
+ for(sal_uInt32 a(0); a < rFill.size(); a++)
+ {
+ rFill[a] = basegfx::tools::applyDefaultNormalsSphere(rFill[a], aCenter);
+ }
+ }
+
+ void applyNormalsKindFlatTo3DGeometry(::std::vector< basegfx::B3DPolyPolygon >& rFill)
+ {
+ for(sal_uInt32 a(0); a < rFill.size(); a++)
+ {
+ rFill[a].clearNormals();
+ }
+ }
+
+ void applyNormalsInvertTo3DGeometry(::std::vector< basegfx::B3DPolyPolygon >& rFill)
+ {
+ // invert normals
+ for(sal_uInt32 a(0); a < rFill.size(); a++)
+ {
+ rFill[a] = basegfx::tools::invertNormals(rFill[a]);
+ }
+ }
+
+ void applyTextureTo3DGeometry(
+ ::com::sun::star::drawing::TextureProjectionMode eModeX,
+ ::com::sun::star::drawing::TextureProjectionMode eModeY,
+ ::std::vector< basegfx::B3DPolyPolygon >& rFill,
+ const basegfx::B3DRange& rRange,
+ const basegfx::B2DVector& rTextureSize)
+ {
+ sal_uInt32 a;
+
+ // handle texture coordinates X
+ const bool bParallelX(::com::sun::star::drawing::TextureProjectionMode_PARALLEL == eModeX);
+ const bool bSphereX(!bParallelX && (::com::sun::star::drawing::TextureProjectionMode_SPHERE == eModeX));
+
+ // handle texture coordinates Y
+ const bool bParallelY(::com::sun::star::drawing::TextureProjectionMode_PARALLEL == eModeY);
+ const bool bSphereY(!bParallelY && (::com::sun::star::drawing::TextureProjectionMode_SPHERE == eModeY));
+
+ if(bParallelX || bParallelY)
+ {
+ // apply parallel texture coordinates in X and/or Y
+ for(a = 0; a < rFill.size(); a++)
+ {
+ rFill[a] = basegfx::tools::applyDefaultTextureCoordinatesParallel(rFill[a], rRange, bParallelX, bParallelY);
+ }
+ }
+
+ if(bSphereX || bSphereY)
+ {
+ // apply spherical texture coordinates in X and/or Y
+ const basegfx::B3DPoint aCenter(rRange.getCenter());
+
+ for(a = 0; a < rFill.size(); a++)
+ {
+ rFill[a] = basegfx::tools::applyDefaultTextureCoordinatesSphere(rFill[a], aCenter, bSphereX, bSphereY);
+ }
+ }
+
+ // transform texture coordinates to texture size
+ basegfx::B2DHomMatrix aTexMatrix;
+ aTexMatrix.scale(rTextureSize.getX(), rTextureSize.getY());
+
+ for(a = 0; a < rFill.size(); a++)
+ {
+ rFill[a].transformTextureCoordiantes(aTexMatrix);
+ }
+ }
+
Primitive3DSequence create3DPolyPolygonLinePrimitives(
const basegfx::B3DPolyPolygon& rUnitPolyPolygon,
const basegfx::B3DHomMatrix& rObjectTransform,
diff --git a/drawinglayer/source/primitive3d/sdrextrudeprimitive3d.cxx b/drawinglayer/source/primitive3d/sdrextrudeprimitive3d.cxx
index 03e2d8566f..b3e21fc793 100644
--- a/drawinglayer/source/primitive3d/sdrextrudeprimitive3d.cxx
+++ b/drawinglayer/source/primitive3d/sdrextrudeprimitive3d.cxx
@@ -67,10 +67,10 @@ namespace drawinglayer
if(rSliceVector.size())
{
sal_uInt32 a;
- basegfx::B3DRange aRange;
// decide what to create
- const bool bCreateNormals(::com::sun::star::drawing::NormalsKind_SPECIFIC == getSdr3DObjectAttribute().getNormalsKind());
+ const ::com::sun::star::drawing::NormalsKind eNormalsKind(getSdr3DObjectAttribute().getNormalsKind());
+ const bool bCreateNormals(::com::sun::star::drawing::NormalsKind_SPECIFIC == eNormalsKind);
const bool bCreateTextureCoordiantesX(::com::sun::star::drawing::TextureProjectionMode_OBJECTSPECIFIC == getSdr3DObjectAttribute().getTextureProjectionX());
const bool bCreateTextureCoordiantesY(::com::sun::star::drawing::TextureProjectionMode_OBJECTSPECIFIC == getSdr3DObjectAttribute().getTextureProjectionY());
double fRelativeTextureWidth(1.0);
@@ -103,82 +103,35 @@ namespace drawinglayer
0.5, 0.6, bCreateTextureCoordiantesX || bCreateTextureCoordiantesY, aTexTransform);
// get full range
- for(a = 0L; a < aFill.size(); a++)
- {
- aRange.expand(basegfx::tools::getRange(aFill[a]));
- }
+ const basegfx::B3DRange aRange(getRangeFrom3DGeometry(aFill));
// normal creation
if(getSdrLFSAttribute().getFill())
{
- if(::com::sun::star::drawing::NormalsKind_SPHERE == getSdr3DObjectAttribute().getNormalsKind())
+ if(::com::sun::star::drawing::NormalsKind_SPHERE == eNormalsKind)
{
- // create sphere normals
- const basegfx::B3DPoint aCenter(aRange.getCenter());
-
- for(a = 0L; a < aFill.size(); a++)
- {
- aFill[a] = basegfx::tools::applyDefaultNormalsSphere(aFill[a], aCenter);
- }
+ applyNormalsKindSphereTo3DGeometry(aFill, aRange);
}
- else if(::com::sun::star::drawing::NormalsKind_FLAT == getSdr3DObjectAttribute().getNormalsKind())
+ else if(::com::sun::star::drawing::NormalsKind_FLAT == eNormalsKind)
{
- for(a = 0L; a < aFill.size(); a++)
- {
- aFill[a].clearNormals();
- }
+ applyNormalsKindFlatTo3DGeometry(aFill);
}
if(getSdr3DObjectAttribute().getNormalsInvert())
{
- // invert normals
- for(a = 0L; a < aFill.size(); a++)
- {
- aFill[a] = basegfx::tools::invertNormals(aFill[a]);
- }
+ applyNormalsInvertTo3DGeometry(aFill);
}
}
// texture coordinates
if(getSdrLFSAttribute().getFill())
{
- // handle texture coordinates X
- const bool bParallelX(::com::sun::star::drawing::TextureProjectionMode_PARALLEL == getSdr3DObjectAttribute().getTextureProjectionX());
- const bool bSphereX(!bParallelX && (::com::sun::star::drawing::TextureProjectionMode_SPHERE == getSdr3DObjectAttribute().getTextureProjectionX()));
-
- // handle texture coordinates Y
- const bool bParallelY(::com::sun::star::drawing::TextureProjectionMode_PARALLEL == getSdr3DObjectAttribute().getTextureProjectionY());
- const bool bSphereY(!bParallelY && (::com::sun::star::drawing::TextureProjectionMode_SPHERE == getSdr3DObjectAttribute().getTextureProjectionY()));
-
- if(bParallelX || bParallelY)
- {
- // apply parallel texture coordinates in X and/or Y
-
- for(a = 0L; a < aFill.size(); a++)
- {
- aFill[a] = basegfx::tools::applyDefaultTextureCoordinatesParallel(aFill[a], aRange, bParallelX, bParallelY);
- }
- }
-
- if(bSphereX || bSphereY)
- {
- // apply spherical texture coordinates in X and/or Y
- const basegfx::B3DPoint aCenter(aRange.getCenter());
-
- for(a = 0L; a < aFill.size(); a++)
- {
- aFill[a] = basegfx::tools::applyDefaultTextureCoordinatesSphere(aFill[a], aCenter, bSphereX, bSphereY);
- }
- }
-
- // transform texture coordinates to texture size
- basegfx::B2DHomMatrix aTexMatrix;
- aTexMatrix.scale(getTextureSize().getX(), getTextureSize().getY());
-
- for(a = 0L; a < aFill.size(); a++)
- {
- aFill[a].transformTextureCoordiantes(aTexMatrix);
- }
+ applyTextureTo3DGeometry(
+ getSdr3DObjectAttribute().getTextureProjectionX(),
+ getSdr3DObjectAttribute().getTextureProjectionY(),
+ aFill,
+ aRange,
+ getTextureSize());
}
if(getSdrLFSAttribute().getFill())
diff --git a/drawinglayer/source/primitive3d/sdrlatheprimitive3d.cxx b/drawinglayer/source/primitive3d/sdrlatheprimitive3d.cxx
index b77e4ee8ec..16db524155 100644
--- a/drawinglayer/source/primitive3d/sdrlatheprimitive3d.cxx
+++ b/drawinglayer/source/primitive3d/sdrlatheprimitive3d.cxx
@@ -69,10 +69,10 @@ namespace drawinglayer
const bool bBackScale(!basegfx::fTools::equal(getBackScale(), 1.0));
const bool bClosedRotation(!bBackScale && getHorizontalSegments() && basegfx::fTools::equal(getRotation(), F_2PI));
sal_uInt32 a;
- basegfx::B3DRange aRange;
// decide what to create
- const bool bCreateNormals(::com::sun::star::drawing::NormalsKind_SPECIFIC == getSdr3DObjectAttribute().getNormalsKind());
+ const ::com::sun::star::drawing::NormalsKind eNormalsKind(getSdr3DObjectAttribute().getNormalsKind());
+ const bool bCreateNormals(::com::sun::star::drawing::NormalsKind_SPECIFIC == eNormalsKind);
const bool bCreateTextureCoordiantesX(::com::sun::star::drawing::TextureProjectionMode_OBJECTSPECIFIC == getSdr3DObjectAttribute().getTextureProjectionX());
const bool bCreateTextureCoordiantesY(::com::sun::star::drawing::TextureProjectionMode_OBJECTSPECIFIC == getSdr3DObjectAttribute().getTextureProjectionY());
basegfx::B2DHomMatrix aTexTransform;
@@ -96,82 +96,35 @@ namespace drawinglayer
0.85, 0.6, bCreateTextureCoordiantesX || bCreateTextureCoordiantesY, aTexTransform);
// get full range
- for(a = 0L; a < aFill.size(); a++)
- {
- aRange.expand(basegfx::tools::getRange(aFill[a]));
- }
+ const basegfx::B3DRange aRange(getRangeFrom3DGeometry(aFill));
// normal creation
if(getSdrLFSAttribute().getFill())
{
- if(::com::sun::star::drawing::NormalsKind_SPHERE == getSdr3DObjectAttribute().getNormalsKind())
+ if(::com::sun::star::drawing::NormalsKind_SPHERE == eNormalsKind)
{
- // create sphere normals
- const basegfx::B3DPoint aCenter(aRange.getCenter());
-
- for(a = 0L; a < aFill.size(); a++)
- {
- aFill[a] = basegfx::tools::applyDefaultNormalsSphere(aFill[a], aCenter);
- }
+ applyNormalsKindSphereTo3DGeometry(aFill, aRange);
}
- else if(::com::sun::star::drawing::NormalsKind_FLAT == getSdr3DObjectAttribute().getNormalsKind())
+ else if(::com::sun::star::drawing::NormalsKind_FLAT == eNormalsKind)
{
- for(a = 0L; a < aFill.size(); a++)
- {
- aFill[a].clearNormals();
- }
+ applyNormalsKindFlatTo3DGeometry(aFill);
}
if(getSdr3DObjectAttribute().getNormalsInvert())
{
- // invert normals
- for(a = 0L; a < aFill.size(); a++)
- {
- aFill[a] = basegfx::tools::invertNormals(aFill[a]);
- }
+ applyNormalsInvertTo3DGeometry(aFill);
}
}
// texture coordinates
if(getSdrLFSAttribute().getFill())
{
- // handle texture coordinates X
- const bool bParallelX(::com::sun::star::drawing::TextureProjectionMode_PARALLEL == getSdr3DObjectAttribute().getTextureProjectionX());
- const bool bSphereX(!bParallelX && (::com::sun::star::drawing::TextureProjectionMode_SPHERE == getSdr3DObjectAttribute().getTextureProjectionX()));
-
- // handle texture coordinates Y
- const bool bParallelY(::com::sun::star::drawing::TextureProjectionMode_PARALLEL == getSdr3DObjectAttribute().getTextureProjectionY());
- const bool bSphereY(!bParallelY && (::com::sun::star::drawing::TextureProjectionMode_SPHERE == getSdr3DObjectAttribute().getTextureProjectionY()));
-
- if(bParallelX || bParallelY)
- {
- // apply parallel texture coordinates in X and/or Y
-
- for(a = 0L; a < aFill.size(); a++)
- {
- aFill[a] = basegfx::tools::applyDefaultTextureCoordinatesParallel(aFill[a], aRange, bParallelX, bParallelY);
- }
- }
-
- if(bSphereX || bSphereY)
- {
- // apply spherical texture coordinates in X and/or Y
- const basegfx::B3DPoint aCenter(aRange.getCenter());
-
- for(a = 0L; a < aFill.size(); a++)
- {
- aFill[a] = basegfx::tools::applyDefaultTextureCoordinatesSphere(aFill[a], aCenter, bSphereX, bSphereY);
- }
- }
-
- // transform texture coordinates to texture size
- basegfx::B2DHomMatrix aTexMatrix;
- aTexMatrix.scale(getTextureSize().getX(), getTextureSize().getY());
-
- for(a = 0L; a < aFill.size(); a++)
- {
- aFill[a].transformTextureCoordiantes(aTexMatrix);
- }
+ applyTextureTo3DGeometry(
+ getSdr3DObjectAttribute().getTextureProjectionX(),
+ getSdr3DObjectAttribute().getTextureProjectionY(),
+ aFill,
+ aRange,
+ getTextureSize());
}
if(getSdrLFSAttribute().getFill())
diff --git a/drawinglayer/source/primitive3d/sdrpolypolygonprimitive3d.cxx b/drawinglayer/source/primitive3d/sdrpolypolygonprimitive3d.cxx
index 6dd85df171..38d9ad54e1 100644
--- a/drawinglayer/source/primitive3d/sdrpolypolygonprimitive3d.cxx
+++ b/drawinglayer/source/primitive3d/sdrpolypolygonprimitive3d.cxx
@@ -62,6 +62,38 @@ namespace drawinglayer
::std::vector< basegfx::B3DPolyPolygon > aFill;
aFill.push_back(getPolyPolygon3D());
+ // get full range
+ const basegfx::B3DRange aRange(getRangeFrom3DGeometry(aFill));
+
+ // #i98295# normal creation
+ if(getSdrLFSAttribute().getFill())
+ {
+ if(::com::sun::star::drawing::NormalsKind_SPHERE == getSdr3DObjectAttribute().getNormalsKind())
+ {
+ applyNormalsKindSphereTo3DGeometry(aFill, aRange);
+ }
+ else if(::com::sun::star::drawing::NormalsKind_FLAT == getSdr3DObjectAttribute().getNormalsKind())
+ {
+ applyNormalsKindFlatTo3DGeometry(aFill);
+ }
+
+ if(getSdr3DObjectAttribute().getNormalsInvert())
+ {
+ applyNormalsInvertTo3DGeometry(aFill);
+ }
+ }
+
+ // #i98314# texture coordinates
+ if(getSdrLFSAttribute().getFill())
+ {
+ applyTextureTo3DGeometry(
+ getSdr3DObjectAttribute().getTextureProjectionX(),
+ getSdr3DObjectAttribute().getTextureProjectionY(),
+ aFill,
+ aRange,
+ getTextureSize());
+ }
+
if(getSdrLFSAttribute().getFill())
{
// add fill
diff --git a/drawinglayer/source/processor3d/defaultprocessor3d.cxx b/drawinglayer/source/processor3d/defaultprocessor3d.cxx
index d0dbfe1dca..33a2e1639f 100644
--- a/drawinglayer/source/processor3d/defaultprocessor3d.cxx
+++ b/drawinglayer/source/processor3d/defaultprocessor3d.cxx
@@ -312,6 +312,11 @@ namespace drawinglayer
basegfx::BColor aObjectColor(rPrimitive.getMaterial().getColor());
bool bPaintIt(aFill.count());
+ // #i98295# get ShadeMode. Correct early when only flat is possible due to missing normals
+ const ::com::sun::star::drawing::ShadeMode aShadeMode(
+ aFill.areNormalsUsed() ?
+ getSdrSceneAttribute().getShadeMode() : ::com::sun::star::drawing::ShadeMode_FLAT);
+
if(bPaintIt)
{
// get rid of texture coordinates if there is no texture
@@ -320,6 +325,13 @@ namespace drawinglayer
aFill.clearTextureCoordinates();
}
+ // #i98295# get rid of normals and color early when not needed
+ if(::com::sun::star::drawing::ShadeMode_FLAT == aShadeMode)
+ {
+ aFill.clearNormals();
+ aFill.clearBColors();
+ }
+
// transform to device coordinates (-1.0 .. 1.0) and check for visibility
aFill.transform(getViewInformation3D().getObjectToView());
const basegfx::B3DRange a3DRange(basegfx::tools::getRange(aFill));
@@ -344,7 +356,6 @@ namespace drawinglayer
if(bPaintIt)
{
// prepare ObjectToEye in NormalTransform
- ::com::sun::star::drawing::ShadeMode aShadeMode(getSdrSceneAttribute().getShadeMode());
basegfx::B3DHomMatrix aNormalTransform(getViewInformation3D().getOrientation() * getViewInformation3D().getObjectTransformation());
if(getSdrSceneAttribute().getTwoSidedLighting())
@@ -360,27 +371,17 @@ namespace drawinglayer
}
}
- if(::com::sun::star::drawing::ShadeMode_PHONG == aShadeMode)
+ switch(aShadeMode)
{
- // phong shading
- if(aFill.areNormalsUsed())
+ case ::com::sun::star::drawing::ShadeMode_PHONG:
{
- // transform normals to eye coor
+ // phong shading. Transform normals to eye coor
aFill.transformNormals(aNormalTransform);
+ break;
}
- else
- {
- // fallback to gouraud when no normals available
- aShadeMode = ::com::sun::star::drawing::ShadeMode_SMOOTH;
- }
- }
-
- if(::com::sun::star::drawing::ShadeMode_SMOOTH == aShadeMode)
- {
- // gouraud shading
- if(aFill.areNormalsUsed())
+ case ::com::sun::star::drawing::ShadeMode_SMOOTH:
{
- // transform normals to eye coor
+ // gouraud shading. Transform normals to eye coor
aFill.transformNormals(aNormalTransform);
// prepare color model parameters, evtl. use blend color
@@ -406,38 +407,30 @@ namespace drawinglayer
aPartFill.clearNormals();
aFill.setB3DPolygon(a, aPartFill);
}
+ break;
}
- else
+ case ::com::sun::star::drawing::ShadeMode_FLAT:
{
- // fallback to flat when no normals available
- aShadeMode = ::com::sun::star::drawing::ShadeMode_FLAT;
- }
- }
+ // flat shading. Get plane vector in eye coordinates
+ const basegfx::B3DVector aPlaneEyeNormal(aNormalTransform * rPrimitive.getB3DPolyPolygon().getB3DPolygon(0L).getNormal());
- if(::com::sun::star::drawing::ShadeMode_FLAT == aShadeMode)
- {
- // flat shading. Clear normals and colors
- aFill.clearNormals();
- aFill.clearBColors();
-
- // get plane vector in eye coordinates
- const basegfx::B3DVector aPlaneEyeNormal(aNormalTransform * rPrimitive.getB3DPolyPolygon().getB3DPolygon(0L).getNormal());
-
- // prepare color model parameters, evtl. use blend color
- const basegfx::BColor aColor(getModulate() ? basegfx::BColor(1.0, 1.0, 1.0) : rPrimitive.getMaterial().getColor());
- const basegfx::BColor& rSpecular(rPrimitive.getMaterial().getSpecular());
- const basegfx::BColor& rEmission(rPrimitive.getMaterial().getEmission());
- const sal_uInt16 nSpecularIntensity(rPrimitive.getMaterial().getSpecularIntensity());
-
- // solve color model for plane vector and use that color for whole plane
- aObjectColor = getSdrLightingAttribute().solveColorModel(aPlaneEyeNormal, aColor, rSpecular, rEmission, nSpecularIntensity);
- }
+ // prepare color model parameters, evtl. use blend color
+ const basegfx::BColor aColor(getModulate() ? basegfx::BColor(1.0, 1.0, 1.0) : rPrimitive.getMaterial().getColor());
+ const basegfx::BColor& rSpecular(rPrimitive.getMaterial().getSpecular());
+ const basegfx::BColor& rEmission(rPrimitive.getMaterial().getEmission());
+ const sal_uInt16 nSpecularIntensity(rPrimitive.getMaterial().getSpecularIntensity());
- if(::com::sun::star::drawing::ShadeMode_DRAFT == aShadeMode)
- {
- // draft, just use object color which is already set. Delete all other infos
- aFill.clearNormals();
- aFill.clearBColors();
+ // solve color model for plane vector and use that color for whole plane
+ aObjectColor = getSdrLightingAttribute().solveColorModel(aPlaneEyeNormal, aColor, rSpecular, rEmission, nSpecularIntensity);
+ break;
+ }
+ default: // case ::com::sun::star::drawing::ShadeMode_DRAFT:
+ {
+ // draft, just use object color which is already set. Delete all other infos
+ aFill.clearNormals();
+ aFill.clearBColors();
+ break;
+ }
}
// draw it to ZBuffer
diff --git a/svx/inc/svx/sdr/overlay/overlaymanager.hxx b/svx/inc/svx/sdr/overlay/overlaymanager.hxx
index 29b54d7c17..9b22f9b46f 100644
--- a/svx/inc/svx/sdr/overlay/overlaymanager.hxx
+++ b/svx/inc/svx/sdr/overlay/overlaymanager.hxx
@@ -97,7 +97,7 @@ namespace sdr
// return mfDiscreteOne to derivations, but also check for buffered local
// ViewTransformation and evtl. correct mfDiscreteOne
- const double getDiscreteOne() const;
+ double getDiscreteOne() const;
public:
OverlayManager(OutputDevice& rOutputDevice);
diff --git a/svx/source/sdr/contact/viewcontactofe3dpolygon.cxx b/svx/source/sdr/contact/viewcontactofe3dpolygon.cxx
index 5c84da834f..61d5cc78cb 100644
--- a/svx/source/sdr/contact/viewcontactofe3dpolygon.cxx
+++ b/svx/source/sdr/contact/viewcontactofe3dpolygon.cxx
@@ -38,6 +38,7 @@
#include <svx/sdr/primitive2d/sdrattributecreator.hxx>
#include <svx/sdr/primitive3d/sdrattributecreator3d.hxx>
#include <basegfx/polygon/b3dpolygon.hxx>
+#include <basegfx/polygon/b3dpolypolygontools.hxx>
//////////////////////////////////////////////////////////////////////////////
@@ -120,11 +121,57 @@ namespace sdr
if(bTexture)
{
- const basegfx::B2DRange aTxRange(basegfx::tools::getRange(aPolyTexture2D));
- aTextureSize.setX(aTxRange.getWidth());
- aTextureSize.setY(aTxRange.getHeight());
+ // #i98314#
+ // create texture size from object's size
+ const basegfx::B3DRange aObjectRange(basegfx::tools::getRange(aPolyPolygon3D));
+
+ double fWidth(0.0);
+ double fHeight(0.0);
+
+ // this is a polygon object, so Width/Height and/or Depth may be zero (e.g. left
+ // wall of chart). Take this into account
+ if(basegfx::fTools::equalZero(aObjectRange.getWidth()))
+ {
+ // width is zero, use height and depth
+ fWidth = aObjectRange.getHeight();
+ fHeight = aObjectRange.getDepth();
+ }
+ else if(basegfx::fTools::equalZero(aObjectRange.getHeight()))
+ {
+ // height is zero, use width and depth
+ fWidth = aObjectRange.getWidth();
+ fHeight = aObjectRange.getDepth();
+ }
+ else
+ {
+ // use width and height
+ fWidth = aObjectRange.getWidth();
+ fHeight = aObjectRange.getHeight();
+ }
+
+ if(basegfx::fTools::lessOrEqual(fWidth, 0.0) ||basegfx::fTools::lessOrEqual(fHeight, 0.0))
+ {
+ // no texture; fallback to very small size
+ aTextureSize.setX(0.01);
+ aTextureSize.setY(0.01);
+ }
+ else
+ {
+ aTextureSize.setX(fWidth);
+ aTextureSize.setY(fHeight);
+ }
}
+ // #i98295#
+ // unfortunately, this SdrObject type which allows a free 3d geometry definition was defined
+ // wrong topologically in relation to it's plane normal and 3D visibility when it was invented
+ // a long time ago. Since the API allows creation of this SDrObject type, it is not possible to
+ // simply change this definition. Only the chart should use it, and at least this object type
+ // only exists at Runtime (is not saved and/or loaded in any FileFormat). Still someone external
+ // may have used it in it's API. To not risk wrong 3D lightings, i have to switch the orientation
+ // of the polygon here
+ aPolyPolygon3D.flip();
+
// create primitive and add
const basegfx::B3DHomMatrix aWorldTransform;
const drawinglayer::primitive3d::Primitive3DReference xReference(new drawinglayer::primitive3d::SdrPolyPolygonPrimitive3D(
diff --git a/svx/source/sdr/overlay/overlaymanager.cxx b/svx/source/sdr/overlay/overlaymanager.cxx
index d6ddfde6f2..834f8f170c 100644
--- a/svx/source/sdr/overlay/overlaymanager.cxx
+++ b/svx/source/sdr/overlay/overlaymanager.cxx
@@ -121,7 +121,7 @@ namespace sdr
}
}
- const double OverlayManager::getDiscreteOne() const
+ double OverlayManager::getDiscreteOne() const
{
if(getOutputDevice().GetViewTransformation() != maViewTransformation)
{
diff --git a/svx/source/svdraw/svdotextdecomposition.cxx b/svx/source/svdraw/svdotextdecomposition.cxx
index 5d1fb9b3d1..b894b19073 100644
--- a/svx/source/svdraw/svdotextdecomposition.cxx
+++ b/svx/source/svdraw/svdotextdecomposition.cxx
@@ -435,6 +435,17 @@ namespace
if(!basegfx::fTools::equal(fStart, fEnd))
{
+ if(rInfo.IsRTL())
+ {
+ // #i98523#
+ // When the portion is RTL, mirror the redlining using the
+ // full portion width
+ const double fTextWidth(aDXArray[aDXArray.size() - 1]);
+
+ fStart = fTextWidth - fStart;
+ fEnd = fTextWidth - fEnd;
+ }
+
maTextPortionPrimitives.push_back(new drawinglayer::primitive2d::WrongSpellPrimitive2D(
aNewTransform,
fStart,