[964] | 1 | /*
|
---|
| 2 | Copyright (C) 2005-2006 Feeling Software Inc.
|
---|
| 3 | MIT License: http://www.opensource.org/licenses/mit-license.php
|
---|
| 4 | */
|
---|
| 5 |
|
---|
| 6 | /**
|
---|
| 7 | @file FUDaeWriter.h
|
---|
| 8 | This file contains the FUDaeWriter namespace.
|
---|
| 9 | */
|
---|
| 10 |
|
---|
| 11 | #ifndef _FU_DAE_WRITER_H_
|
---|
| 12 | #define _FU_DAE_WRITER_H_
|
---|
| 13 |
|
---|
| 14 | #ifdef HAS_LIBXML
|
---|
| 15 |
|
---|
| 16 | #include "FUtils/FUDaeEnum.h"
|
---|
| 17 | #include "FUtils/FUDaeSyntax.h"
|
---|
| 18 | #include "FUtils/FUUri.h"
|
---|
| 19 | #include "FUtils/FUXmlWriter.h"
|
---|
| 20 |
|
---|
| 21 | /**
|
---|
| 22 | Common COLLADA XML writing functions.
|
---|
| 23 | Based on top of the FUXmlWriter namespace and the LibXML2 library.
|
---|
| 24 | This whole namespace is considered external and should only be used
|
---|
| 25 | by the FCollada library.
|
---|
| 26 |
|
---|
| 27 | @ingroup FUtils
|
---|
| 28 | */
|
---|
| 29 | namespace FUDaeWriter
|
---|
| 30 | {
|
---|
| 31 | using namespace FUXmlWriter;
|
---|
| 32 |
|
---|
| 33 | /** Common accessor type string arrays.
|
---|
| 34 | These are NULL-terminated and can be used with the AddAccessor function. */
|
---|
| 35 | struct FCOLLADA_EXPORT FUDaeAccessor
|
---|
| 36 | {
|
---|
| 37 | static const char* XYZW[]; /**< Use for vector and position sources. */
|
---|
| 38 | static const char* RGBA[]; /**< Use for color sources. */
|
---|
| 39 | static const char* STPQ[]; /**< Use for texture coordinate sources. */
|
---|
| 40 | };
|
---|
| 41 |
|
---|
| 42 | /** Writes out the \<extra\>\<technique\> element unto the given parent xml tree node.
|
---|
| 43 | This function ensures that only one \<extra\> element exists and that only
|
---|
| 44 | one \<technique\> element exists for the given profile.
|
---|
| 45 | @param parent The parent XML tree node.
|
---|
| 46 | @param profile The application-specific profile name.
|
---|
| 47 | @return The \<technique\> XML tree node. */
|
---|
| 48 | FCOLLADA_EXPORT xmlNode* AddExtraTechniqueChild(xmlNode* parent, const char* profile);
|
---|
| 49 |
|
---|
| 50 | /** Writes out the \<technique\> element unto the given parent xml tree node.
|
---|
| 51 | This function ensures that only one \<technique\> element exists for the given profile.
|
---|
| 52 | @param parent The parent XML tree node.
|
---|
| 53 | @param profile The application-specific profile name.
|
---|
| 54 | @return The \<technique\> XML tree node. */
|
---|
| 55 | FCOLLADA_EXPORT xmlNode* AddTechniqueChild(xmlNode* parent, const char* profile);
|
---|
| 56 |
|
---|
| 57 | /** Writes out a COLLADA parameter element.
|
---|
| 58 | This is used for the source accessors.
|
---|
| 59 | A COLLADA parameter has the form: \<param name='' type=''\>value\</param\>.
|
---|
| 60 | @param parent The parent XML tree node.
|
---|
| 61 | @param name The name attribute value.
|
---|
| 62 | @param type The type attribute value.
|
---|
| 63 | @return The created \<param\> XML tree node. */
|
---|
| 64 | FCOLLADA_EXPORT xmlNode* AddParameter(xmlNode* parent, const char* name, const char* type);
|
---|
| 65 |
|
---|
| 66 | /** Writes out a COLLADA input element.
|
---|
| 67 | This is a very common element. For example, it is used in
|
---|
| 68 | the \<polygons\>, \<sampler\> and \<joints\> elements.
|
---|
| 69 | A COLLADA input has the form: \<input source='\#source_id' semantic='' offset='' set=''/\>.
|
---|
| 70 | @param parent The parent XML tree node.
|
---|
| 71 | @param sourceId The source attribute value.
|
---|
| 72 | This is the COLLADA id of a valid \<source\> element.
|
---|
| 73 | @param semantic The semantic attribute value.
|
---|
| 74 | This is a valid COLLADA semantic.
|
---|
| 75 | For example: POSITION, TEXCOORD, WEIGHT, IN_TANGENT.
|
---|
| 76 | @param offset The optional offset attribute value.
|
---|
| 77 | When used in conjunction with the \<v\> or the \<p\> elements, this is
|
---|
| 78 | the offset for the input data indices within the interleaved indices.
|
---|
| 79 | @param set The optional set attribute value.
|
---|
| 80 | This unsigned integer is used to tied together multiple inputs.
|
---|
| 81 | @return The created \<input\> XML tree node. */
|
---|
| 82 | FCOLLADA_EXPORT xmlNode* AddInput(xmlNode* parent, const char* sourceId, const char* semantic, int32 offset=-1, int32 set=-1);
|
---|
| 83 | inline xmlNode* AddInput(xmlNode* parent, const string& sourceId, const char* semantic, int32 offset=-1, int32 set=-1) { return AddInput(parent, sourceId.c_str(), semantic, offset, set); } /**< See above. */
|
---|
| 84 |
|
---|
| 85 | /** Writes out a COLLADA strongly-typed data array.
|
---|
| 86 | To write out data values, it is preferable to use the AddSourceX functions.
|
---|
| 87 | @param parent The parent XML tree node.
|
---|
| 88 | @param id The COLLADA id of the array.
|
---|
| 89 | This id is used only by the accessor of a source.
|
---|
| 90 | @param arrayType The strongly-typed name of the array.
|
---|
| 91 | For example: \<float_array\>, \<Name_array\>.
|
---|
| 92 | @param content The array content.
|
---|
| 93 | @param count The number of entries within the content of the array.
|
---|
| 94 | @return The created XML tree node. */
|
---|
| 95 | FCOLLADA_EXPORT xmlNode* AddArray(xmlNode* parent, const char* id, const char* arrayType, const char* content, size_t count);
|
---|
| 96 |
|
---|
| 97 | /** Writes out a COLLADA array of matrices.
|
---|
| 98 | To write out data values, it is preferable to use the AddSourceX functions.
|
---|
| 99 | @param parent The parent XML tree node.
|
---|
| 100 | @param id The COLLADA id of the array.
|
---|
| 101 | This id is used only by the accessor of a source.
|
---|
| 102 | @param values A list of matrices.
|
---|
| 103 | @param lengthFactor An optional scale factor for
|
---|
| 104 | the translation column of the matrices.
|
---|
| 105 | @return The created XML tree node. */
|
---|
| 106 | FCOLLADA_EXPORT xmlNode* AddArray(xmlNode* parent, const char* id, const FMMatrix44List& values, float lengthFactor=1.0f);
|
---|
| 107 |
|
---|
| 108 | /** Writes out a COLLADA array of 3D vectors.
|
---|
| 109 | To write out data values, it is preferable to use the AddSourceX functions.
|
---|
| 110 | @param parent The parent XML tree node.
|
---|
| 111 | @param id The COLLADA id of the array.
|
---|
| 112 | This id is used only by the accessor of a source.
|
---|
| 113 | @param values A list of 3D vectors.
|
---|
| 114 | @param lengthFactor An optional scale factor for all the 3D vectors.
|
---|
| 115 | @return The created XML tree node. */
|
---|
| 116 | FCOLLADA_EXPORT xmlNode* AddArray(xmlNode* parent, const char* id, const FMVector3List& values, float lengthFactor=1.0f);
|
---|
| 117 |
|
---|
| 118 | /** Writes out a COLLADA array of floating-point values.
|
---|
| 119 | To write out data values, it is preferable to use the AddSourceX functions.
|
---|
| 120 | @param parent The parent XML tree node.
|
---|
| 121 | @param id The COLLADA id of the array.
|
---|
| 122 | This id is used only by the accessor of a source.
|
---|
| 123 | @param values A list of floating-point values.
|
---|
| 124 | @param lengthFactor An optional scale factor for all the floating-point values.
|
---|
| 125 | @return The created XML tree node. */
|
---|
| 126 | FCOLLADA_EXPORT xmlNode* AddArray(xmlNode* parent, const char* id, const FloatList& values, float lengthFactor=1.0f);
|
---|
| 127 |
|
---|
| 128 | /** Writes out a COLLADA array of UTF-8 tokens.
|
---|
| 129 | To write out data values, it is preferable to use the AddSourceX functions.
|
---|
| 130 | @param parent The parent XML tree node.
|
---|
| 131 | @param id The COLLADA id of the array.
|
---|
| 132 | This id is used only by the accessor of a source.
|
---|
| 133 | @param values A list of UTF-8 tokens. The members of this list will appear
|
---|
| 134 | space-separated within the COLLADA document.
|
---|
| 135 | @param arrayType The COLLADA element name for the output array.
|
---|
| 136 | Defaults to \<Name_array\>. This might also be \<IDRef_array\>.
|
---|
| 137 | @return The created XML tree node. */
|
---|
| 138 | FCOLLADA_EXPORT xmlNode* AddArray(xmlNode* parent, const char* id, const StringList& values, const char* arrayType=DAE_NAME_ARRAY_ELEMENT);
|
---|
| 139 |
|
---|
| 140 | /** Writes out a COLLADA accessor to be used within a source.
|
---|
| 141 | This function should really be called only from within AddSourceX functions.
|
---|
| 142 | @param parent The parent XML tree node.
|
---|
| 143 | @param arrayId The COLLADA id of the array.
|
---|
| 144 | @param count The number of complete elements within the array.
|
---|
| 145 | @param stride The number of values that should be used together to create one array element.
|
---|
| 146 | @param parameters The list of parameter names.
|
---|
| 147 | Some valid parameter names are available in the FUDaeAccessor class.
|
---|
| 148 | @param type The type name of the parameters. Examples: float, float4x4, Name or IDRef.
|
---|
| 149 | @return The created XML tree node. */
|
---|
| 150 | FCOLLADA_EXPORT xmlNode* AddAccessor(xmlNode* parent, const char* arrayId, size_t count, size_t stride=1, const char** parameters=NULL, const char* type=NULL);
|
---|
| 151 | inline xmlNode* AddAccessor(xmlNode* parent, const string& arrayId, size_t count, size_t stride=1, const char** parameters=NULL, const char* type=NULL) { return AddAccessor(parent, arrayId.c_str(), count, stride, parameters, type); } /**< See above. */
|
---|
| 152 |
|
---|
| 153 | /** Writes out a COLLADA multi-dimensional source of floating-point values.
|
---|
| 154 | @param parent The parent XML tree node.
|
---|
| 155 | @param id The COLLADA id of the source.
|
---|
| 156 | @param values The list of floating-point values.
|
---|
| 157 | @param stride The number of dimensions. This is the number of
|
---|
| 158 | floating-point values that should be used together to create one element.
|
---|
| 159 | @param parameters The list of accessor parameter names.
|
---|
| 160 | Some valid parameter names are available in the FUDaeAccessor class.
|
---|
| 161 | @param lengthFactor An optional scale factor for all the floating-point values.
|
---|
| 162 | @return The created XML tree node. */
|
---|
| 163 | FCOLLADA_EXPORT xmlNode* AddSourceFloat(xmlNode* parent, const char* id, const FloatList& values, size_t stride=1, const char** parameters=NULL, float lengthFactor=1.0f);
|
---|
| 164 | inline xmlNode* AddSourceFloat(xmlNode* parent, const string& id, const FloatList& values, size_t stride=1, const char** parameters=NULL, float lengthFactor=1.0f) { return AddSourceFloat(parent, id.c_str(), values, stride, parameters, lengthFactor); } /**< See above. */
|
---|
| 165 |
|
---|
| 166 | /** Writes out a COLLADA source of floating-point values.
|
---|
| 167 | @param parent The parent XML tree node.
|
---|
| 168 | @param id The COLLADA id of the source.
|
---|
| 169 | @param values The list of floating-point values.
|
---|
| 170 | @param parameter The accessor parameter name.
|
---|
| 171 | Some valid parameter names are available in the FUDaeAccessor class.
|
---|
| 172 | @param lengthFactor An optional scale factor for all the floating-point values.
|
---|
| 173 | @return The created XML tree node. */
|
---|
| 174 | FCOLLADA_EXPORT xmlNode* AddSourceFloat(xmlNode* parent, const char* id, const FloatList& values, const char* parameter=NULL, float lengthFactor=1.0f);
|
---|
| 175 | inline xmlNode* AddSourceFloat(xmlNode* parent, const string& id, const FloatList& values, const char* parameter=NULL, float lengthFactor=1.0f) { return AddSourceFloat(parent, id.c_str(), values, parameter, lengthFactor); } /**< See above. */
|
---|
| 176 |
|
---|
| 177 | /** Writes out a COLLADA source of matrices.
|
---|
| 178 | @param parent The parent XML tree node.
|
---|
| 179 | @param id The COLLADA id of the source.
|
---|
| 180 | @param values The list of matrices.
|
---|
| 181 | @param lengthFactor An optional scale factor for all the floating-point values.
|
---|
| 182 | @return The created XML tree node. */
|
---|
| 183 | FCOLLADA_EXPORT xmlNode* AddSourceMatrix(xmlNode* parent, const char* id, const FMMatrix44List& values, float lengthFactor=1.0f);
|
---|
| 184 | inline xmlNode* AddSourceMatrix(xmlNode* parent, const string& id, const FMMatrix44List& values, float lengthFactor=1.0f) { return AddSourceMatrix(parent, id.c_str(), values, lengthFactor); } /**< See above. */
|
---|
| 185 |
|
---|
| 186 | /** Writes out a COLLADA source of matrices.
|
---|
| 187 | @param parent The parent XML tree node.
|
---|
| 188 | @param id The COLLADA id of the source.
|
---|
| 189 | @param values The list of matrices.
|
---|
| 190 | @return The created XML tree node. */
|
---|
| 191 | FCOLLADA_EXPORT xmlNode* AddSourceColor(xmlNode* parent, const char* id, const FMVector3List& values);
|
---|
| 192 | inline xmlNode* AddSourceColor(xmlNode* parent, const string& id, const FMVector3List& values) { return AddSourceColor(parent, id.c_str(), values); } /**< See above. */
|
---|
| 193 |
|
---|
| 194 | /** Writes out a COLLADA source of texture coordinates.
|
---|
| 195 | @param parent The parent XML tree node.
|
---|
| 196 | @param id The COLLADA id of the source.
|
---|
| 197 | @param values The list of 3D texture coordinates.
|
---|
| 198 | @return The created XML tree node. */
|
---|
| 199 | FCOLLADA_EXPORT xmlNode* AddSourceTexcoord(xmlNode* parent, const char* id, const FMVector3List& values);
|
---|
| 200 | inline xmlNode* AddSourceTexcoord(xmlNode* parent, const string& id, const FMVector3List& values) { return AddSourceTexcoord(parent, id.c_str(), values); } /**< See above. */
|
---|
| 201 |
|
---|
| 202 | /** Writes out a COLLADA source of 3D positions or vectors.
|
---|
| 203 | @param parent The parent XML tree node.
|
---|
| 204 | @param id The COLLADA id of the source.
|
---|
| 205 | @param values The list of 3D vectors.
|
---|
| 206 | @param lengthFactor An optional scale factor for all the 3D vectors.
|
---|
| 207 | @return The created XML tree node. */
|
---|
| 208 | FCOLLADA_EXPORT xmlNode* AddSourcePosition(xmlNode* parent, const char* id, const FMVector3List& values, float lengthFactor=1.0f);
|
---|
| 209 | inline xmlNode* AddSourcePosition(xmlNode* parent, const string& id, const FMVector3List& values, float lengthFactor=1.0f) { return AddSourcePosition(parent, id.c_str(), values, lengthFactor); } /**< See above. */
|
---|
| 210 |
|
---|
| 211 | /** Writes out a COLLADA source of UTF-8 tokens.
|
---|
| 212 | @param parent The parent XML tree node.
|
---|
| 213 | @param id The COLLADA id of the source.
|
---|
| 214 | @param values The list of UTF-8 tokens. This list will be space-
|
---|
| 215 | separated within the COLLADA document, so you none of the
|
---|
| 216 | token should have spaces in them.
|
---|
| 217 | @param parameter The name of the accessor parameter.
|
---|
| 218 | @return The created XML tree node. */
|
---|
| 219 | FCOLLADA_EXPORT xmlNode* AddSourceString(xmlNode* parent, const char* id, const StringList& values, const char* parameter=NULL);
|
---|
| 220 | inline xmlNode* AddSourceString(xmlNode* parent, const string& id, const StringList& values, const char* parameter=NULL) { return AddSourceString(parent, id.c_str(), values, parameter); } /**< See above. */
|
---|
| 221 |
|
---|
| 222 | /** Writes out a COLLADA source of COLLADA references.
|
---|
| 223 | @param parent The parent XML tree node.
|
---|
| 224 | @param id The COLLADA id of the source.
|
---|
| 225 | @param values The list of COLLADA references.
|
---|
| 226 | @param parameter The name of the accessor parameter.
|
---|
| 227 | @return The created XML tree node. */
|
---|
| 228 | FCOLLADA_EXPORT xmlNode* AddSourceIDRef(xmlNode* parent, const char* id, const StringList& values, const char* parameter=NULL);
|
---|
| 229 | inline xmlNode* AddSourceIDRef(xmlNode* parent, const string& id, const StringList& values, const char* parameter=NULL) { return AddSourceIDRef(parent, id.c_str(), values, parameter); } /**< See above. */
|
---|
| 230 |
|
---|
| 231 | /** Writes out a COLLADA source of interpolation tokens.
|
---|
| 232 | This function is used within the export of animation curves.
|
---|
| 233 | @param parent The parent XML tree node.
|
---|
| 234 | @param id The COLLADA id of the source.
|
---|
| 235 | @param interpolations The list of interpolation tokens.
|
---|
| 236 | @return The created XML tree node. */
|
---|
| 237 | FCOLLADA_EXPORT xmlNode* AddSourceInterpolation(xmlNode* parent, const char* id, const FUDaeInterpolationList& interpolations);
|
---|
| 238 | inline xmlNode* AddSourceInterpolation(xmlNode* parent, const string& id, const FUDaeInterpolationList& values) { return AddSourceInterpolation(parent, id.c_str(), values); } /**< See above. */
|
---|
| 239 |
|
---|
| 240 | /** Cleans up a given name into a valid COLLADA id.
|
---|
| 241 | This function does no check for uniqueness.
|
---|
| 242 | @param id A name.
|
---|
| 243 | @return A valid COLLADA id. */
|
---|
| 244 | FCOLLADA_EXPORT string CleanId(const char* id);
|
---|
| 245 | inline string CleanId(const string& id) { return CleanId(id.c_str()); } /**< See above. */
|
---|
| 246 |
|
---|
| 247 | /** Cleans up a given name into a valid COLLADA name.
|
---|
| 248 | @param name A name.
|
---|
| 249 | @return A valid COLLADA name. */
|
---|
| 250 | FCOLLADA_EXPORT fstring CleanName(const fchar* name);
|
---|
| 251 | inline fstring CleanName(const fstring& name) { return CleanName(name.c_str()); } /**< See above. */
|
---|
| 252 |
|
---|
| 253 | /** Adds the 'sid' attribute to a given XML tree node.
|
---|
| 254 | The sub-id is verified to ensure uniqueness within the scope.
|
---|
| 255 | @param node The XML tree node.
|
---|
| 256 | @param wantedSid The wanted sub-id.
|
---|
| 257 | @return The actual sub-id written to the XML tree node. */
|
---|
| 258 | FCOLLADA_EXPORT string AddNodeSid(xmlNode* node, const char* wantedSid);
|
---|
| 259 | };
|
---|
| 260 |
|
---|
| 261 | #endif // HAS_LIBXML
|
---|
| 262 |
|
---|
| 263 | #endif // _FU_DAE_WRITER_H_
|
---|