source: osgVisual/src/draw2D/visual_draw2D.cpp @ 161

Last change on this file since 161 was 88, checked in by Torben Dannhauer, 14 years ago

Moved memory leak detection from source file to headerfile. Its still in the class but at least not in the source file.

The leak detection works, but the false positives are not stopped.
Use Linux/Valgrind? to make your final leak detection beyond the easy first approach in MSVC

File size: 4.3 KB
RevLine 
[31]1/* -*-c++-*- osgVisual - Copyright (C) 2009-2010 Torben Dannhauer
2 *
3 * This library is based on OpenSceneGraph, open source and may be redistributed and/or modified under
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version.  The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * osgVisual requires for some proprietary modules a license from the correspondig manufacturer.
9 * You have to aquire licenses for all used proprietary modules.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * OpenSceneGraph Public License for more details.
15*/
16
17#include <visual_draw2D.h>
18
19using namespace osgVisual;
20
21visual_draw2D::visual_draw2D(void)
22{
23        OSG_NOTIFY( osg::ALWAYS ) << "visual_draw2D constructed" << std::endl;
24        initialized = false;
25}
26
27visual_draw2D::~visual_draw2D(void)
28{
29        OSG_NOTIFY( osg::ALWAYS ) << "visual_draw2D destroyed: " << std::endl;
30}
31
32visual_draw2D* visual_draw2D::getInstance()
33{
34        static visual_draw2D instance; 
35        return &instance; 
36};
37
38bool visual_draw2D::init( osg::CoordinateSystemNode *sceneGraphRoot_, osgViewer::Viewer *viewer_ )
39{
40    screen_width = viewer_->getCamera()->getViewport()->width();
41    screen_height = viewer_->getCamera()->getViewport()->height();
42 
43   // Projection node for defining view frustrum for the HUD:
44        draw2DProjectionMatrix = new osg::Projection;
45
46   // Initialize the projection matrix for viewing everything we
47   // will add as descendants of this node. Use screen coordinates
48   // to define the horizontal and vertical extent of the projection
49   // matrix. Positions described under this node will equate to
50   // pixel coordinates.
51   draw2DProjectionMatrix->setMatrix(osg::Matrix::ortho2D(0,screen_width,0,screen_height));
52
53   // For the HUD model view matrix use an identity matrix:
54   draw2DModelViewMatrix = new osg::MatrixTransform;
55   draw2DModelViewMatrix->setMatrix(osg::Matrix::identity());
56
57   // Make sure the model view matrix is not affected by any transforms
58   // above it in the scene graph:
59   draw2DModelViewMatrix->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
60   
61
62   // Add the HUD projection matrix as a child of the root node
63   // and the HUD model view matrix as a child of the projection matrix
64   // Anything under this node will be viewed using this projection matrix
65   // and positioned with this model view matrix.
66   draw2DProjectionMatrix->addChild(draw2DModelViewMatrix);
67   sceneGraphRoot_->addChild( draw2DProjectionMatrix );
68
69   initialized = true;
70   return true;
71}
72
73void visual_draw2D::shutdown()
74{
75        if (!initialized)
76                return;
77
78        // Remove all Drawcontens
79        removeAllDrawContents();
80
81        // Remove Projectionmatrix
82        draw2DProjectionMatrix->removeChild( draw2DModelViewMatrix );
83        draw2DProjectionMatrix = NULL;
84
85        initialized = false;
86}
87
88bool visual_draw2D::addDrawContent( osg::Geode* content_, std::string name_,int renderBinDetail_ )
89{
90        if (!initialized)
91                return false;
92
93        // Add the Geometry node to contain HUD geometry as a child of the
94    // HUD model view matrix.
95        draw2DModelViewMatrix->addChild( content_ );
96        content_->setName( name_ );
97       
98        osg::StateSet* stateSet = content_->getOrCreateStateSet();
99        stateSet->setRenderBinDetails( renderBinDetail_, "RenderBin");
100        // disable depth test to ensure that it is always drawn.
101        stateSet->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
102
103        return true;
104}
105
106osg::Geode* visual_draw2D::getDrawContent( std::string name_ )
107{
108        osg::Node* tmp = util::findNamedNode(name_, draw2DModelViewMatrix);
109        if(tmp)
110        {
111                osg::Geode* tmp2 = tmp->asGeode();
112                if (tmp2)
113                        return tmp2;
114                else
115                        return NULL;
116        }
117        else 
118                return NULL;
119}
120
121bool visual_draw2D::removeDrawContent( std::string name_ )
122{
123        osg::Node* tmp = util::findNamedNode(name_, draw2DModelViewMatrix);
124        if(tmp)
125        {
126                draw2DModelViewMatrix->removeChild( tmp );
127                return true;
128        }
129        else
130                return false;
131}
132       
133void visual_draw2D::removeAllDrawContents()
134{
135        if (getDrawContentNum() > 0)
136                draw2DModelViewMatrix->removeChildren(0, getDrawContentNum() );
137}
138
139int visual_draw2D::getDrawContentNum()
140{
141        return draw2DModelViewMatrix->getNumChildren();
142}
Note: See TracBrowser for help on using the repository browser.