1/****************************************************************************************
2
3 Copyright (C) 2015 Autodesk, Inc.
4 All rights reserved.
5
6 Use of this software is subject to the terms of the Autodesk license agreement
7 provided at the time of installation or download, or which otherwise accompanies
8 this software in either electronic or hard copy form.
9
10****************************************************************************************/
11
12//! \file fbxclassid.h
13#ifndef _FBXSDK_CORE_CLASSID_H_
14#define _FBXSDK_CORE_CLASSID_H_
15
16#include <fbxsdk/fbxsdk_def.h>
17
18#include <fbxsdk/fbxsdk_nsbegin.h>
19
20class FbxClassIdInfo;
21class FbxObject;
22class FbxPropertyHandle;
23class FbxManager;
24
25//! The function pointer type for object constructor functions.
26typedef FbxObject* (*FbxObjectCreateProc)(FbxManager& pManager, const char* pName, const FbxObject* pFrom);
27
28/** Internal class used to differentiate objects during run-time. Essentially, each class has an unique ClassId, that the
29* system can request in order to test if the class match the description. This class implement the necessary tools to be able
30* to perform hierarchic class testing. This means that a class B that inherits from the class A will answer yes to a "Is A"
31* query of type A or B, but will answer no to a class C that can still inherit from A. All class must inherit from FbxObject
32* before they can have their own ClassId. When using the standard macros to create new types of objects in the FBX SDK, a
33* static ClassId will automatically be generated for that new class.
34*
35* When objects are exported to an FBX file, their class type is maintained using 3 sort of strings. They are the Object Type
36* string, the Object Sub Type string and the Object Type Prefix. There is no good or bad way to choose the value of these
37* identifiers, but it is preferable to use meaningful values to keep the ASCII version of FBX readable and easy to understand.
38* \see FbxObject */
39class FBXSDK_DLL FbxClassId
40{
41public:
42 //! Constructor.
43 FbxClassId();
44
45 /** Advanced constructor were we can specify the general parameters for this ClassId.
46 * \param pClassName The name of the class represented.
47 * \param pParentClassId The parent ClassId of this class.
48 * \param pConstructor A function pointer to a construction method for this ClassId.
49 * \param pFBXType The FBX file Object Type string associated to this class.
50 * \param pFBXSubType The FBX file Object Sub Type string associated to this class. */
51 FbxClassId(const char* pClassName, const FbxClassId& pParentClassId, FbxObjectCreateProc pConstructor=0, const char* pFBXType=NULL, const char* pFBXSubType=NULL);
52
53 //! Destructor.
54 void Destroy();
55
56 /** Retrieve the class name.
57 * \return The class identification string name. */
58 const char* GetName() const;
59
60 /** Retrieve the parent ClassId.
61 * \return The parent ClassId. */
62 FbxClassId GetParent() const;
63
64 /** Create an instance of this class.
65 * \param pManager The FBX SDK Manager to be used to instantiate this object. This allow the object to use the same memory manager as the provided manager.
66 * \param pName The name to assign to this new object instance.
67 * \param pFrom An object to clone if it matches the same ClassId. This is an optional parameter.
68 * \return The newly created instance of this class. */
69 FbxObject* Create(FbxManager& pManager, const char* pName, const FbxObject* pFrom);
70
71 /** Override the function pointer method to construct this object.
72 * \param pConstructor A newly defined function pointer to a construction method to replace the existing one.
73 * \return True if the operation was successful. */
74 bool Override(FbxObjectCreateProc pConstructor);
75
76 /** Test if this class is a hierarchical children of the specified class type. This is the standard method to differentiate object classes.
77 * \param pId The class type to test against self.
78 * \return True if the object is a hierarchical children of the type specified.
79 * \remark This function will perform a complete search until it reaches the top level class, but it will stop as soon as one ClassId matches the test. */
80 bool Is(const FbxClassId& pId) const;
81
82 /** Equivalence operator.
83 * \param pClassId The class type to test against self.
84 * \return \c true if the ClassId is exactly the same, \c false otherwise.
85 * \remark This function only perform direct equality test, and doesn't test hierarchic children. */
86 bool operator==(const FbxClassId& pClassId) const;
87
88 /** Inequivalence operator.
89 * \param pClassId The class type to test against self.
90 * \return \c true if the ClassId is not the same, \c false otherwise.
91 * \remark This function only perform direct inequality test, and doesn't test hierarchic children. */
92 bool operator!=(const FbxClassId& pClassId) const;
93
94 /** Retrieve the FBX file Object Type string associated to this class.
95 * \param pAskParent If \c true, retrieve the parent ClassId, but only if self ClassId is not valid.
96 * \return The FBX file Object Type string associated to this class. */
97 const char* GetFbxFileTypeName(bool pAskParent=false) const;
98
99 /** Retrieve the FBX file Object Sub Type string associated to this class.
100 * \return The FBX file Object Sub Type string associated to this class. */
101 const char* GetFbxFileSubTypeName() const;
102
103 /** Find out if self ClassId is valid or not.
104 * \return \c true if self ClassId is valid, \c false otherwise. */
105 inline bool IsValid() const { return mClassInfo ? true : false; }
106
107 /** Set the Object Type Prefix string associated to this class. This will change the "ObjectTypePrefix::" found in front
108 * of object name in the FBX file. This is useful to differentiate objects by their name without using the Object Type or
109 * Sub Type strings in the file.
110 * \param pObjectTypePrefix The Object Type prefix string. */
111 void SetObjectTypePrefix(const char* pObjectTypePrefix);
112
113 /** Retrieve the Object Type Prefix string associated to this class.
114 * \return The Object Type Prefix string. */
115 const char* GetObjectTypePrefix();
116
117 /** Retrieve the root property handle of this class. This is useful to access the default property hierarchy for this
118 * class. This allow users to retrieve information such as the default value for all properties of this class.
119 * \return The root property handle for this class. */
120 FbxPropertyHandle* GetRootClassDefaultPropertyHandle();
121
122 /** Increase the instance reference count for this class type.
123 * \return the new count of reference to this class after increment. */
124 int ClassInstanceIncRef();
125
126 /** Decrease the instance reference count for this class type.
127 * \return the new count of reference to this class after decrement. */
128 int ClassInstanceDecRef();
129
130 /** Retrieve the instance reference count for this class type.
131 * \return The reference count of this class type. */
132 int GetInstanceRef();
133
134/*****************************************************************************************************************************
135** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
136*****************************************************************************************************************************/
137#ifndef DOXYGEN_SHOULD_SKIP_THIS
138 inline FbxClassIdInfo* GetClassIdInfo() { return mClassInfo; }
139 inline const FbxClassIdInfo* GetClassIdInfo() const { return mClassInfo; }
140
141private:
142 FbxClassId(FbxClassIdInfo* mClassInfo);
143
144 bool SetFbxFileTypeName(const char* pName);
145 bool SetFbxFileSubTypeName(const char* pName);
146
147 FbxClassIdInfo* mClassInfo;
148
149 friend class FbxManager;
150#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
151};
152
153//! Functor to compare FbxClassId
154struct FbxClassIdCompare
155{
156 inline int operator()(const FbxClassId& pKeyA, const FbxClassId& pKeyB) const
157 {
158 const FbxClassIdInfo* lKeyA = pKeyA.GetClassIdInfo();
159 const FbxClassIdInfo* lKeyB = pKeyB.GetClassIdInfo();
160 return lKeyA < lKeyB ? -1 : (lKeyA > lKeyB ? 1 : 0);
161 }
162};
163
164#include <fbxsdk/fbxsdk_nsend.h>
165
166#endif /* _FBXSDK_CORE_CLASSID_H_ */
167