34
34
35
35
#include " IECoreRI/private/SXRendererImplementation.h"
36
36
#include " IECoreRI/SXExecutor.h"
37
+ #include " IECoreRI/Convert.h"
37
38
38
39
#include " IECore/MessageHandler.h"
39
40
#include " IECore/Shader.h"
40
41
#include " IECore/SimpleTypedData.h"
41
42
#include " IECore/SplineData.h"
42
43
#include " IECore/MatrixAlgo.h"
43
44
#include " IECore/Transform.h"
44
- #include " IECore/MatrixTransform.h"
45
45
#include " IECore/Group.h"
46
46
47
47
#include " boost/algorithm/string/case_conv.hpp"
@@ -227,17 +227,25 @@ void IECoreRI::SXRendererImplementation::worldEnd()
227
227
228
228
void IECoreRI::SXRendererImplementation::transformBegin ()
229
229
{
230
- msg ( Msg::Warning, " IECoreRI::SXRendererImplementation::transformBegin" , " Not implemented" );
230
+ // New push state onto the stack: deep copy flag is false, so we don't create a new SxContext, which will swallow up any
231
+ // coordinate systems declared before transformEnd():
232
+ m_stateStack.push ( State ( m_stateStack.top (), false ) );
231
233
}
232
234
233
235
void IECoreRI::SXRendererImplementation::transformEnd ()
234
236
{
235
- msg ( Msg::Warning, " IECoreRI::SXRendererImplementation::transformEnd" , " Not implemented" );
237
+ unsigned minimumStack = m_inWorld ? 2 : 1 ;
238
+ if ( m_stateStack.size () <= minimumStack )
239
+ {
240
+ IECore::msg ( IECore::Msg::Error, " IECoreRI::SXRenderer::transformEnd" , " No matching transformBegin." );
241
+ return ;
242
+ }
243
+ m_stateStack.pop ();
236
244
}
237
245
238
246
void IECoreRI::SXRendererImplementation::setTransform ( const Imath::M44f &m )
239
247
{
240
- msg ( Msg::Warning, " IECoreRI::SXRendererImplementation::setTransform " , " Not implemented " ) ;
248
+ m_stateStack. top (). transform = m ;
241
249
}
242
250
243
251
void IECoreRI::SXRendererImplementation::setTransform ( const std::string &coordinateSystem )
@@ -247,7 +255,7 @@ void IECoreRI::SXRendererImplementation::setTransform( const std::string &coordi
247
255
248
256
Imath::M44f IECoreRI::SXRendererImplementation::getTransform () const
249
257
{
250
- return getTransform ( " object " ) ;
258
+ return m_stateStack. top (). transform ;
251
259
}
252
260
253
261
Imath::M44f IECoreRI::SXRendererImplementation::getTransform ( const std::string &coordinateSystem ) const
@@ -258,12 +266,15 @@ Imath::M44f IECoreRI::SXRendererImplementation::getTransform( const std::string
258
266
259
267
void IECoreRI::SXRendererImplementation::concatTransform ( const Imath::M44f &m )
260
268
{
261
- msg ( Msg::Warning, " IECoreRI::SXRendererImplementation::concatTransform " , " Not implemented " ) ;
269
+ m_stateStack. top (). transform = m * m_stateStack. top (). transform ;
262
270
}
263
271
264
272
void IECoreRI::SXRendererImplementation::coordinateSystem ( const std::string &name )
265
273
{
266
- msg ( Msg::Warning, " IECoreRI::SXRendererImplementation::coordinateSystem" , " Not implemented" );
274
+ M44f m = m_stateStack.top ().transform .transposed ();
275
+ RtMatrix mm;
276
+ convert ( m, mm );
277
+ SxDefineSpace ( m_stateStack.top ().context .get (), name.c_str (), (RtFloat*)&mm[0 ][0 ] );
267
278
}
268
279
269
280
// ////////////////////////////////////////////////////////////////////////////////////////
0 commit comments