Panda3D
Loading...
Searching...
No Matches
eggGroupUniquifier.cxx
Go to the documentation of this file.
1/**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file eggGroupUniquifier.cxx
10 * @author drose
11 * @date 2001-02-22
12 */
13
14#include "eggGroupUniquifier.h"
15#include "eggGroup.h"
16
17#include "pnotify.h"
18
19#include <ctype.h>
20
21using std::string;
22
23TypeHandle EggGroupUniquifier::_type_handle;
24
25
26/**
27 * If filter_names is true, then the group names will be coerced into a fairly
28 * safe, standard convention that uses no characters other than a-z, A-Z, 0-9,
29 * and underscore. If filter_names is false, the group names will be left
30 * unchanged.
31 */
33EggGroupUniquifier(bool filter_names)
34 : _filter_names(filter_names)
35{
36}
37
38/**
39 * Returns the category name into which the given node should be collected, or
40 * the empty string if the node's name should be left alone.
41 */
43get_category(EggNode *node) {
44 if (node->is_of_type(EggGroup::get_class_type()) && node->has_name()) {
45 return "group";
46 }
47
48 return string();
49}
50
51/**
52 * Returns the name of the given node, or at least the name it should be.
53 * This provides a hook to adjust the name before attempting to uniquify it,
54 * if desired, for instance to remove invalid characters.
55 */
57filter_name(EggNode *node) {
58 string name = node->get_name();
59 if (!_filter_names) {
60 return name;
61 }
62 nassertr(!name.empty(), string());
63
64 string result;
65
66 // First, replace characters not A-Z, a-z, 0-9, or '_' with underscore, and
67 // remove consecutive underscores.
68 string::const_iterator pi;
69 bool last_underscore = false;
70 for (pi = name.begin(); pi != name.end(); ++pi) {
71 if (isalnum(*pi)) {
72 result += *pi;
73 last_underscore = false;
74
75 } else if (!last_underscore) {
76 result += '_';
77 last_underscore = true;
78 }
79 }
80
81 // Next, ensure the name does not begin with a digit.
82 nassertr(!result.empty(), string());
83 if (isdigit(result[0])) {
84 result = "_" + result;
85 }
86
87 return result;
88}
89
90/**
91 * Generates a new name for the given node when its existing name clashes with
92 * some other node. This function will be called repeatedly, if necessary,
93 * until it returns a name that actually is unique.
94 *
95 * The category is the string returned by get_category(), and index is a
96 * uniquely-generated number that may be useful for synthesizing the name.
97 */
99generate_name(EggNode *node, const string &category, int index) {
100 std::ostringstream str;
101 str << node->get_name() << "_group" << index;
102 return str.str();
103}
virtual std::string generate_name(EggNode *node, const std::string &category, int index)
Generates a new name for the given node when its existing name clashes with some other node.
virtual std::string filter_name(EggNode *node)
Returns the name of the given node, or at least the name it should be.
EggGroupUniquifier(bool filter_names=true)
If filter_names is true, then the group names will be coerced into a fairly safe, standard convention...
virtual std::string get_category(EggNode *node)
Returns the category name into which the given node should be collected, or the empty string if the n...
A base class for things that may be directly added into the egg hierarchy.
Definition eggNode.h:36
bool has_name() const
Returns true if the Namable has a nonempty name set, false if the name is empty.
Definition namable.I:44
TypeHandle is the identifier used to differentiate C++ class types.
Definition typeHandle.h:81
bool is_of_type(TypeHandle handle) const
Returns true if the current object is or derives from the indicated type.
Definition typedObject.I:28
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.