forked from AcademySoftwareFoundation/MaterialX
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Viewer.h
270 lines (219 loc) · 7.64 KB
/
Viewer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
#ifndef MATERIALXVIEW_VIEWER_H
#define MATERIALXVIEW_VIEWER_H
#include <MaterialXView/Editor.h>
#include <MaterialXView/Material.h>
#include <MaterialXRenderGlsl/GLFramebuffer.h>
#include <MaterialXRender/GeometryHandler.h>
#include <MaterialXRender/LightHandler.h>
#include <MaterialXRender/ViewHandler.h>
#include <MaterialXGenGlsl/GlslShaderGenerator.h>
#include <MaterialXCore/Unit.h>
namespace mx = MaterialX;
namespace ng = nanogui;
class Viewer : public ng::Screen
{
public:
Viewer(const std::string& materialFilename,
const std::string& meshFilename,
const mx::Vector3& meshRotation,
float meshScale,
const mx::Vector3& cameraPosition,
const mx::Vector3& cameraTarget,
float cameraViewAngle,
const std::string& envRadiancePath,
mx::HwSpecularEnvironmentMethod specularEnvironmentMethod,
float lightRotation,
const mx::FilePathVec& libraryFolders,
const mx::FileSearchPath& searchPath,
const DocumentModifiers& modifiers,
int screenWidth,
int screenHeight,
const mx::Color3& screenColor,
int multiSampleCount);
~Viewer() { }
void drawContents() override;
bool keyboardEvent(int key, int scancode, int action, int modifiers) override;
bool scrollEvent(const ng::Vector2i& p, const ng::Vector2f& rel) override;
bool mouseMotionEvent(const ng::Vector2i& p, const ng::Vector2i& rel, int button, int modifiers) override;
bool mouseButtonEvent(const ng::Vector2i& p, int button, bool down, int modifiers) override;
void renderFrame();
mx::ImagePtr getFrameImage();
mx::ImagePtr renderWedge();
void bakeTextures();
ng::Window* getWindow() const
{
return _window;
}
void setSelectedMaterial(MaterialPtr material)
{
for (size_t i = 0; i < _materials.size(); i++)
{
if (material == _materials[i])
{
_selectedMaterial = i;
break;
}
}
}
MaterialPtr getSelectedMaterial() const
{
if (_selectedMaterial < _materials.size())
{
return _materials[_selectedMaterial];
}
return nullptr;
}
mx::MeshPartitionPtr getSelectedGeometry() const
{
if (_selectedGeom < _geometryList.size())
{
return _geometryList[_selectedGeom];
}
return nullptr;
}
const mx::FileSearchPath& getSearchPath() const
{
return _searchPath;
}
mx::ImageHandlerPtr getImageHandler() const
{
return _imageHandler;
}
private:
void loadEnvironmentLight();
void applyDirectLights(mx::DocumentPtr doc);
void loadDocument(const mx::FilePath& filename, mx::DocumentPtr libraries);
void reloadShaders();
void loadStandardLibraries();
void saveShaderSource();
void loadShaderSource();
void saveDotFiles();
/// Assign the given material to the given geometry, or remove any
/// existing assignment if the given material is nullptr.
void assignMaterial(mx::MeshPartitionPtr geometry, MaterialPtr material);
void initCamera();
void updateViewHandlers();
void updateGeometrySelections();
void updateMaterialSelections();
void updateMaterialSelectionUI();
void updateDisplayedProperties();
void createLoadMeshInterface(Widget* parent, const std::string& label);
void createLoadMaterialsInterface(Widget* parent, const std::string& label);
void createLoadEnvironmentInterface(Widget* parent, const std::string& label);
void createSaveMaterialsInterface(Widget* parent, const std::string& label);
void createPropertyEditorInterface(Widget* parent, const std::string& label);
void createAdvancedSettings(Widget* parent);
/// Return the ambient occlusion image, if any, associated with the given material.
mx::ImagePtr getAmbientOcclusionImage(MaterialPtr material);
/// Split the given radiance map into indirect and direct components,
/// returning a new indirect map and directional light document.
void splitDirectLight(mx::ImagePtr envRadianceMap, mx::ImagePtr& indirectMap, mx::DocumentPtr& dirLightDoc);
/// Update the current shadow map.
void updateShadowMap();
/// Update the directional albedo table.
void updateAlbedoTable();
/// Check for any OpenGL errors that have been encountered.
void checkGlErrors(const std::string& context);
private:
ng::Window* _window;
ng::Arcball _arcball;
mx::Vector3 _meshTranslation;
mx::Vector3 _meshRotation;
float _meshScale;
mx::Vector3 _cameraPosition;
mx::Vector3 _cameraTarget;
mx::Vector3 _cameraUp;
float _cameraViewAngle;
float _cameraNearDist;
float _cameraFarDist;
bool _userCameraEnabled;
mx::Vector3 _userTranslation;
mx::Vector3 _userTranslationStart;
bool _userTranslationActive;
ng::Vector2i _userTranslationPixel;
float _userScale;
// Document management
mx::FilePathVec _libraryFolders;
mx::FileSearchPath _searchPath;
mx::DocumentPtr _stdLib;
mx::FilePath _materialFilename;
DocumentModifiers _modifiers;
mx::StringSet _xincludeFiles;
// Lighting information
mx::FilePath _envRadiancePath;
mx::FilePath _lightRigFilename;
mx::DocumentPtr _lightRigDoc;
float _lightRotation;
bool _directLighting;
bool _indirectLighting;
// Light processing options
bool _normalizeEnvironment;
bool _splitDirectLight;
bool _generateReferenceIrradiance;
bool _saveGeneratedLights;
// Shadow mapping
MaterialPtr _shadowMaterial;
MaterialPtr _shadowBlurMaterial;
mx::ImagePtr _shadowMap;
unsigned int _shadowSoftness;
// Ambient occlusion
float _ambientOcclusionGain;
// Geometry selections
mx::FilePath _meshFilename;
std::vector<mx::MeshPartitionPtr> _geometryList;
size_t _selectedGeom;
ng::Label* _geomLabel;
ng::ComboBox* _geometrySelectionBox;
// Material selections
std::vector<MaterialPtr> _materials;
MaterialPtr _wireMaterial;
size_t _selectedMaterial;
ng::Label* _materialLabel;
ng::ComboBox* _materialSelectionBox;
PropertyEditor _propertyEditor;
// Material assignments
std::map<mx::MeshPartitionPtr, MaterialPtr> _materialAssignments;
// Resource handlers
mx::GeometryHandlerPtr _geometryHandler;
mx::ImageHandlerPtr _imageHandler;
mx::LightHandlerPtr _lightHandler;
// View handlers
mx::ViewHandlerPtr _cameraViewHandler;
mx::ViewHandlerPtr _shadowViewHandler;
// Supporting materials and geometry.
mx::GeometryHandlerPtr _envGeometryHandler;
MaterialPtr _envMaterial;
// Shader generator
mx::GenContext _genContext;
// Unit registry
mx::UnitConverterRegistryPtr _unitRegistry;
// Mesh options
bool _splitByUdims;
// Material options
bool _mergeMaterials;
bool _bakeTextures;
// Unit options
mx::StringVec _distanceUnitOptions;
ng::ComboBox* _distanceUnitBox;
mx::LinearUnitConverterPtr _distanceUnitConverter;
// Render options
bool _outlineSelection;
int _envSamples;
bool _drawEnvironment;
// Frame capture
bool _captureRequested;
mx::FilePath _captureFilename;
// Wedge rendering
bool _wedgeRequested;
mx::FilePath _wedgeFilename;
std::string _wedgePropertyName;
float _wedgePropertyMin;
float _wedgePropertyMax;
unsigned int _wedgeImageCount;
// Texture baking
bool _bakeRequested;
mx::FilePath _bakeFilename;
};
extern const mx::Vector3 DEFAULT_CAMERA_POSITION;
extern const float DEFAULT_CAMERA_VIEW_ANGLE;
#endif // MATERIALXVIEW_VIEWER_H