BaseObjectData.cc 10.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
/*===========================================================================*\
 *                                                                           *
 *                              OpenFlipper                                  *
 *      Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen      *
 *                           www.openflipper.org                             *
 *                                                                           *
 *---------------------------------------------------------------------------*
 *  This file is part of OpenFlipper.                                        *
 *                                                                           *
 *  OpenFlipper is free software: you can redistribute it and/or modify      *
 *  it under the terms of the GNU Lesser General Public License as           *
 *  published by the Free Software Foundation, either version 3 of           *
 *  the License, or (at your option) any later version with the              *
 *  following exceptions:                                                    *
 *                                                                           *
 *  If other files instantiate templates or use macros                       *
 *  or inline functions from this file, or you compile this file and         *
 *  link it with other files to produce an executable, this file does        *
 *  not by itself cause the resulting executable to be covered by the        *
 *  GNU Lesser General Public License. This exception does not however       *
 *  invalidate any other reasons why the executable file might be            *
 *  covered by the GNU Lesser General Public License.                        *
 *                                                                           *
 *  OpenFlipper is distributed in the hope that it will be useful,           *
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *
 *  GNU Lesser General Public License for more details.                      *
 *                                                                           *
 *  You should have received a copy of the GNU LesserGeneral Public          *
 *  License along with OpenFlipper. If not,                                  *
 *  see <http://www.gnu.org/licenses/>.                                      *
 *                                                                           *
\*===========================================================================*/

/*===========================================================================*\
 *                                                                           *
 *   $Revision$                                                         *
 *   $Author$                                                      *
 *   $Date$                   *
 *                                                                           *
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
42 43 44 45 46 47 48 49 50 51 52 53 54




//=============================================================================
//
//  MyTypes
//
//=============================================================================

//== INCLUDES =================================================================

#include "Types.hh"
55
#include <ACG/Scenegraph/SceneGraph.hh>
56
#include <OpenFlipper/common/BaseObjectCore.hh>
57 58 59 60
#include <OpenFlipper/BasePlugin/PluginFunctions.hh>
#include <QDir>


Jan Möbius's avatar
 
Jan Möbius committed
61 62 63 64

//== TYPEDEFS =================================================================

//== CLASS DEFINITION =========================================================
65

66 67 68
BaseObjectData::BaseObjectData(const BaseObjectData& _object)
  : BaseObject(_object),
    path_("."),
69
    manipPlaced_(false),
70 71 72
    rootNode_(_object.rootNode_),
    separatorNode_(0),
    manipulatorNode_(0),
73
    materialNode_(0),
74 75
    boundingBoxNode_(0),
    stencilRefNode_(0)
76 77 78 79 80
{
  // We have to create our own visualization nodes as we are a new object
  init();
}

81
BaseObjectData::BaseObjectData() :
Jan Möbius's avatar
 
Jan Möbius committed
82 83
  BaseObject(),
  path_("."),
84
  manipPlaced_(false),
85
  rootNode_( dynamic_cast< ACG::SceneGraph::SeparatorNode* > (PluginFunctions::getRootNode()) ),
Jan Möbius's avatar
 
Jan Möbius committed
86 87
  separatorNode_(0),
  manipulatorNode_(0),
88
  materialNode_(0),
89 90
  boundingBoxNode_(0),
  stencilRefNode_(0)
Jan Möbius's avatar
 
Jan Möbius committed
91 92 93 94 95 96 97 98
{
  init();
}

BaseObjectData::~BaseObjectData() {
  if ( separatorNode_ != 0 ) {
    separatorNode_->delete_subtree();
  }
99

Jan Möbius's avatar
 
Jan Möbius committed
100 101 102 103
}

void BaseObjectData::cleanup() {
  path_       = ".";
104

Jan Möbius's avatar
 
Jan Möbius committed
105 106 107 108 109 110 111 112
  // Delete everything below the seperator node on top of the object. This will remove the complete subtree.
  if ( separatorNode_ == 0 )
    std::cerr << "cleanup : separatorNode_ is already 0" << std::endl;
  else {
    separatorNode_->delete_subtree();
    separatorNode_   = 0;
    manipulatorNode_ = 0;
    materialNode_    = 0;
113
    boundingBoxNode_ = 0;
Jan Möbius's avatar
 
Jan Möbius committed
114 115
    additionalNodes_.clear();
  }
116

Jan Möbius's avatar
 
Jan Möbius committed
117
  BaseObject::cleanup();
118

Jan Möbius's avatar
 
Jan Möbius committed
119 120 121 122 123 124 125
  BaseObjectData::init();
}

void BaseObjectData::init() {
  // Create seperatorNode for Object only if it does not exist.
  if ( separatorNode_ == 0 )
    separatorNode_       = new SeparatorNode((BaseNode*)rootNode_,"NEW Object");
126
  else
Jan Möbius's avatar
 
Jan Möbius committed
127
    std::cerr << "Separator Node already exists. this should not happen!" << std::endl;
128

Jan Möbius's avatar
 
Jan Möbius committed
129
  if ( manipulatorNode_ == 0 ) {
130
    manipulatorNode_      = new QtTranslationManipulatorNode(baseNode(),"NEW ManipulatorNode");
131 132 133

    // Bind this manipulator to the current object
    manipulatorNode_->setIdentifier(id());
134
    manipulatorNode_->set_status( ACG::SceneGraph::TranslationManipulatorNode::HideNode );
Jan Möbius's avatar
 
Jan Möbius committed
135
  }
136
  else
Jan Möbius's avatar
 
Jan Möbius committed
137
    std::cerr << "Manipulator Node already exists. this should not happen!" << std::endl;
138 139 140 141 142
  if ( boundingBoxNode_ == 0)
  {
    boundingBoxNode_      = new BoundingBoxNode(manipulatorNode(),  "New Bounding Box");
    boundingBoxNode_->set_status( ACG::SceneGraph::BaseNode::HideNode );
  }
143 144
  if ( stencilRefNode_ == 0 )
  {
145
    stencilRefNode_       = new StencilRefNode(boundingBoxNode(),  "New Stencil Reference");
146 147
    stencilRefNode_->set_status( ACG::SceneGraph::BaseNode::HideNode );
  }
148 149
  if ( materialNode_ == 0 )
    materialNode_         = new MaterialNode(stencilRefNode(),  "New Material");
Jan Möbius's avatar
 
Jan Möbius committed
150 151 152 153 154 155 156 157 158
}


// ===============================================================================
// Name and path Handling
// ===============================================================================

void BaseObjectData::setFromFileName(QString _filename ) {
  QString str = _filename;
159 160
  path_ = str.section(QDir::separator() ,0,-2);
  setName(str.section(QDir::separator(),-1));
Jan Möbius's avatar
 
Jan Möbius committed
161 162 163 164
}

void BaseObjectData::setName( QString _name ) {
  BaseObject::setName( _name );
165

Jan Möbius's avatar
 
Jan Möbius committed
166 167
  std::string nodename = std::string("SeparatorNode for object " + _name.toUtf8());
  separatorNode_->name( nodename );
168

Jan Möbius's avatar
 
Jan Möbius committed
169 170
  nodename = std::string("ManipulatorNode for object " + _name.toUtf8());
  manipulatorNode_->name( nodename );
171

172 173 174
  nodename = std::string("BoundingBoxNode for object " + _name.toUtf8());
  boundingBoxNode_->name( nodename );

Jan Möbius's avatar
 
Jan Möbius committed
175 176
  nodename = std::string(_name.toUtf8() + "'s Material" );
  materialNode_->name( nodename );
177 178 179

  nodename = std::string("StencilRefNode for object " + _name.toUtf8());
  stencilRefNode_->name( nodename );
Jan Möbius's avatar
 
Jan Möbius committed
180 181 182 183 184 185 186 187
}


QString BaseObjectData::path(){
  return path_;
}

void BaseObjectData::path(QString _path ) {
188
  path_ = _path;
Jan Möbius's avatar
 
Jan Möbius committed
189 190 191 192 193 194 195
}

// ===============================================================================
// Object visualization
// ===============================================================================

void BaseObjectData::show() {
196 197 198 199 200 201
  if ( !visible_ ) {
    separatorNode_->set_status( ACG::SceneGraph::BaseNode::Active  );
    visible_ = true;
    
    emit visibilityChanged( id() );
  }
Jan Möbius's avatar
 
Jan Möbius committed
202 203 204
}

void BaseObjectData::hide() {
205 206 207 208 209 210
  if ( visible_ ) {
    separatorNode_->set_status( ACG::SceneGraph::BaseNode::HideSubtree );
    visible_ = false;
    
    emit visibilityChanged( id() );
  }
Jan Möbius's avatar
 
Jan Möbius committed
211 212
}

213 214 215 216 217 218
bool BaseObjectData::visible(){
  return visible_;
}

void BaseObjectData::visible(bool _visible) {

219 220 221 222 223 224
  if ( visible_ != _visible ) {
    
    if (_visible)
      separatorNode_->set_status( ACG::SceneGraph::BaseNode::Active  );
    else
      separatorNode_->set_status( ACG::SceneGraph::BaseNode::HideSubtree );
225

226 227 228 229
    visible_ = _visible;
    
    emit visibilityChanged( id() );
  }
230 231
}

Jan Möbius's avatar
 
Jan Möbius committed
232
SeparatorNode* BaseObjectData::baseNode() {
233
  return separatorNode_;
Jan Möbius's avatar
 
Jan Möbius committed
234 235
}

236
QtTranslationManipulatorNode* BaseObjectData::manipulatorNode() {
237 238 239 240 241
  return manipulatorNode_;
}

ACG::SceneGraph::ShaderNode* BaseObjectData::shaderNode() {
  return 0;
Jan Möbius's avatar
 
Jan Möbius committed
242 243 244
}

MaterialNode* BaseObjectData::materialNode() {
245
  return materialNode_;
Jan Möbius's avatar
 
Jan Möbius committed
246 247
}

248 249 250 251
BoundingBoxNode* BaseObjectData::boundingBoxNode() {
  return boundingBoxNode_;
}

252 253 254 255
StencilRefNode* BaseObjectData::stencilRefNode() {
  return stencilRefNode_;
}

256

Jan Möbius's avatar
 
Jan Möbius committed
257
void BaseObjectData::setBaseColor(ACG::Vec4f _color) {
258
  materialNode_->set_base_color(_color);
Jan Möbius's avatar
 
Jan Möbius committed
259 260 261 262 263 264 265 266 267 268
}

bool BaseObjectData::manipPlaced() {
  return manipPlaced_;
}

void BaseObjectData::manipPlaced( bool _placed ) {
  manipPlaced_ = _placed;
}

269 270
void BaseObjectData::getBoundingBox(ACG::Vec3d& bbmin, ACG::Vec3d& bbmax){

271
  // Single pass action, as the bounding box is not influenced by multipass traversal
272 273 274 275 276 277 278 279
  ACG::SceneGraph::BoundingBoxAction act;
  ACG::SceneGraph::traverse(separatorNode_, act);


  bbmin = (ACG::Vec3d) act.bbMin();
  bbmax = (ACG::Vec3d) act.bbMax();
}

Jan Möbius's avatar
 
Jan Möbius committed
280
// ===============================================================================
281
// Picking
Jan Möbius's avatar
 
Jan Möbius committed
282 283 284
// ===============================================================================

bool BaseObjectData::picked( uint /* _node_idx */ ) {
285
 return false;
Jan Möbius's avatar
 
Jan Möbius committed
286 287
}

288 289 290 291 292 293 294
void BaseObjectData::enablePicking( bool /*_enable*/ ) {
}

bool BaseObjectData::pickingEnabled() {
  return true;
}

Jan Möbius's avatar
 
Jan Möbius committed
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
// ===============================================================================
// Content Nodes
// ===============================================================================
void BaseObjectData::update()
{

}

// ===============================================================================
// Additional Nodes
// ===============================================================================

bool BaseObjectData::hasAdditionalNode(QString _pluginName, QString _nodeName , int _id )
{
  QString index;
  index.setNum(_id);
  QString searchname = _pluginName+"#"+_nodeName+"#"+index;
312

Jan Möbius's avatar
 
Jan Möbius committed
313 314 315 316
  for ( uint i =0 ; i < additionalNodes_.size() ; ++i ) {
    if (additionalNodes_[i].second == searchname )
      return true;
  }
317

Jan Möbius's avatar
 
Jan Möbius committed
318 319 320
  return false;
}

321

Jan Möbius's avatar
 
Jan Möbius committed
322
//=============================================================================