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