|
39 | 39 | import os |
40 | 40 |
|
41 | 41 | from IECore import * |
| 42 | +import IECore |
42 | 43 | import IECoreRI |
43 | 44 |
|
44 | 45 | class SimpleProcedural( Renderer.Procedural ) : |
45 | 46 |
|
46 | | - def __init__( self, scale ) : |
| 47 | + def __init__( self, scale, computeBound = True ) : |
47 | 48 |
|
48 | 49 | Renderer.Procedural.__init__( self ) |
49 | 50 | self.__scale = scale |
| 51 | + self.__computeBound = computeBound |
50 | 52 | self.__t = StringData( "hello" ) |
51 | 53 | self.__c = CompoundData() |
52 | 54 | self.__c["a"] = IntData( 4 ) |
53 | 55 |
|
| 56 | + self.numBoundCalls = 0 |
| 57 | + self.numRenderCalls = 0 |
| 58 | + |
54 | 59 | def bound( self ) : |
55 | 60 |
|
56 | | - return Box3f( V3f( -self.__scale ), V3f( self.__scale ) ) |
| 61 | + self.numBoundCalls += 1 |
| 62 | + |
| 63 | + if self.__computeBound : |
| 64 | + return Box3f( V3f( -self.__scale ), V3f( self.__scale ) ) |
| 65 | + else : |
| 66 | + return self.noBound |
57 | 67 |
|
58 | 68 | def render( self, renderer ) : |
59 | 69 |
|
| 70 | + self.numRenderCalls += 1 |
60 | 71 | self.rendererTypeName = renderer.typeName() |
61 | 72 | self.rendererTypeId = renderer.typeId() |
62 | 73 |
|
63 | | - renderer.transformBegin() |
| 74 | + with IECore.TransformBlock( renderer ) : |
64 | 75 |
|
65 | | - m = M44f() |
66 | | - m.scale( V3f( self.__scale ) ) |
67 | | - renderer.concatTransform( m ) |
| 76 | + m = M44f() |
| 77 | + m.scale( V3f( self.__scale ) ) |
| 78 | + renderer.concatTransform( m ) |
| 79 | + |
| 80 | + if self.__computeBound : |
| 81 | + renderer.procedural( SimpleProcedural( 1, False ) ) |
| 82 | + else : |
| 83 | + renderer.sphere( 1, -1, 1, 360, {} ) |
68 | 84 |
|
69 | | - renderer.transformEnd() |
70 | | - |
71 | 85 | def hash( self ): |
72 | | - |
| 86 | + |
73 | 87 | h = MurmurHash() |
74 | 88 | return h |
75 | 89 |
|
@@ -215,13 +229,13 @@ def testCompoundDataAttributes( self ) : |
215 | 229 | def testProcedural( self ) : |
216 | 230 |
|
217 | 231 | r = IECoreRI.Renderer( "test/IECoreRI/output/testProcedural.rib" ) |
218 | | - r.worldBegin() |
219 | | - |
220 | | - p = SimpleProcedural( 10.5 ) |
221 | | - r.procedural( p ) |
| 232 | + with WorldBlock( r ) : |
222 | 233 |
|
223 | | - r.worldEnd() |
| 234 | + p = SimpleProcedural( 10.5 ) |
| 235 | + r.procedural( p ) |
224 | 236 |
|
| 237 | + self.assertEqual( p.numBoundCalls, 1 ) |
| 238 | + self.assertEqual( p.numRenderCalls, 1 ) |
225 | 239 | self.assertEqual( p.rendererTypeId, IECoreRI.Renderer.staticTypeId() ) |
226 | 240 | self.assertEqual( p.rendererTypeName, "IECoreRI::Renderer" ) |
227 | 241 | self.assertEqual( p.rendererTypeName, IECoreRI.Renderer.staticTypeName() ) |
@@ -713,10 +727,53 @@ def testLightPrefixes( self ) : |
713 | 727 | self.assertTrue( 'LightSource "renderManLight"' in rib ) |
714 | 728 | self.assertFalse( "arnold" in rib ) |
715 | 729 |
|
| 730 | + def testProceduralWithoutBounds( self ) : |
| 731 | + |
| 732 | + r = IECoreRI.Renderer( "" ) |
| 733 | + |
| 734 | + r.camera( |
| 735 | + "main", |
| 736 | + { |
| 737 | + "projection" : IECore.StringData( "orthographic" ), |
| 738 | + "resolution" : IECore.V2iData( IECore.V2i( 256 ) ), |
| 739 | + "clippingPlanes" : IECore.V2fData( IECore.V2f( 0.1, 1000 ) ), |
| 740 | + "screenWindow" : IECore.Box2fData( IECore.Box2f( IECore.V2f( -1 ), IECore.V2f( 1 ) ) ), |
| 741 | + } |
| 742 | + ) |
| 743 | + r.display( |
| 744 | + "test", "ieDisplay", "rgba", |
| 745 | + { |
| 746 | + "driverType" : "ImageDisplayDriver", |
| 747 | + "handle" : "test", |
| 748 | + "quantize" : FloatVectorData( [ 0, 0, 0, 0 ] ), |
| 749 | + } |
| 750 | + ) |
| 751 | + |
| 752 | + # Must use the raytrace hider in order to use unspecified |
| 753 | + # procedural bounds in 3delight - it is not supported in |
| 754 | + # REYES mode. |
| 755 | + r.setOption( "ri:hider", "raytrace" ) |
| 756 | + |
| 757 | + with IECore.WorldBlock( r ) : |
| 758 | + |
| 759 | + r.concatTransform( IECore.M44f.createTranslated( IECore.V3f( 0, 0, -10 ) ) ) |
| 760 | + |
| 761 | + procedural = SimpleProcedural( 1, computeBound = False ) |
| 762 | + r.procedural( procedural ) |
| 763 | + |
| 764 | + self.assertEqual( procedural.numRenderCalls, 1 ) |
| 765 | + |
| 766 | + image = IECore.ImageDisplayDriver.removeStoredImage( "test" ) |
| 767 | + |
| 768 | + e = IECore.PrimitiveEvaluator.create( image ) |
| 769 | + result = e.createResult() |
| 770 | + e.pointAtUV( IECore.V2f( 0.5, 0.5 ), result ) |
| 771 | + self.assertEqual( result.floatPrimVar( e.A() ), 1 ) |
| 772 | + |
716 | 773 | def tearDown( self ) : |
717 | 774 |
|
718 | 775 | IECoreRI.TestCase.tearDown( self ) |
719 | | - |
| 776 | + |
720 | 777 | files = [ |
721 | 778 | "test/IECoreRI/shaders/types.sdl", |
722 | 779 | ] |
|
0 commit comments