SimpleFastOpenAtomicVisualiser
Loading...
Searching...
No Matches
main.h
Go to the documentation of this file.
1#ifndef MAIN_H
2#define MAIN_H
3
4#include <sstream>
5#include <chrono>
6#include <exception>
7#include <algorithm>
8
9#define STB_IMAGE_WRITE_IMPLEMENTATION
10#include <stb_image_write.h>
11
12#include <jGL/jGL.h>
13#include <jGL/OpenGL/openGLInstance.h>
14#include <jGL/Display/desktopDisplay.h>
15#include <jGL/orthoCam.h>
16
17#include <icon.h>
18
19#include <atom.h>
20#include <atomRenderer.h>
21#include <bondRenderer.h>
22#include <axes.h>
23#include <util.h>
24#include <glUtils.h>
25#include <structureUtils.h>
26#include <commandLine.h>
27#include <xyz.h>
28#include <config.h>
29#include <camera.h>
30#include <cell.h>
31#include <console.h>
32#include <visualisationState.h>
33#include <neighbours.h>
34#include <infoWindow.h>
35#include <cameraWindow.h>
36#include <font.h>
37
38const float dr = (1.0)*0.5;
39const float dtheta = (3.14)*0.025;
40const float dphi = (2.0*3.14)*0.05;
41
42const float emphasisedAlpha = 1.0f;
43
44bool closing = false;
45
46std::unique_ptr<jGL::jGLInstance> jGLInstance;
47
54void screenshot(glm::ivec2 resolution)
55{
56 std::vector<uint8_t> pixels(resolution.x*resolution.y*4, 0);
58 (
59 0,
60 0,
61 resolution.x,
62 resolution.y,
63 GL_RGBA,
65 pixels.data()
66 );
68 std::string name = timeStamp()+".png";
69 stbi_write_png(name.c_str(), resolution.x, resolution.y, 4, pixels.data(), 4*resolution.x);
70}
71
83(
85 int key,
86 int scancode,
87 int action,
88 int mods
89)
90{
92 {
93 closing = true;
94 }
95 jGL::parseAction(window, key, action);
96}
97
102struct Theme
103{
104 glm::vec4 background;
105 glm::vec4 text;
106};
107
114{
115 return
116 {
117 glm::vec4(5.0, 5.0, 5.0, 255.0)/255.0f,
118 glm::vec4(250.0, 250.0, 250.0, 255.0)/255.0f
119 };
120}
121
128{
129 return
130 {
131 glm::vec4(250.0, 250.0, 250.0, 255.0)/255.0f,
132 glm::vec4(5.0, 5.0, 5.0, 255.0)/255.0f
133 };
134}
135
148(
149 jGL::DesktopDisplay & display,
150 Camera & camera,
151 float zoomSpeed,
152 float rotateSpeed,
153 float inclineSpeed
154)
155{
156 if (display.keyHasAnyEvents(GLFW_KEY_W, {jGL::EventType::PRESS, jGL::EventType::HOLD}))
157 {
158 camera.zoom(-dr*zoomSpeed);
159 }
160 if (display.keyHasAnyEvents(GLFW_KEY_S, {jGL::EventType::PRESS, jGL::EventType::HOLD}))
161 {
162 camera.zoom(dr*zoomSpeed);
163 }
164 if (display.keyHasAnyEvents(GLFW_KEY_Q, {jGL::EventType::PRESS, jGL::EventType::HOLD}))
165 {
167 }
168 if (display.keyHasAnyEvents(GLFW_KEY_E, {jGL::EventType::PRESS, jGL::EventType::HOLD}))
169 {
170 camera.incline(-dtheta*inclineSpeed);
171 }
172 if (display.keyHasAnyEvents(GLFW_KEY_A, {jGL::EventType::PRESS, jGL::EventType::HOLD}))
173 {
174 camera.rotate(-dphi*rotateSpeed);
175 }
176 if (display.keyHasAnyEvents(GLFW_KEY_D, {jGL::EventType::PRESS, jGL::EventType::HOLD}))
177 {
178 camera.rotate(dphi*rotateSpeed);
179 }
180}
181
197(
198 jGL::DesktopDisplay & display,
199 std::vector<Atom> & atoms,
200 std::map<int, Element> & emphasisControls,
201 std::multimap<Element, uint64_t> & elementMap,
202 std::vector<float> & alphaOverrides,
203 float deemphasisAlpha,
204 float translateSpeed
205)
206{
207 bool elementsNeedUpdate = false;
208 if (display.keyHasEvent(GLFW_KEY_LEFT, jGL::EventType::PRESS) || display.keyHasEvent(GLFW_KEY_LEFT, jGL::EventType::HOLD))
209 {
210 translate(atoms, {-dr*translateSpeed, 0.0, 0.0});
211 elementsNeedUpdate = true;
212 }
213 if (display.keyHasEvent(GLFW_KEY_RIGHT, jGL::EventType::PRESS) || display.keyHasEvent(GLFW_KEY_RIGHT, jGL::EventType::HOLD))
214 {
215 translate(atoms, {dr*translateSpeed, 0.0, 0.0});
216 elementsNeedUpdate = true;
217 }
218 if (display.keyHasEvent(GLFW_KEY_PERIOD, jGL::EventType::PRESS) || display.keyHasEvent(GLFW_KEY_PERIOD, jGL::EventType::HOLD))
219 {
220 translate(atoms, {0.0, -dr*translateSpeed, 0.0});
221 elementsNeedUpdate = true;
222 }
223 if (display.keyHasEvent(GLFW_KEY_SLASH, jGL::EventType::PRESS) || display.keyHasEvent(GLFW_KEY_SLASH, jGL::EventType::HOLD))
224 {
225 translate(atoms, {0.0, dr*translateSpeed, 0.0});
226 elementsNeedUpdate = true;
227 }
228 if (display.keyHasEvent(GLFW_KEY_DOWN, jGL::EventType::PRESS) || display.keyHasEvent(GLFW_KEY_DOWN, jGL::EventType::HOLD))
229 {
230 translate(atoms, {0.0, 0.0, -dr*translateSpeed});
231 elementsNeedUpdate = true;
232 }
233 if (display.keyHasEvent(GLFW_KEY_UP, jGL::EventType::PRESS) || display.keyHasEvent(GLFW_KEY_UP, jGL::EventType::HOLD))
234 {
235 translate(atoms, {0.0, 0.0, dr*translateSpeed});
236 elementsNeedUpdate = true;
237 }
238
239 for (const auto & control : emphasisControls)
240 {
241 if (display.keyHasEvent(control.first, jGL::EventType::PRESS))
242 {
243 auto iter = elementMap.equal_range(control.second);
244 while (iter.first != iter.second)
245 {
246 float & alpha = alphaOverrides[iter.first->second];
247 alpha = (alpha == emphasisedAlpha ? deemphasisAlpha : emphasisedAlpha);
248 atoms[iter.first->second].colour.a = alpha;
249 iter.first++;
250 }
251 elementsNeedUpdate = true;
252 }
253 }
254
255 return elementsNeedUpdate;
256}
257
264void setAlpha(std::vector<Atom> & atoms, std::vector<float> alphas)
265{
266 for (uint64_t i = 0; i < atoms.size(); i++) { atoms[i].colour.a = alphas[i]; }
267}
268
278(
279 jGL::DesktopDisplay & display,
280 Camera & camera,
282 std::string progressMessage,
283 Theme theme,
284 const unsigned int resX,
285 const unsigned int resY,
286 bool hideInfo = false
287)
288{
289 double deltas[60];
290 double delta = 0;
291 unsigned frameId = 0;
292 auto tic = std::chrono::high_resolution_clock::now();
293
294 jGLInstance->beginFrame();
295 jGLInstance->setClear(theme.background);
296 jGLInstance->clear();
297
298 cameraControls(display, camera, 1.0f, 1.0f, 1.0f);
299
300 loadingAtoms.updateCamera(camera);
301 loadingAtoms.draw(true);
302
303 std::stringstream debugText;
304
305 if (!hideInfo)
306 {
307 jGLInstance->text(
309 glm::vec2(64.0f, resY-64.0f),
310 0.5f,
311 theme.text
312 );
313 }
314
315 jGLInstance->endFrame();
316 display.loop();
317
318 delta = 0.0;
319 for (int n = 0; n < 60; n++)
320 {
321 delta += deltas[n];
322 }
323 delta /= 60.0;
324 auto toc = std::chrono::high_resolution_clock::now();
325 deltas[frameId] = std::chrono::duration_cast<std::chrono::milliseconds>(toc-tic).count();
326 frameId = (frameId+1) % 60;
327}
328
334void backward(std::unique_ptr<Structure> & structure)
335{
336 uint64_t f = structure->framePosition();
337 if (f > 2) { f -= 2; }
338 else { f = structure->frameCount()-2+f;}
339 structure->readFrame(f);
340}
341
350(
351 const std::vector<Atom> & atoms,
354)
355{
356 for (const auto & atom : atoms)
357 {
358 if (atom.colour.a != 0.0 && atom.colour.a != 1.0)
359 {
360 atomRenderer.setTransparencySorting(true);
361 bondRenderer.setTransparencySorting(true);
362 return;
363 }
364 }
365 atomRenderer.setTransparencySorting(false);
366 bondRenderer.setTransparencySorting(false);
367}
368
374{
375 ImGuiIO& io = ImGui::GetIO();
377 io.Fonts->AddFontFromMemoryTTF(OpenDyslexicMono, sizeof(OpenDyslexicMono), 20.0);
378}
379
380#endif /* MAIN_H */
void translate(std::vector< Atom > &atoms, glm::vec3 r)
Definition atom.h:146
Render atoms as sphere meshes.
Definition atomRenderer.h:27
Render Bonds as ray-traced cylinders.
Definition bondRenderer.h:18
A 3D projective camera centered on a focus moving on a sphere.
Definition camera.h:30
void rotate(float increment)
Rotate about the y OpenGL axis.
Definition camera.h:137
void zoom(float increment)
Increment the zoom.
Definition camera.h:111
void incline(float increment)
Incline about the y OpenGL axis.
Definition camera.h:118
glm::vec< L, float, glm::qualifier::highp > vec
Definition commandLine.h:214
unsigned char OpenDyslexicMono[]
Definition font.h:2
bool closing
Definition main.h:44
void keyEventCallback(GLFWwindow *window, int key, int scancode, int action, int mods)
Override jGL default event callback.
Definition main.h:83
const float dr
Definition main.h:38
bool atomControls(jGL::DesktopDisplay &display, std::vector< Atom > &atoms, std::map< int, Element > &emphasisControls, std::multimap< Element, uint64_t > &elementMap, std::vector< float > &alphaOverrides, float deemphasisAlpha, float translateSpeed)
Controls for the Atoms position's.
Definition main.h:197
void loadingScreenFrame(jGL::DesktopDisplay &display, Camera &camera, AtomRenderer &loadingAtoms, std::string progressMessage, Theme theme, const unsigned int resX, const unsigned int resY, bool hideInfo=false)
Display a frame of the loading screen.
Definition main.h:278
void setAlpha(std::vector< Atom > &atoms, std::vector< float > alphas)
Set the alpha channel of Atom colours.
Definition main.h:264
void setTransparencySorting(const std::vector< Atom > &atoms, AtomRenderer &atomRenderer, BondRenderer &bondRenderer)
Enable of disable transparency sorting if there are transparent elements.
Definition main.h:350
const float dphi
Definition main.h:40
Theme lightTheme()
A light colour theme.
Definition main.h:127
void loadFonts()
Loads fonts for ImGui.
Definition main.h:373
const float dtheta
Definition main.h:39
std::unique_ptr< jGL::jGLInstance > jGLInstance
Definition main.h:46
void backward(std::unique_ptr< Structure > &structure)
Move back one frame.
Definition main.h:334
void cameraControls(jGL::DesktopDisplay &display, Camera &camera, float zoomSpeed, float rotateSpeed, float inclineSpeed)
Controls for the camera.
Definition main.h:148
void screenshot(glm::ivec2 resolution)
Obtain screen pixels and write to a png.
Definition main.h:54
const float emphasisedAlpha
Definition main.h:42
Theme darkTheme()
A dark colour theme.
Definition main.h:113
A background and text colour theme.
Definition main.h:103
glm::vec4 background
Definition main.h:104
glm::vec4 text
Definition main.h:105
std::string timeStamp()
Current timestamp.
Definition util.h:179