149 lines
4.5 KiB
C++
149 lines
4.5 KiB
C++
// Filename: fog.h
|
|
// Created by: drose (14Mar02)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
|
|
//
|
|
// All use of this software is subject to the terms of the Panda 3d
|
|
// Software license. You should have received a copy of this license
|
|
// along with this source code; you will also find a current copy of
|
|
// the license at http://www.panda3d.org/license.txt .
|
|
//
|
|
// To contact the maintainers of this program write to
|
|
// panda3d@yahoogroups.com .
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef FOG_H
|
|
#define FOG_H
|
|
|
|
#include "pandabase.h"
|
|
|
|
#include "pandaNode.h"
|
|
#include "luse.h"
|
|
#include "cmath.h"
|
|
#include "deg_2_rad.h"
|
|
|
|
class TransformState;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Class : Fog
|
|
// Description : Specifies how atmospheric fog effects are applied to
|
|
// geometry. The Fog object is now a PandaNode, which
|
|
// means it can be used similarly to a Light to define
|
|
// effects relative to a particular coordinate system
|
|
// within the scene graph.
|
|
//
|
|
// In exponential mode, the fog effects are always
|
|
// camera-relative, and it does not matter where the Fog
|
|
// node is parented. However, in linear mode, the onset
|
|
// and opaque distances are defined as offsets along the
|
|
// local forward axis (e.g. the Y axis). This allows
|
|
// the fog effect to be localized to a particular region
|
|
// in space, rather than always camera-relative. If the
|
|
// fog object is not parented to any node, it is used to
|
|
// generate traditonal camera-relative fog, as if it
|
|
// were parented to the camera.
|
|
////////////////////////////////////////////////////////////////////
|
|
class EXPCL_PANDA Fog : public PandaNode {
|
|
PUBLISHED:
|
|
Fog(const string &name);
|
|
|
|
protected:
|
|
Fog(const Fog ©);
|
|
|
|
public:
|
|
virtual ~Fog();
|
|
|
|
virtual PandaNode *make_copy() const;
|
|
virtual void xform(const LMatrix4f &mat);
|
|
|
|
PUBLISHED:
|
|
enum Mode {
|
|
M_linear, // f = (end - z) / (end - start)
|
|
M_exponential, // f = e^(-density * z)
|
|
M_exponential_squared // f = e^((-density * z)^2)
|
|
};
|
|
|
|
INLINE Mode get_mode() const;
|
|
INLINE void set_mode(Mode mode);
|
|
|
|
INLINE const Colorf &get_color() const;
|
|
INLINE void set_color(float r, float g, float b);
|
|
INLINE void set_color(const Colorf &color);
|
|
|
|
INLINE void set_linear_range(float onset, float opaque);
|
|
|
|
INLINE const LPoint3f &get_linear_onset_point() const;
|
|
INLINE void set_linear_onset_point(float x, float y, float z);
|
|
INLINE void set_linear_onset_point(const LPoint3f &linear_onset_point);
|
|
|
|
INLINE const LPoint3f &get_linear_opaque_point() const;
|
|
INLINE void set_linear_opaque_point(const LPoint3f &linear_opaque_point);
|
|
INLINE void set_linear_opaque_point(float x, float y, float z);
|
|
|
|
INLINE void set_linear_fallback(float angle, float onset, float opaque);
|
|
|
|
INLINE float get_exp_density() const;
|
|
INLINE void set_exp_density(float exp_density);
|
|
|
|
void output(ostream &out) const;
|
|
|
|
public:
|
|
void adjust_to_camera(const TransformState *camera_transform);
|
|
void get_linear_range(float &onset, float &opaque);
|
|
|
|
protected:
|
|
void compute_density();
|
|
|
|
public:
|
|
static void register_with_read_factory();
|
|
virtual void write_datagram(BamWriter *manager, Datagram &dg);
|
|
|
|
protected:
|
|
static TypedWritable *make_from_bam(const FactoryParams ¶ms);
|
|
void fillin(DatagramIterator &scan, BamReader *manager);
|
|
|
|
protected:
|
|
Mode _mode;
|
|
Colorf _color;
|
|
LPoint3f _linear_onset_point;
|
|
LPoint3f _linear_opaque_point;
|
|
float _exp_density;
|
|
|
|
float _linear_fallback_cosa;
|
|
float _linear_fallback_onset, _linear_fallback_opaque;
|
|
|
|
float _transformed_onset, _transformed_opaque;
|
|
|
|
public:
|
|
static TypeHandle get_class_type() {
|
|
return _type_handle;
|
|
}
|
|
static void init_type() {
|
|
PandaNode::init_type();
|
|
register_type(_type_handle, "Fog",
|
|
PandaNode::get_class_type());
|
|
}
|
|
virtual TypeHandle get_type() const {
|
|
return get_class_type();
|
|
}
|
|
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
|
|
|
private:
|
|
static TypeHandle _type_handle;
|
|
};
|
|
|
|
EXPCL_PANDA ostream &operator << (ostream &out, Fog::Mode mode);
|
|
|
|
INLINE ostream &operator << (ostream &out, const Fog &fog) {
|
|
fog.output(out);
|
|
return out;
|
|
}
|
|
|
|
#include "fog.I"
|
|
|
|
#endif
|