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