Urho3D/Source/Engine/Scene/ReplicationState.h

200 строки
5.5 KiB
C++

//
// Copyright (c) 2008-2014 the Urho3D project.
//
// 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.
//
#pragma once
#include "Attribute.h"
#include "HashMap.h"
#include "HashSet.h"
#include "Ptr.h"
#include "StringHash.h"
#include <cstring>
namespace Urho3D
{
static const unsigned MAX_NETWORK_ATTRIBUTES = 64;
class Component;
class Connection;
class Node;
class Scene;
struct ReplicationState;
struct ComponentReplicationState;
struct NodeReplicationState;
struct SceneReplicationState;
/// Dirty attribute bits structure for network replication.
struct URHO3D_API DirtyBits
{
/// Construct empty.
DirtyBits() :
count_(0)
{
memset(data_, 0, MAX_NETWORK_ATTRIBUTES / 8);
}
/// Copy-construct.
DirtyBits(const DirtyBits& bits) :
count_(bits.count_)
{
memcpy(data_, bits.data_, MAX_NETWORK_ATTRIBUTES / 8);
}
/// Set a bit.
void Set(unsigned index)
{
if (index < MAX_NETWORK_ATTRIBUTES)
{
unsigned byteIndex = index >> 3;
unsigned bit = 1 << (index & 7);
if ((data_[byteIndex] & bit) == 0)
{
data_[byteIndex] |= bit;
++count_;
}
}
}
/// Clear a bit.
void Clear(unsigned index)
{
if (index < MAX_NETWORK_ATTRIBUTES)
{
unsigned byteIndex = index >> 3;
unsigned bit = 1 << (index & 7);
if ((data_[byteIndex] & bit) != 0)
{
data_[byteIndex] &= ~bit;
--count_;
}
}
}
/// Clear all bits.
void ClearAll()
{
memset(data_, 0, MAX_NETWORK_ATTRIBUTES / 8);
count_ = 0;
}
/// Return if bit is set.
bool IsSet(unsigned index) const
{
if (index < MAX_NETWORK_ATTRIBUTES)
{
unsigned byteIndex = index >> 3;
unsigned bit = 1 << (index & 7);
return (data_[byteIndex] & bit) != 0;
}
else
return false;
}
/// Return number of set bits.
unsigned Count() const { return count_; }
/// Bit data.
unsigned char data_[MAX_NETWORK_ATTRIBUTES / 8];
/// Number of set bits.
unsigned char count_;
};
/// Per-object attribute state for network replication, allocated on demand.
struct URHO3D_API NetworkState
{
/// Cached network attribute infos.
const Vector<AttributeInfo>* attributes_;
/// Current network attribute values.
Vector<Variant> currentValues_;
/// Previous network attribute values.
Vector<Variant> previousValues_;
/// Replication states that are tracking this object.
PODVector<ReplicationState*> replicationStates_;
/// Previous user variables.
VariantMap previousVars_;
};
/// Base class for per-user network replication states.
struct URHO3D_API ReplicationState
{
/// Parent network connection.
Connection* connection_;
};
/// Per-user component network replication state.
struct URHO3D_API ComponentReplicationState : public ReplicationState
{
/// Parent node replication state.
NodeReplicationState* nodeState_;
/// Link to the actual component.
WeakPtr<Component> component_;
/// Dirty attribute bits.
DirtyBits dirtyAttributes_;
};
/// Per-user node network replication state.
struct URHO3D_API NodeReplicationState : public ReplicationState
{
/// Construct.
NodeReplicationState() :
ReplicationState(),
priorityAcc_(0.0f),
markedDirty_(false)
{
}
/// Parent scene replication state.
SceneReplicationState* sceneState_;
/// Link to the actual node.
WeakPtr<Node> node_;
/// Dirty attribute bits.
DirtyBits dirtyAttributes_;
/// Dirty user vars.
HashSet<StringHash> dirtyVars_;
/// Components by ID.
HashMap<unsigned, ComponentReplicationState> componentStates_;
/// Interest management priority accumulator.
float priorityAcc_;
/// Whether exists in the SceneState's dirty set.
bool markedDirty_;
};
/// Per-user scene network replication state.
struct URHO3D_API SceneReplicationState : public ReplicationState
{
/// Nodes by ID.
HashMap<unsigned, NodeReplicationState> nodeStates_;
/// Dirty node IDs.
HashSet<unsigned> dirtyNodes_;
void Clear()
{
nodeStates_.Clear();
dirtyNodes_.Clear();
}
};
}