summaryrefslogtreecommitdiff
path: root/Runtime/ClusterRenderer/ClusterTransfer.cpp
blob: 40b6633f0cd02e0951ae0e028c7d1b83fba0505f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "UnityPrefix.h"
#if ENABLE_CLUSTER_SYNC
#include "ClusterTransfer.h"
#include "Runtime/Serialize/FileCache.h"
#include "Runtime/Serialize/CacheWrap.h"
#include "Runtime/Serialize/TransferFunctions/StreamedBinaryWrite.h"
#include "Runtime/Serialize/TransferFunctions/StreamedBinaryRead.h"
#include "Runtime/Input/InputManager.h"
#include "Runtime/Input/TimeManager.h"
#include "Runtime/Dynamics/PhysicsManager.h"

#ifdef DEBUG
#include "Runtime/Dynamics/Rigidbody.h"
#include "Runtime/Graphics/Transform.h"
#endif

template<class TransferFunc>
void TransferManagerStates (TransferFunc& transfer)
{
	// TODO: use macro incase manager is not present
	GetInputManager().ClusterTransfer(transfer);
    GetTimeManager().ClusterTransfer(transfer);
	GetPhysicsManager().ClusterTransfer(transfer);
}

void ClusterTransfer::TransferToBuffer(dynamic_array<UInt8>& buffer)
{
	StreamedBinaryWrite<false> writeStream;
	CachedWriter& writeCache = writeStream.Init (0, BuildTargetSelection::NoTarget());
	MemoryCacheWriter memoryCache (buffer);
	writeCache.InitWrite (memoryCache);
	// transfer stuff
	TransferManagerStates(writeStream);
	// end of transfer
	writeCache.CompleteWriting();
}

void ClusterTransfer::TransferFromBuffer(dynamic_array<UInt8>& buffer)
{
	// transfer setup
	StreamedBinaryRead<false> readStream;
	CachedReader& readCache = readStream.Init (0);
	MemoryCacheReader memoryCache (buffer);
	readCache.InitRead (memoryCache, 0, buffer.size());
	// transfer stuff
	TransferManagerStates(readStream);
	// end of transfer
	readCache.End();
}

#ifdef DEBUG
void ClusterTransfer::TransferToFile(int slaveId)
{
	// create the buffer
	dynamic_array<UInt8> buffer(kMemTempAlloc);
	
	// create the stream
	StreamedBinaryWrite<false> writeStream;
	CachedWriter& writeCache = writeStream.Init (0, BuildTargetSelection::NoTarget());
	MemoryCacheWriter memoryCache (buffer);
	writeCache.InitWrite (memoryCache);
	
	// now write the data out to a file
	for (int level=0;level<PhysicsManager::kMaxSortedActorsDepth;level++)
	{
		PhysicsManager::RigidbodyList& bodies = GetPhysicsManager().m_SortedActors[level];
		for (PhysicsManager::RigidbodyList::iterator i=bodies.begin();i != bodies.end();i++)
		{
			Rigidbody& body = **i;
			
			if (body.m_DisableReadUpdateTransform == 0)
			{
				GameObject& go = body.GetGameObject();
				Transform& transform = go.GetComponent (Transform);
				transform.Transfer(writeStream);
			}
		}
	}
	
	// end of transfer
	writeCache.CompleteWriting();
	
	
	// now we have the buffer, we put it into a file, and compare that with other slaves.
	char fileName[32];
	sprintf(fileName, "dump%d.dat\0", slaveId);
	FILE* dump = fopen(fileName, "wb");
	fwrite(buffer.data(), sizeof(UInt8), buffer.size(), dump);
	fclose(dump);
}
#endif // DEBUG

#endif