Skip to content

Commit 51f38b8

Browse files
committed
Merge pull request #248 from davidsminor/sxRendererFixes2
Sx renderer fixes2
2 parents 89431ee + 832e3bd commit 51f38b8

File tree

4 files changed

+63
-9
lines changed

4 files changed

+63
-9
lines changed

include/IECoreRI/private/SXRendererImplementation.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ class SXRendererImplementation : public IECore::Renderer
139139
SxShader imagerShader;
140140
SXExecutor::ShaderVector coshaders;
141141
SXExecutor::ShaderVector lights;
142+
143+
Imath::M44f transform;
142144
};
143145
typedef std::stack<State> StateStack;
144146

src/IECoreRI/SXRendererImplementation.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@
3434

3535
#include "IECoreRI/private/SXRendererImplementation.h"
3636
#include "IECoreRI/SXExecutor.h"
37+
#include "IECoreRI/Convert.h"
3738

3839
#include "IECore/MessageHandler.h"
3940
#include "IECore/Shader.h"
4041
#include "IECore/SimpleTypedData.h"
4142
#include "IECore/SplineData.h"
4243
#include "IECore/MatrixAlgo.h"
4344
#include "IECore/Transform.h"
44-
#include "IECore/MatrixTransform.h"
4545
#include "IECore/Group.h"
4646

4747
#include "boost/algorithm/string/case_conv.hpp"
@@ -227,17 +227,25 @@ void IECoreRI::SXRendererImplementation::worldEnd()
227227

228228
void IECoreRI::SXRendererImplementation::transformBegin()
229229
{
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 ) );
231233
}
232234

233235
void IECoreRI::SXRendererImplementation::transformEnd()
234236
{
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();
236244
}
237245

238246
void IECoreRI::SXRendererImplementation::setTransform( const Imath::M44f &m )
239247
{
240-
msg( Msg::Warning, "IECoreRI::SXRendererImplementation::setTransform", "Not implemented" );
248+
m_stateStack.top().transform = m;
241249
}
242250

243251
void IECoreRI::SXRendererImplementation::setTransform( const std::string &coordinateSystem )
@@ -247,7 +255,7 @@ void IECoreRI::SXRendererImplementation::setTransform( const std::string &coordi
247255

248256
Imath::M44f IECoreRI::SXRendererImplementation::getTransform() const
249257
{
250-
return getTransform( "object" );
258+
return m_stateStack.top().transform;
251259
}
252260

253261
Imath::M44f IECoreRI::SXRendererImplementation::getTransform( const std::string &coordinateSystem ) const
@@ -258,12 +266,15 @@ Imath::M44f IECoreRI::SXRendererImplementation::getTransform( const std::string
258266

259267
void IECoreRI::SXRendererImplementation::concatTransform( const Imath::M44f &m )
260268
{
261-
msg( Msg::Warning, "IECoreRI::SXRendererImplementation::concatTransform", "Not implemented" );
269+
m_stateStack.top().transform = m * m_stateStack.top().transform;
262270
}
263271

264272
void IECoreRI::SXRendererImplementation::coordinateSystem( const std::string &name )
265273
{
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] );
267278
}
268279

269280
//////////////////////////////////////////////////////////////////////////////////////////

test/IECoreRI/SXRendererTest.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ def __assertVectorDataAlmostEqual( self, data1, data2 ) :
127127
else :
128128
for i in range( 0, len( data1 ) ) :
129129
self.assertAlmostEqual( data1[i], data2[i], 6 )
130-
130+
131131
def test( self ) :
132132

133133
r = IECoreRI.SXRenderer()
@@ -901,7 +901,42 @@ def testUserOptions( self ):
901901
s = r.shade( points )
902902
self.assertEqual( s["Ci"][0], IECore.Color3f( 1,1,1 ) )
903903

904-
904+
905+
def testCoordinateSystems( self ):
906+
907+
self.assertEqual( os.system( "shaderdl -Irsl -o test/IECoreRI/shaders/sxCoordSystemTest.sdl test/IECoreRI/shaders/sxCoordSystemTest.sl" ), 0 )
908+
909+
points = self.__rectanglePoints( IECore.Box2i( IECore.V2i( 0 ), IECore.V2i( 1 ) ) )
910+
911+
r = IECoreRI.SXRenderer()
912+
913+
r.shader( "surface", "test/IECoreRI/shaders/sxCoordSystemTest.sdl", { "coordSysName" : IECore.StringData( "test1" ) } )
914+
915+
r.transformBegin()
916+
r.setTransform( IECore.M44f.createTranslated( IECore.V3f(0,0,2) ) )
917+
r.coordinateSystem( "test1" )
918+
r.transformEnd()
919+
920+
r.transformBegin()
921+
r.setTransform( IECore.M44f.createRotated( IECore.V3f(1,0,0) ) )
922+
r.concatTransform( IECore.M44f.createTranslated( IECore.V3f(0,0,2) ) )
923+
r.coordinateSystem( "test2" )
924+
r.transformEnd()
925+
926+
s1 = r.shade( points )
927+
for i in range( len( s1["Ci"] ) ):
928+
self.assertEqual( points["P"][i] + IECore.V3f(0,0,2), IECore.V3f( s1["Ci"][i][0], s1["Ci"][i][1], s1["Ci"][i][2] ) )
929+
930+
r.shader( "surface", "test/IECoreRI/shaders/sxCoordSystemTest.sdl", { "coordSysName" : IECore.StringData( "test2" ) } )
931+
s2 = r.shade( points )
932+
for i in range( len( s2["Ci"] ) ):
933+
shaderP = IECore.V3f( s2["Ci"][i][0], s2["Ci"][i][1], s2["Ci"][i][2] )
934+
transP = points["P"][i] * IECore.M44f.createTranslated( IECore.V3f(0,0,2) ) * IECore.M44f.createRotated( IECore.V3f(1,0,0) )
935+
936+
self.failUnless( ( shaderP - transP ).length() < 1.e-5 )
937+
938+
939+
905940
def tearDown( self ) :
906941

907942
files = [
@@ -923,6 +958,8 @@ def tearDown( self ) :
923958
"test/IECoreRI/shaders/sxTextureTest.sdl",
924959
"test/IECoreRI/shaders/sxUniformPrimitiveVariableShaderParameterTest.sdl",
925960
"test/IECoreRI/shaders/sxUniformPrimitiveVariableTest.sdl",
961+
"test/IECoreRI/shaders/sxUserOptionTest.sdl",
962+
"test/IECoreRI/shaders/sxCoordSystemTest.sdl",
926963
]
927964

928965
for f in files :
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
surface sxCoordSystemTest( string coordSysName = "current" )
2+
{
3+
Ci = color( transform( coordSysName, "current", P ) );
4+
}

0 commit comments

Comments
 (0)