open_toontown_panda3d/pandatool/src/xfile/xFileDataNodeReference.cxx

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]);
}