afxMooring.cpp

Engine/source/afx/ce/afxMooring.cpp

More...

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