open_toontown_panda3d/panda/src/sgmanip/nodePathLerps.cxx

234 lines
6.3 KiB
C++

// Filename: nodePathLerps.cxx
// Created by: frang (01Jun00)
//
////////////////////////////////////////////////////////////////////
#include "nodePathLerps.h"
TypeHandle PosLerpFunctor::_type_handle;
TypeHandle HprLerpFunctor::_type_handle;
TypeHandle ScaleLerpFunctor::_type_handle;
TypeHandle ColorLerpFunctor::_type_handle;
TypeHandle PosHprLerpFunctor::_type_handle;
TypeHandle PosHprScaleLerpFunctor::_type_handle;
TypeHandle ColorScaleLerpFunctor::_type_handle;
PosLerpFunctor::PosLerpFunctor(const PosLerpFunctor& c)
: LPoint3fLerpFunctor(c), _node_path(c._node_path) {}
PosLerpFunctor::~PosLerpFunctor(void)
{
}
PosLerpFunctor& PosLerpFunctor::operator=(const PosLerpFunctor& c) {
_node_path = c._node_path;
LPoint3fLerpFunctor::operator=(c);
return *this;
}
void PosLerpFunctor::operator()(float t) {
if (_is_wrt)
_node_path.set_pos(_wrt_path, interpolate(t));
else
_node_path.set_pos(interpolate(t));
}
HprLerpFunctor::HprLerpFunctor(const HprLerpFunctor& c)
: LVecBase3fLerpFunctor(c), _node_path(c._node_path) {}
void HprLerpFunctor::take_shortest(void) {
// so long as these are actually degrees
for (int i=0; i!=3; ++i)
if (this->_diff_cache[i] < -180.)
_start[i] -= 360.;
else if (this->_diff_cache[i] > 180.)
_start[i] += 360.;
this->_diff_cache = this->_end - this->_start;
}
void HprLerpFunctor::take_longest(void) {
// so long as these are actually degrees
for (int i=0; i!=3; ++i)
if ((this->_diff_cache[i] < 0.) && (this->_diff_cache[i] > -180.))
_start[i] -= 360.;
else if ((this->_diff_cache[i] >= 0.) && (this->_diff_cache[i] < 180))
_start[i] += 360.;
this->_diff_cache = this->_end - this->_start;
}
HprLerpFunctor::~HprLerpFunctor(void)
{
}
HprLerpFunctor& HprLerpFunctor::operator=(const HprLerpFunctor& c) {
_node_path = c._node_path;
LVecBase3fLerpFunctor::operator=(c);
return *this;
}
void HprLerpFunctor::operator()(float t) {
if (_is_wrt)
_node_path.set_hpr(_wrt_path, interpolate(t));
else
_node_path.set_hpr(interpolate(t));
}
ScaleLerpFunctor::ScaleLerpFunctor(const ScaleLerpFunctor& c)
: LVecBase3fLerpFunctor(c), _node_path(c._node_path) {}
ScaleLerpFunctor::~ScaleLerpFunctor(void)
{
}
ScaleLerpFunctor& ScaleLerpFunctor::operator=(const ScaleLerpFunctor& c) {
_node_path = c._node_path;
LVecBase3fLerpFunctor::operator=(c);
return *this;
}
void ScaleLerpFunctor::operator()(float t) {
if (_is_wrt)
_node_path.set_scale(_wrt_path, interpolate(t));
else
_node_path.set_scale(interpolate(t));
}
ColorLerpFunctor::ColorLerpFunctor(const ColorLerpFunctor& c)
: LVecBase4fLerpFunctor(c), _node_path(c._node_path) {}
ColorLerpFunctor::~ColorLerpFunctor(void)
{
}
ColorLerpFunctor& ColorLerpFunctor::operator=(const ColorLerpFunctor& c) {
_node_path = c._node_path;
LVecBase4fLerpFunctor::operator=(c);
return *this;
}
void ColorLerpFunctor::operator()(float t) {
_node_path.set_color(interpolate(t));
}
PosHprLerpFunctor::PosHprLerpFunctor(const PosHprLerpFunctor& c)
: LerpFunctor(c), _node_path(c._node_path) {}
void PosHprLerpFunctor::take_shortest(void) {
// so long as these are actually degrees
for (int i=0; i!=3; ++i)
if (this->_hdiff_cache[i] < -180.)
_hstart[i] -= 360.;
else if (this->_hdiff_cache[i] > 180.)
_hstart[i] += 360.;
this->_hdiff_cache = this->_hend - this->_hstart;
}
void PosHprLerpFunctor::take_longest(void) {
// so long as these are actually degrees
for (int i=0; i!=3; ++i)
if ((this->_hdiff_cache[i] < 0.) && (this->_hdiff_cache[i] > -180.))
_hstart[i] -= 360.;
else if ((this->_hdiff_cache[i] >= 0.) && (this->_hdiff_cache[i] < 180))
_hstart[i] += 360.;
this->_hdiff_cache = this->_hend - this->_hstart;
}
PosHprLerpFunctor::~PosHprLerpFunctor(void)
{
}
PosHprLerpFunctor& PosHprLerpFunctor::operator=(const PosHprLerpFunctor& c) {
_node_path = c._node_path;
_pstart = c._pstart;
_pend = c._pend;
_pdiff_cache = c._pdiff_cache;
_hstart = c._hstart;
_hend = c._hend;
_hdiff_cache = c._hdiff_cache;
LerpFunctor::operator=(c);
return *this;
}
void PosHprLerpFunctor::operator()(float t) {
LPoint3f p = ((t * _pdiff_cache) + _pstart);
LVecBase3f h = ((t * _hdiff_cache) + _hstart);
if (_is_wrt)
_node_path.set_pos_hpr(_wrt_path, p, h);
else
_node_path.set_pos_hpr(p, h);
}
PosHprScaleLerpFunctor::PosHprScaleLerpFunctor(const PosHprScaleLerpFunctor& c)
: LerpFunctor(c), _node_path(c._node_path) {}
void PosHprScaleLerpFunctor::take_shortest(void) {
// so long as these are actually degrees
for (int i=0; i!=3; ++i)
if (this->_hdiff_cache[i] < -180.)
_hstart[i] -= 360.;
else if (this->_hdiff_cache[i] > 180.)
_hstart[i] += 360.;
this->_hdiff_cache = this->_hend - this->_hstart;
}
void PosHprScaleLerpFunctor::take_longest(void) {
// so long as these are actually degrees
for (int i=0; i!=3; ++i)
if ((this->_hdiff_cache[i] < 0.) && (this->_hdiff_cache[i] > -180.))
_hstart[i] -= 360.;
else if ((this->_hdiff_cache[i] >= 0.) && (this->_hdiff_cache[i] < 180))
_hstart[i] += 360.;
this->_hdiff_cache = this->_hend - this->_hstart;
}
PosHprScaleLerpFunctor::~PosHprScaleLerpFunctor(void)
{
}
PosHprScaleLerpFunctor&
PosHprScaleLerpFunctor::operator=(const PosHprScaleLerpFunctor& c) {
_node_path = c._node_path;
_pstart = c._pstart;
_pend = c._pend;
_pdiff_cache = c._pdiff_cache;
_hstart = c._hstart;
_hend = c._hend;
_hdiff_cache = c._hdiff_cache;
_sstart = c._sstart;
_send = c._send;
_sdiff_cache = c._sdiff_cache;
LerpFunctor::operator=(c);
return *this;
}
void PosHprScaleLerpFunctor::operator()(float t) {
LPoint3f p = ((t * _pdiff_cache) + _pstart);
LVecBase3f h = ((t * _hdiff_cache) + _hstart);
LVecBase3f s = ((t * _sdiff_cache) + _sstart);
if (_is_wrt)
_node_path.set_pos_hpr_scale(_wrt_path, p, h, s);
else
_node_path.set_pos_hpr_scale(p, h, s);
}
ColorScaleLerpFunctor::ColorScaleLerpFunctor(const ColorScaleLerpFunctor& c)
: LVecBase4fLerpFunctor(c), _node_path(c._node_path) {}
ColorScaleLerpFunctor::~ColorScaleLerpFunctor(void)
{
}
ColorScaleLerpFunctor& ColorScaleLerpFunctor::operator=(const ColorScaleLerpFunctor& c) {
_node_path = c._node_path;
LVecBase4fLerpFunctor::operator=(c);
return *this;
}
void ColorScaleLerpFunctor::operator()(float t) {
_node_path.set_color_scale(interpolate(t));
}