open_toontown_panda3d/panda/src/pgraph/nodePathLerps.cxx

297 lines
8.2 KiB
C++

// Filename: nodePathLerps.cxx
// Created by: frang (01Jun00)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) 2001 - 2004, 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://etc.cmu.edu/panda3d/docs/license/ .
//
// To contact the maintainers of this program write to
// panda3d-general@lists.sourceforge.net .
//
////////////////////////////////////////////////////////////////////
#include "nodePathLerps.h"
TypeHandle PosLerpFunctor::_type_handle;
TypeHandle HprLerpFunctor::_type_handle;
TypeHandle ScaleLerpFunctor::_type_handle;
TypeHandle ColorLerpFunctor::_type_handle;
TypeHandle PosHprLerpFunctor::_type_handle;
TypeHandle HprScaleLerpFunctor::_type_handle;
TypeHandle PosHprScaleLerpFunctor::_type_handle;
TypeHandle ColorScaleLerpFunctor::_type_handle;
PosLerpFunctor::PosLerpFunctor(const PosLerpFunctor& c)
: LPoint3fLerpFunctor(c), _node_path(c._node_path) {}
PosLerpFunctor::~PosLerpFunctor()
{
}
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() {
// 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() {
// 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()
{
}
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()
{
}
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()
{
}
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() {
// 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() {
// 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()
{
}
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);
}
HprScaleLerpFunctor::HprScaleLerpFunctor(const HprScaleLerpFunctor& c)
: LerpFunctor(c), _node_path(c._node_path) {}
void HprScaleLerpFunctor::take_shortest() {
// 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 HprScaleLerpFunctor::take_longest() {
// 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;
}
HprScaleLerpFunctor::~HprScaleLerpFunctor()
{
}
HprScaleLerpFunctor&
HprScaleLerpFunctor::operator=(const HprScaleLerpFunctor& c) {
_node_path = c._node_path;
_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 HprScaleLerpFunctor::operator()(float t) {
LVecBase3f h = ((t * _hdiff_cache) + _hstart);
LVecBase3f s = ((t * _sdiff_cache) + _sstart);
if (_is_wrt)
_node_path.set_hpr_scale(_wrt_path, h, s);
else
_node_path.set_hpr_scale(h, s);
}
PosHprScaleLerpFunctor::PosHprScaleLerpFunctor(const PosHprScaleLerpFunctor& c)
: LerpFunctor(c), _node_path(c._node_path) {}
void PosHprScaleLerpFunctor::take_shortest() {
// 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() {
// 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()
{
}
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()
{
}
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));
}