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
184 lines
5.9 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
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
|