15 #include "vrmlNodeType.h" 17 #include "vrmlParser.h" 30 output_array(ostream &out,
const MFArray *mf,
31 int type,
int indent_level,
int items_per_row) {
36 MFArray::const_iterator mi;
38 for (mi = mf->begin(); mi != mf->end(); ++mi) {
41 indent(out, indent_level + 2);
43 output_value(out, (*mi), type, indent_level + 2);
44 if (++col >= items_per_row) {
51 indent(out, indent_level) <<
"]";
61 return out << (value._sfbool ?
"TRUE" :
"FALSE");
65 return out << value._sffloat;
68 return out << value._sfint32;
73 for (
const char *p = value._sfstring; *p !=
'\0'; p++) {
84 return out << value._sfvec[0] <<
" " << value._sfvec[1];
88 return out << value._sfvec[0] <<
" " << value._sfvec[1] <<
" " 92 return out << value._sfvec[0] <<
" " << value._sfvec[1] <<
" " 93 << value._sfvec[2] <<
" " << value._sfvec[3];
96 switch (value._sfnode._type) {
97 case SFNodeRef::T_null:
100 case SFNodeRef::T_unnamed:
101 nassertr(value._sfnode._p != NULL, out);
102 value._sfnode._p->output(out, indent);
105 case SFNodeRef::T_def:
106 out <<
"DEF " << value._sfnode._name <<
" ";
107 value._sfnode._p->output(out, indent);
110 case SFNodeRef::T_use:
111 return out <<
"USE " << value._sfnode._name;
113 return out <<
"(invalid)";
116 return out <<
"(image)";
119 return output_array(out, value._mf, SFCOLOR, indent, 1);
122 return output_array(out, value._mf, SFFLOAT, indent, 5);
125 return output_array(out, value._mf, SFINT32, indent, 10);
128 return output_array(out, value._mf, SFROTATION, indent, 1);
131 return output_array(out, value._mf, SFSTRING, indent, 1);
134 return output_array(out, value._mf, SFVEC2F, indent, 1);
137 return output_array(out, value._mf, SFVEC3F, indent, 1);
140 return output_array(out, value._mf, SFNODE, indent, 1);
143 return out <<
"(unknown)";
146 VrmlNodeType::VrmlNodeType(
const char *nm)
148 nassertv(nm != NULL);
152 VrmlNodeType::~VrmlNodeType()
157 plist<NameTypeRec*>::iterator i;
159 for (i = eventIns.begin(); i != eventIns.end(); i++) {
164 for (i = eventOuts.begin(); i != eventOuts.end(); i++) {
169 for (i = fields.begin(); i != fields.end(); i++) {
179 if (find(_type->getName()) != NULL) {
180 cerr <<
"PROTO " << _type->getName() <<
" already defined\n";
183 typeList.push_front(_type);
192 VrmlNodeType::pushNameSpace()
194 typeList.push_front(NULL);
198 VrmlNodeType::popNameSpace()
201 plist<VrmlNodeType*>::iterator i;
202 for (i = typeList.begin(); i != typeList.end();) {
205 typeList.pop_front();
207 if (nodeType == NULL) {
221 VrmlNodeType::find(
const char *_name)
224 plist<VrmlNodeType*>::iterator i;
225 for (i = typeList.begin(); i != typeList.end(); i++) {
227 if (nt != NULL && strcmp(nt->getName(),_name) == 0) {
235 VrmlNodeType::addEventIn(
const char *name,
int type,
238 add(eventIns, name, type, dflt);
241 VrmlNodeType::addEventOut(
const char *name,
int type,
244 add(eventOuts, name, type, dflt);
247 VrmlNodeType::addField(
const char *name,
int type,
250 add(fields, name, type, dflt);
253 VrmlNodeType::addExposedField(
const char *name,
int type,
257 add(fields, name, type, dflt);
258 sprintf(tmp,
"set_%s", name);
259 add(eventIns, tmp, type, dflt);
260 sprintf(tmp,
"%s_changed", name);
261 add(eventOuts, tmp, type, dflt);
268 NameTypeRec *r =
new NameTypeRec;
269 r->name = strdup(name);
274 memset(&r->dflt, 0,
sizeof(r->dflt));
280 VrmlNodeType::hasEventIn(
const char *name)
const 282 return has(eventIns, name);
286 VrmlNodeType::hasEventOut(
const char *name)
const 288 return has(eventOuts, name);
292 VrmlNodeType::hasField(
const char *name)
const 294 return has(fields, name);
298 VrmlNodeType::hasExposedField(
const char *name)
const 303 const NameTypeRec *base, *set_name, *name_changed;
305 base = has(fields, name);
307 sprintf(tmp,
"set_%s\n", name);
308 nassertr(strlen(tmp) < 1000, NULL);
309 set_name = has(eventIns, tmp);
311 sprintf(tmp,
"%s_changed\n", name);
312 nassertr(strlen(tmp) < 1000, NULL);
313 name_changed = has(eventOuts, tmp);
315 if (base == NULL || set_name == NULL || name_changed == NULL) {
319 if (base->type != set_name->type || base->type != name_changed->type) {
329 plist<NameTypeRec*>::const_iterator i;
330 for (i = recs.begin(); i != recs.end(); i++) {
331 if (strcmp((*i)->name, name) == 0)
This is our own Panda specialization on the default STL list.