|
45 | 45 | import IECore |
46 | 46 | import IECoreImage |
47 | 47 | import IECoreScene |
| 48 | +import IECoreRenderManTest |
48 | 49 |
|
49 | 50 | import GafferTest |
50 | 51 | import GafferScene |
@@ -825,6 +826,185 @@ def testConnectionToOSLShader( self ) : |
825 | 826 | image = OpenImageIO.ImageBuf( fileName ) |
826 | 827 | self.assertEqual( image.getpixel( 320, 240, 0 ), ( 1.0, 1.0, 0.0, 1.0 ) ) |
827 | 828 |
|
| 829 | + def testSubdivInterpolatedBoundary( self ) : |
| 830 | + |
| 831 | + for interpolateBoundary, expected in [ |
| 832 | + ( IECoreScene.MeshPrimitive.interpolateBoundaryNone, 0 ), |
| 833 | + ( IECoreScene.MeshPrimitive.interpolateBoundaryEdgeAndCorner, 1 ), |
| 834 | + ( IECoreScene.MeshPrimitive.interpolateBoundaryEdgeOnly, 2 ), |
| 835 | + ] : |
| 836 | + |
| 837 | + with self.subTest( interpolateBoundary = interpolateBoundary ) : |
| 838 | + |
| 839 | + with IECoreRenderManTest.RileyCapture() as capture : |
| 840 | + |
| 841 | + renderer = GafferScene.Private.IECoreScenePreview.Renderer.create( |
| 842 | + "RenderMan", |
| 843 | + GafferScene.Private.IECoreScenePreview.Renderer.RenderType.Batch |
| 844 | + ) |
| 845 | + |
| 846 | + mesh = IECoreScene.MeshPrimitive.createPlane( imath.Box2f( imath.V2f( -1 ), imath.V2f( 1 ) ) ) |
| 847 | + mesh.setInterpolation( "catmullClark" ) |
| 848 | + mesh.setInterpolateBoundary( interpolateBoundary ) |
| 849 | + |
| 850 | + renderer.object( |
| 851 | + "mesh", mesh, renderer.attributes( IECore.CompoundObject() ) |
| 852 | + ) |
| 853 | + |
| 854 | + del mesh, renderer |
| 855 | + |
| 856 | + proto = next( |
| 857 | + x for x in capture.json if x["method"] == "CreateGeometryPrototype" |
| 858 | + ) |
| 859 | + self.__assertInTags( |
| 860 | + proto, "interpolateboundary", intArgs = [ expected ] |
| 861 | + ) |
| 862 | + |
| 863 | + def testSubdivFaceVaryingLinearInterpolation( self ) : |
| 864 | + |
| 865 | + for faceVaryingLinearInterpolation, expected in [ |
| 866 | + ( IECoreScene.MeshPrimitive.faceVaryingLinearInterpolationNone, 2 ), |
| 867 | + ( IECoreScene.MeshPrimitive.faceVaryingLinearInterpolationCornersOnly, 1 ), |
| 868 | + ( IECoreScene.MeshPrimitive.faceVaryingLinearInterpolationCornersPlus1, 1 ), |
| 869 | + ( IECoreScene.MeshPrimitive.faceVaryingLinearInterpolationCornersPlus2, 1 ), |
| 870 | + ( IECoreScene.MeshPrimitive.faceVaryingLinearInterpolationBoundaries, 3 ), |
| 871 | + ( IECoreScene.MeshPrimitive.faceVaryingLinearInterpolationAll, 0 ), |
| 872 | + ] : |
| 873 | + |
| 874 | + with self.subTest( faceVaryingLinearInterpolation = faceVaryingLinearInterpolation ) : |
| 875 | + |
| 876 | + with IECoreRenderManTest.RileyCapture() as capture : |
| 877 | + |
| 878 | + renderer = GafferScene.Private.IECoreScenePreview.Renderer.create( |
| 879 | + "RenderMan", |
| 880 | + GafferScene.Private.IECoreScenePreview.Renderer.RenderType.Batch |
| 881 | + ) |
| 882 | + |
| 883 | + mesh = IECoreScene.MeshPrimitive.createPlane( imath.Box2f( imath.V2f( -1 ), imath.V2f( 1 ) ) ) |
| 884 | + mesh.setInterpolation( "catmullClark" ) |
| 885 | + mesh.setFaceVaryingLinearInterpolation( faceVaryingLinearInterpolation ) |
| 886 | + |
| 887 | + renderer.object( |
| 888 | + "mesh", mesh, renderer.attributes( IECore.CompoundObject() ) |
| 889 | + ) |
| 890 | + |
| 891 | + del mesh, renderer |
| 892 | + |
| 893 | + proto = next( |
| 894 | + x for x in capture.json if x["method"] == "CreateGeometryPrototype" |
| 895 | + ) |
| 896 | + self.__assertInTags( |
| 897 | + proto, "facevaryinginterpolateboundary", intArgs = [ expected ] |
| 898 | + ) |
| 899 | + |
| 900 | + def testSubdivTriangleSubdivisionRule( self ) : |
| 901 | + |
| 902 | + for rule, expected in [ |
| 903 | + ( IECoreScene.MeshPrimitive.triangleSubdivisionRuleCatmullClark, 0 ), |
| 904 | + ( IECoreScene.MeshPrimitive.triangleSubdivisionRuleSmooth, 2 ), |
| 905 | + ] : |
| 906 | + |
| 907 | + with self.subTest( rule = rule ) : |
| 908 | + |
| 909 | + with IECoreRenderManTest.RileyCapture() as capture : |
| 910 | + |
| 911 | + renderer = GafferScene.Private.IECoreScenePreview.Renderer.create( |
| 912 | + "RenderMan", |
| 913 | + GafferScene.Private.IECoreScenePreview.Renderer.RenderType.Batch |
| 914 | + ) |
| 915 | + |
| 916 | + mesh = IECoreScene.MeshPrimitive.createPlane( imath.Box2f( imath.V2f( -1 ), imath.V2f( 1 ) ) ) |
| 917 | + mesh.setInterpolation( "catmullClark" ) |
| 918 | + mesh.setTriangleSubdivisionRule( rule ) |
| 919 | + |
| 920 | + renderer.object( |
| 921 | + "mesh", mesh, renderer.attributes( IECore.CompoundObject() ) |
| 922 | + ) |
| 923 | + |
| 924 | + del mesh, renderer |
| 925 | + |
| 926 | + proto = next( |
| 927 | + x for x in capture.json if x["method"] == "CreateGeometryPrototype" |
| 928 | + ) |
| 929 | + self.__assertInTags( |
| 930 | + proto, "smoothtriangles", intArgs = [ expected ] |
| 931 | + ) |
| 932 | + |
| 933 | + def testSubdivisionScheme( self ) : |
| 934 | + |
| 935 | + for interpolation, scheme in [ |
| 936 | + ( IECoreScene.MeshPrimitive.interpolationLinear, None ), |
| 937 | + ( IECoreScene.MeshPrimitive.interpolationCatmullClark, "catmull-clark" ), |
| 938 | + ( IECoreScene.MeshPrimitive.interpolationLoop, "loop" ), |
| 939 | + ] : |
| 940 | + |
| 941 | + with self.subTest( interpolation = interpolation ) : |
| 942 | + |
| 943 | + with IECoreRenderManTest.RileyCapture() as capture : |
| 944 | + |
| 945 | + renderer = GafferScene.Private.IECoreScenePreview.Renderer.create( |
| 946 | + "RenderMan", |
| 947 | + GafferScene.Private.IECoreScenePreview.Renderer.RenderType.Batch |
| 948 | + ) |
| 949 | + |
| 950 | + mesh = IECoreScene.MeshPrimitive.createPlane( imath.Box2f( imath.V2f( -1 ), imath.V2f( 1 ) ) ) |
| 951 | + mesh.setInterpolation( interpolation ) |
| 952 | + |
| 953 | + renderer.object( |
| 954 | + "mesh", mesh, renderer.attributes( IECore.CompoundObject() ) |
| 955 | + ) |
| 956 | + |
| 957 | + del mesh, renderer |
| 958 | + |
| 959 | + proto = next( |
| 960 | + x for x in capture.json if x["method"] == "CreateGeometryPrototype" |
| 961 | + ) |
| 962 | + |
| 963 | + if scheme is not None : |
| 964 | + self.assertEqual( proto["type"], "Ri:SubdivisionMesh" ) |
| 965 | + self.__assertPrimitiveVariableEqual( proto, "Ri:scheme", [ scheme ] ) |
| 966 | + else : |
| 967 | + self.__assertNotInPrimitiveVariables( proto, "Ri:scheme" ) |
| 968 | + self.assertEqual( proto["type"], "Ri:PolygonMesh" ) |
| 969 | + |
| 970 | + def __assertPrimitiveVariableEqual( self, geometryPrototype, name, data ) : |
| 971 | + |
| 972 | + p = next( x for x in geometryPrototype["primvars"]["params"] if x["info"]["name"] == name ) |
| 973 | + self.assertEqual( p["data"], data ) |
| 974 | + |
| 975 | + def __assertNotInPrimitiveVariables( self, geometryPrototype, name ) : |
| 976 | + |
| 977 | + self.assertNotIn( |
| 978 | + name, { x["info"]["name"] for x in geometryPrototype["primvars"]["params"] } |
| 979 | + ) |
| 980 | + |
| 981 | + def __assertInTags( self, geometryPrototype, tag, intArgs = [], floatArgs = [] ) : |
| 982 | + |
| 983 | + tags = next( x for x in geometryPrototype["primvars"]["params"] if x["info"]["name"] == "Ri:subdivtags" )["data"] |
| 984 | + numArgs = next( x for x in geometryPrototype["primvars"]["params"] if x["info"]["name"] == "Ri:subdivtagnargs" )["data"] |
| 985 | + ints = next( x for x in geometryPrototype["primvars"]["params"] if x["info"]["name"] == "Ri:subdivtagintargs" )["data"] |
| 986 | + floats = next( x for x in geometryPrototype["primvars"]["params"] if x["info"]["name"] == "Ri:subdivtagfloatargs" )["data"] |
| 987 | + |
| 988 | + foundTag = False |
| 989 | + for t in tags : |
| 990 | + |
| 991 | + if t == tag : |
| 992 | + self.assertEqual( numArgs[0:3], [ len( intArgs ), len( floatArgs ), 0 ] ) |
| 993 | + self.assertEqual( ints[0:len(intArgs)], intArgs ) |
| 994 | + self.assertEqual( floats[0:len(floatArgs)], floatArgs ) |
| 995 | + foundTag = True |
| 996 | + |
| 997 | + # Move to next tag |
| 998 | + del ints[0:numArgs[0]] |
| 999 | + del floats[0:numArgs[1]] |
| 1000 | + del numArgs[0:3] |
| 1001 | + |
| 1002 | + self.assertEqual( len( numArgs ), 0 ) |
| 1003 | + self.assertEqual( len( ints ), 0 ) |
| 1004 | + self.assertEqual( len( floats ), 0 ) |
| 1005 | + |
| 1006 | + self.assertTrue( foundTag ) |
| 1007 | + |
828 | 1008 | def __colorAtUV( self, image, uv ) : |
829 | 1009 |
|
830 | 1010 | dimensions = image.dataWindow.size() + imath.V2i( 1 ) |
|
0 commit comments