afxXfmMod.cpp
Engine/source/afx/xm/afxXfmMod.cpp
Public Functions
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