-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathmain.cpp
159 lines (148 loc) · 5 KB
/
main.cpp
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
/*
* Copyright (c) 2020 Nobuyuki Umetani
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include <filesystem>
#include <cmath>
#if defined(_WIN32) // windows
# define NOMINMAX // to remove min,max macro
# include <windows.h> // should be before glfw3.h
#endif
#define GL_SILENCE_DEPRECATION
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include "delfem2/srch_bruteforce.h"
#include "delfem2/msh_io_obj.h"
#include "delfem2/msh_affine_transformation.h"
#include "delfem2/glfw/viewer3.h"
#include "delfem2/glfw/util.h"
#include "delfem2/opengl/old/funcs.h"
#include "delfem2/opengl/old/mshuni.h"
#include "delfem2/opengl/old/color.h"
#include "delfem2/opengl/old/r2tglo.h"
namespace dfm2 = delfem2;
int main() {
std::vector<double> vtx_xyz;
std::vector<unsigned int> tri_vtx;
dfm2::Read_Obj(
vtx_xyz, tri_vtx,
std::filesystem::path(PATH_INPUT_DIR) / "rollsRoyce.obj");
dfm2::Normalize_Points3(vtx_xyz, 4.0);
// ---------------------------------------
dfm2::opengl::CDrawerOldGL_Render2Tex drawer_r2t;
dfm2::opengl::CRender2Tex render2texture;
{
const unsigned int nresX = 128;
const unsigned int nresY = 128;
const unsigned int nresZ = 256;
double elen = 0.02;
render2texture.SetTextureProperty(nresX, nresZ, true);
dfm2::CMat4d::AffineAxisTransform(
{1,0,0},
{0,0,1},
{0,1,0}
).CopyTo(render2texture.mat_modelview);
dfm2::CMat4d::AffineOrthogonalProjection(
-elen*nresX*0.5, elen*nresX*0.5,
-elen*nresZ*0.5, elen*nresZ*0.5,
-elen*nresY*0.5, elen*nresY*0.5
).CopyTo(render2texture.mat_projection);
drawer_r2t.SetPointColor(0.0, 1.0, 0.0);
drawer_r2t.draw_len_axis = 0.2;
drawer_r2t.isDrawTex = false;
drawer_r2t.isDrawOnlyHitPoints = true;
}
// ---------------------------------------
dfm2::glfw::CViewer3 viewer(2.0);
//
dfm2::glfw::InitGLOld();
viewer.OpenWindow();
if (!gladLoadGL()) { // glad: load all OpenGL function pointers
printf("Something went wrong in loading OpenGL functions!\n");
exit(-1);
}
dfm2::opengl::setSomeLighting();
::glEnable(GL_DEPTH_TEST);
{
render2texture.InitGL(); // move the sampled image to a texture
render2texture.Start();
dfm2::opengl::SetView(render2texture);
::glClearColor(1.0, 1.0, 1.0, 1.0);
::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
::glEnable(GL_DEPTH_TEST);
::glDisable(GL_BLEND);
::glEnable(GL_LIGHTING);
dfm2::opengl::DrawMeshTri3D_FaceNorm(vtx_xyz, tri_vtx);
render2texture.End();
}
for (int iframe = 0;; iframe++) {
dfm2::CVec3d dir(cos(iframe * 0.003), sin(iframe * 0.005), sin(iframe * 0.007));
dfm2::CVec3d src(1.5 * cos(iframe * 0.005), 1.5 * sin(iframe * 0.007), 1.5 * sin(iframe * 0.009));
// ----
std::vector<double> aXYZ1;
{
const dfm2::CMat4d mat4_mvp = render2texture.GetAffineMatrix4_Global2DepthOnGrid();
const dfm2::CVec3d p0 = mat4_mvp.MultVec3_Homography(src.data());
const dfm2::CVec3d p1 = mat4_mvp.MultVec3(dir.data());
std::vector<dfm2::PointOnSurfaceMesh<double>> vec_point_on_triangle;
dfm2::IntersectionLine_Hightfield(
vec_point_on_triangle,
p0.data(), p1.normalized().data(),
render2texture.width, render2texture.height,
render2texture.aDepth);
for (const auto &pes : vec_point_on_triangle) {
dfm2::CVec3d lpos = pes.PositionOnGrid2(
render2texture.width, render2texture.height,
1.0, render2texture.aDepth);
const dfm2::CVec3d q2 = mat4_mvp.Inverse().MultVec3_Homography(lpos.data());
aXYZ1.push_back(q2.x);
aXYZ1.push_back(q2.y);
aXYZ1.push_back(q2.z);
}
}
{
viewer.DrawBegin_oldGL();
dfm2::opengl::DrawBackground(dfm2::CColor(0.2, 0.7, 0.7));
// ----------
glPointSize(5);
{
::glBegin(GL_POINTS);
::glColor3d(1, 0, 0);
// ::glVertex3dv((src-dir.Normalize()).p);
// ::glColor3d(0,1,0);
// ::glVertex3dv((src+dir.Normalize()).p);
::glVertex3dv(src.p);
::glEnd();
}
{
::glColor3d(1, 0, 0);
dfm2::CVec3d p0 = src + 10.0 * dir;
dfm2::CVec3d p1 = src - 10.0 * dir;
::glLineWidth(1);
::glBegin(GL_LINES);
::glVertex3d(p0.x, p0.y, p0.z);
::glVertex3d(p1.x, p1.y, p1.z);
::glEnd();
}
for (unsigned int ixyz = 0; ixyz < aXYZ1.size() / 3; ++ixyz) {
::glBegin(GL_POINTS);
::glColor3d(0, 0, 1);
::glVertex3d(aXYZ1[ixyz * 3 + 0], aXYZ1[ixyz * 3 + 1], aXYZ1[ixyz * 3 + 2]);
::glEnd();
}
// ----------
::glEnable(GL_LIGHTING);
dfm2::opengl::DrawMeshTri3D_FaceNorm(vtx_xyz, tri_vtx);
glPointSize(1);
drawer_r2t.Draw(render2texture);
viewer.SwapBuffers();
glfwPollEvents();
}
if (glfwWindowShouldClose(viewer.window)) { break; }
}
glfwDestroyWindow(viewer.window);
glfwTerminate();
exit(EXIT_SUCCESS);
}