afxXfmMod.cpp

Engine/source/afx/xm/afxXfmMod.cpp

More...

Detailed Description

Public Functions

IMPLEMENT_CO_DATABLOCK_V1(afxXM_BaseData )

IMPLEMENT_CO_DATABLOCK_V1(afxXM_WeightedBaseData )

  1
  2
  3//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
  4// Arcane-FX for MIT Licensed Open Source version of Torque 3D from GarageGames
  5// Copyright (C) 2015 Faust Logic, Inc.
  6//
  7// Permission is hereby granted, free of charge, to any person obtaining a copy
  8// of this software and associated documentation files (the "Software"), to
  9// deal in the Software without restriction, including without limitation the
 10// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 11// sell copies of the Software, and to permit persons to whom the Software is
 12// furnished to do so, subject to the following conditions:
 13//
 14// The above copyright notice and this permission notice shall be included in
 15// all copies or substantial portions of the Software.
 16//
 17// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 18// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 19// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 20// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 21// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 23// IN THE SOFTWARE.
 24//
 25//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
 26
 27#include "afx/arcaneFX.h"
 28
 29#include "afx/afxEffectWrapper.h"
 30#include "afx/util/afxEase.h"
 31#include "afx/xm/afxXfmMod.h"
 32
 33//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
 34
 35afxXM_Params::afxXM_Params()
 36{
 37  pos.zero();
 38  ori.identity();
 39  scale.set(1.0f,1.0f,1.0f);
 40  pos2.zero();
 41  color.set(0.0f,0.0f,0.0f,0.0f);
 42  vis = 0.0;
 43}
 44
 45U32 afxXM_Params::getParameterOffset(U32 param, S32 component)
 46{
 47  switch (param)
 48  {
 49
 50  case POSITION:
 51    switch (component)
 52    {
 53    case 0:
 54      return Offset(pos.x, afxXM_Params);
 55    case 1:
 56      return Offset(pos.y, afxXM_Params);
 57    case 2:
 58      return Offset(pos.z, afxXM_Params);
 59    default:
 60      return Offset(pos, afxXM_Params);
 61    }
 62    break;
 63
 64  case ORIENTATION:
 65    return Offset(ori, afxXM_Params);
 66       
 67  case POSITION2:
 68    switch (component)
 69    {
 70    case 0:
 71      return Offset(pos2.x, afxXM_Params);
 72    case 1:
 73      return Offset(pos2.y, afxXM_Params);
 74    case 2:
 75      return Offset(pos2.z, afxXM_Params);
 76    default:
 77      return Offset(pos2, afxXM_Params);
 78    }
 79    break;
 80  
 81  case SCALE:
 82    switch (component)
 83    {
 84    case 0:
 85      return Offset(scale.x, afxXM_Params);
 86    case 1:
 87      return Offset(scale.y, afxXM_Params);
 88    case 2:
 89      return Offset(scale.z, afxXM_Params);
 90    default:
 91      return Offset(scale, afxXM_Params);
 92    }
 93    break;
 94
 95  case COLOR:
 96    switch (component)
 97    {
 98    case 0:
 99      return Offset(color.red, afxXM_Params);
100    case 1:
101      return Offset(color.green, afxXM_Params);
102    case 2:
103      return Offset(color.blue, afxXM_Params);
104    case 3:
105      return Offset(color.alpha, afxXM_Params);
106    default:
107      return Offset(color, afxXM_Params);
108    }
109    break;
110
111  case VISIBILITY:
112    return Offset(vis, afxXM_Params);
113  }
114
115  return BAD_OFFSET;
116}
117
118//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
119// BASE CLASSES
120//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
121
122IMPLEMENT_CO_DATABLOCK_V1(afxXM_BaseData);
123
124afxXM_BaseData::afxXM_BaseData()
125{
126  ignore_time_factor = false;
127}
128
129afxXM_BaseData::afxXM_BaseData(const afxXM_BaseData& other, bool temp_clone) : GameBaseData(other, temp_clone)
130{
131  ignore_time_factor = other.ignore_time_factor;
132}
133
134void afxXM_BaseData::initPersistFields()
135{
136  addField("ignoreTimeFactor",  TypeBool,   Offset(ignore_time_factor, afxXM_BaseData),
137    "...");
138
139  Parent::initPersistFields();
140
141  Con::setIntVariable("$afxXfmMod::POS",            POSITION);
142  Con::setIntVariable("$afxXfmMod::ORI",            ORIENTATION);
143  Con::setIntVariable("$afxXfmMod::POS2",           POSITION2);
144  Con::setIntVariable("$afxXfmMod::SCALE",          SCALE);
145  Con::setIntVariable("$afxXfmMod::ALL_BUT_SCALE",  ALL_BUT_SCALE);
146  Con::setIntVariable("$afxXfmMod::ALL",            ALL);
147}
148
149void afxXM_BaseData::packData(BitStream* stream)
150{
151  Parent::packData(stream);
152
153  stream->write(ignore_time_factor);
154}
155
156void afxXM_BaseData::unpackData(BitStream* stream)
157{
158  Parent::unpackData(stream);
159
160  stream->read(&ignore_time_factor);
161}
162
163//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//
164
165afxXM_Base::afxXM_Base(afxXM_BaseData* db, afxEffectWrapper* fxw)
166{
167  fx_wrapper = fxw;
168  time_factor = (db->ignore_time_factor) ? 1.0f : fxw->getTimeFactor();
169  datablock = db;
170}
171
172afxXM_Base::~afxXM_Base()
173{
174  if (datablock && datablock->isTempClone())
175    delete datablock;
176  datablock = 0;
177}
178
179//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
180
181IMPLEMENT_CO_DATABLOCK_V1(afxXM_WeightedBaseData);
182
183afxXM_WeightedBaseData::afxXM_WeightedBaseData()
184{
185  delay = 0;
186  lifetime = afxEffectDefs::INFINITE_LIFETIME;
187  fade_in_time = 0;
188  fade_out_time = 0;
189  fadein_ease.set(0.0f, 1.0f);
190  fadeout_ease.set(0.0f, 1.0f);
191  life_bias = 1.0f;
192}
193
194afxXM_WeightedBaseData::afxXM_WeightedBaseData(const afxXM_WeightedBaseData& other, bool temp_clone) : afxXM_BaseData(other, temp_clone)
195{
196  delay = other.delay;
197  lifetime = other.lifetime;
198  fade_in_time = other.fade_in_time;
199  fade_out_time = other.fade_out_time;
200  fadein_ease = other.fadein_ease;
201  fadeout_ease = other.fadeout_ease;
202  life_bias = other.life_bias;
203}
204
205bool afxXM_WeightedBaseData::hasFixedWeight() const
206{
207  return (delay == 0.0f && lifetime == afxEffectDefs::INFINITE_LIFETIME && fade_in_time == 0.0f && fade_out_time == 0.0f);
208}
209
210F32 afxXM_WeightedBaseData::getWeightFactor() const
211{
212  return 1.0f;
213}
214
215void afxXM_WeightedBaseData::initPersistFields()
216{
217  addField("delay",         TypeF32,      Offset(delay,         afxXM_WeightedBaseData),
218    "...");
219  addField("lifetime",      TypeF32,      Offset(lifetime,      afxXM_WeightedBaseData),
220    "...");
221  addField("fadeInTime",    TypeF32,      Offset(fade_in_time,  afxXM_WeightedBaseData),
222    "...");
223  addField("fadeOutTime",   TypeF32,      Offset(fade_out_time, afxXM_WeightedBaseData),
224    "...");
225  addField("fadeInEase",    TypePoint2F,  Offset(fadein_ease,   afxXM_WeightedBaseData),
226    "...");
227  addField("fadeOutEase",   TypePoint2F,  Offset(fadeout_ease,  afxXM_WeightedBaseData),
228    "...");
229  addField("lifetimeBias",  TypeF32,      Offset(life_bias,     afxXM_WeightedBaseData),
230    "...");
231
232  Parent::initPersistFields();
233}
234
235void afxXM_WeightedBaseData::packData(BitStream* stream)
236{
237  Parent::packData(stream);
238
239  if (stream->writeFlag(!hasFixedWeight()))
240  {
241    stream->write(delay);
242    stream->write(lifetime);
243    stream->write(fade_in_time);
244    stream->write(fade_out_time);
245    if (stream->writeFlag(fadein_ease.x != 0.0f || fadein_ease.y != 1.0f))
246    {
247      stream->writeFloat(fadein_ease.x, 16);
248      stream->writeFloat(fadein_ease.y, 16);
249    }
250    if (stream->writeFlag(fadeout_ease.x != 0.0f || fadeout_ease.y != 1.0f))
251    {
252      stream->writeFloat(fadeout_ease.x, 16);
253      stream->writeFloat(fadeout_ease.y, 16);
254    }
255    stream->write(life_bias);
256  }
257}
258
259void afxXM_WeightedBaseData::unpackData(BitStream* stream)
260{
261  Parent::unpackData(stream);
262
263  if (stream->readFlag()) // WEIGHTED?
264  {
265    stream->read(&delay);
266    stream->read(&lifetime);
267    stream->read(&fade_in_time);
268    stream->read(&fade_out_time);
269    if (stream->readFlag()) // FADE-IN EASED?
270    {
271      fadein_ease.x = stream->readFloat(16);
272      fadein_ease.y = stream->readFloat(16);
273    }
274    else
275      fadein_ease.set(0.0f, 1.0f);
276    if (stream->readFlag()) // FADE-OUT EASED?
277    {
278      fadeout_ease.x = stream->readFloat(16);
279      fadeout_ease.y = stream->readFloat(16);
280    }
281    else
282      fadeout_ease.set(0.0f, 1.0f);
283    stream->read(&life_bias);
284  }
285  else
286  {
287    delay = 0.0f;
288    lifetime = afxEffectDefs::INFINITE_LIFETIME;
289    fade_in_time = 0.0f;
290    fade_out_time = 0.0f;
291    fadein_ease.set(0.0f, 1.0f);
292    fadeout_ease.set(0.0f, 1.0f);
293    life_bias = 1.0f;
294  }
295}
296
297//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//
298
299afxXM_WeightedBase::afxXM_WeightedBase(afxXM_WeightedBaseData* db, afxEffectWrapper* fxw)
300: afxXM_Base(db, fxw) 
301{
302  wt_fadein = db->fade_in_time*db->life_bias;
303  wt_fadeout = db->fade_out_time*db->life_bias;
304  wt_fadein_ease = db->fadein_ease;
305  wt_fadeout_ease = db->fadeout_ease;
306  wt_start_time = db->delay;
307  wt_full_time = wt_start_time + wt_fadein;
308  wt_fade_time = wt_start_time + db->lifetime*db->life_bias;
309  wt_done_time = wt_fade_time + wt_fadeout;
310}
311
312F32 afxXM_WeightedBase::calc_weight_factor(F32 elapsed)
313{
314  if (elapsed < wt_start_time)     // pre
315    return 0.0f;
316  else if (elapsed < wt_full_time) // fade-in
317  {
318    F32 t = (elapsed - wt_start_time)/<a href="/coding/class/classafxxm__weightedbase/#classafxxm__weightedbase_1aa85765fb9bde45af832f1f2fb4c9e3d8">wt_fadein</a>;
319    return afxEase::t(t, wt_fadein_ease.x, wt_fadein_ease.y);
320  }
321  else if (elapsed < wt_fade_time) // full
322    return 1.0f;
323  else if (elapsed < wt_done_time) // fade-out
324  {
325    F32 t = (wt_done_time - elapsed)/<a href="/coding/class/classafxxm__weightedbase/#classafxxm__weightedbase_1a1ad3bca78193162105bb67f3526e60cb">wt_fadeout</a>;
326    return afxEase::t(t, wt_fadeout_ease.x, wt_fadeout_ease.y);
327  }
328  else                             // post
329    return 0;
330}
331
332//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~//
333
334
335