Fix handling of phase wrap in ToF simulation, and add example to demonstrate it.
[camsim.git] / camsim-helloworld / camsim-helloworld.cpp
1 /*
2  * Copyright (C) 2017, 2018
3  * Computer Graphics Group, University of Siegen
4  * Written by Martin Lambers <martin.lambers@uni-siegen.de>
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24
25 #include <QGuiApplication>
26 #include <QOpenGLContext>
27 #include <QOffscreenSurface>
28
29 #include <camsim/camsim.hpp>
30
31 int main(int argc, char* argv[])
32 {
33     /* Initialize Qt and an OpenGL context */
34     QGuiApplication app(argc, argv);
35     QSurfaceFormat format;
36     format.setProfile(QSurfaceFormat::CoreProfile);
37     format.setVersion(4, 5);
38     QSurfaceFormat::setDefaultFormat(format);
39     QOffscreenSurface surface;
40     surface.create();
41     QOpenGLContext context;
42     context.create();
43     context.makeCurrent(&surface);
44
45     /* Define a simple demo scene: a torus in a box,
46      * and a light source at the camera position */
47
48     CamSim::Scene scene;
49     CamSim::Generator generator;
50
51     CamSim::Light light;
52     light.type = CamSim::PointLight;
53     light.isRelativeToCamera = true;
54     light.position = QVector3D(0.0f, 0.0f, 0.0f);
55     light.color = QVector3D(2.0f, 2.0f, 2.0f);
56     light.attenuationConstant = 1.0f;
57     light.attenuationLinear = 0.0f;
58     light.attenuationQuadratic = 0.0f;
59     scene.addLight(light);
60
61     CamSim::Material boxMaterial;
62     boxMaterial.isTwoSided = true; // we want to look at the inner side of the box
63     boxMaterial.diffuse = QVector3D(0.5f, 0.5f, 0.5f);
64     boxMaterial.specular = QVector3D(0.0f, 0.0f, 0.0f);
65     int boxMaterialIndex = scene.addMaterial(boxMaterial);
66     CamSim::Transformation boxTransformation;
67     boxTransformation.scaling = QVector3D(0.5f, 0.5f, 1.0f);
68     generator.addCubeToScene(scene, boxMaterialIndex, boxTransformation);
69
70     CamSim::Material torusMaterial;
71     torusMaterial.diffuse = QVector3D(0.0f, 1.0f, 0.0f);
72     torusMaterial.specular = QVector3D(0.0f, 0.0f, 0.0f);
73     int torusMaterialIndex = scene.addMaterial(torusMaterial);
74     CamSim::Transformation torusTransformation;
75     torusTransformation.scaling = QVector3D(0.3f, 0.3f, 0.3f);
76     torusTransformation.translation = QVector3D(0.0f, 0.0f, -0.5f);
77     generator.addTorusToScene(scene, torusMaterialIndex, torusTransformation);
78 //    generator.addArmadilloToScene(scene, torusMaterialIndex, torusTransformation);
79 //    generator.addBuddhaToScene(scene, torusMaterialIndex, torusTransformation);
80 //    generator.addBunnyToScene(scene, torusMaterialIndex, torusTransformation);
81 //    generator.addDragonToScene(scene, torusMaterialIndex, torusTransformation);
82 //    generator.addTeapotToScene(scene, torusMaterialIndex, torusTransformation);
83
84     /* Simulate */
85
86     CamSim::Pipeline pipeline;
87     pipeline.spatialSamples = QSize(3, 3); // spatial oversampling
88
89     CamSim::Output output;
90     output.rgb = true;
91     output.srgb = true;
92     output.pmd = true;
93     output.eyeSpacePositions = true;
94     output.depthAndRange = true;
95
96     CamSim::Simulator simulator;
97     simulator.setScene(scene);
98     simulator.setPipeline(pipeline);
99     simulator.setOutput(output);
100     CamSim::Transformation cameraTransformation;
101     cameraTransformation.translation = QVector3D(0.0f, 0.0f, 0.5f);
102     simulator.setCameraTransformation(cameraTransformation);
103
104     simulator.simulate(0);
105
106     /* Export results */
107     
108     CamSim::Exporter exporter;
109     exporter.asyncExportData("rgb.png", simulator.getSRGB());
110     exporter.asyncExportData("pmd-0.csv", simulator.getPMD(0));
111     exporter.asyncExportData("pmd-1.csv", simulator.getPMD(1));
112     exporter.asyncExportData("pmd-2.csv", simulator.getPMD(2));
113     exporter.asyncExportData("pmd-3.csv", simulator.getPMD(3));
114     exporter.asyncExportData("pmd-result.csv", simulator.getPMD());
115     exporter.asyncExportData("positions.csv", simulator.getEyeSpacePositions());
116     exporter.asyncExportData("depthrange.csv", simulator.getDepthAndRange());
117
118     exporter.waitForAsyncExports();
119 }