From 14a108c198c69f3c5a100b09f67743d515db4f99 Mon Sep 17 00:00:00 2001
From: "Garcia-Hernandez, Ruben Jesus (rgarcia)" <garcia@lrz.de>
Date: Mon, 11 Sep 2017 17:18:05 +0200
Subject: [PATCH] Haptic Feedback option (hapticfeedback) to indicate if
controller is touching an atom. Detect and indicate corrupt xyz file.
---
NOMADVRLib/ConfigFile.cpp | 4 ++
NOMADVRLib/ConfigFile.h | 2 +
NOMADVRLib/atoms.cpp | 18 ++++--
OpenVR/TimestepData/hellovr_opengl_main.cpp | 65 ++++++++++++++++-----
4 files changed, 71 insertions(+), 18 deletions(-)
diff --git a/NOMADVRLib/ConfigFile.cpp b/NOMADVRLib/ConfigFile.cpp
index 10ff95a..aa7d86c 100644
--- a/NOMADVRLib/ConfigFile.cpp
+++ b/NOMADVRLib/ConfigFile.cpp
@@ -46,6 +46,7 @@ Solid *solid;
bool saveStereo;
int screenshotdownscaling;
+bool hapticFeedback;
//markers such as hole positions and electron positions
float ** markers;
@@ -176,6 +177,7 @@ int loadConfigFile(const char * f)
voxelSize[i]=-1;
saveStereo=false;
screenshotdownscaling=1;
+ hapticFeedback=false;
//
FILE *F = fopen(f, "r");
if (F == 0)
@@ -472,6 +474,8 @@ int loadConfigFile(const char * f)
r= fscanf(F, "%d", &screenshotdownscaling);
if (r<1)
eprintf ("Error reading screenshotdownscaling value");
+ } else if (!strcmp (s, "hapticfeedback")) {
+ hapticFeedback=true;
} else if (!strcmp (s, "supercell")) {
r=fscanf (F, "%f %f %f", supercell, supercell+1, supercell+2);
} else if (!strcmp (s, "\x0d")) { //discard windows newline (problem in Sebastian Kokott's phone (?!)
diff --git a/NOMADVRLib/ConfigFile.h b/NOMADVRLib/ConfigFile.h
index 690d90a..cf3dae0 100644
--- a/NOMADVRLib/ConfigFile.h
+++ b/NOMADVRLib/ConfigFile.h
@@ -42,6 +42,8 @@ extern Solid *solid;
extern bool saveStereo;
extern int screenshotdownscaling;
+extern bool hapticFeedback;
+
//markers such as hole positions and electron positions
extern float ** markers;
extern float ** markercolours;
diff --git a/NOMADVRLib/atoms.cpp b/NOMADVRLib/atoms.cpp
index 8a8f1b6..f306f4f 100644
--- a/NOMADVRLib/atoms.cpp
+++ b/NOMADVRLib/atoms.cpp
@@ -202,9 +202,10 @@ int findAtom(const char *const s)
const char * readAtomsXYZErrors[] = {
"All Ok",//0
- "could not open file", //-1
- "error loading atom type and position line", //-2
- "atom type unknown", //-3
+ "Could not open file", //-1
+ "Error loading atom type and position line", //-2
+ "Atom type unknown", //-3
+ "Corrupt xyz file" //-4
};
int readAtomsXYZ(const char *const file, int **numatoms, int *timesteps, float ***pos)
@@ -220,10 +221,18 @@ int readAtomsXYZ(const char *const file, int **numatoms, int *timesteps, float *
return -1;
}
*timesteps=0;
+ int blanklines=0;
while (!feof(f)) {
r=fscanf(f, "%d", &mynumatoms);
- if (r<1)
+ if (r<1) {
+ blanklines++;
+ if (blanklines>3) {
+ eprintf("Corrupt xyz file %s. Error at %d atoms\n", file, mynumatoms);
+ return -4;
+ }
continue; //there may be a blank line at the end of the file
+ }
+ blanklines=0;
(*timesteps)++;
discardline (f);
//eprintf ("Getting atoms, mynumatoms=%d",mynumatoms);
@@ -245,6 +254,7 @@ int readAtomsXYZ(const char *const file, int **numatoms, int *timesteps, float *
//return -3;
}
(mypos.back())[4*i+3]=(float)a;
+ //RGH FIXME, add cloned atoms
}
}
diff --git a/OpenVR/TimestepData/hellovr_opengl_main.cpp b/OpenVR/TimestepData/hellovr_opengl_main.cpp
index 23ba728..87bc051 100644
--- a/OpenVR/TimestepData/hellovr_opengl_main.cpp
+++ b/OpenVR/TimestepData/hellovr_opengl_main.cpp
@@ -1077,8 +1077,10 @@ void CMainApplication::ProcessVREvent( const vr::VREvent_t & event )
void CMainApplication::HapticFeedback(){
- HapticFeedback(firstdevice);
- HapticFeedback(seconddevice);
+ if (hapticFeedback) {
+ HapticFeedback(firstdevice);
+ HapticFeedback(seconddevice);
+ }
}
//-----------------------------------------------------------------------------
// Purpose: Haptic feedback if controller near an atom
@@ -1092,19 +1094,53 @@ void CMainApplication::HapticFeedback(int device)
if (dp.bPoseIsValid) {
vr::HmdMatrix34_t mat=dp.mDeviceToAbsoluteTracking;
Vector3 controllerPos(mat.m[0][3], mat.m[1][3],mat.m[2][3]);
- for (int i=0;i<numAtoms[currentset];i++) {
- Vector3 posatom(atoms[currentset][i*4+0], atoms[currentset][i*4+1], atoms[currentset][i*4+2]);
- //remember rotation
+ int atomsInTimestep;
+ if (currentset==0)
+ atomsInTimestep=numAtoms[0];
+ else
+ atomsInTimestep=numAtoms[currentset]-numAtoms[currentset-1];
+ for (int i=0;i<atomsInTimestep;i++) {
+ float atomr=atomRadius(atoms[currentset][i*4+3]);
+
+ //Vector3 posatom(atoms[currentset][i*4+0], atoms[currentset][i*4+1], atoms[currentset][i*4+2]);
+ Vector3 posatom(atoms[currentset][i*4+0], atoms[currentset][i*4+2], atoms[currentset][i*4+1]); //y/z flipped
+ int p[3];
+ for (p[0]=0;p[0]<std::max(1,repetitions[0]);(p[0])++)
+ for (p[1]=0;p[1]<std::max(1,repetitions[1]);(p[1])++)
+ for (p[2]=0;p[2]<std::max(1,repetitions[2]);(p[2])++) {
+ float delta[3];
+ ::GetDisplacement(p, delta);
+ Vector3 iPos(delta[0], delta[1], delta[2]);
+
+ Vector3 up(-UserPosition.x, -UserPosition.y, UserPosition.z);
+ Vector3 pos=posatom-up+iPos;
+ pos=Vector3 (pos.x, pos.y, -pos.z);
+ float l=(pos - controllerPos).length();
+ if (l<atomr*atomScaling) {
+ m_pHMD->TriggerHapticPulse(device, 0, 3000);
+ return;
+ }
+ }
+ }
+ //now cloned atoms
+ if (currentset==0 && clonedAtoms) {
Vector3 up(-UserPosition.x, -UserPosition.y, UserPosition.z);
- Vector3 pos=posatom-up;
- pos.z=-pos.z;
- float l=(pos - controllerPos).length();
- if (l<0.2f) {
- m_pHMD->TriggerHapticPulse(device, 0, 3000);
- return;
+ for (int i=0;i<numClonedAtoms;i++) {
+ float atomr=atomRadius(clonedAtoms[currentset][i*4+3]);
+ Vector3 posatom(clonedAtoms[currentset][i*4+0], clonedAtoms[currentset][i*4+2], clonedAtoms[currentset][i*4+1]);
+ Vector3 pos=posatom-up;
+ pos.z=-pos.z;
+ float l=(pos - controllerPos).length();
+ if (l<atomr*atomScaling) {
+ m_pHMD->TriggerHapticPulse(device, 0, 3000);
+ return;
+ }
}
+
}
- }
+ } // pose is valid
+
+
}
}
@@ -1378,8 +1414,8 @@ void CMainApplication::SetupScene()
{
SetupIsosurfaces();
SetupAtoms();
- delete[] clonedAtoms;
- clonedAtoms=0;
+ //delete[] clonedAtoms; //required for haptic feedback
+ //clonedAtoms=0;
SetupUnitCell();
SetupMarker();
}
@@ -2314,6 +2350,7 @@ void CMainApplication::RenderScene(vr::Hmd_Eye nEye)
if (ISOS==0) {
RenderAtoms(nEye);
RenderUnitCell(nEye);
+ RenderAllTrackedRenderModels(nEye);
return;
}
--
GitLab