mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
make smoothmover parameters be instance variables
This commit is contained in:
parent
49307714d1
commit
c373e91564
@ -20,14 +20,6 @@
|
||||
#include "pnotify.h"
|
||||
#include "compose_matrix.h"
|
||||
|
||||
SmoothMover::SmoothMode SmoothMover::_smooth_mode = SmoothMover::SM_off;
|
||||
SmoothMover::PredictionMode SmoothMover::_prediction_mode = SmoothMover::PM_off;
|
||||
double SmoothMover::_delay = 0.2;
|
||||
bool SmoothMover::_accept_clock_skew = true;
|
||||
double SmoothMover::_max_position_age = 0.25;
|
||||
double SmoothMover::_expected_broadcast_period = 0.2;
|
||||
double SmoothMover::_reset_velocity_age = 0.3;
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: SmoothMover::Constructor
|
||||
// Access: Published
|
||||
@ -63,6 +55,14 @@ SmoothMover() {
|
||||
_timestamp_delays.push_back(0);
|
||||
|
||||
_last_heard_from = 0.0;
|
||||
|
||||
_smooth_mode = SM_off;
|
||||
_prediction_mode = PM_off;
|
||||
_delay = 0.2;
|
||||
_accept_clock_skew = true;
|
||||
_max_position_age = 0.25;
|
||||
_expected_broadcast_period = 0.2;
|
||||
_reset_velocity_age = 0.3;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
@ -111,8 +111,6 @@ PUBLISHED:
|
||||
INLINE float get_smooth_rotational_velocity() const;
|
||||
INLINE const LVecBase3f &get_forward_axis() const;
|
||||
|
||||
// These static methods control the global properties of all
|
||||
// SmoothMovers.
|
||||
enum SmoothMode {
|
||||
SM_off,
|
||||
SM_on,
|
||||
@ -127,26 +125,26 @@ PUBLISHED:
|
||||
// well.
|
||||
};
|
||||
|
||||
INLINE static void set_smooth_mode(SmoothMode mode);
|
||||
INLINE static SmoothMode get_smooth_mode();
|
||||
INLINE void set_smooth_mode(SmoothMode mode);
|
||||
INLINE SmoothMode get_smooth_mode();
|
||||
|
||||
INLINE static void set_prediction_mode(PredictionMode mode);
|
||||
INLINE static PredictionMode get_prediction_mode();
|
||||
INLINE void set_prediction_mode(PredictionMode mode);
|
||||
INLINE PredictionMode get_prediction_mode();
|
||||
|
||||
INLINE static void set_delay(double delay);
|
||||
INLINE static double get_delay();
|
||||
INLINE void set_delay(double delay);
|
||||
INLINE double get_delay();
|
||||
|
||||
INLINE static void set_accept_clock_skew(bool flag);
|
||||
INLINE static bool get_accept_clock_skew();
|
||||
INLINE void set_accept_clock_skew(bool flag);
|
||||
INLINE bool get_accept_clock_skew();
|
||||
|
||||
INLINE static void set_max_position_age(double age);
|
||||
INLINE static double get_max_position_age();
|
||||
INLINE void set_max_position_age(double age);
|
||||
INLINE double get_max_position_age();
|
||||
|
||||
INLINE static void set_expected_broadcast_period(double period);
|
||||
INLINE static double get_expected_broadcast_period();
|
||||
INLINE void set_expected_broadcast_period(double period);
|
||||
INLINE double get_expected_broadcast_period();
|
||||
|
||||
INLINE static void set_reset_velocity_age(double age);
|
||||
INLINE static double get_reset_velocity_age();
|
||||
INLINE void set_reset_velocity_age(double age);
|
||||
INLINE double get_reset_velocity_age();
|
||||
|
||||
void output(ostream &out) const;
|
||||
void write(ostream &out) const;
|
||||
@ -208,13 +206,13 @@ private:
|
||||
int _net_timestamp_delay;
|
||||
double _last_heard_from;
|
||||
|
||||
static SmoothMode _smooth_mode;
|
||||
static PredictionMode _prediction_mode;
|
||||
static double _delay;
|
||||
static bool _accept_clock_skew;
|
||||
static double _max_position_age;
|
||||
static double _expected_broadcast_period;
|
||||
static double _reset_velocity_age;
|
||||
SmoothMode _smooth_mode;
|
||||
PredictionMode _prediction_mode;
|
||||
double _delay;
|
||||
bool _accept_clock_skew;
|
||||
double _max_position_age;
|
||||
double _expected_broadcast_period;
|
||||
double _reset_velocity_age;
|
||||
};
|
||||
|
||||
#include "smoothMover.I"
|
||||
|
@ -30,46 +30,25 @@ Lag = base.config.GetDouble("smooth-lag", 0.2)
|
||||
PredictionLag = base.config.GetDouble("smooth-prediction-lag", 0.0)
|
||||
|
||||
|
||||
GlobalSmoothing = 0
|
||||
GlobalPrediction = 0
|
||||
def globalActivateSmoothing(smoothing, prediction):
|
||||
""" Globally activates or deactivates smoothing and prediction on
|
||||
all DistributedSmoothNodes currently in existence, or yet to be
|
||||
generated. """
|
||||
|
||||
def activateSmoothing(smoothing, prediction):
|
||||
"""
|
||||
Enables or disables the smoothing of other avatars' motion.
|
||||
This is a global flag that controls the behavior of all
|
||||
SmoothMovers in the world. If smoothing is off, no kind of
|
||||
smoothing will be performed, regardless of the setting of
|
||||
prediction.
|
||||
|
||||
This is not necessarily predictive smoothing; if predictive
|
||||
smoothing is off, avatars will be lagged by a certain factor
|
||||
to achieve smooth motion. Otherwise, if predictive smoothing
|
||||
is on, avatars will be drawn as nearly as possible in their
|
||||
current position, by extrapolating from old position reports.
|
||||
global GlobalSmoothing, GlobalPrediction
|
||||
GlobalSmoothing = smoothing
|
||||
GlobalPrediction = prediction
|
||||
|
||||
This assumes you have a client repository that knows its
|
||||
localAvatarDoId -- stored in self.cr.localAvatarDoId
|
||||
"""
|
||||
for obj in base.cr.getAllOfType(DistributedSmoothNode):
|
||||
obj.activateSmoothing(smoothing, prediction)
|
||||
|
||||
if smoothing and EnableSmoothing:
|
||||
if prediction and EnablePrediction:
|
||||
# Prediction and smoothing.
|
||||
SmoothMover.setSmoothMode(SmoothMover.SMOn)
|
||||
SmoothMover.setPredictionMode(SmoothMover.PMOn)
|
||||
SmoothMover.setDelay(PredictionLag)
|
||||
else:
|
||||
# Smoothing, but no prediction.
|
||||
SmoothMover.setSmoothMode(SmoothMover.SMOn)
|
||||
SmoothMover.setPredictionMode(SmoothMover.PMOff)
|
||||
SmoothMover.setDelay(Lag)
|
||||
# Set these other variables relative to the lag factor
|
||||
SmoothMover.setExpectedBroadcastPeriod(Lag)
|
||||
SmoothMover.setMaxPositionAge(Lag * 1.25)
|
||||
SmoothMover.setResetVelocityAge(Lag * 1.5)
|
||||
else:
|
||||
# No smoothing, no prediction.
|
||||
SmoothMover.setSmoothMode(SmoothMover.SMOff)
|
||||
SmoothMover.setPredictionMode(SmoothMover.PMOff)
|
||||
SmoothMover.setDelay(0.0)
|
||||
|
||||
# For historical reasons, we temporarily define
|
||||
# DistributedSmoothNode.activateSmoothing() to be the global function.
|
||||
# We'll remove this soon, so it won't get confused with the instance
|
||||
# method, below.
|
||||
activateSmoothing = globalActivateSmoothing
|
||||
|
||||
|
||||
class DistributedSmoothNode(DistributedNode.DistributedNode,
|
||||
@ -97,6 +76,10 @@ class DistributedSmoothNode(DistributedNode.DistributedNode,
|
||||
DistributedSmoothNodeBase.DistributedSmoothNodeBase.delete(self)
|
||||
DistributedNode.DistributedNode.delete(self)
|
||||
|
||||
def generate(self):
|
||||
DistributedNode.DistributedNode.generate(self)
|
||||
self.activateSmoothing(GlobalSmoothing, GlobalPrediction)
|
||||
|
||||
### Methods to handle computing and updating of the smoothed
|
||||
### position.
|
||||
|
||||
@ -378,3 +361,40 @@ class DistributedSmoothNode(DistributedNode.DistributedNode,
|
||||
self.cr.timeManager.synchronize("suggested by %d" % (avId))
|
||||
|
||||
return gotSync
|
||||
|
||||
def activateSmoothing(self, smoothing, prediction):
|
||||
"""
|
||||
Enables or disables the smoothing of other avatars' motion.
|
||||
This used to be a global flag, but now it is specific to each
|
||||
avatar instance. However, see globalActivateSmoothing() in
|
||||
this module.
|
||||
|
||||
If smoothing is off, no kind of smoothing will be performed,
|
||||
regardless of the setting of prediction.
|
||||
|
||||
This is not necessarily predictive smoothing; if predictive
|
||||
smoothing is off, avatars will be lagged by a certain factor
|
||||
to achieve smooth motion. Otherwise, if predictive smoothing
|
||||
is on, avatars will be drawn as nearly as possible in their
|
||||
current position, by extrapolating from old position reports.
|
||||
|
||||
This assumes you have a client repository that knows its
|
||||
localAvatarDoId -- stored in self.cr.localAvatarDoId
|
||||
"""
|
||||
|
||||
if smoothing and EnableSmoothing:
|
||||
if prediction and EnablePrediction:
|
||||
# Prediction and smoothing.
|
||||
self.smoother.setSmoothMode(SmoothMover.SMOn)
|
||||
self.smoother.setPredictionMode(SmoothMover.PMOn)
|
||||
self.smoother.setDelay(PredictionLag)
|
||||
else:
|
||||
# Smoothing, but no prediction.
|
||||
self.smoother.setSmoothMode(SmoothMover.SMOn)
|
||||
self.smoother.setPredictionMode(SmoothMover.PMOff)
|
||||
self.smoother.setDelay(Lag)
|
||||
else:
|
||||
# No smoothing, no prediction.
|
||||
self.smoother.setSmoothMode(SmoothMover.SMOff)
|
||||
self.smoother.setPredictionMode(SmoothMover.PMOff)
|
||||
self.smoother.setDelay(0.0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user