aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/common/include/PVDParameterizedHandler.h
blob: 5a17fce792483c80170717c017984981e3b66509 (plain) (blame)
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
 * Copyright (c) 2008-2017, NVIDIA CORPORATION.  All rights reserved.
 *
 * NVIDIA CORPORATION and its licensors retain all intellectual property
 * and proprietary rights in and to this software, related documentation
 * and any modifications thereto.  Any use, reproduction, disclosure or
 * distribution of this software and related documentation without an express
 * license agreement from NVIDIA CORPORATION is strictly prohibited.
 */


#ifndef PVD_PARAMETERIZED_HANDLER
#define PVD_PARAMETERIZED_HANDLER

#include "ApexUsingNamespace.h"
#ifndef WITHOUT_PVD

#include "PsUserAllocated.h"
#include "ApexPvdClient.h"

#include "PsHashSet.h"
#include "PsHashMap.h"

namespace NvParameterized
{
class Definition;
class Handle;
}

namespace physx
{
namespace pvdsdk
{
	struct NamespacedName;

	class PvdDataStream;

	class StructId
	{
	public:
		StructId(void* address, const char* name) :
		  mAddress(address),
			  mName(name)
		{}

		bool operator<(const StructId& other) const
		{
			if (mAddress < other.mAddress)
				return true;
			else
				return (mAddress == other.mAddress) && strcmp(mName, other.mName) < 0;
		}

		bool operator==(const StructId& other) const
		{
			return (mAddress == other.mAddress) && strcmp(mName, other.mName) == 0;
		}

		operator size_t() const
		{
			return (size_t)mAddress;
		}

	private:
		void* mAddress;
		const char* mName;
	};

	class PvdParameterizedHandler : public nvidia::UserAllocated
	{
	public:

		PvdParameterizedHandler(pvdsdk::PvdDataStream& pvdStream) :
			 mPvdStream(&pvdStream)
			,mNextStructId(1)
		{
		}

		/**
		\brief Adds properties to the provided pvdClassName and creates classes for Structs that are inside the paramDefinition tree (not for references, though)
		*/
		void									initPvdClasses(const NvParameterized::Definition& paramDefinition, const char* pvdClassName);

		/**
		\brief Updates the provided pvd instance properties with the values in the provided handle, recursively.
		pvdAction specifies if only properties are updated, if pvd instances for structs should be created (for initialization) or if they should be destroyed.
		*/
		void									updatePvd(const void* pvdInstance, NvParameterized::Handle& paramsHandle, PvdAction::Enum pvdAction = PvdAction::UPDATE);

	protected:

		bool									createClass(const NamespacedName& className);
		bool									getPvdType(const NvParameterized::Definition& def, pvdsdk::NamespacedName& pvdTypeName);
		size_t									getStructId(void* structAddress, const char* structName, bool deleteId);
		const void*								getPvdId(const NvParameterized::Handle& handle, bool deleteId);
		bool									setProperty(const void* pvdInstance, NvParameterized::Handle& propertyHandle, bool isArrayElement, PvdAction::Enum pvdAction);

	
		pvdsdk::PvdDataStream*	mPvdStream;

		physx::shdfnd::HashSet<const char*>		mCreatedClasses;
		physx::shdfnd::HashSet<const void*>		mInstanceIds;

		size_t									mNextStructId;
		nvidia::HashMap<StructId, size_t>mStructIdMap;
	};

} // namespacePvdNxParamSerializer
}

#endif //WITHOUT_PVD

#endif // #ifndef PVD_PARAMETERIZED_HANDLER