OpenVR: Near and far planes

GVR: userpos, animationspeed. Make sure atoms and volumetric match.
NomadVR: bondscolour, atomtrajectorycolour
parent 3bc9f83d
......@@ -56,7 +56,7 @@ void eprintf( const char *fmt, ... )
vsprintf( buffer, fmt, args );
va_end( args );
LOGD("Error in NOMADgvrT");
LOGD("Message in NOMADgvrT");
if (*fmt=='\0')
LOGD("Empty format");
LOGD("<%s>", buffer);
......@@ -66,6 +66,39 @@ void eprintf( const char *fmt, ... )
namespace {
gvr::Mat4f TranslationMatrix (float x, float y, float z)
{
gvr::Mat4f mvs;
mvs.m[0][0]=1;mvs.m[0][1]=0;mvs.m[0][2]=0; mvs.m[0][3]=x;
mvs.m[1][0]=0;mvs.m[1][1]=1;mvs.m[1][2]=0;mvs.m[1][3]=y;
mvs.m[2][0]=0;mvs.m[2][1]=0;mvs.m[2][2]=1; mvs.m[2][3]=z;
mvs.m[3][0]=0;mvs.m[3][1]=0;mvs.m[3][2]=0; mvs.m[3][3]=1;
return mvs;
}
gvr::Mat4f TranslationMatrix (float v[3])
{
return TranslationMatrix (v[0], v[1], v[2]);
}
gvr::Mat4f ScalingMatrix (float x, float y, float z)
{
gvr::Mat4f mvs;
mvs.m[0][0]=x;mvs.m[0][1]=0;mvs.m[0][2]=0; mvs.m[0][3]=0;
mvs.m[1][0]=0;mvs.m[1][1]=y;mvs.m[1][2]=0;mvs.m[1][3]=0;
mvs.m[2][0]=0;mvs.m[2][1]=0;mvs.m[2][2]=z; mvs.m[2][3]=0;
mvs.m[3][0]=0;mvs.m[3][1]=0;mvs.m[3][2]=0; mvs.m[3][3]=1;
return mvs;
}
gvr::Mat4f ScalingMatrix (float v[3])
{
return ScalingMatrix(v[0], v[1], v[2]);
}
//static const float kZNear = 1.0f;
//static const float kZFar = 100.0f;
static const float kZNear = 0.01f;
......@@ -343,6 +376,10 @@ void TreasureHuntRenderer::loadConfigFile(void)
LOGD("No atom glyph specified, using Icosahedron");
solid=new Solid(Solid::Type::Icosahedron);
}
for (int i=0;i<3;i++)
UserTranslation[i]=userpos[i];
// LOGD("UT=%f, %f, %f\n", UserTranslation[0], UserTranslation[1], UserTranslation[2]);
}
TreasureHuntRenderer::TreasureHuntRenderer(
......@@ -355,6 +392,8 @@ TreasureHuntRenderer::TreasureHuntRenderer(
loadConfigFile();
//eprintf("after config load, timesteps=%d", TIMESTEPS);
ResumeControllerApiAsNeeded();
if (gvr_viewer_type_ == GVR_VIEWER_TYPE_CARDBOARD) {
LOGD("Viewer type: CARDBOARD");
......@@ -506,26 +545,43 @@ glGenTextures(2+ZLAYERS, textDepthPeeling);
for (int p = 0; p < TIMESTEPS*ISOS; p++) {
sprintf(tmpname, "%s%d-%s.ply", PATH, timestep,
plyfiles[p % ISOS]);
gvr::Mat4f trans, matFinal;
gvr::Mat4f trans;
gvr::Mat4f matFinal, matcubetrans, mvs, sc, sctrans;
//rotateX(-90)
if (voxelSize[0]!=-1) {
mvs=ScalingMatrix(scaling/(float)voxelSize[0], scaling/(float)voxelSize[1],
scaling/(float)voxelSize[2]);
matcubetrans=TranslationMatrix(cubetrans);
gvr::Mat4f abcm {abc[0][0], abc[0][1], abc[0][2], 0,
abc[1][0], abc[1][1], abc[1][2], 0,
abc[2][0], abc[2][1], abc[2][2], 0,
0, 0, 0, 1};
sc=ScalingMatrix(supercell);
sctrans=TranslationMatrix(-translations[p%ISOS][2],
-translations[p%ISOS][1], -translations[p%ISOS][0]);
matFinal = MatrixMul(abcm,sctrans);
matFinal=MatrixMul(matFinal,sc);
matFinal=MatrixMul(matFinal,mvs);
} else {
trans.m[0][0]=1;trans.m[0][1]=0;trans.m[0][2]=0; trans.m[0][3]=0;
trans.m[1][0]=0;trans.m[1][1]=0;trans.m[1][2]=1;trans.m[1][3]=0;
trans.m[2][0]=0;trans.m[2][1]=-1;trans.m[2][2]=0; trans.m[2][3]=0;
trans.m[3][0]=0;trans.m[3][1]=0;trans.m[3][2]=0; trans.m[3][3]=1;
for (int i=0;i<4;i++)
for(int j=0;j<4;j++)
for(int j=0;j<4;j++)
matFinal.m[i][j]=(i==j);
for (int i=0;i<3;i++)
matFinal.m[i][3]=translations[p%ISOS][i];
matFinal=MatrixMul(trans, matFinal);
trans.m[0][0]=0.2;trans.m[0][1]=0;trans.m[0][2]=0; trans.m[0][3]=0;
trans.m[1][0]=0;trans.m[1][1]=0.2;trans.m[1][2]=0;trans.m[1][3]=0;
trans.m[2][0]=0;trans.m[2][1]=0;trans.m[2][2]=0.2; trans.m[2][3]=0;
trans.m[0][0]=scaling;trans.m[0][1]=0;trans.m[0][2]=0; trans.m[0][3]=0;
trans.m[1][0]=0;trans.m[1][1]=scaling;trans.m[1][2]=0;trans.m[1][3]=0;
trans.m[2][0]=0;trans.m[2][1]=0;trans.m[2][2]=scaling; trans.m[2][3]=0;
trans.m[3][0]=0;trans.m[3][1]=0;trans.m[3][2]=0; trans.m[3][3]=1;
matFinal=MatrixMul(trans, matFinal);
}
float mat[16];
for (int i=0;i<4;i++)
for (int j=0;j<4;j++)
......@@ -613,7 +669,17 @@ void TreasureHuntRenderer::DrawFrame() {
}
// if (animateTimesteps) {
currentSet++;
if (animationspeed>1)
currentSet+=animationspeed;
else {
static float current=0;
current+=animationspeed;
if (current>1) {
currentSet++;
current=0;
}
}
if (currentSet>TIMESTEPS-1)
currentSet=0;
// }
......@@ -638,9 +704,13 @@ if (animateTimesteps) {
float il=1.0/sqrtf(dir2[0]*dir2[0]+dir2[1]*dir2[1]+dir2[2]*dir2[2]);
//dir2[2]=-dir2[2];
for (int i=0;i<3;i++)
UserTranslation[i]+=dir2[i]*il*speed;
UserTranslation[i]+=dir2[i]*il*speed*movementspeed;
}
LOGD("UT=%f, %f, %f\n", UserTranslation[0], UserTranslation[1], UserTranslation[2]);
LOGD("MovementSpeed=%f\n", movementspeed);
gvr::Mat4f left_eye_matrix = gvr_api_->GetEyeFromHeadMatrix(GVR_LEFT_EYE);
gvr::Mat4f right_eye_matrix = gvr_api_->GetEyeFromHeadMatrix(GVR_RIGHT_EYE);
gvr::Mat4f left_eye_view = MatrixMul(left_eye_matrix, head_view_);
......@@ -813,53 +883,26 @@ if (curDataPos!=ISOS) {
glBindVertexArray(ISOVAO[currentSet*ISOS+curDataPos]);
if ((e = glGetError()) != GL_NO_ERROR)
eprintf("3 Gl error RenderIsos timestep =%d: %d\n", currentSet, e);
eprintf ("Drawing %d vertices, isos", numISOIndices[currentSet*ISOS+curDataPos]);
//eprintf ("Drawing %d vertices, isos", numISOIndices[currentSet*ISOS+curDataPos]);
glDrawElements(GL_TRIANGLES,numISOIndices[currentSet*ISOS+curDataPos] , GL_UNSIGNED_INT, 0);
if ((e = glGetError()) != GL_NO_ERROR)
eprintf("4 Gl error RenderIsos timestep =%d: %d\n", currentSet, e);
} else {
//transparency; FIXME disabled as I get 1fps, with screen in 4 columns and z-check is incorrect
/*
glDisable(GL_BLEND);
glDepthMask(GL_TRUE);
//do depth peeling
CleanDepthTexture(textDepthPeeling[0], render_size_.width, render_size_.height);
GLint dfb;
glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &dfb);
if ((e = glGetError()) != GL_NO_ERROR)
eprintf("Gl error RenderIsos, before zl loop: %d\n", e);
for (int zl = 0; zl < ZLAYERS; zl++) {
EnableDepthFB(zl, TransP,
peelingFramebuffer, textDepthPeeling);
glUniformMatrix4fv(TransMatrixLoc, 1, GL_FALSE, t);
for (int i=0;i<ISOS;i++) {
glBindVertexArray(ISOVAO[currentSet*ISOS+i]);
glDrawElements(GL_TRIANGLES,numISOIndices[currentSet*ISOS+i] , GL_UNSIGNED_INT, 0);
}
}
glUseProgram(BlendP);
glBindFramebuffer(GL_FRAMEBUFFER, dfb);
glBindVertexArray(BlendVAO);
if ((e = glGetError()) != GL_NO_ERROR)
eprintf("Gl error RenderIsos, after glBindVertexArray: %d\n", e);
BlendTextures(textDepthPeeling, ZLAYERS);
glBindVertexArray(0);
if ((e = glGetError()) != GL_NO_ERROR)
eprintf("Gl error RenderIsos, after BlendTextures: %d\n", e);*/
/* no transparency*/
/*transparency*/
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glDepthMask(GL_FALSE);
for (int i=0;i<ISOS;i++) {
glBindVertexArray(ISOVAO[currentSet*ISOS+i]);
if ((e = glGetError()) != GL_NO_ERROR)
eprintf("5 Gl error RenderIsos timestep =%d: %d\n", currentSet, e);
eprintf ("Drawing %d vertices, isos", numISOIndices[currentSet*ISOS+i]);
if ((e = glGetError()) != GL_NO_ERROR)
eprintf("5 Gl error RenderIsos timestep =%d: %d\n", currentSet, e);
//eprintf ("Drawing %d vertices, isos", numISOIndices[currentSet*ISOS+i]);
glDrawElements(GL_TRIANGLES,numISOIndices[currentSet*ISOS+i] , GL_UNSIGNED_INT, 0);
if ((e = glGetError()) != GL_NO_ERROR)
eprintf("6 Gl error RenderIsos timestep =%d: %d\n", currentSet, e);
if ((e = glGetError()) != GL_NO_ERROR)
eprintf("6 Gl error RenderIsos timestep =%d: %d\n", currentSet, e);
}
glDisable(GL_BLEND);
glDepthMask(GL_TRUE);
} //if (curDataPos!=ISOS)
//eprintf ("end of RenderIsos");
glBindVertexArray(0);
......@@ -962,15 +1005,14 @@ void TreasureHuntRenderer::RenderAtoms(const float *m) //m[16]
} // no tess
}
void TreasureHuntRenderer::RenderAtomTrajectories(const gvr::Mat4f eyeViewProjection)
{
int e;
if (!numAtoms)
return;
gvr::Mat4f trans={1,0,0,UserTranslation[0],
0,1,0,UserTranslation[1],
0,0,1,UserTranslation[2],
0,0,0,1};
gvr::Mat4f trans=TranslationMatrix (UserTranslation);
//trans.translate(iPos).rotateX(-90).translate(UserPosition);
gvr::Mat4f transform = MatrixMul(eyeViewProjection,trans);
......
......@@ -28,6 +28,9 @@ std::vector<float> *clonedAtoms;
std::vector<int> bonds;
int *numBonds;
bool displaybonds;
float bondscolours[4];
float atomtrajectorycolour[4];
int numClonedAtoms;
int *basisvectorreps;
......@@ -40,6 +43,8 @@ bool has_abc = false;
bool displayunitcell;
float supercell[3];
int voxelSize[3];
float unitcellcolour[4];
float supercellcolour[4];
int repetitions[3];
Solid *solid;
......@@ -48,6 +53,10 @@ bool saveStereo;
int screenshotdownscaling;
bool hapticFeedback;
bool showcontrollers;
bool gazenavigation;
int transparencyquality;
float nearclip, farclip;
//markers such as hole positions and electron positions
float ** markers;
......@@ -135,14 +144,9 @@ while (*file!='\0') {
}
}
int loadConfigFile(const char * f)
void initState()
{
//default values
//eprintf ("load config file start");
bool nonperiodic=false;
char base_url[1024]="http://enc-testing-nomad.esc.rzg.mpg.de/v1.0/materials/";
char material[1024]="";
BACKGROUND[0] = 0.95f;
BACKGROUND[0] = 0.95f;
BACKGROUND[1] = 0.95f;
BACKGROUND[2] = 0.95f;
SCREENSHOT="C:\\temp\\frame";
......@@ -166,7 +170,7 @@ int loadConfigFile(const char * f)
for (int i=0;i<3;i++)
supercell[i] = 1;
solid=0;
char *token=0;
markers=nullptr;
markercolours=nullptr;
displayunitcell=false;
......@@ -181,7 +185,42 @@ int loadConfigFile(const char * f)
screenshotdownscaling=1;
hapticFeedback=false;
showcontrollers=false;
gazenavigation=false;
inv_abc_init=false;
transparencyquality=12;
nearclip=0.2f;
farclip=200.f;
for (int i=0;i<4;i++)
unitcellcolour[i]=1.0f;
supercellcolour[0]=0.0f;
supercellcolour[1]=1.0f;
supercellcolour[2]=1.0f;
supercellcolour[3]=1.0f;
bondscolours[0]=0.5f;
bondscolours[1]=0.5f;
bondscolours[2]=1.0f;
bondscolours[3]=1.0f;
atomtrajectorycolour[0]=1.0f;
atomtrajectorycolour[1]=0.0f;
atomtrajectorycolour[2]=0.0f;
atomtrajectorycolour[3]=1.0f;
}
int loadConfigFile(const char * f)
{
//default values
//eprintf ("load config file start");
bool nonperiodic=false;
char base_url[1024]="http://enc-testing-nomad.esc.rzg.mpg.de/v1.0/materials/";
char material[1024]="";
initState();
char *token=0;
//
FILE *F = fopen(f, "r");
if (F == 0)
......@@ -499,11 +538,39 @@ int loadConfigFile(const char * f)
hapticFeedback=true;
} else if (!strcmp (s, "supercell")) {
r=fscanf (F, "%f %f %f", supercell, supercell+1, supercell+2);
if (r<3)
eprintf ("Error reading supercell value");
} else if (!strcmp (s, "showcontrollers")) {
showcontrollers=true;
} else if (!strcmp (s, "\x0d")) { //discard windows newline (problem in Sebastian Kokott's phone (?!)
} else if (!strcmp (s, "gazenavigation")) {
gazenavigation=true;
}else if (!strcmp (s, "\x0d")) { //discard windows newline (problem in Sebastian Kokott's phone (?!)
continue;
} else {
} else if (!strcmp (s, "transparencyquality")) {
r=fscanf (F, "%d", &transparencyquality);
if (r<1)
eprintf ("Error reading transparencyquality value");
} else if (!strcmp (s, "clippingplanes")) {
r=fscanf (F, "%f %f", &nearclip, &farclip);
if (r<2)
eprintf ("Error reading clippingplanes values");
}else if (!strcmp (s, "bondscolour")) {
r=fscanf (F, "%f %f %f", bondscolours, bondscolours+1, bondscolours+2);
if (r<3)
eprintf ("Error reading bondscolour value");
}else if (!strcmp (s, "unitcellcolour")) {
r=fscanf (F, "%f %f %f", unitcellcolour, unitcellcolour+1, unitcellcolour+2);
if (r<3)
eprintf ("Error reading unitcellcolour value");
}else if (!strcmp (s, "supercellcolour")) {
r=fscanf (F, "%f %f %f", supercellcolour, supercellcolour+1, supercellcolour+2);
if (r<3)
eprintf ("Error reading supercellcolour value");
}else if (!strcmp (s, "atomtrajectorycolour")) {
r=fscanf (F, "%f %f %f", atomtrajectorycolour, atomtrajectorycolour+1, atomtrajectorycolour+2);
if (r<3)
eprintf ("Error reading atomtrajectorycolour value");
}else {
eprintf( "Unrecognized parameter %s\n", s);
for (int i=0;i<strlen(s);i++)
eprintf ("<%d>", s[i]);
......
......@@ -22,6 +22,9 @@ extern std::vector<float> *clonedAtoms;
extern std::vector<int> bonds;
extern int *numBonds;
extern bool displaybonds;
extern float bondscolours[4];
extern float atomtrajectorycolour[4];
extern int numClonedAtoms;
extern int *basisvectorreps;
......@@ -34,6 +37,8 @@ extern bool has_abc;
extern bool displayunitcell;
extern float supercell[3];
extern float markerscaling;
extern float unitcellcolour[4];
extern float supercellcolour[4];
extern int repetitions[3];
......@@ -44,6 +49,10 @@ extern int screenshotdownscaling;
extern bool hapticFeedback;
extern bool showcontrollers;
extern bool gazenavigation;
extern int transparencyquality;
extern float nearclip, farclip;
//markers such as hole positions and electron positions
extern float ** markers;
......
......@@ -55,7 +55,7 @@
//#define PATH "C:\\Users\\mobile\\Desktop\\openvrDemos\\win64\\data\\CO2-CaO-B\\"
#endif
*/
#define ZLAYERS 12
#define ZLAYERS transparencyquality
......@@ -207,9 +207,6 @@ private: // OpenGL bookkeeping
int m_iSceneVolumeInit; // if you want something other than the default 20x20x20
float m_fNearClip;
float m_fFarClip;
void SaveScreenshot (char *name);
GLuint *m_iTexture; //[3+ZLAYERS+1] // white, depth1, depth2, color[ZLAYERS], atomtexture
......@@ -347,7 +344,7 @@ void eprintf( const char *fmt, ... )
if (numerrors==25) {
MessageBoxA(0, "Max messages reached, no further reporting", "Warning", 0);
}
if (numerrors>15) {
if (numerrors>25) {
return;
}
va_list args;
......@@ -592,13 +589,10 @@ bool CMainApplication::BInit()
m_iSceneVolumeHeight = m_iSceneVolumeInit;
m_iSceneVolumeDepth = m_iSceneVolumeInit;
m_fScale = 0.04f; //0.15f; //rgh: original too big for room
//m_fScale = 0.04f; //0.15f; //rgh: original too big for room
m_fScale=scaling;
m_fScaleSpacing = 4.0f;
m_fNearClip = 0.2f;
m_fFarClip = 200.0f;//rgh: original 30 too small for our skymap
// m_MillisecondsTimer.start(1, this);
// m_SecondsTimer.start(1000, this);
......@@ -996,8 +990,16 @@ bool CMainApplication::HandleInput()
else if (unDevice !=firstdevice && seconddevice==-1)
seconddevice=unDevice;
if (unDevice == firstdevice) {
Matrix4 tmp = m_mat4HMDPose;
UserPosition += tmp.invert()*Vector3(0, 0, speed);
if (gazenavigation) {
Matrix4 tmp = m_mat4HMDPose;
UserPosition += tmp.invert()*Vector3(0, 0, speed);
} else {
//vr::VRControllerState_t cs;
//vr::TrackedDevicePose_t dp;
//m_pHMD->GetControllerStateWithPose( vr::TrackingUniverseStanding, firstdevice, &cs, &dp );
const Matrix4 tmp = m_rmat4DevicePose[firstdevice];
UserPosition += tmp*Vector3(0, 0, speed);
}
}
else {
float newtime = videospeed*float(SDL_GetTicks());;
......@@ -2160,8 +2162,8 @@ void CMainApplication::RenderUnitCell(const vr::Hmd_Eye &nEye)
glUniformMatrix4fv(m_nUnitCellMatrixLocation, 1, GL_FALSE, transform.get());
if ((e = glGetError()) != GL_NO_ERROR)
dprintf("Gl error after glUniform4fv 1 RenderUnitCell: %d, %s\n", e, gluErrorString(e));
const float color[4]={1,1,1,1};
glUniform4fv(m_nUnitCellColourLocation, 1, color);
glUniform4fv(m_nUnitCellColourLocation, 1, unitcellcolour);
if ((e = glGetError()) != GL_NO_ERROR)
dprintf("Gl error after glUniform4fv 2 RenderUnitCell: %d, %s\n", e, gluErrorString(e));
glDrawElements(GL_LINES, 24, GL_UNSIGNED_INT, 0);
......@@ -2179,8 +2181,7 @@ void CMainApplication::RenderUnitCell(const vr::Hmd_Eye &nEye)
glUniformMatrix4fv(m_nUnitCellMatrixLocation, 1, GL_FALSE, transform.get());
if ((e = glGetError()) != GL_NO_ERROR)
dprintf("Gl error after glUniform4fv 1 RenderUnitCell, supercell: %d, %s\n", e, gluErrorString(e));
const float colorsc[4]={0,1,1,1};
glUniform4fv(m_nUnitCellColourLocation, 1, colorsc);
glUniform4fv(m_nUnitCellColourLocation, 1, supercellcolour);
glDrawElements(GL_LINES, 24, GL_UNSIGNED_INT, (void*) (24 *sizeof(int)));
glDisable(GL_LINE_SMOOTH);
glBindVertexArray(0);
......@@ -2240,8 +2241,7 @@ if (numBonds && displaybonds && showAtoms) {
glBindVertexArray(m_unAtomVAO[2]);
glUseProgram(m_unUnitCellProgramID);
glUniformMatrix4fv(m_nUnitCellMatrixLocation, 1, GL_FALSE, transform.get());
float color[4]={0.5,0.5,1,1};
glUniform4fv(m_nUnitCellColourLocation, 1, color);
glUniform4fv(m_nUnitCellColourLocation, 1, bondscolours);
if (currentset==0||fixedAtoms)
glDrawElements(GL_LINES, numBonds[0], GL_UNSIGNED_INT, (void*)0);
else
......@@ -2282,8 +2282,8 @@ for (int i = 0; i < atomtrajectories.size(); i++) {
glBindVertexArray(m_unAtomVAO[3]);
glUseProgram(m_unUnitCellProgramID);
glUniformMatrix4fv(m_nUnitCellMatrixLocation, 1, GL_FALSE, transform.get());
float color2[4]={1,0,0,1};
glUniform4fv(m_nUnitCellColourLocation, 1, color2);
glUniform4fv(m_nUnitCellColourLocation, 1, atomtrajectorycolour);
if ((e = glGetError()) != GL_NO_ERROR)
dprintf("Gl error after glUniform4fv 2 RenderUnitCell: %d, %s\n", e, gluErrorString(e));
......@@ -2419,7 +2419,7 @@ void CMainApplication::RenderScene(vr::Hmd_Eye nEye)
dprintf("Gl error after zlayer: %d, %s\n", e, gluErrorString(e));
glDisable(GL_CULL_FACE);
float z = 0.0f; //(m_fNearClip + m_fFarClip) / 2.0f;
float z = 0.0f;
const float points[] = {
-1, -1, z, 1, 0, 0, -1, 0, 0,
-1, 1, z, 1, 0, 0, -1, 0, 1,
......@@ -2567,7 +2567,7 @@ Matrix4 CMainApplication::GetHMDMatrixProjectionEye( vr::Hmd_Eye nEye )
if ( !m_pHMD )
return Matrix4();
vr::HmdMatrix44_t mat = m_pHMD->GetProjectionMatrix( nEye, m_fNearClip, m_fFarClip, vr::API_OpenGL);
vr::HmdMatrix44_t mat = m_pHMD->GetProjectionMatrix( nEye, nearclip, farclip, vr::API_OpenGL);
return Matrix4(
mat.m[0][0], mat.m[1][0], mat.m[2][0], mat.m[3][0],
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment