00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "eggTable.h"
00016
00017 #include "string_utils.h"
00018 #include "indent.h"
00019
00020 TypeHandle EggTable::_type_handle;
00021
00022
00023
00024
00025
00026
00027
00028 bool EggTable::
00029 has_transform() const {
00030 const_iterator ci;
00031
00032 for (ci = begin(); ci != end(); ++ci) {
00033 EggNode *child = (*ci);
00034 if (child->is_anim_matrix()) {
00035 return true;
00036 }
00037 }
00038
00039 return false;
00040 }
00041
00042
00043
00044
00045
00046
00047
00048 void EggTable::
00049 write(ostream &out, int indent_level) const {
00050 test_under_integrity();
00051
00052 switch (get_table_type()) {
00053 case TT_table:
00054 write_header(out, indent_level, "<Table>");
00055 break;
00056
00057 case TT_bundle:
00058 write_header(out, indent_level, "<Bundle>");
00059 break;
00060
00061 default:
00062
00063 nassertv(false);
00064 }
00065
00066 EggGroupNode::write(out, indent_level + 2);
00067 indent(out, indent_level) << "}\n";
00068 }
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 EggTable::TableType EggTable::
00079 string_table_type(const string &string) {
00080 if (cmp_nocase_uh(string, "table") == 0) {
00081 return TT_table;
00082 } else if (cmp_nocase_uh(string, "bundle") == 0) {
00083 return TT_bundle;
00084 } else {
00085 return TT_invalid;
00086 }
00087 }
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 void EggTable::
00103 r_transform(const LMatrix4d &mat, const LMatrix4d &inv,
00104 CoordinateSystem to_cs) {
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 if (has_transform()) {
00119
00120
00121
00122
00123 LMatrix4d mat1 = mat;
00124 LMatrix4d inv1 = inv;
00125
00126
00127
00128
00129 mat1.set_row(3, LVector3d(0.0, 0.0, 0.0));
00130 inv1.set_row(3, LVector3d(0.0, 0.0, 0.0));
00131
00132 iterator ci;
00133 for (ci = begin(); ci != end(); ++ci) {
00134 EggNode *child = (*ci);
00135 if (child->is_anim_matrix()) {
00136 child->r_transform(mat, inv, to_cs);
00137 } else {
00138 child->r_transform(mat1, inv1, to_cs);
00139 }
00140 }
00141
00142 } else {
00143
00144
00145 EggGroupNode::r_transform(mat, inv, to_cs);
00146 }
00147 }
00148
00149
00150
00151
00152
00153
00154 ostream &operator << (ostream &out, EggTable::TableType t) {
00155 switch (t) {
00156 case EggTable::TT_invalid:
00157 return out << "invalid table";
00158 case EggTable::TT_table:
00159 return out << "table";
00160 case EggTable::TT_bundle:
00161 return out << "bundle";
00162 }
00163
00164 nassertr(false, out);
00165 return out << "(**invalid**)";
00166 }