BaseObjectData.cc 7.25 KB
Newer Older
Jan Möbius's avatar
 
Jan Möbius committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14
//=============================================================================
//
//                               OpenFlipper
//        Copyright (C) 2008 by Computer Graphics Group, RWTH Aachen
//                           www.openflipper.org
//
//-----------------------------------------------------------------------------
//
//                                License
//
//  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.
15
//
Jan Möbius's avatar
 
Jan Möbius committed
16 17 18 19
//  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.
20
//
Jan Möbius's avatar
 
Jan Möbius committed
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
//  You should have received a copy of the GNU Lesser General Public License
//  along with OpenFlipper.  If not, see <http://www.gnu.org/licenses/>.
//
//-----------------------------------------------------------------------------
//
//   $Revision$
//   $Author$
//   $Date$
//
//=============================================================================




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

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

#include "Types.hh"
#include <OpenFlipper/common/GlobalOptions.hh>
45
#include <ACG/Scenegraph/SceneGraph.hh>
Jan Möbius's avatar
 
Jan Möbius committed
46 47 48 49

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

//== CLASS DEFINITION =========================================================
50

51 52 53
BaseObjectData::BaseObjectData(const BaseObjectData& _object)
  : BaseObject(_object),
    path_("."),
54
    manipPlaced_(false),
55 56 57 58 59 60 61 62 63
    rootNode_(_object.rootNode_),
    separatorNode_(0),
    manipulatorNode_(0),
    materialNode_(0)
{
  // We have to create our own visualization nodes as we are a new object
  init();
}

Jan Möbius's avatar
 
Jan Möbius committed
64 65 66
BaseObjectData::BaseObjectData( SeparatorNode* _rootNode ) :
  BaseObject(),
  path_("."),
67
  manipPlaced_(false),
68
  rootNode_(_rootNode),
Jan Möbius's avatar
 
Jan Möbius committed
69 70 71 72 73 74 75 76 77 78 79
  separatorNode_(0),
  manipulatorNode_(0),
  materialNode_(0)
{
  init();
}

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

Jan Möbius's avatar
 
Jan Möbius committed
81 82 83 84
}

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

Jan Möbius's avatar
 
Jan Möbius committed
86 87 88 89 90 91 92 93
  // 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;
94

Jan Möbius's avatar
 
Jan Möbius committed
95 96
    additionalNodes_.clear();
  }
97

Jan Möbius's avatar
 
Jan Möbius committed
98
  BaseObject::cleanup();
99

Jan Möbius's avatar
 
Jan Möbius committed
100 101 102 103 104 105 106
  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");
107
  else
Jan Möbius's avatar
 
Jan Möbius committed
108
    std::cerr << "Separator Node already exists. this should not happen!" << std::endl;
109

Jan Möbius's avatar
 
Jan Möbius committed
110
  if ( manipulatorNode_ == 0 ) {
111
    manipulatorNode_      = new QtTranslationManipulatorNode(baseNode(),"NEW ManipulatorNode");
112 113 114

    // Bind this manipulator to the current object
    manipulatorNode_->setIdentifier(id());
115
    manipulatorNode_->set_status( ACG::SceneGraph::TranslationManipulatorNode::HideNode );
Jan Möbius's avatar
 
Jan Möbius committed
116
  }
117
  else
Jan Möbius's avatar
 
Jan Möbius committed
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
    std::cerr << "Manipulator Node already exists. this should not happen!" << std::endl;
  if ( materialNode_ == 0 )
    materialNode_         = new MaterialNode(manipulatorNode(),  "New Material");
}


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

void BaseObjectData::setFromFileName(QString _filename ) {
  QString str = _filename;
  path_ = str.section(OpenFlipper::Options::dirSeparator(),0,-2);
  setName(str.section(OpenFlipper::Options::dirSeparator(),-1));
}

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
143 144 145 146 147 148 149 150 151 152
  nodename = std::string(_name.toUtf8() + "'s Material" );
  materialNode_->name( nodename );
}


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

void BaseObjectData::path(QString _path ) {
153
  path_ = _path;
Jan Möbius's avatar
 
Jan Möbius committed
154 155 156 157 158 159 160
}

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

void BaseObjectData::show() {
161
  separatorNode_->set_status( ACG::SceneGraph::BaseNode::Active  );
Jan Möbius's avatar
 
Jan Möbius committed
162 163 164 165
  visible_ = true;
}

void BaseObjectData::hide() {
166
  separatorNode_->set_status( ACG::SceneGraph::BaseNode::HideSubtree );
Jan Möbius's avatar
 
Jan Möbius committed
167 168 169
  visible_ = false;
}

170 171 172 173 174 175 176 177 178 179 180 181 182 183
bool BaseObjectData::visible(){
  return visible_;
}

void BaseObjectData::visible(bool _visible) {

  if (_visible)
    separatorNode_->set_status( ACG::SceneGraph::BaseNode::Active  );
  else
    separatorNode_->set_status( ACG::SceneGraph::BaseNode::HideSubtree );

  visible_ = _visible;
}

Jan Möbius's avatar
 
Jan Möbius committed
184
SeparatorNode* BaseObjectData::baseNode() {
185
  return separatorNode_;
Jan Möbius's avatar
 
Jan Möbius committed
186 187
}

188
QtTranslationManipulatorNode* BaseObjectData::manipulatorNode() {
189 190 191 192 193
  return manipulatorNode_;
}

ACG::SceneGraph::ShaderNode* BaseObjectData::shaderNode() {
  return 0;
Jan Möbius's avatar
 
Jan Möbius committed
194 195 196
}

MaterialNode* BaseObjectData::materialNode() {
197
  return materialNode_;
Jan Möbius's avatar
 
Jan Möbius committed
198 199 200
}

void BaseObjectData::setBaseColor(ACG::Vec4f _color) {
201
  materialNode_->set_base_color(_color);
Jan Möbius's avatar
 
Jan Möbius committed
202 203 204 205 206 207 208 209 210 211
}

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

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

212 213 214 215 216 217 218 219 220 221
void BaseObjectData::getBoundingBox(ACG::Vec3d& bbmin, ACG::Vec3d& bbmax){

  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
222
// ===============================================================================
223
// Picking
Jan Möbius's avatar
 
Jan Möbius committed
224 225 226
// ===============================================================================

bool BaseObjectData::picked( uint /* _node_idx */ ) {
227
 return false;
Jan Möbius's avatar
 
Jan Möbius committed
228 229
}

230 231 232 233 234 235 236
void BaseObjectData::enablePicking( bool /*_enable*/ ) {
}

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

Jan Möbius's avatar
 
Jan Möbius committed
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
// ===============================================================================
// 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;
254

Jan Möbius's avatar
 
Jan Möbius committed
255 256 257 258
  for ( uint i =0 ; i < additionalNodes_.size() ; ++i ) {
    if (additionalNodes_[i].second == searchname )
      return true;
  }
259

Jan Möbius's avatar
 
Jan Möbius committed
260 261 262
  return false;
}

263

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