00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef DATANODE_H
00016 #define DATANODE_H
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #include "pandabase.h"
00045
00046 #include "pandaNode.h"
00047 #include "pointerTo.h"
00048
00049 class DataGraphTraverser;
00050 class DataNodeTransmit;
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 class EXPCL_PANDA_DGRAPH DataNode : public PandaNode {
00065 PUBLISHED:
00066 INLINE DataNode(const string &name);
00067
00068 protected:
00069 INLINE DataNode(const DataNode ©);
00070 public:
00071 virtual PandaNode *make_copy() const;
00072
00073 void transmit_data(DataGraphTraverser *trav,
00074 const DataNodeTransmit inputs[],
00075 DataNodeTransmit &output);
00076
00077 INLINE int get_num_inputs() const;
00078 INLINE int get_num_outputs() const;
00079
00080 PUBLISHED:
00081 void write_inputs(ostream &out) const;
00082 void write_outputs(ostream &out) const;
00083 void write_connections(ostream &out) const;
00084
00085 protected:
00086 int define_input(const string &name, TypeHandle data_type);
00087 int define_output(const string &name, TypeHandle data_type);
00088
00089 protected:
00090
00091 virtual void parents_changed();
00092
00093
00094 virtual void do_transmit_data(DataGraphTraverser *trav,
00095 const DataNodeTransmit &input,
00096 DataNodeTransmit &output);
00097
00098 private:
00099 void reconnect();
00100
00101 class WireDef {
00102 public:
00103 TypeHandle _data_type;
00104 int _index;
00105 };
00106
00107 typedef pmap<string, WireDef> Wires;
00108
00109 Wires _input_wires;
00110 Wires _output_wires;
00111
00112 class DataConnection {
00113 public:
00114 int _parent_index;
00115 int _output_index;
00116 int _input_index;
00117 };
00118 typedef pvector<DataConnection> DataConnections;
00119 DataConnections _data_connections;
00120
00121 public:
00122 virtual void write_datagram(BamWriter *manager, Datagram &dg);
00123
00124 protected:
00125 void fillin(DatagramIterator &scan, BamReader *manager);
00126
00127 public:
00128 static TypeHandle get_class_type() {
00129 return _type_handle;
00130 }
00131 static void init_type() {
00132 PandaNode::init_type();
00133 register_type(_type_handle, "DataNode",
00134 PandaNode::get_class_type());
00135 }
00136 virtual TypeHandle get_type() const {
00137 return get_class_type();
00138 }
00139 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
00140
00141 private:
00142 static TypeHandle _type_handle;
00143 };
00144
00145 #include "dataNode.I"
00146
00147 #endif