fbxcolladautils.h

Go to the documentation of this file.
00001 /****************************************************************************************
00002  
00003    Copyright (C) 2012 Autodesk, Inc.
00004    All rights reserved.
00005  
00006    Use of this software is subject to the terms of the Autodesk license agreement
00007    provided at the time of installation or download, or which otherwise accompanies
00008    this software in either electronic or hard copy form.
00009  
00010 ****************************************************************************************/
00011 
00013 #ifndef _FBXSDK_FILEIO_COLLADA_UTILS_H_
00014 #define _FBXSDK_FILEIO_COLLADA_UTILS_H_
00015 
00016 #include <map>
00017 #include <set>
00018 #include <vector>
00019 
00020 #include <fbxsdk.h>
00021 
00022 #include <components/libxml2-2.7.8/include/libxml/globals.h>
00023 
00024 #include "fbxcolladatokens.h"
00025 #include "fbxcolladaiostream.h"
00026 
00027 #include <fbxsdk/fbxsdk_nsbegin.h>
00028 
00029 #ifndef INT_MAX
00030     #define INT_MAX 0x7FFFFFFF
00031 #endif
00032 
00033 #ifndef CENTIMETERS_TO_INCHES
00034     #define CENTIMETERS_TO_INCHES 2.54f
00035 #endif
00036 
00037 #ifndef RADIANS_TO_DEGREES
00038     #define RADIANS_TO_DEGREES 57.295799f
00039 #endif
00040 
00041 enum DAE_Flow { kCOLLADAFlowIn, kCOLLADAFlowOut, kCOLLADAFlowInOut };
00042 
00043 const int MATRIX_STRIDE = 16;
00044 const int VECTOR_STRIDE = 3;
00045 
00046 const FbxString COLLADA_ID_PROPERTY_NAME = "COLLADA_ID";
00047 
00048 class XmlNodeDeletionPolicy
00049 {
00050 public:
00051     static inline void DeleteIt(xmlNode ** ptr)
00052     {
00053         if (*ptr != NULL)
00054         {
00055             xmlFreeNode(*ptr);
00056             *ptr = NULL;
00057         }
00058     }
00059 };
00060 
00061 typedef FbxScopedPtr<xmlNode, XmlNodeDeletionPolicy> XmlNodePtr;
00062 
00063 // Some information connecting COLLADA layer string, such as "NORMAL" or "UV", to FBX layer element type.
00064 struct ColladaLayerTraits
00065 {
00066     ColladaLayerTraits() 
00067         : mLayerType(FbxLayerElement::eUnknown), mLayerElementLength(0) {}
00068         
00069     ColladaLayerTraits(FbxLayerElement::EType pType, int pLength)
00070         : mLayerType(pType), mLayerElementLength(pLength) {}
00071 
00072     // Type of FBX element layer
00073     FbxLayerElement::EType mLayerType;
00074     // Count of double of each element in FBX element layer
00075     int mLayerElementLength;
00076 
00081     static const ColladaLayerTraits GetLayerTraits(const FbxString & pLabel);
00082 };
00083 
00088 void DAE_AddNotificationError(const FbxManager * pSdkManger, const FbxString & pErrorMessage);
00089 
00094 void DAE_AddNotificationWarning(const FbxManager * pSdkManger, const FbxString & pWarningMessage);
00095 
00096 void DAE_ExportArray(xmlNode* parentXmlNode, const char* id, FbxArray<FbxVector4>& arr);
00097 void DAE_ExportArray(xmlNode* parentXmlNode, const char* id, FbxArray<FbxVector2>& arr);
00098 void DAE_ExportArray(xmlNode* parentXmlNode, const char* id, FbxArray<FbxColor>& arr);
00099 void DAE_ExportArray(xmlNode* parentXmlNode, const char* id, FbxArray<double>& arr);
00100 void DAE_ExportArray(xmlNode* parentXmlNode, const char* id, FbxStringList& arr);
00101 
00102 // Syntax modification - for COLLADA 1.4
00103 xmlNode* DAE_ExportSource14(xmlNode* parentXmlNode, const char* id, FbxStringList& accessorParams, FbxArray<double>& arr, bool isCommonProfile=true); 
00104 xmlNode* DAE_ExportSource14(xmlNode* parentXmlNode, const char* id, FbxArray<FbxVector4>& arr);
00105 xmlNode* DAE_ExportSource14(xmlNode* parentXmlNode, const char* id, FbxArray<FbxVector2>& arr);
00106 xmlNode* DAE_ExportSource14(xmlNode* parentXmlNode, const char* id, FbxArray<FbxColor>& arr);
00107 xmlNode* DAE_ExportSource14(xmlNode* parentXmlNode, const char* id, FbxArray<FbxAMatrix>& arr); 
00108 xmlNode* DAE_ExportSource14(xmlNode* parentXmlNode, const char* id, FbxArray<FbxMatrix>& arr);
00109 xmlNode* DAE_ExportSource14(xmlNode* parentXmlNode, const char* id, FbxStringList& arr, const char* type, bool isCommonProfile=true);
00110 
00111 
00112 void DAE_ExportSourceArray(xmlNode* sourceNode, const char* id, FbxArray<FbxColor>& arr);
00113 void DAE_ExportSourceArray14(xmlNode* sourceNode, const char* id, FbxArray<FbxColor>& arr);
00114 
00115 xmlNode* DAE_ExportAccessor(xmlNode* parentXmlNode, const char* id, const char* arrayRef, int count, int stride, const char* name, const char* type);
00116 xmlNode* DAE_ExportAccessor14(xmlNode* parentXmlNode, const char* id, const char* arrayRef, int count, int stride, const char* name, const char* type);
00117 
00118 void DAE_AddXYZAccessor(xmlNode* parentXmlNode, const char* profile, const char* arrayName, const char* arrayRef, int count);
00119 void DAE_AddSTAccessor(xmlNode* parentXmlNode, const char* profile, const char* arrayName, const char* arrayRef, int count);
00120 void DAE_AddFlow(xmlNode* node, DAE_Flow flow);
00121 void DAE_AddXYZAccessor14(xmlNode* parentXmlNode, const char* profile, const char* arrayName, const char* arrayRef, int count);
00122 void DAE_AddSTAccessor14(xmlNode* parentXmlNode, const char* profile, const char* arrayName, const char* arrayRef, int count);
00123 
00124 // AddParameter functions for COLLADA 1.3.
00125 xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, const FbxColor& color, DAE_Flow flow);
00126 xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, const FbxVector4& vector, DAE_Flow flow);
00127 xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, double value, DAE_Flow flow);
00128 xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, bool value, DAE_Flow flow);
00129 xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, const char* type, const char* value, DAE_Flow flow);
00130 
00131 // Overload functions without DAE_Flow, for COLLADA 1.4.
00132 xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, const FbxDouble3& color);
00133 xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, const FbxColor& color);
00134 xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, const FbxVector4& vector);
00135 xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, double value);
00136 xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, bool value);
00137 xmlNode* DAE_AddParameter(xmlNode* parentXmlNode, const char* name, const char* type, const char* value);
00138 xmlNode* DAE_AddTechnique(xmlNode* parentXmlNode, const char* technique);
00139 void DAE_AddInput(xmlNode* parentXmlNode, const char* semantic, const char* source, int idx = -1);
00140 void DAE_AddInput14(xmlNode* parentXmlNode, const char* semantic, const char* source, int offset = -1, int set=-1);
00141 
00142 FbxString matrixToString(const FbxAMatrix& mx);
00143 
00144 typedef FbxArray<xmlNode*> CNodeList;
00145 
00151 void findChildrenByType(xmlNode* pParentElement, const std::set<FbxString>& pTypes, CNodeList& pChildrenElements);
00152 
00158 void findChildrenByType(xmlNode* pParentElement, const char * pType, CNodeList& pChildrenElements);
00159 
00160 xmlNode* getSourceAccessor(xmlNode* sourceNode);
00161 xmlNode* getTechniqueNode(xmlNode* parent, const char * profile);
00162 
00163 // Conversions
00164 inline double inchesToCentimeters(double val) { return floor(val / CENTIMETERS_TO_INCHES * 100000) / 100000; }
00165 inline double centimetersToInches(double val) { return floor(val * CENTIMETERS_TO_INCHES * 100000) / 100000; }
00166 
00167 inline double degreesToRadians(double val) { return floor(val / RADIANS_TO_DEGREES * 100000) / 100000; }
00168 inline double radiansToDegrees(double val) { return floor(val * RADIANS_TO_DEGREES * 100000) / 100000; }
00169 
00177 xmlNode* DAE_FindChildElementByAttribute(xmlNode* pParentElement, const char * pAttributeName,
00178                                         const char * pAttributeValue, const char * pDefaultAttributeValue = "");
00179 
00186 xmlNode* DAE_FindChildElementByTag(xmlNode* pParentElement, const char * pTag, xmlNode* pFindFrom = NULL);
00187 
00193 template <typename TYPE>
00194 void DAE_GetElementContent(xmlNode * pElement, TYPE & pData)
00195 {
00196     if (pElement != NULL)
00197     {
00198         xmlChar* lContent = xmlNodeGetContent(pElement);
00199         FromString(&pData, (const char *)lContent);
00200         FbxFree(lContent);
00201     }
00202 }
00203 
00208 bool DAE_CheckCompatibility(xmlNode * pNodeElement);
00209 
00214 void DAE_GetElementTag(xmlNode * pElement, FbxString & pTag);
00215 
00221 const FbxString DAE_GetElementAttributeValue(xmlNode * pElement, const char * pAttributeName);
00222 
00229 template <typename TYPE>
00230 bool DAE_GetElementAttributeValue(xmlNode * pElement, const char * pAttributeName, TYPE & pData)
00231 {
00232     if (!pElement || !pAttributeName)
00233         return false;
00234 
00235     xmlChar * lPropertyValue = xmlGetProp(pElement, (const xmlChar *)pAttributeName);
00236     if (lPropertyValue)
00237     {
00238         FromString(&pData, (const char *)lPropertyValue);
00239         FbxFree(lPropertyValue);
00240         return true;
00241     }
00242     return false;
00243 }
00244 
00245 // Special instantiation for string;
00246 // Omit the whitespaces, just return the whole string
00247 template <>
00248 inline bool DAE_GetElementAttributeValue(xmlNode * pElement,
00249                                          const char * pAttributeName,
00250                                          FbxString & pData)
00251 {
00252     if (!pElement || !pAttributeName)
00253         return false;
00254 
00255     xmlChar * lPropertyValue = xmlGetProp(pElement,
00256         (const xmlChar *)pAttributeName);
00257     if (lPropertyValue)
00258     {
00259         pData = (const char *)lPropertyValue;
00260         FbxFree(lPropertyValue);
00261         return true;
00262     }
00263     return false;
00264 }
00265 
00272 bool DAE_CompareAttributeValue(xmlNode * pElement,
00273                                       const char * pAttributeName,
00274                                       const char * pValue);
00275 
00280 const FbxString DAE_GetIDFromUrlAttribute(xmlNode * pElement);
00281 
00286 const FbxString DAE_GetIDFromSourceAttribute(xmlNode * pElement);
00287 
00293 const FbxString DAE_GetIDFromTargetAttribute(xmlNode * pElement);
00294 
00300 void DAE_SetName(FbxObject * pObject, const FbxString & pName, const FbxString & pID);
00301 
00310 xmlNode * DAE_GetSourceWithSemantic(xmlNode * pConsumerElement, const char * pSemantic,
00311                                     const std::map< FbxString, xmlNode* > & pSourceElements);
00312 
00319 template <typename T>
00320 xmlNode * DAE_AddChildElement(xmlNode * pParentElement, const char * pTag,
00321                               const T & pContent)
00322 {
00323     const FbxString lRepr = ToString(pContent);
00324     return xmlNewChild(pParentElement, NULL, (xmlChar *)pTag,
00325         (xmlChar *)lRepr.Buffer());
00326 }
00327 
00328 // Create a child element with empty content.
00329 inline xmlNode * DAE_AddChildElement(xmlNode * pParentElement, const char * pTag)
00330 {
00331     return DAE_AddChildElement(pParentElement, pTag, FbxString());
00332 }
00333 
00334 // Create a new element with empty content.
00335 inline xmlNode * DAE_NewElement(const char * pTag)
00336 {
00337     return xmlNewNode(NULL, reinterpret_cast<xmlChar*>(const_cast<char *>(pTag)));
00338 }
00339 
00346 template <typename T>
00347 xmlAttr * DAE_AddAttribute(xmlNode * pElement, const FbxString & pAttributeName,
00348                            const T & pAttributeValue)
00349 {
00350     const FbxString lRepr = ToString(pAttributeValue);
00351     return xmlNewProp(pElement, (xmlChar *)pAttributeName.Buffer(),
00352         (xmlChar *)lRepr.Buffer());
00353 }
00354 
00359 const FbxSystemUnit DAE_ImportUnit(xmlNode * pUnitElement);
00360 
00365 void IncreaseLclTranslationAnimation(FbxNode * pNode, FbxDouble3 & pOffset);
00366 
00372 void RecursiveSearchElement(xmlNode * pBaseElement, const char * pTag, FbxArray<xmlNode*> & pResult);
00373 
00374 #include <fbxsdk/fbxsdk_nsend.h>
00375 
00376 #endif /* _FBXSDK_FILEIO_COLLADA_UTILS_H_ */