home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Multimedia / k3d-setup-0.7.11.0.exe / lib / site-packages / cgkit / _cri.py < prev    next >
Encoding:
Python Source  |  2008-02-17  |  18.8 KB  |  447 lines

  1. # ***** BEGIN LICENSE BLOCK *****
  2. # Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3. #
  4. # The contents of this file are subject to the Mozilla Public License Version
  5. # 1.1 (the "License"); you may not use this file except in compliance with
  6. # the License. You may obtain a copy of the License at
  7. # http://www.mozilla.org/MPL/
  8. #
  9. # Software distributed under the License is distributed on an "AS IS" basis,
  10. # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11. # for the specific language governing rights and limitations under the
  12. # License.
  13. #
  14. # The Original Code is the Python Computer Graphics Kit.
  15. #
  16. # The Initial Developer of the Original Code is Matthias Baas.
  17. # Portions created by the Initial Developer are Copyright (C) 2008
  18. # the Initial Developer. All Rights Reserved.
  19. #
  20. # Contributor(s):
  21. #
  22. # Alternatively, the contents of this file may be used under the terms of
  23. # either the GNU General Public License Version 2 or later (the "GPL"), or
  24. # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  25. # in which case the provisions of the GPL or the LGPL are applicable instead
  26. # of those above. If you wish to allow use of your version of this file only
  27. # under the terms of either the GPL or the LGPL, and not to allow others to
  28. # use your version of this file under the terms of the MPL, indicate your
  29. # decision by deleting the provisions above and replace them with the notice
  30. # and other provisions required by the GPL or the LGPL. If you do not delete
  31. # the provisions above, a recipient may use your version of this file under
  32. # the terms of any one of the MPL, the GPL or the LGPL.
  33. #
  34. # ***** END LICENSE BLOCK *****
  35. # -------------------------------------------------------------
  36. # The RenderMan (R) Interface Procedures and Protocol are:
  37. # Copyright 1988, 1989, 2000, Pixar
  38. # All Rights Reserved
  39. #
  40. # RenderMan (R) is a registered trademark of Pixar
  41. # -------------------------------------------------------------
  42. # $Id: ri.py,v 1.4 2006/02/14 19:29:39 mbaas Exp $
  43.  
  44. import os.path
  45. from ctypes import *
  46. import ctypes.util
  47.  
  48. def loadRI(libName):
  49.     """Load a RenderMan library and return a module-like handle to it.
  50.     
  51.     libName is the name of a shared library that implements the RenderMan
  52.     interface. The name can either be an absolute file name or just the
  53.     name of the library (without suffix or "lib" prefix) in which case 
  54.     the function tries to find the library file itself.
  55.     The return value is the library handle as returned by the ctypes 
  56.     LoadLibrary() function. This handle has already been prepared so that
  57.     it can be used like a module that contains the RenderMan interface.
  58.     """
  59.     
  60.     # Try to figure out the location of the lib if the name is not an absolute path...
  61.     if not os.path.isabs(libName):
  62.         p = ctypes.util.find_library(libName)
  63.         if p is not None:
  64.             libName = p
  65.         
  66.     # Load the library...
  67.     ri = cdll.LoadLibrary(libName)
  68.     
  69.     _createRiTypes(ri)
  70.     _createRiTokens(ri)
  71.     _createRiConstants(ri)
  72.     _createRiFunctions(ri)
  73.  
  74.     # Create an alias for every Ri function and RI_ constant that has the prefix removed...
  75.     for name in dir(ri):
  76.         if name.startswith("Ri"):
  77.             setattr(ri, name[2:], getattr(ri, name))
  78.         elif name.startswith("RI_"):
  79.             setattr(ri, name[3:], getattr(ri, name))
  80.  
  81.     ri.__class__.RiLastError = property(_getLastError, _setLastError)
  82.     ri.__class__.LastError = property(_getLastError, _setLastError)
  83.  
  84.     return ri
  85.  
  86. def importRINames(ri, ns):
  87.     """Import the RenderMan names into the given namespace.
  88.     """
  89.     for name in dir(ri):
  90.         if name.startswith("Ri"):
  91.             localName = name
  92.             ns[localName] = getattr(ri, name)
  93.             
  94.         if name[:2] in ["Rt", "RI"]:
  95.             ns[name] = getattr(ri, name)
  96.  
  97.  
  98. def _createRiTypes(ri):
  99.     """Create the RenderMan types.
  100.     
  101.     The types are added as attributes to the ri object. All names
  102.     begin with "Rt" (RtInt, RtFloat, ...).
  103.     """
  104.     
  105.     # Base types that are not composed of other RenderMan types...
  106.     baseTypes = dict(RtBoolean = c_short,
  107.                      RtInt = c_int,
  108.                      RtFloat = c_float,
  109.                      RtString = c_char_p,
  110.                      RtToken = c_char_p,
  111.                      RtVoid = None,
  112.                      RtPointer = c_void_p)
  113.     
  114.     for name,ctype in baseTypes.iteritems():
  115.         setattr(ri, name, ctype)
  116.         
  117.     ri.RtColor = 3*ri.RtFloat
  118.     ri.RtPoint = 3*ri.RtFloat
  119.     ri.RtVector = 3*ri.RtFloat
  120.     ri.RtNormal = 3*ri.RtFloat
  121.     ri.RtHpoint = 4*ri.RtFloat
  122.     ri.RtMatrix = 16*ri.RtFloat
  123.     ri.RtBasis = 16*ri.RtFloat
  124.     ri.RtBound = 6*ri.RtFloat
  125.     
  126.     ri.RtObjectHandle = ri.RtPointer
  127.     ri.RtLightHandle = ri.RtPointer
  128.     ri.RtContextHandle = ri.RtPointer
  129.     
  130.     ri.RtFilterFunc = CFUNCTYPE(ri.RtFloat,  ri.RtFloat, ri.RtFloat, ri.RtFloat, ri.RtFloat)
  131.     ri.RtErrorHandler = CFUNCTYPE(ri.RtVoid,  ri.RtInt, ri.RtInt, c_char_p)
  132.     ri.RtProcSubdivFunc = CFUNCTYPE(ri.RtVoid,  ri.RtPointer, ri.RtFloat)
  133.     ri.RtProcFreeFunc = CFUNCTYPE(ri.RtVoid,  ri.RtPointer)
  134.     ri.RtArchiveCallback = CFUNCTYPE(ri.RtVoid,  ri.RtToken, c_char_p)   # var args are missing
  135.     
  136.     
  137. def _createRiConstants(ri):
  138.     """Create the RenderMan constants.
  139.     
  140.     The types must already be available on ri.
  141.     """
  142.     
  143.     ri.RI_NULL         = None
  144.     ri.RI_TRUE         = 1
  145.     ri.RI_FALSE        = 0
  146.     ri.RI_EPSILON      = 1.0e-10
  147.     ri.RI_INFINITY     = ri.RtFloat(1.0e38).value
  148.  
  149.     ri.RI_HERMITESTEP    = 2
  150.     ri.RI_CATMULLROMSTEP = 1
  151.     ri.RI_BEZIERSTEP     = 3
  152.     ri.RI_BSPLINESTEP    = 1
  153.     ri.RI_POWERSTEP      = 4
  154.  
  155.     bases = ["RiBezierBasis", "RiBSplineBasis", "RiCatmullRomBasis",
  156.              "RiHermiteBasis", "RiPowerBasis"]
  157.     
  158.     for basis in bases:
  159.         try:
  160.             value = ri.RtBasis.in_dll(ri, basis)
  161.         except ValueError:
  162.             raise ValueError, 'The RenderMan implementation "%s" does not define the standard basis "%s"'%(getattr(ri, "_name", "?"), basis)
  163.         setattr(ri, basis, value)    
  164.     
  165. def _createRiTokens(ri):
  166.     """Create the RenderMan tokens.
  167.     
  168.     The constants are added as attributes to the ri object. All names
  169.     begin with "RI_".
  170.     """
  171.  
  172.     tokens = [("RI_A", "a"),
  173.               ("RI_ABORT", "abort"),
  174.               ("RI_AMBIENTLIGHT", "ambientlight"),
  175.               ("RI_AMPLITUDE", "amplitude"),
  176.               ("RI_AZ", "az"),
  177.               ("RI_BACKGROUND", "background"),
  178.               ("RI_BEAMDISTRIBUTION", "beamdistribution"),
  179.               ("RI_BICUBIC", "bicubic"),
  180.               ("RI_BILINEAR", "bilinear"),
  181.               ("RI_BLACK", "black"),
  182.               ("RI_BUMPY", "bumpy"),
  183.               ("RI_CAMERA", "camera"),
  184.               ("RI_CI", "Ci"),
  185.               ("RI_CLAMP", "clamp"),
  186.               ("RI_COMMENT", "comment"),
  187.               ("RI_CONEANGLE", "coneangle"),
  188.               ("RI_CONEDELTAANGLE", "conedeltaangle"),
  189.               ("RI_CONSTANT", "constant"),
  190.               ("RI_CONSTANTWIDTH", "constantwidth"),
  191.               ("RI_CS", "Cs"),
  192.               ("RI_CUBIC", "cubic"),
  193.               ("RI_DEPTHCUE", "depthcue"),
  194.               ("RI_DIFFERENCE", "difference"),
  195.               ("RI_DISTANCE", "distance"),
  196.               ("RI_DISTANTLIGHT", "distantlight"),
  197.               ("RI_FILE", "file"),
  198.               ("RI_FLATNESS", "flatness"),
  199.               ("RI_FOG", "fog"),
  200.               ("RI_FOV", "fov"),
  201.               ("RI_FRAMEBUFFER", "framebuffer"),
  202.               ("RI_FROM", "from"),
  203.               ("RI_HANDLEID", "__handleid"),
  204.               ("RI_HANDLER", "handler"),
  205.               ("RI_HIDDEN", "hidden"),
  206.               ("RI_IDENTIFIER", "identifier"),
  207.               ("RI_IGNORE", "ignore"),
  208.               ("RI_INSIDE", "inside"),
  209.               ("RI_INTENSITY", "intensity"),
  210.               ("RI_INTERSECTION", "intersection"),
  211.               ("RI_KA", "Ka"),
  212.               ("RI_KD", "Kd"),
  213.               ("RI_KR", "Kr"),
  214.               ("RI_KS", "Ks"),
  215.               ("RI_LH", "lh"),
  216.               ("RI_LIGHTCOLOR", "lightcolor"),
  217.               ("RI_LINEAR", "linear"),
  218.               ("RI_MATTE", "matte"),
  219.               ("RI_MAXDISTANCE", "maxdistance"),
  220.               ("RI_METAL", "metal"),
  221.               ("RI_MINDISTANCE", "mindistance"),
  222.               ("RI_N", "N"),
  223.               ("RI_NAME", "name"),
  224.               ("RI_NG", "Ng"),
  225.               ("RI_NONPERIODIC", "nonperiodic"),
  226.               ("RI_NP", "Np"),
  227.               ("RI_OBJECT", "object"),
  228.               ("RI_OI", "Oi"),
  229.               ("RI_ORIGIN", "origin"),
  230.               ("RI_ORTHOGRAPHIC", "orthographic"),
  231.               ("RI_OS", "Os"),
  232.               ("RI_OUTSIDE", "outside"),
  233.               ("RI_P", "P"),
  234.               ("RI_PAINT", "paint"),
  235.               ("RI_PAINTEDPLASTIC", "paintedplastic"),
  236.               ("RI_PERIODIC", "periodic"),
  237.               ("RI_PERSPECTIVE", "perspective"),
  238.               ("RI_PLASTIC", "plastic"),
  239.               ("RI_POINTLIGHT", "pointlight"),
  240.               ("RI_PRIMITIVE", "primitive"),
  241.               ("RI_PRINT", "print"),
  242.               ("RI_PW", "Pw"),
  243.               ("RI_PZ", "Pz"),
  244.               ("RI_RASTER", "raster"),
  245.               ("RI_RGB", "rgb"),
  246.               ("RI_RGBA", "rgba"),
  247.               ("RI_RGBAZ", "rgbaz"),
  248.               ("RI_RGBZ", "rgbz"),
  249.               ("RI_RH", "rh"),
  250.               ("RI_ROUGHNESS", "roughness"),
  251.               ("RI_S", "s"),
  252.               ("RI_SCREEN", "screen"),
  253.               ("RI_SHADINGGROUP", "shadinggroup"),
  254.               ("RI_SHINYMETAL", "shinymetal"),
  255.               ("RI_SMOOTH", "smooth"),
  256.               ("RI_SPECULARCOLOR", "specularcolor"),
  257.               ("RI_SPOTLIGHT", "spotlight"),
  258.               ("RI_ST", "st"),
  259.               ("RI_STRUCTURE", "structure"),
  260.               ("RI_T", "t"),
  261.               ("RI_TEXTURENAME", "texturename"),
  262.               ("RI_TO", "to"),
  263.               ("RI_UNION", "union"),
  264.               ("RI_VERBATIM", "verbatim"),
  265.               ("RI_WIDTH", "width"),
  266.               ("RI_WORLD", "world"),
  267.               ("RI_Z", "z"),
  268.               ]
  269.     
  270.     for tokSpec in tokens:
  271.         if isinstance(tokSpec, basestring):
  272.             name = tokSpec
  273.             default = None
  274.         else:
  275.             try:
  276.                 name,default = tokSpec
  277.                 if not isinstance(name, basestring):
  278.                     raise ValueError()
  279.             except:
  280.                 raise ValueError("Invalid token spec: %s"%(tokSpec,))
  281.             
  282.         try:
  283.             value = c_char_p.in_dll(ri, name).value
  284.         except ValueError:
  285.             value = default
  286.             
  287.         setattr(ri, name, value)
  288.  
  289.         
  290. def _createRiFunctions(ri):
  291.     # "Import" the types (so that we can write RtInt instead of ri.RtInt)...
  292.     for name in dir(ri):
  293.         if name.startswith("Rt"):
  294.             exec "%s = ri.%s"%(name, name)
  295.     
  296.     ri.RiArchiveRecord.argtypes = [RtToken, c_char_p]
  297.     ri.RiAreaLightSource.argtypes = [RtToken]
  298.     ri.RiAreaLightSource.restype = RtLightHandle 
  299.     ri.RiAtmosphere.argtypes = [RtToken]
  300.     ri.RiAttribute.argtypes = [RtToken]
  301.     ri.RiAttributeBegin.argtypes = []
  302.     ri.RiAttributeEnd.argtypes = []
  303.     ri.RiBasis.argtypes = [RtBasis, RtInt, RtBasis, RtInt]
  304.     ri.RiBegin.argtypes = [RtToken]
  305.     ri.RiBlobby.argtypes = [RtInt, RtInt, POINTER(RtInt), RtInt, POINTER(RtFloat), RtInt, POINTER(RtString)]
  306.     ri.RiBound.argtypes = [RtBound]
  307.     ri.RiClipping.argtypes = [RtFloat, RtFloat]
  308.     ri.RiClippingPlane.argtypes = [RtFloat, RtFloat, RtFloat, RtFloat, RtFloat, RtFloat]
  309.     ri.RiColor.argtypes = [RtColor]
  310.     ri.RiColorSamples.argtypes = [RtInt, POINTER(RtFloat), POINTER(RtFloat)]
  311.     ri.RiConcatTransform.argtypes = [RtMatrix]
  312.     ri.RiCone.argtypes = [RtFloat, RtFloat, RtFloat]
  313.     ri.RiContext.argtypes = [RtContextHandle]
  314.     ri.RiCoordinateSystem.argtypes = [RtToken]
  315.     ri.RiCoordSysTransform.argtypes = [RtToken]
  316.     ri.RiCropWindow.argtypes = [RtFloat, RtFloat, RtFloat, RtFloat]
  317.     ri.RiCurves.argtypes = [RtToken, RtInt]
  318.     ri.RiCylinder.argtypes = [RtFloat, RtFloat, RtFloat, RtFloat]
  319.     ri.RiDeclare.argtypes = [c_char_p, c_char_p]
  320.     ri.RiDeclare.restype = RtToken
  321.     ri.RiDepthOfField.argtypes = [RtFloat, RtFloat, RtFloat]
  322.     ri.RiDetail.argtypes = [RtBound]
  323.     ri.RiDetailRange.argtypes = [RtFloat, RtFloat, RtFloat, RtFloat]
  324.     ri.RiDisk.argtypes = [RtFloat, RtFloat, RtFloat]
  325.     ri.RiDisplacement.argtypes = [RtToken]
  326.     ri.RiDisplay.argtypes = [RtToken, RtToken, RtToken]
  327.     ri.RiEnd.argtypes = []
  328.     # See RiPixelFilter for an explanation why RiErrorHandler is commented out
  329. #    ri.RiErrorHandler.argtypes = [RtErrorHandler]
  330.     ri.RiExposure.argtypes = [RtFloat, RtFloat]
  331.     ri.RiExterior.argtypes = [RtToken]
  332.     ri.RiFormat.argtypes = [RtInt, RtInt, RtFloat]
  333.     ri.RiFrameAspectRatio.argtypes = [RtFloat]
  334.     ri.RiFrameBegin.argtypes = [RtInt]
  335.     ri.RiFrameEnd.argtypes = []
  336.     ri.RiGeneralPolygon.argtypes = [RtInt, POINTER(RtInt)]
  337.     ri.RiGeometricApproximation.argtypes = [RtToken, RtFloat]
  338.     ri.RiGeometry.argtypes = [RtToken]
  339.     ri.RiGetContext.argtypes = []
  340.     ri.RiGetContext.restype = RtContextHandle
  341.     ri.RiHider.argtypes = [RtToken]
  342.     ri.RiHyperboloid.argtypes = [RtPoint, RtPoint, RtFloat]
  343.     ri.RiIdentity.argtypes = []
  344.     ri.RiIlluminate.argtypes = [RtLightHandle, RtBoolean]
  345.     ri.RiImager.argtypes = [RtToken]
  346.     ri.RiInterior.argtypes = [RtToken]
  347.     ri.RiLightSource.argtypes = [RtToken]
  348.     ri.RiLightSource.restype = RtLightHandle
  349.     # In the following texture calls the declaration of the filter function is removed
  350.     # (see RiPixelFilter for more infos)
  351. #    ri.RiMakeCubeFaceEnvironment.argtypes = [c_char_p, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p, RtFloat, RtFilterFunc, RtFloat, RtFloat]
  352.     ri.RiMakeCubeFaceEnvironment.argtypes = [c_char_p, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p, RtFloat]
  353. #    ri.RiMakeLatLongEnvironment.argtypes = [c_char_p, c_char_p, RtFilterFunc, RtFloat, RtFloat]
  354.     ri.RiMakeLatLongEnvironment.argtypes = [c_char_p, c_char_p]
  355.     ri.RiMakeShadow.argtypes = [c_char_p, c_char_p]
  356. #    ri.RiMakeTexture.argtypes = [c_char_p, c_char_p, RtToken, RtToken, RtFilterFunc, RtFloat, RtFloat]
  357.     ri.RiMakeTexture.argtypes = [c_char_p, c_char_p, RtToken, RtToken]
  358.     ri.RiMatte.argtypes = [RtBoolean]
  359.     ri.RiMotionBegin.argtypes = [RtInt]
  360.     ri.RiMotionEnd.argtypes = []
  361.     ri.RiNuPatch.argtypes = [RtInt, RtInt, POINTER(RtFloat), RtFloat, RtFloat, RtInt, RtInt, POINTER(RtFloat), RtFloat, RtFloat]
  362.     ri.RiObjectBegin.argtypes = []
  363.     ri.RiObjectBegin.restype = RtObjectHandle
  364.     ri.RiObjectEnd.argtypes = []
  365.     ri.RiObjectInstance.argtypes = [RtObjectHandle]
  366.     ri.RiOpacity.argtypes = [RtColor]
  367.     ri.RiOption.argtypes = [RtToken]
  368.     ri.RiOrientation.argtypes = [RtToken]
  369.     ri.RiParaboloid.argtypes = [RtFloat, RtFloat, RtFloat, RtFloat]
  370.     ri.RiPatch.argtypes = [RtToken]
  371.     ri.RiPatchMesh.argtypes = [RtToken, RtInt, RtToken, RtInt, RtToken]
  372.     ri.RiPerspective.argtypes = [RtFloat]
  373.     # The following line is commented out because declaring the first argument
  374.     # as RtFilterFunc will prevent the standard filters from being passed in directly
  375.     # so that the renderer recognizes them as standard filters (which is necessary
  376.     # during RIB generation so that the renderer can generate the appropriate
  377.     # filter name).
  378. #    ri.RiPixelFilter.argtypes = [RtFilterFunc, RtFloat, RtFloat]
  379.     ri.RiPixelSamples.argtypes = [RtFloat, RtFloat]
  380.     ri.RiPixelVariance.argtypes = [RtFloat]
  381.     ri.RiPoints.argtypes = [RtInt]
  382.     ri.RiPointsGeneralPolygons.argtypes = [RtInt, POINTER(RtInt), POINTER(RtInt), POINTER(RtInt)]
  383.     ri.RiPointsPolygons.argtypes = [RtInt, POINTER(RtInt), POINTER(RtInt)]
  384.     ri.RiPolygon.argtypes = [RtInt]
  385. #    ri.RiProcedural.argtypes = [RtPointer, RtBound, RtProcSubdivFunc, RtProcFreeFunc]
  386.     ri.RiProcedural.argtypes = [RtPointer, RtBound]
  387.     ri.RiProjection.argtypes = [RtToken]
  388.     ri.RiQuantize.argtypes = [RtToken, RtInt, RtInt, RtInt, RtFloat]
  389.     # When the second argument is set to RtArchiveCallback then it is not possible to pass None
  390. #    ri.RiReadArchive.argtypes = [RtToken, RtArchiveCallback]
  391.     ri.RiReadArchive.argtypes = [RtToken]
  392.     ri.RiRelativeDetail.argtypes = [RtFloat]
  393.     ri.RiReverseOrientation.argtypes = []
  394.     ri.RiRotate.argtypes = [RtFloat, RtFloat, RtFloat, RtFloat]
  395.     ri.RiScale.argtypes = [RtFloat, RtFloat, RtFloat]
  396.     ri.RiScreenWindow.argtypes = [RtFloat, RtFloat, RtFloat, RtFloat]
  397.     ri.RiShadingInterpolation.argtypes = [RtToken]
  398.     ri.RiShadingRate.argtypes = [RtFloat]
  399.     ri.RiShutter.argtypes = [RtFloat, RtFloat]
  400.     ri.RiSides.argtypes = [RtInt]
  401.     ri.RiSkew.argtypes = [RtFloat, RtFloat, RtFloat, RtFloat, RtFloat, RtFloat, RtFloat]
  402.     ri.RiSolidBegin.argtypes = [RtToken]
  403.     ri.RiSolidEnd.argtypes = []
  404.     ri.RiSphere.argtypes = [RtFloat, RtFloat, RtFloat, RtFloat]
  405.     ri.RiSubdivisionMesh.argtypes = [RtToken, RtInt, POINTER(RtInt), POINTER(RtInt), RtInt, POINTER(RtToken), POINTER(RtInt), POINTER(RtInt), POINTER(RtFloat)]
  406.     ri.RiSurface.argtypes = [RtToken]
  407.     ri.RiTextureCoordinates.argtypes = [RtFloat, RtFloat, RtFloat, RtFloat, RtFloat, RtFloat, RtFloat, RtFloat]
  408.     ri.RiTorus.argtypes = [RtFloat, RtFloat, RtFloat, RtFloat, RtFloat]
  409.     ri.RiTransform.argtypes = [RtMatrix]
  410.     ri.RiTransformBegin.argtypes = []
  411.     ri.RiTransformEnd.argtypes = []
  412.     ri.RiTransformPoints.argtypes = [RtToken, RtToken, RtInt, POINTER(RtPoint)]
  413.     ri.RiTranslate.argtypes = [RtFloat, RtFloat, RtFloat]
  414.     ri.RiTrimCurve.argtypes = [RtInt, POINTER(RtInt), POINTER(RtInt), POINTER(RtFloat), POINTER(RtFloat), POINTER(RtFloat), POINTER(RtInt), POINTER(RtFloat), POINTER(RtFloat), POINTER(RtFloat)]
  415.     ri.RiWorldBegin.argtypes = []
  416.     ri.RiWorldEnd.argtypes = []
  417.     
  418.     ri.RiBoxFilter.argtypes = [c_float, c_float, c_float, c_float]
  419.     ri.RiBoxFilter.restype = c_float
  420.     ri.RiTriangleFilter.argtypes = [c_float, c_float, c_float, c_float]
  421.     ri.RiTriangleFilter.restype = c_float
  422.     ri.RiCatmullRomFilter.argtypes = [c_float, c_float, c_float, c_float]
  423.     ri.RiCatmullRomFilter.restype = c_float
  424.     ri.RiGaussianFilter.argtypes = [c_float, c_float, c_float, c_float]
  425.     ri.RiGaussianFilter.restype = c_float
  426.     ri.RiSincFilter.argtypes = [c_float, c_float, c_float, c_float]
  427.     ri.RiSincFilter.restype = c_float
  428.     
  429.     
  430. def _getLastError(ri):
  431.     """Getter function for the RiLastError variable.
  432.     """
  433.     try:
  434.         return c_int.in_dll(ri, "RiLastError").value
  435.     except ValueError:
  436.         return None    
  437.  
  438. def _setLastError(ri, value):
  439.     """Setter function for the RiLastError variable.
  440.     """
  441.     try:
  442.         c_int.in_dll(ri, "RiLastError").value = value
  443.     except ValueError:
  444.         pass
  445.     
  446.    
  447.