From 288e7fa5ca9b644553f0ec5667d666261da0736a Mon Sep 17 00:00:00 2001 From: Thomas Geymayer Date: Thu, 9 Aug 2012 21:58:55 +0200 Subject: [PATCH] Canvas: default image element dimensions to texture size --- src/Canvas/elements/CanvasImage.cxx | 59 ++++++++++++++++++++++------- src/Canvas/elements/CanvasImage.hxx | 3 ++ src/Canvas/rect.hxx | 7 +++- 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/src/Canvas/elements/CanvasImage.cxx b/src/Canvas/elements/CanvasImage.cxx index 3addb4901..62a2e4dc2 100644 --- a/src/Canvas/elements/CanvasImage.cxx +++ b/src/Canvas/elements/CanvasImage.cxx @@ -74,9 +74,7 @@ namespace canvas Image::Image(SGPropertyNode_ptr node): Element(node, COLOR_FILL | BOUNDING_BOX), _texture(new osg::Texture2D), - _node_src_rect( node->getNode("source", 0, true) ), - _src_rect(0,0,0,0), - _region(0,0,0,0) + _node_src_rect( node->getNode("source", 0, true) ) { _geom = new osg::Geometry; _geom->setUseDisplayList(false); @@ -139,17 +137,12 @@ namespace canvas if( !_node_src_rect->getBoolValue("normalized", true) ) { - osg::Texture2D *texture = !_canvas.expired() - ? _canvas.lock()->getTexture() - : _texture.get(); + const Rect& tex_dim = getTextureDimensions(); - int texWidth = texture->getTextureWidth(); - int texHeight = texture->getTextureHeight(); - - u0 /= texWidth; - u1 /= texWidth; - v0 /= texHeight; - v1 /= texHeight; + u0 /= tex_dim.width(); + u1 /= tex_dim.width(); + v0 /= tex_dim.height(); + v1 /= tex_dim.height(); } (*_texCoords)[0].set(u0, v0); @@ -171,6 +164,9 @@ namespace canvas _geom->setCullCallback( canvas ? new CullCallback(canvas->getCameraCullCallback()) : 0 ); + + if( !_canvas.expired() ) + setupDefaultDimensions(); } //---------------------------------------------------------------------------- @@ -188,6 +184,9 @@ namespace canvas _texture->setImage(img); _geom->getOrCreateStateSet() ->setTextureAttributeAndModes(0, _texture); + + if( img ) + setupDefaultDimensions(); } //---------------------------------------------------------------------------- @@ -298,4 +297,38 @@ namespace canvas _colors->dirty(); } + //---------------------------------------------------------------------------- + void Image::setupDefaultDimensions() + { + if( !_src_rect.width() || !_src_rect.height() ) + { + const Rect& tex_dim = getTextureDimensions(); + + _node_src_rect->setBoolValue("normalized", false); + _node_src_rect->setFloatValue("right", tex_dim.width()); + _node_src_rect->setFloatValue("bottom", tex_dim.height()); + } + + if( !_region.width() || !_region.height() ) + { + _node->setFloatValue("size[0]", _src_rect.width()); + _node->setFloatValue("size[1]", _src_rect.height()); + } + } + + //---------------------------------------------------------------------------- + Rect Image::getTextureDimensions() const + { + osg::Texture2D *texture = !_canvas.expired() + ? _canvas.lock()->getTexture() + : _texture.get(); + + return Rect + ( + 0,0, + texture->getTextureWidth(), + texture->getTextureHeight() + ); + } + } // namespace canvas diff --git a/src/Canvas/elements/CanvasImage.hxx b/src/Canvas/elements/CanvasImage.hxx index 934df7a0a..d95268a6f 100644 --- a/src/Canvas/elements/CanvasImage.hxx +++ b/src/Canvas/elements/CanvasImage.hxx @@ -72,6 +72,9 @@ namespace canvas void handleHit(float x, float y); + void setupDefaultDimensions(); + Rect getTextureDimensions() const; + osg::ref_ptr _texture; // TODO optionally forward events to canvas CanvasWeakPtr _canvas; diff --git a/src/Canvas/rect.hxx b/src/Canvas/rect.hxx index f140cebf2..76c5ecf01 100644 --- a/src/Canvas/rect.hxx +++ b/src/Canvas/rect.hxx @@ -27,7 +27,12 @@ namespace canvas class Rect { public: - Rect() {} + Rect(): + _x1(0), + _x2(0), + _y1(0), + _y2(0) + {} Rect(T x, T y, T w, T h): _x1(x), -- 2.39.2