00001 // Filename: animChannelScalarDynamic.cxx 00002 // Created by: drose (20Oct03) 00003 // 00004 //////////////////////////////////////////////////////////////////// 00005 // 00006 // PANDA 3D SOFTWARE 00007 // Copyright (c) Carnegie Mellon University. All rights reserved. 00008 // 00009 // All use of this software is subject to the terms of the revised BSD 00010 // license. You should have received a copy of this license along 00011 // with this source code in a file named "LICENSE." 00012 // 00013 //////////////////////////////////////////////////////////////////// 00014 00015 #include "animChannelScalarDynamic.h" 00016 #include "animBundle.h" 00017 #include "config_chan.h" 00018 #include "transformState.h" 00019 #include "pandaNode.h" 00020 #include "indent.h" 00021 #include "datagram.h" 00022 #include "datagramIterator.h" 00023 #include "bamReader.h" 00024 #include "bamWriter.h" 00025 00026 TypeHandle AnimChannelScalarDynamic::_type_handle; 00027 00028 //////////////////////////////////////////////////////////////////// 00029 // Function: AnimChannelScalarDynamic::Constructor 00030 // Access: Protected 00031 // Description: For use only with the bam reader. 00032 //////////////////////////////////////////////////////////////////// 00033 AnimChannelScalarDynamic:: 00034 AnimChannelScalarDynamic() { 00035 } 00036 00037 //////////////////////////////////////////////////////////////////// 00038 // Function: AnimChannelScalarDynamic::Copy Constructor 00039 // Access: Protected 00040 // Description: Creates a new AnimChannelScalarDynamic, just like 00041 // this one, without copying any children. The new copy 00042 // is added to the indicated parent. Intended to be 00043 // called by make_copy() only. 00044 //////////////////////////////////////////////////////////////////// 00045 AnimChannelScalarDynamic:: 00046 AnimChannelScalarDynamic(AnimGroup *parent, const AnimChannelScalarDynamic ©) : 00047 AnimChannelScalar(parent, copy), 00048 _value_node(copy._value_node), 00049 _value(copy._value), 00050 _last_value(NULL), 00051 _value_changed(true), 00052 _float_value(copy._float_value) 00053 { 00054 } 00055 00056 //////////////////////////////////////////////////////////////////// 00057 // Function: AnimChannelScalarDynamic::Constructor 00058 // Access: Public 00059 // Description: 00060 //////////////////////////////////////////////////////////////////// 00061 AnimChannelScalarDynamic:: 00062 AnimChannelScalarDynamic(const string &name) 00063 : AnimChannelScalar(name) 00064 { 00065 _last_value = _value = TransformState::make_identity(); 00066 _value_changed = true; 00067 _float_value = 0.0; 00068 } 00069 00070 //////////////////////////////////////////////////////////////////// 00071 // Function: AnimChannelScalarDynamic::has_changed 00072 // Access: Public, Virtual 00073 // Description: Returns true if the value has changed since the last 00074 // call to has_changed(). last_frame is the frame 00075 // number of the last call; this_frame is the current 00076 // frame number. 00077 //////////////////////////////////////////////////////////////////// 00078 bool AnimChannelScalarDynamic:: 00079 has_changed(int, double, int, double) { 00080 if (_value_node != (PandaNode *)NULL) { 00081 _value = _value_node->get_transform(); 00082 bool has_changed = (_value != _last_value); 00083 _last_value = _value; 00084 return has_changed; 00085 00086 } else { 00087 bool has_changed = _value_changed; 00088 _value_changed = false; 00089 return has_changed; 00090 } 00091 } 00092 00093 //////////////////////////////////////////////////////////////////// 00094 // Function: AnimChannelScalarDynamic::get_value 00095 // Access: Public, Virtual 00096 // Description: Gets the value of the channel at the indicated frame. 00097 //////////////////////////////////////////////////////////////////// 00098 void AnimChannelScalarDynamic:: 00099 get_value(int, PN_stdfloat &value) { 00100 if (_value_node != (PandaNode *)NULL) { 00101 value = _value->get_pos()[0]; 00102 00103 } else { 00104 value = _float_value; 00105 } 00106 } 00107 00108 //////////////////////////////////////////////////////////////////// 00109 // Function: AnimChannelScalarDynamic::set_value 00110 // Access: Published 00111 // Description: Explicitly sets the value. 00112 //////////////////////////////////////////////////////////////////// 00113 void AnimChannelScalarDynamic:: 00114 set_value(PN_stdfloat value) { 00115 _float_value = value; 00116 _value_node.clear(); 00117 _value_changed = true; 00118 } 00119 00120 //////////////////////////////////////////////////////////////////// 00121 // Function: AnimChannelScalarDynamic::set_value_node 00122 // Access: Published 00123 // Description: Specifies a node whose transform will be queried each 00124 // frame to implicitly specify the transform of this 00125 // joint. 00126 //////////////////////////////////////////////////////////////////// 00127 void AnimChannelScalarDynamic:: 00128 set_value_node(PandaNode *value_node) { 00129 if (_value_node == (PandaNode *)NULL) { 00130 _last_value = TransformState::make_pos(LVecBase3(_float_value, 0.0f, 0.0f)); 00131 } 00132 00133 _value_node = value_node; 00134 00135 if (_value_node != (PandaNode *)NULL) { 00136 _value = _value_node->get_transform(); 00137 } 00138 } 00139 00140 //////////////////////////////////////////////////////////////////// 00141 // Function: AnimChannelScalarDynamic::make_copy 00142 // Access: Protected, Virtual 00143 // Description: Returns a copy of this object, and attaches it to the 00144 // indicated parent (which may be NULL only if this is 00145 // an AnimBundle). Intended to be called by 00146 // copy_subtree() only. 00147 //////////////////////////////////////////////////////////////////// 00148 AnimGroup *AnimChannelScalarDynamic:: 00149 make_copy(AnimGroup *parent) const { 00150 return new AnimChannelScalarDynamic(parent, *this); 00151 } 00152 00153 00154 //////////////////////////////////////////////////////////////////// 00155 // Function: AnimChannelScalarDynamic::write_datagram 00156 // Access: Public 00157 // Description: Function to write the important information in 00158 // the particular object to a Datagram 00159 //////////////////////////////////////////////////////////////////// 00160 void AnimChannelScalarDynamic:: 00161 write_datagram(BamWriter *manager, Datagram &dg) { 00162 AnimChannelScalar::write_datagram(manager, dg); 00163 manager->write_pointer(dg, _value_node); 00164 manager->write_pointer(dg, _value); 00165 dg.add_stdfloat(_float_value); 00166 } 00167 00168 //////////////////////////////////////////////////////////////////// 00169 // Function: AnimChannelScalarDynamic::complete_pointers 00170 // Access: Public, Virtual 00171 // Description: Receives an array of pointers, one for each time 00172 // manager->read_pointer() was called in fillin(). 00173 // Returns the number of pointers processed. 00174 //////////////////////////////////////////////////////////////////// 00175 int AnimChannelScalarDynamic:: 00176 complete_pointers(TypedWritable **p_list, BamReader *manager) { 00177 int pi = AnimChannelScalar::complete_pointers(p_list, manager); 00178 00179 // Get the _value_node and _value pointers. 00180 _value_node = DCAST(PandaNode, p_list[pi++]); 00181 _value = DCAST(TransformState, p_list[pi++]); 00182 00183 return pi; 00184 } 00185 00186 //////////////////////////////////////////////////////////////////// 00187 // Function: AnimChannelScalarDynamic::fillin 00188 // Access: Public 00189 // Description: Function that reads out of the datagram (or asks 00190 // manager to read) all of the data that is needed to 00191 // re-create this object and stores it in the appropiate 00192 // place 00193 //////////////////////////////////////////////////////////////////// 00194 void AnimChannelScalarDynamic:: 00195 fillin(DatagramIterator &scan, BamReader *manager) { 00196 AnimChannelScalar::fillin(scan, manager); 00197 00198 // Read the _value_node and _value pointers. 00199 manager->read_pointer(scan); 00200 manager->read_pointer(scan); 00201 00202 _float_value = scan.get_stdfloat(); 00203 } 00204 00205 //////////////////////////////////////////////////////////////////// 00206 // Function: AnimChannelScalarDynamic::make_AnimChannelScalarDynamic 00207 // Access: Public 00208 // Description: Factory method to generate a AnimChannelScalarDynamic object 00209 //////////////////////////////////////////////////////////////////// 00210 TypedWritable *AnimChannelScalarDynamic:: 00211 make_AnimChannelScalarDynamic(const FactoryParams ¶ms) { 00212 AnimChannelScalarDynamic *me = new AnimChannelScalarDynamic; 00213 DatagramIterator scan; 00214 BamReader *manager; 00215 00216 parse_params(params, scan, manager); 00217 me->fillin(scan, manager); 00218 return me; 00219 } 00220 00221 //////////////////////////////////////////////////////////////////// 00222 // Function: AnimChannelScalarDynamic::register_with_factory 00223 // Access: Public, Static 00224 // Description: Factory method to generate a AnimChannelScalarDynamic object 00225 //////////////////////////////////////////////////////////////////// 00226 void AnimChannelScalarDynamic:: 00227 register_with_read_factory() { 00228 BamReader::get_factory()->register_factory(get_class_type(), make_AnimChannelScalarDynamic); 00229 } 00230 00231 00232 00233