You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
5.9 KiB
C++

/*=========================================================================
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 "vtkExporter.h"
#include "vtkIOExportModule.h" // For export macro
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