diff --git a/OculusMobile/NOMADGearvrT/Projects/Android/jni/Android.mk b/OculusMobile/NOMADGearvrT/Projects/Android/jni/Android.mk index 8ea09a2e6431ef1b036c6b453fb26f9010de88a9..80cbfab6bc0c71b2bfe987a8134745fcdd57d37c 100644 --- a/OculusMobile/NOMADGearvrT/Projects/Android/jni/Android.mk +++ b/OculusMobile/NOMADGearvrT/Projects/Android/jni/Android.mk @@ -6,7 +6,9 @@ include ../../../../../cflags.mk LOCAL_MODULE := ovrapp LOCAL_SRC_FILES := ../../../Src/OvrApp.cpp ../../../Src/rply/rply.c \ - ../../../Src/NOMADVRLib/ConfigFile.cpp ../../../Src/NOMADVRLib/atoms.cpp \ + ../../../Src/NOMADVRLib/ConfigFile.cpp \ + ../../../Src/NOMADVRLib/ConfigFileAtoms.cpp \ + ../../../Src/NOMADVRLib/atoms.cpp \ ../../../Src/happyhttp/happyhttp.cpp \ ../../../Src/NOMADVRLib/atomsGL.cpp \ ../../../Src/NOMADVRLib/CompileGLShader.cpp \ diff --git a/OculusMobile/NOMADGearvrT/Projects/Android/src/oculus/Filepath.java b/OculusMobile/NOMADGearvrT/Projects/Android/src/oculus/Filepath.java index 4645f287a63ed1c2c0ba3901574b7e00da3ece73..18c23d14bf932d1f06ec22ab675fc8a832ab6eba 100644 --- a/OculusMobile/NOMADGearvrT/Projects/Android/src/oculus/Filepath.java +++ b/OculusMobile/NOMADGearvrT/Projects/Android/src/oculus/Filepath.java @@ -1,3 +1,22 @@ +/*Uses code from Stackoverflow which uses the MIT license and the CC BY-SA 3.0*/ +/*These licenses are compatible with Apache 2.0*/ + +/* +# Copyright 2016-2018 The NOMAD Developers Group + # + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. +*/ + package oculus; //This file is the same, except for the package above, as //NOMADgvrT\src\main\java\com\google\vr\ndk\samples\treasurehunt\Filepath.java diff --git a/OculusMobile/NOMADGearvrT/Projects/Android/src/oculus/MainActivity.java b/OculusMobile/NOMADGearvrT/Projects/Android/src/oculus/MainActivity.java index 72cd062f7559a0412d0a6a1cfc842d390bde29f8..a7caf9276d23c74cd3865685a7001d53b9086bbf 100644 --- a/OculusMobile/NOMADGearvrT/Projects/Android/src/oculus/MainActivity.java +++ b/OculusMobile/NOMADGearvrT/Projects/Android/src/oculus/MainActivity.java @@ -15,6 +15,7 @@ import android.os.Bundle; import android.util.Log; import android.content.Intent; import com.oculus.vrappframework.VrActivity; +import com.lrz.NOMADGearvrT.R; public class MainActivity extends VrActivity { public static final String TAG = "NOMADGearvrT"; @@ -82,9 +83,53 @@ public static void verifyStoragePermissions(android.app.Activity activity) { } } */ + + private void SaveToDisk (java.io.InputStream is, java.lang.String name) + { //https://stackoverflow.com/questions/10854211/android-store-inputstream-in-file + try { + try { + java.io.File f=new java.io.File(name); + java.io.OutputStream output = new java.io.FileOutputStream(f); + try { + byte[] buffer = new byte[4 * 1024]; // or other buffer size + int read; + + while ((read = is.read(buffer)) != -1) { + output.write(buffer, 0, read); + } + + output.flush(); + } finally { + output.close(); + } + } finally { + is.close(); + } + } catch (java.io.IOException e) { + android.util.Log.d("NOMADgvrT","java.io.IOException, e="+e); + } + } + @Override protected void onCreate(Bundle savedInstanceState) { + //export example file + java.io.File d= new java.io.File ("/sdcard/Oculus/NomadGearVR"); + try{ + if (!d.exists()) { + d.mkdir(); + } + } + catch(java.lang.SecurityException e){ + android.util.Log.d("NOMADgvrT","java.lang.SecurityException, e="+e); + } + java.io.InputStream is=this.getApplicationContext().getResources(). + openRawResource (com.lrz.NOMADGearvrT.R.raw.xyz); + SaveToDisk(is, "/sdcard/Oculus/NomadGearVR/cytosine.xyz"); + is=this.getApplicationContext().getResources().openRawResource (com.lrz.NOMADGearvrT.R.raw.ncfg); + SaveToDisk(is, "/sdcard/Oculus/NomadGearVR/cytosine.ncfg"); + //end export + super.onCreate(savedInstanceState); verifyStoragePermissions(this); @@ -98,9 +143,10 @@ public static void verifyStoragePermissions(android.app.Activity activity) { uriString=Filepath.getFilePath (this.getApplicationContext(), u); } catch (java.net.URISyntaxException e) { android.util.Log.d("NOMADgvrT","URISyntaxException, e="+e); - uriString=null; + uriString="/sdcard/Oculus/NomadGearVR/cytosine.ncfg"; } + android.util.Log.d("NOMADgvrT","Uristring is="+uriString); setAppPtr( nativeSetAppInterface( this, fromPackageNameString, commandString, uriString ) ); } } diff --git a/OculusMobile/NOMADGearvrT/Src/OvrApp.cpp b/OculusMobile/NOMADGearvrT/Src/OvrApp.cpp index a0e1935d5d9cef9618c41f113907e5d2e92d5522..a6c04ce2ca604d81741d2594cceb3df1d8383c37 100644 --- a/OculusMobile/NOMADGearvrT/Src/OvrApp.cpp +++ b/OculusMobile/NOMADGearvrT/Src/OvrApp.cpp @@ -115,12 +115,12 @@ void OvrApp::OneTimeInit( const char * fromPackage, const char * launchIntentJSO //} const char *configLocation="/sdcard/NOMAD/NOMADGearVR.cfg"; - const char *defaultURI="/sdcard/Oculus/NOMAD/ViveTDefault.ncfg"; + const char *defaultURI="/sdcard/Oculus/NomadGearVR/cytosine.ncfg"; char finalURI[1024]; FILE *cl = fopen (configLocation, "r"); if (cl==nullptr) { - LOG("NOMADGearVRT, /sdcard/NOMAD/NOMADGearVR.cfg not found, using default at /sdcard/Oculus/NOMAD/ViveTDefault.ncfg"); + LOG("NOMADGearVRT, /sdcard/NOMAD/NOMADGearVR.cfg not found, using default at /sdcard/Oculus/NomadGearVR/cytosine.ncfg"); strcpy(finalURI, defaultURI); } else { fgets(finalURI, 1024, cl); @@ -175,14 +175,14 @@ void OvrApp::OneTimeInit( const char * fromPackage, const char * launchIntentJSO LOG("NOMADGearVRT No atom glyph specified, using Icosahedron"); solid=new Solid(Solid::Type::Icosahedron); } - LOG("OneTimeInit, 2"); +// LOG("OneTimeInit, 2"); const ovrJava * java = app->GetJava(); SoundEffectContext = new ovrSoundEffectContext( *java->Env, java->ActivityObject ); SoundEffectContext->Initialize(); SoundEffectPlayer = new OvrGuiSys::ovrDummySoundEffectPlayer(); -LOG("OneTimeInit, 3"); +//LOG("OneTimeInit, 3"); Locale = ovrLocale::Create( *app, "default" ); -LOG("OneTimeInit, 4"); +//LOG("OneTimeInit, 4"); String fontName; GetLocale().GetString( "@string/font_name", "efigs.fnt", fontName ); GuiSys->Init( this->app, *SoundEffectPlayer, fontName.ToCStr(), &app->GetDebugLines() ); @@ -232,9 +232,16 @@ LOG("OneTimeInit, 4"); if (e!=GL_NO_ERROR) eprintf ("SetupUnitCell error %d", e); - if (ISOS) { - PrepareISOShader(&ISOP, &ISOMatrixLoc); + e=SetupMarkerNoTess(&MarkerVAO, &MarkerVertBuffer, &MarkerIndexBuffer); + if (e!=GL_NO_ERROR) { + eprintf ("SetupMarkerNoTess error %d", e); + } + + if (ISOS || markers) { + PrepareISOShader(&ISOP, &ISOMatrixLoc); + } + if (ISOS) { float m=BACKGROUND[0]; m=std::max(m, BACKGROUND[1]); m=std::max(m, BACKGROUND[2]); @@ -469,11 +476,44 @@ void OvrApp::RenderIsos(const OVR::Matrix4f eyeViewProjection, int iso) { glBindVertexArray(0); } +void OvrApp::RenderMarker(const float *m) //m[16] +{ +int e; +if (!markers) + return; +glEnable(GL_BLEND); +glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +glBindVertexArray(MarkerVAO); +if ((e = glGetError()) != GL_NO_ERROR) + eprintf("b %d", e); +glUseProgram(ISOP); +if ((e = glGetError()) != GL_NO_ERROR) + eprintf("c %d", e); +glUniformMatrix4fv(ISOMatrixLoc, 1, GL_FALSE, m); +if ((e = glGetError()) != GL_NO_ERROR) + eprintf("d %d, matrixloc=%d, program=%d", e, ISOMatrixLoc, ISOP); +glDrawElements(GL_TRIANGLES, 3*3*MARKERSOLID::nFaces, +#ifndef INDICESGL32 + GL_UNSIGNED_SHORT, (void*)(currentSet*sizeof(unsigned short)*3*3*MARKERSOLID::nFaces +) +#else + GL_UNSIGNED_INT, (void*)(currentSet*sizeof(unsigned int)*3*3*MARKERSOLID::nFaces +) +#endif + ); +if ((e = glGetError()) != GL_NO_ERROR) + eprintf("e %d", e); +glBindVertexArray(0); +if ((e = glGetError()) != GL_NO_ERROR) + eprintf("f %d", e); + +glDisable(GL_BLEND); +} void OvrApp::RenderAtoms(const float *m) //m[16] { - eprintf ("RenderAtoms start numatoms %d", numAtoms); + //eprintf ("RenderAtoms start numatoms %d", numAtoms); int e; if (numAtoms==0) return; @@ -607,6 +647,7 @@ void OvrApp::RenderUnitCell(const Matrix4f eyeViewProjection) //atom trajectories RenderAtomTrajectoriesUnitCell(); RenderAtoms(t); + RenderMarker(t); } } @@ -628,6 +669,7 @@ void OvrApp::RenderAtomTrajectories (const Matrix4f eyeViewProjection) glUniformMatrix4fv(UnitCellMatrixLoc, 1, GL_FALSE, t); RenderAtomTrajectoriesUnitCell(); RenderAtoms(t); + RenderMarker(t); } Matrix4f OvrApp::DrawEyeView( const int eye, const float fovDegreesX, const float fovDegreesY, ovrFrameParms & frameParms ) diff --git a/OculusMobile/NOMADGearvrT/Src/OvrApp.h b/OculusMobile/NOMADGearvrT/Src/OvrApp.h index 2fa6be0d587aefd4cd3ffb916e22914ab3a1728b..2860c18355a3acfb3cbd94e5d2db9866f156eb2a 100644 --- a/OculusMobile/NOMADGearvrT/Src/OvrApp.h +++ b/OculusMobile/NOMADGearvrT/Src/OvrApp.h @@ -56,7 +56,8 @@ private: //if no tesselation is available, we still need the tess atoms for the trajectories! GLuint *AtomTVAO=nullptr, *AtomTBuffer=nullptr, BondIndices=0, *AtomVAO=nullptr, *AtomBuffer=nullptr, *AtomIndices=nullptr,//[2], atoms, extraatoms - UnitCellVAO, UnitCellBuffer, UnitCellIndexBuffer; + UnitCellVAO, UnitCellBuffer, UnitCellIndexBuffer, + MarkerVAO, MarkerVertBuffer, MarkerIndexBuffer; GLuint *ISOVAO=nullptr/*[ISOS*TIMESTEPS]*/, *ISOBuffer=nullptr/*[ISOS*TIMESTEPS]*/, *ISOIndices=nullptr/*[ISOS*TIMESTEPS]*/; @@ -65,6 +66,7 @@ private: int *numISOIndices=nullptr/*[ISOS*TIMESTEPS]*/; void RenderAtoms(const float *m); + void RenderMarker(const float *m); void RenderUnitCell(const OVR::Matrix4f eyeViewProjection); void RenderAtomTrajectories (const OVR::Matrix4f eyeViewProjection); void RenderAtomTrajectoriesUnitCell();