BaseObjectData.cc 11.8 KB
Newer Older
1 2 3
/*===========================================================================*\
 *                                                                           *
 *                              OpenFlipper                                  *
Jan Möbius's avatar
Jan Möbius committed
4
 *      Copyright (C) 2001-2010 by Computer Graphics Group, RWTH Aachen      *
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
 *                           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
#include <OpenFlipper/common/GlobalOptions.hh>
58 59 60 61
#include <OpenFlipper/BasePlugin/PluginFunctions.hh>
#include <QDir>


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

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

//== CLASS DEFINITION =========================================================
66

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

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

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
106 107 108 109 110 111 112 113
  // 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;
114
    boundingBoxNode_ = 0;
Jan Möbius's avatar
 
Jan Möbius committed
115 116
    additionalNodes_.clear();
  }
117

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

Jan Möbius's avatar
 
Jan Möbius committed
120 121 122 123 124 125 126
  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");
127
  else
Jan Möbius's avatar
 
Jan Möbius committed
128
    std::cerr << "Separator Node already exists. this should not happen!" << std::endl;
129

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

    // Bind this manipulator to the current object
    manipulatorNode_->setIdentifier(id());
135
    manipulatorNode_->set_status( ACG::SceneGraph::TranslationManipulatorNode::HideNode );
Jan Möbius's avatar
 
Jan Möbius committed
136
  }
137
  else
Jan Möbius's avatar
 
Jan Möbius committed
138
    std::cerr << "Manipulator Node already exists. this should not happen!" << std::endl;
139 140 141 142 143
  if ( boundingBoxNode_ == 0)
  {
    boundingBoxNode_      = new BoundingBoxNode(manipulatorNode(),  "New Bounding Box");
    boundingBoxNode_->set_status( ACG::SceneGraph::BaseNode::HideNode );
  }
144 145
  if ( stencilRefNode_ == 0 )
  {
146
    stencilRefNode_       = new StencilRefNode(boundingBoxNode(),  "New Stencil Reference");
147 148
    stencilRefNode_->set_status( ACG::SceneGraph::BaseNode::HideNode );
  }
149
  if ( materialNode_ == 0 ) {
150
    materialNode_         = new MaterialNode(stencilRefNode(),  "New Material");
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
    
    QColor color;
    
    if ( OpenFlipper::Options::randomBaseColor() ){
      //init random seed
      srand ( time(NULL) );
      
      QColor bckgrnd = OpenFlipperSettings().value("Core/Gui/glViewer/defaultBackgroundColor").value<QColor>();
      int diff;
      
      do{
        color.setRgb(rand()%255, rand()%255, rand()%255);
        
        diff = (bckgrnd.red()   - color.red())  *(bckgrnd.red()   - color.red())
              +(bckgrnd.green() - color.green())*(bckgrnd.green() - color.green())
              +(bckgrnd.blue()  - color.blue()) *(bckgrnd.blue()  - color.blue());
      } while (diff < 70000);
    }
    else{
      color = OpenFlipper::Options::defaultBaseColor();
    }
    
    ACG::Vec4f colorV;
    colorV[0] = color.redF();
    colorV[1] = color.greenF();
    colorV[2] = color.blueF();
    colorV[3] = color.alphaF();
    
    materialNode_->set_base_color(colorV);
    materialNode_->set_color(colorV);
    
  }
Jan Möbius's avatar
 
Jan Möbius committed
183 184 185 186 187 188 189 190 191
}


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

void BaseObjectData::setFromFileName(QString _filename ) {
  QString str = _filename;
192 193
  path_ = str.section(QDir::separator() ,0,-2);
  setName(str.section(QDir::separator(),-1));
Jan Möbius's avatar
 
Jan Möbius committed
194 195 196 197
}

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

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

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

205 206 207
  nodename = std::string("BoundingBoxNode for object " + _name.toUtf8());
  boundingBoxNode_->name( nodename );

Jan Möbius's avatar
 
Jan Möbius committed
208 209
  nodename = std::string(_name.toUtf8() + "'s Material" );
  materialNode_->name( nodename );
210 211 212

  nodename = std::string("StencilRefNode for object " + _name.toUtf8());
  stencilRefNode_->name( nodename );
Jan Möbius's avatar
 
Jan Möbius committed
213 214 215 216 217 218 219
}


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

220
void BaseObjectData::setPath(QString _path ) {
221
  path_ = _path;
Jan Möbius's avatar
 
Jan Möbius committed
222 223 224 225 226 227 228
}

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

void BaseObjectData::show() {
229 230 231 232 233 234
  if ( !visible_ ) {
    separatorNode_->set_status( ACG::SceneGraph::BaseNode::Active  );
    visible_ = true;
    
    emit visibilityChanged( id() );
  }
Jan Möbius's avatar
 
Jan Möbius committed
235 236 237
}

void BaseObjectData::hide() {
238 239 240 241 242 243
  if ( visible_ ) {
    separatorNode_->set_status( ACG::SceneGraph::BaseNode::HideSubtree );
    visible_ = false;
    
    emit visibilityChanged( id() );
  }
Jan Möbius's avatar
 
Jan Möbius committed
244 245
}

246 247 248 249 250 251
bool BaseObjectData::visible(){
  return visible_;
}

void BaseObjectData::visible(bool _visible) {

252 253 254 255 256 257
  if ( visible_ != _visible ) {
    
    if (_visible)
      separatorNode_->set_status( ACG::SceneGraph::BaseNode::Active  );
    else
      separatorNode_->set_status( ACG::SceneGraph::BaseNode::HideSubtree );
258

259 260 261 262
    visible_ = _visible;
    
    emit visibilityChanged( id() );
  }
263 264
}

Jan Möbius's avatar
 
Jan Möbius committed
265
SeparatorNode* BaseObjectData::baseNode() {
266
  return separatorNode_;
Jan Möbius's avatar
 
Jan Möbius committed
267 268
}

269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290
bool BaseObjectData::hasNode(BaseNode* _node) {

  QList< BaseNode* > list;
  list.push_back(separatorNode_);
  
  BaseNode* currentNode;
  while (!list.empty()) {
    currentNode = list.front();
    
    if ( currentNode->find(_node) == currentNode->childrenEnd() ) {
      for ( BaseNode::ChildIter child = currentNode->childrenBegin() ; child != currentNode->childrenEnd(); ++child )
        list.push_back(*child);
    } else 
      return true;
      
    list.pop_front();
  }
  
  return false;
  
}

Dirk Wilden's avatar
Dirk Wilden committed
291 292 293 294
BaseNode* BaseObjectData::primaryNode() {
  return separatorNode_;
}

295
QtTranslationManipulatorNode* BaseObjectData::manipulatorNode() {
296 297 298 299 300
  return manipulatorNode_;
}

ACG::SceneGraph::ShaderNode* BaseObjectData::shaderNode() {
  return 0;
Jan Möbius's avatar
 
Jan Möbius committed
301 302 303
}

MaterialNode* BaseObjectData::materialNode() {
304
  return materialNode_;
Jan Möbius's avatar
 
Jan Möbius committed
305 306
}

307 308 309 310
BoundingBoxNode* BaseObjectData::boundingBoxNode() {
  return boundingBoxNode_;
}

311 312 313 314
StencilRefNode* BaseObjectData::stencilRefNode() {
  return stencilRefNode_;
}

Jan Möbius's avatar
 
Jan Möbius committed
315 316 317 318 319 320 321 322
bool BaseObjectData::manipPlaced() {
  return manipPlaced_;
}

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

323 324
void BaseObjectData::getBoundingBox(ACG::Vec3d& bbmin, ACG::Vec3d& bbmax){

325
  // Single pass action, as the bounding box is not influenced by multipass traversal
326 327 328 329 330 331 332 333
  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
334
// ===============================================================================
335
// Picking
Jan Möbius's avatar
 
Jan Möbius committed
336 337 338
// ===============================================================================

bool BaseObjectData::picked( uint /* _node_idx */ ) {
339
 return false;
Jan Möbius's avatar
 
Jan Möbius committed
340 341
}

342 343 344 345 346 347 348
void BaseObjectData::enablePicking( bool /*_enable*/ ) {
}

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

Jan Möbius's avatar
 
Jan Möbius committed
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
// ===============================================================================
// 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;
366

Jan Möbius's avatar
 
Jan Möbius committed
367 368 369 370
  for ( uint i =0 ; i < additionalNodes_.size() ; ++i ) {
    if (additionalNodes_[i].second == searchname )
      return true;
  }
371

Jan Möbius's avatar
 
Jan Möbius committed
372 373 374
  return false;
}

375

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