text: /*=========================================================================
  
    Program:   Visualization Toolkit
    Module:    vtkRIBExporter.h
  
    Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
    All rights reserved.
    See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
  
       This software is distributed WITHOUT ANY WARRANTY; without even
       the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
       PURPOSE.  See the above copyright notice for more information.
  
  =========================================================================*/
  /**
   * @class   vtkRIBExporter
   * @brief   export a scene into RenderMan RIB format.
   *
   * vtkRIBExporter is a concrete subclass of vtkExporter that writes a
   * Renderman .RIB files. The input specifies a vtkRenderWindow. All
   * visible actors and lights will be included in the rib file. The
   * following file naming conventions apply:
   *   rib file - FilePrefix.rib
   *   image file created by RenderMan - FilePrefix.tif
   *   texture files - TexturePrefix_0xADDR_MTIME.tif
   * This object does NOT generate an image file. The user must run either
   * RenderMan or a RenderMan emulator like Blue Moon Ray Tracer (BMRT).
   * vtk properties are convert to Renderman shaders as follows:
   *   Normal property, no texture map - plastic.sl
   *   Normal property with texture map - txtplastic.sl
   * These two shaders must be compiled by the rendering package being
   * used.  vtkRIBExporter also supports custom shaders. The shaders are
   * written using the Renderman Shading Language. See "The Renderman
   * Companion", ISBN 0-201-50868, 1989 for details on writing shaders.
   * vtkRIBProperty specifies the declarations and parameter settings for
   * custom shaders.
   *
   * @sa
   * vtkExporter vtkRIBProperty vtkRIBLight
  */
  
  #ifndef vtkRIBExporter_h
  #define vtkRIBExporter_h
  
  #include "vtkIOExportModule.h" // For export macro
  #include "vtkExporter.h"
  
  class vtkActor;
  class vtkCamera;
  class vtkLight;
  class vtkPolyData;
  class vtkProperty;
  class vtkRenderer;
  class vtkTexture;
  class vtkUnsignedCharArray;
  
  class VTKIOEXPORT_EXPORT vtkRIBExporter : public vtkExporter
  {
  public:
    static vtkRIBExporter *New();
    vtkTypeMacro(vtkRIBExporter,vtkExporter);
    void PrintSelf(ostream& os, vtkIndent indent) override;
  
    //@{
    /**
     * Specify the size of the image for RenderMan. If none is specified, the
     * size of the render window will be used.
     */
    vtkSetVector2Macro(Size,int);
    vtkGetVectorMacro(Size,int,2);
    //@}
  
    //@{
    /**
     * Specify the sampling rate for the rendering. Default is 2 2.
     */
    vtkSetVector2Macro(PixelSamples,int);
    vtkGetVectorMacro(PixelSamples,int,2);
    //@}
  
    //@{
    /**
     * Specify the prefix of the files to write out. The resulting file names
     * will have .rib appended to them.
     */
    vtkSetStringMacro(FilePrefix);
    vtkGetStringMacro(FilePrefix);
    //@}
  
    //@{
    /**
     * Specify the prefix of any generated texture files.
     */
    vtkSetStringMacro(TexturePrefix);
    vtkGetStringMacro(TexturePrefix);
    //@}
  
    //@{
    /**
     * Set/Get the background flag. Default is 0 (off).
     * If set, the rib file will contain an
     * image shader that will use the renderer window's background
     * color. Normally, RenderMan does generate backgrounds. Backgrounds are
     * composited into the scene with the tiffcomp program that comes with
     * Pixar's RenderMan Toolkit.  In fact, Pixar's Renderman will accept an
     * image shader but only sets the alpha of the background. Images created
     * this way will still have a black background but contain an alpha of 1
     * at all pixels and CANNOT be subsequently composited with other images
     * using tiffcomp.  However, other RenderMan compliant renderers like
     * Blue Moon Ray Tracing (BMRT) do allow image shaders and properly set
     * the background color. If this sounds too confusing, use the following
     * rules: If you are using Pixar's Renderman, leave the Background
     * off. Otherwise, try setting BackGroundOn and see if you get the
     * desired results.
     */
    vtkSetMacro(Background,vtkTypeBool);
    vtkGetMacro(Background,vtkTypeBool);
    vtkBooleanMacro(Background,vtkTypeBool);
    //@}
  
    //@{
    /**
     * Set or get the ExportArrays. If ExportArrays is set, then
     * all point data, field data, and cell data arrays will get
     * exported together with polygons. Default is Off (0).
     */
    vtkSetClampMacro(ExportArrays, vtkTypeBool, 0, 1);
    vtkBooleanMacro(ExportArrays, vtkTypeBool);
    vtkGetMacro(ExportArrays, vtkTypeBool);
    //@}
  
  protected:
    vtkRIBExporter();
    ~vtkRIBExporter() override;
  
    vtkTypeBool Background;
    int Size[2];
    int PixelSamples[2];
  
    /**
     * This variable defines whether the arrays are exported or not.
     */
    vtkTypeBool ExportArrays;
  
    //@{
    /**
     * Write the RIB header.
     */
    void WriteHeader (vtkRenderer *aRen);
    void WriteTrailer ();
    void WriteTexture (vtkTexture *aTexture);
    void WriteViewport (vtkRenderer *aRenderer, int size[2]);
    void WriteCamera (vtkCamera *aCamera);
    void WriteLight (vtkLight *aLight, int count);
    void WriteAmbientLight (int count);
    void WriteProperty (vtkProperty *aProperty, vtkTexture *aTexture);
    void WritePolygons (vtkPolyData *pd, vtkUnsignedCharArray *colors,
                        vtkProperty *aProperty);
    void WriteStrips (vtkPolyData *pd, vtkUnsignedCharArray *colors,
                      vtkProperty *aProperty);
    //@}
  
    void WriteData() override;
    void WriteActor(vtkActor *anActor);
  
    /**
     * Since additional variables are sent to the shader as
     * variables, and their names are used in the shader, these
     * names have to follow C naming convention. This method
     * modifies array name so that you can use it in shader.
     */
    void ModifyArrayName(char *newname, const char* name);
  
    char *GetTextureName (vtkTexture *aTexture);
    char *GetTIFFName (vtkTexture *aTexture);
    char *FilePrefix;
    FILE *FilePtr;
    char *TexturePrefix;
  private:
    vtkRIBExporter(const vtkRIBExporter&) = delete;
    void operator=(const vtkRIBExporter&) = delete;
  };
  
  #endif
  
  