123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825 |
- //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
- // Arcane-FX for MIT Licensed Open Source version of Torque 3D from GarageGames
- // Copyright (C) 2015 Faust Logic, Inc.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- // IN THE SOFTWARE.
- //
- //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
- #include "afx/arcaneFX.h"
- #include "afx/afxEffectWrapper.h"
- #include "afx/afxChoreographer.h"
- #include "afx/xm/afxXM_WaveBase.h"
- //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
- // WAVE SCALAR INTERPOLATORS
- class afxXM_WaveInterp_Scalar : public afxXM_WaveInterp
- {
- protected:
- F32 mA_set, mB_set;
- F32 mA_var, mB_var;
- F32 mA, mB;
- bool mSync_var;
- public:
- afxXM_WaveInterp_Scalar();
- void set(F32 a, F32 b, F32 a_var, F32 b_var, bool sync_var);
- virtual void interpolate(F32 t, afxXM_Params& params)=0;
- virtual void pulse();
- };
- afxXM_WaveInterp_Scalar::afxXM_WaveInterp_Scalar()
- {
- mA_set = 0.0f;
- mB_set = 1.0f;
- mA_var = 0.0f;
- mB_var = 0.0;
- mSync_var = false;
- mA = 0.0f;
- mB = 1.0f;
- }
- void afxXM_WaveInterp_Scalar::set(F32 a, F32 b, F32 a_var, F32 b_var, bool sync_var)
- {
- mA_set = a;
- mB_set = b;
- mA_var = a_var;
- mB_var = b_var;
- mSync_var = sync_var;
- mA = a;
- mA = b;
- }
- inline void afxXM_WaveInterp_Scalar::pulse()
- {
- F32 rand_t = gRandGen.randF()*2.0f;
- mA = mA_set + rand_t*mA_var - mA_var;
- if (!mSync_var)
- rand_t = gRandGen.randF()*2.0f;
- mB = mB_set + rand_t*mB_var - mB_var;
- }
- //~~~~~~~~~~~~~~~~~~~~//
- class afxXM_WaveInterp_Scalar_Add : public afxXM_WaveInterp_Scalar
- {
- protected:
- U32 offset;
- public:
- afxXM_WaveInterp_Scalar_Add(U32 o) : afxXM_WaveInterp_Scalar() { offset = o; }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- *((F32*)(((char*)(¶ms)) + offset)) += lerp(t, mA, mB);
- }
- };
- //~~~~~~~~~~~~~~~~~~~~//
- class afxXM_WaveInterp_Scalar_Mul : public afxXM_WaveInterp_Scalar
- {
- protected:
- U32 offset;
- public:
- afxXM_WaveInterp_Scalar_Mul(U32 o) : afxXM_WaveInterp_Scalar() { offset = o; }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- *((F32*)(((char*)(¶ms)) + offset)) *= lerp(t, mA, mB);
- }
- };
- //~~~~~~~~~~~~~~~~~~~~//
- class afxXM_WaveInterp_Scalar_Rep : public afxXM_WaveInterp_Scalar
- {
- protected:
- U32 offset;
- public:
- afxXM_WaveInterp_Scalar_Rep(U32 o) : afxXM_WaveInterp_Scalar() { offset = o; }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- *((F32*)(((char*)(¶ms)) + offset)) = lerp(t, mA, mB);
- }
- };
- //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//
- class afxXM_WaveInterp_Scalar_PointAdd : public afxXM_WaveInterp_Scalar
- {
- protected:
- U32 offset;
- public:
- afxXM_WaveInterp_Scalar_PointAdd(U32 o) : afxXM_WaveInterp_Scalar() { offset = o; }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- F32 scalar_at_t = lerp(t, mA, mB);
- Point3F point_at_t(scalar_at_t, scalar_at_t, scalar_at_t);
- *((Point3F*)(((char*)(¶ms)) + offset)) += point_at_t;
- }
- };
- //~~~~~~~~~~~~~~~~~~~~//
- class afxXM_WaveInterp_Scalar_PointMul : public afxXM_WaveInterp_Scalar
- {
- protected:
- U32 offset;
- public:
- afxXM_WaveInterp_Scalar_PointMul(U32 o) : afxXM_WaveInterp_Scalar() { offset = o; }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- *((Point3F*)(((char*)(¶ms)) + offset)) *= lerp(t, mA, mB);
- }
- };
- //~~~~~~~~~~~~~~~~~~~~//
- class afxXM_WaveInterp_Scalar_PointRep : public afxXM_WaveInterp_Scalar
- {
- protected:
- U32 offset;
- public:
- afxXM_WaveInterp_Scalar_PointRep(U32 o) : afxXM_WaveInterp_Scalar() { offset = o; }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- F32 scalar_at_t = lerp(t,mA, mB);
- Point3F point_at_t(scalar_at_t, scalar_at_t, scalar_at_t);
- *((Point3F*)(((char*)(¶ms)) + offset)) = point_at_t;
- }
- };
- //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//
- class afxXM_WaveInterp_Scalar_Axis_PointAdd : public afxXM_WaveInterp_Scalar
- {
- protected:
- Point3F axis;
- U32 offset;
- public:
- afxXM_WaveInterp_Scalar_Axis_PointAdd(U32 o, Point3F ax) : afxXM_WaveInterp_Scalar() { offset = o; axis = ax; }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- Point3F point_at_t = axis*lerp(t, mA, mB);
- *((Point3F*)(((char*)(¶ms)) + offset)) += point_at_t;
- }
- };
- class afxXM_WaveInterp_Scalar_LocalAxis_PointAdd : public afxXM_WaveInterp_Scalar
- {
- protected:
- Point3F axis;
- U32 offset;
- public:
- afxXM_WaveInterp_Scalar_LocalAxis_PointAdd(U32 o, Point3F ax) : afxXM_WaveInterp_Scalar() { offset = o; axis = ax; }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- Point3F local_axis(axis);
- params.ori.mulV(local_axis);
- Point3F point_at_t = local_axis*lerp(t, mA, mB);
- *((Point3F*)(((char*)(¶ms)) + offset)) += point_at_t;
- }
- };
- //~~~~~~~~~~~~~~~~~~~~//
- class afxXM_WaveInterp_Scalar_Axis_PointMul : public afxXM_WaveInterp_Scalar
- {
- protected:
- Point3F axis;
- U32 offset;
- public:
- afxXM_WaveInterp_Scalar_Axis_PointMul(U32 o, Point3F ax) : afxXM_WaveInterp_Scalar() { offset = o; axis = ax; }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- Point3F point_at_t = axis*lerp(t, mA, mB);
- *((Point3F*)(((char*)(¶ms)) + offset)) *= point_at_t;
- }
- };
- class afxXM_WaveInterp_Scalar_LocalAxis_PointMul : public afxXM_WaveInterp_Scalar
- {
- protected:
- Point3F axis;
- U32 offset;
- public:
- afxXM_WaveInterp_Scalar_LocalAxis_PointMul(U32 o, Point3F ax) : afxXM_WaveInterp_Scalar() { offset = o; axis = ax; }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- Point3F local_axis(axis);
- params.ori.mulV(local_axis);
- Point3F point_at_t = local_axis*lerp(t, mA, mB);
- *((Point3F*)(((char*)(¶ms)) + offset)) *= point_at_t;
- }
- };
- //~~~~~~~~~~~~~~~~~~~~//
- class afxXM_WaveInterp_Scalar_Axis_PointRep : public afxXM_WaveInterp_Scalar
- {
- protected:
- Point3F axis;
- U32 offset;
- public:
- afxXM_WaveInterp_Scalar_Axis_PointRep(U32 o, Point3F ax) : afxXM_WaveInterp_Scalar() { offset = o; axis = ax; }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- Point3F point_at_t = axis*lerp(t, mA, mB);
- *((Point3F*)(((char*)(¶ms)) + offset)) = point_at_t;
- }
- };
- class afxXM_WaveInterp_Scalar_LocalAxis_PointRep : public afxXM_WaveInterp_Scalar
- {
- protected:
- Point3F axis;
- U32 offset;
- public:
- afxXM_WaveInterp_Scalar_LocalAxis_PointRep(U32 o, Point3F ax) : afxXM_WaveInterp_Scalar() { offset = o; axis = ax; }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- Point3F local_axis(axis);
- params.ori.mulV(local_axis);
- Point3F point_at_t = local_axis*lerp(t, mA, mB);
- *((Point3F*)(((char*)(¶ms)) + offset)) = point_at_t;
- }
- };
- //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//
- class afxXM_WaveInterp_Scalar_ColorAdd : public afxXM_WaveInterp_Scalar
- {
- public:
- afxXM_WaveInterp_Scalar_ColorAdd() : afxXM_WaveInterp_Scalar() { }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- F32 scalar_at_t = lerp(t, mA, mB);
- LinearColorF color_at_t(scalar_at_t, scalar_at_t, scalar_at_t, scalar_at_t);
- params.color += color_at_t;
- }
- };
- //~~~~~~~~~~~~~~~~~~~~//
- class afxXM_WaveInterp_Scalar_ColorMul : public afxXM_WaveInterp_Scalar
- {
- public:
- afxXM_WaveInterp_Scalar_ColorMul() : afxXM_WaveInterp_Scalar() { }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- params.color *= lerp(t, mA, mB);
- }
- };
- //~~~~~~~~~~~~~~~~~~~~//
- class afxXM_WaveInterp_Scalar_ColorRep : public afxXM_WaveInterp_Scalar
- {
- public:
- afxXM_WaveInterp_Scalar_ColorRep() : afxXM_WaveInterp_Scalar() { }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- F32 scalar_at_t = lerp(t, mA, mB);
- params.color.set(scalar_at_t, scalar_at_t, scalar_at_t, scalar_at_t);
- }
- };
- //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//
- class afxXM_WaveInterp_Scalar_OriMul : public afxXM_WaveInterp_Scalar
- {
- protected:
- Point3F axis;
- public:
- afxXM_WaveInterp_Scalar_OriMul(Point3F& ax) : afxXM_WaveInterp_Scalar() { axis = ax; }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- F32 theta = mDegToRad(lerp(t, mA, mB));
- AngAxisF rot_aa(axis, theta);
- MatrixF rot_xfm; rot_aa.setMatrix(&rot_xfm);
- params.ori.mul(rot_xfm);
- }
- };
- //~~~~~~~~~~~~~~~~~~~~//
- class afxXM_WaveInterp_Scalar_OriRep : public afxXM_WaveInterp_Scalar
- {
- protected:
- Point3F axis;
- public:
- afxXM_WaveInterp_Scalar_OriRep(Point3F& ax) : afxXM_WaveInterp_Scalar() { axis = ax; }
- virtual void interpolate(F32 t, afxXM_Params& params)
- {
- F32 theta = mDegToRad(lerp(t, mA, mB));
- AngAxisF rot_aa(axis, theta);
- rot_aa.setMatrix(¶ms.ori);
- }
- };
- //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
- // WAVE SCALAR BASE DATABLOCK
- class afxXM_WaveScalarData_Common : public virtual afxXM_Defs
- {
- static afxXM_WaveInterp_Scalar* alloc_interp(U32 param, S32 comp, U32 op, U32 off,
- Point3F& axis, bool loc_axis, afxXM_BaseData*);
- static bool needs_offset(U32 param, S32 component);
- static bool needs_axis(U32 param, S32 component);
- protected:
- static afxXM_WaveInterp_Scalar* createInterp(U32 param, U32 op, Point3F axis, bool loc_axis,
- afxXM_BaseData*);
- };
- //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
- bool afxXM_WaveScalarData_Common::needs_offset(U32 param, S32 component)
- {
- switch (param)
- {
- case ORIENTATION:
- return false;
- case POSITION:
- case POSITION2:
- case SCALE:
- case VISIBILITY:
- return true;
- case COLOR:
- return (component != -1);
- }
- return false;
- }
- bool afxXM_WaveScalarData_Common::needs_axis(U32 param, S32 component)
- {
- switch (param)
- {
- case ORIENTATION:
- return true;
- case POSITION:
- case POSITION2:
- case SCALE:
- case COLOR:
- case VISIBILITY:
- return false;
- }
- return true;
- }
- afxXM_WaveInterp_Scalar*
- afxXM_WaveScalarData_Common::alloc_interp(U32 param, S32 component, U32 op, U32 offset, Point3F& axis, bool loc_axis, afxXM_BaseData* db)
- {
- afxXM_WaveInterp_Scalar* interpolator = 0;
- switch (param)
- {
- case ORIENTATION:
- switch (op)
- {
- case afxXM_WaveBaseData::OP_ADD:
- Con::errorf("%s::%s -- invalid orientation op.", db->getClassName(), db->getName());
- return 0;
- case afxXM_WaveBaseData::OP_MULTIPLY:
- interpolator = new afxXM_WaveInterp_Scalar_OriMul(axis);
- break;
- case afxXM_WaveBaseData::OP_REPLACE:
- interpolator = new afxXM_WaveInterp_Scalar_OriRep(axis);
- break;
- }
- break;
- case POSITION:
- case POSITION2:
- case SCALE:
- if (component == -1)
- {
- if (axis.isZero())
- {
- switch (op)
- {
- case afxXM_WaveBaseData::OP_ADD:
- interpolator = new afxXM_WaveInterp_Scalar_PointAdd(offset);
- break;
- case afxXM_WaveBaseData::OP_MULTIPLY:
- interpolator = new afxXM_WaveInterp_Scalar_PointMul(offset);
- break;
- case afxXM_WaveBaseData::OP_REPLACE:
- interpolator = new afxXM_WaveInterp_Scalar_PointRep(offset);
- break;
- }
- }
- else if (loc_axis)
- {
- switch (op)
- {
- case afxXM_WaveBaseData::OP_ADD:
- interpolator = new afxXM_WaveInterp_Scalar_LocalAxis_PointAdd(offset, axis);
- break;
- case afxXM_WaveBaseData::OP_MULTIPLY:
- interpolator = new afxXM_WaveInterp_Scalar_LocalAxis_PointMul(offset, axis);
- break;
- case afxXM_WaveBaseData::OP_REPLACE:
- interpolator = new afxXM_WaveInterp_Scalar_LocalAxis_PointRep(offset, axis);
- break;
- }
- }
- else
- {
- switch (op)
- {
- case afxXM_WaveBaseData::OP_ADD:
- interpolator = new afxXM_WaveInterp_Scalar_Axis_PointAdd(offset, axis);
- break;
- case afxXM_WaveBaseData::OP_MULTIPLY:
- interpolator = new afxXM_WaveInterp_Scalar_Axis_PointMul(offset, axis);
- break;
- case afxXM_WaveBaseData::OP_REPLACE:
- interpolator = new afxXM_WaveInterp_Scalar_Axis_PointRep(offset, axis);
- break;
- }
- }
- }
- else
- {
- switch (op)
- {
- case afxXM_WaveBaseData::OP_ADD:
- interpolator = new afxXM_WaveInterp_Scalar_Add(offset);
- break;
- case afxXM_WaveBaseData::OP_MULTIPLY:
- interpolator = new afxXM_WaveInterp_Scalar_Mul(offset);
- break;
- case afxXM_WaveBaseData::OP_REPLACE:
- interpolator = new afxXM_WaveInterp_Scalar_Rep(offset);
- break;
- }
- }
- break;
- case COLOR:
- if (component == -1)
- {
- switch (op)
- {
- case afxXM_WaveBaseData::OP_ADD:
- interpolator = new afxXM_WaveInterp_Scalar_ColorAdd();
- break;
- case afxXM_WaveBaseData::OP_MULTIPLY:
- interpolator = new afxXM_WaveInterp_Scalar_ColorMul();
- break;
- case afxXM_WaveBaseData::OP_REPLACE:
- interpolator = new afxXM_WaveInterp_Scalar_ColorRep();
- break;
- }
- }
- else
- {
- switch (op)
- {
- case afxXM_WaveBaseData::OP_ADD:
- interpolator = new afxXM_WaveInterp_Scalar_Add(offset);
- break;
- case afxXM_WaveBaseData::OP_MULTIPLY:
- interpolator = new afxXM_WaveInterp_Scalar_Mul(offset);
- break;
- case afxXM_WaveBaseData::OP_REPLACE:
- interpolator = new afxXM_WaveInterp_Scalar_Rep(offset);
- break;
- }
- }
- break;
- case VISIBILITY:
- switch (op)
- {
- case afxXM_WaveBaseData::OP_ADD:
- interpolator = new afxXM_WaveInterp_Scalar_Add(offset);
- break;
- case afxXM_WaveBaseData::OP_MULTIPLY:
- interpolator = new afxXM_WaveInterp_Scalar_Mul(offset);
- break;
- case afxXM_WaveBaseData::OP_REPLACE:
- interpolator = new afxXM_WaveInterp_Scalar_Rep(offset);
- break;
- }
- }
- if (!interpolator)
- Con::errorf("%s::%s -- failed to allocate wave interpolator.", db->getClassName(), db->getName());
- return interpolator;
- }
- afxXM_WaveInterp_Scalar*
- afxXM_WaveScalarData_Common::createInterp(U32 parameter, U32 op, Point3F axis, bool loc_axis, afxXM_BaseData* db)
- {
- S32 component; U32 param_bit;
- afxXM_WaveBaseData::initParamInfo(parameter, param_bit, component);
- if (param_bit == 0)
- {
- Con::errorf("%s::%s -- unknown parameter specified.", db->getClassName(), db->getName());
- return 0;
- }
- if (axis.isZero() && needs_axis(param_bit, component))
- {
- Con::errorf("%s::%s -- axis required.", db->getClassName(), db->getName());
- return 0;
- }
- if (!axis.isZero())
- axis.normalize();
- U32 offset = afxXM_Params::BAD_OFFSET;
- if (needs_offset(param_bit, component))
- {
- offset = afxXM_Params::getParameterOffset(param_bit, component);
- if (offset == afxXM_Params::BAD_OFFSET)
- {
- Con::errorf("%s::%s -- bad component offset.", db->getClassName(), db->getName());
- return 0;
- }
- }
- return alloc_interp(param_bit, component, op, offset, axis, loc_axis, db);
- }
- //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
- // WAVE SCALAR DATABLOCK
- class afxXM_WaveScalarData : public afxXM_WaveBaseData, afxXM_WaveScalarData_Common
- {
- typedef afxXM_WaveBaseData Parent;
- public:
- F32 a, b;
- F32 a_var, b_var;
- bool sync_var;
- public:
- /*C*/ afxXM_WaveScalarData();
- /*C*/ afxXM_WaveScalarData(const afxXM_WaveScalarData&, bool = false);
- void packData(BitStream* stream);
- void unpackData(BitStream* stream);
- virtual bool allowSubstitutions() const { return true; }
- static void initPersistFields();
- afxXM_Base* create(afxEffectWrapper* fx, bool on_server);
- DECLARE_CONOBJECT(afxXM_WaveScalarData);
- DECLARE_CATEGORY("AFX");
- };
- //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
- IMPLEMENT_CO_DATABLOCK_V1(afxXM_WaveScalarData);
- ConsoleDocClass( afxXM_WaveScalarData,
- "@brief An xmod datablock.\n\n"
- "@ingroup afxXMods\n"
- "@ingroup AFX\n"
- "@ingroup Datablocks\n"
- );
- afxXM_WaveScalarData::afxXM_WaveScalarData()
- {
- a = 0.0f;
- b = 1.0f;
- a_var = 0.0f;
- b_var = 0.0f;
- sync_var = false;
- }
- afxXM_WaveScalarData::afxXM_WaveScalarData(const afxXM_WaveScalarData& other, bool temp_clone) : afxXM_WaveBaseData(other, temp_clone)
- {
- a = other.a;
- b = other.b;
- a_var = other.a_var;
- b_var = other.b_var;
- sync_var = other.sync_var;
- }
- void afxXM_WaveScalarData::initPersistFields()
- {
- addField("a", TypeF32, Offset(a, afxXM_WaveScalarData),
- "...");
- addField("b", TypeF32, Offset(b, afxXM_WaveScalarData),
- "...");
- addField("aVariance", TypeF32, Offset(a_var, afxXM_WaveScalarData),
- "...");
- addField("bVariance", TypeF32, Offset(b_var, afxXM_WaveScalarData),
- "...");
- addField("syncVariances", TypeBool, Offset(sync_var, afxXM_WaveScalarData),
- "...");
- Parent::initPersistFields();
- }
- void afxXM_WaveScalarData::packData(BitStream* stream)
- {
- Parent::packData(stream);
- stream->write(a);
- stream->write(b);
- if (stream->writeFlag(a_var != 0.0f || b_var != 0.0f))
- {
- stream->write(a_var);
- stream->write(b_var);
- stream->writeFlag(sync_var);
- }
- }
- void afxXM_WaveScalarData::unpackData(BitStream* stream)
- {
- Parent::unpackData(stream);
- stream->read(&a);
- stream->read(&b);
- if (stream->readFlag())
- {
- stream->read(&a_var);
- stream->read(&b_var);
- sync_var = stream->readFlag();
- }
- else
- {
- a_var = b_var = 0.0f;
- sync_var = false;
- }
- }
- afxXM_Base* afxXM_WaveScalarData::create(afxEffectWrapper* fx, bool on_server)
- {
- afxXM_WaveScalarData* dblock = this;
- if (getSubstitutionCount() > 0)
- {
- dblock = new afxXM_WaveScalarData(*this, true);
- this->performSubstitutions(dblock, fx->getChoreographer(), fx->getGroupIndex());
- }
- afxXM_WaveInterp_Scalar* interp;
- interp = createInterp(dblock->parameter, dblock->op, dblock->axis, dblock->local_axis, dblock);
- if (!interp)
- return 0;
- interp->set(dblock->a, dblock->b, dblock->a_var, dblock->b_var, dblock->sync_var);
- return new afxXM_WaveBase(dblock, fx, interp);
- }
- //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
- // WAVE RIDER SCALAR DATABLOCK
- class afxXM_WaveRiderScalarData : public afxXM_WaveRiderBaseData, afxXM_WaveScalarData_Common
- {
- typedef afxXM_WaveRiderBaseData Parent;
- public:
- F32 a, b;
- F32 a_var, b_var;
- bool sync_var;
- public:
- /*C*/ afxXM_WaveRiderScalarData();
- /*C*/ afxXM_WaveRiderScalarData(const afxXM_WaveRiderScalarData&, bool = false);
- void packData(BitStream* stream);
- void unpackData(BitStream* stream);
- virtual bool allowSubstitutions() const { return true; }
- static void initPersistFields();
- afxXM_Base* create(afxEffectWrapper* fx, bool on_server);
- DECLARE_CONOBJECT(afxXM_WaveRiderScalarData);
- DECLARE_CATEGORY("AFX");
- };
- //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
- IMPLEMENT_CO_DATABLOCK_V1(afxXM_WaveRiderScalarData);
- ConsoleDocClass( afxXM_WaveRiderScalarData,
- "@brief An xmod datablock.\n\n"
- "@ingroup afxXMods\n"
- "@ingroup AFX\n"
- "@ingroup Datablocks\n"
- );
- afxXM_WaveRiderScalarData::afxXM_WaveRiderScalarData()
- {
- a = 0.0f;
- b = 1.0f;
- a_var = 0.0f;
- b_var = 0.0f;
- sync_var = false;
- }
- afxXM_WaveRiderScalarData::afxXM_WaveRiderScalarData(const afxXM_WaveRiderScalarData& other, bool temp_clone) : afxXM_WaveRiderBaseData(other, temp_clone)
- {
- a = other.a;
- b = other.b;
- a_var = other.a_var;
- b_var = other.b_var;
- sync_var = other.sync_var;
- }
- void afxXM_WaveRiderScalarData::initPersistFields()
- {
- addField("a", TypeF32, Offset(a, afxXM_WaveRiderScalarData),
- "...");
- addField("b", TypeF32, Offset(b, afxXM_WaveRiderScalarData),
- "...");
- addField("aVariance", TypeF32, Offset(a_var, afxXM_WaveRiderScalarData),
- "...");
- addField("bVariance", TypeF32, Offset(b_var, afxXM_WaveRiderScalarData),
- "...");
- addField("syncVariances", TypeBool, Offset(sync_var, afxXM_WaveRiderScalarData),
- "...");
- Parent::initPersistFields();
- }
- void afxXM_WaveRiderScalarData::packData(BitStream* stream)
- {
- Parent::packData(stream);
- stream->write(a);
- stream->write(b);
- if (stream->writeFlag(a_var != 0.0f || b_var != 0.0f))
- {
- stream->write(a_var);
- stream->write(b_var);
- stream->writeFlag(sync_var);
- }
- }
- void afxXM_WaveRiderScalarData::unpackData(BitStream* stream)
- {
- Parent::unpackData(stream);
- stream->read(&a);
- stream->read(&b);
- if (stream->readFlag())
- {
- stream->read(&a_var);
- stream->read(&b_var);
- sync_var = stream->readFlag();
- }
- else
- {
- a_var = b_var = 0.0f;
- sync_var = false;
- }
- }
- afxXM_Base* afxXM_WaveRiderScalarData::create(afxEffectWrapper* fx, bool on_server)
- {
- afxXM_WaveRiderScalarData* dblock = this;
- if (getSubstitutionCount() > 0)
- {
- dblock = new afxXM_WaveRiderScalarData(*this, true);
- this->performSubstitutions(dblock, fx->getChoreographer(), fx->getGroupIndex());
- }
- afxXM_WaveInterp_Scalar* interp;
- interp = createInterp(dblock->parameter, dblock->op, dblock->axis, dblock->local_axis, dblock);
- if (!interp)
- return 0;
- interp->set(dblock->a, dblock->b, dblock->a_var, dblock->b_var, dblock->sync_var);
- return new afxXM_WaveRiderBase(dblock, fx, interp);
- }
- //~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
|