1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4   Module:    TestPathTracerBackground.cxx
5 
6   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7   All rights reserved.
8   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10      This software is distributed WITHOUT ANY WARRANTY; without even
11      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12      PURPOSE.  See the above copyright notice for more information.
13 
14 =========================================================================*/
15 // This test verifies that environmental background options work with path tracer
16 //
17 // The command line arguments are:
18 // -I        => run in interactive mode; unless this is used, the program will
19 //              not allow interaction and exit
20 //              In interactive mode it responds to the keys listed
21 //              vtkOSPRayTestInteractor.h
22 
23 #include "vtkTestUtilities.h"
24 
25 #include "vtkActor.h"
26 #include "vtkCamera.h"
27 #include "vtkImageData.h"
28 #include "vtkJPEGReader.h"
29 #include "vtkLight.h"
30 #include "vtkOSPRayPass.h"
31 #include "vtkOSPRayRendererNode.h"
32 #include "vtkOpenGLRenderer.h"
33 #include "vtkPLYReader.h"
34 #include "vtkPolyDataMapper.h"
35 #include "vtkPolyDataNormals.h"
36 #include "vtkRenderWindow.h"
37 #include "vtkRenderWindowInteractor.h"
38 #include "vtkRenderer.h"
39 #include "vtkSmartPointer.h"
40 #include "vtkTexture.h"
41 
42 #include "vtkOSPRayTestInteractor.h"
43 
TestPathTracerBackground(int argc,char * argv[])44 int TestPathTracerBackground(int argc, char* argv[])
45 {
46   vtkSmartPointer<vtkRenderWindowInteractor> iren =
47     vtkSmartPointer<vtkRenderWindowInteractor>::New();
48   vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
49   iren->SetRenderWindow(renWin);
50   vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
51   renWin->AddRenderer(renderer);
52   vtkOSPRayRendererNode::SetBackgroundMode(vtkOSPRayRendererNode::Environment, renderer);
53   vtkOSPRayRendererNode::SetSamplesPerPixel(16, renderer);
54 
55   vtkSmartPointer<vtkLight> l = vtkSmartPointer<vtkLight>::New();
56   l->SetLightTypeToHeadlight();
57   l->SetIntensity(0.1);
58   renderer->AddLight(l);
59 
60   // todo: as soon as we get materials, make the bunny reflective
61   // to really show off
62   const char* fileName = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/bunny.ply");
63   vtkSmartPointer<vtkPLYReader> polysource = vtkSmartPointer<vtkPLYReader>::New();
64   polysource->SetFileName(fileName);
65 
66   vtkSmartPointer<vtkPolyDataNormals> normals = vtkSmartPointer<vtkPolyDataNormals>::New();
67   normals->SetInputConnection(polysource->GetOutputPort());
68 
69   vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
70   mapper->SetInputConnection(normals->GetOutputPort());
71   vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
72   renderer->AddActor(actor);
73   actor->SetMapper(mapper);
74   renWin->SetSize(400, 400);
75 
76   vtkSmartPointer<vtkOSPRayPass> ospray = vtkSmartPointer<vtkOSPRayPass>::New();
77   renderer->SetPass(ospray);
78   vtkOSPRayRendererNode::SetRendererType("pathtracer", renderer);
79   for (int i = 0; i < argc; ++i)
80   {
81     if (!strcmp(argv[i], "--OptiX"))
82     {
83       vtkOSPRayRendererNode::SetRendererType("optix pathtracer", renderer);
84       break;
85     }
86   }
87 
88   // default orientation
89   renderer->SetEnvironmentUp(1.0, 0.0, 0.0);
90   renderer->SetEnvironmentRight(0.0, 1.0, 0.0);
91 
92   renderer->SetEnvironmentalBG(0.1, 0.1, 1.0);
93   renWin->Render();
94   renWin->Render(); // should cache
95 
96   renderer->SetEnvironmentalBG(0.0, 0.0, 0.0);
97   renderer->SetEnvironmentalBG2(0.8, 0.8, 1.0);
98   renderer->GradientEnvironmentalBGOn();
99   renWin->Render(); // should invalidate and remake using default up
100   renWin->Render(); // should cache
101 
102   // default view with this data is x to right, z toward camera and y up
103   renderer->SetEnvironmentUp(0.0, 1.0, 0.0);
104   renderer->SetEnvironmentRight(1.0, 0.0, 0.0);
105   // spin up around x axis
106   for (double i = 0.; i < 6.28; i += 1.)
107   {
108     renderer->SetEnvironmentUp(0.0, cos(i), sin(i));
109     renWin->Render();
110   }
111 
112   vtkSmartPointer<vtkTexture> textr = vtkSmartPointer<vtkTexture>::New();
113   vtkSmartPointer<vtkJPEGReader> imgReader = vtkSmartPointer<vtkJPEGReader>::New();
114   vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New();
115 
116   char* fname = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/wintersun.jpg");
117   imgReader->SetFileName(fname);
118   delete[] fname;
119   imgReader->Update();
120   textr->SetInputConnection(imgReader->GetOutputPort(0));
121   renderer->UseImageBasedLightingOn();
122   renWin->Render(); // shouldn't crash
123   renderer->SetEnvironmentTexture(textr);
124   renWin->Render(); // should invalidate and remake
125   renWin->Render(); // should cache
126   // spin up around x axis
127   for (double i = 0.; i < 6.28; i += 1.)
128   {
129     renderer->SetEnvironmentUp(0.0, cos(i), sin(i));
130     renWin->Render();
131   }
132 
133   // spin east around y axis
134   for (double i = 0.; i < 6.28; i += 1.)
135   {
136     renderer->SetEnvironmentRight(cos(i), 0.0, sin(i));
137     renWin->Render();
138   }
139 
140   vtkSmartPointer<vtkOSPRayTestInteractor> style = vtkSmartPointer<vtkOSPRayTestInteractor>::New();
141   style->SetPipelineControlPoints(renderer, ospray, nullptr);
142   iren->SetInteractorStyle(style);
143   style->SetCurrentRenderer(renderer);
144 
145   iren->Start();
146   return 0;
147 }
148