afxMooring.cpp
Engine/source/afx/ce/afxMooring.cpp
Public Defines
define
myOffset(field) (field, )
Public Functions
ConsoleDocClass(afxMooring , "@brief A Mooring effect as defined by an <a href="/coding/class/classafxmooringdata/">afxMooringData</a> <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">datablock.\n\n</a>" "A Mooring is an invisible effect object which can be positioned and oriented within " "<a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> scene like other objects. Its <a href="/coding/file/x86unixmain_8cpp/#x86unixmain_8cpp_1a217dbf8b442f20279ea00b898af96f52">main</a> purpose is <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> serve as <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> common mount point <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> " "other effects within the same choreographer. Typically one uses AFX animation " "features <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> create movement <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> Mooring and then other effects are bound <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> it " "using effect-<a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a>-effect constraints (#effect).\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">afxEffects\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">AFX\n</a>" )
ConsoleDocClass(afxMooringData , "@brief A datablock that specifies <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> Mooring <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">effect.\n\n</a>" "A Mooring is an invisible effect object which can be positioned and oriented within <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> scene like other objects. Its <a href="/coding/file/x86unixmain_8cpp/#x86unixmain_8cpp_1a217dbf8b442f20279ea00b898af96f52">main</a> " "purpose is <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> serve as <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> common mount point <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> other effects within the same choreographer. Typically one uses AFX " "animation features <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> create movement <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> Mooring and then other effects are bound <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> it using effect-<a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a>-effect " "constraints (#effect)." "\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">afxEffects\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">AFX\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">Datablocks\n</a>" )
Detailed Description
Public Defines
myOffset(field) (field, )
Public Functions
ConsoleDocClass(afxMooring , "@brief A Mooring effect as defined by an <a href="/coding/class/classafxmooringdata/">afxMooringData</a> <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">datablock.\n\n</a>" "A Mooring is an invisible effect object which can be positioned and oriented within " "<a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> scene like other objects. Its <a href="/coding/file/x86unixmain_8cpp/#x86unixmain_8cpp_1a217dbf8b442f20279ea00b898af96f52">main</a> purpose is <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> serve as <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> common mount point <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> " "other effects within the same choreographer. Typically one uses AFX animation " "features <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> create movement <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> Mooring and then other effects are bound <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> it " "using effect-<a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a>-effect constraints (#effect).\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">afxEffects\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">AFX\n</a>" )
ConsoleDocClass(afxMooringData , "@brief A datablock that specifies <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> Mooring <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">effect.\n\n</a>" "A Mooring is an invisible effect object which can be positioned and oriented within <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> scene like other objects. Its <a href="/coding/file/x86unixmain_8cpp/#x86unixmain_8cpp_1a217dbf8b442f20279ea00b898af96f52">main</a> " "purpose is <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> serve as <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> common mount point <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> other effects within the same choreographer. Typically one uses AFX " "animation features <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> create movement <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1a2732ab74fa0237854c2ba0f75f88a624">for</a> <a href="/coding/file/pointer_8h/#pointer_8h_1aeeddce917cf130d62c370b8f216026dd">a</a> Mooring and then other effects are bound <a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a> it using effect-<a href="/coding/file/cmdgram_8cpp/#cmdgram_8cpp_1a5bafda9519252aa2d0fd038153f77dca">to</a>-effect " "constraints (#effect)." "\<a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">n\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">afxEffects\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">AFX\n</a>" "@ingroup <a href="/coding/file/cmdscan_8cpp/#cmdscan_8cpp_1aeab71244afb687f16d8c4f5ee9d6ef0e">Datablocks\n</a>" )
IMPLEMENT_CO_DATABLOCK_V1(afxMooringData )
IMPLEMENT_CO_NETOBJECT_V1(afxMooring )
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 "math/mathIO.h" 30 31#include "afx/afxChoreographer.h" 32#include "afx/ce/afxMooring.h" 33 34//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~// 35// afxMooringData 36 37IMPLEMENT_CO_DATABLOCK_V1(afxMooringData); 38 39ConsoleDocClass( afxMooringData, 40 "@brief A datablock that specifies a Mooring effect.\n\n" 41 42 "A Mooring is an invisible effect object which can be positioned and oriented within a scene like other objects. Its main " 43 "purpose is to serve as a common mount point for other effects within the same choreographer. Typically one uses AFX " 44 "animation features to create movement for a Mooring and then other effects are bound to it using effect-to-effect " 45 "constraints (#effect)." 46 "\n\n" 47 48 "@ingroup afxEffects\n" 49 "@ingroup AFX\n" 50 "@ingroup Datablocks\n" 51); 52 53afxMooringData::afxMooringData() 54{ 55 track_pos_only = false; 56 networking = SCOPE_ALWAYS; 57 display_axis_marker = false; 58} 59 60afxMooringData::afxMooringData(const afxMooringData& other, bool temp_clone) : GameBaseData(other, temp_clone) 61{ 62 track_pos_only = other.track_pos_only; 63 networking = other.networking; 64 display_axis_marker = other.display_axis_marker; 65} 66 67#define myOffset(field) Offset(field, afxMooringData) 68 69void afxMooringData::initPersistFields() 70{ 71 addField("displayAxisMarker", TypeBool, myOffset(display_axis_marker), 72 "Specifies whether to display an axis to help visualize the position and orientation " 73 "of the mooring."); 74 addField("trackPosOnly", TypeBool, myOffset(track_pos_only), 75 "This field is only meaningful for networking settings of SCOPE_ALWAYS and GHOSTABLE. " 76 "In these cases, client moorings are ghosting a mooring on the server, and " 77 "trackPosOnly determines if the client moorings need to be updated with the server " 78 "mooring's complete transform or just its position. If only the position needs to be " 79 "tracked, setting trackPosOnly to true will reduce the network traffic."); 80 addField("networking", TypeS8, myOffset(networking), 81 "Specifies the networking model used for the mooring and should be one of: " 82 "$AFX::SCOPE_ALWAYS, $AFX::GHOSTABLE, $AFX::SERVER_ONLY, or $AFX::CLIENT_ONLY"); 83 84 Parent::initPersistFields(); 85} 86 87bool afxMooringData::onAdd() 88{ 89 if (Parent::onAdd() == false) 90 return false; 91 92 return true; 93} 94 95void afxMooringData::packData(BitStream* stream) 96{ 97 Parent::packData(stream); 98 stream->write(display_axis_marker); 99 stream->write(track_pos_only); 100 stream->write(networking); 101} 102 103void afxMooringData::unpackData(BitStream* stream) 104{ 105 Parent::unpackData(stream); 106 stream->read(&display_axis_marker); 107 stream->read(&track_pos_only); 108 stream->read(&networking); 109} 110 111//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~// 112//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~// 113// afxMooring 114 115IMPLEMENT_CO_NETOBJECT_V1(afxMooring); 116 117ConsoleDocClass( afxMooring, 118 "@brief A Mooring effect as defined by an afxMooringData datablock.\n\n" 119 120 "A Mooring is an invisible effect object which can be positioned and oriented within " 121 "a scene like other objects. Its main purpose is to serve as a common mount point for " 122 "other effects within the same choreographer. Typically one uses AFX animation " 123 "features to create movement for a Mooring and then other effects are bound to it " 124 "using effect-to-effect constraints (#effect).\n" 125 126 "@ingroup afxEffects\n" 127 "@ingroup AFX\n" 128); 129 130afxMooring::afxMooring() 131{ 132 mNetFlags.set(Ghostable | ScopeAlways); 133 134 chor_id = 0; 135 hookup_with_chor = false; 136 ghost_cons_name = ST_NULLSTRING; 137 mDataBlock = NULL; 138} 139 140afxMooring::afxMooring(U32 networking, U32 chor_id, StringTableEntry cons_name) 141{ 142 if (networking & SCOPE_ALWAYS) 143 { 144 mNetFlags.clear(); 145 mNetFlags.set(Ghostable | ScopeAlways); 146 } 147 else if (networking & GHOSTABLE) 148 { 149 mNetFlags.clear(); 150 mNetFlags.set(Ghostable); 151 } 152 else if (networking & SERVER_ONLY) 153 { 154 mNetFlags.clear(); 155 } 156 else // if (networking & CLIENT_ONLY) 157 { 158 mNetFlags.clear(); 159 mNetFlags.set(IsGhost); 160 } 161 162 this->chor_id = chor_id; 163 hookup_with_chor = false; 164 this->ghost_cons_name = cons_name; 165 mDataBlock = NULL; 166} 167 168afxMooring::~afxMooring() 169{ 170} 171 172//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~// 173 174bool afxMooring::onNewDataBlock(GameBaseData* dptr, bool reload) 175{ 176 mDataBlock = dynamic_cast<afxMooringData*>(dptr); 177 if (!mDataBlock || !Parent::onNewDataBlock(dptr, reload)) 178 return false; 179 180 return true; 181} 182 183void afxMooring::advanceTime(F32 dt) 184{ 185 Parent::advanceTime(dt); 186 187 if (hookup_with_chor) 188 { 189 afxChoreographer* chor = arcaneFX::findClientChoreographer(chor_id); 190 if (chor) 191 { 192 chor->setGhostConstraintObject(this, ghost_cons_name); 193 hookup_with_chor = false; 194 } 195 } 196 197 Point3F pos = getRenderPosition(); 198} 199 200U32 afxMooring::packUpdate(NetConnection* conn, U32 mask, BitStream* stream) 201{ 202 U32 retMask = Parent::packUpdate(conn, mask, stream); 203 204 // InitialUpdate 205 if (stream->writeFlag(mask & InitialUpdateMask)) 206 { 207 stream->write(chor_id); 208 stream->writeString(ghost_cons_name); 209 } 210 211 if (stream->writeFlag(mask & PositionMask)) 212 { 213 if (mDataBlock->track_pos_only) 214 mathWrite(*stream, mObjToWorld.getPosition()); 215 else 216 stream->writeAffineTransform(mObjToWorld); 217 } 218 219 return retMask; 220} 221 222//~~~~~~~~~~~~~~~~~~~~// 223 224void afxMooring::unpackUpdate(NetConnection * conn, BitStream * stream) 225{ 226 Parent::unpackUpdate(conn, stream); 227 228 // InitialUpdate 229 if (stream->readFlag()) 230 { 231 stream->read(&chor_id); 232 ghost_cons_name = stream->readSTString(); 233 234 if (chor_id != 0 && ghost_cons_name != ST_NULLSTRING) 235 hookup_with_chor = true; 236 } 237 238 if (stream->readFlag()) 239 { 240 if (mDataBlock->track_pos_only) 241 { 242 Point3F pos; 243 mathRead(*stream, &pos); 244 setPosition(pos); 245 } 246 else 247 { 248 MatrixF mat; 249 stream->readAffineTransform(&mat); 250 setTransform(mat); 251 setRenderTransform(mat); 252 } 253 } 254} 255 256void afxMooring::setTransform(const MatrixF& mat) 257{ 258 Parent::setTransform(mat); 259 setMaskBits(PositionMask); 260} 261 262bool afxMooring::onAdd() 263{ 264 if(!Parent::onAdd()) 265 return false; 266 267 mObjBox = Box3F(Point3F(-0.5, -0.5, -0.5), Point3F(0.5, 0.5, 0.5)); 268 269 addToScene(); 270 271 return true; 272} 273 274void afxMooring::onRemove() 275{ 276 removeFromScene(); 277 278 Parent::onRemove(); 279} 280 281//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~// 282