GCC Code Coverage Report


Directory: ./
File: src/leaf-node-arrow.cpp
Date: 2025-04-14 11:18:00
Exec Total Coverage
Lines: 0 87 0.0%
Branches: 0 100 0.0%

Line Branch Exec Source
1 //
2 // leaf-node-arrow.cpp
3 // gepetto-viewer
4 //
5 // Created by Pierre Fernbach in june 2015.
6 // Copyright (c) 2015 LAAS-CNRS. All rights reserved.
7 //
8
9 #include <gepetto/viewer/leaf-node-arrow.h>
10
11 #include <osg/Version>
12
13 namespace gepetto {
14 namespace viewer {
15
16 /* Declaration of private function members */
17
18 ✗ void LeafNodeArrow::init() {
19 /* Create Geode for adding ShapeDrawable */
20 ✗ geode_ptr_ = new osg::Geode();
21
22 ✗ resetGeodeContent();
23
24 /* Create PositionAttitudeTransform */
25 ✗ this->asQueue()->addChild(geode_ptr_);
26
27 /* Allow transparency */
28 ✗ geode_ptr_->getOrCreateStateSet()->setMode(GL_BLEND,
29 ::osg::StateAttribute::ON);
30 ;
31
32 ✗ addProperty(FloatProperty::create(
33 "Radius",
34 ✗ FloatProperty::getterFromMemberFunction(this, &LeafNodeArrow::getRadius),
35 ✗ FloatProperty::setterFromMemberFunction(this,
36 &LeafNodeArrow::setRadius)));
37 ✗ addProperty(FloatProperty::create(
38 "Size",
39 ✗ FloatProperty::getterFromMemberFunction(this, &LeafNodeArrow::getSize),
40 ✗ FloatProperty::setterFromMemberFunction(this, &LeafNodeArrow::setSize)));
41 }
42
43 ✗ void LeafNodeArrow::resetGeodeContent() {
44 ✗ if (cylinder_drawable_) geode_ptr_->removeDrawable(cylinder_drawable_);
45 ✗ if (cone_drawable_) geode_ptr_->removeDrawable(cone_drawable_);
46
47 /* create the axis : */
48 ✗ float R = getRadius();
49 ✗ float L = getSize();
50 ✗ float Lcone = std::min(L, 4.f * R);
51
52 /* Create cylinder */
53 ✗ ::osg::CylinderRefPtr cylinder_shape_x_ptr = new ::osg::Cylinder();
54 ✗ cylinder_shape_x_ptr->set(osgVector3((L - Lcone) / 2.f, 0.f, 0.f), R,
55 L - Lcone);
56 ✗ cylinder_shape_x_ptr->setRotation(
57 ✗ osgQuat(0.f, ::osg::X_AXIS, M_PI_2, ::osg::Y_AXIS, 0.f, ::osg::Z_AXIS));
58 /* Create cone */
59 ✗ ::osg::ConeRefPtr cone_shape_x_ptr = new ::osg::Cone();
60 ✗ cone_shape_x_ptr->set(osgVector3(L - 3 * Lcone / 4, 0.f, 0.f), 2.f * R,
61 Lcone);
62 ✗ cone_shape_x_ptr->setRotation(
63 ✗ osgQuat(0.f, ::osg::X_AXIS, M_PI_2, ::osg::Y_AXIS, 0.f, ::osg::Z_AXIS));
64
65 /* create drawable and add them to geode */
66 ✗ cylinder_drawable_ = new ::osg::ShapeDrawable(cylinder_shape_x_ptr);
67 ✗ cone_drawable_ = new ::osg::ShapeDrawable(cone_shape_x_ptr);
68 ✗ setColor(color_);
69
70 ✗ geode_ptr_->addDrawable(cylinder_drawable_);
71 ✗ geode_ptr_->addDrawable(cone_drawable_);
72 }
73
74 ✗ LeafNodeArrow::LeafNodeArrow(const std::string& name, const osgVector4& color,
75 ✗ float radius, float size)
76 ✗ : NodeDrawable(name), color_(color) {
77 ✗ radius_ = radius;
78 ✗ size_ = size;
79
80 ✗ init();
81 }
82
83 ✗ LeafNodeArrow::LeafNodeArrow(const LeafNodeArrow& other)
84 ✗ : NodeDrawable(other.getID()) {
85 ✗ init();
86 // TODO
87 }
88
89 ✗ void LeafNodeArrow::initWeakPtr(LeafNodeArrowWeakPtr other_weak_ptr) {
90 ✗ weak_ptr_ = other_weak_ptr;
91 }
92
93 /* End of declaration of private function members */
94
95 /* Declaration of protected function members */
96
97 ✗ LeafNodeArrowPtr_t LeafNodeArrow::create(const std::string& name,
98 const osgVector4& color,
99 float radiusCenter, float size) {
100 LeafNodeArrowPtr_t shared_ptr(
101 ✗ new LeafNodeArrow(name, color, radiusCenter, size));
102
103 // Add reference to itself
104 ✗ shared_ptr->initWeakPtr(shared_ptr);
105
106 ✗ return shared_ptr;
107 }
108
109 ✗ LeafNodeArrowPtr_t LeafNodeArrow::create(const std::string& name,
110 const osgVector4& color,
111 float radiusCenter) {
112 LeafNodeArrowPtr_t shared_ptr(
113 ✗ new LeafNodeArrow(name, color, radiusCenter, 4 * radiusCenter));
114
115 // Add reference to itself
116 ✗ shared_ptr->initWeakPtr(shared_ptr);
117
118 ✗ return shared_ptr;
119 }
120
121 ✗ LeafNodeArrowPtr_t LeafNodeArrow::createCopy(LeafNodeArrowPtr_t other) {
122 ✗ LeafNodeArrowPtr_t shared_ptr(new LeafNodeArrow(*other));
123
124 // Add reference to itself
125 ✗ shared_ptr->initWeakPtr(shared_ptr);
126
127 ✗ return shared_ptr;
128 }
129
130 /* End of declaration of protected function members */
131
132 /* Declaration of public function members */
133
134 ✗ LeafNodeArrowPtr_t LeafNodeArrow::clone(void) const {
135 ✗ return LeafNodeArrow::createCopy(weak_ptr_.lock());
136 }
137
138 ✗ LeafNodeArrowPtr_t LeafNodeArrow::self(void) const { return weak_ptr_.lock(); }
139
140 ✗ void LeafNodeArrow::setRadius(const float& radius) {
141 ✗ if (radius != getRadius()) { // avoid useless resize
142 ✗ radius_ = radius;
143 ✗ resetGeodeContent();
144 }
145 }
146
147 ✗ float LeafNodeArrow::getRadius() const { return radius_; }
148
149 ✗ void LeafNodeArrow::setSize(const float& size) {
150 ✗ if (size != getSize()) { // avoid useless resize
151 ✗ size_ = size;
152 ✗ resetGeodeContent();
153 }
154 }
155
156 ✗ float LeafNodeArrow::getSize() const { return size_; }
157
158 ✗ void LeafNodeArrow::setColor(const osgVector4& color) {
159 ✗ cylinder_drawable_->setColor(color);
160 ✗ cone_drawable_->setColor(color);
161 #if OSG_VERSION_GREATER_OR_EQUAL(3, 5, 6)
162 ✗ cylinder_drawable_->build();
163 ✗ cone_drawable_->build();
164 #else
165 cylinder_drawable_->dirtyDisplayList();
166 cone_drawable_->dirtyDisplayList();
167 cylinder_drawable_->dirtyBound();
168 cone_drawable_->dirtyBound();
169 #endif
170 ✗ color_ = color;
171 ✗ setTransparentRenderingBin(color[3] <
172 ✗ Node::TransparencyRenderingBinThreshold);
173 ✗ setDirty();
174 }
175
176 ✗ void LeafNodeArrow::resize(float radius, float length) {
177 ✗ if (length != getSize() || radius != getRadius()) { // avoid useless resize
178 ✗ size_ = length;
179 ✗ radius_ = radius;
180
181 ✗ resetGeodeContent();
182 }
183 }
184
185 ✗ LeafNodeArrow::~LeafNodeArrow() {
186 /* Proper deletion of all tree scene */
187
188 ✗ geode_ptr_->removeDrawable(cylinder_drawable_);
189 ✗ geode_ptr_->removeDrawable(cone_drawable_);
190
191 ✗ geode_ptr_ = NULL;
192 ✗ cylinder_drawable_ = NULL;
193 ✗ cone_drawable_ = NULL;
194
195 ✗ weak_ptr_.reset();
196 }
197
198 /* End of declaration of public function members */
199
200 } /* namespace viewer */
201 } /* namespace gepetto */
202