1 /* 2 Copyright (c) 2008-2009 NetAllied Systems GmbH 3 4 This file is part of COLLADAStreamWriter. 5 6 Licensed under the MIT Open Source License, 7 for details please see LICENSE file or the website 8 http://www.opensource.org/licenses/mit-license.php 9 */ 10 11 #include "COLLADASWNode.h" 12 #include "COLLADASWConstants.h" 13 #include "COLLADABUUtils.h" 14 15 16 namespace COLLADASW 17 { 18 19 //--------------------------------------------------------------- start(bool lodPass)20 void Node::start(bool lodPass) 21 { 22 if (!mIsInstanceNode || lodPass) 23 { 24 mNodeCloser = mSW->openElement ( CSWC::CSW_ELEMENT_NODE ); 25 26 if ( !mNodeId.empty() ) 27 mSW->appendAttribute ( CSWC::CSW_ATTRIBUTE_ID, mNodeId ); 28 29 if ( !mNodeName.empty() ) 30 mSW->appendAttribute ( CSWC::CSW_ATTRIBUTE_NAME, mNodeName ); 31 32 if ( !mNodeSid.empty() ) 33 mSW->appendAttribute ( CSWC::CSW_ATTRIBUTE_SID, mNodeSid ); 34 35 switch ( mType ) 36 { 37 case NODE: 38 { 39 if (!lodPass) 40 mSW->appendAttribute(CSWC::CSW_ATTRIBUTE_TYPE, CSWC::CSW_NODE_TYPE_NODE); 41 } 42 break; 43 44 45 case JOINT: 46 mSW->appendAttribute ( CSWC::CSW_ATTRIBUTE_TYPE, CSWC::CSW_NODE_TYPE_JOINT ); 47 break; 48 49 default: 50 fprintf ( stderr, "Not a valid node type: %d", mType ); 51 break; 52 } 53 } 54 else 55 { 56 mNodeCloser = mSW->openElement ( CSWC::CSW_ELEMENT_INSTANCE_NODE ); 57 58 if ( !mNodeURL.isValid() ) 59 { 60 fprintf ( stderr, "No node URL for the instance node!" ); 61 return; 62 } 63 64 mSW->appendURIAttribute ( CSWC::CSW_ATTRIBUTE_URL, mNodeURL ); 65 } 66 67 } 68 69 70 //--------------------------------------------------------------- addTranslate(const String & sid,double x,double y,double z) const71 void Node::addTranslate ( const String &sid, double x, double y, double z ) const 72 { 73 mSW->openElement ( CSWC::CSW_ELEMENT_TRANSLATE ); 74 75 if ( !sid.empty() ) 76 mSW->appendAttribute ( CSWC::CSW_ATTRIBUTE_SID, sid ); 77 78 mSW->appendValues ( x, y, z ); 79 80 mSW->closeElement(); 81 } 82 83 //--------------------------------------------------------------- addTranslate(double x,double y,double z) const84 void Node::addTranslate ( double x, double y, double z ) const 85 { 86 mSW->openElement ( CSWC::CSW_ELEMENT_TRANSLATE ); 87 mSW->appendValues ( x, y, z ); 88 mSW->closeElement(); 89 } 90 91 //--------------------------------------------------------------- addRotate(const String & sid,double x,double y,double z,double angle) const92 void Node::addRotate ( const String &sid, double x, double y, double z, double angle ) const 93 { 94 mSW->openElement ( CSWC::CSW_ELEMENT_ROTATE ); 95 96 if ( !sid.empty() ) 97 mSW->appendAttribute ( CSWC::CSW_ATTRIBUTE_SID, sid ); 98 99 mSW->appendValues ( x, y, z, angle ); 100 101 mSW->closeElement(); 102 } 103 104 //--------------------------------------------------------------- addRotate(double x,double y,double z,double angle) const105 void Node::addRotate ( double x, double y, double z, double angle ) const 106 { 107 mSW->openElement ( CSWC::CSW_ELEMENT_ROTATE ); 108 mSW->appendValues ( x, y, z, angle ); 109 mSW->closeElement(); 110 } 111 112 113 //--------------------------------------------------------------- addMatrix(const String & sid,double matrix[4][4]) const114 void Node::addMatrix ( const String &sid, double matrix[4][4] ) const 115 { 116 mSW->openElement ( CSWC::CSW_ELEMENT_MATRIX ); 117 118 if ( !sid.empty() ) 119 mSW->appendAttribute ( CSWC::CSW_ATTRIBUTE_SID, sid ); 120 121 mSW->appendValues ( matrix[0][0], matrix[0][1], matrix[0][2], matrix[0][3] ); 122 mSW->appendValues ( matrix[1][0], matrix[1][1], matrix[1][2], matrix[1][3] ); 123 mSW->appendValues ( matrix[2][0], matrix[2][1], matrix[2][2], matrix[2][3] ); 124 mSW->appendValues ( matrix[3][0], matrix[3][1], matrix[3][2], matrix[3][3] ); 125 126 mSW->closeElement(); 127 128 } 129 130 //--------------------------------------------------------------- addMatrix(double matrix[4][4]) const131 void Node::addMatrix ( double matrix[4][4] ) const 132 { 133 mSW->openElement ( CSWC::CSW_ELEMENT_MATRIX ); 134 mSW->appendValues ( matrix[0][0], matrix[0][1], matrix[0][2], matrix[0][3] ); 135 mSW->appendValues ( matrix[1][0], matrix[1][1], matrix[1][2], matrix[1][3] ); 136 mSW->appendValues ( matrix[2][0], matrix[2][1], matrix[2][2], matrix[2][3] ); 137 mSW->appendValues ( matrix[3][0], matrix[3][1], matrix[3][2], matrix[3][3] ); 138 mSW->closeElement(); 139 } 140 141 142 //--------------------------------------------------------------- addScale(const String & sid,double x,double y,double z) const143 void Node::addScale ( const String &sid, double x, double y, double z ) const 144 { 145 mSW->openElement ( CSWC::CSW_ELEMENT_SCALE ); 146 147 if ( !sid.empty() ) 148 mSW->appendAttribute ( CSWC::CSW_ATTRIBUTE_SID, sid ); 149 150 mSW->appendValues ( x, y, z ); 151 152 mSW->closeElement(); 153 } 154 155 //--------------------------------------------------------------- addScale(double x,double y,double z) const156 void Node::addScale ( double x, double y, double z ) const 157 { 158 mSW->openElement ( CSWC::CSW_ELEMENT_SCALE ); 159 mSW->appendValues ( x, y, z ); 160 mSW->closeElement(); 161 } 162 163 //--------------------------------------------------------------- addSkew(const String & sid,float angle,const float rotateAxis[3],const float aroundAxis[3]) const164 void Node::addSkew ( const String &sid, float angle, 165 const float rotateAxis[3], const float aroundAxis[3] ) const 166 { 167 mSW->openElement ( CSWC::CSW_ELEMENT_SKEW ); 168 169 if ( !sid.empty() ) 170 mSW->appendAttribute ( CSWC::CSW_ATTRIBUTE_SID, sid ); 171 172 mSW->appendValues ( angle ); 173 mSW->appendValues ( rotateAxis, 3 ); 174 mSW->appendValues ( aroundAxis, 3 ); 175 176 mSW->closeElement(); 177 } 178 179 //--------------------------------------------------------------- addLookat(const float eyePosition[3],const float interestPosition[3],const float upPosition[3],const String & sid)180 void Node::addLookat ( 181 const float eyePosition[3], 182 const float interestPosition[3], 183 const float upPosition[3], 184 const String &sid ) 185 { 186 mSW->openElement ( CSWC::CSW_ELEMENT_LOOKAT ); 187 188 if ( !sid.empty() ) 189 mSW->appendAttribute ( CSWC::CSW_ATTRIBUTE_SID, sid ); 190 191 mSW->appendValues ( eyePosition, 3 ); 192 mSW->appendValues ( interestPosition, 3 ); 193 mSW->appendValues ( upPosition, 3 ); 194 195 mSW->closeElement(); 196 } 197 198 //--------------------------------------------------------------- end()199 void Node::end() 200 { 201 // Write the extra technique tags in the collada document 202 addExtraTechniques ( mSW ); 203 204 mNodeCloser.close(); 205 } 206 207 208 } //namespace COLLADASW 209