Merge pull request #15052 from amerhifi/quest-demo

case 21485: removing quest-demo specific changes
This commit is contained in:
Sam Gateau 2019-03-01 15:03:44 -08:00 committed by GitHub
commit cc9a3e2541
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
39 changed files with 352 additions and 119 deletions

View file

@ -66,10 +66,10 @@ android {
} }
signingConfigs { signingConfigs {
release { release {
storeFile project.hasProperty("HIFI_ANDROID_KEYSTORE") ? file(HIFI_ANDROID_KEYSTORE) : null storeFile project.hasProperty("HIFI_ANDROID_KEYSTORE") ? file(HIFI_ANDROID_KEYSTORE) : file('../keystore.jks')
storePassword project.hasProperty("HIFI_ANDROID_KEYSTORE_PASSWORD") ? HIFI_ANDROID_KEYSTORE_PASSWORD : '' storePassword project.hasProperty("HIFI_ANDROID_KEYSTORE_PASSWORD") ? HIFI_ANDROID_KEYSTORE_PASSWORD : 'password'
keyAlias project.hasProperty("HIFI_ANDROID_KEY_ALIAS") ? HIFI_ANDROID_KEY_ALIAS : '' keyAlias project.hasProperty("HIFI_ANDROID_KEY_ALIAS") ? HIFI_ANDROID_KEY_ALIAS : 'key0'
keyPassword project.hasProperty("HIFI_ANDROID_KEY_PASSWORD") ? HIFI_ANDROID_KEY_PASSWORD : '' keyPassword project.hasProperty("HIFI_ANDROID_KEY_PASSWORD") ? HIFI_ANDROID_KEY_PASSWORD : 'password'
} }
} }
} }
@ -90,10 +90,7 @@ android {
release { release {
minifyEnabled false minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig project.hasProperty("HIFI_ANDROID_KEYSTORE") && signingConfig signingConfigs.release
project.hasProperty("HIFI_ANDROID_KEYSTORE_PASSWORD") &&
project.hasProperty("HIFI_ANDROID_KEY_ALIAS") &&
project.hasProperty("HIFI_ANDROID_KEY_PASSWORD")? signingConfigs.release : null
buildConfigField "String", "BACKTRACE_URL", "\"" + (System.getenv("CMAKE_BACKTRACE_URL") ? System.getenv("CMAKE_BACKTRACE_URL") : '') + "\"" buildConfigField "String", "BACKTRACE_URL", "\"" + (System.getenv("CMAKE_BACKTRACE_URL") ? System.getenv("CMAKE_BACKTRACE_URL") : '') + "\""
buildConfigField "String", "BACKTRACE_TOKEN", "\"" + (System.getenv("CMAKE_BACKTRACE_TOKEN") ? System.getenv("CMAKE_BACKTRACE_TOKEN") : '') + "\"" buildConfigField "String", "BACKTRACE_TOKEN", "\"" + (System.getenv("CMAKE_BACKTRACE_TOKEN") ? System.getenv("CMAKE_BACKTRACE_TOKEN") : '') + "\""
buildConfigField "String", "OAUTH_CLIENT_ID", "\"" + (System.getenv("OAUTH_CLIENT_ID") ? System.getenv("OAUTH_CLIENT_ID") : '') + "\"" buildConfigField "String", "OAUTH_CLIENT_ID", "\"" + (System.getenv("OAUTH_CLIENT_ID") ? System.getenv("OAUTH_CLIENT_ID") : '') + "\""

BIN
android/apps/keystore.jks Normal file

Binary file not shown.

View file

@ -44,10 +44,10 @@ android {
} }
signingConfigs { signingConfigs {
release { release {
storeFile project.hasProperty("HIFI_ANDROID_KEYSTORE") ? file(HIFI_ANDROID_KEYSTORE) : null storeFile project.hasProperty("HIFI_ANDROID_KEYSTORE") ? file(HIFI_ANDROID_KEYSTORE) : file('../keystore.jks')
storePassword project.hasProperty("HIFI_ANDROID_KEYSTORE_PASSWORD") ? HIFI_ANDROID_KEYSTORE_PASSWORD : '' storePassword project.hasProperty("HIFI_ANDROID_KEYSTORE_PASSWORD") ? HIFI_ANDROID_KEYSTORE_PASSWORD : 'password'
keyAlias project.hasProperty("HIFI_ANDROID_KEY_ALIAS") ? HIFI_ANDROID_KEY_ALIAS : '' keyAlias project.hasProperty("HIFI_ANDROID_KEY_ALIAS") ? HIFI_ANDROID_KEY_ALIAS : 'key0'
keyPassword project.hasProperty("HIFI_ANDROID_KEY_PASSWORD") ? HIFI_ANDROID_KEY_PASSWORD : '' keyPassword project.hasProperty("HIFI_ANDROID_KEY_PASSWORD") ? HIFI_ANDROID_KEY_PASSWORD : 'password'
v2SigningEnabled false v2SigningEnabled false
} }
} }
@ -133,12 +133,6 @@ android {
assetList.each { file -> out.println(file) } assetList.each { file -> out.println(file) }
} }
} }
variant.outputs.all {
if (RELEASE_NUMBER != '0') {
outputFileName = "app_" + RELEASE_NUMBER + "_" + RELEASE_TYPE + ".apk"
}
}
} }
} }

View file

@ -61,7 +61,7 @@ extern "C" {
Java_io_highfidelity_oculus_OculusMobileActivity_nativeInitOculusPlatform(JNIEnv *env, jobject obj){ Java_io_highfidelity_oculus_OculusMobileActivity_nativeInitOculusPlatform(JNIEnv *env, jobject obj){
initOculusPlatform(env, obj); initOculusPlatform(env, obj);
} }
QAndroidJniObject __interfaceActivity; QAndroidJniObject __interfaceActivity;
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_io_highfidelity_oculus_OculusMobileActivity_questNativeOnCreate(JNIEnv *env, jobject obj) { Java_io_highfidelity_oculus_OculusMobileActivity_questNativeOnCreate(JNIEnv *env, jobject obj) {
@ -80,6 +80,10 @@ QAndroidJniObject __interfaceActivity;
}); });
} }
JNIEXPORT void JNICALL
Java_io_highfidelity_oculus_OculusMobileActivity_questNativeAwayMode(JNIEnv *env, jobject obj) {
AndroidHelper::instance().toggleAwayMode();
}
JNIEXPORT void Java_io_highfidelity_oculus_OculusMobileActivity_questOnAppAfterLoad(JNIEnv* env, jobject obj) { JNIEXPORT void Java_io_highfidelity_oculus_OculusMobileActivity_questOnAppAfterLoad(JNIEnv* env, jobject obj) {

View file

@ -5,6 +5,7 @@ import io.highfidelity.oculus.OculusMobileActivity;
import io.highfidelity.utils.HifiUtils; import io.highfidelity.utils.HifiUtils;
public class InterfaceActivity extends OculusMobileActivity { public class InterfaceActivity extends OculusMobileActivity {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
HifiUtils.upackAssets(getAssets(), getCacheDir().getAbsolutePath()); HifiUtils.upackAssets(getAssets(), getCacheDir().getAbsolutePath());

View file

@ -5,6 +5,7 @@ import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils;
import io.highfidelity.oculus.OculusMobileActivity; import io.highfidelity.oculus.OculusMobileActivity;
import io.highfidelity.utils.HifiUtils; import io.highfidelity.utils.HifiUtils;
@ -19,9 +20,18 @@ public class PermissionsChecker extends Activity {
Manifest.permission.CAMERA Manifest.permission.CAMERA
}; };
private static final String EXTRA_ARGS = "args";
private String mArgs;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mArgs =(getIntent().getStringExtra(EXTRA_ARGS));
if(!TextUtils.isEmpty(mArgs)) {
System.out.println("Application launched with following args: " + mArgs);
}
requestAppPermissions(REQUIRED_PERMISSIONS,REQUEST_PERMISSIONS); requestAppPermissions(REQUIRED_PERMISSIONS,REQUEST_PERMISSIONS);
} }
@ -47,7 +57,13 @@ public class PermissionsChecker extends Activity {
} }
private void launchActivityWithPermissions() { private void launchActivityWithPermissions() {
startActivity(new Intent(this, InterfaceActivity.class)); Intent intent= new Intent(this, InterfaceActivity.class);
if(!TextUtils.isEmpty(mArgs)) {
intent.putExtra("applicationArguments", mArgs);
}
startActivity(intent);
finish(); finish();
} }

View file

@ -1,11 +1,35 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -xeuo pipefail set -xeuo pipefail
ANDROID_BUILD_TYPE=release
ANDROID_BUILD_TARGET=assembleRelease
if [[ "$RELEASE_TYPE" == "PR" ]]; then
ANDROID_APK_SUFFIX=PR${RELEASE_NUMBER}-${SHA7}.apk ;
elif [[ "${STABLE_BUILD}" == "1" ]]; then
ANDROID_APK_SUFFIX=${RELEASE_NUMBER}.apk ;
else
ANDROID_APK_SUFFIX=${RELEASE_NUMBER}-${SHA7}.apk ;
fi
# Interface build
ANDROID_APP=interface
ANDROID_OUTPUT_DIR=./apps/${ANDROID_APP}/build/outputs/apk/${ANDROID_BUILD_TYPE}
ANDROID_OUTPUT_FILE=${ANDROID_APP}-${ANDROID_BUILD_TYPE}.apk
ANDROID_APK_NAME=HighFidelity-Beta-${ANDROID_APK_SUFFIX}
./gradlew -PHIFI_ANDROID_PRECOMPILED=${HIFI_ANDROID_PRECOMPILED} -PVERSION_CODE=${VERSION_CODE} -PRELEASE_NUMBER=${RELEASE_NUMBER} -PRELEASE_TYPE=${RELEASE_TYPE} ${ANDROID_APP}:${ANDROID_BUILD_TARGET} ./gradlew -PHIFI_ANDROID_PRECOMPILED=${HIFI_ANDROID_PRECOMPILED} -PVERSION_CODE=${VERSION_CODE} -PRELEASE_NUMBER=${RELEASE_NUMBER} -PRELEASE_TYPE=${RELEASE_TYPE} ${ANDROID_APP}:${ANDROID_BUILD_TARGET}
cp ${ANDROID_OUTPUT_DIR}/${ANDROID_OUTPUT_FILE} ./${ANDROID_APK_NAME}
# Quest Interface build
ANDROID_APP=questInterface
ANDROID_OUTPUT_DIR=./apps/${ANDROID_APP}/build/outputs/apk/${ANDROID_BUILD_TYPE}
ANDROID_OUTPUT_FILE=${ANDROID_APP}-${ANDROID_BUILD_TYPE}.apk
ANDROID_APK_NAME=HighFidelity-Quest-Beta-${ANDROID_APK_SUFFIX}
./gradlew -PHIFI_ANDROID_PRECOMPILED=${HIFI_ANDROID_PRECOMPILED} -PVERSION_CODE=${VERSION_CODE} -PRELEASE_NUMBER=${RELEASE_NUMBER} -PRELEASE_TYPE=${RELEASE_TYPE} ${ANDROID_APP}:${ANDROID_BUILD_TARGET} || true
cp ${ANDROID_OUTPUT_DIR}/${ANDROID_OUTPUT_FILE} ./${ANDROID_APK_NAME} || true
# This is the actual output from gradle, which no longer attempts to muck with the naming of the APK
OUTPUT_APK=./apps/${ANDROID_APP}/build/outputs/apk/${ANDROID_BUILD_DIR}/${ANDROID_BUILT_APK_NAME}
# This is the APK name requested by Jenkins
TARGET_APK=./${ANDROID_APK_NAME}
# Make sure this matches up with the new ARTIFACT_EXPRESSION for jenkins builds, which should be "android/*.apk"
cp ${OUTPUT_APK} ${TARGET_APK}

View file

@ -9,6 +9,7 @@ docker build --build-arg BUILD_UID=`id -u` -t "${DOCKER_IMAGE_NAME}" -f docker/D
# So make sure we use VERSION_CODE consistently # So make sure we use VERSION_CODE consistently
test -z "$VERSION_CODE" && export VERSION_CODE=$VERSION test -z "$VERSION_CODE" && export VERSION_CODE=$VERSION
# FIXME figure out which of these actually need to be forwarded and which can be eliminated
docker run \ docker run \
--rm \ --rm \
--security-opt seccomp:unconfined \ --security-opt seccomp:unconfined \
@ -27,6 +28,7 @@ docker run \
-e OAUTH_CLIENT_SECRET \ -e OAUTH_CLIENT_SECRET \
-e OAUTH_CLIENT_ID \ -e OAUTH_CLIENT_ID \
-e OAUTH_REDIRECT_URI \ -e OAUTH_REDIRECT_URI \
-e SHA7 \
-e VERSION_CODE \ -e VERSION_CODE \
"${DOCKER_IMAGE_NAME}" \ "${DOCKER_IMAGE_NAME}" \
sh -c "./build_android.sh" sh -c "./build_android.sh"

View file

@ -73,7 +73,7 @@ RUN mkdir "$HIFI_BASE" && \
RUN git clone https://github.com/jherico/hifi.git && \ RUN git clone https://github.com/jherico/hifi.git && \
cd ~/hifi && \ cd ~/hifi && \
git checkout feature/quest_frame_player git checkout quest/build
WORKDIR /home/jenkins/hifi WORKDIR /home/jenkins/hifi

View file

@ -34,11 +34,16 @@ public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Ca
private native void questNativeOnResume(); private native void questNativeOnResume();
private native void questOnAppAfterLoad(); private native void questOnAppAfterLoad();
private native void questNativeAwayMode();
private SurfaceView mView; private SurfaceView mView;
private SurfaceHolder mSurfaceHolder; private SurfaceHolder mSurfaceHolder;
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
if(getIntent().hasExtra("applicationArguments")){
super.APPLICATION_PARAMETERS=getIntent().getStringExtra("applicationArguments");
}
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Log.w(TAG, "QQQ onCreate"); Log.w(TAG, "QQQ onCreate");
@ -51,6 +56,7 @@ public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Ca
nativeOnCreate(); nativeOnCreate();
questNativeOnCreate(); questNativeOnCreate();
} }
public void onAppLoadedComplete() { public void onAppLoadedComplete() {
Log.w(TAG, "QQQ Load Completed"); Log.w(TAG, "QQQ Load Completed");
runOnUiThread(() -> { runOnUiThread(() -> {
@ -62,7 +68,8 @@ public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Ca
@Override @Override
protected void onDestroy() { protected void onDestroy() {
Log.w(TAG, "QQQ onDestroy"); Log.w(TAG, "QQQ onDestroy");
isPausing=false;
super.onStop();
nativeOnSurfaceChanged(null); nativeOnSurfaceChanged(null);
Log.w(TAG, "QQQ onDestroy -- SUPER onDestroy"); Log.w(TAG, "QQQ onDestroy -- SUPER onDestroy");
@ -78,6 +85,7 @@ public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Ca
questNativeOnResume(); questNativeOnResume();
nativeOnResume(); nativeOnResume();
isPausing=false;
} }
@Override @Override
@ -87,40 +95,42 @@ public class OculusMobileActivity extends QtActivity implements SurfaceHolder.Ca
questNativeOnPause(); questNativeOnPause();
nativeOnPause(); nativeOnPause();
isPausing=true;
} }
@Override @Override
protected void onStop(){ protected void onStop(){
super.onStop(); super.onStop();
Log.w(TAG, "QQQ Onstop called"); Log.w(TAG, "QQQ_ Onstop called");
questNativeAwayMode();
} }
@Override @Override
protected void onRestart(){ protected void onRestart() {
super.onRestart(); super.onRestart();
Log.w(TAG, "QQQ onRestart called ****"); Log.w(TAG, "QQQ_ onRestart called");
questOnAppAfterLoad(); questOnAppAfterLoad();
questNativeAwayMode();
} }
@Override @Override
public void surfaceCreated(SurfaceHolder holder) { public void surfaceCreated(SurfaceHolder holder) {
Log.w(TAG, "QQQ surfaceCreated ************************************"); Log.w(TAG, "QQQ_ surfaceCreated");
nativeOnSurfaceChanged(holder.getSurface()); nativeOnSurfaceChanged(holder.getSurface());
mSurfaceHolder = holder; mSurfaceHolder = holder;
} }
@Override @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.w(TAG, "QQQ surfaceChanged"); Log.w(TAG, "QQQ_ surfaceChanged");
nativeOnSurfaceChanged(holder.getSurface()); nativeOnSurfaceChanged(holder.getSurface());
mSurfaceHolder = holder; mSurfaceHolder = holder;
} }
@Override @Override
public void surfaceDestroyed(SurfaceHolder holder) { public void surfaceDestroyed(SurfaceHolder holder) {
Log.w(TAG, "QQQ surfaceDestroyed ***************************************************"); Log.w(TAG, "QQQ_ surfaceDestroyed");
nativeOnSurfaceChanged(null); nativeOnSurfaceChanged(null);
mSurfaceHolder = null; mSurfaceHolder = null;
} }
} }

View file

@ -70,6 +70,7 @@ public class QtActivity extends Activity {
public final String QT_ANDROID_DEFAULT_THEME = QT_ANDROID_THEMES[0]; // sets the default theme. public final String QT_ANDROID_DEFAULT_THEME = QT_ANDROID_THEMES[0]; // sets the default theme.
private QtActivityLoader m_loader = new QtActivityLoader(this); private QtActivityLoader m_loader = new QtActivityLoader(this);
public boolean isPausing=false;
public QtActivity() { public QtActivity() {
} }
@ -650,9 +651,13 @@ public class QtActivity extends Activity {
@Override @Override
protected void onStop() { protected void onStop() {
super.onStop(); super.onStop();
QtApplication.invokeDelegate();
if(!isPausing){
QtApplication.invokeDelegate();
}
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@Override @Override

View file

@ -45,6 +45,10 @@ void AndroidHelper::notifyBeforeEnterBackground() {
emit beforeEnterBackground(); emit beforeEnterBackground();
} }
void AndroidHelper::notifyToggleAwayMode() {
emit toggleAwayMode();
}
void AndroidHelper::notifyEnterBackground() { void AndroidHelper::notifyEnterBackground() {
emit enterBackground(); emit enterBackground();
} }

View file

@ -31,6 +31,7 @@ public:
void notifyEnterForeground(); void notifyEnterForeground();
void notifyBeforeEnterBackground(); void notifyBeforeEnterBackground();
void notifyEnterBackground(); void notifyEnterBackground();
void notifyToggleAwayMode();
void performHapticFeedback(int duration); void performHapticFeedback(int duration);
void processURL(const QString &url); void processURL(const QString &url);
@ -55,7 +56,7 @@ signals:
void enterForeground(); void enterForeground();
void beforeEnterBackground(); void beforeEnterBackground();
void enterBackground(); void enterBackground();
void toggleAwayMode();
void hapticFeedbackRequested(int duration); void hapticFeedbackRequested(int duration);
void handleSignupCompleted(); void handleSignupCompleted();

View file

@ -1756,6 +1756,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
#endif #endif
}); });
// Setup the _keyboardMouseDevice, _touchscreenDevice, _touchscreenVirtualPadDevice and the user input mapper with the default bindings // Setup the _keyboardMouseDevice, _touchscreenDevice, _touchscreenVirtualPadDevice and the user input mapper with the default bindings
userInputMapper->registerDevice(_keyboardMouseDevice->getInputDevice()); userInputMapper->registerDevice(_keyboardMouseDevice->getInputDevice());
// if the _touchscreenDevice is not supported it will not be registered // if the _touchscreenDevice is not supported it will not be registered
@ -2411,6 +2412,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
connect(&AndroidHelper::instance(), &AndroidHelper::beforeEnterBackground, this, &Application::beforeEnterBackground); connect(&AndroidHelper::instance(), &AndroidHelper::beforeEnterBackground, this, &Application::beforeEnterBackground);
connect(&AndroidHelper::instance(), &AndroidHelper::enterBackground, this, &Application::enterBackground); connect(&AndroidHelper::instance(), &AndroidHelper::enterBackground, this, &Application::enterBackground);
connect(&AndroidHelper::instance(), &AndroidHelper::enterForeground, this, &Application::enterForeground); connect(&AndroidHelper::instance(), &AndroidHelper::enterForeground, this, &Application::enterForeground);
connect(&AndroidHelper::instance(), &AndroidHelper::toggleAwayMode, this, &Application::toggleAwayMode);
AndroidHelper::instance().notifyLoadComplete(); AndroidHelper::instance().notifyLoadComplete();
#endif #endif
pauseUntilLoginDetermined(); pauseUntilLoginDetermined();
@ -3661,8 +3663,8 @@ void Application::handleSandboxStatus(QNetworkReply* reply) {
// If this is a first run we short-circuit the address passed in // If this is a first run we short-circuit the address passed in
if (_firstRun.get()) { if (_firstRun.get()) {
#if !defined(Q_OS_ANDROID) #if !defined(Q_OS_ANDROID)
DependencyManager::get<AddressManager>()->goToEntry(); DependencyManager::get<AddressManager>()->goToEntry();
sentTo = SENT_TO_ENTRY; sentTo = SENT_TO_ENTRY;
#endif #endif
_firstRun.set(false); _firstRun.set(false);
@ -9155,6 +9157,8 @@ void Application::beforeEnterBackground() {
clearDomainOctreeDetails(); clearDomainOctreeDetails();
} }
void Application::enterBackground() { void Application::enterBackground() {
QMetaObject::invokeMethod(DependencyManager::get<AudioClient>().data(), QMetaObject::invokeMethod(DependencyManager::get<AudioClient>().data(),
"stop", Qt::BlockingQueuedConnection); "stop", Qt::BlockingQueuedConnection);
@ -9178,6 +9182,15 @@ void Application::enterForeground() {
auto nodeList = DependencyManager::get<NodeList>(); auto nodeList = DependencyManager::get<NodeList>();
nodeList->setSendDomainServerCheckInEnabled(true); nodeList->setSendDomainServerCheckInEnabled(true);
} }
void Application::toggleAwayMode(){
QKeyEvent event = QKeyEvent (QEvent::KeyPress, Qt::Key_Escape, Qt::NoModifier);
QCoreApplication::sendEvent (this, &event);
}
#endif #endif
#include "Application.moc" #include "Application.moc"

View file

@ -338,7 +338,8 @@ public:
void beforeEnterBackground(); void beforeEnterBackground();
void enterBackground(); void enterBackground();
void enterForeground(); void enterForeground();
#endif void toggleAwayMode();
#endif
signals: signals:
void svoImportRequested(const QString& url); void svoImportRequested(const QString& url);

View file

@ -19,13 +19,19 @@
#include <SimpleMovingAverage.h> #include <SimpleMovingAverage.h>
#include <render/Args.h> #include <render/Args.h>
#ifdef Q_OS_ANDROID #ifdef Q_OS_ANDROID
const float LOD_DEFAULT_QUALITY_LEVEL = 0.75f; // default quality level setting is High (lower framerate) const float LOD_DEFAULT_QUALITY_LEVEL = 0.2f; // default quality level setting is High (lower framerate)
#else #else
const float LOD_DEFAULT_QUALITY_LEVEL = 0.5f; // default quality level setting is Mid const float LOD_DEFAULT_QUALITY_LEVEL = 0.5f; // default quality level setting is Mid
#endif #endif
const float LOD_MAX_LIKELY_DESKTOP_FPS = 60.0f; // this is essentially, V-synch fps const float LOD_MAX_LIKELY_DESKTOP_FPS = 60.0f; // this is essentially, V-synch fps
#ifdef Q_OS_ANDROID
const float LOD_MAX_LIKELY_HMD_FPS = 36.0f; // this is essentially, V-synch fps
#else
const float LOD_MAX_LIKELY_HMD_FPS = 90.0f; // this is essentially, V-synch fps const float LOD_MAX_LIKELY_HMD_FPS = 90.0f; // this is essentially, V-synch fps
#endif
const float LOD_OFFSET_FPS = 5.0f; // offset of FPS to add for computing the target framerate const float LOD_OFFSET_FPS = 5.0f; // offset of FPS to add for computing the target framerate
class AABox; class AABox;

View file

@ -865,7 +865,6 @@ const AnimPoseVec& AnimInverseKinematics::evaluate(const AnimVariantMap& animVar
//virtual //virtual
const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars, const AnimContext& context, float dt, AnimVariantMap& triggersOut, const AnimPoseVec& underPoses) { const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars, const AnimContext& context, float dt, AnimVariantMap& triggersOut, const AnimPoseVec& underPoses) {
// allows solutionSource to be overridden by an animVar // allows solutionSource to be overridden by an animVar
auto solutionSource = animVars.lookup(_solutionSourceVar, (int)_solutionSource); auto solutionSource = animVars.lookup(_solutionSourceVar, (int)_solutionSource);

View file

@ -1066,6 +1066,13 @@ void Rig::computeMotionAnimationState(float deltaTime, const glm::vec3& worldPos
if (_enableInverseKinematics) { if (_enableInverseKinematics) {
_animVars.set("ikOverlayAlpha", 1.0f); _animVars.set("ikOverlayAlpha", 1.0f);
_animVars.set("splineIKEnabled", true);
_animVars.set("leftHandIKEnabled", true);
_animVars.set("rightHandIKEnabled", true);
_animVars.set("leftFootIKEnabled", true);
_animVars.set("rightFootIKEnabled", true);
_animVars.set("leftFootPoleVectorEnabled", true);
_animVars.set("rightFootPoleVectorEnabled", true);
} else { } else {
_animVars.set("ikOverlayAlpha", 0.0f); _animVars.set("ikOverlayAlpha", 0.0f);
_animVars.set("splineIKEnabled", false); _animVars.set("splineIKEnabled", false);
@ -1878,15 +1885,13 @@ void Rig::updateFromControllerParameters(const ControllerParameters& params, flo
}; };
std::shared_ptr<AnimInverseKinematics> ikNode = getAnimInverseKinematicsNode(); std::shared_ptr<AnimInverseKinematics> ikNode = getAnimInverseKinematicsNode();
if (ikNode) { for (int i = 0; i < (int)NumSecondaryControllerTypes; i++) {
for (int i = 0; i < (int)NumSecondaryControllerTypes; i++) { int index = indexOfJoint(secondaryControllerJointNames[i]);
int index = indexOfJoint(secondaryControllerJointNames[i]); if ((index >= 0) && (ikNode)) {
if (index >= 0) { if (params.secondaryControllerFlags[i] & (uint8_t)ControllerFlags::Enabled) {
if (params.secondaryControllerFlags[i] & (uint8_t)ControllerFlags::Enabled) { ikNode->setSecondaryTargetInRigFrame(index, params.secondaryControllerPoses[i]);
ikNode->setSecondaryTargetInRigFrame(index, params.secondaryControllerPoses[i]); } else {
} else { ikNode->clearSecondaryTarget(index);
ikNode->clearSecondaryTarget(index);
}
} }
} }
} }

View file

@ -1537,6 +1537,7 @@ void Avatar::rigReady() {
buildUnscaledEyeHeightCache(); buildUnscaledEyeHeightCache();
buildSpine2SplineRatioCache(); buildSpine2SplineRatioCache();
computeMultiSphereShapes(); computeMultiSphereShapes();
buildSpine2SplineRatioCache();
} }
// rig has been reset. // rig has been reset.

View file

@ -380,16 +380,26 @@ void OpenGLDisplayPlugin::customizeContext() {
scissorState->setScissorEnable(true); scissorState->setScissorEnable(true);
{ {
#ifdef Q_OS_ANDROID
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTextureGammaLinearToSRGB);
#else
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTexture); gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTexture);
_simplePipeline = gpu::Pipeline::create(program, scissorState); #endif
_hudPipeline = gpu::Pipeline::create(program, blendState); _simplePipeline = gpu::Pipeline::create(program, scissorState);
} }
{ {
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::display_plugins::program::SrgbToLinear); #ifdef Q_OS_ANDROID
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTextureGammaLinearToSRGB);
#else
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTextureGammaSRGBToLinear);
#endif
_presentPipeline = gpu::Pipeline::create(program, scissorState); _presentPipeline = gpu::Pipeline::create(program, scissorState);
} }
{
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTexture);
_hudPipeline = gpu::Pipeline::create(program, blendState);
}
{ {
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTextureMirroredX); gpu::ShaderPointer program = gpu::Shader::createProgram(shader::gpu::program::DrawTextureMirroredX);
_mirrorHUDPipeline = gpu::Pipeline::create(program, blendState); _mirrorHUDPipeline = gpu::Pipeline::create(program, blendState);
@ -885,6 +895,7 @@ void OpenGLDisplayPlugin::updateCompositeFramebuffer() {
auto renderSize = glm::uvec2(getRecommendedRenderSize()); auto renderSize = glm::uvec2(getRecommendedRenderSize());
if (!_compositeFramebuffer || _compositeFramebuffer->getSize() != renderSize) { if (!_compositeFramebuffer || _compositeFramebuffer->getSize() != renderSize) {
_compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("OpenGLDisplayPlugin::composite", gpu::Element::COLOR_RGBA_32, renderSize.x, renderSize.y)); _compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("OpenGLDisplayPlugin::composite", gpu::Element::COLOR_RGBA_32, renderSize.x, renderSize.y));
// _compositeFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("OpenGLDisplayPlugin::composite", gpu::Element::COLOR_SRGBA_32, renderSize.x, renderSize.y));
} }
} }

View file

@ -1,22 +0,0 @@
// OpenGLDisplayPlugin_present.frag
LAYOUT(binding=0) uniform sampler2D colorMap;
layout(location=0) in vec2 varTexCoord0;
layout(location=0) out vec4 outFragColor;
float sRGBFloatToLinear(float value) {
const float SRGB_ELBOW = 0.04045;
return mix(pow((value + 0.055) / 1.055, 2.4), value / 12.92, float(value <= SRGB_ELBOW));
}
vec3 colorToLinearRGB(vec3 srgb) {
return vec3(sRGBFloatToLinear(srgb.r), sRGBFloatToLinear(srgb.g), sRGBFloatToLinear(srgb.b));
}
void main(void) {
outFragColor.a = 1.0;
outFragColor.rgb = colorToLinearRGB(texture(colorMap, varTexCoord0).rgb);
}

View file

@ -1 +0,0 @@
VERTEX gpu::vertex::DrawUnitQuadTexcoord

View file

@ -29,6 +29,13 @@ gpu::PipelinePointer PolyLineEntityRenderer::_glowPipeline = nullptr;
static const QUrl DEFAULT_POLYLINE_TEXTURE = PathUtils::resourcesUrl("images/paintStroke.png"); static const QUrl DEFAULT_POLYLINE_TEXTURE = PathUtils::resourcesUrl("images/paintStroke.png");
#if defined(USE_GLES)
static bool DISABLE_DEFERRED = true;
#else
static const QString RENDER_FORWARD{ "HIFI_RENDER_FORWARD" };
static bool DISABLE_DEFERRED = QProcessEnvironment::systemEnvironment().contains(RENDER_FORWARD);
#endif
PolyLineEntityRenderer::PolyLineEntityRenderer(const EntityItemPointer& entity) : Parent(entity) { PolyLineEntityRenderer::PolyLineEntityRenderer(const EntityItemPointer& entity) : Parent(entity) {
_texture = DependencyManager::get<TextureCache>()->getTexture(DEFAULT_POLYLINE_TEXTURE); _texture = DependencyManager::get<TextureCache>()->getTexture(DEFAULT_POLYLINE_TEXTURE);
@ -44,7 +51,13 @@ PolyLineEntityRenderer::PolyLineEntityRenderer(const EntityItemPointer& entity)
void PolyLineEntityRenderer::buildPipeline() { void PolyLineEntityRenderer::buildPipeline() {
// FIXME: opaque pipeline // FIXME: opaque pipeline
gpu::ShaderPointer program = gpu::Shader::createProgram(shader::entities_renderer::program::paintStroke); gpu::ShaderPointer program;
if (DISABLE_DEFERRED) {
program = gpu::Shader::createProgram(shader::entities_renderer::program::paintStroke_forward);
} else {
program = gpu::Shader::createProgram(shader::entities_renderer::program::paintStroke);
}
{ {
gpu::StatePointer state = gpu::StatePointer(new gpu::State()); gpu::StatePointer state = gpu::StatePointer(new gpu::State());
state->setCullMode(gpu::State::CullMode::CULL_NONE); state->setCullMode(gpu::State::CullMode::CULL_NONE);
@ -170,18 +183,19 @@ void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo
void PolyLineEntityRenderer::updateGeometry() { void PolyLineEntityRenderer::updateGeometry() {
int maxNumVertices = std::min(_points.length(), _normals.length()); int maxNumVertices = std::min(_points.length(), _normals.length());
bool doesStrokeWidthVary = false; bool doesStrokeWidthVary = false;
if (_widths.size() >= 0) { if (_widths.size() > 0) {
float prevWidth = _widths[0];
for (int i = 1; i < maxNumVertices; i++) { for (int i = 1; i < maxNumVertices; i++) {
float width = PolyLineEntityItem::DEFAULT_LINE_WIDTH; float width = i < _widths.length() ? _widths[i] : PolyLineEntityItem::DEFAULT_LINE_WIDTH;
if (i < _widths.length()) { if (width != prevWidth) {
width = _widths[i];
}
if (width != _widths[i - 1]) {
doesStrokeWidthVary = true; doesStrokeWidthVary = true;
break; break;
} }
if (i > _widths.length() + 1) {
break;
}
prevWidth = width;
} }
} }
@ -193,12 +207,13 @@ void PolyLineEntityRenderer::updateGeometry() {
std::vector<PolylineVertex> vertices; std::vector<PolylineVertex> vertices;
vertices.reserve(maxNumVertices); vertices.reserve(maxNumVertices);
for (int i = 0; i < maxNumVertices; i++) { for (int i = 0; i < maxNumVertices; i++) {
// Position // Position
glm::vec3 point = _points[i]; glm::vec3 point = _points[i];
// uCoord // uCoord
float width = i < _widths.size() ? _widths[i] : PolyLineEntityItem::DEFAULT_LINE_WIDTH; float width = i < _widths.size() ? _widths[i] : PolyLineEntityItem::DEFAULT_LINE_WIDTH;
if (i > 0) { // First uCoord is 0.0f if (i > 0) { // First uCoord is 0.0f
if (!_isUVModeStretch) { if (!_isUVModeStretch) {
accumulatedDistance += glm::distance(point, _points[i - 1]); accumulatedDistance += glm::distance(point, _points[i - 1]);

View file

@ -30,6 +30,13 @@ using namespace render::entities;
// is a half unit sphere. However, the geometry cache renders a UNIT sphere, so we need to scale down. // is a half unit sphere. However, the geometry cache renders a UNIT sphere, so we need to scale down.
static const float SPHERE_ENTITY_SCALE = 0.5f; static const float SPHERE_ENTITY_SCALE = 0.5f;
#if defined(USE_GLES)
static bool DISABLE_DEFERRED = true;
#else
static const QString RENDER_FORWARD{ "HIFI_RENDER_FORWARD" };
static bool DISABLE_DEFERRED = QProcessEnvironment::systemEnvironment().contains(RENDER_FORWARD);
#endif
static_assert(shader::render_utils::program::simple != 0, "Validate simple program exists"); static_assert(shader::render_utils::program::simple != 0, "Validate simple program exists");
static_assert(shader::render_utils::program::simple_transparent != 0, "Validate simple transparent program exists"); static_assert(shader::render_utils::program::simple_transparent != 0, "Validate simple transparent program exists");
@ -276,7 +283,7 @@ void ShapeEntityRenderer::doRender(RenderArgs* args) {
// FIXME, support instanced multi-shape rendering using multidraw indirect // FIXME, support instanced multi-shape rendering using multidraw indirect
outColor.a *= _isFading ? Interpolate::calculateFadeRatio(_fadeStartTime) : 1.0f; outColor.a *= _isFading ? Interpolate::calculateFadeRatio(_fadeStartTime) : 1.0f;
render::ShapePipelinePointer pipeline; render::ShapePipelinePointer pipeline;
if (_renderLayer == RenderLayer::WORLD) { if (_renderLayer == RenderLayer::WORLD && !DISABLE_DEFERRED) {
pipeline = outColor.a < 1.0f ? geometryCache->getTransparentShapePipeline() : geometryCache->getOpaqueShapePipeline(); pipeline = outColor.a < 1.0f ? geometryCache->getTransparentShapePipeline() : geometryCache->getOpaqueShapePipeline();
} else { } else {
pipeline = outColor.a < 1.0f ? geometryCache->getForwardTransparentShapePipeline() : geometryCache->getForwardOpaqueShapePipeline(); pipeline = outColor.a < 1.0f ? geometryCache->getForwardTransparentShapePipeline() : geometryCache->getForwardOpaqueShapePipeline();

View file

@ -0,0 +1 @@
VERTEX paintStroke

View file

@ -0,0 +1,35 @@
<@include gpu/Config.slh@>
<$VERSION_HEADER$>
// Generated on <$_SCRIBE_DATE$>
//
// paintStroke.frag
// fragment shader
//
// Created by Eric Levin on 8/10/2015
// Copyright 2015 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
<@include paintStroke.slh@>
<$declarePolyLineBuffers()$>
LAYOUT(binding=0) uniform sampler2D _texture;
layout(location=0) in vec3 _normalWS;
layout(location=1) in vec2 _texCoord;
layout(location=2) in vec4 _color;
layout(location=3) in float _distanceFromCenter;
layout(location=0) out vec4 _fragColor0;
void main(void) {
vec4 texel = texture(_texture, _texCoord);
int frontCondition = 1 - 2 * int(gl_FrontFacing);
vec3 color = _color.rgb * texel.rgb;
float alpha = texel.a * _color.a;
alpha *= mix(1.0, pow(1.0 - abs(_distanceFromCenter), 10.0), _polylineData.faceCameraGlow.y);
_fragColor0 = vec4(color, alpha);
}

View file

@ -16,20 +16,39 @@
// YCoCg =====> Luma (Y) chrominance green (Cg) and chrominance orange (Co) // YCoCg =====> Luma (Y) chrominance green (Cg) and chrominance orange (Co)
// https://software.intel.com/en-us/node/503873 // https://software.intel.com/en-us/node/503873
// sRGB ====> Linear
float color_scalar_sRGBToLinear(float value) { float color_scalar_sRGBToLinear(float value) {
const float SRGB_ELBOW = 0.04045; // Same as pow(value, 2.2)
return mix(pow((value + 0.055) / 1.055, 2.4), value / 12.92, float(value <= 0.04045));
return mix(pow((value + 0.055) / 1.055, 2.4), value / 12.92, float(value <= SRGB_ELBOW));
} }
vec3 color_sRGBToLinear(vec3 srgb) { vec3 color_sRGBToLinear(vec3 srgb) {
return vec3(color_scalar_sRGBToLinear(srgb.r), color_scalar_sRGBToLinear(srgb.g), color_scalar_sRGBToLinear(srgb.b)); // return vec3(color_scalar_sRGBToLinear(srgb.r), color_scalar_sRGBToLinear(srgb.g), color_scalar_sRGBToLinear(srgb.b));
// Same as pow(value, 2.2)
return mix(pow((srgb + vec3(0.055)) / vec3(1.055), vec3(2.4)), srgb / vec3(12.92), vec3(lessThanEqual(srgb, vec3(0.04045))));
} }
vec4 color_sRGBAToLinear(vec4 srgba) { vec4 color_sRGBAToLinear(vec4 srgba) {
return vec4(color_sRGBToLinear(srgba.xyz), srgba.w); return vec4(color_sRGBToLinear(srgba.xyz), srgba.w);
} }
// Linear ====> sRGB
float color_scalar_LinearTosRGB(float value) {
// Same as return pow(value, 1/2.2)
return mix(1.055 * pow(value, 0.41666) - 0.055, value * 12.92, float(value < 0.0031308));
}
vec3 color_LinearTosRGB(vec3 lrgb) {
// Same as return pow(lrgb, 1/2.2)
// return vec3(color_scalar_LinearTosRGB(lrgb.r), color_scalar_LinearTosRGB(lrgb.g), color_scalar_LinearTosRGB(lrgb.b));
return mix(vec3(1.055) * pow(vec3(lrgb), vec3(0.41666)) - vec3(0.055), vec3(lrgb) * vec3(12.92), vec3(lessThan(lrgb, vec3(0.0031308))));
}
vec4 color_LinearTosRGBA(vec4 lrgba) {
return vec4(color_LinearTosRGB(lrgba.xyz), lrgba.w);
}
vec3 color_LinearToYCoCg(vec3 rgb) { vec3 color_LinearToYCoCg(vec3 rgb) {
// Y = R/4 + G/2 + B/4 // Y = R/4 + G/2 + B/4
// Co = R/2 - B/2 // Co = R/2 - B/2

View file

@ -0,0 +1,26 @@
<@include gpu/Config.slh@>
<$VERSION_HEADER$>
// Generated on <$_SCRIBE_DATE$>
//
// DrawTextureGammaLinearToSRGB.frag
//
// Draw texture 0 fetched at texcoord.xy, and apply linear to sRGB color space conversion
//
// Created by Sam Gateau on 2/24/2019
// Copyright 2019 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
<@include gpu/Color.slh@>
LAYOUT(binding=0) uniform sampler2D colorMap;
layout(location=0) in vec2 varTexCoord0;
layout(location=0) out vec4 outFragColor;
void main(void) {
outFragColor = color_LinearTosRGBA(texture(colorMap, varTexCoord0));
}

View file

@ -0,0 +1 @@
VERTEX DrawUnitQuadTexcoord

View file

@ -0,0 +1,26 @@
<@include gpu/Config.slh@>
<$VERSION_HEADER$>
// Generated on <$_SCRIBE_DATE$>
//
// DrawTextureGammaSRGBToLinear.frag
//
// Draw texture 0 fetched at texcoord.xy, and apply sRGB to Linear color space conversion
//
// Created by Sam Gateau on 2/24/2019
// Copyright 2019 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
<@include gpu/Color.slh@>
LAYOUT(binding=0) uniform sampler2D colorMap;
layout(location=0) in vec2 varTexCoord0;
layout(location=0) out vec4 outFragColor;
void main(void) {
outFragColor = color_sRGBAToLinear(texture(colorMap, varTexCoord0));
}

View file

@ -0,0 +1 @@
VERTEX DrawUnitQuadTexcoord

View file

@ -32,18 +32,19 @@ void Framebuffer::create(const glm::uvec2& size) {
_validTexture = false; _validTexture = false;
// Depth renderbuffer // Depth renderbuffer
glGenRenderbuffers(1, &_depth); /* glGenRenderbuffers(1, &_depth);
glBindRenderbuffer(GL_RENDERBUFFER, _depth); glBindRenderbuffer(GL_RENDERBUFFER, _depth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, _size.x, _size.y); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, _size.x, _size.y);
glBindRenderbuffer(GL_RENDERBUFFER, 0); glBindRenderbuffer(GL_RENDERBUFFER, 0);
*/
// Framebuffer // Framebuffer
glGenFramebuffers(1, &_fbo); glGenFramebuffers(1, &_fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo); // glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depth); // glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depth);
glBindFramebuffer(GL_FRAMEBUFFER, 0); // glBindFramebuffer(GL_FRAMEBUFFER, 0);
_swapChain = vrapi_CreateTextureSwapChain3(VRAPI_TEXTURE_TYPE_2D, GL_RGBA8, _size.x, _size.y, 1, 3); _swapChain = vrapi_CreateTextureSwapChain3(VRAPI_TEXTURE_TYPE_2D, GL_RGBA8, _size.x, _size.y, 1, 3);
_length = vrapi_GetTextureSwapChainLength(_swapChain); _length = vrapi_GetTextureSwapChainLength(_swapChain);
if (!_length) { if (!_length) {
__android_log_write(ANDROID_LOG_WARN, "QQQ_OVR", "Unable to count swap chain textures"); __android_log_write(ANDROID_LOG_WARN, "QQQ_OVR", "Unable to count swap chain textures");

View file

@ -140,7 +140,11 @@ struct VrSurface : public TaskQueue {
if (vrReady != vrRunning) { if (vrReady != vrRunning) {
if (vrRunning) { if (vrRunning) {
__android_log_write(ANDROID_LOG_WARN, "QQQ_OVR", "vrapi_LeaveVrMode"); __android_log_write(ANDROID_LOG_WARN, "QQQ_OVR", "vrapi_LeaveVrMode");
vrapi_SetClockLevels(session, 1, 1);
vrapi_SetExtraLatencyMode(session, VRAPI_EXTRA_LATENCY_MODE_OFF);
vrapi_SetDisplayRefreshRate(session, 60);
vrapi_LeaveVrMode(session); vrapi_LeaveVrMode(session);
session = nullptr; session = nullptr;
oculusActivity = nullptr; oculusActivity = nullptr;
} else { } else {

View file

@ -121,6 +121,7 @@ QRectF OculusMobileDisplayPlugin::getPlayAreaRect() {
glm::mat4 OculusMobileDisplayPlugin::getEyeProjection(Eye eye, const glm::mat4& baseProjection) const { glm::mat4 OculusMobileDisplayPlugin::getEyeProjection(Eye eye, const glm::mat4& baseProjection) const {
glm::mat4 result = baseProjection; glm::mat4 result = baseProjection;
VrHandler::withOvrMobile([&](ovrMobile* session){ VrHandler::withOvrMobile([&](ovrMobile* session){
auto trackingState = vrapi_GetPredictedTracking2(session, 0.0); auto trackingState = vrapi_GetPredictedTracking2(session, 0.0);
result = ovr::Fov{ trackingState.Eye[eye].ProjectionMatrix }.withZ(baseProjection); result = ovr::Fov{ trackingState.Eye[eye].ProjectionMatrix }.withZ(baseProjection);
@ -130,15 +131,19 @@ glm::mat4 OculusMobileDisplayPlugin::getEyeProjection(Eye eye, const glm::mat4&
glm::mat4 OculusMobileDisplayPlugin::getCullingProjection(const glm::mat4& baseProjection) const { glm::mat4 OculusMobileDisplayPlugin::getCullingProjection(const glm::mat4& baseProjection) const {
glm::mat4 result = baseProjection; glm::mat4 result = baseProjection;
VrHandler::withOvrMobile([&](ovrMobile* session){ VrHandler::withOvrMobile([&](ovrMobile* session){
auto trackingState = vrapi_GetPredictedTracking2(session, 0.0); auto trackingState = vrapi_GetPredictedTracking2(session, 0.0);
ovr::Fov fovs[2]; ovr::Fov fovs[2];
for (size_t i = 0; i < 2; ++i) { for (size_t i = 0; i < 2; ++i) {
fovs[i].extract(trackingState.Eye[i].ProjectionMatrix); fovs[i].extract(trackingState.Eye[i].ProjectionMatrix);
} }
fovs[0].extend(fovs[1]); fovs[0].extend(fovs[1]);
return fovs[0].withZ(baseProjection); result= glm::scale( fovs[0].withZ(baseProjection),glm::vec3(1.5f));
return result;
}); });
return result; return result;
} }
@ -168,10 +173,8 @@ bool OculusMobileDisplayPlugin::isHmdMounted() const {
static void goToDevMobile() { static void goToDevMobile() {
auto addressManager = DependencyManager::get<AddressManager>(); auto addressManager = DependencyManager::get<AddressManager>();
auto currentAddress = addressManager->currentAddress().toString().toStdString(); auto currentAddress = addressManager->currentAddress().toString().toStdString();
if (std::string::npos == currentAddress.find("dev-mobile")) { if (std::string::npos == currentAddress.find("quest-dev")) {
addressManager->handleLookupString("hifi://dev-mobile/495.236,501.017,482.434/0,0.97452,0,-0.224301"); addressManager->handleLookupString("hifi://quest-dev");
//addressManager->handleLookupString("hifi://dev-mobile/504,498,491/0,0,0,0");
//addressManager->handleLookupString("hifi://dev-mobile/0,-1,1");
} }
} }
@ -217,12 +220,12 @@ bool OculusMobileDisplayPlugin::beginFrameRender(uint32_t frameIndex) {
}); });
} }
// static uint32_t count = 0; // static uint32_t count = 0;
// if ((++count % 1000) == 0) { // if ((++count % 1000) == 0) {
// AbstractViewStateInterface::instance()->postLambdaEvent([] { // AbstractViewStateInterface::instance()->postLambdaEvent([] {
// goToDevMobile(); // goToDevMobile();
// }); // });
// } // }
return result && Parent::beginFrameRender(frameIndex); return result && Parent::beginFrameRender(frameIndex);
} }

View file

@ -96,13 +96,6 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend
// draw a stencil mask in hidden regions of the framebuffer. // draw a stencil mask in hidden regions of the framebuffer.
task.addJob<PrepareStencil>("PrepareStencil", framebuffer); task.addJob<PrepareStencil>("PrepareStencil", framebuffer);
// Layered
const auto nullJitter = Varying(glm::vec2(0.0f, 0.0f));
const auto inFrontOpaquesInputs = DrawLayered3D::Inputs(inFrontOpaque, lightingModel, nullJitter).asVarying();
const auto inFrontTransparentsInputs = DrawLayered3D::Inputs(inFrontTransparent, lightingModel, nullJitter).asVarying();
task.addJob<DrawLayered3D>("DrawInFrontOpaque", inFrontOpaquesInputs, true);
task.addJob<DrawLayered3D>("DrawInFrontTransparent", inFrontTransparentsInputs, false);
// Draw opaques forward // Draw opaques forward
const auto opaqueInputs = DrawForward::Inputs(opaques, lightingModel).asVarying(); const auto opaqueInputs = DrawForward::Inputs(opaques, lightingModel).asVarying();
task.addJob<DrawForward>("DrawOpaques", opaqueInputs, shapePlumber); task.addJob<DrawForward>("DrawOpaques", opaqueInputs, shapePlumber);
@ -115,6 +108,13 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend
const auto transparentInputs = DrawForward::Inputs(transparents, lightingModel).asVarying(); const auto transparentInputs = DrawForward::Inputs(transparents, lightingModel).asVarying();
task.addJob<DrawForward>("DrawTransparents", transparentInputs, shapePlumber); task.addJob<DrawForward>("DrawTransparents", transparentInputs, shapePlumber);
// Layered
const auto nullJitter = Varying(glm::vec2(0.0f, 0.0f));
const auto inFrontOpaquesInputs = DrawLayered3D::Inputs(inFrontOpaque, lightingModel, nullJitter).asVarying();
const auto inFrontTransparentsInputs = DrawLayered3D::Inputs(inFrontTransparent, lightingModel, nullJitter).asVarying();
task.addJob<DrawLayered3D>("DrawInFrontOpaque", inFrontOpaquesInputs, true);
task.addJob<DrawLayered3D>("DrawInFrontTransparent", inFrontTransparentsInputs, false);
{ // Debug the bounds of the rendered items, still look at the zbuffer { // Debug the bounds of the rendered items, still look at the zbuffer
task.addJob<DrawBounds>("DrawMetaBounds", metas); task.addJob<DrawBounds>("DrawMetaBounds", metas);

View file

@ -14,8 +14,8 @@
var DEFAULT_SCRIPTS_COMBINED = [ var DEFAULT_SCRIPTS_COMBINED = [
"system/request-service.js", "system/request-service.js",
"system/progress.js", "system/progress.js",
//"system/away.js", "system/away.js",
"system/hmd.js", //"system/hmd.js",
"system/menu.js", "system/menu.js",
"system/bubble.js", "system/bubble.js",
"system/pal.js", // "system/mod.js", // older UX, if you prefer "system/pal.js", // "system/mod.js", // older UX, if you prefer
@ -25,6 +25,7 @@ var DEFAULT_SCRIPTS_COMBINED = [
"system/notifications.js", "system/notifications.js",
"system/commerce/wallet.js", "system/commerce/wallet.js",
"system/dialTone.js", "system/dialTone.js",
"system/marketplaces/marketplaces.js",
"system/quickGoto.js", "system/quickGoto.js",
"system/firstPersonHMD.js", "system/firstPersonHMD.js",
"system/tablet-ui/tabletUI.js", "system/tablet-ui/tabletUI.js",

View file

@ -148,6 +148,27 @@ Rectangle {
} }
} }
Separator {} Separator {}
Column {
anchors.left: parent.left
anchors.right: parent.right
spacing: 5
Repeater {
model: [ "MSAA:PrepareFramebuffer:numSamples:4:1"
]
ConfigSlider {
label: qsTr(modelData.split(":")[0])
integral: true
config: render.mainViewTask.getConfig(modelData.split(":")[1])
property: modelData.split(":")[2]
max: modelData.split(":")[3]
min: modelData.split(":")[4]
anchors.left: parent.left
anchors.right: parent.right
}
}
}
Separator {}
Item { Item {
height: childrenRect.height height: childrenRect.height

View file

@ -154,7 +154,7 @@ function goAway(fromStartup) {
if (!isEnabled || isAway) { if (!isEnabled || isAway) {
return; return;
} }
// If we're entering away mode from some other state than startup, then we create our move timer immediately. // If we're entering away mode from some other state than startup, then we create our move timer immediately.
// However if we're just stating up, we need to delay this process so that we don't think the initial teleport // However if we're just stating up, we need to delay this process so that we don't think the initial teleport
// is actually a move. // is actually a move.

View file

@ -2,6 +2,7 @@ High Fidelity, Inc.
Avatar Exporter Avatar Exporter
Version 0.2 Version 0.2
Note: It is recommended to use Unity versions between 2017.4.17f1 and 2018.2.12f1 for this Avatar Exporter. Note: It is recommended to use Unity versions between 2017.4.17f1 and 2018.2.12f1 for this Avatar Exporter.
To create a new avatar project: To create a new avatar project: