31 operator << (std::ostream &out, Fog::Mode mode) {
34 return out <<
"linear";
36 case Fog::M_exponential:
37 return out <<
"exponential";
39 case Fog::M_exponential_squared:
40 return out <<
"exponential-squared";
43 return out <<
"**invalid**(" << (int)mode <<
")";
50 Fog(
const std::string &name) :
54 _color.set(1.0f, 1.0f, 1.0f, 1.0f);
55 _linear_onset_point.set(0.0f, 0.0f, 0.0f);
56 _linear_opaque_point.set(0.0f, 100.0f, 0.0f);
58 _linear_fallback_cosa = -1.0f;
59 _linear_fallback_onset = 0.0f;
60 _linear_fallback_opaque = 0.0f;
61 _transformed_onset = 0.0f;
62 _transformed_opaque = 0.0f;
69 Fog(
const Fog ©) :
74 _linear_onset_point = copy._linear_onset_point;
75 _linear_opaque_point = copy._linear_opaque_point;
76 _exp_density = copy._exp_density;
77 _linear_fallback_cosa = copy._linear_fallback_cosa;
78 _linear_fallback_onset = copy._linear_fallback_onset;
79 _linear_fallback_opaque = copy._linear_fallback_opaque;
80 _transformed_onset = copy._transformed_onset;
81 _transformed_opaque = copy._transformed_opaque;
98 return new Fog(*
this);
107 _linear_onset_point = _linear_onset_point * mat;
108 _linear_opaque_point = _linear_opaque_point * mat;
115 output(std::ostream &out)
const {
116 out <<
"fog: " << _mode;
119 out <<
"(" << _linear_onset_point <<
") -> ("
120 << _linear_opaque_point <<
")";
124 case M_exponential_squared:
137 LVector3 forward = LVector3::forward();
144 camera_transform->invert_compose(this_np.get_net_transform());
146 const LMatrix4 &mat = rel_transform->get_mat();
149 LVector3 fog_vector = (_linear_opaque_point - _linear_onset_point) * mat;
150 fog_vector.normalize();
151 PN_stdfloat cosa = fog_vector.dot(forward);
152 if (cabs(cosa) < _linear_fallback_cosa) {
154 _transformed_onset = _linear_fallback_onset;
155 _transformed_opaque = _linear_fallback_opaque;
158 _transformed_onset = forward.dot(_linear_onset_point * mat);
159 _transformed_opaque = forward.dot(_linear_opaque_point * mat);
164 _transformed_onset = forward.dot(_linear_onset_point);
165 _transformed_opaque = forward.dot(_linear_opaque_point);
174 onset = _transformed_onset;
175 opaque = _transformed_opaque;
195 _color.write_datagram(dg);
196 _linear_onset_point.write_datagram(dg);
197 _linear_opaque_point.write_datagram(dg);
216 node->fillin(scan, manager);
227 PandaNode::fillin(scan, manager);
230 _color.read_datagram(scan);
231 _linear_onset_point.read_datagram(scan);
232 _linear_opaque_point.read_datagram(scan);