diff --git a/GoogleCardboardAndroid/NOMADgvrT/src/main/java/com/google/vr/ndk/samples/treasurehunt/MainActivity.java b/GoogleCardboardAndroid/NOMADgvrT/src/main/java/com/google/vr/ndk/samples/treasurehunt/MainActivity.java index 242e7523e58bf3b2687010ec6a231f5f7106df27..7a3618993e34022bca11e65c9c4d1caef1dcfdd3 100644 --- a/GoogleCardboardAndroid/NOMADgvrT/src/main/java/com/google/vr/ndk/samples/treasurehunt/MainActivity.java +++ b/GoogleCardboardAndroid/NOMADgvrT/src/main/java/com/google/vr/ndk/samples/treasurehunt/MainActivity.java @@ -84,18 +84,22 @@ public static void verifyStoragePermissions(Activity activity) { super.onCreate(savedInstanceState); verifyStoragePermissions(this); + String externalsd=android.os.Environment.getExternalStorageDirectory().getPath() + "/"; //intents android.content.Intent intent = getIntent(); String s=intent.getDataString(); - String uriString="/data/local/tmp/material.ncfg"; - + String uriString=externalsd+"material.ncfg"; + if (s==null) + android.util.Log.d("NOMADgvrT","String intent is null"); + else + android.util.Log.d("NOMADgvrT","String intent is <"+ s+">"); if (s!=null) { if (s.startsWith("content://")) { try { java.io.InputStream input = getContentResolver().openInputStream(intent.getData()); byte[] buffer = new byte[8 * 1024]; - java.io.FileOutputStream output = new java.io.FileOutputStream("/data/local/tmp/material.ncfg"); + java.io.FileOutputStream output = new java.io.FileOutputStream(uriString); try{ int bytesRead; while((bytesRead = input.read()) != -1){ @@ -106,24 +110,29 @@ public static void verifyStoragePermissions(Activity activity) { output.close(); } catch (Exception e) { uriString=null; + android.util.Log.d("NOMADgvrT","Exception closing output stream"); } try { input.close(); } catch (java.io.IOException e) { uriString=null; + android.util.Log.d("NOMADgvrT","Exception closing input stream"); } } } catch (java.io.IOException e) { uriString=null; + android.util.Log.d("NOMADgvrT","Exception saving intent to disk"); } if (uriString!=null) - nativeSetConfigFile(uriString); + nativeSetConfigFile(uriString, externalsd); } else if (s.startsWith("file://")) { uriString=s.substring(7); - nativeSetConfigFile(uriString); + nativeSetConfigFile(uriString, externalsd); } else { android.util.Log.d("NOMADgvrT","Unknown protocol in intent:"+ s); } + } else { //use default + nativeSetConfigFile(externalsd+"Default.ncfg", externalsd); } // Ensure fullscreen immersion. @@ -277,5 +286,5 @@ public static void verifyStoragePermissions(Activity activity) { private native void nativeOnResume(long nativeTreasureHuntRenderer); - private native void nativeSetConfigFile(String s); + private native void nativeSetConfigFile(String s, String e); } diff --git a/GoogleCardboardAndroid/NOMADgvrT/src/main/jni/treasure_hunt_jni.cc b/GoogleCardboardAndroid/NOMADgvrT/src/main/jni/treasure_hunt_jni.cc index cd4c16d27f2c7e71be7b6e6bcd6f70943b2433ad..dbbf30fbdb841cf73cc473930ccd1f3ce85c5f6e 100644 --- a/GoogleCardboardAndroid/NOMADgvrT/src/main/jni/treasure_hunt_jni.cc +++ b/GoogleCardboardAndroid/NOMADgvrT/src/main/jni/treasure_hunt_jni.cc @@ -21,6 +21,7 @@ #include "treasure_hunt_renderer.h" // NOLINT #include "vr/gvr/capi/include/gvr.h" #include "vr/gvr/capi/include/gvr_audio.h" +#include "NOMADVRLib/atoms.hpp" //for TMPDIR #define JNI_METHOD(return_type, method_name) \ JNIEXPORT return_type JNICALL \ @@ -82,8 +83,9 @@ JNI_METHOD(void, nativeOnResume) } JNI_METHOD(void, nativeSetConfigFile) -(JNIEnv *env, jobject obj, jstring s) { +(JNIEnv *env, jobject obj, jstring s, jstring e) { configPath = env->GetStringUTFChars(s , NULL ) ; + TMPDIR=env->GetStringUTFChars(e , NULL ) ; } diff --git a/GoogleCardboardAndroid/NOMADgvrT/src/main/jni/treasure_hunt_renderer.cc b/GoogleCardboardAndroid/NOMADgvrT/src/main/jni/treasure_hunt_renderer.cc index 0f24f8af3486edf1595efd7196d1b88e4a44b9a0..eeaa770a2f9c77cf10082786e750f9d1571142ac 100644 --- a/GoogleCardboardAndroid/NOMADgvrT/src/main/jni/treasure_hunt_renderer.cc +++ b/GoogleCardboardAndroid/NOMADgvrT/src/main/jni/treasure_hunt_renderer.cc @@ -312,31 +312,32 @@ TreasureHuntRenderer::TreasureHuntRenderer( gvr_controller_api_(nullptr), gvr_viewer_type_(gvr_api_->GetViewerType()) { - eprintf ("configPath=%d", configPath); if (configPath!=nullptr) eprintf ("configPath=<%s>", configPath); + else + eprintf ("configPath is null"); - const char *configfile="/storage/emulated/0/Oculus/NOMAD/ViveTDefault.ncfg"; - //change cwd so that relative paths work - if (configPath!=nullptr) - configfile=configPath; - std::string s(configfile); + if (TMPDIR!=nullptr) + eprintf ("TMPDIR=<%s>", TMPDIR); + else + eprintf ("TMPDIR is null"); + + std::string s(configPath); chdir(s.substr(0, s.find_last_of("\\/")).c_str()); - int r; - if ((r=loadConfigFile(configfile))<0) { - if (-100<r) { - eprintf(loadConfigFileErrors[-r]); + if ((error=loadConfigFile(configPath))<0) { + if (-100<error) { + eprintf(loadConfigFileErrors[-error]); eprintf("Config file reading error"); - } else if (-200<r){ - eprintf(readAtomsXYZErrors[-r-100]); + } else if (-200<error){ + eprintf(readAtomsXYZErrors[-error-100]); eprintf("XYZ file reading error"); - } else if (-300<r) { - eprintf(readAtomsCubeErrors[-r-200]); + } else if (-300<error) { + eprintf(readAtomsCubeErrors[-error-200]); eprintf("Cube file reading error"); } else { - eprintf(readAtomsJsonErrors[-r-300]); + eprintf(readAtomsJsonErrors[-error-300]); eprintf("Json reading error"); } } @@ -365,6 +366,12 @@ TreasureHuntRenderer::~TreasureHuntRenderer() { glDeleteTextures(2, textures); } +const char * ErrorsGL[] = { + "Failure compiling Unit Cell Shader", //-401 + "Failure compiling Atom Shader NoTess", //-402; + +}; + void TreasureHuntRenderer::InitializeGl() { gvr_api_->InitializeGl(); @@ -382,35 +389,46 @@ glGenTextures(2, textures); //Leave atoms until we check if android 7 has gles 3.2 or if we use the old icosahedron method with no tesselation if (!PrepareUnitCellShader (&UnitCellP, &UnitCellMatrixLoc, &UnitCellColourLoc)) { eprintf("OneTimeInit, failure compiling Unit Cell Shader"); + error=-401; return ; } //rgh: for now, we don't have any tess-ready phones //if (!PrepareAtomShader(&AtomsP, &AtomMatrixLoc)) { hasTess=false; - if (!PrepareAtomShaderNoTess(&AtomsP, &AtomMatrixLoc)) + if (!PrepareAtomShaderNoTess(&AtomsP, &AtomMatrixLoc)) { + error=-402; eprintf ("PrepareAtomShaderNoTess failed"); + } //}; //atom texture int e; e=atomTexture(textures[1]); - if (e!=GL_NO_ERROR) + if (e!=GL_NO_ERROR) { eprintf ("atomTexture error %d", e); + error=-403; + } e=SetupAtoms(&AtomTVAO, &AtomTBuffer); - if (e!=GL_NO_ERROR) + if (e!=GL_NO_ERROR) { eprintf ("SetupAtoms error %d", e); + error=-404; + } if (!hasTess) e=SetupAtomsNoTess(&AtomVAO, &AtomBuffer, &AtomIndices); - if (e!=GL_NO_ERROR) + if (e!=GL_NO_ERROR) { eprintf ("SetupAtomsNoTess error %d, tess=%d", e, hasTess); + error=-405; + } e=SetupUnitCell(&UnitCellVAO, &UnitCellBuffer, &UnitCellIndexBuffer); - if (e!=GL_NO_ERROR) + if (e!=GL_NO_ERROR) { eprintf ("SetupUnitCell error %d", e); + error=-406; + } // Because we are using 2X MSAA, we can render to half as many pixels and // achieve similar quality. @@ -525,7 +543,23 @@ if (animateTimesteps) { // Draw the world. frame.BindBuffer(0); - glClearColor(0.1f, 0.1f, 0.1f, 0.5f); // Dark background so text shows up. + if (error<0) { + if (-100<error) { + glClearColor(1.f, 0.f, 0.f, 1.f); + } else if (-200<error){ + glClearColor(0.f, 1.f, 0.f, 1.f); + } else if (-300<error) { + glClearColor(0.f, 0.f, 1.f, 1.f); + } else if (-400<error) { + glClearColor(0.f, 1.f, 1.f, 1.f); + } else { + glClearColor(1.f, 0.f, 1.f, 1.f); + } + } else { + glClearColor(BACKGROUND[0], BACKGROUND[1], BACKGROUND[2], 0.5f); + } + + // Dark background so text shows up. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); viewport_list_->GetBufferViewport(0, &scratch_viewport_); DrawWorld(left_eye_view, scratch_viewport_); @@ -623,7 +657,14 @@ void TreasureHuntRenderer::DrawWorld(const gvr::Mat4f& view_matrix, glDisable(GL_CULL_FACE); modelview_=view_matrix; modelview_projection_cube_ = MatrixMul(perspective, modelview_); -RenderUnitCell(modelview_projection_cube_); +if(error) + return; +if (has_abc) { + RenderUnitCell(modelview_projection_cube_); +} else { + //atom trajectories + RenderAtomTrajectories(modelview_projection_cube_); +} } @@ -724,6 +765,31 @@ 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}; + +//trans.translate(iPos).rotateX(-90).translate(UserPosition); +gvr::Mat4f transform = MatrixMul(eyeViewProjection,trans); +//gvr::Mat4f transform=eyeViewProjection; +float t[16]; +for (int i=0;i<4;i++) + for (int j=0;j<4;j++) + t[j*4+i]=transform.m[i][j]; +glUseProgram(UnitCellP); +glUniformMatrix4fv(UnitCellMatrixLoc, 1, GL_FALSE, t); +if ((e = glGetError()) != GL_NO_ERROR) + eprintf("Gl error after glUniform4fv 1 RenderAtomTrajectories: %d\n", e); +RenderAtomTrajectoriesUnitCell(); +RenderAtoms(t); +} + void TreasureHuntRenderer::RenderAtomTrajectoriesUnitCell() { //now trajectories @@ -743,7 +809,7 @@ glBindVertexArray(AtomTVAO[0]); float color[4]={1,0,0,1}; glUniform4fv(UnitCellColourLoc, 1, color); if ((e = glGetError()) != GL_NO_ERROR) - eprintf("Gl error after glUniform4fv 2 RenderUnitCell: %d\n", e); + eprintf("Gl error after glUniform4fv 2 RenderAtomTrajectoriesUnitCell: %d\n", e); //glEnableVertexAttribArray(0); //glDisableVertexAttribArray(1); @@ -776,13 +842,10 @@ for (unsigned int i=0;i<atomtrajectories.size();i++) { void TreasureHuntRenderer::RenderUnitCell(const gvr::Mat4f eyeViewProjection) { - eprintf ("eyeViewProjection"); - for (int i=0;i<4;i++) - for (int j=0;j<4;j++) - eprintf ("%d %d = %f", i, j, eyeViewProjection.m[i][j]); - //repetitions[0]=10; - //repetitions[1]=10; - //repetitions[2]=10; + //eprintf ("eyeViewProjection"); + //for (int i=0;i<4;i++) + // for (int j=0;j<4;j++) + // eprintf ("%d %d = %f", i, j, eyeViewProjection.m[i][j]); eprintf ("RenderUnitCell, has_abc=%d", has_abc); if (!has_abc) return; diff --git a/GoogleCardboardAndroid/NOMADgvrT/src/main/jni/treasure_hunt_renderer.h b/GoogleCardboardAndroid/NOMADgvrT/src/main/jni/treasure_hunt_renderer.h index e9fc24f13d46bfb857d6c885c1606a41b0f03169..9d4300f3a28038bb3b6a255156ae51ae8bb5632f 100644 --- a/GoogleCardboardAndroid/NOMADgvrT/src/main/jni/treasure_hunt_renderer.h +++ b/GoogleCardboardAndroid/NOMADgvrT/src/main/jni/treasure_hunt_renderer.h @@ -162,9 +162,10 @@ bool animateTimesteps=false; void RenderAtoms(const float *m); void RenderUnitCell(const gvr::Mat4f eyeViewProjection); void RenderAtomTrajectoriesUnitCell(); +void RenderAtomTrajectories(const gvr::Mat4f eyeViewProjection); float UserTranslation[3]={10,0,0}; - +int error=0; }; #endif // TREASUREHUNT_APP_SRC_MAIN_JNI_TREASUREHUNTRENDERER_H_ // NOLINT diff --git a/GoogleCardboardAndroid/readme.md b/GoogleCardboardAndroid/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..8d5a32c564da50d587ecf37fc2c3d25952b9d280 --- /dev/null +++ b/GoogleCardboardAndroid/readme.md @@ -0,0 +1,17 @@ +This repository contains the demos for Google cardboard using GVR Android SDK v1.20.0 +https://github.com/googlevr/gvr-android-sdk + +Clone that repository and add the content of this one inside the Samples directory. +Copy the content of the ../libs directory (happyhttp, rapidjson) and NOMADVRLib into +NOMADgvrT/src/main/jni + +Enable support for ndk (tested: android-ndk-r10d) in settings.gradle: +include ':samples:NOMADgvrT' + + +List of directories +NOMADgvrT: + This program can load prepared molecular dynamics simulations, and is + compatible with the TimestepData OpenVR demo. + Ply support is not yet implemented + \ No newline at end of file diff --git a/NOMADVRLib/ConfigFile.cpp b/NOMADVRLib/ConfigFile.cpp index 8ceeb74a787be8fe0be2a8980336cf134aa584b1..51ca86e8fd903dcbab1af0bdbab64f2e92d3d3aa 100644 --- a/NOMADVRLib/ConfigFile.cpp +++ b/NOMADVRLib/ConfigFile.cpp @@ -128,6 +128,7 @@ int loadConfigFile(const char * f) showTrajectories = false; basisvectorreps=0; numClonedAtoms=0; + has_abc=false; for (int i=0;i<3;i++) repetitions[i]=1; for (int i=0;i<3;i++) @@ -249,6 +250,7 @@ int loadConfigFile(const char * f) if (e<0) return e-100; updateTIMESTEPS (timesteps); + //eprintf ("After read of xyzfile, numatoms 0 =%d", numAtoms[0]); } else if (!strcmp(s, "cubefile")) { r=readString(F, s); @@ -345,9 +347,12 @@ int loadConfigFile(const char * f) solid=new Solid(Solid::Type::Tetrahedron); else return -15; - } - else { + } else if (!strcmp (s, "\x0d")) { //discard windows newline (problem in Sebastian Kokott's phone (?!) + continue; + } else { eprintf( "Unrecognized parameter %s\n", s); + for (int i=0;i<strlen(s);i++) + eprintf ("<%d>", s[i]); fclose(F); return -2; } @@ -381,6 +386,6 @@ int loadConfigFile(const char * f) for (int i=0;i<*numAtoms;i++) atomtrajectories.push_back(i); } - + //eprintf ("Before returning, numatoms 0 =%d", numAtoms[0]); return 0; -} \ No newline at end of file +} diff --git a/NOMADVRLib/UnitCellShaders.cpp b/NOMADVRLib/UnitCellShaders.cpp index fa339dabc92bd23a2d7f08c0f655e684bc775019..05dc426898a86b8ddd3e760d73ca72697c87baab 100644 --- a/NOMADVRLib/UnitCellShaders.cpp +++ b/NOMADVRLib/UnitCellShaders.cpp @@ -5,7 +5,7 @@ const char * const UnitCellShaders [] = {"Unit Cell Renderer", #ifdef WIN32 "#version 410\n" #else - "#version 310 es\n" + "#version 300 es\n" #endif "uniform mat4 matrix;\n" "layout(location = 0) in vec3 pos;\n" @@ -18,7 +18,7 @@ const char * const UnitCellShaders [] = {"Unit Cell Renderer", #ifdef WIN32 "#version 410\n" #else - "#version 310 es\n" + "#version 300 es\n" #endif "uniform lowp vec4 color;\n" "out lowp vec4 outputColor;\n" diff --git a/NOMADVRLib/atoms.cpp b/NOMADVRLib/atoms.cpp index 479d7d7667a8462375e53b4badaad3997e2fc5d8..e79c3ac5d6e7ed245bc131022b576167cccfd947 100644 --- a/NOMADVRLib/atoms.cpp +++ b/NOMADVRLib/atoms.cpp @@ -18,7 +18,9 @@ #ifdef WIN32 const char * TMPDIR=""; #else -const char * TMPDIR="/sdcard/Oculus/NOMAD/"; +//const char * TMPDIR="/sdcard/Oculus/NOMAD/"; +const char * TMPDIR;//filled by main +//="/storage/540E-1AE2/"; #endif const char * const atomNames[] = @@ -204,6 +206,7 @@ int readAtomsXYZ(const char *const file, int **numatoms, int *timesteps, float * continue; //there may be a blank line at the end of the file (*timesteps)++; discardline (f); + //eprintf ("Getting atoms, mynumatoms=%d",mynumatoms); mypos.push_back(new float[mynumatoms*4]); mynum.push_back(mynumatoms); discardline (f); //comment @@ -223,6 +226,7 @@ int readAtomsXYZ(const char *const file, int **numatoms, int *timesteps, float * for (int i=0;i<*timesteps;i++) { (*pos)[i]=mypos[i]; (*numatoms)[i]=mynum[i]; + //eprintf ("Getting atoms, numatoms=%d",(*numatoms)[i]); } return 0; diff --git a/NOMADVRLib/atomsGL.cpp b/NOMADVRLib/atomsGL.cpp index f7b6d80e45db19b7a2a3dfc56d6a2c65628ac544..1fb3f7db1e456c051b00a23d9bd811b42fb074d7 100644 --- a/NOMADVRLib/atomsGL.cpp +++ b/NOMADVRLib/atomsGL.cpp @@ -13,20 +13,26 @@ GLenum atomTexture(GLuint t) { GLenum e; //rgh: scale atoms here - for (int i = 0; i < 118; i++) - atomColours[i][3] *= atomScaling; - + //in google cardboard, this is called again if the program is running, so leave original or atoms get progresivelly smaller! + float *a=new float[118*4]; + for (int i = 0; i < 118; i++) { + a[i*4+0]=atomColours[i][0]; + a[i*4+1]=atomColours[i][1]; + a[i*4+2]=atomColours[i][2]; + a[i*4+3]=atomColours[i][3] * atomScaling; + } glBindTexture(GL_TEXTURE_2D, t); //atom texture glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 118, 1, 0, GL_RGBA, GL_FLOAT, atomColours); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 118, 1, 0, GL_RGBA, GL_FLOAT, a); glBindTexture( GL_TEXTURE_2D, 0 ); if ((e = glGetError()) != GL_NO_ERROR) { eprintf( "opengl error %d, atomTexture\n", e); } + delete [] a; return e; } @@ -82,7 +88,7 @@ if (!numAtoms) for (int p=0;p<TIMESTEPS;p++) { for (int a = 0; a < numAtoms[p]-(p==0?0:numAtoms[p-1]); a++) { const int atomNumber = static_cast<int>(atoms[p][4 * a + 3]); - const float radius = atomColours[atomNumber][3]/**atomScaling*/; + const float radius = atomColours[atomNumber][3]*atomScaling; for (int i = 0; i < solid->nVerts; i++) { //verts for (int k = 0; k < 3; k++) { *current++ = solid->Verts[3 * i + k]* radius +atoms[p][4 * a + k]; //pos @@ -141,7 +147,7 @@ if (!numAtoms) for (int a = 0; a < numClonedAtoms; a++) { const int atomNumber = static_cast<int>(clonedAtoms[0][4 * a + 3]); - const float radius = atomColours[atomNumber][3]/**atomScaling*/; + const float radius = atomColours[atomNumber][3]*atomScaling; for (int i = 0; i < solid->nVerts; i++) { //verts for (int k = 0; k < 3; k++) { *current++ = solid->Verts[3 * i + k]* radius +clonedAtoms[0][4 * a + k]; //pos @@ -441,4 +447,4 @@ for (int i=0;i<3;i++) for (int ss=0;ss<3;ss++) for (int i=0;i<3;i++) f[i]+=delta[ss][i]; -} \ No newline at end of file +} diff --git a/OculusMobile/NOMADGearvrT/Src/OvrApp.cpp b/OculusMobile/NOMADGearvrT/Src/OvrApp.cpp index 85bdb3ab5a1eb1ae68695e1fe2820bf8d431affe..d7fdd8aee95a608afcb120794bac82bd6f8ab672 100644 --- a/OculusMobile/NOMADGearvrT/Src/OvrApp.cpp +++ b/OculusMobile/NOMADGearvrT/Src/OvrApp.cpp @@ -224,7 +224,7 @@ void OvrApp::OneTimeShutdown() glDeleteProgram(AtomsP); glDeleteProgram(UnitCellP); - GL(glDeleteTextures(1, textures)); + GL(glDeleteTextures(2, textures)); // LOG("OneTimeShutdown 2"); } @@ -303,13 +303,7 @@ void OvrApp::RenderAtoms(const float *m) //m[16] LOG("FIXME, No Tess code for atoms yet!"); return; } else { //no tess - //eprintf ("rendering atoms, currentSet=%d", currentSet); glBindVertexArray(AtomVAO[0]); - //glBindVertexArray(GL_ARRAY_BUFFER, AtomBuffer[0]); - - //glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7*sizeof(float), (const void *)0); - //glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (const void *)(3*sizeof(float))); - //glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (const void *)(6 * sizeof(float))); glBindTexture(GL_TEXTURE_2D, textures[1]); glUseProgram(AtomsP); glUniformMatrix4fv(AtomMatrixLoc, 1, GL_FALSE, m); @@ -322,9 +316,6 @@ void OvrApp::RenderAtoms(const float *m) //m[16] #endif 0); } else { - //eprintf("draw elements triangles, %d, unsigned_int, %d", numAtoms[currentSet]-numAtoms[currentSet-1], - // numAtoms[currentSet-1]); - //eprintf ("solid->nfaces=%d", solid->nFaces); glDrawElements(GL_TRIANGLES, (numAtoms[currentSet]-numAtoms[currentSet-1]) * 3 * solid->nFaces, #ifndef INDICESGL32 GL_UNSIGNED_SHORT, (void*)(numAtoms[currentSet-1]*sizeof(unsigned short)*3*solid->nFaces) @@ -336,7 +327,6 @@ void OvrApp::RenderAtoms(const float *m) //m[16] if ((e = glGetError()) != GL_NO_ERROR) eprintf("Gl error after Render Atom timestep =%d: %d\n", currentSet, e); //now cloned atoms - //eprintf("numClonedAtoms %d, painting", numClonedAtoms); if (numClonedAtoms!=0 && currentSet==0) { glBindVertexArray(AtomVAO[1]); glDrawElements(GL_TRIANGLES, numClonedAtoms* 3 * solid->nFaces, diff --git a/README.md b/README.md index e7a7b1fd15f527a0cf21adf2fbdec4cee1fa3fe6..b5d540f3c09ad4ccb67856e80ed0e953eeb99bb8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ Subdirectories: OpenVR: Demos for HTC Vive. OculusMobile: Demos for GearVR. + GoogleCardboardAndroid: Demos for Google Cardboard (android) NOMADVRLib: Shared code between HTC Vive and GearVR demos related to NOMAD. libs: Other (external) supporting libs shared by HTC Vive and GearVR demos