122 lines
4.8 KiB
C++
122 lines
4.8 KiB
C++
// Filename: xFileDataNodeReference.cxx
|
|
// Created by: drose (08Oct04)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
|
//
|
|
// All use of this software is subject to the terms of the Panda 3d
|
|
// Software license. You should have received a copy of this license
|
|
// along with this source code; you will also find a current copy of
|
|
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
|
//
|
|
// To contact the maintainers of this program write to
|
|
// panda3d-general@lists.sourceforge.net .
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#include "xFileDataNodeReference.h"
|
|
#include "indent.h"
|
|
|
|
TypeHandle XFileDataNodeReference::_type_handle;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: XFileDataNodeReference::Constructor
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
XFileDataNodeReference::
|
|
XFileDataNodeReference(XFileDataNodeTemplate *object) :
|
|
XFileDataNode(object->get_x_file(), object->get_name(),
|
|
object->get_template()),
|
|
_object(object)
|
|
{
|
|
// We steal a copy of the referenced object's children. This is
|
|
// just a one-time copy, so if you go and change the list of
|
|
// children of the referenced object, it won't be reflected here in
|
|
// the reference. Since presumably the reference is only used when
|
|
// parsing static files, that shouldn't be a problem; but you do
|
|
// need to be aware of it.
|
|
_children = object->_children;
|
|
_objects = object->_objects;
|
|
_children_by_name = object->_children_by_name;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: XFileDataNodeReference::is_reference
|
|
// Access: Public, Virtual
|
|
// Description: Returns true if this node represents an indirect
|
|
// reference to an object defined previously in the
|
|
// file. References are generally transparent, so in
|
|
// most cases you never need to call this, unless you
|
|
// actually need to differentiate between references and
|
|
// instances; you can simply use the reference node as
|
|
// if it were itself the object it references.
|
|
//
|
|
// If this returns true, the node must be of type
|
|
// XFileDataNodeReference.
|
|
////////////////////////////////////////////////////////////////////
|
|
bool XFileDataNodeReference::
|
|
is_reference() const {
|
|
return true;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: XFileDataNodeReference::is_complex_object
|
|
// Access: Public, Virtual
|
|
// Description: Returns true if this kind of data object is a complex
|
|
// object that can hold nested data elements, false
|
|
// otherwise.
|
|
////////////////////////////////////////////////////////////////////
|
|
bool XFileDataNodeReference::
|
|
is_complex_object() const {
|
|
return true;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: XFileDataNodeReference::write_text
|
|
// Access: Public, Virtual
|
|
// Description: Writes a suitable representation of this node to an
|
|
// .x file in text mode.
|
|
////////////////////////////////////////////////////////////////////
|
|
void XFileDataNodeReference::
|
|
write_text(ostream &out, int indent_level) const {
|
|
indent(out, indent_level)
|
|
<< "{ " << _object->get_name() << " }\n";
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: XFileDataNodeReference::get_num_elements
|
|
// Access: Protected, Virtual
|
|
// Description: Returns the number of nested data elements within the
|
|
// object. This may be, e.g. the size of the array, if
|
|
// it is an array.
|
|
////////////////////////////////////////////////////////////////////
|
|
int XFileDataNodeReference::
|
|
get_num_elements() const {
|
|
return _object->size();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: XFileDataNodeReference::get_element
|
|
// Access: Protected, Virtual
|
|
// Description: Returns the nth nested data element within the
|
|
// object.
|
|
////////////////////////////////////////////////////////////////////
|
|
XFileDataObject *XFileDataNodeReference::
|
|
get_element(int n) {
|
|
return &((*_object)[n]);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: XFileDataNodeReference::get_element
|
|
// Access: Protected, Virtual
|
|
// Description: Returns the nested data element within the
|
|
// object that has the indicated name.
|
|
////////////////////////////////////////////////////////////////////
|
|
XFileDataObject *XFileDataNodeReference::
|
|
get_element(const string &name) {
|
|
return &((*_object)[name]);
|
|
}
|