Files
Webcam/include/engine/motion/motion.h
2026-06-22 11:49:35 +02:00

115 lines
3.0 KiB
C++

/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#ifndef __NMOTION__
#define __NMOTION__
#include "motion/quaternion_channel.h"
#include "motion/motion_channel.h"
#include "core/path_kdtree.h"
#include "container/nlist.h"
#include "memory/nshared_ptr.h"
#include "memory/nauto_ptr.h"
namespace GS {
namespace Automation { class Player; }
namespace Core {
/*!
@short Motion.
A motion holds together a group of channels.
@author Emmanuel Julien (ejulien@gsworks.fr)
*/
class Motion : public SharedObject
{
friend class Automation::Player;
protected:
struct SDataPoint
{
Time t;
Variant data;
};
ArrayList <SDataPoint *> data_point; ///< data per point.
AutoList <MotionChannel *> channel_list;
bool use_quaternion;
QuaternionChannel quaternion;
public:
NPLACEMENT_NEW(Motion)
String name;
AutoPtr <PathKdtree> quadtree;
/// Clone a motion, optionally specify the range to clone.
void Clone(const Motion &, const TimeRange &, bool enforce_loop);
/// Sample time from position
bool GetClosestPoint(const Vector4 &p, Vector4 &closest, float *closest_t = 0);
void EvaluateData(const Time &t, Variant &sample);
void EvaluatePosition(const Time &t, Vector4 &sample, Curve::LoopMode loop_mode = Curve::Reset);
void EvaluateRotation(const Time &t, Vector4 &sample, Curve::LoopMode loop_mode = Curve::Reset);
/// Get transformation channels.
void GetTransformationChannels(MotionChannel *t[3], MotionChannel *r[3], MotionChannel *s[3]);
bool HasKey(const TimeRange &t) const;
void MoveKey(const TimeRange &t, const Time &offset) const;
void DeleteKey(const TimeRange &t);
/// Add a new channel controlling a given property to the motion.
MotionChannel *AddChannel(MotionChannel::Type);
/// Add several channels at once.
void AddChannels(uint channel_count);
const AutoList <MotionChannel *> &GetChannelList() const { return channel_list; }
const QuaternionChannel &GetQuaternion() const { return quaternion; }
QuaternionChannel &GetQuaternion() { return quaternion; }
bool GetUseQuaternion() const;
void SetUseQuaternion(bool use) { use_quaternion = use; }
MotionChannel *GetChannel(MotionChannel::Type) const;
MotionChannel *GetChannel(uint index) const;
/// Return the motion duration.
Time GetDuration() const;
/// Return the motion time range.
TimeRange GetTimeRange() const;
/// Return the memory footprint in bytes of the channel.
size_t MemoryFootPrint() const;
/*!
@short Optimize motion.
Remove keys influencing output below a given threshold.
@note This function calls Optimize() for all of the motion channels.
*/
uint Optimize(float threshold = DefaultCurveOptimizationThreshold);
bool FromMetaTag(NML::Tag &);
NML::Tag *AsMetaTag();
~Motion() {
ArrayListDeleteAllPtr(SDataPoint *, data_point)
}
};
} // Core
} // GS
#endif // __NMOTION__