Panda3D
audioVolumeAttrib.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 audioVolumeAttrib.cxx
10  * @author darren
11  * @date 2006-12-15
12  */
13 
14 #include "audioVolumeAttrib.h"
16 #include "dcast.h"
17 #include "bamReader.h"
18 #include "bamWriter.h"
19 #include "datagram.h"
20 #include "datagramIterator.h"
21 #include "config_pgraph.h"
22 
23 CPT(RenderAttrib) AudioVolumeAttrib::_identity_attrib;
24 TypeHandle AudioVolumeAttrib::_type_handle;
25 int AudioVolumeAttrib::_attrib_slot;
26 
27 /**
28  * Use AudioVolumeAttrib::make() to construct a new AudioVolumeAttrib object.
29  */
30 AudioVolumeAttrib::
31 AudioVolumeAttrib(bool off, PN_stdfloat volume) :
32  _off(off),
33  _volume(volume)
34 {
35  nassertv(_volume >= 0.f);
36  _has_volume = !IS_NEARLY_EQUAL(_volume, 1.0f);
37 }
38 
39 /**
40  * Constructs an identity audio volume attrib.
41  */
42 CPT(RenderAttrib) AudioVolumeAttrib::
43 make_identity() {
44  // We make identity a special case and store a pointer forever once we find
45  // it the first time.
46  if (_identity_attrib == nullptr) {
47  AudioVolumeAttrib *attrib = new AudioVolumeAttrib(false, 1.0f);;
48  _identity_attrib = return_new(attrib);
49  }
50 
51  return _identity_attrib;
52 }
53 
54 /**
55  * Constructs a new AudioVolumeAttrib object that indicates audio volume
56  * should be scaled by the indicated factor.
57  */
58 CPT(RenderAttrib) AudioVolumeAttrib::
59 make(PN_stdfloat volume) {
60  AudioVolumeAttrib *attrib = new AudioVolumeAttrib(false, volume);
61  return return_new(attrib);
62 }
63 
64 /**
65  * Constructs a new AudioVolumeAttrib object that ignores any
66  * AudioVolumeAttrib inherited from above. You may also specify an additional
67  * volume scale to apply to geometry below (using set_volume()).
68  */
69 CPT(RenderAttrib) AudioVolumeAttrib::
70 make_off() {
71  AudioVolumeAttrib *attrib =
72  new AudioVolumeAttrib(true, 1.0f);
73  return return_new(attrib);
74 }
75 
76 /**
77  * Returns a RenderAttrib that corresponds to whatever the standard default
78  * properties for render attributes of this type ought to be.
79  */
80 CPT(RenderAttrib) AudioVolumeAttrib::
81 make_default() {
82  return return_new(new AudioVolumeAttrib(false, 1.0f));
83 }
84 
85 /**
86  * Returns a new AudioVolumeAttrib, just like this one, but with the volume
87  * changed to the indicated value.
88  */
89 CPT(RenderAttrib) AudioVolumeAttrib::
90 set_volume(PN_stdfloat volume) const {
91  AudioVolumeAttrib *attrib = new AudioVolumeAttrib(*this);
92  assert(volume >= 0.f);
93  attrib->_volume = volume;
94  attrib->_has_volume = !IS_NEARLY_EQUAL(volume, 1.0f);
95  return return_new(attrib);
96 }
97 
98 /**
99  *
100  */
101 void AudioVolumeAttrib::
102 output(std::ostream &out) const {
103  out << get_type() << ":";
104  if (is_off()) {
105  out << "off";
106  }
107  if (has_volume()) {
108  out << "(" << get_volume() << ")";
109 
110  } else if (!is_off()) {
111  out << "identity";
112  }
113 }
114 
115 /**
116  * Intended to be overridden by derived AudioVolumeAttrib types to return a
117  * unique number indicating whether this AudioVolumeAttrib is equivalent to
118  * the other one.
119  *
120  * This should return 0 if the two AudioVolumeAttrib objects are equivalent, a
121  * number less than zero if this one should be sorted before the other one,
122  * and a number greater than zero otherwise.
123  *
124  * This will only be called with two AudioVolumeAttrib objects whose
125  * get_type() functions return the same.
126  */
127 int AudioVolumeAttrib::
128 compare_to_impl(const RenderAttrib *other) const {
129  const AudioVolumeAttrib *ta = (const AudioVolumeAttrib *)other;
130 
131  if (_off != ta->_off) {
132  return (int)_off - (int)ta->_off;
133  }
134 
135  if (_volume != ta->_volume) {
136  return _volume < ta->_volume ? -1 : 1;
137  }
138 
139  return 0;
140 }
141 
142 /**
143  * Intended to be overridden by derived RenderAttrib types to return a unique
144  * hash for these particular properties. RenderAttribs that compare the same
145  * with compare_to_impl(), above, should return the same hash; RenderAttribs
146  * that compare differently should return a different hash.
147  */
148 size_t AudioVolumeAttrib::
149 get_hash_impl() const {
150  size_t hash = 0;
151  hash = int_hash::add_hash(hash, (int)_off);
152  hash = float_hash().add_hash(hash, _volume);
153  return hash;
154 }
155 
156 /**
157  * Intended to be overridden by derived RenderAttrib types to specify how two
158  * consecutive RenderAttrib objects of the same type interact.
159  *
160  * This should return the result of applying the other RenderAttrib to a node
161  * in the scene graph below this RenderAttrib, which was already applied. In
162  * most cases, the result is the same as the other RenderAttrib (that is, a
163  * subsequent RenderAttrib completely replaces the preceding one). On the
164  * other hand, some kinds of RenderAttrib (for instance, ColorTransformAttrib)
165  * might combine in meaningful ways.
166  */
167 CPT(RenderAttrib) AudioVolumeAttrib::
168 compose_impl(const RenderAttrib *other) const {
169  const AudioVolumeAttrib *ta = (const AudioVolumeAttrib *)other;
170 
171  if (ta->is_off()) {
172  return ta;
173  }
174 
175  AudioVolumeAttrib *attrib = new AudioVolumeAttrib(is_off(), ta->_volume * _volume);
176  return return_new(attrib);
177 }
178 
179 /**
180  * Intended to be overridden by derived RenderAttrib types to specify how two
181  * consecutive RenderAttrib objects of the same type interact.
182  *
183  * See invert_compose() and compose_impl().
184  */
185 CPT(RenderAttrib) AudioVolumeAttrib::
186 invert_compose_impl(const RenderAttrib *other) const {
187  if (is_off()) {
188  return other;
189  }
190  const AudioVolumeAttrib *ta = (const AudioVolumeAttrib *)other;
191 
192  PN_stdfloat new_volume = _volume == 0.0f ? 1.0f : ta->_volume / _volume;
193 
194  AudioVolumeAttrib *attrib = new AudioVolumeAttrib(false, new_volume);
195  return return_new(attrib);
196 }
197 
198 /**
199  * Tells the BamReader how to create objects of type AudioVolumeAttrib.
200  */
201 void AudioVolumeAttrib::
202 register_with_read_factory() {
203  BamReader::get_factory()->register_factory(get_class_type(), make_from_bam);
204 }
205 
206 /**
207  * Writes the contents of this object to the datagram for shipping out to a
208  * Bam file.
209  */
212  RenderAttrib::write_datagram(manager, dg);
213 
214  // We cheat, and modify the bam stream without upping the bam version. We
215  // can do this since we know that no existing bam files have an
216  // AudioVolumeAttrib in them.
217  dg.add_bool(_off);
218  dg.add_stdfloat(_volume);
219 }
220 
221 /**
222  * This function is called by the BamReader's factory when a new object of
223  * type AudioVolumeAttrib is encountered in the Bam file. It should create
224  * the AudioVolumeAttrib and extract its information from the file.
225  */
226 TypedWritable *AudioVolumeAttrib::
227 make_from_bam(const FactoryParams &params) {
228  AudioVolumeAttrib *attrib = new AudioVolumeAttrib(false, 1.0f);
229  DatagramIterator scan;
230  BamReader *manager;
231 
232  parse_params(params, scan, manager);
233  attrib->fillin(scan, manager);
234 
235  return attrib;
236 }
237 
238 /**
239  * This internal function is called by make_from_bam to read in all of the
240  * relevant data from the BamFile for the new AudioVolumeAttrib.
241  */
242 void AudioVolumeAttrib::
243 fillin(DatagramIterator &scan, BamReader *manager) {
244  RenderAttrib::fillin(scan, manager);
245 
246  _off = scan.get_bool();
247  _volume = scan.get_stdfloat();
248  nassertv(_volume >= 0.f);
249  _has_volume = !IS_NEARLY_EQUAL(_volume, 1.0f);
250 }
AudioVolumeAttrib::is_off
bool is_off() const
Returns true if the AudioVolumeAttrib will ignore any color scales inherited from above,...
Definition: audioVolumeAttrib.I:32
CPT
CPT(RenderAttrib) AudioVolumeAttrib
Constructs an identity audio volume attrib.
Definition: audioVolumeAttrib.cxx:42
DatagramIterator
A class to retrieve the individual data elements previously stored in a Datagram.
Definition: datagramIterator.h:27
dcast.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
BamReader
This is the fundamental interface for extracting binary objects from a Bam file, as generated by a Ba...
Definition: bamReader.h:110
RenderAttrib::write_datagram
virtual void write_datagram(BamWriter *manager, Datagram &dg)
Writes the contents of this object to the datagram for shipping out to a Bam file.
Definition: renderAttrib.cxx:526
BamWriter
This is the fundamental interface for writing binary objects to a Bam file, to be extracted later by ...
Definition: bamWriter.h:63
RenderAttrib
This is the base class for a number of render attributes (other than transform) that may be set on sc...
Definition: renderAttrib.h:51
floating_point_hash
This hash_compare class hashes a float or a double.
Definition: stl_compares.h:140
BamReader::get_factory
static WritableFactory * get_factory()
Returns the global WritableFactory for generating TypedWritable objects.
Definition: bamReader.I:177
bamReader.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
TypedWritable
Base class for objects that can be written to and read from Bam files.
Definition: typedWritable.h:35
Datagram
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
Definition: datagram.h:38
DatagramIterator::get_stdfloat
PN_stdfloat get_stdfloat()
Extracts either a 32-bit or a 64-bit floating-point number, according to Datagram::set_stdfloat_doubl...
Definition: datagramIterator.I:242
AudioVolumeAttrib::write_datagram
virtual void write_datagram(BamWriter *manager, Datagram &dg)
Writes the contents of this object to the datagram for shipping out to a Bam file.
Definition: audioVolumeAttrib.cxx:211
Datagram::add_stdfloat
void add_stdfloat(PN_stdfloat value)
Adds either a 32-bit or a 64-bit floating-point number, according to set_stdfloat_double().
Definition: datagram.I:133
TypeHandle
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
DatagramIterator::get_bool
bool get_bool()
Extracts a boolean value.
Definition: datagramIterator.I:48
FactoryParams
An instance of this class is passed to the Factory when requesting it to do its business and construc...
Definition: factoryParams.h:36
datagram.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
Factory::register_factory
void register_factory(TypeHandle handle, CreateFunc *func, void *user_data=nullptr)
Registers a new kind of thing the Factory will be able to create.
Definition: factory.I:73
integer_hash::add_hash
static size_t add_hash(size_t start, const Key &key)
Adds the indicated key into a running hash.
Definition: stl_compares.I:101
floating_point_hash::add_hash
size_t add_hash(size_t start, const Key &key) const
Adds the indicated key into a running hash.
Definition: stl_compares.I:149
Datagram::add_bool
void add_bool(bool value)
Adds a boolean value to the datagram.
Definition: datagram.I:34
audioVolumeAttrib.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
datagramIterator.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
bamWriter.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
AudioVolumeAttrib
Applies a scale to audio volume for positional sounds in the scene graph.
Definition: audioVolumeAttrib.h:27
graphicsStateGuardianBase.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
AudioVolumeAttrib::get_volume
get_volume
Returns the volume to be applied to sounds.
Definition: audioVolumeAttrib.h:44
config_pgraph.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
parse_params
void parse_params(const FactoryParams &params, DatagramIterator &scan, BamReader *&manager)
Takes in a FactoryParams, passed from a WritableFactory into any TypedWritable's make function,...
Definition: bamReader.I:275
AudioVolumeAttrib::has_volume
has_volume
Returns true if the AudioVolumeAttrib has a non-identity volume, false otherwise (in which case it mi...
Definition: audioVolumeAttrib.h:44