15 #include "xFileNode.h"
16 #include "windowsGuid.h"
18 #include "xLexerDefs.h"
19 #include "xFileParseData.h"
21 #include "xFileDataNodeTemplate.h"
23 #include "string_utils.h"
33 XFileNode(
XFile *x_file,
const string &name) :
37 if (x_file && x_file->_keep_names) {
40 set_name(make_nice_name(name));
62 ChildrenByName::const_iterator ni;
63 ni = _children_by_name.find(downcase(name));
64 if (ni != _children_by_name.end()) {
79 ChildrenByName::const_iterator ni;
80 ni = _children_by_name.find(downcase(name));
81 if (ni != _children_by_name.end()) {
96 for (
int i = 0; i < (int)_children.size(); i++) {
97 if (_children[i] == child) {
119 Children::const_iterator ci;
120 for (ci = _children.begin(); ci != _children.end(); ++ci) {
232 _children_by_name[downcase(node->get_name())] = (
int)_children.size();
235 _x_file->_nodes_by_guid[node->
get_guid()] = node;
237 if (node->
is_of_type(XFileDataNode::get_class_type())) {
240 _children.push_back(node);
253 _children_by_name.clear();
264 Children::const_iterator ci;
265 for (ci = _children.begin(); ci != _children.end(); ++ci) {
266 (*ci)->write_text(out, indent_level);
287 size_t &index,
size_t &sub_index)
const {
293 Children::const_iterator ci;
294 for (ci = _children.begin(); ci != _children.end(); ++ci) {
295 if (!(*ci)->repack_data(
object, parse_data_list,
296 prev_data, index, sub_index)) {
313 Children::const_iterator ci;
314 for (ci = _children.begin(); ci != _children.end(); ++ci) {
315 if (!(*ci)->fill_zero_data(
object)) {
334 if (other->get_type() != get_type()) {
448 double power,
const LRGBColor &specular_color,
457 (*node)[
"faceColor"][
"red"] = face_color[0];
458 (*node)[
"faceColor"][
"green"] = face_color[1];
459 (*node)[
"faceColor"][
"blue"] = face_color[2];
460 (*node)[
"faceColor"][
"alpha"] = face_color[3];
461 (*node)[
"power"] = power;
462 (*node)[
"specularColor"][
"red"] = specular_color[0];
463 (*node)[
"specularColor"][
"green"] = specular_color[1];
464 (*node)[
"specularColor"][
"blue"] = specular_color[2];
465 (*node)[
"emissiveColor"][
"red"] = emissive_color[0];
466 (*node)[
"emissiveColor"][
"green"] = emissive_color[1];
467 (*node)[
"emissiveColor"][
"blue"] = emissive_color[2];
539 xmat[10] = mat(2, 2);
540 xmat[11] = mat(2, 3);
542 xmat[12] = mat(3, 0);
543 xmat[13] = mat(3, 1);
544 xmat[14] = mat(3, 2);
545 xmat[15] = mat(3, 3);
560 string::const_iterator si;
561 for (si = str.begin(); si != str.end(); ++si) {
575 if (str.empty() || isdigit(str[0])) {
579 result =
'_' + result;
virtual const WindowsGuid & get_guid() const
If has_guid() returned true, returns the particular GUID associated with this node.
This is the base class for all three-component vectors and points.
This is our own Panda specialization on the default STL map.
This is a 4-by-4 transform matrix.
XFileDataNode * add_Mesh(const string &name)
Creates a new Mesh instance, as a child of this node.
bool is_of_type(TypeHandle handle) const
Returns true if the current object is or derives from the indicated type.
int get_num_children() const
Returns the list of children of this node.
This is an implementation of the Windows GUID object, used everywhere as a world-unique identifier fo...
XFileDataNode * add_MeshNormals(const string &name)
Creates a new MeshNormals instance, as a child of this node.
void add_child(XFileNode *node)
Adds the indicated node as a child of this node.
void zero_fill()
Fills the data node with zero-valued elements appropriate to the template.
bool has_name() const
Returns true if the Namable has a nonempty name set, false if the name is empty.
static XFileTemplate * find_standard_template(const string &name)
Returns the standard template associated with the indicated name, if any, or NULL if none...
virtual bool fill_zero_data(XFileDataObject *object) const
This is similar to repack_data(), except it is used to fill the initial values for a newly-created te...
This is a node which contains all of the data elements defined by a template.
XFileDataNode * add_MeshTextureCoords(const string &name)
Creates a new MeshTextureCoords instance, as a child of this node.
virtual bool is_standard_object(const string &template_name) const
Returns true if this node represents an instance of the standard template with the indicated name...
A single node of an X file.
A base class for all things which can have a name.
XFileDataNode * add_MeshVertexColors(const string &name)
Creates a new MeshVertexColors instance, as a child of this node.
XFileDataNode * add_TextureFilename(const string &name, const Filename &filename)
Creates a new TextureFilename instance, as a child of this node.
The name of a file, such as a texture file or an Egg file.
virtual bool repack_data(XFileDataObject *object, const XFileParseDataList &parse_data_list, PrevData &prev_data, size_t &index, size_t &sub_index) const
This is called on the template that defines an object, once the data for the object has been parsed...
XFileDataNode * add_Frame(const string &name)
Creates a new Frame instance, as a child of this node.
XFileDataNode * add_FrameTransformMatrix(const LMatrix4d &mat)
Creates a new FrameTransformMatrix instance, as a child of this node.
string to_os_specific() const
Converts the filename from our generic Unix-like convention (forward slashes starting with the root a...
A container for a pvector of the above objects.
XFileNode * find_descendent(const string &name) const
Returns the first child or descendent found with the indicated name after a depth-first search...
This is the base class for all three-component vectors and points.
virtual bool is_template_def() const
Returns true if this node represents the definition of some template.
virtual bool has_guid() const
Returns true if this node has a GUID associated.
virtual void write_text(ostream &out, int indent_level) const
Writes a suitable representation of this node to an .x file in text mode.
virtual bool is_reference() const
Returns true if this node represents an indirect reference to an object defined previously in the fil...
virtual void clear()
Removes all children from the node, and otherwise resets it to its initial state. ...
static string make_nice_name(const string &str)
Transforms the indicated egg name to a name that is acceptable for a node in the X File format...
This is an abstract base class for an XFileNode which is also an XFileDataObject. ...
virtual bool matches(const XFileNode *other) const
Returns true if the node, particularly a template node, is structurally equivalent to the other node ...
XFileDataNode * add_MeshMaterialList(const string &name)
Creates a new MeshMaterialList instance, as a child of this node.
This represents the complete contents of an X file (file.x) in memory.
XFileNode * find_child(const string &name) const
Returns the child with the indicated name, if any, or NULL if none.
virtual bool is_object() const
Returns true if this node represents a data object that is the instance of some template, or false otherwise.
A template definition in the X file.
int find_child_index(const string &name) const
Returns the index number of the child with the indicated name, if any, or -1 if none.
TypeHandle is the identifier used to differentiate C++ class types.
XFileDataNode * add_Material(const string &name, const LColor &face_color, double power, const LRGBColor &specular_color, const LRGBColor &emissive_color)
Creates a new Material instance, as a child of this node.
XFileNode * get_child(int n) const
Returns the nth child of this node.
The abstract base class for a number of different types of data elements that may be stored in the X ...