GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: src/leaf-node-face.cpp Lines: 0 108 0.0 %
Date: 2024-04-14 11:13:22 Branches: 0 130 0.0 %

Line Branch Exec Source
1
//
2
//  leaf-node-face.cpp
3
//  gepetto-viewer
4
//
5
//  Created by Justin Carpentier, Mathieu Geisert in November 2014.
6
//  Copyright (c) 2014 LAAS-CNRS. All rights reserved.
7
//
8
9
#include <gepetto/viewer/leaf-node-face.h>
10
11
#include <osg/CullFace>
12
#include <osg/Texture2D>
13
#include <osgDB/ReadFile>
14
#include <osgUtil/SmoothingVisitor>
15
16
#include "log.hh"
17
18
namespace gepetto {
19
namespace viewer {
20
21
/* Declaration of private function members */
22
23
void LeafNodeFace::init() {
24
  /* Set face Geometry */
25
  face_ptr_ = new ::osg::Geometry();
26
27
  /* Create Geode for adding geometry */
28
  geode_ptr_ = new osg::Geode();
29
  geode_ptr_->addDrawable(face_ptr_);
30
31
  vertices_ = new ::osg::Vec3Array();
32
  face_ptr_->setVertexArray(vertices_);
33
34
  /* Define the face color */
35
  color_ptr_ = new ::osg::Vec4Array();
36
  color_ptr_->push_back(osgVector4(1., 1., 1., 1.));
37
  face_ptr_->setColorArray(color_ptr_.get());
38
  face_ptr_->setColorBinding(::osg::Geometry::BIND_OVERALL);
39
40
  /* Allow transparency */
41
  geode_ptr_->getOrCreateStateSet()->setMode(GL_BLEND,
42
                                             ::osg::StateAttribute::ON);
43
44
  /* Add geode to the queue */
45
  this->asQueue()->addChild(geode_ptr_);
46
}
47
48
LeafNodeFace::LeafNodeFace(const std::string& name, const osgVector3& point1,
49
                           const osgVector3& point2, const osgVector3& point3)
50
    : Node(name) {
51
  init();
52
  addVertex(point1);
53
  addVertex(point2);
54
  addVertex(point3);
55
}
56
57
LeafNodeFace::LeafNodeFace(const std::string& name, const osgVector3& point1,
58
                           const osgVector3& point2, const osgVector3& point3,
59
                           const osgVector4& color)
60
    : Node(name) {
61
  init();
62
  addVertex(point1);
63
  addVertex(point2);
64
  addVertex(point3);
65
  setColor(color);
66
}
67
68
LeafNodeFace::LeafNodeFace(const std::string& name, const osgVector3& point1,
69
                           const osgVector3& point2, const osgVector3& point3,
70
                           const osgVector3& point4)
71
    : Node(name) {
72
  init();
73
  addVertex(point1);
74
  addVertex(point2);
75
  addVertex(point3);
76
  addVertex(point4);
77
}
78
LeafNodeFace::LeafNodeFace(const std::string& name, const osgVector3& point1,
79
                           const osgVector3& point2, const osgVector3& point3,
80
                           const osgVector3& point4, const osgVector4& color)
81
    : Node(name) {
82
  init();
83
  addVertex(point1);
84
  addVertex(point2);
85
  addVertex(point3);
86
  addVertex(point4);
87
  setColor(color);
88
}
89
90
LeafNodeFace::LeafNodeFace(const LeafNodeFace& other) : Node(other.getID()) {
91
  init();
92
  for (::osg::Vec3Array::const_iterator i = other.vertices_->begin();
93
       i != other.vertices_->end(); i++) {
94
    addVertex(*i);
95
  }
96
}
97
98
void LeafNodeFace::initWeakPtr(LeafNodeFaceWeakPtr other_weak_ptr) {
99
  weak_ptr_ = other_weak_ptr;
100
}
101
102
/* End of declaration of private function members */
103
104
/* Declaration of protected function members */
105
106
LeafNodeFacePtr_t LeafNodeFace::create(const std::string& name,
107
                                       const osgVector3& point1,
108
                                       const osgVector3& point2,
109
                                       const osgVector3& point3) {
110
  LeafNodeFacePtr_t shared_ptr(new LeafNodeFace(name, point1, point2, point3));
111
112
  // Add reference to itself
113
  shared_ptr->initWeakPtr(shared_ptr);
114
115
  return shared_ptr;
116
}
117
118
LeafNodeFacePtr_t LeafNodeFace::create(const std::string& name,
119
                                       const osgVector3& point1,
120
                                       const osgVector3& point2,
121
                                       const osgVector3& point3,
122
                                       const osgVector4& color) {
123
  LeafNodeFacePtr_t shared_ptr(
124
      new LeafNodeFace(name, point1, point2, point3, color));
125
126
  // Add reference to itself
127
  shared_ptr->initWeakPtr(shared_ptr);
128
129
  return shared_ptr;
130
}
131
132
LeafNodeFacePtr_t LeafNodeFace::create(const std::string& name,
133
                                       const osgVector3& point1,
134
                                       const osgVector3& point2,
135
                                       const osgVector3& point3,
136
                                       const osgVector3& point4) {
137
  LeafNodeFacePtr_t shared_ptr(
138
      new LeafNodeFace(name, point1, point2, point3, point4));
139
140
  // Add reference to itself
141
  shared_ptr->initWeakPtr(shared_ptr);
142
143
  return shared_ptr;
144
}
145
146
LeafNodeFacePtr_t LeafNodeFace::create(const std::string& name,
147
                                       const osgVector3& point1,
148
                                       const osgVector3& point2,
149
                                       const osgVector3& point3,
150
                                       const osgVector3& point4,
151
                                       const osgVector4& color) {
152
  LeafNodeFacePtr_t shared_ptr(
153
      new LeafNodeFace(name, point1, point2, point3, point4, color));
154
155
  // Add reference to itself
156
  shared_ptr->initWeakPtr(shared_ptr);
157
158
  return shared_ptr;
159
}
160
LeafNodeFacePtr_t LeafNodeFace::createCopy(LeafNodeFacePtr_t other) {
161
  LeafNodeFacePtr_t shared_ptr(new LeafNodeFace(*other));
162
163
  // Add reference to itself
164
  shared_ptr->initWeakPtr(shared_ptr);
165
166
  return shared_ptr;
167
}
168
169
/* End of declaration of protected function members */
170
171
/* Declaration of public function members */
172
173
LeafNodeFacePtr_t LeafNodeFace::clone(void) const {
174
  return LeafNodeFace::createCopy(weak_ptr_.lock());
175
}
176
177
LeafNodeFacePtr_t LeafNodeFace::self(void) const { return weak_ptr_.lock(); }
178
179
void LeafNodeFace::addVertex(const osgVector3& vertex) {
180
  vertices_->push_back(vertex);
181
  face_ptr_->addPrimitiveSet(
182
      new ::osg::DrawArrays(GL_POLYGON, 0, (GLsizei)vertices_->size()));
183
  // osgUtil::Tessellator::retessellatePolygons( *(face_ptr_.get()) );
184
  osgUtil::SmoothingVisitor::smooth(*(face_ptr_.get()));
185
  setDirty();
186
}
187
188
void LeafNodeFace::setColor(const osgVector4& color) {
189
  color_ptr_->at(0) = color;
190
  setTransparentRenderingBin(color[3] <
191
                             Node::TransparencyRenderingBinThreshold);
192
  setDirty();
193
}
194
195
void LeafNodeFace::setTexture(const std::string& image_path) {
196
  osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;
197
  // Do not resize image to closest power of two values for width and height
198
  texture->setResizeNonPowerOfTwoHint(false);
199
  // Disable interpolation between pixels.
200
  texture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::NEAREST);
201
  osg::ref_ptr<osg::Image> image = osgDB::readImageFile(image_path);
202
  if (!image) {
203
    log() << "couldn't find texture " << image_path << ", quiting."
204
          << std::endl;
205
    return;
206
  }
207
  texture->setImage(image);
208
  osg::Vec2Array* texcoords = new osg::Vec2Array(4);
209
  (*texcoords)[0].set(0.00f, 0.0f);  // texture coord for vertex 0
210
  (*texcoords)[1].set(1.00f, 0.0f);  // texture coord for vertex 1
211
  (*texcoords)[2].set(1.00f, 1.0f);  // texture coord for vertex 2
212
  (*texcoords)[3].set(0.00f, 1.0f);  // texture coord for vertex 3
213
  face_ptr_->setTexCoordArray(0, texcoords);
214
215
  geode_ptr_->getStateSet()->setTextureAttributeAndModes(
216
      0, texture, osg::StateAttribute::ON);
217
  setDirty();
218
}
219
220
LeafNodeFace::~LeafNodeFace() {
221
  /* Proper deletion of all tree scene */
222
  geode_ptr_->removeDrawable(face_ptr_);
223
  face_ptr_ = NULL;
224
  geode_ptr_ = NULL;
225
226
  weak_ptr_.reset();
227
}
228
229
/* End of declaration of public function members */
230
231
} /* namespace viewer */
232
233
} /* namespace gepetto */