From 440ba7a6de63779422944ed7933e1da5e8448c27 Mon Sep 17 00:00:00 2001 From: Cristian Duarte Date: Tue, 12 Jun 2018 19:46:59 -0300 Subject: [PATCH 01/68] Add a friends fragment and expose the access token to java --- android/app/src/main/cpp/native.cpp | 11 +++++ .../hifiinterface/MainActivity.java | 13 ++++++ .../fragment/FriendsFragment.java | 40 +++++++++++++++++++ .../src/main/res/layout/fragment_friends.xml | 9 +++++ .../app/src/main/res/menu/menu_navigation.xml | 4 ++ android/app/src/main/res/values/strings.xml | 1 + 6 files changed, 78 insertions(+) create mode 100644 android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java create mode 100644 android/app/src/main/res/layout/fragment_friends.xml diff --git a/android/app/src/main/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index 437505be3f..3e3fb8f0b5 100644 --- a/android/app/src/main/cpp/native.cpp +++ b/android/app/src/main/cpp/native.cpp @@ -252,6 +252,17 @@ Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeLogin(JNIEnv *en Q_ARG(const QString&, username), Q_ARG(const QString&, password)); } +JNIEXPORT jboolean JNICALL +Java_io_highfidelity_hifiinterface_fragment_FriendsFragment_nativeIsLoggedIn(JNIEnv *env, jobject instance) { + return AndroidHelper::instance().getAccountManager()->isLoggedIn(); +} + +JNIEXPORT jstring JNICALL +Java_io_highfidelity_hifiinterface_fragment_FriendsFragment_nativeGetAccessToken(JNIEnv *env, jobject instance) { + auto accountManager = AndroidHelper::instance().getAccountManager(); + return env->NewStringUTF(accountManager->getAccountInfo().getAccessToken().token.toLatin1().data()); +} + JNIEXPORT void JNICALL Java_io_highfidelity_hifiinterface_SplashActivity_registerLoadCompleteListener(JNIEnv *env, jobject instance) { diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java index 54161f60c6..8bb84168a5 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -29,6 +29,7 @@ import android.widget.TextView; import com.squareup.picasso.Callback; import com.squareup.picasso.Picasso; +import io.highfidelity.hifiinterface.fragment.FriendsFragment; import io.highfidelity.hifiinterface.fragment.HomeFragment; import io.highfidelity.hifiinterface.fragment.LoginFragment; import io.highfidelity.hifiinterface.fragment.PolicyFragment; @@ -114,6 +115,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On case "Privacy Policy": loadPrivacyPolicyFragment(); break; + case "Friends": + loadFriendsFragment(); + break; default: Log.e(TAG, "Unknown fragment " + fragment); } @@ -137,6 +141,12 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On loadFragment(fragment, getString(R.string.privacyPolicy), true); } + private void loadFriendsFragment() { + Fragment fragment = FriendsFragment.newInstance(); + + loadFragment(fragment, getString(R.string.friends), true); + } + private void loadFragment(Fragment fragment, String title, boolean addToBackStack) { FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction ft = fragmentManager.beginTransaction(); @@ -202,6 +212,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On case R.id.action_home: loadHomeFragment(); return true; + case R.id.action_friends: + loadFriendsFragment(); + return true; } return false; } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java new file mode 100644 index 0000000000..64c02505cb --- /dev/null +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java @@ -0,0 +1,40 @@ +package io.highfidelity.hifiinterface.fragment; + + +import android.app.Fragment; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import io.highfidelity.hifiinterface.R; + +public class FriendsFragment extends Fragment { + + public native boolean nativeIsLoggedIn(); + + public native String nativeGetAccessToken(); + + public FriendsFragment() { + // Required empty public constructor + } + + public static FriendsFragment newInstance() { + FriendsFragment fragment = new FriendsFragment(); + return fragment; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_friends, container, false); + + String accessToken = nativeGetAccessToken(); + + Log.d("[TOKENX]", "token : [" + accessToken + "]"); + + return rootView; + } + +} diff --git a/android/app/src/main/res/layout/fragment_friends.xml b/android/app/src/main/res/layout/fragment_friends.xml new file mode 100644 index 0000000000..347d7ffe24 --- /dev/null +++ b/android/app/src/main/res/layout/fragment_friends.xml @@ -0,0 +1,9 @@ + + + + diff --git a/android/app/src/main/res/menu/menu_navigation.xml b/android/app/src/main/res/menu/menu_navigation.xml index cf80c84177..de496bc4cb 100644 --- a/android/app/src/main/res/menu/menu_navigation.xml +++ b/android/app/src/main/res/menu/menu_navigation.xml @@ -5,4 +5,8 @@ android:id="@+id/action_home" android:title="@string/home" /> + diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 4f5f29e671..e29252c2c0 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,6 +1,7 @@ Interface Home + Friends Open in browser Share link Shared a link From 929f6f3059817fad5313aa8f8707fe074e412f3e Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 13 Jun 2018 16:37:05 -0700 Subject: [PATCH 02/68] Only try to sign a Win installer if we have a private key file --- cmake/templates/NSIS.template.in | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmake/templates/NSIS.template.in b/cmake/templates/NSIS.template.in index fc9b9ab03d..0cbe10f231 100644 --- a/cmake/templates/NSIS.template.in +++ b/cmake/templates/NSIS.template.in @@ -130,7 +130,11 @@ ; The Inner invocation has written an uninstaller binary for us. ; We need to sign it if it's a production or PR build. !if @PRODUCTION_BUILD@ == 1 - !system '"@SIGNTOOL_EXECUTABLE@" sign /fd sha256 /f %HF_PFX_FILE% /p %HF_PFX_PASSPHRASE% /tr http://tsa.starfieldtech.com /td SHA256 $%TEMP%\@UNINSTALLER_NAME@' = 0 + !if /FileExists "$%HF_PFX_FILE%" + !system '"@SIGNTOOL_EXECUTABLE@" sign /fd sha256 /f %HF_PFX_FILE% /p %HF_PFX_PASSPHRASE% /tr http://tsa.starfieldtech.com /td SHA256 $%TEMP%\@UNINSTALLER_NAME@' = 0 + !else + !warning "No signing file - installer will not be signed" + !endif !endif ; Good. Now we can carry on writing the real installer. From 248be87fa3bb69c4e704f8df3b47dbe426d4a985 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Thu, 14 Jun 2018 15:19:21 -0300 Subject: [PATCH 03/68] Android - First list of friends implementation in List of Friends --- .../fragment/FriendsFragment.java | 15 +- .../provider/EndpointUsersProvider.java | 130 ++++++++++++++++++ .../hifiinterface/provider/UsersProvider.java | 20 +++ .../hifiinterface/view/UserListAdapter.java | 97 +++++++++++++ .../src/main/res/layout/fragment_friends.xml | 9 ++ android/app/src/main/res/layout/user_item.xml | 26 ++++ 6 files changed, 296 insertions(+), 1 deletion(-) create mode 100644 android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java create mode 100644 android/app/src/main/java/io/highfidelity/hifiinterface/provider/UsersProvider.java create mode 100644 android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java create mode 100644 android/app/src/main/res/layout/user_item.xml diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java index 64c02505cb..e70ecfbc57 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java @@ -3,12 +3,15 @@ package io.highfidelity.hifiinterface.fragment; import android.app.Fragment; import android.os.Bundle; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import io.highfidelity.hifiinterface.R; +import io.highfidelity.hifiinterface.view.UserListAdapter; public class FriendsFragment extends Fragment { @@ -16,6 +19,9 @@ public class FriendsFragment extends Fragment { public native String nativeGetAccessToken(); + private RecyclerView mUsersView; + private UserListAdapter mUsersAdapter; + public FriendsFragment() { // Required empty public constructor } @@ -32,7 +38,14 @@ public class FriendsFragment extends Fragment { String accessToken = nativeGetAccessToken(); - Log.d("[TOKENX]", "token : [" + accessToken + "]"); + Log.d("[USERS]", "token : [" + accessToken + "]"); + + mUsersView = rootView.findViewById(R.id.rvUsers); + int numberOfColumns = 1; + GridLayoutManager gridLayoutMgr = new GridLayoutManager(getContext(), numberOfColumns); + mUsersView.setLayoutManager(gridLayoutMgr); + mUsersAdapter = new UserListAdapter(getContext(), accessToken); + mUsersView.setAdapter(mUsersAdapter); return rootView; } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java new file mode 100644 index 0000000000..3e034b654b --- /dev/null +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java @@ -0,0 +1,130 @@ +package io.highfidelity.hifiinterface.provider; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import io.highfidelity.hifiinterface.view.UserListAdapter; +import okhttp3.Interceptor; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; +import retrofit2.http.GET; +import retrofit2.http.Query; + +/** + * Created by cduarte on 6/13/18. + */ + +public class EndpointUsersProvider implements UsersProvider { + + public static final String BASE_URL = "https://metaverse.highfidelity.com/"; + private final Retrofit mRetrofit; + private final EndpointUsersProviderService mEndpointUsersProviderService; + + public EndpointUsersProvider(String accessToken) { + mRetrofit = createAuthorizedRetrofit(accessToken); + mEndpointUsersProviderService = mRetrofit.create(EndpointUsersProviderService.class); + } + + private Retrofit createAuthorizedRetrofit(String accessToken) { + Retrofit mRetrofit; + OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); + httpClient.addInterceptor(new Interceptor() { + @Override + public Response intercept(Chain chain) throws IOException { + Request original = chain.request(); + + Request request = original.newBuilder() + .header("Authorization", "Bearer " + accessToken) + .method(original.method(), original.body()) + .build(); + + return chain.proceed(request); + } + }); + OkHttpClient client = httpClient.build(); + + mRetrofit = new Retrofit.Builder() + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .client(client) + .build(); + return mRetrofit; + } + + @Override + public void retrieve(UsersCallback usersCallback) { + Call friendsCall = mEndpointUsersProviderService.getUsers( + "friends", + 400, + null); + friendsCall.enqueue(new Callback() { + @Override + public void onResponse(Call call, retrofit2.Response response) { + if (!response.isSuccessful()) { + usersCallback.retrieveError(new Exception("Error calling Users API"), "Error calling Users API"); + return; + } + UsersResponse usersResponse = response.body(); + List adapterUsers = new ArrayList<>(usersResponse.total_entries); + for (User user : usersResponse.data.users) { + UserListAdapter.User adapterUser = new UserListAdapter.User(); + adapterUser.connection = user.connection; + adapterUser.imageUrl = user.images.thumbnail; + adapterUser.name = user.username; + adapterUser.online = user.online; + adapterUsers.add(adapterUser); + } + usersCallback.retrieveOk(adapterUsers); + } + + @Override + public void onFailure(Call call, Throwable t) { + usersCallback.retrieveError(new Exception(t), "Error calling Users API"); + } + }); + } + + public interface EndpointUsersProviderService { + @GET("api/v1/users") + Call getUsers(@Query("filter") String filter, + @Query("per_page") int perPage, + @Query("online") Boolean online); + } + + class UsersResponse { + public UsersResponse() {} + String status; + int current_page; + int total_pages; + int per_page; + int total_entries; + Data data; + } + + class Data { + public Data() {} + List users; + } + + class User { + public User() {} + String username; + boolean online; + String connection; + Images images; + } + + class Images { + public Images() {} + String hero; + String thumbnail; + String tiny; + } + +} diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UsersProvider.java b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UsersProvider.java new file mode 100644 index 0000000000..13ed812ce6 --- /dev/null +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UsersProvider.java @@ -0,0 +1,20 @@ +package io.highfidelity.hifiinterface.provider; + +import java.util.List; + +import io.highfidelity.hifiinterface.view.UserListAdapter; + +/** + * Created by cduarte on 6/13/18. + */ + +public interface UsersProvider { + + void retrieve(UsersProvider.UsersCallback usersCallback); + + interface UsersCallback { + void retrieveOk(List users); + void retrieveError(Exception e, String message); + } + +} diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java new file mode 100644 index 0000000000..32993500fe --- /dev/null +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java @@ -0,0 +1,97 @@ +package io.highfidelity.hifiinterface.view; + +import android.content.Context; +import android.net.Uri; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.squareup.picasso.Picasso; + +import java.util.ArrayList; +import java.util.List; + +import io.highfidelity.hifiinterface.R; +import io.highfidelity.hifiinterface.provider.EndpointUsersProvider; +import io.highfidelity.hifiinterface.provider.UsersProvider; + +/** + * Created by cduarte on 6/13/18. + */ + +public class UserListAdapter extends RecyclerView.Adapter { + + private UsersProvider mProvider; + private LayoutInflater mInflater; + private Context mContext; + private List mUsers = new ArrayList<>(); + + public UserListAdapter(Context c, String accessToken) { + mContext = c; + mInflater = LayoutInflater.from(mContext); + mProvider = new EndpointUsersProvider(accessToken); + loadUsers(); + } + + private void loadUsers() { + mProvider.retrieve(new UsersProvider.UsersCallback() { + @Override + public void retrieveOk(List users) { + mUsers = new ArrayList<>(users); + notifyDataSetChanged(); + } + + @Override + public void retrieveError(Exception e, String message) { + Log.e("[USERS]", message, e); + } + }); + } + + @Override + public UserListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = mInflater.inflate(R.layout.user_item, parent, false); + return new UserListAdapter.ViewHolder(view); + } + + @Override + public void onBindViewHolder(UserListAdapter.ViewHolder holder, int position) { + User aUser = mUsers.get(position); + holder.mUsername.setText(aUser.name); + holder.mOnline.setText(aUser.online?"ONLINE":"OFFLINE"); + Uri uri = Uri.parse(aUser.imageUrl); + Picasso.get().load(uri).into(holder.mImage); + } + + @Override + public int getItemCount() { + return mUsers.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + + TextView mUsername; + TextView mOnline; + ImageView mImage; + + public ViewHolder(View itemView) { + super(itemView); + mUsername = itemView.findViewById(R.id.userName); + mOnline = itemView.findViewById(R.id.userOnline); + mImage = itemView.findViewById(R.id.userImage); + } + } + + public static class User { + public String name; + public String imageUrl; + public String connection; + public boolean online; + + public User() {} + } +} diff --git a/android/app/src/main/res/layout/fragment_friends.xml b/android/app/src/main/res/layout/fragment_friends.xml index 347d7ffe24..8129f5d53c 100644 --- a/android/app/src/main/res/layout/fragment_friends.xml +++ b/android/app/src/main/res/layout/fragment_friends.xml @@ -6,4 +6,13 @@ android:layout_height="match_parent" android:background="@color/backgroundLight"> + + diff --git a/android/app/src/main/res/layout/user_item.xml b/android/app/src/main/res/layout/user_item.xml new file mode 100644 index 0000000000..043c9161de --- /dev/null +++ b/android/app/src/main/res/layout/user_item.xml @@ -0,0 +1,26 @@ + + + + + + + + + \ No newline at end of file From 61d1bf7bf7e7ae2e203604f1dd2e94f12efd478e Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Thu, 14 Jun 2018 21:06:40 -0300 Subject: [PATCH 04/68] Android - Show names of screens when going back in the Main screen (Home-Login-Friends) --- .../io/highfidelity/hifiinterface/MainActivity.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java index 8bb84168a5..d1ac6d5ec8 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -126,7 +126,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On private void loadHomeFragment() { Fragment fragment = HomeFragment.newInstance(); - loadFragment(fragment, getString(R.string.home), false); + loadFragment(fragment, getString(R.string.home), true); } private void loadLoginFragment() { @@ -152,7 +152,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On FragmentTransaction ft = fragmentManager.beginTransaction(); ft.replace(R.id.content_frame, fragment); if (addToBackStack) { - ft.addToBackStack(null); + ft.addToBackStack(title); } ft.commit(); setTitle(title); @@ -298,8 +298,12 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On @Override public void onBackPressed() { int index = getFragmentManager().getBackStackEntryCount() - 1; - if (index > -1) { + if (index > 0) { super.onBackPressed(); + index--; + if (index > -1) { + setTitle(getFragmentManager().getBackStackEntryAt(index).getName()); + } if (backToScene) { backToScene = false; goToLastLocation(); From cdca20101bcb68eff82812b12d9e618afe867951 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Tue, 31 Jul 2018 14:37:51 -0300 Subject: [PATCH 05/68] Not an accountManager in AndroidHelper anymore --- android/app/src/main/cpp/native.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index def706c128..9f0e088157 100644 --- a/android/app/src/main/cpp/native.cpp +++ b/android/app/src/main/cpp/native.cpp @@ -287,12 +287,13 @@ Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeLogin(JNIEnv *en JNIEXPORT jboolean JNICALL Java_io_highfidelity_hifiinterface_fragment_FriendsFragment_nativeIsLoggedIn(JNIEnv *env, jobject instance) { - return AndroidHelper::instance().getAccountManager()->isLoggedIn(); + auto accountManager = DependencyManager::get(); + return accountManager->isLoggedIn(); } JNIEXPORT jstring JNICALL Java_io_highfidelity_hifiinterface_fragment_FriendsFragment_nativeGetAccessToken(JNIEnv *env, jobject instance) { - auto accountManager = AndroidHelper::instance().getAccountManager(); + auto accountManager = DependencyManager::get(); return env->NewStringUTF(accountManager->getAccountInfo().getAccessToken().token.toLatin1().data()); } From dc5da4e22bba51567e218fcec92813f6e435ee7f Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 1 Aug 2018 16:35:14 -0700 Subject: [PATCH 06/68] Add cmake variable BYPASS_SIGNING to control signing-file behaviour --- cmake/macros/SetPackagingParameters.cmake | 4 ++++ cmake/templates/CPackProperties.cmake.in | 1 + cmake/templates/NSIS.template.in | 6 +++--- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cmake/macros/SetPackagingParameters.cmake b/cmake/macros/SetPackagingParameters.cmake index 2c8443d510..89899bd669 100644 --- a/cmake/macros/SetPackagingParameters.cmake +++ b/cmake/macros/SetPackagingParameters.cmake @@ -51,6 +51,10 @@ macro(SET_PACKAGING_PARAMETERS) set(USE_STABLE_GLOBAL_SERVICES 1) endif () + if (NOT BYPASS_SIGNING) + set(BYPASS_SIGNING 0) + endif () + elseif (RELEASE_TYPE STREQUAL "PR") set(DEPLOY_PACKAGE TRUE) set(PR_BUILD 1) diff --git a/cmake/templates/CPackProperties.cmake.in b/cmake/templates/CPackProperties.cmake.in index 68fa098508..1d7effd18f 100644 --- a/cmake/templates/CPackProperties.cmake.in +++ b/cmake/templates/CPackProperties.cmake.in @@ -50,3 +50,4 @@ set(SERVER_COMPONENT_CONDITIONAL "@SERVER_COMPONENT_CONDITIONAL@") set(CLIENT_COMPONENT_CONDITIONAL "@CLIENT_COMPONENT_CONDITIONAL@") set(INSTALLER_TYPE "@INSTALLER_TYPE@") set(APP_USER_MODEL_ID "@APP_USER_MODEL_ID@") +set(BYPASS_SIGNING "@BYPASS_SIGNING@") diff --git a/cmake/templates/NSIS.template.in b/cmake/templates/NSIS.template.in index ebefe829ed..7f6884f478 100644 --- a/cmake/templates/NSIS.template.in +++ b/cmake/templates/NSIS.template.in @@ -130,10 +130,10 @@ ; The Inner invocation has written an uninstaller binary for us. ; We need to sign it if it's a production or PR build. !if @PRODUCTION_BUILD@ == 1 - !if /FileExists "$%HF_PFX_FILE%" - !system '"@SIGNTOOL_EXECUTABLE@" sign /fd sha256 /f %HF_PFX_FILE% /p %HF_PFX_PASSPHRASE% /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp /td SHA256 $%TEMP%\@UNINSTALLER_NAME@' = 0 + !if @BYPASS_SIGNING@ == 1 + !warning "BYPASS_SIGNING set - installer will not be signed" !else - !warning "No signing file - installer will not be signed" + !system '"@SIGNTOOL_EXECUTABLE@" sign /fd sha256 /f %HF_PFX_FILE% /p %HF_PFX_PASSPHRASE% /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp /td SHA256 $%TEMP%\@UNINSTALLER_NAME@' = 0 !endif !endif From 790fb43b420cf03bdbcdb49a09048491d80e37dd Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 7 Aug 2018 11:34:05 -0700 Subject: [PATCH 07/68] Start of safe landing client work --- .../src/octree/OctreePacketProcessor.cpp | 3 +++ interface/src/octree/OctreePacketProcessor.h | 5 +++- interface/src/octree/SafeLanding.cpp | 17 ++++++++++++ interface/src/octree/SafeLanding.h | 26 +++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 interface/src/octree/SafeLanding.cpp create mode 100644 interface/src/octree/SafeLanding.h diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 063b07f699..52885e8902 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -16,6 +16,7 @@ #include "Application.h" #include "Menu.h" #include "SceneScriptingInterface.h" +#include "SafeLanding.h" OctreePacketProcessor::OctreePacketProcessor() { setObjectName("Octree Packet Processor"); @@ -26,6 +27,8 @@ OctreePacketProcessor::OctreePacketProcessor() { packetReceiver.registerDirectListenerForTypes(octreePackets, this, "handleOctreePacket"); } +OctreePacketProcessor::~OctreePacketProcessor() { } + void OctreePacketProcessor::handleOctreePacket(QSharedPointer message, SharedNodePointer senderNode) { queueReceivedPacket(message, senderNode); } diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index edba48a238..866a59eaa6 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -15,12 +15,15 @@ #include #include +class SafeLanding; + /// Handles processing of incoming voxel packets for the interface application. As with other ReceivedPacketProcessor classes /// the user is responsible for reading inbound packets and adding them to the processing queue by calling queueReceivedPacket() class OctreePacketProcessor : public ReceivedPacketProcessor { Q_OBJECT public: OctreePacketProcessor(); + ~OctreePacketProcessor(); bool octreeSequenceIsComplete(int sequenceNumber) const; @@ -39,6 +42,6 @@ private slots: private: static constexpr int INVALID_SEQUENCE = -1; std::atomic _completionSequenceNumber { INVALID_SEQUENCE }; - + std::unique_ptr _safeLanding; }; #endif // hifi_OctreePacketProcessor_h diff --git a/interface/src/octree/SafeLanding.cpp b/interface/src/octree/SafeLanding.cpp new file mode 100644 index 0000000000..c4a2fa13e9 --- /dev/null +++ b/interface/src/octree/SafeLanding.cpp @@ -0,0 +1,17 @@ +// +// SafeLanding.cpp +// interface/src/octree +// +// Created by Simon Walton. +// Copyright 2018 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 "SafeLanding.h" + +SafeLanding::SafeLanding() { +} + +SafeLanding::~SafeLanding() { } diff --git a/interface/src/octree/SafeLanding.h b/interface/src/octree/SafeLanding.h new file mode 100644 index 0000000000..af13ef7539 --- /dev/null +++ b/interface/src/octree/SafeLanding.h @@ -0,0 +1,26 @@ +// +// SafeLanding.h +// interface/src/octree +// +// Created by Simon Walton. +// Copyright 2018 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 +// + +// Controller for logic to wait for local collision bodies before enabling physics. + +#ifndef hifi_SafeLanding_h +#define hifi_SafeLanding_h + +class SafeLanding { +public: + SafeLanding(); + ~SafeLanding(); + +private: + +}; + +#endif // hifi_SafeLanding_h From 1a261bea04c5c4065d17dcd08e16f9eff5691e68 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 8 Aug 2018 15:41:28 -0300 Subject: [PATCH 08/68] Android - People screen renaming --- .../io/highfidelity/hifiinterface/MainActivity.java | 12 ++++++------ android/app/src/main/res/menu/menu_navigation.xml | 4 ++-- android/app/src/main/res/values/strings.xml | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java index d1ac6d5ec8..220a69381d 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -115,8 +115,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On case "Privacy Policy": loadPrivacyPolicyFragment(); break; - case "Friends": - loadFriendsFragment(); + case "People": + loadPeopleFragment(); break; default: Log.e(TAG, "Unknown fragment " + fragment); @@ -141,10 +141,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On loadFragment(fragment, getString(R.string.privacyPolicy), true); } - private void loadFriendsFragment() { + private void loadPeopleFragment() { Fragment fragment = FriendsFragment.newInstance(); - loadFragment(fragment, getString(R.string.friends), true); + loadFragment(fragment, getString(R.string.people), true); } private void loadFragment(Fragment fragment, String title, boolean addToBackStack) { @@ -212,8 +212,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On case R.id.action_home: loadHomeFragment(); return true; - case R.id.action_friends: - loadFriendsFragment(); + case R.id.action_people: + loadPeopleFragment(); return true; } return false; diff --git a/android/app/src/main/res/menu/menu_navigation.xml b/android/app/src/main/res/menu/menu_navigation.xml index de496bc4cb..3cce64f9f5 100644 --- a/android/app/src/main/res/menu/menu_navigation.xml +++ b/android/app/src/main/res/menu/menu_navigation.xml @@ -6,7 +6,7 @@ android:title="@string/home" /> diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index e29252c2c0..9fe7f0cbee 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -2,6 +2,7 @@ Interface Home Friends + People Open in browser Share link Shared a link From 88bd4e3d9a3022341436586975592fb3aec4d537 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 8 Aug 2018 12:32:45 -0700 Subject: [PATCH 09/68] WIP - safe landing infrastructure --- interface/src/Application.cpp | 1 + .../src/octree/OctreePacketProcessor.cpp | 9 +- interface/src/octree/OctreePacketProcessor.h | 1 + interface/src/octree/SafeLanding.cpp | 96 +++++++++++++++++++ interface/src/octree/SafeLanding.h | 40 +++++++- 5 files changed, 143 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0bbd2b1c17..b2beb5d551 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -6166,6 +6166,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType) { _octreeQuery.setOctreeSizeScale(DEFAULT_OCTREE_SIZE_SCALE); static constexpr float MIN_LOD_ADJUST = -20.0f; _octreeQuery.setBoundaryLevelAdjust(MIN_LOD_ADJUST); + _octreeProcessor.startEntitySequence(); } else { _octreeQuery.setConicalViews(_conicalViews); auto lodManager = DependencyManager::get(); diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 52885e8902..e6a1857189 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -18,7 +18,9 @@ #include "SceneScriptingInterface.h" #include "SafeLanding.h" -OctreePacketProcessor::OctreePacketProcessor() { +OctreePacketProcessor::OctreePacketProcessor(): + _safeLanding(new SafeLanding()) +{ setObjectName("Octree Packet Processor"); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); @@ -120,6 +122,7 @@ void OctreePacketProcessor::processPacket(QSharedPointer messag message->readPrimitive(&completionNumber); _completionSequenceNumber = completionNumber; + _safeLanding->setCompletionSequenceNumbers(0, completionNumber); } break; default: { @@ -147,3 +150,7 @@ bool OctreePacketProcessor::octreeSequenceIsComplete(int sequenceNumber) const { return _completionSequenceNumber != INVALID_SEQUENCE && !lessThanWraparound(sequenceNumber, _completionSequenceNumber); } + +void OctreePacketProcessor::startEntitySequence() { + _safeLanding->startEntitySequence(qApp->getEntities()); +} diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index 866a59eaa6..e0a4429da2 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -25,6 +25,7 @@ public: OctreePacketProcessor(); ~OctreePacketProcessor(); + void startEntitySequence(); bool octreeSequenceIsComplete(int sequenceNumber) const; signals: diff --git a/interface/src/octree/SafeLanding.cpp b/interface/src/octree/SafeLanding.cpp index c4a2fa13e9..85040e5333 100644 --- a/interface/src/octree/SafeLanding.cpp +++ b/interface/src/octree/SafeLanding.cpp @@ -10,8 +10,104 @@ // #include "SafeLanding.h" +#include "EntityTreeRenderer.h" + +const int SafeLanding::SEQUENCE_MODULO = std::numeric_limits::max() + 1; + +namespace { + template bool lessThanWraparound(int a, int b) { + constexpr int MAX_T_VALUE = std::numeric_limits::max(); + if (b <= a) { + b += MAX_T_VALUE; + } + return (b - a) < (MAX_T_VALUE / 2); + } +} + +bool SafeLanding::SequenceLessThan::operator()(const int& a, const int& b) const { + return lessThanWraparound(a, b); +} SafeLanding::SafeLanding() { } SafeLanding::~SafeLanding() { } + +void SafeLanding::startEntitySequence(QSharedPointer entityTreeRenderer) { + if (!_trackingEntities) { + auto entityTree = entityTreeRenderer->getTree(); + + if (entityTree) { + _entityTree = entityTree; + connect(std::const_pointer_cast(_entityTree).get(), + &EntityTree::addingEntity, this, &SafeLanding::addTrackedEntity); + connect(std::const_pointer_cast(_entityTree).get(), + &EntityTree::deletingEntity, this, &SafeLanding::deleteTrackedEntity); + _trackingEntities = true; + _sequenceNumbers.clear(); + _isSequenceComplete = false; + } + } +} + +void SafeLanding::stopEntitySequence() { + _trackingEntities = false; + _initialStart = INVALID_SEQUENCE; + _initialEnd = INVALID_SEQUENCE; + _trackedEntities.clear(); + _sequenceNumbers.clear(); +} + +void SafeLanding::addTrackedEntity(const EntityItemID& entityID) { + volatile EntityItemID id = entityID; + if (_trackingEntities) { + EntityItemPointer entity = _entityTree->findEntityByID(entityID); + if (entity) { + const auto& entityType = entity->getType(); + // Entity types of interest: + static const std::set solidTypes + { EntityTypes::Box, EntityTypes::Sphere, EntityTypes::Shape, EntityTypes::Model }; + + if (solidTypes.count(entity->getType()) && !entity->getCollisionless()) { + _trackedEntities.emplace(entityID, entity); + } + + } + + } +} + +void SafeLanding::deleteTrackedEntity(const EntityItemID& entityID) { + _trackedEntities.erase(entityID); +} + +void SafeLanding::setCompletionSequenceNumbers(int first, int last) { + _initialStart = first; + _initialEnd = (last + 1) % SEQUENCE_MODULO; + auto firstIter = _sequenceNumbers.find(_initialStart); + if (firstIter != _sequenceNumbers.end()) { + _sequenceNumbers.erase(_sequenceNumbers.begin(), firstIter); + } + _sequenceNumbers.erase(_sequenceNumbers.find(_initialEnd), _sequenceNumbers.end()); +} + +void SafeLanding::sequenceNumberReceived(int sequenceNumber) { + if (_trackingEntities) { + _sequenceNumbers.insert(sequenceNumber); + } +} + +bool SafeLanding::sequenceNumbersComplete() { + if (_initialStart != INVALID_SEQUENCE) { + auto startIter = _sequenceNumbers.find(_initialStart); + if (startIter != _sequenceNumbers.end()) { + _sequenceNumbers.erase(_sequenceNumbers.begin(), startIter); + _sequenceNumbers.erase(_sequenceNumbers.find(_initialEnd), _sequenceNumbers.end()); + int sequenceSize = _initialStart < _initialEnd ? _initialEnd - _initialStart : + _initialEnd + SEQUENCE_MODULO - _initialStart; + // First no. exists, nothing outside of first, last exists, so complete iff set size is sequence size. + return (int) _sequenceNumbers.size() == sequenceSize; + } + } + return false; +} diff --git a/interface/src/octree/SafeLanding.h b/interface/src/octree/SafeLanding.h index af13ef7539..ba343ad5eb 100644 --- a/interface/src/octree/SafeLanding.h +++ b/interface/src/octree/SafeLanding.h @@ -14,13 +14,47 @@ #ifndef hifi_SafeLanding_h #define hifi_SafeLanding_h -class SafeLanding { +#include +#include + +#include "EntityItem.h" + +class EntityTreeRenderer; +class EntityItemID; + +class SafeLanding : public QObject { public: - SafeLanding(); - ~SafeLanding(); + SafeLanding(); + ~SafeLanding(); + void startEntitySequence(QSharedPointer entityTreeRenderer); + void stopEntitySequence(); + void setCompletionSequenceNumbers(int first, int last); + void sequenceNumberReceived(int sequenceNumber); + bool isSequenceComplete() const { return _isSequenceComplete; } + +private slots: + void addTrackedEntity(const EntityItemID& entityID); + void deleteTrackedEntity(const EntityItemID& entityID); private: + bool sequenceNumbersComplete(); + bool _trackingEntities { false }; + EntityTreePointer _entityTree; + using EntityMap = std::map; + EntityMap _trackedEntities; + static constexpr int INVALID_SEQUENCE = -1; + bool _isSequenceComplete { true }; + int _initialStart { INVALID_SEQUENCE }; + int _initialEnd { INVALID_SEQUENCE }; // final sequence, exclusive. + + struct SequenceLessThan { + bool operator()(const int& a, const int& b) const; + }; + + std::set _sequenceNumbers; + + static const int SEQUENCE_MODULO; }; #endif // hifi_SafeLanding_h From 4395e1fa2693472751cb1d01f64a61887629d30e Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Thu, 9 Aug 2018 11:11:58 -0700 Subject: [PATCH 10/68] Safe Landing checkpoint --- interface/src/Application.cpp | 4 +- .../src/octree/OctreePacketProcessor.cpp | 15 ++-- interface/src/octree/OctreePacketProcessor.h | 2 +- interface/src/octree/SafeLanding.cpp | 74 +++++++++++++++++-- interface/src/octree/SafeLanding.h | 11 ++- 5 files changed, 90 insertions(+), 16 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b2beb5d551..14ee3befc5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5495,6 +5495,7 @@ void Application::update(float deltaTime) { if (!_physicsEnabled) { if (!domainLoadingInProgress) { PROFILE_ASYNC_BEGIN(app, "Scene Loading", ""); + _octreeProcessor.startEntitySequence(); domainLoadingInProgress = true; } @@ -5504,7 +5505,7 @@ void Application::update(float deltaTime) { // Check for flagged EntityData having arrived. auto entityTreeRenderer = getEntities(); if (isServerlessMode() || - (entityTreeRenderer && _octreeProcessor.octreeSequenceIsComplete(entityTreeRenderer->getLastOctreeMessageSequence()) )) { + (_octreeProcessor.isLoadSequenceComplete() )) { // we've received a new full-scene octree stats packet, or it's been long enough to try again anyway _lastPhysicsCheckTime = now; _fullSceneCounterAtLastPhysicsCheck = _fullSceneReceivedCounter; @@ -6166,7 +6167,6 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType) { _octreeQuery.setOctreeSizeScale(DEFAULT_OCTREE_SIZE_SCALE); static constexpr float MIN_LOD_ADJUST = -20.0f; _octreeQuery.setBoundaryLevelAdjust(MIN_LOD_ADJUST); - _octreeProcessor.startEntitySequence(); } else { _octreeQuery.setConicalViews(_conicalViews); auto lodManager = DependencyManager::get(); diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index e6a1857189..3f06e1579a 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -112,6 +112,7 @@ void OctreePacketProcessor::processPacket(QSharedPointer messag auto renderer = qApp->getEntities(); if (renderer) { renderer->processDatagram(*message, sendingNode); + _safeLanding->sequenceNumberReceived(renderer->getLastOctreeMessageSequence()); } } } break; @@ -145,12 +146,16 @@ namespace { } } -bool OctreePacketProcessor::octreeSequenceIsComplete(int sequenceNumber) const { - // If we've received the flagged seq # and the current one is >= it. - return _completionSequenceNumber != INVALID_SEQUENCE && - !lessThanWraparound(sequenceNumber, _completionSequenceNumber); -} +//bool OctreePacketProcessor::octreeSequenceIsComplete(int sequenceNumber) const { +// // If we've received the flagged seq # and the current one is >= it. +// return _completionSequenceNumber != INVALID_SEQUENCE && +// !lessThanWraparound(sequenceNumber, _completionSequenceNumber); +//} void OctreePacketProcessor::startEntitySequence() { _safeLanding->startEntitySequence(qApp->getEntities()); } + +bool OctreePacketProcessor::isLoadSequenceComplete() const { + return _safeLanding->isLoadSequenceComplete(); +} diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index e0a4429da2..0a1fecaf96 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -26,7 +26,7 @@ public: ~OctreePacketProcessor(); void startEntitySequence(); - bool octreeSequenceIsComplete(int sequenceNumber) const; + bool isLoadSequenceComplete() const; signals: void packetVersionMismatch(); diff --git a/interface/src/octree/SafeLanding.cpp b/interface/src/octree/SafeLanding.cpp index 85040e5333..c0f8b0130d 100644 --- a/interface/src/octree/SafeLanding.cpp +++ b/interface/src/octree/SafeLanding.cpp @@ -11,6 +11,9 @@ #include "SafeLanding.h" #include "EntityTreeRenderer.h" +#include "ModelEntityItem.h" +#include "model-networking/ModelCache.h" +#include "InterfaceLogging.h" const int SafeLanding::SEQUENCE_MODULO = std::numeric_limits::max() + 1; @@ -31,8 +34,6 @@ bool SafeLanding::SequenceLessThan::operator()(const int& a, const int& b) const SafeLanding::SafeLanding() { } -SafeLanding::~SafeLanding() { } - void SafeLanding::startEntitySequence(QSharedPointer entityTreeRenderer) { if (!_trackingEntities) { auto entityTree = entityTreeRenderer->getTree(); @@ -45,7 +46,6 @@ void SafeLanding::startEntitySequence(QSharedPointer entityT &EntityTree::deletingEntity, this, &SafeLanding::deleteTrackedEntity); _trackingEntities = true; _sequenceNumbers.clear(); - _isSequenceComplete = false; } } } @@ -70,10 +70,10 @@ void SafeLanding::addTrackedEntity(const EntityItemID& entityID) { if (solidTypes.count(entity->getType()) && !entity->getCollisionless()) { _trackedEntities.emplace(entityID, entity); + trackResources(entity); + qCDebug(interfaceapp) << "Tracking entity " << entity->getItemName(); } - } - } } @@ -111,3 +111,67 @@ bool SafeLanding::sequenceNumbersComplete() { } return false; } + +void SafeLanding::trackResources(EntityItemPointer entity) { + if (entity->getType() == EntityTypes::Model) { + ModelEntityItem * modelEntity = std::dynamic_pointer_cast(entity).get(); + QString resourceURL; + QSharedPointer resource; + auto shapeType = modelEntity->getShapeType(); + + if (shapeType == SHAPE_TYPE_COMPOUND) { + resourceURL = modelEntity->getCompoundShapeURL(); + resource = DependencyManager::get()->getCollisionGeometryResource(resourceURL); + } else if (shapeType == SHAPE_TYPE_STATIC_MESH || shapeType == SHAPE_TYPE_SIMPLE_COMPOUND) { + resourceURL = modelEntity->getModelURL(); + resource = DependencyManager::get()->getGeometryResource(resourceURL); + } + + if (resource) { + connect(resource.data(), &Resource::loaded, this, &SafeLanding::resourceLoaded); + // Remove it either way: + connect(resource.data(), &Resource::failed, this, &SafeLanding::resourceLoaded); + if (!resource->isLoaded()) { + _trackedURLs.insert(resourceURL); + } + } + } +} + +void SafeLanding::resourceLoaded() { + QObject * sender = QObject::sender(); + if (sender) { + Resource * resource = dynamic_cast(sender); + const QString resourceURL = resource->getURL().toString(); + _trackedURLs.erase(resourceURL); + qCDebug(interfaceapp) << "Removed tracked URL" << resourceURL; + } +} + +bool SafeLanding::isLoadSequenceComplete() { + if (sequenceNumbersComplete() && _trackedURLs.empty()) { + _trackingEntities = false; + _trackedEntities.clear(); + } + + return !_trackingEntities; +} + +void SafeLanding::DebugDumpSequenceIDs() const { + int p = -1; + qCDebug(interfaceapp) << "Sequence set size:" << _sequenceNumbers.size(); + for (auto s: _sequenceNumbers) { + if (p == -1) { + p = s; + qCDebug(interfaceapp) << "First: " << s; + } else { + if (s != p + 1) { + qCDebug(interfaceapp) << "Gap from" << p << "to" << s << "(exclusive)"; + p = s; + } + } + } + if (p != -1) { + qCDebug(interfaceapp) << "Last:" << p; + } +} diff --git a/interface/src/octree/SafeLanding.h b/interface/src/octree/SafeLanding.h index ba343ad5eb..e32a444784 100644 --- a/interface/src/octree/SafeLanding.h +++ b/interface/src/octree/SafeLanding.h @@ -25,26 +25,30 @@ class EntityItemID; class SafeLanding : public QObject { public: SafeLanding(); - ~SafeLanding(); + ~SafeLanding() = default; void startEntitySequence(QSharedPointer entityTreeRenderer); void stopEntitySequence(); void setCompletionSequenceNumbers(int first, int last); void sequenceNumberReceived(int sequenceNumber); - bool isSequenceComplete() const { return _isSequenceComplete; } + bool isLoadSequenceComplete(); private slots: void addTrackedEntity(const EntityItemID& entityID); void deleteTrackedEntity(const EntityItemID& entityID); + void resourceLoaded(); + private: bool sequenceNumbersComplete(); + void trackResources(EntityItemPointer entity); + void DebugDumpSequenceIDs() const; + bool _trackingEntities { false }; EntityTreePointer _entityTree; using EntityMap = std::map; EntityMap _trackedEntities; static constexpr int INVALID_SEQUENCE = -1; - bool _isSequenceComplete { true }; int _initialStart { INVALID_SEQUENCE }; int _initialEnd { INVALID_SEQUENCE }; // final sequence, exclusive. @@ -53,6 +57,7 @@ private: }; std::set _sequenceNumbers; + std::set _trackedURLs; static const int SEQUENCE_MODULO; }; From 60338f98991e6de42957942a7fe28062d0d757d8 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Thu, 9 Aug 2018 17:54:07 -0300 Subject: [PATCH 11/68] Android - People - Swipe to reveal delete + layout adaptations for design --- .../hifiinterface/view/SwipeRevealLayout.java | 729 ++++++++++++++++++ .../hifiinterface/view/UserListAdapter.java | 14 +- android/app/src/main/res/layout/user_item.xml | 78 +- android/app/src/main/res/values/attrs.xml | 9 + 4 files changed, 810 insertions(+), 20 deletions(-) create mode 100644 android/app/src/main/java/io/highfidelity/hifiinterface/view/SwipeRevealLayout.java create mode 100644 android/app/src/main/res/values/attrs.xml diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/SwipeRevealLayout.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/SwipeRevealLayout.java new file mode 100644 index 0000000000..06ac4ac3ec --- /dev/null +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/SwipeRevealLayout.java @@ -0,0 +1,729 @@ +package io.highfidelity.hifiinterface.view; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Rect; +import android.os.Bundle; +import android.os.Parcelable; +import android.support.annotation.Nullable; +import android.support.v4.view.GestureDetectorCompat; +import android.support.v4.view.ViewCompat; +import android.support.v4.widget.ViewDragHelper; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; + +import io.highfidelity.hifiinterface.R; + +/** + * Created by Mark O'Sullivan on 25th February 2018. + + MIT License + + Copyright (c) 2018 Mark O'Sullivan + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + + */ + +@SuppressLint("RtlHardcoded") +public class SwipeRevealLayout extends ViewGroup { + + private static final String SUPER_INSTANCE_STATE = "saved_instance_state_parcelable"; + + private static final int DEFAULT_MIN_FLING_VELOCITY = 300; // dp per second + private static final int DEFAULT_MIN_DIST_REQUEST_DISALLOW_PARENT = 1; // dp + + public static final int DRAG_EDGE_LEFT = 0x1; + public static final int DRAG_EDGE_RIGHT = 0x1 << 1; + + /** + * The secondary view will be under the main view. + */ + public static final int MODE_NORMAL = 0; + + /** + * The secondary view will stick the edge of the main view. + */ + public static final int MODE_SAME_LEVEL = 1; + + /** + * Main view is the view which is shown when the layout is closed. + */ + private View mMainView; + + /** + * Secondary view is the view which is shown when the layout is opened. + */ + private View mSecondaryView; + + /** + * The rectangle position of the main view when the layout is closed. + */ + private Rect mRectMainClose = new Rect(); + + /** + * The rectangle position of the main view when the layout is opened. + */ + private Rect mRectMainOpen = new Rect(); + + /** + * The rectangle position of the secondary view when the layout is closed. + */ + private Rect mRectSecClose = new Rect(); + + /** + * The rectangle position of the secondary view when the layout is opened. + */ + private Rect mRectSecOpen = new Rect(); + + /** + * The minimum distance (px) to the closest drag edge that the SwipeRevealLayout + * will disallow the parent to intercept touch event. + */ + private int mMinDistRequestDisallowParent = 0; + + private boolean mIsOpenBeforeInit = false; + private volatile boolean mIsScrolling = false; + private volatile boolean mLockDrag = false; + + private int mMinFlingVelocity = DEFAULT_MIN_FLING_VELOCITY; + private int mMode = MODE_NORMAL; + + private int mDragEdge = DRAG_EDGE_LEFT; + + private float mDragDist = 0; + private float mPrevX = -1; + + private ViewDragHelper mDragHelper; + private GestureDetectorCompat mGestureDetector; + + public SwipeRevealLayout(Context context) { + super(context); + init(context, null); + } + + public SwipeRevealLayout(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + public SwipeRevealLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Nullable + @Override + protected Parcelable onSaveInstanceState() { + Bundle bundle = new Bundle(); + bundle.putParcelable(SUPER_INSTANCE_STATE, super.onSaveInstanceState()); + return super.onSaveInstanceState(); + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + Bundle bundle = (Bundle) state; + state = bundle.getParcelable(SUPER_INSTANCE_STATE); + super.onRestoreInstanceState(state); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + mGestureDetector.onTouchEvent(event); + mDragHelper.processTouchEvent(event); + return true; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (isDragLocked()) { + return super.onInterceptTouchEvent(ev); + } + + mDragHelper.processTouchEvent(ev); + mGestureDetector.onTouchEvent(ev); + accumulateDragDist(ev); + + boolean couldBecomeClick = couldBecomeClick(ev); + boolean settling = mDragHelper.getViewDragState() == ViewDragHelper.STATE_SETTLING; + boolean idleAfterScrolled = mDragHelper.getViewDragState() == ViewDragHelper.STATE_IDLE + && mIsScrolling; + + // must be placed as the last statement + mPrevX = ev.getX(); + + // return true => intercept, cannot trigger onClick event + return !couldBecomeClick && (settling || idleAfterScrolled); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + // get views + if (getChildCount() >= 2) { + mSecondaryView = getChildAt(0); + mMainView = getChildAt(1); + } + else if (getChildCount() == 1) { + mMainView = getChildAt(0); + } + } + + /** + * {@inheritDoc} + */ + @SuppressWarnings("ConstantConditions") + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + for (int index = 0; index < getChildCount(); index++) { + final View child = getChildAt(index); + + int left, right, top, bottom; + left = right = top = bottom = 0; + + final int minLeft = getPaddingLeft(); + final int maxRight = Math.max(r - getPaddingRight() - l, 0); + final int minTop = getPaddingTop(); + final int maxBottom = Math.max(b - getPaddingBottom() - t, 0); + + int measuredChildHeight = child.getMeasuredHeight(); + int measuredChildWidth = child.getMeasuredWidth(); + + // need to take account if child size is match_parent + final LayoutParams childParams = child.getLayoutParams(); + boolean matchParentHeight = false; + boolean matchParentWidth = false; + + if (childParams != null) { + matchParentHeight = (childParams.height == LayoutParams.MATCH_PARENT) || + (childParams.height == LayoutParams.FILL_PARENT); + matchParentWidth = (childParams.width == LayoutParams.MATCH_PARENT) || + (childParams.width == LayoutParams.FILL_PARENT); + } + + if (matchParentHeight) { + measuredChildHeight = maxBottom - minTop; + childParams.height = measuredChildHeight; + } + + if (matchParentWidth) { + measuredChildWidth = maxRight - minLeft; + childParams.width = measuredChildWidth; + } + + switch (mDragEdge) { + case DRAG_EDGE_RIGHT: + left = Math.max(r - measuredChildWidth - getPaddingRight() - l, minLeft); + top = Math.min(getPaddingTop(), maxBottom); + right = Math.max(r - getPaddingRight() - l, minLeft); + bottom = Math.min(measuredChildHeight + getPaddingTop(), maxBottom); + break; + + case DRAG_EDGE_LEFT: + left = Math.min(getPaddingLeft(), maxRight); + top = Math.min(getPaddingTop(), maxBottom); + right = Math.min(measuredChildWidth + getPaddingLeft(), maxRight); + bottom = Math.min(measuredChildHeight + getPaddingTop(), maxBottom); + break; + } + + child.layout(left, top, right, bottom); + } + + // taking account offset when mode is SAME_LEVEL + if (mMode == MODE_SAME_LEVEL) { + switch (mDragEdge) { + case DRAG_EDGE_LEFT: + mSecondaryView.offsetLeftAndRight(-mSecondaryView.getWidth()); + break; + + case DRAG_EDGE_RIGHT: + mSecondaryView.offsetLeftAndRight(mSecondaryView.getWidth()); + break; + } + } + + initRects(); + + if (mIsOpenBeforeInit) { + open(false); + } else { + close(false); + } + + } + + /** + * {@inheritDoc} + */ + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (getChildCount() < 2) { + throw new RuntimeException("Layout must have two children"); + } + + final LayoutParams params = getLayoutParams(); + + final int widthMode = MeasureSpec.getMode(widthMeasureSpec); + final int heightMode = MeasureSpec.getMode(heightMeasureSpec); + + int desiredWidth = 0; + int desiredHeight = 0; + + // first find the largest child + for (int i = 0; i < getChildCount(); i++) { + final View child = getChildAt(i); + measureChild(child, widthMeasureSpec, heightMeasureSpec); + desiredWidth = Math.max(child.getMeasuredWidth(), desiredWidth); + desiredHeight = Math.max(child.getMeasuredHeight(), desiredHeight); + } + // create new measure spec using the largest child width + widthMeasureSpec = MeasureSpec.makeMeasureSpec(desiredWidth, widthMode); + heightMeasureSpec = MeasureSpec.makeMeasureSpec(desiredHeight, heightMode); + + final int measuredWidth = MeasureSpec.getSize(widthMeasureSpec); + final int measuredHeight = MeasureSpec.getSize(heightMeasureSpec); + + for (int i = 0; i < getChildCount(); i++) { + final View child = getChildAt(i); + final LayoutParams childParams = child.getLayoutParams(); + + if (childParams != null) { + if (childParams.height == LayoutParams.MATCH_PARENT) { + child.setMinimumHeight(measuredHeight); + } + + if (childParams.width == LayoutParams.MATCH_PARENT) { + child.setMinimumWidth(measuredWidth); + } + } + + measureChild(child, widthMeasureSpec, heightMeasureSpec); + desiredWidth = Math.max(child.getMeasuredWidth(), desiredWidth); + desiredHeight = Math.max(child.getMeasuredHeight(), desiredHeight); + } + + // taking accounts of padding + desiredWidth += getPaddingLeft() + getPaddingRight(); + desiredHeight += getPaddingTop() + getPaddingBottom(); + + // adjust desired width + if (widthMode == MeasureSpec.EXACTLY) { + desiredWidth = measuredWidth; + } else { + if (params.width == LayoutParams.MATCH_PARENT) { + desiredWidth = measuredWidth; + } + + if (widthMode == MeasureSpec.AT_MOST) { + desiredWidth = (desiredWidth > measuredWidth)? measuredWidth : desiredWidth; + } + } + + // adjust desired height + if (heightMode == MeasureSpec.EXACTLY) { + desiredHeight = measuredHeight; + } else { + if (params.height == LayoutParams.MATCH_PARENT) { + desiredHeight = measuredHeight; + } + + if (heightMode == MeasureSpec.AT_MOST) { + desiredHeight = (desiredHeight > measuredHeight)? measuredHeight : desiredHeight; + } + } + + setMeasuredDimension(desiredWidth, desiredHeight); + } + + @Override + public void computeScroll() { + if (mDragHelper.continueSettling(true)) { + ViewCompat.postInvalidateOnAnimation(this); + } + } + + /** + * Open the panel to show the secondary view + */ + public void open(boolean animation) { + mIsOpenBeforeInit = true; + + if (animation) { + mDragHelper.smoothSlideViewTo(mMainView, mRectMainOpen.left, mRectMainOpen.top); + } else { + mDragHelper.abort(); + + mMainView.layout( + mRectMainOpen.left, + mRectMainOpen.top, + mRectMainOpen.right, + mRectMainOpen.bottom + ); + + mSecondaryView.layout( + mRectSecOpen.left, + mRectSecOpen.top, + mRectSecOpen.right, + mRectSecOpen.bottom + ); + } + + ViewCompat.postInvalidateOnAnimation(this); + } + + /** + * Close the panel to hide the secondary view + */ + public void close(boolean animation) { + mIsOpenBeforeInit = false; + + if (animation) { + mDragHelper.smoothSlideViewTo(mMainView, mRectMainClose.left, mRectMainClose.top); + } else { + mDragHelper.abort(); + mMainView.layout( + mRectMainClose.left, + mRectMainClose.top, + mRectMainClose.right, + mRectMainClose.bottom + ); + mSecondaryView.layout( + mRectSecClose.left, + mRectSecClose.top, + mRectSecClose.right, + mRectSecClose.bottom + ); + } + + ViewCompat.postInvalidateOnAnimation(this); + } + + /** + * @return true if the drag/swipe motion is currently locked. + */ + public boolean isDragLocked() { + return mLockDrag; + } + + private int getMainOpenLeft() { + switch (mDragEdge) { + case DRAG_EDGE_LEFT: + return mRectMainClose.left + mSecondaryView.getWidth(); + + case DRAG_EDGE_RIGHT: + return mRectMainClose.left - mSecondaryView.getWidth(); + + + default: + return 0; + } + } + + private int getMainOpenTop() { + switch (mDragEdge) { + case DRAG_EDGE_LEFT: + return mRectMainClose.top; + + case DRAG_EDGE_RIGHT: + return mRectMainClose.top; + + + default: + return 0; + } + } + + private int getSecOpenLeft() { + return mRectSecClose.left; + } + + private int getSecOpenTop() { + return mRectSecClose.top; + } + + private void initRects() { + // close position of main view + mRectMainClose.set( + mMainView.getLeft(), + mMainView.getTop(), + mMainView.getRight(), + mMainView.getBottom() + ); + + // close position of secondary view + mRectSecClose.set( + mSecondaryView.getLeft(), + mSecondaryView.getTop(), + mSecondaryView.getRight(), + mSecondaryView.getBottom() + ); + + // open position of the main view + mRectMainOpen.set( + getMainOpenLeft(), + getMainOpenTop(), + getMainOpenLeft() + mMainView.getWidth(), + getMainOpenTop() + mMainView.getHeight() + ); + + // open position of the secondary view + mRectSecOpen.set( + getSecOpenLeft(), + getSecOpenTop(), + getSecOpenLeft() + mSecondaryView.getWidth(), + getSecOpenTop() + mSecondaryView.getHeight() + ); + } + + private boolean couldBecomeClick(MotionEvent ev) { + return isInMainView(ev) && !shouldInitiateADrag(); + } + + private boolean isInMainView(MotionEvent ev) { + float x = ev.getX(); + float y = ev.getY(); + + boolean withinVertical = mMainView.getTop() <= y && y <= mMainView.getBottom(); + boolean withinHorizontal = mMainView.getLeft() <= x && x <= mMainView.getRight(); + + return withinVertical && withinHorizontal; + } + + private boolean shouldInitiateADrag() { + float minDistToInitiateDrag = mDragHelper.getTouchSlop(); + return mDragDist >= minDistToInitiateDrag; + } + + private void accumulateDragDist(MotionEvent ev) { + final int action = ev.getAction(); + if (action == MotionEvent.ACTION_DOWN) { + mDragDist = 0; + return; + } + + float dragged = Math.abs(ev.getX() - mPrevX); + + mDragDist += dragged; + } + + private void init(Context context, AttributeSet attrs) { + if (attrs != null && context != null) { + TypedArray a = context.getTheme().obtainStyledAttributes( + attrs, + R.styleable.SwipeRevealLayout, + 0, 0 + ); + + mDragEdge = a.getInteger(R.styleable.SwipeRevealLayout_dragFromEdge, DRAG_EDGE_LEFT); + mMode = MODE_NORMAL; + mMinFlingVelocity = DEFAULT_MIN_FLING_VELOCITY; + mMinDistRequestDisallowParent = DEFAULT_MIN_DIST_REQUEST_DISALLOW_PARENT; + } + + mDragHelper = ViewDragHelper.create(this, 1.0f, mDragHelperCallback); + mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_ALL); + + mGestureDetector = new GestureDetectorCompat(context, mGestureListener); + } + + private final GestureDetector.OnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener() { + boolean hasDisallowed = false; + + @Override + public boolean onDown(MotionEvent e) { + mIsScrolling = false; + hasDisallowed = false; + return true; + } + + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + mIsScrolling = true; + return false; + } + + @Override + public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { + mIsScrolling = true; + + if (getParent() != null) { + boolean shouldDisallow; + + if (!hasDisallowed) { + shouldDisallow = getDistToClosestEdge() >= mMinDistRequestDisallowParent; + if (shouldDisallow) { + hasDisallowed = true; + } + } else { + shouldDisallow = true; + } + + // disallow parent to intercept touch event so that the layout will work + // properly on RecyclerView or view that handles scroll gesture. + getParent().requestDisallowInterceptTouchEvent(shouldDisallow); + } + + return false; + } + }; + + private int getDistToClosestEdge() { + switch (mDragEdge) { + case DRAG_EDGE_LEFT: + final int pivotRight = mRectMainClose.left + mSecondaryView.getWidth(); + + return Math.min( + mMainView.getLeft() - mRectMainClose.left, + pivotRight - mMainView.getLeft() + ); + + case DRAG_EDGE_RIGHT: + final int pivotLeft = mRectMainClose.right - mSecondaryView.getWidth(); + + return Math.min( + mMainView.getRight() - pivotLeft, + mRectMainClose.right - mMainView.getRight() + ); + } + + return 0; + } + + private int getHalfwayPivotHorizontal() { + if (mDragEdge == DRAG_EDGE_LEFT) { + return mRectMainClose.left + mSecondaryView.getWidth() / 2; + } else { + return mRectMainClose.right - mSecondaryView.getWidth() / 2; + } + } + + private final ViewDragHelper.Callback mDragHelperCallback = new ViewDragHelper.Callback() { + @Override + public boolean tryCaptureView(View child, int pointerId) { + + if (mLockDrag) + return false; + + mDragHelper.captureChildView(mMainView, pointerId); + return false; + } + + @Override + public int clampViewPositionHorizontal(View child, int left, int dx) { + switch (mDragEdge) { + case DRAG_EDGE_RIGHT: + return Math.max( + Math.min(left, mRectMainClose.left), + mRectMainClose.left - mSecondaryView.getWidth() + ); + + case DRAG_EDGE_LEFT: + return Math.max( + Math.min(left, mRectMainClose.left + mSecondaryView.getWidth()), + mRectMainClose.left + ); + + default: + return child.getLeft(); + } + } + + @Override + public void onViewReleased(View releasedChild, float xvel, float yvel) { + final boolean velRightExceeded = pxToDp((int) xvel) >= mMinFlingVelocity; + final boolean velLeftExceeded = pxToDp((int) xvel) <= -mMinFlingVelocity; + + final int pivotHorizontal = getHalfwayPivotHorizontal(); + + switch (mDragEdge) { + case DRAG_EDGE_RIGHT: + if (velRightExceeded) { + close(true); + } else if (velLeftExceeded) { + open(true); + } else { + if (mMainView.getRight() < pivotHorizontal) { + open(true); + } else { + close(true); + } + } + break; + + case DRAG_EDGE_LEFT: + if (velRightExceeded) { + open(true); + } else if (velLeftExceeded) { + close(true); + } else { + if (mMainView.getLeft() < pivotHorizontal) { + close(true); + } else { + open(true); + } + } + break; + } + } + + @Override + public void onEdgeDragStarted(int edgeFlags, int pointerId) { + super.onEdgeDragStarted(edgeFlags, pointerId); + + if (mLockDrag) { + return; + } + + boolean edgeStartLeft = (mDragEdge == DRAG_EDGE_RIGHT) + && edgeFlags == ViewDragHelper.EDGE_LEFT; + + boolean edgeStartRight = (mDragEdge == DRAG_EDGE_LEFT) + && edgeFlags == ViewDragHelper.EDGE_RIGHT; + + if (edgeStartLeft || edgeStartRight) { + mDragHelper.captureChildView(mMainView, pointerId); + } + } + + @Override + public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { + super.onViewPositionChanged(changedView, left, top, dx, dy); + if (mMode == MODE_SAME_LEVEL) { + if (mDragEdge == DRAG_EDGE_LEFT || mDragEdge == DRAG_EDGE_RIGHT) { + mSecondaryView.offsetLeftAndRight(dx); + } else { + mSecondaryView.offsetTopAndBottom(dy); + } + } + ViewCompat.postInvalidateOnAnimation(SwipeRevealLayout.this); + } + }; + + private int pxToDp(int px) { + Resources resources = getContext().getResources(); + DisplayMetrics metrics = resources.getDisplayMetrics(); + return (int) (px / ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT)); + } +} \ No newline at end of file diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java index 32993500fe..79a931d93b 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java @@ -7,8 +7,11 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import com.squareup.picasso.Picasso; @@ -62,7 +65,14 @@ public class UserListAdapter extends RecyclerView.Adapter - + android:layout_gravity="center_vertical" + app:dragFromEdge="right"> - - + android:layout_height="match_parent" + android:background="@android:color/holo_red_dark"> + - + + + - \ No newline at end of file + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/values/attrs.xml b/android/app/src/main/res/values/attrs.xml new file mode 100644 index 0000000000..c12f28ccde --- /dev/null +++ b/android/app/src/main/res/values/attrs.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file From 875407b3fef3a85b3525abd0bd0f8acc2bc271cc Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Thu, 9 Aug 2018 16:24:04 -0700 Subject: [PATCH 12/68] New approach to physics readiness - now (mostly) working --- interface/src/Application.cpp | 3 +- .../src/octree/OctreePacketProcessor.cpp | 22 +----- interface/src/octree/OctreePacketProcessor.h | 5 -- interface/src/octree/SafeLanding.cpp | 73 ++++++++----------- interface/src/octree/SafeLanding.h | 7 +- 5 files changed, 34 insertions(+), 76 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 14ee3befc5..cc2c7f601a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -6322,10 +6322,11 @@ void Application::clearDomainOctreeDetails() { _octreeServerSceneStats.clear(); }); - _octreeProcessor.resetCompletionSequenceNumber(); // reset the model renderer getEntities()->clear(); + _octreeProcessor.startEntitySequence(); + auto skyStage = DependencyManager::get()->getSkyStage(); skyStage->setBackgroundMode(graphics::SunSkyStage::SKY_DEFAULT); diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 3f06e1579a..6dab37b1a1 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -122,7 +122,7 @@ void OctreePacketProcessor::processPacket(QSharedPointer messag OCTREE_PACKET_SEQUENCE completionNumber; message->readPrimitive(&completionNumber); - _completionSequenceNumber = completionNumber; + completionNumber; _safeLanding->setCompletionSequenceNumbers(0, completionNumber); } break; @@ -132,26 +132,6 @@ void OctreePacketProcessor::processPacket(QSharedPointer messag } } -void OctreePacketProcessor::resetCompletionSequenceNumber() { - _completionSequenceNumber = INVALID_SEQUENCE; -} - -namespace { - template bool lessThanWraparound(int a, int b) { - constexpr int MAX_T_VALUE = std::numeric_limits::max(); - if (b <= a) { - b += MAX_T_VALUE; - } - return (b - a) < (MAX_T_VALUE / 2); - } -} - -//bool OctreePacketProcessor::octreeSequenceIsComplete(int sequenceNumber) const { -// // If we've received the flagged seq # and the current one is >= it. -// return _completionSequenceNumber != INVALID_SEQUENCE && -// !lessThanWraparound(sequenceNumber, _completionSequenceNumber); -//} - void OctreePacketProcessor::startEntitySequence() { _safeLanding->startEntitySequence(qApp->getEntities()); } diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index 0a1fecaf96..f9c24ddc51 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -31,9 +31,6 @@ public: signals: void packetVersionMismatch(); -public slots: - void resetCompletionSequenceNumber(); - protected: virtual void processPacket(QSharedPointer message, SharedNodePointer sendingNode) override; @@ -41,8 +38,6 @@ private slots: void handleOctreePacket(QSharedPointer message, SharedNodePointer senderNode); private: - static constexpr int INVALID_SEQUENCE = -1; - std::atomic _completionSequenceNumber { INVALID_SEQUENCE }; std::unique_ptr _safeLanding; }; #endif // hifi_OctreePacketProcessor_h diff --git a/interface/src/octree/SafeLanding.cpp b/interface/src/octree/SafeLanding.cpp index c0f8b0130d..352c83dad0 100644 --- a/interface/src/octree/SafeLanding.cpp +++ b/interface/src/octree/SafeLanding.cpp @@ -12,7 +12,6 @@ #include "SafeLanding.h" #include "EntityTreeRenderer.h" #include "ModelEntityItem.h" -#include "model-networking/ModelCache.h" #include "InterfaceLogging.h" const int SafeLanding::SEQUENCE_MODULO = std::numeric_limits::max() + 1; @@ -31,9 +30,6 @@ bool SafeLanding::SequenceLessThan::operator()(const int& a, const int& b) const return lessThanWraparound(a, b); } -SafeLanding::SafeLanding() { -} - void SafeLanding::startEntitySequence(QSharedPointer entityTreeRenderer) { if (!_trackingEntities) { auto entityTree = entityTreeRenderer->getTree(); @@ -59,19 +55,20 @@ void SafeLanding::stopEntitySequence() { } void SafeLanding::addTrackedEntity(const EntityItemID& entityID) { - volatile EntityItemID id = entityID; if (_trackingEntities) { EntityItemPointer entity = _entityTree->findEntityByID(entityID); - if (entity) { - const auto& entityType = entity->getType(); - // Entity types of interest: - static const std::set solidTypes - { EntityTypes::Box, EntityTypes::Sphere, EntityTypes::Shape, EntityTypes::Model }; - if (solidTypes.count(entity->getType()) && !entity->getCollisionless()) { - _trackedEntities.emplace(entityID, entity); - trackResources(entity); - qCDebug(interfaceapp) << "Tracking entity " << entity->getItemName(); + if (entity && !entity->getCollisionless()) { + const auto& entityType = entity->getType(); + if (entityType == EntityTypes::Model) { + ModelEntityItem * modelEntity = std::dynamic_pointer_cast(entity).get(); + auto shapeType = modelEntity->getShapeType(); + if (shapeType == SHAPE_TYPE_COMPOUND || shapeType == SHAPE_TYPE_STATIC_MESH || + shapeType == SHAPE_TYPE_SIMPLE_COMPOUND) { + // Only track entities with downloaded collision bodies. + _trackedEntities.emplace(entityID, entity); + qCDebug(interfaceapp) << "Safe Landing: Tracking entity " << entity->getItemName(); + } } } } @@ -112,58 +109,46 @@ bool SafeLanding::sequenceNumbersComplete() { return false; } -void SafeLanding::trackResources(EntityItemPointer entity) { - if (entity->getType() == EntityTypes::Model) { - ModelEntityItem * modelEntity = std::dynamic_pointer_cast(entity).get(); - QString resourceURL; - QSharedPointer resource; - auto shapeType = modelEntity->getShapeType(); - - if (shapeType == SHAPE_TYPE_COMPOUND) { - resourceURL = modelEntity->getCompoundShapeURL(); - resource = DependencyManager::get()->getCollisionGeometryResource(resourceURL); - } else if (shapeType == SHAPE_TYPE_STATIC_MESH || shapeType == SHAPE_TYPE_SIMPLE_COMPOUND) { - resourceURL = modelEntity->getModelURL(); - resource = DependencyManager::get()->getGeometryResource(resourceURL); - } - - if (resource) { - connect(resource.data(), &Resource::loaded, this, &SafeLanding::resourceLoaded); - // Remove it either way: - connect(resource.data(), &Resource::failed, this, &SafeLanding::resourceLoaded); - if (!resource->isLoaded()) { - _trackedURLs.insert(resourceURL); - } - } - } -} - void SafeLanding::resourceLoaded() { QObject * sender = QObject::sender(); if (sender) { Resource * resource = dynamic_cast(sender); const QString resourceURL = resource->getURL().toString(); _trackedURLs.erase(resourceURL); - qCDebug(interfaceapp) << "Removed tracked URL" << resourceURL; + qCDebug(interfaceapp) << "Safe Landing: Removed tracked URL" << resourceURL; } } bool SafeLanding::isLoadSequenceComplete() { - if (sequenceNumbersComplete() && _trackedURLs.empty()) { + if (sequenceNumbersComplete() && entityPhysicsComplete()) { _trackingEntities = false; _trackedEntities.clear(); + qCDebug(interfaceapp) << "Safe Landing: load sequence complete"; } return !_trackingEntities; } -void SafeLanding::DebugDumpSequenceIDs() const { +bool SafeLanding::entityPhysicsComplete() { + for (auto entityMapIter = _trackedEntities.begin(); entityMapIter != _trackedEntities.end(); ++entityMapIter) { + auto entity = entityMapIter->second; + if (!entity->shouldBePhysical() || entity->isReadyToComputeShape()) { + entityMapIter = _trackedEntities.erase(entityMapIter); + if (entityMapIter == _trackedEntities.end()) { + break; + } + } + } + return _trackedEntities.empty(); +} + +void SafeLanding::debugDumpSequenceIDs() const { int p = -1; qCDebug(interfaceapp) << "Sequence set size:" << _sequenceNumbers.size(); for (auto s: _sequenceNumbers) { if (p == -1) { p = s; - qCDebug(interfaceapp) << "First: " << s; + qCDebug(interfaceapp) << "First:" << s; } else { if (s != p + 1) { qCDebug(interfaceapp) << "Gap from" << p << "to" << s << "(exclusive)"; diff --git a/interface/src/octree/SafeLanding.h b/interface/src/octree/SafeLanding.h index e32a444784..e81746e077 100644 --- a/interface/src/octree/SafeLanding.h +++ b/interface/src/octree/SafeLanding.h @@ -24,9 +24,6 @@ class EntityItemID; class SafeLanding : public QObject { public: - SafeLanding(); - ~SafeLanding() = default; - void startEntitySequence(QSharedPointer entityTreeRenderer); void stopEntitySequence(); void setCompletionSequenceNumbers(int first, int last); @@ -40,8 +37,8 @@ private slots: private: bool sequenceNumbersComplete(); - void trackResources(EntityItemPointer entity); - void DebugDumpSequenceIDs() const; + void debugDumpSequenceIDs() const; + bool entityPhysicsComplete(); bool _trackingEntities { false }; EntityTreePointer _entityTree; From f03370c826307c3dd5d09a6e4625f5e6256a4f58 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 9 Aug 2018 16:41:50 -0700 Subject: [PATCH 13/68] Migrating to scribe program descriptors --- cmake/macros/AutoScribeShader.cmake | 466 ++++++++---------- interface/src/Application.cpp | 47 +- interface/src/Application.h | 2 - libraries/avatars-renderer/CMakeLists.txt | 1 - libraries/display-plugins/CMakeLists.txt | 1 - .../InterleavedSrgbToLinear.slp | 1 + .../src/display-plugins/SrgbToLinear.slp | 1 + .../src/entities-renderer/paintStroke.slp | 0 .../src/entities-renderer/polyvox.slp | 0 .../src/entities-renderer/polyvox_fade.slp | 0 .../entities-renderer/textured_particle.slp | 0 libraries/gpu/src/gpu/drawColor.slp | 3 + libraries/gpu/src/gpu/drawNothing.slp | 2 + libraries/gpu/src/gpu/drawTexture.slp | 2 + .../src/gpu/drawTextureOpaqueTexcoordRect.slp | 2 + .../drawTransformUnitQuadTextureOpaque.slp | 2 + .../gpu/src/gpu/drawUnitQuatTextureOpaque.slp | 2 + libraries/graphics/src/graphics/skybox.slp | 0 .../src/render-utils/animdebugdraw.slp | 0 .../src/render-utils/bloomApply.slp | 2 + .../src/render-utils/bloomThreshold.slp | 2 + .../directional_ambient_light.slp | 1 + .../directional_ambient_light_shadow.slp | 1 + .../render-utils/directional_skybox_light.slp | 1 + .../directional_skybox_light_shadow.slp | 1 + .../src/render-utils/drawWorkloadProxy.slp | 0 .../src/render-utils/drawWorkloadView.slp | 0 .../src/render-utils/forward_model.slp | 1 + .../render-utils/forward_model_normal_map.slp | 1 + .../forward_model_normal_map_translucent.slp | 2 + .../forward_model_translucent.slp | 1 + .../src/render-utils/forward_model_unlit.slp | 1 + .../render-utils/forward_simple_textured.slp | 1 + .../forward_simple_textured_transparent.slp | 1 + .../forward_simple_textured_unlit.slp | 1 + .../src/render-utils/forward_skin_model.slp | 2 + .../render-utils/forward_skin_model_dq.slp | 2 + .../forward_skin_model_normal_map.slp | 2 + .../forward_skin_model_normal_map_dq.slp | 2 + .../render-utils/forward_skin_translucent.slp | 2 + .../forward_skin_translucent_dq.slp | 2 + .../forward_skin_translucent_normal_map.slp | 2 + ...forward_skin_translucent_normal_map_dq.slp | 2 + .../src/render-utils/fxaa_blend.slp | 1 + .../src/render-utils/glowLine.slp | 0 .../render-utils/src/render-utils/grid.slp | 1 + .../render-utils/src/render-utils/haze.slp | 2 + .../src/render-utils/highlight.slp | 2 + .../src/render-utils/highlight_aabox.slp | 2 + .../src/render-utils/highlight_filled.slp | 2 + .../render-utils/src/render-utils/hmd_ui.slp | 0 .../lightClusters_drawClusterContent.slp | 1 + .../lightClusters_drawClusterFromDepth.slp | 1 + .../render-utils/lightClusters_drawGrid.slp | 0 .../render-utils/local_lights_drawOutline.slp | 1 + .../src/render-utils/local_lights_shading.slp | 1 + .../render-utils/src/render-utils/model.slp | 0 .../src/render-utils/model_fade.slp | 0 .../src/render-utils/model_lightmap.slp | 0 .../src/render-utils/model_lightmap_fade.slp | 0 .../model_lightmap_normal_map.slp | 0 .../model_lightmap_normal_map_fade.slp | 0 .../src/render-utils/model_normal_map.slp | 0 .../render-utils/model_normal_map_fade.slp | 0 .../src/render-utils/model_shadow.slp | 0 .../src/render-utils/model_shadow_fade.slp | 0 .../src/render-utils/model_translucent.slp | 0 .../render-utils/model_translucent_fade.slp | 1 + .../model_translucent_normal_map.slp | 0 .../model_translucent_normal_map_fade.slp | 1 + .../render-utils/model_translucent_unlit.slp | 1 + .../model_translucent_unlit_fade.slp | 1 + .../src/render-utils/model_unlit.slp | 1 + .../src/render-utils/model_unlit_fade.slp | 1 + .../src/render-utils/parabola.slp | 0 .../src/render-utils/sdf_text3D.slp | 0 .../render-utils/sdf_text3D_transparent.slp | 1 + .../render-utils/src/render-utils/simple.slp | 1 + .../src/render-utils/simpleTranslucent.slp | 2 + .../render-utils/simpleTranslucentUnlit.slp | 2 + .../src/render-utils/simpleUnlit.slp | 2 + .../simple_opaque_web_browser.slp | 1 + .../src/render-utils/simple_textured.slp | 1 + .../src/render-utils/simple_textured_fade.slp | 1 + .../render-utils/simple_textured_unlit.slp | 1 + .../simple_textured_unlit_fade.slp | 1 + .../simple_transparent_textured.slp | 1 + .../simple_transparent_textured_fade.slp | 1 + .../simple_transparent_textured_unlit.slp | 1 + ...simple_transparent_textured_unlit_fade.slp | 1 + .../simple_transparent_web_browser.slp | 1 + .../src/render-utils/skin_model.slp | 1 + .../src/render-utils/skin_model_dq.slp | 1 + .../src/render-utils/skin_model_fade.slp | 1 + .../src/render-utils/skin_model_fade_dq.slp | 1 + .../render-utils/skin_model_normal_map.slp | 1 + .../render-utils/skin_model_normal_map_dq.slp | 1 + .../skin_model_normal_map_fade.slp | 1 + .../skin_model_normal_map_fade_dq.slp | 1 + .../skin_model_normal_map_translucent.slp | 2 + .../skin_model_normal_map_translucent_dq.slp | 2 + ...skin_model_normal_map_translucent_fade.slp | 2 + ...n_model_normal_map_translucent_fade_dq.slp | 2 + .../src/render-utils/skin_model_shadow.slp | 1 + .../src/render-utils/skin_model_shadow_dq.slp | 1 + .../render-utils/skin_model_shadow_fade.slp | 1 + .../skin_model_shadow_fade_dq.slp | 1 + .../render-utils/skin_model_translucent.slp | 2 + .../skin_model_translucent_dq.slp | 2 + .../skin_model_translucent_fade.slp | 2 + .../skin_model_translucent_fade_dq.slp | 2 + .../src/render-utils/ssao_debugOcclusion.slp | 1 + .../render-utils/ssao_makeHorizontalBlur.slp | 1 + .../src/render-utils/ssao_makeOcclusion.slp | 1 + .../render-utils/ssao_makeVerticalBlur.slp | 1 + .../src/render-utils/standardDrawTexture.slp | 1 + .../standardDrawTextureNoBlend.slp | 1 + .../src/render-utils/stencil_drawMask.slp | 1 + .../subsurfaceScattering_drawScattering.slp | 1 + .../subsurfaceScattering_makeLUT.slp | 1 + .../subsurfaceScattering_makeProfile.slp | 1 + ...surfaceScattering_makeSpecularBeckmann.slp | 1 + .../surfaceGeometry_downsampleDepthNormal.slp | 1 + .../surfaceGeometry_makeCurvature.slp | 1 + .../surfaceGeometry_makeLinearDepth.slp | 1 + .../render-utils/src/render-utils/taa.slp | 1 + .../src/render-utils/taa_blend.slp | 1 + .../src/render-utils/toneMapping.slp | 1 + .../velocityBuffer_cameraMotion.slp | 1 + .../src/render-utils/zone_drawAmbient.slp | 1 + .../src/render-utils/zone_drawKeyLight.slp | 1 + .../src/render-utils/zone_drawSkybox.slp | 1 + .../src/render/blurGaussianDepthAwareH.slp | 1 + .../src/render/blurGaussianDepthAwareV.slp | 1 + libraries/render/src/render/blurGaussianH.slp | 1 + libraries/render/src/render/blurGaussianV.slp | 1 + .../render/src/render/drawCellBounds.slp | 0 .../render/src/render/drawItemBounds.slp | 0 .../render/src/render/drawItemStatus.slp | 0 .../render/src/render/drawLODReticle.slp | 1 + libraries/shaders/CMakeLists.txt | 181 +------ tests-manual/gpu-textures/CMakeLists.txt | 1 - tests-manual/gpu/CMakeLists.txt | 1 - tests/shaders/src/ShaderTests.cpp | 20 +- 144 files changed, 359 insertions(+), 501 deletions(-) create mode 100644 libraries/display-plugins/src/display-plugins/InterleavedSrgbToLinear.slp create mode 100644 libraries/display-plugins/src/display-plugins/SrgbToLinear.slp create mode 100644 libraries/entities-renderer/src/entities-renderer/paintStroke.slp create mode 100644 libraries/entities-renderer/src/entities-renderer/polyvox.slp create mode 100644 libraries/entities-renderer/src/entities-renderer/polyvox_fade.slp create mode 100644 libraries/entities-renderer/src/entities-renderer/textured_particle.slp create mode 100644 libraries/gpu/src/gpu/drawColor.slp create mode 100644 libraries/gpu/src/gpu/drawNothing.slp create mode 100644 libraries/gpu/src/gpu/drawTexture.slp create mode 100644 libraries/gpu/src/gpu/drawTextureOpaqueTexcoordRect.slp create mode 100644 libraries/gpu/src/gpu/drawTransformUnitQuadTextureOpaque.slp create mode 100644 libraries/gpu/src/gpu/drawUnitQuatTextureOpaque.slp create mode 100644 libraries/graphics/src/graphics/skybox.slp create mode 100644 libraries/render-utils/src/render-utils/animdebugdraw.slp create mode 100644 libraries/render-utils/src/render-utils/bloomApply.slp create mode 100644 libraries/render-utils/src/render-utils/bloomThreshold.slp create mode 100644 libraries/render-utils/src/render-utils/directional_ambient_light.slp create mode 100644 libraries/render-utils/src/render-utils/directional_ambient_light_shadow.slp create mode 100644 libraries/render-utils/src/render-utils/directional_skybox_light.slp create mode 100644 libraries/render-utils/src/render-utils/directional_skybox_light_shadow.slp create mode 100644 libraries/render-utils/src/render-utils/drawWorkloadProxy.slp create mode 100644 libraries/render-utils/src/render-utils/drawWorkloadView.slp create mode 100644 libraries/render-utils/src/render-utils/forward_model.slp create mode 100644 libraries/render-utils/src/render-utils/forward_model_normal_map.slp create mode 100644 libraries/render-utils/src/render-utils/forward_model_normal_map_translucent.slp create mode 100644 libraries/render-utils/src/render-utils/forward_model_translucent.slp create mode 100644 libraries/render-utils/src/render-utils/forward_model_unlit.slp create mode 100644 libraries/render-utils/src/render-utils/forward_simple_textured.slp create mode 100644 libraries/render-utils/src/render-utils/forward_simple_textured_transparent.slp create mode 100644 libraries/render-utils/src/render-utils/forward_simple_textured_unlit.slp create mode 100644 libraries/render-utils/src/render-utils/forward_skin_model.slp create mode 100644 libraries/render-utils/src/render-utils/forward_skin_model_dq.slp create mode 100644 libraries/render-utils/src/render-utils/forward_skin_model_normal_map.slp create mode 100644 libraries/render-utils/src/render-utils/forward_skin_model_normal_map_dq.slp create mode 100644 libraries/render-utils/src/render-utils/forward_skin_translucent.slp create mode 100644 libraries/render-utils/src/render-utils/forward_skin_translucent_dq.slp create mode 100644 libraries/render-utils/src/render-utils/forward_skin_translucent_normal_map.slp create mode 100644 libraries/render-utils/src/render-utils/forward_skin_translucent_normal_map_dq.slp create mode 100644 libraries/render-utils/src/render-utils/fxaa_blend.slp create mode 100644 libraries/render-utils/src/render-utils/glowLine.slp create mode 100644 libraries/render-utils/src/render-utils/grid.slp create mode 100644 libraries/render-utils/src/render-utils/haze.slp create mode 100644 libraries/render-utils/src/render-utils/highlight.slp create mode 100644 libraries/render-utils/src/render-utils/highlight_aabox.slp create mode 100644 libraries/render-utils/src/render-utils/highlight_filled.slp create mode 100644 libraries/render-utils/src/render-utils/hmd_ui.slp create mode 100644 libraries/render-utils/src/render-utils/lightClusters_drawClusterContent.slp create mode 100644 libraries/render-utils/src/render-utils/lightClusters_drawClusterFromDepth.slp create mode 100644 libraries/render-utils/src/render-utils/lightClusters_drawGrid.slp create mode 100644 libraries/render-utils/src/render-utils/local_lights_drawOutline.slp create mode 100644 libraries/render-utils/src/render-utils/local_lights_shading.slp create mode 100644 libraries/render-utils/src/render-utils/model.slp create mode 100644 libraries/render-utils/src/render-utils/model_fade.slp create mode 100644 libraries/render-utils/src/render-utils/model_lightmap.slp create mode 100644 libraries/render-utils/src/render-utils/model_lightmap_fade.slp create mode 100644 libraries/render-utils/src/render-utils/model_lightmap_normal_map.slp create mode 100644 libraries/render-utils/src/render-utils/model_lightmap_normal_map_fade.slp create mode 100644 libraries/render-utils/src/render-utils/model_normal_map.slp create mode 100644 libraries/render-utils/src/render-utils/model_normal_map_fade.slp create mode 100644 libraries/render-utils/src/render-utils/model_shadow.slp create mode 100644 libraries/render-utils/src/render-utils/model_shadow_fade.slp create mode 100644 libraries/render-utils/src/render-utils/model_translucent.slp create mode 100644 libraries/render-utils/src/render-utils/model_translucent_fade.slp create mode 100644 libraries/render-utils/src/render-utils/model_translucent_normal_map.slp create mode 100644 libraries/render-utils/src/render-utils/model_translucent_normal_map_fade.slp create mode 100644 libraries/render-utils/src/render-utils/model_translucent_unlit.slp create mode 100644 libraries/render-utils/src/render-utils/model_translucent_unlit_fade.slp create mode 100644 libraries/render-utils/src/render-utils/model_unlit.slp create mode 100644 libraries/render-utils/src/render-utils/model_unlit_fade.slp create mode 100644 libraries/render-utils/src/render-utils/parabola.slp create mode 100644 libraries/render-utils/src/render-utils/sdf_text3D.slp create mode 100644 libraries/render-utils/src/render-utils/sdf_text3D_transparent.slp create mode 100644 libraries/render-utils/src/render-utils/simple.slp create mode 100644 libraries/render-utils/src/render-utils/simpleTranslucent.slp create mode 100644 libraries/render-utils/src/render-utils/simpleTranslucentUnlit.slp create mode 100644 libraries/render-utils/src/render-utils/simpleUnlit.slp create mode 100644 libraries/render-utils/src/render-utils/simple_opaque_web_browser.slp create mode 100644 libraries/render-utils/src/render-utils/simple_textured.slp create mode 100644 libraries/render-utils/src/render-utils/simple_textured_fade.slp create mode 100644 libraries/render-utils/src/render-utils/simple_textured_unlit.slp create mode 100644 libraries/render-utils/src/render-utils/simple_textured_unlit_fade.slp create mode 100644 libraries/render-utils/src/render-utils/simple_transparent_textured.slp create mode 100644 libraries/render-utils/src/render-utils/simple_transparent_textured_fade.slp create mode 100644 libraries/render-utils/src/render-utils/simple_transparent_textured_unlit.slp create mode 100644 libraries/render-utils/src/render-utils/simple_transparent_textured_unlit_fade.slp create mode 100644 libraries/render-utils/src/render-utils/simple_transparent_web_browser.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_dq.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_fade.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_fade_dq.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_normal_map.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_normal_map_dq.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_normal_map_fade.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_normal_map_fade_dq.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_normal_map_translucent.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_normal_map_translucent_dq.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_normal_map_translucent_fade.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_normal_map_translucent_fade_dq.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_shadow.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_shadow_dq.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_shadow_fade.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_shadow_fade_dq.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_translucent.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_translucent_dq.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_translucent_fade.slp create mode 100644 libraries/render-utils/src/render-utils/skin_model_translucent_fade_dq.slp create mode 100644 libraries/render-utils/src/render-utils/ssao_debugOcclusion.slp create mode 100644 libraries/render-utils/src/render-utils/ssao_makeHorizontalBlur.slp create mode 100644 libraries/render-utils/src/render-utils/ssao_makeOcclusion.slp create mode 100644 libraries/render-utils/src/render-utils/ssao_makeVerticalBlur.slp create mode 100644 libraries/render-utils/src/render-utils/standardDrawTexture.slp create mode 100644 libraries/render-utils/src/render-utils/standardDrawTextureNoBlend.slp create mode 100644 libraries/render-utils/src/render-utils/stencil_drawMask.slp create mode 100644 libraries/render-utils/src/render-utils/subsurfaceScattering_drawScattering.slp create mode 100644 libraries/render-utils/src/render-utils/subsurfaceScattering_makeLUT.slp create mode 100644 libraries/render-utils/src/render-utils/subsurfaceScattering_makeProfile.slp create mode 100644 libraries/render-utils/src/render-utils/subsurfaceScattering_makeSpecularBeckmann.slp create mode 100644 libraries/render-utils/src/render-utils/surfaceGeometry_downsampleDepthNormal.slp create mode 100644 libraries/render-utils/src/render-utils/surfaceGeometry_makeCurvature.slp create mode 100644 libraries/render-utils/src/render-utils/surfaceGeometry_makeLinearDepth.slp create mode 100644 libraries/render-utils/src/render-utils/taa.slp create mode 100644 libraries/render-utils/src/render-utils/taa_blend.slp create mode 100644 libraries/render-utils/src/render-utils/toneMapping.slp create mode 100644 libraries/render-utils/src/render-utils/velocityBuffer_cameraMotion.slp create mode 100644 libraries/render-utils/src/render-utils/zone_drawAmbient.slp create mode 100644 libraries/render-utils/src/render-utils/zone_drawKeyLight.slp create mode 100644 libraries/render-utils/src/render-utils/zone_drawSkybox.slp create mode 100644 libraries/render/src/render/blurGaussianDepthAwareH.slp create mode 100644 libraries/render/src/render/blurGaussianDepthAwareV.slp create mode 100644 libraries/render/src/render/blurGaussianH.slp create mode 100644 libraries/render/src/render/blurGaussianV.slp create mode 100644 libraries/render/src/render/drawCellBounds.slp create mode 100644 libraries/render/src/render/drawItemBounds.slp create mode 100644 libraries/render/src/render/drawItemStatus.slp create mode 100644 libraries/render/src/render/drawLODReticle.slp diff --git a/cmake/macros/AutoScribeShader.cmake b/cmake/macros/AutoScribeShader.cmake index fec51fefc7..1d1e5970d9 100755 --- a/cmake/macros/AutoScribeShader.cmake +++ b/cmake/macros/AutoScribeShader.cmake @@ -8,290 +8,224 @@ # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html # -function(global_append varName varValue) - get_property(LOCAL_LIST GLOBAL PROPERTY ${varName}) - list(APPEND LOCAL_LIST ${varValue}) - set_property(GLOBAL PROPERTY ${varName} ${LOCAL_LIST}) -endfunction() - -function(AUTOSCRIBE_SHADER SHADER_FILE) - # Grab include files - foreach(includeFile ${ARGN}) - list(APPEND SHADER_INCLUDE_FILES ${includeFile}) - endforeach() - - foreach(SHADER_INCLUDE ${SHADER_INCLUDE_FILES}) - get_filename_component(INCLUDE_DIR ${SHADER_INCLUDE} PATH) - list(APPEND SHADER_INCLUDES_PATHS ${INCLUDE_DIR}) - endforeach() - - #Extract the unique include shader paths - set(INCLUDES ${HIFI_LIBRARIES_SHADER_INCLUDE_FILES}) - #message(${TARGET_NAME} Hifi for includes ${INCLUDES}) - foreach(EXTRA_SHADER_INCLUDE ${INCLUDES}) - list(APPEND SHADER_INCLUDES_PATHS ${EXTRA_SHADER_INCLUDE}) - endforeach() - - list(REMOVE_DUPLICATES SHADER_INCLUDES_PATHS) - #message(ready for includes ${SHADER_INCLUDES_PATHS}) - - # make the scribe include arguments - set(SCRIBE_INCLUDES) - foreach(INCLUDE_PATH ${SHADER_INCLUDES_PATHS}) - set(SCRIBE_INCLUDES ${SCRIBE_INCLUDES} -I ${INCLUDE_PATH}/) - endforeach() - - # Define the final name of the generated shader file - get_filename_component(SHADER_TARGET ${SHADER_FILE} NAME_WE) - get_filename_component(SHADER_EXT ${SHADER_FILE} EXT) - if(SHADER_EXT STREQUAL .slv) - set(SHADER_TYPE vert) - elseif(${SHADER_EXT} STREQUAL .slf) - set(SHADER_TYPE frag) - elseif(${SHADER_EXT} STREQUAL .slg) - set(SHADER_TYPE geom) - endif() - file(MAKE_DIRECTORY "${SHADERS_DIR}/${SHADER_LIB}") - set(SHADER_TARGET "${SHADERS_DIR}/${SHADER_LIB}/${SHADER_TARGET}.${SHADER_TYPE}") - set(SCRIBE_COMMAND scribe) - - # Target dependant Custom rule on the SHADER_FILE - if (APPLE) - set(GLPROFILE MAC_GL) - elseif (ANDROID) - set(GLPROFILE LINUX_GL) - set(SCRIBE_COMMAND ${NATIVE_SCRIBE}) - elseif (UNIX) - set(GLPROFILE LINUX_GL) - else () - set(GLPROFILE PC_GL) - endif() - set(SCRIBE_ARGS -T ${SHADER_TYPE} -D GLPROFILE ${GLPROFILE} ${SCRIBE_INCLUDES} -o ${SHADER_TARGET} ${SHADER_FILE}) - add_custom_command( - OUTPUT ${SHADER_TARGET} - COMMAND ${SCRIBE_COMMAND} ${SCRIBE_ARGS} - DEPENDS ${SHADER_FILE} ${SCRIBE_COMMAND} ${SHADER_INCLUDE_FILES} - ) - - #output the generated file name - set(AUTOSCRIBE_SHADER_RETURN ${SHADER_TARGET} PARENT_SCOPE) -endfunction() - -macro(AUTOSCRIBE_APPEND_SHADER_SOURCES) - if (NOT("${ARGN}" STREQUAL "")) - set_property(GLOBAL PROPERTY ${TARGET_NAME}_SHADER_SOURCES "${ARGN}") - global_append(GLOBAL_SHADER_LIBS ${TARGET_NAME}) - global_append(GLOBAL_SHADER_SOURCES "${ARGN}") - endif() -endmacro() - -macro(AUTOSCRIBE_SHADER_LIB) - unset(HIFI_LIBRARIES_SHADER_INCLUDE_FILES) - set(SRC_FOLDER "${CMAKE_SOURCE_DIR}/libraries/${TARGET_NAME}/src") - - file(GLOB_RECURSE SHADER_INCLUDE_FILES ${SRC_FOLDER}/*.slh) - file(GLOB_RECURSE SHADER_VERTEX_FILES ${SRC_FOLDER}/*.slv) - file(GLOB_RECURSE SHADER_FRAGMENT_FILES ${SRC_FOLDER}/*.slf) - file(GLOB_RECURSE SHADER_GEOMETRY_FILES ${SRC_FOLDER}/*.slg) - file(GLOB_RECURSE SHADER_COMPUTE_FILES ${SRC_FOLDER}/*.slc) - - unset(SHADER_SOURCE_FILES) - list(APPEND SHADER_SOURCE_FILES ${SHADER_VERTEX_FILES}) - list(APPEND SHADER_SOURCE_FILES ${SHADER_FRAGMENT_FILES}) - list(APPEND SHADER_SOURCE_FILES ${SHADER_GEOMETRY_FILES}) - list(APPEND SHADER_SOURCE_FILES ${SHADER_COMPUTE_FILES}) - - unset(LOCAL_SHADER_SOURCES) - list(APPEND LOCAL_SHADER_SOURCES ${SHADER_SOURCE_FILES}) - list(APPEND LOCAL_SHADER_SOURCES ${SHADER_INCLUDE_FILES}) - - AUTOSCRIBE_APPEND_SHADER_SOURCES(${LOCAL_SHADER_SOURCES}) - - file(RELATIVE_PATH RELATIVE_LIBRARY_DIR_PATH ${CMAKE_CURRENT_SOURCE_DIR} "${HIFI_LIBRARY_DIR}") - foreach(HIFI_LIBRARY ${ARGN}) - list(APPEND HIFI_LIBRARIES_SHADER_INCLUDE_FILES ${HIFI_LIBRARY_DIR}/${HIFI_LIBRARY}/src) - endforeach() -endmacro() - -macro(AUTOSCRIBE_PROGRAM) - set(oneValueArgs NAME VERTEX FRAGMENT GEOMETRY COMPUTE) - cmake_parse_arguments(AUTOSCRIBE_PROGRAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - if (NOT (DEFINED AUTOSCRIBE_PROGRAM_NAME)) - message(FATAL_ERROR "Programs must have a name and both a vertex and fragment shader") - endif() - if (NOT (DEFINED AUTOSCRIBE_PROGRAM_VERTEX)) - set(AUTOSCRIBE_PROGRAM_VERTEX ${AUTOSCRIBE_PROGRAM_NAME}) - endif() - if (NOT (DEFINED AUTOSCRIBE_PROGRAM_FRAGMENT)) - set(AUTOSCRIBE_PROGRAM_FRAGMENT ${AUTOSCRIBE_PROGRAM_NAME}) - endif() - - if (NOT (${AUTOSCRIBE_PROGRAM_VERTEX} MATCHES ".*::.*")) - set(AUTOSCRIBE_PROGRAM_VERTEX "vertex::${AUTOSCRIBE_PROGRAM_VERTEX}") - endif() - if (NOT (${AUTOSCRIBE_PROGRAM_FRAGMENT} MATCHES ".*::.*")) - set(AUTOSCRIBE_PROGRAM_FRAGMENT "fragment::${AUTOSCRIBE_PROGRAM_FRAGMENT}") - endif() - - unset(AUTOSCRIBE_PROGRAM_MAP) - list(APPEND AUTOSCRIBE_PROGRAM_MAP AUTOSCRIBE_PROGRAM_VERTEX) - list(APPEND AUTOSCRIBE_PROGRAM_MAP ${AUTOSCRIBE_PROGRAM_VERTEX}) - list(APPEND AUTOSCRIBE_PROGRAM_MAP AUTOSCRIBE_PROGRAM_FRAGMENT) - list(APPEND AUTOSCRIBE_PROGRAM_MAP ${AUTOSCRIBE_PROGRAM_FRAGMENT}) - global_append(${TARGET_NAME}_PROGRAMS ${AUTOSCRIBE_PROGRAM_NAME}) - set_property(GLOBAL PROPERTY ${AUTOSCRIBE_PROGRAM_NAME} "${AUTOSCRIBE_PROGRAM_MAP}") -endmacro() - -macro(unpack_map) - set(MAP_VAR "${ARGN}") - list(LENGTH MAP_VAR MAP_SIZE) - MATH(EXPR MAP_ENTRY_RANGE "(${MAP_SIZE} / 2) - 1") - foreach(INDEX RANGE ${MAP_ENTRY_RANGE}) - MATH(EXPR INDEX_NAME "${INDEX} * 2") - MATH(EXPR INDEX_VAL "${INDEX_NAME} + 1") - list(GET MAP_VAR ${INDEX_NAME} VAR_NAME) - list(GET MAP_VAR ${INDEX_VAL} VAR_VAL) - set(${VAR_NAME} ${VAR_VAL}) +macro(AUTOSCRIBE_SHADER) + message(STATUS "Processing shader ${SHADER_FILE}") + unset(SHADER_INCLUDE_FILES) + # Grab include files + foreach(includeFile ${ARGN}) + list(APPEND SHADER_INCLUDE_FILES ${includeFile}) endforeach() -endmacro() -macro(PROCESS_SHADER_FILE) - AUTOSCRIBE_SHADER(${SHADER} ${ALL_SHADER_HEADERS} ${HIFI_LIBRARIES_SHADER_INCLUDE_FILES}) - file(TO_CMAKE_PATH "${AUTOSCRIBE_SHADER_RETURN}" AUTOSCRIBE_GENERATED_FILE) - set_property(SOURCE ${AUTOSCRIBE_GENERATED_FILE} PROPERTY SKIP_AUTOMOC ON) - source_group("Compiled/${SHADER_LIB}" FILES ${AUTOSCRIBE_GENERATED_FILE}) - set(REFLECTED_SHADER "${AUTOSCRIBE_GENERATED_FILE}.json") + foreach(SHADER_INCLUDE ${SHADER_INCLUDE_FILES}) + get_filename_component(INCLUDE_DIR ${SHADER_INCLUDE} PATH) + list(APPEND SHADER_INCLUDES_PATHS ${INCLUDE_DIR}) + endforeach() + + list(REMOVE_DUPLICATES SHADER_INCLUDES_PATHS) + #Extract the unique include shader paths + set(INCLUDES ${HIFI_LIBRARIES_SHADER_INCLUDE_FILES}) + foreach(EXTRA_SHADER_INCLUDE ${INCLUDES}) + list(APPEND SHADER_INCLUDES_PATHS ${EXTRA_SHADER_INCLUDE}) + endforeach() + + list(REMOVE_DUPLICATES SHADER_INCLUDES_PATHS) + #message(ready for includes ${SHADER_INCLUDES_PATHS}) + + # make the scribe include arguments + set(SCRIBE_INCLUDES) + foreach(INCLUDE_PATH ${SHADER_INCLUDES_PATHS}) + set(SCRIBE_INCLUDES ${SCRIBE_INCLUDES} -I ${INCLUDE_PATH}/) + endforeach() + + # Define the final name of the generated shader file + get_filename_component(SHADER_NAME ${SHADER_FILE} NAME_WE) + get_filename_component(SHADER_EXT ${SHADER_FILE} EXT) + if(SHADER_EXT STREQUAL .slv) + set(SHADER_TYPE vert) + elseif(${SHADER_EXT} STREQUAL .slf) + set(SHADER_TYPE frag) + elseif(${SHADER_EXT} STREQUAL .slg) + set(SHADER_TYPE geom) + endif() + file(MAKE_DIRECTORY "${SHADERS_DIR}/${SHADER_LIB}") + set(SHADER_TARGET "${SHADERS_DIR}/${SHADER_LIB}/${SHADER_NAME}.${SHADER_TYPE}") + file(TO_CMAKE_PATH "${SHADER_TARGET}" COMPILED_SHADER) + set(REFLECTED_SHADER "${COMPILED_SHADER}.json") + + set(SCRIBE_ARGS -T ${SHADER_TYPE} -D GLPROFILE ${GLPROFILE} ${SCRIBE_INCLUDES} -o ${SHADER_TARGET} ${SHADER_FILE}) + + # Generate the frag/vert file + add_custom_command( + OUTPUT ${SHADER_TARGET} + COMMAND ${SCRIBE_COMMAND} ${SCRIBE_ARGS} + DEPENDS ${SHADER_FILE} ${SCRIBE_COMMAND} ${SHADER_INCLUDE_FILES}) + + # Generate the json reflection + # FIXME move to spirv-cross for this task after we have spirv compatible shaders + add_custom_command( + OUTPUT ${REFLECTED_SHADER} + COMMAND ${SHREFLECT_COMMAND} ${COMPILED_SHADER} + DEPENDS ${SHREFLECT_DEPENDENCY} ${COMPILED_SHADER}) + + #output the generated file name + source_group("Compiled/${SHADER_LIB}" FILES ${COMPILED_SHADER}) + set_property(SOURCE ${COMPILED_SHADER} PROPERTY SKIP_AUTOMOC ON) + list(APPEND COMPILED_SHADERS ${COMPILED_SHADER}) + source_group("Reflected/${SHADER_LIB}" FILES ${REFLECTED_SHADER}) - list(APPEND COMPILED_SHADERS ${AUTOSCRIBE_GENERATED_FILE}) - get_filename_component(ENUM_NAME ${SHADER} NAME_WE) - string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "${ENUM_NAME} = ${SHADER_COUNT},\n") + list(APPEND REFLECTED_SHADERS ${REFLECTED_SHADER}) + + string(CONCAT SHADER_QRC "${SHADER_QRC}" "${COMPILED_SHADER}\n") + string(CONCAT SHADER_QRC "${SHADER_QRC}" "${REFLECTED_SHADER}\n") + string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "${SHADER_NAME} = ${SHADER_COUNT},\n") + MATH(EXPR SHADER_COUNT "${SHADER_COUNT}+1") endmacro() -macro(AUTOSCRIBE_SHADER_FINISH) - get_property(GLOBAL_SHADER_LIBS GLOBAL PROPERTY GLOBAL_SHADER_LIBS) - list(REMOVE_DUPLICATES GLOBAL_SHADER_LIBS) - set(SHADER_COUNT 0) - set(PROGRAM_COUNT 0) +macro(AUTOSCRIBE_SHADER_LIB) + if (NOT ("${TARGET_NAME}" STREQUAL "shaders")) + message(FATAL_ERROR "AUTOSCRIBE_SHADER_LIB can only be used by the shaders library") + endif() + + list(APPEND HIFI_LIBRARIES_SHADER_INCLUDE_FILES "${CMAKE_SOURCE_DIR}/libraries/${SHADER_LIB}/src") + string(REGEX REPLACE "[-]" "_" SHADER_NAMESPACE ${SHADER_LIB}) + string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "namespace ${SHADER_NAMESPACE} {\n") + set(SRC_FOLDER "${CMAKE_SOURCE_DIR}/libraries/${ARGN}/src") + + # Process the scribe headers + file(GLOB_RECURSE SHADER_INCLUDE_FILES ${SRC_FOLDER}/*.slh) + if(SHADER_INCLUDE_FILES) + source_group("${SHADER_LIB}/Headers" FILES ${SHADER_INCLUDE_FILES}) + list(APPEND ALL_SHADER_HEADERS ${SHADER_INCLUDE_FILES}) + list(APPEND ALL_SCRIBE_SHADERS ${SHADER_INCLUDE_FILES}) + endif() + + file(GLOB_RECURSE SHADER_VERTEX_FILES ${SRC_FOLDER}/*.slv) + if (SHADER_VERTEX_FILES) + source_group("${SHADER_LIB}/Vertex" FILES ${SHADER_VERTEX_FILES}) + list(APPEND ALL_SCRIBE_SHADERS ${SHADER_VERTEX_FILES}) + string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "namespace vertex { enum {\n") + foreach(SHADER_FILE ${SHADER_VERTEX_FILES}) + AUTOSCRIBE_SHADER(${ALL_SHADER_HEADERS}) + endforeach() + string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "}; } // vertex \n") + endif() + + file(GLOB_RECURSE SHADER_FRAGMENT_FILES ${SRC_FOLDER}/*.slf) + if (SHADER_FRAGMENT_FILES) + source_group("${SHADER_LIB}/Fragment" FILES ${SHADER_FRAGMENT_FILES}) + list(APPEND ALL_SCRIBE_SHADERS ${SHADER_FRAGMENT_FILES}) + string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "namespace fragment { enum {\n") + foreach(SHADER_FILE ${SHADER_FRAGMENT_FILES}) + AUTOSCRIBE_SHADER(${ALL_SHADER_HEADERS}) + endforeach() + string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "}; } // fragment \n") + endif() + + # FIXME add support for geometry, compute and tesselation shaders + #file(GLOB_RECURSE SHADER_GEOMETRY_FILES ${SRC_FOLDER}/*.slg) + #file(GLOB_RECURSE SHADER_COMPUTE_FILES ${SRC_FOLDER}/*.slc) + + # the programs + file(GLOB_RECURSE SHADER_PROGRAM_FILES ${SRC_FOLDER}/*.slp) + if (SHADER_PROGRAM_FILES) + source_group("${SHADER_LIB}/Program" FILES ${SHADER_PROGRAM_FILES}) + list(APPEND ALL_SCRIBE_SHADERS ${SHADER_PROGRAM_FILES}) + string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "namespace program { enum {\n") + foreach(PROGRAM_FILE ${SHADER_PROGRAM_FILES}) + get_filename_component(PROGRAM_NAME ${PROGRAM_FILE} NAME_WE) + set(AUTOSCRIBE_PROGRAM_FRAGMENT ${PROGRAM_NAME}) + file(READ ${PROGRAM_FILE} PROGRAM_CONFIG) + set(AUTOSCRIBE_PROGRAM_VERTEX ${PROGRAM_NAME}) + set(AUTOSCRIBE_PROGRAM_FRAGMENT ${PROGRAM_NAME}) + + if (NOT("${PROGRAM_CONFIG}" STREQUAL "")) + string(REGEX MATCH ".*VERTEX +([_\\:A-Z0-9a-z]+)" MVERT ${PROGRAM_CONFIG}) + if (CMAKE_MATCH_1) + set(AUTOSCRIBE_PROGRAM_VERTEX ${CMAKE_MATCH_1}) + endif() + string(REGEX MATCH ".*FRAGMENT +([_:A-Z0-9a-z]+)" MFRAG ${PROGRAM_CONFIG}) + if (CMAKE_MATCH_1) + set(AUTOSCRIBE_PROGRAM_FRAGMENT ${CMAKE_MATCH_1}) + endif() + endif() + + if (NOT (${AUTOSCRIBE_PROGRAM_VERTEX} MATCHES ".*::.*")) + set(AUTOSCRIBE_PROGRAM_VERTEX "vertex::${AUTOSCRIBE_PROGRAM_VERTEX}") + endif() + if (NOT (${AUTOSCRIBE_PROGRAM_FRAGMENT} MATCHES ".*::.*")) + set(AUTOSCRIBE_PROGRAM_FRAGMENT "fragment::${AUTOSCRIBE_PROGRAM_FRAGMENT}") + endif() + + set(PROGRAM_ENTRY "${PROGRAM_NAME} = (${AUTOSCRIBE_PROGRAM_VERTEX} << 16) | ${AUTOSCRIBE_PROGRAM_FRAGMENT},\n") + string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "${PROGRAM_ENTRY}") + string(CONCAT SHADER_PROGRAMS_ARRAY "${SHADER_PROGRAMS_ARRAY} ${SHADER_NAMESPACE}::program::${PROGRAM_NAME},\n") + endforeach() + string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "}; } // program \n") + endif() + + # Finish the shader enums + string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "} // namespace ${SHADER_NAMESPACE}\n") + #file(RELATIVE_PATH RELATIVE_LIBRARY_DIR_PATH ${CMAKE_CURRENT_SOURCE_DIR} "${HIFI_LIBRARY_DIR}") + #foreach(HIFI_LIBRARY ${ARGN}) + #list(APPEND HIFI_LIBRARIES_SHADER_INCLUDE_FILES ${HIFI_LIBRARY_DIR}/${HIFI_LIBRARY}/src) + #endforeach() + #endif() +endmacro() + +macro(AUTOSCRIBE_SHADER_LIBS) + set(SCRIBE_COMMAND scribe) + set(SHREFLECT_COMMAND shreflect) + set(SHREFLECT_DEPENDENCY shreflect) + + # Target dependant Custom rule on the SHADER_FILE + if (ANDROID) + set(GLPROFILE LINUX_GL) + set(SCRIBE_COMMAND ${NATIVE_SCRIBE}) + set(SHREFLECT_COMMAND ${NATIVE_SHREFLECT}) + unset(SHREFLECT_DEPENDENCY) + else() + if (APPLE) + set(GLPROFILE MAC_GL) + elseif(UNIX) + set(GLPROFILE LINUX_GL) + else() + set(GLPROFILE PC_GL) + endif() + endif() + + # Start the shader IDs + set(SHADER_COUNT 1) set(SHADERS_DIR "${CMAKE_CURRENT_BINARY_DIR}/shaders") set(SHADER_ENUMS "") file(MAKE_DIRECTORY ${SHADERS_DIR}) - unset(COMPILED_SHADERS) - foreach(SHADER_LIB ${GLOBAL_SHADER_LIBS}) - get_property(LIB_SHADER_SOURCES GLOBAL PROPERTY ${SHADER_LIB}_SHADER_SOURCES) - get_property(LIB_PROGRAMS GLOBAL PROPERTY ${SHADER_LIB}_PROGRAMS) - list(REMOVE_DUPLICATES LIB_SHADER_SOURCES) - string(REGEX REPLACE "[-]" "_" SHADER_NAMESPACE ${SHADER_LIB}) - list(APPEND HIFI_LIBRARIES_SHADER_INCLUDE_FILES "${CMAKE_SOURCE_DIR}/libraries/${SHADER_LIB}/src") - - unset(VERTEX_SHADERS) - unset(FRAGMENT_SHADERS) - unset(SHADER_HEADERS) - - foreach(SHADER_FILE ${LIB_SHADER_SOURCES}) - if (SHADER_FILE MATCHES ".*\\.slv") - list(APPEND VERTEX_SHADERS ${SHADER_FILE}) - elseif (SHADER_FILE MATCHES ".*\\.slf") - list(APPEND FRAGMENT_SHADERS ${SHADER_FILE}) - elseif (SHADER_FILE MATCHES ".*\\.slh") - list(APPEND SHADER_HEADERS ${SHADER_FILE}) - endif() - endforeach() - - if (DEFINED SHADER_HEADERS) - list(REMOVE_DUPLICATES SHADER_HEADERS) - source_group("${SHADER_LIB}/Headers" FILES ${SHADER_HEADERS}) - list(APPEND ALL_SHADER_HEADERS ${SHADER_HEADERS}) - list(APPEND ALL_SCRIBE_SHADERS ${SHADER_HEADERS}) - endif() - - string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "namespace ${SHADER_NAMESPACE} {\n") - if (DEFINED VERTEX_SHADERS) - list(REMOVE_DUPLICATES VERTEX_SHADERS) - source_group("${SHADER_LIB}/Vertex" FILES ${VERTEX_SHADERS}) - list(APPEND ALL_SCRIBE_SHADERS ${VERTEX_SHADERS}) - string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "namespace vertex { enum {\n") - foreach(SHADER ${VERTEX_SHADERS}) - process_shader_file() - endforeach() - string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "}; } // vertex \n") - endif() - - if (DEFINED FRAGMENT_SHADERS) - list(REMOVE_DUPLICATES FRAGMENT_SHADERS) - source_group("${SHADER_LIB}/Fragment" FILES ${FRAGMENT_SHADERS}) - list(APPEND ALL_SCRIBE_SHADERS ${FRAGMENT_SHADERS}) - string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "namespace fragment { enum {\n") - foreach(SHADER ${FRAGMENT_SHADERS}) - process_shader_file() - endforeach() - string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "}; } // fragment \n") - endif() - - if (DEFINED LIB_PROGRAMS) - string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "namespace program { enum {\n") - foreach(LIB_PROGRAM ${LIB_PROGRAMS}) - get_property(LIB_PROGRAM_MAP GLOBAL PROPERTY ${LIB_PROGRAM}) - unpack_map(${LIB_PROGRAM_MAP}) - string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "${LIB_PROGRAM} = (${AUTOSCRIBE_PROGRAM_VERTEX} << 16) | ${AUTOSCRIBE_PROGRAM_FRAGMENT},\n") - MATH(EXPR PROGRAM_COUNT "${PROGRAM_COUNT}+1") - list(APPEND SHADER_ALL_PROGRAMS "${SHADER_NAMESPACE}::program::${LIB_PROGRAM}") - endforeach() - string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "}; } // program \n") - endif() - string(CONCAT SHADER_ENUMS "${SHADER_ENUMS}" "} // namespace ${SHADER_NAMESPACE}\n") + # + # Scribe generation & program defintiion + # + foreach(SHADER_LIB ${ARGN}) + AUTOSCRIBE_SHADER_LIB(${SHADER_LIB}) endforeach() - set(SHADER_PROGRAMS_ARRAY "") - foreach(SHADER_PROGRAM ${SHADER_ALL_PROGRAMS}) - string(CONCAT SHADER_PROGRAMS_ARRAY "${SHADER_PROGRAMS_ARRAY}" " ${SHADER_PROGRAM},\n") - endforeach() + # Generate the library files + configure_file( + ShaderEnums.cpp.in + ${CMAKE_CURRENT_BINARY_DIR}/shaders/ShaderEnums.cpp) + configure_file( + ShaderEnums.h.in + ${CMAKE_CURRENT_BINARY_DIR}/shaders/ShaderEnums.h) + configure_file( + shaders.qrc.in + ${CMAKE_CURRENT_BINARY_DIR}/shaders.qrc) - set(SHREFLECT_COMMAND shreflect) - set(SHREFLECT_DEPENDENCY shreflect) - if (ANDROID) - set(SHREFLECT_COMMAND ${NATIVE_SHREFLECT}) - unset(SHREFLECT_DEPENDENCY) - endif() - - set(SHADER_COUNT 0) - foreach(COMPILED_SHADER ${COMPILED_SHADERS}) - set(REFLECTED_SHADER "${COMPILED_SHADER}.json") - list(APPEND COMPILED_SHADER_REFLECTIONS ${REFLECTED_SHADER}) - string(CONCAT SHADER_QRC "${SHADER_QRC}" "${COMPILED_SHADER}\n") - string(CONCAT SHADER_QRC "${SHADER_QRC}" "${REFLECTED_SHADER}\n") - MATH(EXPR SHADER_COUNT "${SHADER_COUNT}+1") - add_custom_command( - OUTPUT ${REFLECTED_SHADER} - COMMAND ${SHREFLECT_COMMAND} ${COMPILED_SHADER} - DEPENDS ${SHREFLECT_DEPENDENCY} ${COMPILED_SHADER} - ) - endforeach() + set(AUTOSCRIBE_SHADER_LIB_SRC "${CMAKE_CURRENT_BINARY_DIR}/shaders/ShaderEnums.h;${CMAKE_CURRENT_BINARY_DIR}/shaders/ShaderEnums.cpp") + set(QT_RESOURCES_FILE ${CMAKE_CURRENT_BINARY_DIR}/shaders.qrc) # Custom targets required to force generation of the shaders via scribe add_custom_target(scribe_shaders SOURCES ${ALL_SCRIBE_SHADERS}) add_custom_target(compiled_shaders SOURCES ${COMPILED_SHADERS}) - add_custom_target(reflected_shaders SOURCES ${COMPILED_SHADER_REFLECTIONS}) + add_custom_target(reflected_shaders SOURCES ${REFLECTED_SHADERS}) set_target_properties(scribe_shaders PROPERTIES FOLDER "Shaders") set_target_properties(compiled_shaders PROPERTIES FOLDER "Shaders") set_target_properties(reflected_shaders PROPERTIES FOLDER "Shaders") - - configure_file( - ShaderEnums.cpp.in - ${CMAKE_CURRENT_BINARY_DIR}/shaders/ShaderEnums.cpp - ) - configure_file( - ShaderEnums.h.in - ${CMAKE_CURRENT_BINARY_DIR}/shaders/ShaderEnums.h - ) - configure_file( - shaders.qrc.in - ${CMAKE_CURRENT_BINARY_DIR}/shaders.qrc - ) - set(AUTOSCRIBE_SHADER_LIB_SRC "${CMAKE_CURRENT_BINARY_DIR}/shaders/ShaderEnums.h;${CMAKE_CURRENT_BINARY_DIR}/shaders/ShaderEnums.cpp") - list(APPEND AUTOSCRIBE_SHADER_LIB_SRC ${COMPILED_SHADERS}) - set(QT_RESOURCES_FILE ${CMAKE_CURRENT_BINARY_DIR}/shaders.qrc) - get_property(GLOBAL_SHADER_SOURCES GLOBAL PROPERTY GLOBAL_SHADER_SOURCES) - list(REMOVE_DUPLICATES GLOBAL_SHADER_SOURCES) endmacro() diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0bbd2b1c17..3b52b7a123 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -266,19 +266,10 @@ class RenderEventHandler : public QObject { using Parent = QObject; Q_OBJECT public: - RenderEventHandler(QOpenGLContext* context) { - _renderContext = new OffscreenGLCanvas(); - _renderContext->setObjectName("RenderContext"); - _renderContext->create(context); - if (!_renderContext->makeCurrent()) { - qFatal("Unable to make rendering context current"); - } - _renderContext->doneCurrent(); - + RenderEventHandler() { // Transfer to a new thread moveToNewNamedThread(this, "RenderThread", [this](QThread* renderThread) { hifi::qt::addBlockingForbiddenThread("Render", renderThread); - _renderContext->moveToThreadWithContext(renderThread); qApp->_lastTimeRendered.start(); }, std::bind(&RenderEventHandler::initialize, this), QThread::HighestPriority); } @@ -288,9 +279,6 @@ private: setObjectName("Render"); PROFILE_SET_THREAD_NAME("Render"); setCrashAnnotation("render_thread_id", std::to_string((size_t)QThread::currentThreadId())); - if (!_renderContext->makeCurrent()) { - qFatal("Unable to make rendering context current on render thread"); - } } void render() { @@ -311,8 +299,6 @@ private: } return Parent::event(event); } - - OffscreenGLCanvas* _renderContext { nullptr }; }; @@ -2675,26 +2661,14 @@ void Application::initializeGL() { } } - // Build an offscreen GL context for the main thread. - _offscreenContext = new OffscreenGLCanvas(); - _offscreenContext->setObjectName("MainThreadContext"); - _offscreenContext->create(_glWidget->qglContext()); - if (!_offscreenContext->makeCurrent()) { - qFatal("Unable to make offscreen context current"); - } - _offscreenContext->doneCurrent(); - _offscreenContext->setThreadContext(); + _renderEventHandler = new RenderEventHandler(); + // Build an offscreen GL context for the main thread. _glWidget->makeCurrent(); glClearColor(0.2f, 0.2f, 0.2f, 1); glClear(GL_COLOR_BUFFER_BIT); _glWidget->swapBuffers(); - // Move the GL widget context to the render event handler thread - _renderEventHandler = new RenderEventHandler(_glWidget->qglContext()); - if (!_offscreenContext->makeCurrent()) { - qFatal("Unable to make offscreen context current"); - } // Create the GPU backend @@ -2707,9 +2681,6 @@ void Application::initializeGL() { _gpuContext = std::make_shared(); DependencyManager::get()->setGPUContext(_gpuContext); - - // Restore the default main thread context - _offscreenContext->makeCurrent(); } static const QString SPLASH_SKYBOX{ "{\"ProceduralEntity\":{ \"version\":2, \"shaderUrl\":\"qrc:///shaders/splashSkybox.frag\" } }" }; @@ -2748,8 +2719,6 @@ void Application::initializeDisplayPlugins() { // Submit a default frame to render until the engine starts up updateRenderArgs(0.0f); - _offscreenContext->makeCurrent(); - #define ENABLE_SPLASH_FRAME 0 #if ENABLE_SPLASH_FRAME { @@ -2791,8 +2760,6 @@ void Application::initializeDisplayPlugins() { } void Application::initializeRenderEngine() { - _offscreenContext->makeCurrent(); - // FIXME: on low end systems os the shaders take up to 1 minute to compile, so we pause the deadlock watchdog thread. DeadlockWatchdogThread::withPause([&] { // Set up the render engine @@ -4534,7 +4501,6 @@ void Application::idle() { if (offscreenUi->size() != fromGlm(uiSize)) { qCDebug(interfaceapp) << "Device pixel ratio changed, triggering resize to " << uiSize; offscreenUi->resize(fromGlm(uiSize)); - _offscreenContext->makeCurrent(); } } @@ -4592,10 +4558,6 @@ void Application::idle() { bool showWarnings = getLogger()->extraDebugging(); PerformanceWarning warn(showWarnings, "idle()"); - if (!_offscreenContext->makeCurrent()) { - qFatal("Unable to make main thread context current"); - } - { _gameWorkload.updateViews(_viewFrustum, getMyAvatar()->getHeadPosition()); _gameWorkload._engine->run(); @@ -4923,7 +4885,6 @@ QVector Application::pasteEntities(float x, float y, float z) { } void Application::init() { - _offscreenContext->makeCurrent(); // Make sure Login state is up to date DependencyManager::get()->toggleLoginDialog(); if (!DISABLE_DEFERRED) { @@ -8317,7 +8278,7 @@ QOpenGLContext* Application::getPrimaryContext() { } bool Application::makeRenderingContextCurrent() { - return _offscreenContext->makeCurrent(); + return true; } bool Application::isForeground() const { diff --git a/interface/src/Application.h b/interface/src/Application.h index 94e561e550..f7396172c8 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -81,7 +81,6 @@ #include "Sound.h" -class OffscreenGLCanvas; class GLCanvas; class FaceTracker; class MainWindow; @@ -554,7 +553,6 @@ private: bool _previousSessionCrashed; - OffscreenGLCanvas* _offscreenContext { nullptr }; DisplayPluginPointer _displayPlugin; QMetaObject::Connection _displayPluginPresentConnection; mutable std::mutex _displayPluginLock; diff --git a/libraries/avatars-renderer/CMakeLists.txt b/libraries/avatars-renderer/CMakeLists.txt index a70c8294d5..e6b6986e7b 100644 --- a/libraries/avatars-renderer/CMakeLists.txt +++ b/libraries/avatars-renderer/CMakeLists.txt @@ -1,5 +1,4 @@ set(TARGET_NAME avatars-renderer) -AUTOSCRIBE_SHADER_LIB(gpu graphics render render-utils) setup_hifi_library(Network Script) link_hifi_libraries(shared gpu graphics animation model-networking script-engine render render-utils image trackers entities-renderer) include_hifi_library_headers(avatars) diff --git a/libraries/display-plugins/CMakeLists.txt b/libraries/display-plugins/CMakeLists.txt index 529ef4c921..0674c9fd92 100644 --- a/libraries/display-plugins/CMakeLists.txt +++ b/libraries/display-plugins/CMakeLists.txt @@ -1,5 +1,4 @@ set(TARGET_NAME display-plugins) -AUTOSCRIBE_SHADER_LIB(gpu display-plugins) setup_hifi_library(Gui) link_hifi_libraries(shared shaders plugins ui-plugins gl ui render-utils ${PLATFORM_GL_BACKEND}) include_hifi_library_headers(gpu) diff --git a/libraries/display-plugins/src/display-plugins/InterleavedSrgbToLinear.slp b/libraries/display-plugins/src/display-plugins/InterleavedSrgbToLinear.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/display-plugins/src/display-plugins/InterleavedSrgbToLinear.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/display-plugins/src/display-plugins/SrgbToLinear.slp b/libraries/display-plugins/src/display-plugins/SrgbToLinear.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/display-plugins/src/display-plugins/SrgbToLinear.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/entities-renderer/src/entities-renderer/paintStroke.slp b/libraries/entities-renderer/src/entities-renderer/paintStroke.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/entities-renderer/src/entities-renderer/polyvox.slp b/libraries/entities-renderer/src/entities-renderer/polyvox.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/entities-renderer/src/entities-renderer/polyvox_fade.slp b/libraries/entities-renderer/src/entities-renderer/polyvox_fade.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/entities-renderer/src/entities-renderer/textured_particle.slp b/libraries/entities-renderer/src/entities-renderer/textured_particle.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/gpu/src/gpu/drawColor.slp b/libraries/gpu/src/gpu/drawColor.slp new file mode 100644 index 0000000000..1c81242fed --- /dev/null +++ b/libraries/gpu/src/gpu/drawColor.slp @@ -0,0 +1,3 @@ +VERTEX DrawTransformVertexPosition +FRAGMENT DrawColor +r diff --git a/libraries/gpu/src/gpu/drawNothing.slp b/libraries/gpu/src/gpu/drawNothing.slp new file mode 100644 index 0000000000..22e40db8fc --- /dev/null +++ b/libraries/gpu/src/gpu/drawNothing.slp @@ -0,0 +1,2 @@ +VERTEX DrawVertexPosition +FRAGMENT DrawNada diff --git a/libraries/gpu/src/gpu/drawTexture.slp b/libraries/gpu/src/gpu/drawTexture.slp new file mode 100644 index 0000000000..e04be84618 --- /dev/null +++ b/libraries/gpu/src/gpu/drawTexture.slp @@ -0,0 +1,2 @@ +VERTEX DrawUnitQuadTexcoord +FRAGMENT DrawTexture diff --git a/libraries/gpu/src/gpu/drawTextureOpaqueTexcoordRect.slp b/libraries/gpu/src/gpu/drawTextureOpaqueTexcoordRect.slp new file mode 100644 index 0000000000..9b08a99e18 --- /dev/null +++ b/libraries/gpu/src/gpu/drawTextureOpaqueTexcoordRect.slp @@ -0,0 +1,2 @@ +VERTEX DrawTexcoordRectTransformUnitQuad +FRAGMENT DrawTextureOpaque diff --git a/libraries/gpu/src/gpu/drawTransformUnitQuadTextureOpaque.slp b/libraries/gpu/src/gpu/drawTransformUnitQuadTextureOpaque.slp new file mode 100644 index 0000000000..5c76582568 --- /dev/null +++ b/libraries/gpu/src/gpu/drawTransformUnitQuadTextureOpaque.slp @@ -0,0 +1,2 @@ +VERTEX DrawTransformUnitQuad +FRAGMENT DrawTextureOpaque diff --git a/libraries/gpu/src/gpu/drawUnitQuatTextureOpaque.slp b/libraries/gpu/src/gpu/drawUnitQuatTextureOpaque.slp new file mode 100644 index 0000000000..2b03c79f32 --- /dev/null +++ b/libraries/gpu/src/gpu/drawUnitQuatTextureOpaque.slp @@ -0,0 +1,2 @@ +VERTEX DrawUnitQuadTexcoord +FRAGMENT DrawTextureOpaque diff --git a/libraries/graphics/src/graphics/skybox.slp b/libraries/graphics/src/graphics/skybox.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/animdebugdraw.slp b/libraries/render-utils/src/render-utils/animdebugdraw.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/bloomApply.slp b/libraries/render-utils/src/render-utils/bloomApply.slp new file mode 100644 index 0000000000..2fd542f895 --- /dev/null +++ b/libraries/render-utils/src/render-utils/bloomApply.slp @@ -0,0 +1,2 @@ +VERTEX gpu::vertex::DrawTransformUnitQuad +FRAGMENT BloomApply diff --git a/libraries/render-utils/src/render-utils/bloomThreshold.slp b/libraries/render-utils/src/render-utils/bloomThreshold.slp new file mode 100644 index 0000000000..9b39c9fb5c --- /dev/null +++ b/libraries/render-utils/src/render-utils/bloomThreshold.slp @@ -0,0 +1,2 @@ +VERTEX gpu::vertex::DrawTransformUnitQuad +FRAGMENT BloomThreshold diff --git a/libraries/render-utils/src/render-utils/directional_ambient_light.slp b/libraries/render-utils/src/render-utils/directional_ambient_light.slp new file mode 100644 index 0000000000..3aeca942ab --- /dev/null +++ b/libraries/render-utils/src/render-utils/directional_ambient_light.slp @@ -0,0 +1 @@ +VERTEX deferred_light diff --git a/libraries/render-utils/src/render-utils/directional_ambient_light_shadow.slp b/libraries/render-utils/src/render-utils/directional_ambient_light_shadow.slp new file mode 100644 index 0000000000..3aeca942ab --- /dev/null +++ b/libraries/render-utils/src/render-utils/directional_ambient_light_shadow.slp @@ -0,0 +1 @@ +VERTEX deferred_light diff --git a/libraries/render-utils/src/render-utils/directional_skybox_light.slp b/libraries/render-utils/src/render-utils/directional_skybox_light.slp new file mode 100644 index 0000000000..3aeca942ab --- /dev/null +++ b/libraries/render-utils/src/render-utils/directional_skybox_light.slp @@ -0,0 +1 @@ +VERTEX deferred_light diff --git a/libraries/render-utils/src/render-utils/directional_skybox_light_shadow.slp b/libraries/render-utils/src/render-utils/directional_skybox_light_shadow.slp new file mode 100644 index 0000000000..3aeca942ab --- /dev/null +++ b/libraries/render-utils/src/render-utils/directional_skybox_light_shadow.slp @@ -0,0 +1 @@ +VERTEX deferred_light diff --git a/libraries/render-utils/src/render-utils/drawWorkloadProxy.slp b/libraries/render-utils/src/render-utils/drawWorkloadProxy.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/drawWorkloadView.slp b/libraries/render-utils/src/render-utils/drawWorkloadView.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/forward_model.slp b/libraries/render-utils/src/render-utils/forward_model.slp new file mode 100644 index 0000000000..81ac672062 --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_model.slp @@ -0,0 +1 @@ +VERTEX model diff --git a/libraries/render-utils/src/render-utils/forward_model_normal_map.slp b/libraries/render-utils/src/render-utils/forward_model_normal_map.slp new file mode 100644 index 0000000000..c50be6285b --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_model_normal_map.slp @@ -0,0 +1 @@ +VERTEX model_normal_map diff --git a/libraries/render-utils/src/render-utils/forward_model_normal_map_translucent.slp b/libraries/render-utils/src/render-utils/forward_model_normal_map_translucent.slp new file mode 100644 index 0000000000..0979918b98 --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_model_normal_map_translucent.slp @@ -0,0 +1,2 @@ +VERTEX model_normal_map +FRAGMENT forward_model_translucent diff --git a/libraries/render-utils/src/render-utils/forward_model_translucent.slp b/libraries/render-utils/src/render-utils/forward_model_translucent.slp new file mode 100644 index 0000000000..81ac672062 --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_model_translucent.slp @@ -0,0 +1 @@ +VERTEX model diff --git a/libraries/render-utils/src/render-utils/forward_model_unlit.slp b/libraries/render-utils/src/render-utils/forward_model_unlit.slp new file mode 100644 index 0000000000..81ac672062 --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_model_unlit.slp @@ -0,0 +1 @@ +VERTEX model diff --git a/libraries/render-utils/src/render-utils/forward_simple_textured.slp b/libraries/render-utils/src/render-utils/forward_simple_textured.slp new file mode 100644 index 0000000000..10e6b388c4 --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_simple_textured.slp @@ -0,0 +1 @@ +VERTEX simple diff --git a/libraries/render-utils/src/render-utils/forward_simple_textured_transparent.slp b/libraries/render-utils/src/render-utils/forward_simple_textured_transparent.slp new file mode 100644 index 0000000000..10e6b388c4 --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_simple_textured_transparent.slp @@ -0,0 +1 @@ +VERTEX simple diff --git a/libraries/render-utils/src/render-utils/forward_simple_textured_unlit.slp b/libraries/render-utils/src/render-utils/forward_simple_textured_unlit.slp new file mode 100644 index 0000000000..10e6b388c4 --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_simple_textured_unlit.slp @@ -0,0 +1 @@ +VERTEX simple diff --git a/libraries/render-utils/src/render-utils/forward_skin_model.slp b/libraries/render-utils/src/render-utils/forward_skin_model.slp new file mode 100644 index 0000000000..962cf69ac2 --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_skin_model.slp @@ -0,0 +1,2 @@ +VERTEX skin_model +FRAGMENT forward_model diff --git a/libraries/render-utils/src/render-utils/forward_skin_model_dq.slp b/libraries/render-utils/src/render-utils/forward_skin_model_dq.slp new file mode 100644 index 0000000000..8fe119440f --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_skin_model_dq.slp @@ -0,0 +1,2 @@ +VERTEX skin_model_dq +FRAGMENT forward_model diff --git a/libraries/render-utils/src/render-utils/forward_skin_model_normal_map.slp b/libraries/render-utils/src/render-utils/forward_skin_model_normal_map.slp new file mode 100644 index 0000000000..5bae303829 --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_skin_model_normal_map.slp @@ -0,0 +1,2 @@ +VERTEX skin_model_normal_map +FRAGMENT forward_model_normal_map diff --git a/libraries/render-utils/src/render-utils/forward_skin_model_normal_map_dq.slp b/libraries/render-utils/src/render-utils/forward_skin_model_normal_map_dq.slp new file mode 100644 index 0000000000..551b8367c7 --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_skin_model_normal_map_dq.slp @@ -0,0 +1,2 @@ +VERTEX skin_model_normal_map_dq +FRAGMENT forward_model_normal_map diff --git a/libraries/render-utils/src/render-utils/forward_skin_translucent.slp b/libraries/render-utils/src/render-utils/forward_skin_translucent.slp new file mode 100644 index 0000000000..1468d52428 --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_skin_translucent.slp @@ -0,0 +1,2 @@ +VERTEX skin_model +FRAGMENT forward_model_translucent diff --git a/libraries/render-utils/src/render-utils/forward_skin_translucent_dq.slp b/libraries/render-utils/src/render-utils/forward_skin_translucent_dq.slp new file mode 100644 index 0000000000..688bf51ba2 --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_skin_translucent_dq.slp @@ -0,0 +1,2 @@ +VERTEX skin_model_dq +FRAGMENT forward_model_translucent diff --git a/libraries/render-utils/src/render-utils/forward_skin_translucent_normal_map.slp b/libraries/render-utils/src/render-utils/forward_skin_translucent_normal_map.slp new file mode 100644 index 0000000000..fe3db07670 --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_skin_translucent_normal_map.slp @@ -0,0 +1,2 @@ +VERTEX skin_model_normal_map +FRAGMENT forward_model_translucent diff --git a/libraries/render-utils/src/render-utils/forward_skin_translucent_normal_map_dq.slp b/libraries/render-utils/src/render-utils/forward_skin_translucent_normal_map_dq.slp new file mode 100644 index 0000000000..2012a77e89 --- /dev/null +++ b/libraries/render-utils/src/render-utils/forward_skin_translucent_normal_map_dq.slp @@ -0,0 +1,2 @@ +VERTEX skin_model_normal_map_dq +FRAGMENT forward_model_translucent diff --git a/libraries/render-utils/src/render-utils/fxaa_blend.slp b/libraries/render-utils/src/render-utils/fxaa_blend.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/render-utils/src/render-utils/fxaa_blend.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/render-utils/src/render-utils/glowLine.slp b/libraries/render-utils/src/render-utils/glowLine.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/grid.slp b/libraries/render-utils/src/render-utils/grid.slp new file mode 100644 index 0000000000..c81b208f63 --- /dev/null +++ b/libraries/render-utils/src/render-utils/grid.slp @@ -0,0 +1 @@ +VERTEX standardTransformPNTC diff --git a/libraries/render-utils/src/render-utils/haze.slp b/libraries/render-utils/src/render-utils/haze.slp new file mode 100644 index 0000000000..805b855c8d --- /dev/null +++ b/libraries/render-utils/src/render-utils/haze.slp @@ -0,0 +1,2 @@ +VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord +FRAGMENT Haze diff --git a/libraries/render-utils/src/render-utils/highlight.slp b/libraries/render-utils/src/render-utils/highlight.slp new file mode 100644 index 0000000000..269774815b --- /dev/null +++ b/libraries/render-utils/src/render-utils/highlight.slp @@ -0,0 +1,2 @@ +VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord +FRAGMENT Highlight diff --git a/libraries/render-utils/src/render-utils/highlight_aabox.slp b/libraries/render-utils/src/render-utils/highlight_aabox.slp new file mode 100644 index 0000000000..a6f94fa285 --- /dev/null +++ b/libraries/render-utils/src/render-utils/highlight_aabox.slp @@ -0,0 +1,2 @@ +VERTEX Highlight_aabox +FRAGMENT nop diff --git a/libraries/render-utils/src/render-utils/highlight_filled.slp b/libraries/render-utils/src/render-utils/highlight_filled.slp new file mode 100644 index 0000000000..166afd74be --- /dev/null +++ b/libraries/render-utils/src/render-utils/highlight_filled.slp @@ -0,0 +1,2 @@ +VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord +FRAGMENT Highlight_filled diff --git a/libraries/render-utils/src/render-utils/hmd_ui.slp b/libraries/render-utils/src/render-utils/hmd_ui.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/lightClusters_drawClusterContent.slp b/libraries/render-utils/src/render-utils/lightClusters_drawClusterContent.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/render-utils/src/render-utils/lightClusters_drawClusterContent.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/render-utils/src/render-utils/lightClusters_drawClusterFromDepth.slp b/libraries/render-utils/src/render-utils/lightClusters_drawClusterFromDepth.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/render-utils/src/render-utils/lightClusters_drawClusterFromDepth.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/render-utils/src/render-utils/lightClusters_drawGrid.slp b/libraries/render-utils/src/render-utils/lightClusters_drawGrid.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/local_lights_drawOutline.slp b/libraries/render-utils/src/render-utils/local_lights_drawOutline.slp new file mode 100644 index 0000000000..3aeca942ab --- /dev/null +++ b/libraries/render-utils/src/render-utils/local_lights_drawOutline.slp @@ -0,0 +1 @@ +VERTEX deferred_light diff --git a/libraries/render-utils/src/render-utils/local_lights_shading.slp b/libraries/render-utils/src/render-utils/local_lights_shading.slp new file mode 100644 index 0000000000..3aeca942ab --- /dev/null +++ b/libraries/render-utils/src/render-utils/local_lights_shading.slp @@ -0,0 +1 @@ +VERTEX deferred_light diff --git a/libraries/render-utils/src/render-utils/model.slp b/libraries/render-utils/src/render-utils/model.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/model_fade.slp b/libraries/render-utils/src/render-utils/model_fade.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/model_lightmap.slp b/libraries/render-utils/src/render-utils/model_lightmap.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/model_lightmap_fade.slp b/libraries/render-utils/src/render-utils/model_lightmap_fade.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/model_lightmap_normal_map.slp b/libraries/render-utils/src/render-utils/model_lightmap_normal_map.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/model_lightmap_normal_map_fade.slp b/libraries/render-utils/src/render-utils/model_lightmap_normal_map_fade.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/model_normal_map.slp b/libraries/render-utils/src/render-utils/model_normal_map.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/model_normal_map_fade.slp b/libraries/render-utils/src/render-utils/model_normal_map_fade.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/model_shadow.slp b/libraries/render-utils/src/render-utils/model_shadow.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/model_shadow_fade.slp b/libraries/render-utils/src/render-utils/model_shadow_fade.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/model_translucent.slp b/libraries/render-utils/src/render-utils/model_translucent.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/model_translucent_fade.slp b/libraries/render-utils/src/render-utils/model_translucent_fade.slp new file mode 100644 index 0000000000..ba3a685b5b --- /dev/null +++ b/libraries/render-utils/src/render-utils/model_translucent_fade.slp @@ -0,0 +1 @@ +VERTEX model_fade diff --git a/libraries/render-utils/src/render-utils/model_translucent_normal_map.slp b/libraries/render-utils/src/render-utils/model_translucent_normal_map.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/model_translucent_normal_map_fade.slp b/libraries/render-utils/src/render-utils/model_translucent_normal_map_fade.slp new file mode 100644 index 0000000000..01953a9891 --- /dev/null +++ b/libraries/render-utils/src/render-utils/model_translucent_normal_map_fade.slp @@ -0,0 +1 @@ +VERTEX model_translucent_normal_map diff --git a/libraries/render-utils/src/render-utils/model_translucent_unlit.slp b/libraries/render-utils/src/render-utils/model_translucent_unlit.slp new file mode 100644 index 0000000000..81ac672062 --- /dev/null +++ b/libraries/render-utils/src/render-utils/model_translucent_unlit.slp @@ -0,0 +1 @@ +VERTEX model diff --git a/libraries/render-utils/src/render-utils/model_translucent_unlit_fade.slp b/libraries/render-utils/src/render-utils/model_translucent_unlit_fade.slp new file mode 100644 index 0000000000..ba3a685b5b --- /dev/null +++ b/libraries/render-utils/src/render-utils/model_translucent_unlit_fade.slp @@ -0,0 +1 @@ +VERTEX model_fade diff --git a/libraries/render-utils/src/render-utils/model_unlit.slp b/libraries/render-utils/src/render-utils/model_unlit.slp new file mode 100644 index 0000000000..81ac672062 --- /dev/null +++ b/libraries/render-utils/src/render-utils/model_unlit.slp @@ -0,0 +1 @@ +VERTEX model diff --git a/libraries/render-utils/src/render-utils/model_unlit_fade.slp b/libraries/render-utils/src/render-utils/model_unlit_fade.slp new file mode 100644 index 0000000000..ba3a685b5b --- /dev/null +++ b/libraries/render-utils/src/render-utils/model_unlit_fade.slp @@ -0,0 +1 @@ +VERTEX model_fade diff --git a/libraries/render-utils/src/render-utils/parabola.slp b/libraries/render-utils/src/render-utils/parabola.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/sdf_text3D.slp b/libraries/render-utils/src/render-utils/sdf_text3D.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render-utils/src/render-utils/sdf_text3D_transparent.slp b/libraries/render-utils/src/render-utils/sdf_text3D_transparent.slp new file mode 100644 index 0000000000..3eea3a0da0 --- /dev/null +++ b/libraries/render-utils/src/render-utils/sdf_text3D_transparent.slp @@ -0,0 +1 @@ +VERTEX sdf_text3D diff --git a/libraries/render-utils/src/render-utils/simple.slp b/libraries/render-utils/src/render-utils/simple.slp new file mode 100644 index 0000000000..8a6e2e4f99 --- /dev/null +++ b/libraries/render-utils/src/render-utils/simple.slp @@ -0,0 +1 @@ +FRAGMENT forward_simple_textured diff --git a/libraries/render-utils/src/render-utils/simpleTranslucent.slp b/libraries/render-utils/src/render-utils/simpleTranslucent.slp new file mode 100644 index 0000000000..0163b09b84 --- /dev/null +++ b/libraries/render-utils/src/render-utils/simpleTranslucent.slp @@ -0,0 +1,2 @@ +VERTEX simple +FRAGMENT forward_simple_textured_transparent diff --git a/libraries/render-utils/src/render-utils/simpleTranslucentUnlit.slp b/libraries/render-utils/src/render-utils/simpleTranslucentUnlit.slp new file mode 100644 index 0000000000..f1d1ec39be --- /dev/null +++ b/libraries/render-utils/src/render-utils/simpleTranslucentUnlit.slp @@ -0,0 +1,2 @@ +VERTEX simple +FRAGMENT simple_transparent_textured_unlit diff --git a/libraries/render-utils/src/render-utils/simpleUnlit.slp b/libraries/render-utils/src/render-utils/simpleUnlit.slp new file mode 100644 index 0000000000..ab491aa290 --- /dev/null +++ b/libraries/render-utils/src/render-utils/simpleUnlit.slp @@ -0,0 +1,2 @@ +VERTEX simple +FRAGMENT forward_simple_textured_unlit diff --git a/libraries/render-utils/src/render-utils/simple_opaque_web_browser.slp b/libraries/render-utils/src/render-utils/simple_opaque_web_browser.slp new file mode 100644 index 0000000000..10e6b388c4 --- /dev/null +++ b/libraries/render-utils/src/render-utils/simple_opaque_web_browser.slp @@ -0,0 +1 @@ +VERTEX simple diff --git a/libraries/render-utils/src/render-utils/simple_textured.slp b/libraries/render-utils/src/render-utils/simple_textured.slp new file mode 100644 index 0000000000..10e6b388c4 --- /dev/null +++ b/libraries/render-utils/src/render-utils/simple_textured.slp @@ -0,0 +1 @@ +VERTEX simple diff --git a/libraries/render-utils/src/render-utils/simple_textured_fade.slp b/libraries/render-utils/src/render-utils/simple_textured_fade.slp new file mode 100644 index 0000000000..9be0f525ad --- /dev/null +++ b/libraries/render-utils/src/render-utils/simple_textured_fade.slp @@ -0,0 +1 @@ +VERTEX simple_fade diff --git a/libraries/render-utils/src/render-utils/simple_textured_unlit.slp b/libraries/render-utils/src/render-utils/simple_textured_unlit.slp new file mode 100644 index 0000000000..10e6b388c4 --- /dev/null +++ b/libraries/render-utils/src/render-utils/simple_textured_unlit.slp @@ -0,0 +1 @@ +VERTEX simple diff --git a/libraries/render-utils/src/render-utils/simple_textured_unlit_fade.slp b/libraries/render-utils/src/render-utils/simple_textured_unlit_fade.slp new file mode 100644 index 0000000000..9be0f525ad --- /dev/null +++ b/libraries/render-utils/src/render-utils/simple_textured_unlit_fade.slp @@ -0,0 +1 @@ +VERTEX simple_fade diff --git a/libraries/render-utils/src/render-utils/simple_transparent_textured.slp b/libraries/render-utils/src/render-utils/simple_transparent_textured.slp new file mode 100644 index 0000000000..10e6b388c4 --- /dev/null +++ b/libraries/render-utils/src/render-utils/simple_transparent_textured.slp @@ -0,0 +1 @@ +VERTEX simple diff --git a/libraries/render-utils/src/render-utils/simple_transparent_textured_fade.slp b/libraries/render-utils/src/render-utils/simple_transparent_textured_fade.slp new file mode 100644 index 0000000000..9be0f525ad --- /dev/null +++ b/libraries/render-utils/src/render-utils/simple_transparent_textured_fade.slp @@ -0,0 +1 @@ +VERTEX simple_fade diff --git a/libraries/render-utils/src/render-utils/simple_transparent_textured_unlit.slp b/libraries/render-utils/src/render-utils/simple_transparent_textured_unlit.slp new file mode 100644 index 0000000000..10e6b388c4 --- /dev/null +++ b/libraries/render-utils/src/render-utils/simple_transparent_textured_unlit.slp @@ -0,0 +1 @@ +VERTEX simple diff --git a/libraries/render-utils/src/render-utils/simple_transparent_textured_unlit_fade.slp b/libraries/render-utils/src/render-utils/simple_transparent_textured_unlit_fade.slp new file mode 100644 index 0000000000..9be0f525ad --- /dev/null +++ b/libraries/render-utils/src/render-utils/simple_transparent_textured_unlit_fade.slp @@ -0,0 +1 @@ +VERTEX simple_fade diff --git a/libraries/render-utils/src/render-utils/simple_transparent_web_browser.slp b/libraries/render-utils/src/render-utils/simple_transparent_web_browser.slp new file mode 100644 index 0000000000..10e6b388c4 --- /dev/null +++ b/libraries/render-utils/src/render-utils/simple_transparent_web_browser.slp @@ -0,0 +1 @@ +VERTEX simple diff --git a/libraries/render-utils/src/render-utils/skin_model.slp b/libraries/render-utils/src/render-utils/skin_model.slp new file mode 100644 index 0000000000..d6466a6aa4 --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model.slp @@ -0,0 +1 @@ +FRAGMENT model diff --git a/libraries/render-utils/src/render-utils/skin_model_dq.slp b/libraries/render-utils/src/render-utils/skin_model_dq.slp new file mode 100644 index 0000000000..d6466a6aa4 --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_dq.slp @@ -0,0 +1 @@ +FRAGMENT model diff --git a/libraries/render-utils/src/render-utils/skin_model_fade.slp b/libraries/render-utils/src/render-utils/skin_model_fade.slp new file mode 100644 index 0000000000..2b354b0832 --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_fade.slp @@ -0,0 +1 @@ +FRAGMENT model_fade diff --git a/libraries/render-utils/src/render-utils/skin_model_fade_dq.slp b/libraries/render-utils/src/render-utils/skin_model_fade_dq.slp new file mode 100644 index 0000000000..2b354b0832 --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_fade_dq.slp @@ -0,0 +1 @@ +FRAGMENT model_fade diff --git a/libraries/render-utils/src/render-utils/skin_model_normal_map.slp b/libraries/render-utils/src/render-utils/skin_model_normal_map.slp new file mode 100644 index 0000000000..c9d4016041 --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_normal_map.slp @@ -0,0 +1 @@ +FRAGMENT model_normal_map diff --git a/libraries/render-utils/src/render-utils/skin_model_normal_map_dq.slp b/libraries/render-utils/src/render-utils/skin_model_normal_map_dq.slp new file mode 100644 index 0000000000..c9d4016041 --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_normal_map_dq.slp @@ -0,0 +1 @@ +FRAGMENT model_normal_map diff --git a/libraries/render-utils/src/render-utils/skin_model_normal_map_fade.slp b/libraries/render-utils/src/render-utils/skin_model_normal_map_fade.slp new file mode 100644 index 0000000000..36e92e03e8 --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_normal_map_fade.slp @@ -0,0 +1 @@ +FRAGMENT model_normal_map_fade diff --git a/libraries/render-utils/src/render-utils/skin_model_normal_map_fade_dq.slp b/libraries/render-utils/src/render-utils/skin_model_normal_map_fade_dq.slp new file mode 100644 index 0000000000..36e92e03e8 --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_normal_map_fade_dq.slp @@ -0,0 +1 @@ +FRAGMENT model_normal_map_fade diff --git a/libraries/render-utils/src/render-utils/skin_model_normal_map_translucent.slp b/libraries/render-utils/src/render-utils/skin_model_normal_map_translucent.slp new file mode 100644 index 0000000000..c1b0ee2841 --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_normal_map_translucent.slp @@ -0,0 +1,2 @@ +VERTEX skin_model_normal_map_fade +FRAGMENT model_translucent_normal_map diff --git a/libraries/render-utils/src/render-utils/skin_model_normal_map_translucent_dq.slp b/libraries/render-utils/src/render-utils/skin_model_normal_map_translucent_dq.slp new file mode 100644 index 0000000000..58947f1bae --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_normal_map_translucent_dq.slp @@ -0,0 +1,2 @@ +VERTEX skin_model_normal_map_fade_dq +FRAGMENT model_translucent_normal_map diff --git a/libraries/render-utils/src/render-utils/skin_model_normal_map_translucent_fade.slp b/libraries/render-utils/src/render-utils/skin_model_normal_map_translucent_fade.slp new file mode 100644 index 0000000000..6698d1b7be --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_normal_map_translucent_fade.slp @@ -0,0 +1,2 @@ +VERTEX skin_model_normal_map_fade +FRAGMENT model_translucent_normal_map_fade diff --git a/libraries/render-utils/src/render-utils/skin_model_normal_map_translucent_fade_dq.slp b/libraries/render-utils/src/render-utils/skin_model_normal_map_translucent_fade_dq.slp new file mode 100644 index 0000000000..d2e938bd2a --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_normal_map_translucent_fade_dq.slp @@ -0,0 +1,2 @@ +VERTEX skin_model_normal_map_fade_dq +FRAGMENT model_translucent_normal_map_fade diff --git a/libraries/render-utils/src/render-utils/skin_model_shadow.slp b/libraries/render-utils/src/render-utils/skin_model_shadow.slp new file mode 100644 index 0000000000..f356a5638d --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_shadow.slp @@ -0,0 +1 @@ +FRAGMENT model_shadow diff --git a/libraries/render-utils/src/render-utils/skin_model_shadow_dq.slp b/libraries/render-utils/src/render-utils/skin_model_shadow_dq.slp new file mode 100644 index 0000000000..f356a5638d --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_shadow_dq.slp @@ -0,0 +1 @@ +FRAGMENT model_shadow diff --git a/libraries/render-utils/src/render-utils/skin_model_shadow_fade.slp b/libraries/render-utils/src/render-utils/skin_model_shadow_fade.slp new file mode 100644 index 0000000000..f356a5638d --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_shadow_fade.slp @@ -0,0 +1 @@ +FRAGMENT model_shadow diff --git a/libraries/render-utils/src/render-utils/skin_model_shadow_fade_dq.slp b/libraries/render-utils/src/render-utils/skin_model_shadow_fade_dq.slp new file mode 100644 index 0000000000..a7e3f3328b --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_shadow_fade_dq.slp @@ -0,0 +1 @@ +FRAGMENT model_shadow_fade diff --git a/libraries/render-utils/src/render-utils/skin_model_translucent.slp b/libraries/render-utils/src/render-utils/skin_model_translucent.slp new file mode 100644 index 0000000000..469224f9fd --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_translucent.slp @@ -0,0 +1,2 @@ +VERTEX skin_model_fade +FRAGMENT model_translucent diff --git a/libraries/render-utils/src/render-utils/skin_model_translucent_dq.slp b/libraries/render-utils/src/render-utils/skin_model_translucent_dq.slp new file mode 100644 index 0000000000..fdac5044ce --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_translucent_dq.slp @@ -0,0 +1,2 @@ +VERTEX skin_model_fade_dq +FRAGMENT model_translucent diff --git a/libraries/render-utils/src/render-utils/skin_model_translucent_fade.slp b/libraries/render-utils/src/render-utils/skin_model_translucent_fade.slp new file mode 100644 index 0000000000..c6ff435342 --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_translucent_fade.slp @@ -0,0 +1,2 @@ +VERTEX skin_model_fade +FRAGMENT model_translucent_fade diff --git a/libraries/render-utils/src/render-utils/skin_model_translucent_fade_dq.slp b/libraries/render-utils/src/render-utils/skin_model_translucent_fade_dq.slp new file mode 100644 index 0000000000..7361a0fd71 --- /dev/null +++ b/libraries/render-utils/src/render-utils/skin_model_translucent_fade_dq.slp @@ -0,0 +1,2 @@ +VERTEX skin_model_fade_dq +FRAGMENT model_translucent_fade diff --git a/libraries/render-utils/src/render-utils/ssao_debugOcclusion.slp b/libraries/render-utils/src/render-utils/ssao_debugOcclusion.slp new file mode 100644 index 0000000000..d4d8ec4b01 --- /dev/null +++ b/libraries/render-utils/src/render-utils/ssao_debugOcclusion.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord diff --git a/libraries/render-utils/src/render-utils/ssao_makeHorizontalBlur.slp b/libraries/render-utils/src/render-utils/ssao_makeHorizontalBlur.slp new file mode 100644 index 0000000000..d4d8ec4b01 --- /dev/null +++ b/libraries/render-utils/src/render-utils/ssao_makeHorizontalBlur.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord diff --git a/libraries/render-utils/src/render-utils/ssao_makeOcclusion.slp b/libraries/render-utils/src/render-utils/ssao_makeOcclusion.slp new file mode 100644 index 0000000000..d4d8ec4b01 --- /dev/null +++ b/libraries/render-utils/src/render-utils/ssao_makeOcclusion.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord diff --git a/libraries/render-utils/src/render-utils/ssao_makeVerticalBlur.slp b/libraries/render-utils/src/render-utils/ssao_makeVerticalBlur.slp new file mode 100644 index 0000000000..d4d8ec4b01 --- /dev/null +++ b/libraries/render-utils/src/render-utils/ssao_makeVerticalBlur.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord diff --git a/libraries/render-utils/src/render-utils/standardDrawTexture.slp b/libraries/render-utils/src/render-utils/standardDrawTexture.slp new file mode 100644 index 0000000000..c81b208f63 --- /dev/null +++ b/libraries/render-utils/src/render-utils/standardDrawTexture.slp @@ -0,0 +1 @@ +VERTEX standardTransformPNTC diff --git a/libraries/render-utils/src/render-utils/standardDrawTextureNoBlend.slp b/libraries/render-utils/src/render-utils/standardDrawTextureNoBlend.slp new file mode 100644 index 0000000000..c81b208f63 --- /dev/null +++ b/libraries/render-utils/src/render-utils/standardDrawTextureNoBlend.slp @@ -0,0 +1 @@ +VERTEX standardTransformPNTC diff --git a/libraries/render-utils/src/render-utils/stencil_drawMask.slp b/libraries/render-utils/src/render-utils/stencil_drawMask.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/render-utils/src/render-utils/stencil_drawMask.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/render-utils/src/render-utils/subsurfaceScattering_drawScattering.slp b/libraries/render-utils/src/render-utils/subsurfaceScattering_drawScattering.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/render-utils/src/render-utils/subsurfaceScattering_drawScattering.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/render-utils/src/render-utils/subsurfaceScattering_makeLUT.slp b/libraries/render-utils/src/render-utils/subsurfaceScattering_makeLUT.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/render-utils/src/render-utils/subsurfaceScattering_makeLUT.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/render-utils/src/render-utils/subsurfaceScattering_makeProfile.slp b/libraries/render-utils/src/render-utils/subsurfaceScattering_makeProfile.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/render-utils/src/render-utils/subsurfaceScattering_makeProfile.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/render-utils/src/render-utils/subsurfaceScattering_makeSpecularBeckmann.slp b/libraries/render-utils/src/render-utils/subsurfaceScattering_makeSpecularBeckmann.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/render-utils/src/render-utils/subsurfaceScattering_makeSpecularBeckmann.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/render-utils/src/render-utils/surfaceGeometry_downsampleDepthNormal.slp b/libraries/render-utils/src/render-utils/surfaceGeometry_downsampleDepthNormal.slp new file mode 100644 index 0000000000..d4d8ec4b01 --- /dev/null +++ b/libraries/render-utils/src/render-utils/surfaceGeometry_downsampleDepthNormal.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord diff --git a/libraries/render-utils/src/render-utils/surfaceGeometry_makeCurvature.slp b/libraries/render-utils/src/render-utils/surfaceGeometry_makeCurvature.slp new file mode 100644 index 0000000000..d4d8ec4b01 --- /dev/null +++ b/libraries/render-utils/src/render-utils/surfaceGeometry_makeCurvature.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord diff --git a/libraries/render-utils/src/render-utils/surfaceGeometry_makeLinearDepth.slp b/libraries/render-utils/src/render-utils/surfaceGeometry_makeLinearDepth.slp new file mode 100644 index 0000000000..d4d8ec4b01 --- /dev/null +++ b/libraries/render-utils/src/render-utils/surfaceGeometry_makeLinearDepth.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord diff --git a/libraries/render-utils/src/render-utils/taa.slp b/libraries/render-utils/src/render-utils/taa.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/render-utils/src/render-utils/taa.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/render-utils/src/render-utils/taa_blend.slp b/libraries/render-utils/src/render-utils/taa_blend.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/render-utils/src/render-utils/taa_blend.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/render-utils/src/render-utils/toneMapping.slp b/libraries/render-utils/src/render-utils/toneMapping.slp new file mode 100644 index 0000000000..d4d8ec4b01 --- /dev/null +++ b/libraries/render-utils/src/render-utils/toneMapping.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord diff --git a/libraries/render-utils/src/render-utils/velocityBuffer_cameraMotion.slp b/libraries/render-utils/src/render-utils/velocityBuffer_cameraMotion.slp new file mode 100644 index 0000000000..d4d8ec4b01 --- /dev/null +++ b/libraries/render-utils/src/render-utils/velocityBuffer_cameraMotion.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord diff --git a/libraries/render-utils/src/render-utils/zone_drawAmbient.slp b/libraries/render-utils/src/render-utils/zone_drawAmbient.slp new file mode 100644 index 0000000000..a5c2bb33e6 --- /dev/null +++ b/libraries/render-utils/src/render-utils/zone_drawAmbient.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawTransformUnitQuad diff --git a/libraries/render-utils/src/render-utils/zone_drawKeyLight.slp b/libraries/render-utils/src/render-utils/zone_drawKeyLight.slp new file mode 100644 index 0000000000..a5c2bb33e6 --- /dev/null +++ b/libraries/render-utils/src/render-utils/zone_drawKeyLight.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawTransformUnitQuad diff --git a/libraries/render-utils/src/render-utils/zone_drawSkybox.slp b/libraries/render-utils/src/render-utils/zone_drawSkybox.slp new file mode 100644 index 0000000000..a5c2bb33e6 --- /dev/null +++ b/libraries/render-utils/src/render-utils/zone_drawSkybox.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawTransformUnitQuad diff --git a/libraries/render/src/render/blurGaussianDepthAwareH.slp b/libraries/render/src/render/blurGaussianDepthAwareH.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/render/src/render/blurGaussianDepthAwareH.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/render/src/render/blurGaussianDepthAwareV.slp b/libraries/render/src/render/blurGaussianDepthAwareV.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/render/src/render/blurGaussianDepthAwareV.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/render/src/render/blurGaussianH.slp b/libraries/render/src/render/blurGaussianH.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/render/src/render/blurGaussianH.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/render/src/render/blurGaussianV.slp b/libraries/render/src/render/blurGaussianV.slp new file mode 100644 index 0000000000..c2c4bfbebd --- /dev/null +++ b/libraries/render/src/render/blurGaussianV.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawUnitQuadTexcoord diff --git a/libraries/render/src/render/drawCellBounds.slp b/libraries/render/src/render/drawCellBounds.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render/src/render/drawItemBounds.slp b/libraries/render/src/render/drawItemBounds.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render/src/render/drawItemStatus.slp b/libraries/render/src/render/drawItemStatus.slp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/render/src/render/drawLODReticle.slp b/libraries/render/src/render/drawLODReticle.slp new file mode 100644 index 0000000000..a5c2bb33e6 --- /dev/null +++ b/libraries/render/src/render/drawLODReticle.slp @@ -0,0 +1 @@ +VERTEX gpu::vertex::DrawTransformUnitQuad diff --git a/libraries/shaders/CMakeLists.txt b/libraries/shaders/CMakeLists.txt index 4f6db48c08..a065c635e7 100644 --- a/libraries/shaders/CMakeLists.txt +++ b/libraries/shaders/CMakeLists.txt @@ -1,184 +1,7 @@ - -set(TARGET_NAME gpu) -AUTOSCRIBE_SHADER_LIB(gpu) -AUTOSCRIBE_PROGRAM(NAME drawColor VERTEX DrawTransformVertexPosition FRAGMENT DrawColor) -AUTOSCRIBE_PROGRAM(NAME drawTransformUnitQuadTextureOpaque VERTEX DrawTransformUnitQuad FRAGMENT DrawTextureOpaque) -AUTOSCRIBE_PROGRAM(NAME drawTexture VERTEX DrawUnitQuadTexcoord FRAGMENT DrawTexture) -AUTOSCRIBE_PROGRAM(NAME drawUnitQuatTextureOpaque VERTEX DrawUnitQuadTexcoord FRAGMENT DrawTextureOpaque) -AUTOSCRIBE_PROGRAM(NAME drawTextureOpaqueTexcoordRect VERTEX DrawTexcoordRectTransformUnitQuad FRAGMENT DrawTextureOpaque) -AUTOSCRIBE_PROGRAM(NAME drawNothing VERTEX DrawVertexPosition FRAGMENT DrawNada) - -set(TARGET_NAME graphics) -AUTOSCRIBE_SHADER_LIB(gpu) -AUTOSCRIBE_PROGRAM(NAME skybox) - -set(TARGET_NAME display-plugins) -AUTOSCRIBE_SHADER_LIB(display-plugins) -AUTOSCRIBE_PROGRAM(NAME InterleavedSrgbToLinear VERTEX gpu::vertex::DrawUnitQuadTexcoord) -AUTOSCRIBE_PROGRAM(NAME SrgbToLinear VERTEX gpu::vertex::DrawUnitQuadTexcoord) - -set(TARGET_NAME procedural) -AUTOSCRIBE_SHADER_LIB(gpu graphics) - -set(TARGET_NAME render) -AUTOSCRIBE_SHADER_LIB(gpu graphics) -AUTOSCRIBE_PROGRAM(NAME drawCellBounds) -AUTOSCRIBE_PROGRAM(NAME drawItemBounds) -AUTOSCRIBE_PROGRAM(NAME drawItemStatus) -AUTOSCRIBE_PROGRAM(NAME drawLODReticle VERTEX gpu::vertex::DrawTransformUnitQuad) -AUTOSCRIBE_PROGRAM(NAME blurGaussianV VERTEX gpu::vertex::DrawUnitQuadTexcoord) -AUTOSCRIBE_PROGRAM(NAME blurGaussianH VERTEX gpu::vertex::DrawUnitQuadTexcoord) -AUTOSCRIBE_PROGRAM(NAME blurGaussianDepthAwareV VERTEX gpu::vertex::DrawUnitQuadTexcoord) -AUTOSCRIBE_PROGRAM(NAME blurGaussianDepthAwareH VERTEX gpu::vertex::DrawUnitQuadTexcoord) - -set(TARGET_NAME render-utils) -AUTOSCRIBE_SHADER_LIB(gpu graphics render) -AUTOSCRIBE_PROGRAM(NAME animdebugdraw) -AUTOSCRIBE_PROGRAM(NAME bloomThreshold VERTEX gpu::vertex::DrawTransformUnitQuad FRAGMENT BloomThreshold) -AUTOSCRIBE_PROGRAM(NAME bloomApply VERTEX gpu::vertex::DrawTransformUnitQuad FRAGMENT BloomApply) -AUTOSCRIBE_PROGRAM(NAME directional_ambient_light VERTEX deferred_light) -AUTOSCRIBE_PROGRAM(NAME directional_ambient_light_shadow VERTEX deferred_light) -AUTOSCRIBE_PROGRAM(NAME directional_skybox_light VERTEX deferred_light) -AUTOSCRIBE_PROGRAM(NAME directional_skybox_light_shadow VERTEX deferred_light) -AUTOSCRIBE_PROGRAM(NAME local_lights_shading VERTEX deferred_light) -AUTOSCRIBE_PROGRAM(NAME local_lights_drawOutline VERTEX deferred_light) -AUTOSCRIBE_PROGRAM(NAME forward_simple_textured VERTEX simple) -AUTOSCRIBE_PROGRAM(NAME forward_simple_textured_unlit VERTEX simple) -AUTOSCRIBE_PROGRAM(NAME forward_simple_textured_transparent VERTEX simple) -AUTOSCRIBE_PROGRAM(NAME fxaa_blend VERTEX gpu::vertex::DrawUnitQuadTexcoord) -AUTOSCRIBE_PROGRAM(NAME glowLine) -AUTOSCRIBE_PROGRAM(NAME grid VERTEX standardTransformPNTC) -AUTOSCRIBE_PROGRAM(NAME hmd_ui) -AUTOSCRIBE_PROGRAM(NAME drawWorkloadProxy) -AUTOSCRIBE_PROGRAM(NAME drawWorkloadView) -AUTOSCRIBE_PROGRAM(NAME haze VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord FRAGMENT Haze) -AUTOSCRIBE_PROGRAM(NAME highlight_aabox VERTEX Highlight_aabox FRAGMENT nop) -AUTOSCRIBE_PROGRAM(NAME highlight VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord FRAGMENT Highlight) -AUTOSCRIBE_PROGRAM(NAME highlight_filled VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord FRAGMENT Highlight_filled) -AUTOSCRIBE_PROGRAM(NAME lightClusters_drawGrid) -AUTOSCRIBE_PROGRAM(NAME lightClusters_drawClusterFromDepth VERTEX gpu::vertex::DrawUnitQuadTexcoord) -AUTOSCRIBE_PROGRAM(NAME lightClusters_drawClusterContent VERTEX gpu::vertex::DrawUnitQuadTexcoord) -AUTOSCRIBE_PROGRAM(NAME simple_opaque_web_browser VERTEX simple) -AUTOSCRIBE_PROGRAM(NAME simple_transparent_web_browser VERTEX simple) -AUTOSCRIBE_PROGRAM(NAME simple_textured VERTEX simple) -AUTOSCRIBE_PROGRAM(NAME simple_textured_unlit VERTEX simple) -AUTOSCRIBE_PROGRAM(NAME simple_transparent_textured VERTEX simple) -AUTOSCRIBE_PROGRAM(NAME simple_transparent_textured_unlit VERTEX simple) -AUTOSCRIBE_PROGRAM(NAME simple_textured_fade VERTEX simple_fade) -AUTOSCRIBE_PROGRAM(NAME simple_textured_unlit_fade VERTEX simple_fade) -AUTOSCRIBE_PROGRAM(NAME simple_transparent_textured_fade VERTEX simple_fade) -AUTOSCRIBE_PROGRAM(NAME simple_transparent_textured_unlit_fade VERTEX simple_fade) - -AUTOSCRIBE_PROGRAM(NAME parabola) - -AUTOSCRIBE_PROGRAM(NAME sdf_text3D) -AUTOSCRIBE_PROGRAM(NAME sdf_text3D_transparent VERTEX sdf_text3D) - -AUTOSCRIBE_PROGRAM(NAME ssao_makeOcclusion VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord) -AUTOSCRIBE_PROGRAM(NAME ssao_makeHorizontalBlur VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord) -AUTOSCRIBE_PROGRAM(NAME ssao_makeVerticalBlur VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord) -AUTOSCRIBE_PROGRAM(NAME ssao_debugOcclusion VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord) - -AUTOSCRIBE_PROGRAM(NAME stencil_drawMask VERTEX gpu::vertex::DrawUnitQuadTexcoord) - -AUTOSCRIBE_PROGRAM(NAME standardDrawTexture VERTEX standardTransformPNTC) -AUTOSCRIBE_PROGRAM(NAME standardDrawTextureNoBlend VERTEX standardTransformPNTC) - -AUTOSCRIBE_PROGRAM(NAME subsurfaceScattering_makeProfile VERTEX gpu::vertex::DrawUnitQuadTexcoord) -AUTOSCRIBE_PROGRAM(NAME subsurfaceScattering_makeLUT VERTEX gpu::vertex::DrawUnitQuadTexcoord) -AUTOSCRIBE_PROGRAM(NAME subsurfaceScattering_makeSpecularBeckmann VERTEX gpu::vertex::DrawUnitQuadTexcoord) -AUTOSCRIBE_PROGRAM(NAME subsurfaceScattering_drawScattering VERTEX gpu::vertex::DrawUnitQuadTexcoord) - -AUTOSCRIBE_PROGRAM(NAME surfaceGeometry_makeLinearDepth VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord) -AUTOSCRIBE_PROGRAM(NAME surfaceGeometry_downsampleDepthNormal VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord) -AUTOSCRIBE_PROGRAM(NAME surfaceGeometry_makeCurvature VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord) - - -AUTOSCRIBE_PROGRAM(NAME taa VERTEX gpu::vertex::DrawUnitQuadTexcoord) -AUTOSCRIBE_PROGRAM(NAME taa_blend VERTEX gpu::vertex::DrawUnitQuadTexcoord) - -AUTOSCRIBE_PROGRAM(NAME simple FRAGMENT forward_simple_textured) -AUTOSCRIBE_PROGRAM(NAME simpleUnlit VERTEX simple FRAGMENT forward_simple_textured_unlit) -AUTOSCRIBE_PROGRAM(NAME simpleTranslucent VERTEX simple FRAGMENT forward_simple_textured_transparent) -AUTOSCRIBE_PROGRAM(NAME simpleTranslucentUnlit VERTEX simple FRAGMENT simple_transparent_textured_unlit) - -AUTOSCRIBE_PROGRAM(NAME forward_model VERTEX model) -AUTOSCRIBE_PROGRAM(NAME forward_model_translucent VERTEX model) -AUTOSCRIBE_PROGRAM(NAME forward_model_unlit VERTEX model) -AUTOSCRIBE_PROGRAM(NAME forward_model_normal_map VERTEX model_normal_map) -AUTOSCRIBE_PROGRAM(NAME forward_model_normal_map_translucent VERTEX model_normal_map FRAGMENT forward_model_translucent) - -AUTOSCRIBE_PROGRAM(NAME forward_skin_model VERTEX skin_model FRAGMENT forward_model) -AUTOSCRIBE_PROGRAM(NAME forward_skin_model_normal_map VERTEX skin_model_normal_map FRAGMENT forward_model_normal_map) -AUTOSCRIBE_PROGRAM(NAME forward_skin_model_dq VERTEX skin_model_dq FRAGMENT forward_model) -AUTOSCRIBE_PROGRAM(NAME forward_skin_model_normal_map_dq VERTEX skin_model_normal_map_dq FRAGMENT forward_model_normal_map) - -AUTOSCRIBE_PROGRAM(NAME forward_skin_translucent VERTEX skin_model FRAGMENT forward_model_translucent) -AUTOSCRIBE_PROGRAM(NAME forward_skin_translucent_normal_map VERTEX skin_model_normal_map FRAGMENT forward_model_translucent) -AUTOSCRIBE_PROGRAM(NAME forward_skin_translucent_dq VERTEX skin_model_dq FRAGMENT forward_model_translucent) -AUTOSCRIBE_PROGRAM(NAME forward_skin_translucent_normal_map_dq VERTEX skin_model_normal_map_dq FRAGMENT forward_model_translucent) - -AUTOSCRIBE_PROGRAM(NAME model) -AUTOSCRIBE_PROGRAM(NAME model_unlit VERTEX model) -AUTOSCRIBE_PROGRAM(NAME model_normal_map) -AUTOSCRIBE_PROGRAM(NAME model_translucent) -AUTOSCRIBE_PROGRAM(NAME model_translucent_normal_map) -AUTOSCRIBE_PROGRAM(NAME model_translucent_unlit VERTEX model) -AUTOSCRIBE_PROGRAM(NAME model_lightmap) -AUTOSCRIBE_PROGRAM(NAME model_lightmap_normal_map) -AUTOSCRIBE_PROGRAM(NAME model_shadow) -AUTOSCRIBE_PROGRAM(NAME model_shadow_fade) - -AUTOSCRIBE_PROGRAM(NAME skin_model FRAGMENT model) -AUTOSCRIBE_PROGRAM(NAME skin_model_normal_map FRAGMENT model_normal_map) -AUTOSCRIBE_PROGRAM(NAME skin_model_normal_map_fade FRAGMENT model_normal_map_fade) -AUTOSCRIBE_PROGRAM(NAME skin_model_translucent VERTEX skin_model_fade FRAGMENT model_translucent) -AUTOSCRIBE_PROGRAM(NAME skin_model_translucent_fade VERTEX skin_model_fade FRAGMENT model_translucent_fade) -AUTOSCRIBE_PROGRAM(NAME skin_model_normal_map_translucent VERTEX skin_model_normal_map_fade FRAGMENT model_translucent_normal_map) -AUTOSCRIBE_PROGRAM(NAME skin_model_normal_map_translucent_fade VERTEX skin_model_normal_map_fade FRAGMENT model_translucent_normal_map_fade) -AUTOSCRIBE_PROGRAM(NAME skin_model_fade FRAGMENT model_fade) -AUTOSCRIBE_PROGRAM(NAME skin_model_shadow FRAGMENT model_shadow) -AUTOSCRIBE_PROGRAM(NAME skin_model_shadow_fade FRAGMENT model_shadow) - - -AUTOSCRIBE_PROGRAM(NAME skin_model_dq FRAGMENT model) -AUTOSCRIBE_PROGRAM(NAME skin_model_fade_dq FRAGMENT model_fade) -AUTOSCRIBE_PROGRAM(NAME skin_model_normal_map_dq FRAGMENT model_normal_map) -AUTOSCRIBE_PROGRAM(NAME skin_model_normal_map_fade_dq FRAGMENT model_normal_map_fade) -AUTOSCRIBE_PROGRAM(NAME skin_model_translucent_dq VERTEX skin_model_fade_dq FRAGMENT model_translucent) -AUTOSCRIBE_PROGRAM(NAME skin_model_translucent_fade_dq VERTEX skin_model_fade_dq FRAGMENT model_translucent_fade) -AUTOSCRIBE_PROGRAM(NAME skin_model_normal_map_translucent_dq VERTEX skin_model_normal_map_fade_dq FRAGMENT model_translucent_normal_map) -AUTOSCRIBE_PROGRAM(NAME skin_model_normal_map_translucent_fade_dq VERTEX skin_model_normal_map_fade_dq FRAGMENT model_translucent_normal_map_fade) - -AUTOSCRIBE_PROGRAM(NAME skin_model_shadow_dq FRAGMENT model_shadow) -AUTOSCRIBE_PROGRAM(NAME skin_model_shadow_fade_dq FRAGMENT model_shadow_fade) - -AUTOSCRIBE_PROGRAM(NAME model_fade) -AUTOSCRIBE_PROGRAM(NAME model_unlit_fade VERTEX model_fade) -AUTOSCRIBE_PROGRAM(NAME model_translucent_unlit_fade VERTEX model_fade) -AUTOSCRIBE_PROGRAM(NAME model_normal_map_fade) -AUTOSCRIBE_PROGRAM(NAME model_translucent_normal_map_fade VERTEX model_translucent_normal_map) -AUTOSCRIBE_PROGRAM(NAME model_translucent_fade VERTEX model_fade) -AUTOSCRIBE_PROGRAM(NAME model_lightmap_fade) -AUTOSCRIBE_PROGRAM(NAME model_lightmap_normal_map_fade) - -AUTOSCRIBE_PROGRAM(NAME zone_drawKeyLight VERTEX gpu::vertex::DrawTransformUnitQuad) -AUTOSCRIBE_PROGRAM(NAME zone_drawSkybox VERTEX gpu::vertex::DrawTransformUnitQuad) -AUTOSCRIBE_PROGRAM(NAME zone_drawAmbient VERTEX gpu::vertex::DrawTransformUnitQuad) - -AUTOSCRIBE_PROGRAM(NAME toneMapping VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord) -AUTOSCRIBE_PROGRAM(NAME velocityBuffer_cameraMotion VERTEX gpu::vertex::DrawViewportQuadTransformTexcoord) - -set(TARGET_NAME entities-renderer) -AUTOSCRIBE_SHADER_LIB(gpu graphics procedural render render-utils) -AUTOSCRIBE_PROGRAM(NAME polyvox) -AUTOSCRIBE_PROGRAM(NAME polyvox_fade) -AUTOSCRIBE_PROGRAM(NAME paintStroke) -AUTOSCRIBE_PROGRAM(NAME textured_particle) - set(TARGET_NAME shaders) -autoscribe_shader_finish() +autoscribe_shader_libs(gpu graphics display-plugins procedural render render-utils entities-renderer) setup_hifi_library(Gui) + add_dependencies(${TARGET_NAME} compiled_shaders reflected_shaders) # Despite the dependency above, the autogen logic will attempt to compile the QRC before diff --git a/tests-manual/gpu-textures/CMakeLists.txt b/tests-manual/gpu-textures/CMakeLists.txt index c10f2eda3f..84f5027411 100644 --- a/tests-manual/gpu-textures/CMakeLists.txt +++ b/tests-manual/gpu-textures/CMakeLists.txt @@ -1,5 +1,4 @@ set(TARGET_NAME gpu-textures-tests) -AUTOSCRIBE_SHADER_LIB(gpu graphics render-utils) # This is not a testcase -- just set it up as a regular hifi project setup_hifi_project(Quick Gui Script) setup_memory_debugger() diff --git a/tests-manual/gpu/CMakeLists.txt b/tests-manual/gpu/CMakeLists.txt index 336dcf753c..30218f3f97 100644 --- a/tests-manual/gpu/CMakeLists.txt +++ b/tests-manual/gpu/CMakeLists.txt @@ -1,5 +1,4 @@ set(TARGET_NAME gpu-test) -AUTOSCRIBE_SHADER_LIB(gpu graphics render-utils) # This is not a testcase -- just set it up as a regular hifi project setup_hifi_project(Quick Gui Script) setup_memory_debugger() diff --git a/tests/shaders/src/ShaderTests.cpp b/tests/shaders/src/ShaderTests.cpp index 4c6b8fc38c..4dd15710f9 100644 --- a/tests/shaders/src/ShaderTests.cpp +++ b/tests/shaders/src/ShaderTests.cpp @@ -29,20 +29,32 @@ #include #include #include +#include QTEST_MAIN(ShaderTests) #pragma optimize("", off) void ShaderTests::initTestCase() { _window = new QWindow(); + _window->setSurfaceType(QSurface::SurfaceType::OpenGLSurface); _context = new ::gl::Context(_window); getDefaultOpenGLSurfaceFormat(); _context->create(); if (!_context->makeCurrent()) { qFatal("Unable to make test GL context current"); } + QOpenGLContextWrapper(_context->qglContext()).makeCurrent(_window); + if (!_context->makeCurrent()) { + qFatal("Unable to make test GL context current"); + } gl::initModuleGl(); + if (!_context->makeCurrent()) { + qFatal("Unable to make test GL context current"); + } gpu::Context::init(); + if (!_context->makeCurrent()) { + qFatal("Unable to make test GL context current"); + } _gpuContext = std::make_shared(); } @@ -185,7 +197,7 @@ void ShaderTests::testShaderLoad() { uint32_t maxShader = 0; try { -#if 1 +#if 0 uint32_t testPrograms[] = { shader::render_utils::program::parabola, shader::INVALID_PROGRAM, @@ -229,12 +241,6 @@ void ShaderTests::testShaderLoad() { // Uniforms { auto uniforms = gl::Uniform::load(program); - for (const auto& uniform : uniforms) { - GLint offset, size; - glGetActiveUniformsiv(program, 1, (GLuint*)&uniform.index, GL_UNIFORM_OFFSET, &offset); - glGetActiveUniformsiv(program, 1, (GLuint*)&uniform.index, GL_UNIFORM_SIZE, &size); - qDebug() << uniform.name.c_str() << " size " << size << "offset" << offset; - } const auto& uniformRemap = shaderObject.uniformRemap; auto expectedUniforms = expectedBindings[gpu::Shader::BindingType::UNIFORM]; if (!compareBindings(uniforms, expectedUniforms)) { From a8b9568c926301f1cac887da65dd0b3ec3294e93 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Fri, 10 Aug 2018 10:11:46 -0700 Subject: [PATCH 14/68] Add some locking --- interface/src/octree/SafeLanding.cpp | 50 ++++++++++++---------------- interface/src/octree/SafeLanding.h | 3 +- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/interface/src/octree/SafeLanding.cpp b/interface/src/octree/SafeLanding.cpp index 352c83dad0..ab0ae784f8 100644 --- a/interface/src/octree/SafeLanding.cpp +++ b/interface/src/octree/SafeLanding.cpp @@ -35,6 +35,7 @@ void SafeLanding::startEntitySequence(QSharedPointer entityT auto entityTree = entityTreeRenderer->getTree(); if (entityTree) { + Locker lock(_lock); _entityTree = entityTree; connect(std::const_pointer_cast(_entityTree).get(), &EntityTree::addingEntity, this, &SafeLanding::addTrackedEntity); @@ -47,6 +48,7 @@ void SafeLanding::startEntitySequence(QSharedPointer entityT } void SafeLanding::stopEntitySequence() { + Locker lock(_lock); _trackingEntities = false; _initialStart = INVALID_SEQUENCE; _initialEnd = INVALID_SEQUENCE; @@ -62,10 +64,11 @@ void SafeLanding::addTrackedEntity(const EntityItemID& entityID) { const auto& entityType = entity->getType(); if (entityType == EntityTypes::Model) { ModelEntityItem * modelEntity = std::dynamic_pointer_cast(entity).get(); - auto shapeType = modelEntity->getShapeType(); - if (shapeType == SHAPE_TYPE_COMPOUND || shapeType == SHAPE_TYPE_STATIC_MESH || - shapeType == SHAPE_TYPE_SIMPLE_COMPOUND) { + static const std::set downloadedCollisionTypes + { SHAPE_TYPE_COMPOUND, SHAPE_TYPE_SIMPLE_COMPOUND, SHAPE_TYPE_STATIC_MESH, SHAPE_TYPE_SIMPLE_HULL }; + if (downloadedCollisionTypes.count(modelEntity->getShapeType()) != 0) { // Only track entities with downloaded collision bodies. + Locker lock(_lock); _trackedEntities.emplace(entityID, entity); qCDebug(interfaceapp) << "Safe Landing: Tracking entity " << entity->getItemName(); } @@ -75,27 +78,37 @@ void SafeLanding::addTrackedEntity(const EntityItemID& entityID) { } void SafeLanding::deleteTrackedEntity(const EntityItemID& entityID) { + Locker lock(_lock); _trackedEntities.erase(entityID); } void SafeLanding::setCompletionSequenceNumbers(int first, int last) { + Locker lock(_lock); _initialStart = first; _initialEnd = (last + 1) % SEQUENCE_MODULO; - auto firstIter = _sequenceNumbers.find(_initialStart); - if (firstIter != _sequenceNumbers.end()) { - _sequenceNumbers.erase(_sequenceNumbers.begin(), firstIter); - } - _sequenceNumbers.erase(_sequenceNumbers.find(_initialEnd), _sequenceNumbers.end()); } void SafeLanding::sequenceNumberReceived(int sequenceNumber) { if (_trackingEntities) { + Locker lock(_lock); _sequenceNumbers.insert(sequenceNumber); } } +bool SafeLanding::isLoadSequenceComplete() { + if (sequenceNumbersComplete() && entityPhysicsComplete()) { + Locker lock(_lock); + _trackingEntities = false; + _trackedEntities.clear(); + qCDebug(interfaceapp) << "Safe Landing: load sequence complete"; + } + + return !_trackingEntities; +} + bool SafeLanding::sequenceNumbersComplete() { if (_initialStart != INVALID_SEQUENCE) { + Locker lock(_lock); auto startIter = _sequenceNumbers.find(_initialStart); if (startIter != _sequenceNumbers.end()) { _sequenceNumbers.erase(_sequenceNumbers.begin(), startIter); @@ -109,27 +122,8 @@ bool SafeLanding::sequenceNumbersComplete() { return false; } -void SafeLanding::resourceLoaded() { - QObject * sender = QObject::sender(); - if (sender) { - Resource * resource = dynamic_cast(sender); - const QString resourceURL = resource->getURL().toString(); - _trackedURLs.erase(resourceURL); - qCDebug(interfaceapp) << "Safe Landing: Removed tracked URL" << resourceURL; - } -} - -bool SafeLanding::isLoadSequenceComplete() { - if (sequenceNumbersComplete() && entityPhysicsComplete()) { - _trackingEntities = false; - _trackedEntities.clear(); - qCDebug(interfaceapp) << "Safe Landing: load sequence complete"; - } - - return !_trackingEntities; -} - bool SafeLanding::entityPhysicsComplete() { + Locker lock(_lock); for (auto entityMapIter = _trackedEntities.begin(); entityMapIter != _trackedEntities.end(); ++entityMapIter) { auto entity = entityMapIter->second; if (!entity->shouldBePhysical() || entity->isReadyToComputeShape()) { diff --git a/interface/src/octree/SafeLanding.h b/interface/src/octree/SafeLanding.h index e81746e077..a9146f58c7 100644 --- a/interface/src/octree/SafeLanding.h +++ b/interface/src/octree/SafeLanding.h @@ -33,13 +33,14 @@ public: private slots: void addTrackedEntity(const EntityItemID& entityID); void deleteTrackedEntity(const EntityItemID& entityID); - void resourceLoaded(); private: bool sequenceNumbersComplete(); void debugDumpSequenceIDs() const; bool entityPhysicsComplete(); + std::mutex _lock; + using Locker = std::lock_guard; bool _trackingEntities { false }; EntityTreePointer _entityTree; using EntityMap = std::map; From d61aaa3bd76b907794dd3abccf8ecfcfad7b92b1 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Fri, 10 Aug 2018 14:16:44 -0300 Subject: [PATCH 15/68] Android - People - Round profile image --- .../hifiinterface/view/UserListAdapter.java | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java index 79a931d93b..f9df28d5ca 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java @@ -1,18 +1,22 @@ package io.highfidelity.hifiinterface.view; import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; import android.net.Uri; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import com.squareup.picasso.Callback; import com.squareup.picasso.Picasso; import java.util.ArrayList; @@ -74,7 +78,28 @@ public class UserListAdapter extends RecyclerView.Adapter Date: Fri, 10 Aug 2018 17:36:32 -0300 Subject: [PATCH 16/68] Android - Friends - rollback swipe to reveal items --- .../hifiinterface/view/SwipeRevealLayout.java | 729 ------------------ .../hifiinterface/view/UserListAdapter.java | 10 - android/app/src/main/res/layout/user_item.xml | 83 +- android/app/src/main/res/values/attrs.xml | 9 - 4 files changed, 26 insertions(+), 805 deletions(-) delete mode 100644 android/app/src/main/java/io/highfidelity/hifiinterface/view/SwipeRevealLayout.java delete mode 100644 android/app/src/main/res/values/attrs.xml diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/SwipeRevealLayout.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/SwipeRevealLayout.java deleted file mode 100644 index 06ac4ac3ec..0000000000 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/SwipeRevealLayout.java +++ /dev/null @@ -1,729 +0,0 @@ -package io.highfidelity.hifiinterface.view; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.graphics.Rect; -import android.os.Bundle; -import android.os.Parcelable; -import android.support.annotation.Nullable; -import android.support.v4.view.GestureDetectorCompat; -import android.support.v4.view.ViewCompat; -import android.support.v4.widget.ViewDragHelper; -import android.util.AttributeSet; -import android.util.DisplayMetrics; -import android.view.GestureDetector; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; - -import io.highfidelity.hifiinterface.R; - -/** - * Created by Mark O'Sullivan on 25th February 2018. - - MIT License - - Copyright (c) 2018 Mark O'Sullivan - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - - */ - -@SuppressLint("RtlHardcoded") -public class SwipeRevealLayout extends ViewGroup { - - private static final String SUPER_INSTANCE_STATE = "saved_instance_state_parcelable"; - - private static final int DEFAULT_MIN_FLING_VELOCITY = 300; // dp per second - private static final int DEFAULT_MIN_DIST_REQUEST_DISALLOW_PARENT = 1; // dp - - public static final int DRAG_EDGE_LEFT = 0x1; - public static final int DRAG_EDGE_RIGHT = 0x1 << 1; - - /** - * The secondary view will be under the main view. - */ - public static final int MODE_NORMAL = 0; - - /** - * The secondary view will stick the edge of the main view. - */ - public static final int MODE_SAME_LEVEL = 1; - - /** - * Main view is the view which is shown when the layout is closed. - */ - private View mMainView; - - /** - * Secondary view is the view which is shown when the layout is opened. - */ - private View mSecondaryView; - - /** - * The rectangle position of the main view when the layout is closed. - */ - private Rect mRectMainClose = new Rect(); - - /** - * The rectangle position of the main view when the layout is opened. - */ - private Rect mRectMainOpen = new Rect(); - - /** - * The rectangle position of the secondary view when the layout is closed. - */ - private Rect mRectSecClose = new Rect(); - - /** - * The rectangle position of the secondary view when the layout is opened. - */ - private Rect mRectSecOpen = new Rect(); - - /** - * The minimum distance (px) to the closest drag edge that the SwipeRevealLayout - * will disallow the parent to intercept touch event. - */ - private int mMinDistRequestDisallowParent = 0; - - private boolean mIsOpenBeforeInit = false; - private volatile boolean mIsScrolling = false; - private volatile boolean mLockDrag = false; - - private int mMinFlingVelocity = DEFAULT_MIN_FLING_VELOCITY; - private int mMode = MODE_NORMAL; - - private int mDragEdge = DRAG_EDGE_LEFT; - - private float mDragDist = 0; - private float mPrevX = -1; - - private ViewDragHelper mDragHelper; - private GestureDetectorCompat mGestureDetector; - - public SwipeRevealLayout(Context context) { - super(context); - init(context, null); - } - - public SwipeRevealLayout(Context context, AttributeSet attrs) { - super(context, attrs); - init(context, attrs); - } - - public SwipeRevealLayout(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - @Nullable - @Override - protected Parcelable onSaveInstanceState() { - Bundle bundle = new Bundle(); - bundle.putParcelable(SUPER_INSTANCE_STATE, super.onSaveInstanceState()); - return super.onSaveInstanceState(); - } - - @Override - protected void onRestoreInstanceState(Parcelable state) { - Bundle bundle = (Bundle) state; - state = bundle.getParcelable(SUPER_INSTANCE_STATE); - super.onRestoreInstanceState(state); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - mGestureDetector.onTouchEvent(event); - mDragHelper.processTouchEvent(event); - return true; - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - if (isDragLocked()) { - return super.onInterceptTouchEvent(ev); - } - - mDragHelper.processTouchEvent(ev); - mGestureDetector.onTouchEvent(ev); - accumulateDragDist(ev); - - boolean couldBecomeClick = couldBecomeClick(ev); - boolean settling = mDragHelper.getViewDragState() == ViewDragHelper.STATE_SETTLING; - boolean idleAfterScrolled = mDragHelper.getViewDragState() == ViewDragHelper.STATE_IDLE - && mIsScrolling; - - // must be placed as the last statement - mPrevX = ev.getX(); - - // return true => intercept, cannot trigger onClick event - return !couldBecomeClick && (settling || idleAfterScrolled); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - - // get views - if (getChildCount() >= 2) { - mSecondaryView = getChildAt(0); - mMainView = getChildAt(1); - } - else if (getChildCount() == 1) { - mMainView = getChildAt(0); - } - } - - /** - * {@inheritDoc} - */ - @SuppressWarnings("ConstantConditions") - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - for (int index = 0; index < getChildCount(); index++) { - final View child = getChildAt(index); - - int left, right, top, bottom; - left = right = top = bottom = 0; - - final int minLeft = getPaddingLeft(); - final int maxRight = Math.max(r - getPaddingRight() - l, 0); - final int minTop = getPaddingTop(); - final int maxBottom = Math.max(b - getPaddingBottom() - t, 0); - - int measuredChildHeight = child.getMeasuredHeight(); - int measuredChildWidth = child.getMeasuredWidth(); - - // need to take account if child size is match_parent - final LayoutParams childParams = child.getLayoutParams(); - boolean matchParentHeight = false; - boolean matchParentWidth = false; - - if (childParams != null) { - matchParentHeight = (childParams.height == LayoutParams.MATCH_PARENT) || - (childParams.height == LayoutParams.FILL_PARENT); - matchParentWidth = (childParams.width == LayoutParams.MATCH_PARENT) || - (childParams.width == LayoutParams.FILL_PARENT); - } - - if (matchParentHeight) { - measuredChildHeight = maxBottom - minTop; - childParams.height = measuredChildHeight; - } - - if (matchParentWidth) { - measuredChildWidth = maxRight - minLeft; - childParams.width = measuredChildWidth; - } - - switch (mDragEdge) { - case DRAG_EDGE_RIGHT: - left = Math.max(r - measuredChildWidth - getPaddingRight() - l, minLeft); - top = Math.min(getPaddingTop(), maxBottom); - right = Math.max(r - getPaddingRight() - l, minLeft); - bottom = Math.min(measuredChildHeight + getPaddingTop(), maxBottom); - break; - - case DRAG_EDGE_LEFT: - left = Math.min(getPaddingLeft(), maxRight); - top = Math.min(getPaddingTop(), maxBottom); - right = Math.min(measuredChildWidth + getPaddingLeft(), maxRight); - bottom = Math.min(measuredChildHeight + getPaddingTop(), maxBottom); - break; - } - - child.layout(left, top, right, bottom); - } - - // taking account offset when mode is SAME_LEVEL - if (mMode == MODE_SAME_LEVEL) { - switch (mDragEdge) { - case DRAG_EDGE_LEFT: - mSecondaryView.offsetLeftAndRight(-mSecondaryView.getWidth()); - break; - - case DRAG_EDGE_RIGHT: - mSecondaryView.offsetLeftAndRight(mSecondaryView.getWidth()); - break; - } - } - - initRects(); - - if (mIsOpenBeforeInit) { - open(false); - } else { - close(false); - } - - } - - /** - * {@inheritDoc} - */ - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - if (getChildCount() < 2) { - throw new RuntimeException("Layout must have two children"); - } - - final LayoutParams params = getLayoutParams(); - - final int widthMode = MeasureSpec.getMode(widthMeasureSpec); - final int heightMode = MeasureSpec.getMode(heightMeasureSpec); - - int desiredWidth = 0; - int desiredHeight = 0; - - // first find the largest child - for (int i = 0; i < getChildCount(); i++) { - final View child = getChildAt(i); - measureChild(child, widthMeasureSpec, heightMeasureSpec); - desiredWidth = Math.max(child.getMeasuredWidth(), desiredWidth); - desiredHeight = Math.max(child.getMeasuredHeight(), desiredHeight); - } - // create new measure spec using the largest child width - widthMeasureSpec = MeasureSpec.makeMeasureSpec(desiredWidth, widthMode); - heightMeasureSpec = MeasureSpec.makeMeasureSpec(desiredHeight, heightMode); - - final int measuredWidth = MeasureSpec.getSize(widthMeasureSpec); - final int measuredHeight = MeasureSpec.getSize(heightMeasureSpec); - - for (int i = 0; i < getChildCount(); i++) { - final View child = getChildAt(i); - final LayoutParams childParams = child.getLayoutParams(); - - if (childParams != null) { - if (childParams.height == LayoutParams.MATCH_PARENT) { - child.setMinimumHeight(measuredHeight); - } - - if (childParams.width == LayoutParams.MATCH_PARENT) { - child.setMinimumWidth(measuredWidth); - } - } - - measureChild(child, widthMeasureSpec, heightMeasureSpec); - desiredWidth = Math.max(child.getMeasuredWidth(), desiredWidth); - desiredHeight = Math.max(child.getMeasuredHeight(), desiredHeight); - } - - // taking accounts of padding - desiredWidth += getPaddingLeft() + getPaddingRight(); - desiredHeight += getPaddingTop() + getPaddingBottom(); - - // adjust desired width - if (widthMode == MeasureSpec.EXACTLY) { - desiredWidth = measuredWidth; - } else { - if (params.width == LayoutParams.MATCH_PARENT) { - desiredWidth = measuredWidth; - } - - if (widthMode == MeasureSpec.AT_MOST) { - desiredWidth = (desiredWidth > measuredWidth)? measuredWidth : desiredWidth; - } - } - - // adjust desired height - if (heightMode == MeasureSpec.EXACTLY) { - desiredHeight = measuredHeight; - } else { - if (params.height == LayoutParams.MATCH_PARENT) { - desiredHeight = measuredHeight; - } - - if (heightMode == MeasureSpec.AT_MOST) { - desiredHeight = (desiredHeight > measuredHeight)? measuredHeight : desiredHeight; - } - } - - setMeasuredDimension(desiredWidth, desiredHeight); - } - - @Override - public void computeScroll() { - if (mDragHelper.continueSettling(true)) { - ViewCompat.postInvalidateOnAnimation(this); - } - } - - /** - * Open the panel to show the secondary view - */ - public void open(boolean animation) { - mIsOpenBeforeInit = true; - - if (animation) { - mDragHelper.smoothSlideViewTo(mMainView, mRectMainOpen.left, mRectMainOpen.top); - } else { - mDragHelper.abort(); - - mMainView.layout( - mRectMainOpen.left, - mRectMainOpen.top, - mRectMainOpen.right, - mRectMainOpen.bottom - ); - - mSecondaryView.layout( - mRectSecOpen.left, - mRectSecOpen.top, - mRectSecOpen.right, - mRectSecOpen.bottom - ); - } - - ViewCompat.postInvalidateOnAnimation(this); - } - - /** - * Close the panel to hide the secondary view - */ - public void close(boolean animation) { - mIsOpenBeforeInit = false; - - if (animation) { - mDragHelper.smoothSlideViewTo(mMainView, mRectMainClose.left, mRectMainClose.top); - } else { - mDragHelper.abort(); - mMainView.layout( - mRectMainClose.left, - mRectMainClose.top, - mRectMainClose.right, - mRectMainClose.bottom - ); - mSecondaryView.layout( - mRectSecClose.left, - mRectSecClose.top, - mRectSecClose.right, - mRectSecClose.bottom - ); - } - - ViewCompat.postInvalidateOnAnimation(this); - } - - /** - * @return true if the drag/swipe motion is currently locked. - */ - public boolean isDragLocked() { - return mLockDrag; - } - - private int getMainOpenLeft() { - switch (mDragEdge) { - case DRAG_EDGE_LEFT: - return mRectMainClose.left + mSecondaryView.getWidth(); - - case DRAG_EDGE_RIGHT: - return mRectMainClose.left - mSecondaryView.getWidth(); - - - default: - return 0; - } - } - - private int getMainOpenTop() { - switch (mDragEdge) { - case DRAG_EDGE_LEFT: - return mRectMainClose.top; - - case DRAG_EDGE_RIGHT: - return mRectMainClose.top; - - - default: - return 0; - } - } - - private int getSecOpenLeft() { - return mRectSecClose.left; - } - - private int getSecOpenTop() { - return mRectSecClose.top; - } - - private void initRects() { - // close position of main view - mRectMainClose.set( - mMainView.getLeft(), - mMainView.getTop(), - mMainView.getRight(), - mMainView.getBottom() - ); - - // close position of secondary view - mRectSecClose.set( - mSecondaryView.getLeft(), - mSecondaryView.getTop(), - mSecondaryView.getRight(), - mSecondaryView.getBottom() - ); - - // open position of the main view - mRectMainOpen.set( - getMainOpenLeft(), - getMainOpenTop(), - getMainOpenLeft() + mMainView.getWidth(), - getMainOpenTop() + mMainView.getHeight() - ); - - // open position of the secondary view - mRectSecOpen.set( - getSecOpenLeft(), - getSecOpenTop(), - getSecOpenLeft() + mSecondaryView.getWidth(), - getSecOpenTop() + mSecondaryView.getHeight() - ); - } - - private boolean couldBecomeClick(MotionEvent ev) { - return isInMainView(ev) && !shouldInitiateADrag(); - } - - private boolean isInMainView(MotionEvent ev) { - float x = ev.getX(); - float y = ev.getY(); - - boolean withinVertical = mMainView.getTop() <= y && y <= mMainView.getBottom(); - boolean withinHorizontal = mMainView.getLeft() <= x && x <= mMainView.getRight(); - - return withinVertical && withinHorizontal; - } - - private boolean shouldInitiateADrag() { - float minDistToInitiateDrag = mDragHelper.getTouchSlop(); - return mDragDist >= minDistToInitiateDrag; - } - - private void accumulateDragDist(MotionEvent ev) { - final int action = ev.getAction(); - if (action == MotionEvent.ACTION_DOWN) { - mDragDist = 0; - return; - } - - float dragged = Math.abs(ev.getX() - mPrevX); - - mDragDist += dragged; - } - - private void init(Context context, AttributeSet attrs) { - if (attrs != null && context != null) { - TypedArray a = context.getTheme().obtainStyledAttributes( - attrs, - R.styleable.SwipeRevealLayout, - 0, 0 - ); - - mDragEdge = a.getInteger(R.styleable.SwipeRevealLayout_dragFromEdge, DRAG_EDGE_LEFT); - mMode = MODE_NORMAL; - mMinFlingVelocity = DEFAULT_MIN_FLING_VELOCITY; - mMinDistRequestDisallowParent = DEFAULT_MIN_DIST_REQUEST_DISALLOW_PARENT; - } - - mDragHelper = ViewDragHelper.create(this, 1.0f, mDragHelperCallback); - mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_ALL); - - mGestureDetector = new GestureDetectorCompat(context, mGestureListener); - } - - private final GestureDetector.OnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener() { - boolean hasDisallowed = false; - - @Override - public boolean onDown(MotionEvent e) { - mIsScrolling = false; - hasDisallowed = false; - return true; - } - - @Override - public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - mIsScrolling = true; - return false; - } - - @Override - public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { - mIsScrolling = true; - - if (getParent() != null) { - boolean shouldDisallow; - - if (!hasDisallowed) { - shouldDisallow = getDistToClosestEdge() >= mMinDistRequestDisallowParent; - if (shouldDisallow) { - hasDisallowed = true; - } - } else { - shouldDisallow = true; - } - - // disallow parent to intercept touch event so that the layout will work - // properly on RecyclerView or view that handles scroll gesture. - getParent().requestDisallowInterceptTouchEvent(shouldDisallow); - } - - return false; - } - }; - - private int getDistToClosestEdge() { - switch (mDragEdge) { - case DRAG_EDGE_LEFT: - final int pivotRight = mRectMainClose.left + mSecondaryView.getWidth(); - - return Math.min( - mMainView.getLeft() - mRectMainClose.left, - pivotRight - mMainView.getLeft() - ); - - case DRAG_EDGE_RIGHT: - final int pivotLeft = mRectMainClose.right - mSecondaryView.getWidth(); - - return Math.min( - mMainView.getRight() - pivotLeft, - mRectMainClose.right - mMainView.getRight() - ); - } - - return 0; - } - - private int getHalfwayPivotHorizontal() { - if (mDragEdge == DRAG_EDGE_LEFT) { - return mRectMainClose.left + mSecondaryView.getWidth() / 2; - } else { - return mRectMainClose.right - mSecondaryView.getWidth() / 2; - } - } - - private final ViewDragHelper.Callback mDragHelperCallback = new ViewDragHelper.Callback() { - @Override - public boolean tryCaptureView(View child, int pointerId) { - - if (mLockDrag) - return false; - - mDragHelper.captureChildView(mMainView, pointerId); - return false; - } - - @Override - public int clampViewPositionHorizontal(View child, int left, int dx) { - switch (mDragEdge) { - case DRAG_EDGE_RIGHT: - return Math.max( - Math.min(left, mRectMainClose.left), - mRectMainClose.left - mSecondaryView.getWidth() - ); - - case DRAG_EDGE_LEFT: - return Math.max( - Math.min(left, mRectMainClose.left + mSecondaryView.getWidth()), - mRectMainClose.left - ); - - default: - return child.getLeft(); - } - } - - @Override - public void onViewReleased(View releasedChild, float xvel, float yvel) { - final boolean velRightExceeded = pxToDp((int) xvel) >= mMinFlingVelocity; - final boolean velLeftExceeded = pxToDp((int) xvel) <= -mMinFlingVelocity; - - final int pivotHorizontal = getHalfwayPivotHorizontal(); - - switch (mDragEdge) { - case DRAG_EDGE_RIGHT: - if (velRightExceeded) { - close(true); - } else if (velLeftExceeded) { - open(true); - } else { - if (mMainView.getRight() < pivotHorizontal) { - open(true); - } else { - close(true); - } - } - break; - - case DRAG_EDGE_LEFT: - if (velRightExceeded) { - open(true); - } else if (velLeftExceeded) { - close(true); - } else { - if (mMainView.getLeft() < pivotHorizontal) { - close(true); - } else { - open(true); - } - } - break; - } - } - - @Override - public void onEdgeDragStarted(int edgeFlags, int pointerId) { - super.onEdgeDragStarted(edgeFlags, pointerId); - - if (mLockDrag) { - return; - } - - boolean edgeStartLeft = (mDragEdge == DRAG_EDGE_RIGHT) - && edgeFlags == ViewDragHelper.EDGE_LEFT; - - boolean edgeStartRight = (mDragEdge == DRAG_EDGE_LEFT) - && edgeFlags == ViewDragHelper.EDGE_RIGHT; - - if (edgeStartLeft || edgeStartRight) { - mDragHelper.captureChildView(mMainView, pointerId); - } - } - - @Override - public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { - super.onViewPositionChanged(changedView, left, top, dx, dy); - if (mMode == MODE_SAME_LEVEL) { - if (mDragEdge == DRAG_EDGE_LEFT || mDragEdge == DRAG_EDGE_RIGHT) { - mSecondaryView.offsetLeftAndRight(dx); - } else { - mSecondaryView.offsetTopAndBottom(dy); - } - } - ViewCompat.postInvalidateOnAnimation(SwipeRevealLayout.this); - } - }; - - private int pxToDp(int px) { - Resources resources = getContext().getResources(); - DisplayMetrics metrics = resources.getDisplayMetrics(); - return (int) (px / ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT)); - } -} \ No newline at end of file diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java index f9df28d5ca..3489210b62 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java @@ -11,10 +11,8 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; -import android.widget.Toast; import com.squareup.picasso.Callback; import com.squareup.picasso.Picasso; @@ -71,12 +69,6 @@ public class UserListAdapter extends RecyclerView.Adapter - + android:background="?attr/selectableItemBackground" + android:clickable="true"> - + - + - - - - - - - - - + - - - + android:layout_height="wrap_content" /> + - - - \ No newline at end of file + \ No newline at end of file diff --git a/android/app/src/main/res/values/attrs.xml b/android/app/src/main/res/values/attrs.xml deleted file mode 100644 index c12f28ccde..0000000000 --- a/android/app/src/main/res/values/attrs.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file From b65f2d46a64d5bcda85938edd621bfec162c8c29 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Fri, 10 Aug 2018 18:18:24 -0300 Subject: [PATCH 17/68] Android - People - Letters styling in row --- .../hifiinterface/view/UserListAdapter.java | 8 +++++-- android/app/src/main/res/layout/user_item.xml | 21 +++++++++++++++---- android/app/src/main/res/values/colors.xml | 1 + android/app/src/main/res/values/strings.xml | 2 +- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java index 3489210b62..202fd82c8b 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java @@ -67,9 +67,9 @@ public class UserListAdapter extends RecyclerView.Adapter - + + android:layout_height="wrap_content"> + + + \ No newline at end of file diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml index 7e6cf52d36..9de0ae5347 100644 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -18,4 +18,5 @@ #99000000 #292929 #23B2E7 + #62D5C6 diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 9fe7f0cbee..d5da2f857b 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -23,5 +23,5 @@ No places exist with that name Privacy Policy Your Last Location - + Online From 3c665b7de8c4d66f84a1b4976a6a8e4c432076d5 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Fri, 10 Aug 2018 14:40:08 -0700 Subject: [PATCH 18/68] Don't delete sequence numbers outside of range as range may change --- interface/src/Application.cpp | 3 +-- interface/src/octree/SafeLanding.cpp | 23 +++++++++++-------- interface/src/octree/SafeLanding.h | 2 +- .../src/EntityTreeRenderer.cpp | 8 +++++++ 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index cc2c7f601a..cf5da63dc8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5495,7 +5495,6 @@ void Application::update(float deltaTime) { if (!_physicsEnabled) { if (!domainLoadingInProgress) { PROFILE_ASYNC_BEGIN(app, "Scene Loading", ""); - _octreeProcessor.startEntitySequence(); domainLoadingInProgress = true; } @@ -5514,7 +5513,7 @@ void Application::update(float deltaTime) { // process octree stats packets are sent in between full sends of a scene (this isn't currently true). // We keep physics disabled until we've received a full scene and everything near the avatar in that // scene is ready to compute its collision shape. - if (nearbyEntitiesAreReadyForPhysics() && getMyAvatar()->isReadyForPhysics()) { + if (getMyAvatar()->isReadyForPhysics()) { _physicsEnabled = true; getMyAvatar()->updateMotionBehaviorFromMenu(); } diff --git a/interface/src/octree/SafeLanding.cpp b/interface/src/octree/SafeLanding.cpp index ab0ae784f8..c958527c4a 100644 --- a/interface/src/octree/SafeLanding.cpp +++ b/interface/src/octree/SafeLanding.cpp @@ -85,7 +85,7 @@ void SafeLanding::deleteTrackedEntity(const EntityItemID& entityID) { void SafeLanding::setCompletionSequenceNumbers(int first, int last) { Locker lock(_lock); _initialStart = first; - _initialEnd = (last + 1) % SEQUENCE_MODULO; + _initialEnd = last; } void SafeLanding::sequenceNumberReceived(int sequenceNumber) { @@ -96,7 +96,7 @@ void SafeLanding::sequenceNumberReceived(int sequenceNumber) { } bool SafeLanding::isLoadSequenceComplete() { - if (sequenceNumbersComplete() && entityPhysicsComplete()) { + if (entityPhysicsComplete() && sequenceNumbersComplete()) { Locker lock(_lock); _trackingEntities = false; _trackedEntities.clear(); @@ -109,14 +109,19 @@ bool SafeLanding::isLoadSequenceComplete() { bool SafeLanding::sequenceNumbersComplete() { if (_initialStart != INVALID_SEQUENCE) { Locker lock(_lock); - auto startIter = _sequenceNumbers.find(_initialStart); - if (startIter != _sequenceNumbers.end()) { - _sequenceNumbers.erase(_sequenceNumbers.begin(), startIter); - _sequenceNumbers.erase(_sequenceNumbers.find(_initialEnd), _sequenceNumbers.end()); - int sequenceSize = _initialStart < _initialEnd ? _initialEnd - _initialStart : + //auto startIter = _sequenceNumbers.find(_initialStart); + //if (startIter != _sequenceNumbers.end()) { + // _sequenceNumbers.erase(_sequenceNumbers.begin(), startIter); + // _sequenceNumbers.erase(_sequenceNumbers.find(_initialEnd), _sequenceNumbers.end()); + int sequenceSize = _initialStart < _initialEnd ? _initialEnd - _initialStart: _initialEnd + SEQUENCE_MODULO - _initialStart; - // First no. exists, nothing outside of first, last exists, so complete iff set size is sequence size. - return (int) _sequenceNumbers.size() == sequenceSize; + // // First no. exists, nothing outside of first, last exists, so complete iff set size is sequence size. + // return (int) _sequenceNumbers.size() == sequenceSize; + //} + auto startIter = _sequenceNumbers.find(_initialStart); + auto endIter = _sequenceNumbers.find(_initialEnd); + if (startIter != _sequenceNumbers.end() && endIter != _sequenceNumbers.end() && std::distance(startIter, endIter) == sequenceSize) { + return true; } } return false; diff --git a/interface/src/octree/SafeLanding.h b/interface/src/octree/SafeLanding.h index a9146f58c7..2a9413034c 100644 --- a/interface/src/octree/SafeLanding.h +++ b/interface/src/octree/SafeLanding.h @@ -48,7 +48,7 @@ private: static constexpr int INVALID_SEQUENCE = -1; int _initialStart { INVALID_SEQUENCE }; - int _initialEnd { INVALID_SEQUENCE }; // final sequence, exclusive. + int _initialEnd { INVALID_SEQUENCE }; struct SequenceLessThan { bool operator()(const int& a, const int& b) const; diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index e330427350..6b8505eaf1 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -642,6 +642,14 @@ bool EntityTreeRenderer::applyLayeredZones() { } void EntityTreeRenderer::processEraseMessage(ReceivedMessage& message, const SharedNodePointer& sourceNode) { + OCTREE_PACKET_FLAGS flags; + message.readPrimitive(&flags); + + OCTREE_PACKET_SEQUENCE sequence; + message.readPrimitive(&sequence); + + _lastOctreeMessageSequence = sequence; + message.seek(0); std::static_pointer_cast(_tree)->processEraseMessage(message, sourceNode); } From 610306c49c05353bd3f1c0b90aaa5db411272421 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Fri, 10 Aug 2018 19:02:01 -0300 Subject: [PATCH 19/68] Android - People - add friend star --- android/app/src/main/res/drawable/ic_star.xml | 4 ++++ android/app/src/main/res/layout/user_item.xml | 10 +++++++++- android/app/src/main/res/values/colors.xml | 2 ++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 android/app/src/main/res/drawable/ic_star.xml diff --git a/android/app/src/main/res/drawable/ic_star.xml b/android/app/src/main/res/drawable/ic_star.xml new file mode 100644 index 0000000000..abd1798942 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_star.xml @@ -0,0 +1,4 @@ + + + diff --git a/android/app/src/main/res/layout/user_item.xml b/android/app/src/main/res/layout/user_item.xml index 703c99945e..dec9f04af8 100644 --- a/android/app/src/main/res/layout/user_item.xml +++ b/android/app/src/main/res/layout/user_item.xml @@ -44,5 +44,13 @@ android:fontFamily="@font/raleway_italic"/> - + \ No newline at end of file diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml index 9de0ae5347..ecca075298 100644 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -19,4 +19,6 @@ #292929 #23B2E7 #62D5C6 + #FBD92A + #8A8A8A From 05fa7fdf0e012fab69b26c1a77317536287ebe07 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Fri, 10 Aug 2018 15:43:51 -0700 Subject: [PATCH 20/68] Clean-up --- interface/src/octree/SafeLanding.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/interface/src/octree/SafeLanding.cpp b/interface/src/octree/SafeLanding.cpp index c958527c4a..4cbdb815b2 100644 --- a/interface/src/octree/SafeLanding.cpp +++ b/interface/src/octree/SafeLanding.cpp @@ -37,12 +37,14 @@ void SafeLanding::startEntitySequence(QSharedPointer entityT if (entityTree) { Locker lock(_lock); _entityTree = entityTree; + _trackingEntities = true; connect(std::const_pointer_cast(_entityTree).get(), &EntityTree::addingEntity, this, &SafeLanding::addTrackedEntity); connect(std::const_pointer_cast(_entityTree).get(), &EntityTree::deletingEntity, this, &SafeLanding::deleteTrackedEntity); - _trackingEntities = true; _sequenceNumbers.clear(); + _initialStart = INVALID_SEQUENCE; + _initialEnd = INVALID_SEQUENCE; } } } @@ -58,6 +60,7 @@ void SafeLanding::stopEntitySequence() { void SafeLanding::addTrackedEntity(const EntityItemID& entityID) { if (_trackingEntities) { + Locker lock(_lock); EntityItemPointer entity = _entityTree->findEntityByID(entityID); if (entity && !entity->getCollisionless()) { @@ -68,7 +71,6 @@ void SafeLanding::addTrackedEntity(const EntityItemID& entityID) { { SHAPE_TYPE_COMPOUND, SHAPE_TYPE_SIMPLE_COMPOUND, SHAPE_TYPE_STATIC_MESH, SHAPE_TYPE_SIMPLE_HULL }; if (downloadedCollisionTypes.count(modelEntity->getShapeType()) != 0) { // Only track entities with downloaded collision bodies. - Locker lock(_lock); _trackedEntities.emplace(entityID, entity); qCDebug(interfaceapp) << "Safe Landing: Tracking entity " << entity->getItemName(); } @@ -84,8 +86,10 @@ void SafeLanding::deleteTrackedEntity(const EntityItemID& entityID) { void SafeLanding::setCompletionSequenceNumbers(int first, int last) { Locker lock(_lock); - _initialStart = first; - _initialEnd = last; + if (_initialStart == INVALID_SEQUENCE) { + _initialStart = first; + _initialEnd = last; + } } void SafeLanding::sequenceNumberReceived(int sequenceNumber) { @@ -98,8 +102,10 @@ void SafeLanding::sequenceNumberReceived(int sequenceNumber) { bool SafeLanding::isLoadSequenceComplete() { if (entityPhysicsComplete() && sequenceNumbersComplete()) { Locker lock(_lock); - _trackingEntities = false; _trackedEntities.clear(); + _initialStart = INVALID_SEQUENCE; + _initialEnd = INVALID_SEQUENCE; + _entityTree = nullptr; qCDebug(interfaceapp) << "Safe Landing: load sequence complete"; } @@ -109,18 +115,12 @@ bool SafeLanding::isLoadSequenceComplete() { bool SafeLanding::sequenceNumbersComplete() { if (_initialStart != INVALID_SEQUENCE) { Locker lock(_lock); - //auto startIter = _sequenceNumbers.find(_initialStart); - //if (startIter != _sequenceNumbers.end()) { - // _sequenceNumbers.erase(_sequenceNumbers.begin(), startIter); - // _sequenceNumbers.erase(_sequenceNumbers.find(_initialEnd), _sequenceNumbers.end()); int sequenceSize = _initialStart < _initialEnd ? _initialEnd - _initialStart: _initialEnd + SEQUENCE_MODULO - _initialStart; - // // First no. exists, nothing outside of first, last exists, so complete iff set size is sequence size. - // return (int) _sequenceNumbers.size() == sequenceSize; - //} auto startIter = _sequenceNumbers.find(_initialStart); auto endIter = _sequenceNumbers.find(_initialEnd); - if (startIter != _sequenceNumbers.end() && endIter != _sequenceNumbers.end() && std::distance(startIter, endIter) == sequenceSize) { + if (startIter != _sequenceNumbers.end() && endIter != _sequenceNumbers.end() && distance(startIter, endIter) == sequenceSize) { + _trackingEntities = false; // Don't track anything else that comes in. return true; } } From 0ae86d5aa8ce241e132df8774abe6ad8cb989ca6 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Fri, 10 Aug 2018 16:16:58 -0700 Subject: [PATCH 21/68] Remove useless statement --- interface/src/octree/OctreePacketProcessor.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 6dab37b1a1..f740995123 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -121,8 +121,6 @@ void OctreePacketProcessor::processPacket(QSharedPointer messag // Read sequence # OCTREE_PACKET_SEQUENCE completionNumber; message->readPrimitive(&completionNumber); - - completionNumber; _safeLanding->setCompletionSequenceNumbers(0, completionNumber); } break; From a20be5b50d0e7db89d7c56846974fd3b1de29c38 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Sat, 11 Aug 2018 02:28:01 +0200 Subject: [PATCH 22/68] remove rotation for newly created entities --- scripts/system/edit.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/system/edit.js b/scripts/system/edit.js index fe790480f6..f9674b4414 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -314,8 +314,6 @@ var toolBar = (function () { direction = MyAvatar.orientation; } direction = Vec3.multiplyQbyV(direction, Vec3.UNIT_Z); - // Align entity with Avatar orientation. - properties.rotation = MyAvatar.orientation; var PRE_ADJUST_ENTITY_TYPES = ["Box", "Sphere", "Shape", "Text", "Web", "Material"]; if (PRE_ADJUST_ENTITY_TYPES.indexOf(properties.type) !== -1) { From 829b83c61ddcffa6153ba68406a1f2dfdf91edb9 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Fri, 10 Aug 2018 18:16:08 -0700 Subject: [PATCH 23/68] Use elevated model priority during initial load --- interface/src/octree/SafeLanding.cpp | 2 ++ interface/src/octree/SafeLanding.h | 3 +++ 2 files changed, 5 insertions(+) diff --git a/interface/src/octree/SafeLanding.cpp b/interface/src/octree/SafeLanding.cpp index 4cbdb815b2..16e357c9dd 100644 --- a/interface/src/octree/SafeLanding.cpp +++ b/interface/src/octree/SafeLanding.cpp @@ -45,6 +45,7 @@ void SafeLanding::startEntitySequence(QSharedPointer entityT _sequenceNumbers.clear(); _initialStart = INVALID_SEQUENCE; _initialEnd = INVALID_SEQUENCE; + EntityTreeRenderer::setEntityLoadingPriorityFunction(&ElevatedPriority); } } } @@ -106,6 +107,7 @@ bool SafeLanding::isLoadSequenceComplete() { _initialStart = INVALID_SEQUENCE; _initialEnd = INVALID_SEQUENCE; _entityTree = nullptr; + EntityTreeRenderer::setEntityLoadingPriorityFunction(StandardPriority); qCDebug(interfaceapp) << "Safe Landing: load sequence complete"; } diff --git a/interface/src/octree/SafeLanding.h b/interface/src/octree/SafeLanding.h index 2a9413034c..9a846294bf 100644 --- a/interface/src/octree/SafeLanding.h +++ b/interface/src/octree/SafeLanding.h @@ -57,6 +57,9 @@ private: std::set _sequenceNumbers; std::set _trackedURLs; + static float ElevatedPriority(const EntityItem&) { return 10.0f; } + static float StandardPriority(const EntityItem&) { return 0.0f; } + static const int SEQUENCE_MODULO; }; From b381a182bd66d0ee8c4d22dcbdf3042f0975e262 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Mon, 13 Aug 2018 14:31:20 -0300 Subject: [PATCH 24/68] Android - People - add padding to list --- android/app/src/main/res/layout/fragment_friends.xml | 3 +++ android/app/src/main/res/values/dimens.xml | 2 ++ 2 files changed, 5 insertions(+) diff --git a/android/app/src/main/res/layout/fragment_friends.xml b/android/app/src/main/res/layout/fragment_friends.xml index 8129f5d53c..4e4abb7f28 100644 --- a/android/app/src/main/res/layout/fragment_friends.xml +++ b/android/app/src/main/res/layout/fragment_friends.xml @@ -12,6 +12,9 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" + android:paddingTop="@dimen/list_vertical_padding" + android:paddingBottom="@dimen/list_vertical_padding" + android:clipToPadding="false" android:layout_width="0dp" android:layout_height="0dp" /> diff --git a/android/app/src/main/res/values/dimens.xml b/android/app/src/main/res/values/dimens.xml index bb5be1c070..d40132939b 100644 --- a/android/app/src/main/res/values/dimens.xml +++ b/android/app/src/main/res/values/dimens.xml @@ -37,4 +37,6 @@ 101dp 425dp + 8dp + From 1bfd6fe97dd1e73999f4db9995c1cc4958f14f3b Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Mon, 13 Aug 2018 20:32:45 -0300 Subject: [PATCH 25/68] Android - People - Sliding panel (for users actions) --- android/app/build.gradle | 2 + .../hifiinterface/MainActivity.java | 12 +++++- .../fragment/FriendsFragment.java | 39 +++++++++++++++++++ .../hifiinterface/view/UserListAdapter.java | 19 ++++++++- .../src/main/res/layout/fragment_friends.xml | 30 ++++++++------ android/app/src/main/res/values/strings.xml | 3 ++ android/build.gradle | 1 + 7 files changed, 93 insertions(+), 13 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index d5058a7f40..a32ab20f6c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -144,5 +144,7 @@ dependencies { compile 'com.squareup.retrofit2:converter-gson:2.4.0' implementation 'com.squareup.picasso:picasso:2.71828' + compile 'com.sothree.slidinguppanel:library:3.4.0' + implementation fileTree(include: ['*.jar'], dir: 'libs') } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java index 220a69381d..d259e18ee7 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -150,7 +150,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On private void loadFragment(Fragment fragment, String title, boolean addToBackStack) { FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction ft = fragmentManager.beginTransaction(); - ft.replace(R.id.content_frame, fragment); + ft.replace(R.id.content_frame, fragment, getString(R.string.tagFragmentPeople)); + if (addToBackStack) { ft.addToBackStack(title); } @@ -297,6 +298,15 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On @Override public void onBackPressed() { + // if a fragment needs to internally manage back presses.. + FragmentManager fm = getFragmentManager(); + Fragment friendsFragment = fm.findFragmentByTag(getString(R.string.tagFragmentPeople)); + if (friendsFragment != null && friendsFragment instanceof FriendsFragment) { + if (((FriendsFragment) friendsFragment).onBackPressed()) { + return; + } + } + int index = getFragmentManager().getBackStackEntryCount() - 1; if (index > 0) { super.onBackPressed(); diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java index e70ecfbc57..2cd80bcca9 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java @@ -10,6 +10,8 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.sothree.slidinguppanel.SlidingUpPanelLayout; + import io.highfidelity.hifiinterface.R; import io.highfidelity.hifiinterface.view.UserListAdapter; @@ -20,7 +22,9 @@ public class FriendsFragment extends Fragment { public native String nativeGetAccessToken(); private RecyclerView mUsersView; + private View mUserActions; private UserListAdapter mUsersAdapter; + private SlidingUpPanelLayout mSlidingUpPanelLayout; public FriendsFragment() { // Required empty public constructor @@ -45,9 +49,44 @@ public class FriendsFragment extends Fragment { GridLayoutManager gridLayoutMgr = new GridLayoutManager(getContext(), numberOfColumns); mUsersView.setLayoutManager(gridLayoutMgr); mUsersAdapter = new UserListAdapter(getContext(), accessToken); + + mUserActions = rootView.findViewById(R.id.userActionsLayout); + + mSlidingUpPanelLayout = rootView.findViewById(R.id.sliding_layout); + mSlidingUpPanelLayout.setPanelHeight(0); + mUsersAdapter.setClickListener(new UserListAdapter.ItemClickListener() { + @Override + public void onItemClick(View view, int position, UserListAdapter.User user) { + // 1. 'select' user + // .. + // 2. adapt options + // .. + // 3. show + mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED); + } + }); mUsersView.setAdapter(mUsersAdapter); + mSlidingUpPanelLayout.setFadeOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + } + }); + return rootView; } + /** + * Processes the back pressed event and returns true if it was managed by this Fragment + * @return + */ + public boolean onBackPressed() { + if (mSlidingUpPanelLayout.getPanelState().equals(SlidingUpPanelLayout.PanelState.EXPANDED)) { + mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + return true; + } else { + return false; + } + } } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java index 202fd82c8b..ad3a5cc136 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java @@ -34,6 +34,7 @@ public class UserListAdapter extends RecyclerView.Adapter mUsers = new ArrayList<>(); + private ItemClickListener mClickListener; public UserListAdapter(Context c, String accessToken) { mContext = c; @@ -99,7 +100,7 @@ public class UserListAdapter extends RecyclerView.Adapter - + android:gravity="bottom" + sothree:umanoShadowHeight="4dp" + android:background="@color/backgroundLight"> + + android:layout_width="match_parent" + android:layout_height="match_parent" /> - + + + + diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index d5da2f857b..ea4e59a35a 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -24,4 +24,7 @@ Privacy Policy Your Last Location Online + + + tagFragmentPeople diff --git a/android/build.gradle b/android/build.gradle index bc39c30472..6ecdd34542 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -28,6 +28,7 @@ allprojects { repositories { jcenter() google() + mavenCentral() } } From 36e9c8ba3bceceb4995cd003cf34a3f61d5f80f7 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Tue, 14 Aug 2018 12:44:09 -0300 Subject: [PATCH 26/68] Android - People - UI changes to match design spec --- .../res/drawable/ic_delete_black_24dp.xml | 9 +++ .../app/src/main/res/drawable/ic_visit.xml | 9 +++ .../src/main/res/layout/fragment_friends.xml | 64 +++++++++++++++++-- android/app/src/main/res/layout/user_item.xml | 6 +- 4 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 android/app/src/main/res/drawable/ic_delete_black_24dp.xml create mode 100644 android/app/src/main/res/drawable/ic_visit.xml diff --git a/android/app/src/main/res/drawable/ic_delete_black_24dp.xml b/android/app/src/main/res/drawable/ic_delete_black_24dp.xml new file mode 100644 index 0000000000..39e64d6980 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_delete_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/android/app/src/main/res/drawable/ic_visit.xml b/android/app/src/main/res/drawable/ic_visit.xml new file mode 100644 index 0000000000..0ecbf6838c --- /dev/null +++ b/android/app/src/main/res/drawable/ic_visit.xml @@ -0,0 +1,9 @@ + + + diff --git a/android/app/src/main/res/layout/fragment_friends.xml b/android/app/src/main/res/layout/fragment_friends.xml index f0f83089fc..3c8e0af6bc 100644 --- a/android/app/src/main/res/layout/fragment_friends.xml +++ b/android/app/src/main/res/layout/fragment_friends.xml @@ -1,12 +1,13 @@ - - + + + + + + + + diff --git a/android/app/src/main/res/layout/user_item.xml b/android/app/src/main/res/layout/user_item.xml index dec9f04af8..acdc6a8aea 100644 --- a/android/app/src/main/res/layout/user_item.xml +++ b/android/app/src/main/res/layout/user_item.xml @@ -26,7 +26,8 @@ android:id="@+id/userName" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:fontFamily="@font/raleway" /> + android:fontFamily="@font/raleway" + android:textColor="@color/menuOption"/> @@ -41,7 +42,8 @@ android:id="@+id/userLocation" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:fontFamily="@font/raleway_italic"/> + android:fontFamily="@font/raleway_italic" + android:textColor="@color/menuOption"/> Date: Tue, 14 Aug 2018 13:15:21 -0300 Subject: [PATCH 27/68] Android - People - swap-fix actions icons --- android/app/src/main/res/layout/fragment_friends.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/res/layout/fragment_friends.xml b/android/app/src/main/res/layout/fragment_friends.xml index 3c8e0af6bc..cc541e569e 100644 --- a/android/app/src/main/res/layout/fragment_friends.xml +++ b/android/app/src/main/res/layout/fragment_friends.xml @@ -39,7 +39,7 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginStart="@dimen/activity_horizontal_margin" - android:src="@drawable/ic_delete_black_24dp" + android:src="@drawable/ic_visit" android:tint="@color/white_opaque"/> Date: Tue, 14 Aug 2018 15:15:24 -0300 Subject: [PATCH 28/68] Android - People - Use designed icon for visit + add fade color --- .../src/main/res/drawable/ic_teleporticon.xml | 31 +++++++++++++++++++ .../app/src/main/res/drawable/ic_visit.xml | 9 ------ .../src/main/res/layout/fragment_friends.xml | 4 +-- android/app/src/main/res/values/colors.xml | 1 + 4 files changed, 34 insertions(+), 11 deletions(-) create mode 100644 android/app/src/main/res/drawable/ic_teleporticon.xml delete mode 100644 android/app/src/main/res/drawable/ic_visit.xml diff --git a/android/app/src/main/res/drawable/ic_teleporticon.xml b/android/app/src/main/res/drawable/ic_teleporticon.xml new file mode 100644 index 0000000000..429e6b795d --- /dev/null +++ b/android/app/src/main/res/drawable/ic_teleporticon.xml @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_visit.xml b/android/app/src/main/res/drawable/ic_visit.xml deleted file mode 100644 index 0ecbf6838c..0000000000 --- a/android/app/src/main/res/drawable/ic_visit.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/android/app/src/main/res/layout/fragment_friends.xml b/android/app/src/main/res/layout/fragment_friends.xml index cc541e569e..6cee738244 100644 --- a/android/app/src/main/res/layout/fragment_friends.xml +++ b/android/app/src/main/res/layout/fragment_friends.xml @@ -6,7 +6,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom" - app:umanoFadeColor="@android:color/transparent" + app:umanoFadeColor="@color/slidingUpPanelFadeColor" app:umanoShadowHeight="4dp" android:background="@color/backgroundLight"> @@ -39,7 +39,7 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginStart="@dimen/activity_horizontal_margin" - android:src="@drawable/ic_visit" + android:src="@drawable/ic_teleporticon" android:tint="@color/white_opaque"/> #62D5C6 #FBD92A #8A8A8A + #40000000 From 410873312884b4cb9ad4c24fc5fdc3398c13f105 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Tue, 14 Aug 2018 15:23:09 -0300 Subject: [PATCH 29/68] Android - People - tags spacing --- .../app/src/main/res/layout/fragment_friends.xml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/android/app/src/main/res/layout/fragment_friends.xml b/android/app/src/main/res/layout/fragment_friends.xml index 6cee738244..62b62b3caf 100644 --- a/android/app/src/main/res/layout/fragment_friends.xml +++ b/android/app/src/main/res/layout/fragment_friends.xml @@ -9,7 +9,7 @@ app:umanoFadeColor="@color/slidingUpPanelFadeColor" app:umanoShadowHeight="4dp" android:background="@color/backgroundLight"> - + + android:background="@color/backgroundDark"> + + android:tint="@color/white_opaque" /> + android:layout_marginStart="32dp" /> + android:tint="@color/white_opaque" /> + android:layout_marginStart="32dp" /> From 3032c7802b5494ef3ac71af7710fd9b1ba985bfa Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Tue, 14 Aug 2018 17:56:42 -0300 Subject: [PATCH 30/68] Android - People - Star for friends, toggle UI, use data from API for initial status. Change+Post is pending --- .../provider/EndpointUsersProvider.java | 5 ++- .../hifiinterface/provider/UsersProvider.java | 3 ++ .../hifiinterface/view/UserListAdapter.java | 37 +++++++++++++++++++ android/app/src/main/res/layout/user_item.xml | 3 ++ 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java index 3e034b654b..d35249a476 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java @@ -1,5 +1,7 @@ package io.highfidelity.hifiinterface.provider; +import android.util.Log; + import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -47,6 +49,7 @@ public class EndpointUsersProvider implements UsersProvider { return chain.proceed(request); } }); + Log.d("[USERZ]", "Authorization: Bearer " + accessToken);// CLD DELETE THIS LINE! OkHttpClient client = httpClient.build(); mRetrofit = new Retrofit.Builder() @@ -60,7 +63,7 @@ public class EndpointUsersProvider implements UsersProvider { @Override public void retrieve(UsersCallback usersCallback) { Call friendsCall = mEndpointUsersProviderService.getUsers( - "friends", + CONNECTION_FILTER_CONNECTIONS, 400, null); friendsCall.enqueue(new Callback() { diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UsersProvider.java b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UsersProvider.java index 13ed812ce6..75f978800f 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UsersProvider.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UsersProvider.java @@ -10,6 +10,9 @@ import io.highfidelity.hifiinterface.view.UserListAdapter; public interface UsersProvider { + public static String CONNECTION_TYPE_FRIEND = "friend"; + public static String CONNECTION_FILTER_CONNECTIONS = "connections"; + void retrieve(UsersProvider.UsersCallback usersCallback); interface UsersCallback { diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java index ad3a5cc136..bcb379c501 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java @@ -2,8 +2,10 @@ package io.highfidelity.hifiinterface.view; import android.content.Context; import android.graphics.Bitmap; +import android.graphics.PorterDuff; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; +import android.support.v4.content.ContextCompat; import android.support.v4.graphics.drawable.RoundedBitmapDrawable; import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; import android.support.v7.widget.RecyclerView; @@ -69,6 +71,7 @@ public class UserListAdapter extends RecyclerView.Adapter Date: Tue, 14 Aug 2018 20:22:23 -0300 Subject: [PATCH 31/68] Android - People - Befriending working --- .../provider/EndpointUsersProvider.java | 78 +++++++++++++++++++ .../hifiinterface/provider/UsersProvider.java | 12 +++ .../hifiinterface/view/UserListAdapter.java | 51 ++++++++++-- 3 files changed, 135 insertions(+), 6 deletions(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java index d35249a476..102d0995ee 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java @@ -15,7 +15,11 @@ import retrofit2.Call; import retrofit2.Callback; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; +import retrofit2.http.Body; +import retrofit2.http.DELETE; import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Path; import retrofit2.http.Query; /** @@ -93,11 +97,85 @@ public class EndpointUsersProvider implements UsersProvider { }); } + public class UserActionRetrofitCallback implements Callback { + + UserActionCallback callback; + + public UserActionRetrofitCallback(UserActionCallback callback) { + this.callback = callback; + } + + @Override + public void onResponse(Call call, retrofit2.Response response) { + if (!response.isSuccessful()) { + callback.requestError(new Exception("Error with " + + call.request().url().toString() + " " + + call.request().method() + " call " + response.message()), + response.message()); + return; + } + + if (response.body() == null || !"success".equals(response.body().status)) { + callback.requestError(new Exception("Error with " + + call.request().url().toString() + " " + + call.request().method() + " call " + response.message()), + response.message()); + return; + } + callback.requestOk(); + } + + @Override + public void onFailure(Call call, Throwable t) { + callback.requestError(new Exception(t), t.getMessage()); + } + } + + @Override + public void addFriend(String friendUserName, UserActionCallback callback) { + Call friendCall = mEndpointUsersProviderService.addFriend(new BodyAddFriend(friendUserName)); + friendCall.enqueue(new UserActionRetrofitCallback(callback)); + } + + @Override + public void removeFriend(String friendUserName, UserActionCallback callback) { + Call friendCall = mEndpointUsersProviderService.removeFriend(friendUserName); + friendCall.enqueue(new UserActionRetrofitCallback(callback)); + } + + @Override + public void removeConnection(String connectionUserName, UserActionCallback callback) { + Call connectionCall = mEndpointUsersProviderService.removeConnection(connectionUserName); + connectionCall.enqueue(new UserActionRetrofitCallback(callback)); + } + public interface EndpointUsersProviderService { @GET("api/v1/users") Call getUsers(@Query("filter") String filter, @Query("per_page") int perPage, @Query("online") Boolean online); + + @DELETE("api/v1/user/connections/{connectionUserName}") + Call removeConnection(@Path("connectionUserName") String connectionUserName); + + @DELETE("api/v1/user/friends/{friendUserName}") + Call removeFriend(@Path("friendUserName") String friendUserName); + + @POST("api/v1/user/friends") + Call addFriend(@Body BodyAddFriend friendUserName); + + /* response + { + "status": "success" + } + */ + } + + class BodyAddFriend { + String username; + public BodyAddFriend(String username) { + this.username = username; + } } class UsersResponse { diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UsersProvider.java b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UsersProvider.java index 75f978800f..0088506407 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UsersProvider.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UsersProvider.java @@ -20,4 +20,16 @@ public interface UsersProvider { void retrieveError(Exception e, String message); } + + void addFriend(String friendUserName, UserActionCallback callback); + + void removeFriend(String friendUserName, UserActionCallback callback); + + void removeConnection(String connectionUserName, UserActionCallback callback); + + interface UserActionCallback { + void requestOk(); + void requestError(Exception e, String message); + } + } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java index bcb379c501..7e6ccc10d6 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java @@ -71,7 +71,7 @@ public class UserListAdapter extends RecyclerView.Adapter Date: Wed, 15 Aug 2018 21:31:53 +1200 Subject: [PATCH 32/68] Disable Vive teleport button if transitioning from direction button --- .../controllers/controllerModules/teleport.js | 58 ++++++++++++++++++- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 92e3168147..e7040208fb 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -116,6 +116,11 @@ Script.include("/~/system/libraries/controllers.js"); function Teleporter(hand) { var _this = this; this.hand = hand; + + this.buttonStateXX = 0; // Left hand / right hand x-axis. + this.buttonStateXY = 0; // Left hand / right hand y-axis. + this.BUTTON_TRANSITION_DELAY = 50; // Allow time for transition from direction buttons to touch-pad. + this.buttonValue = 0; this.disabled = false; // used by the 'Hifi-Teleport-Disabler' message handler this.active = false; @@ -190,8 +195,42 @@ Script.include("/~/system/libraries/controllers.js"); Pointers.removePointer(this.teleportParabolaHeadInvisible); }; - this.buttonPress = function(value) { - _this.buttonValue = value; + + this.buttonStateXX = function (value) { + if (value !== 0) { + // Don't lock right hand's x-axis buttons if snap turn. + if (_this.hand === LEFT_HAND || !Controller.getValue(Controller.Hardware.Application.SnapTurn)) { + _this.buttonStateX = value; + } + } else { + // Delay direction button release until after teleport possibly pressed. + Script.setTimeout(function () { + _this.buttonStateX = value; + }, _this.BUTTON_TRANSITION_DELAY); + } + }; + + this.buttonStateXY = function (value) { + if (value !== 0) { + _this.buttonStateY = value; + } else { + // Delay direction button release until after teleport possibly pressed. + Script.setTimeout(function () { + _this.buttonStateY = value; + }, _this.BUTTON_TRANSITION_DELAY); + } + }; + + this.teleportLocked = function () { + // Lock teleport if in advanced movement mode and have just transitioned from pressing a direction button. + return Controller.getValue(Controller.Hardware.Application.AdvancedMovement) + && (_this.buttonStateX !== 0 || _this.buttonStateY !== 0); + }; + + this.buttonPress = function (value) { + if (value === 0 || !_this.teleportLocked()) { + _this.buttonValue = value; + } }; this.parameters = makeDispatcherModuleParameters( @@ -394,8 +433,21 @@ Script.include("/~/system/libraries/controllers.js"); mappingName = 'Hifi-Teleporter-Dev-' + Math.random(); teleportMapping = Controller.newMapping(mappingName); - teleportMapping.from(Controller.Standard.RightPrimaryThumb).peek().to(rightTeleporter.buttonPress); + // Disable Vive teleport if touch is transitioning across touch-pad after using a direction button. + if (Controller.Hardware.Vive) { + teleportMapping.from(Controller.Hardware.Vive.LX).peek().when(Controller.Hardware.Vive.LSX) + .to(leftTeleporter.buttonStateXX); + teleportMapping.from(Controller.Hardware.Vive.LY).peek().when(Controller.Hardware.Vive.LSY).invert() + .to(leftTeleporter.buttonStateXY); + teleportMapping.from(Controller.Hardware.Vive.RX).peek().when(Controller.Hardware.Vive.RSX) + .to(rightTeleporter.buttonStateXX); + teleportMapping.from(Controller.Hardware.Vive.RY).peek().when(Controller.Hardware.Vive.RSY).invert() + .to(rightTeleporter.buttonStateXY); + } + + // Teleport actions. teleportMapping.from(Controller.Standard.LeftPrimaryThumb).peek().to(leftTeleporter.buttonPress); + teleportMapping.from(Controller.Standard.RightPrimaryThumb).peek().to(rightTeleporter.buttonPress); } var leftTeleporter = new Teleporter(LEFT_HAND); From 6b2de050651c74fd3755e50e06c0eb67c4b03f49 Mon Sep 17 00:00:00 2001 From: Cristian Duarte Date: Wed, 15 Aug 2018 14:50:53 -0300 Subject: [PATCH 33/68] Android - People - Bigger touch area for friend star --- .../hifiinterface/view/UserListAdapter.java | 21 ++++++++----------- android/app/src/main/res/layout/user_item.xml | 21 ++++++++++++------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java index 7e6ccc10d6..b92c0dd97a 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java @@ -105,19 +105,16 @@ public class UserListAdapter extends RecyclerView.Adapter toggle()); } private void refreshUI() { @@ -136,7 +133,7 @@ public class UserListAdapter extends RecyclerView.Adapter - + android:layout_marginEnd="5.5dp"> + + + \ No newline at end of file From dd5bd0229af41014b5f3b95c0da1d0c18501561c Mon Sep 17 00:00:00 2001 From: Cristian Duarte Date: Wed, 15 Aug 2018 14:51:37 -0300 Subject: [PATCH 34/68] Android - People - Hide visit option if user is offline --- .../io/highfidelity/hifiinterface/fragment/FriendsFragment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java index 2cd80bcca9..37576a0e2f 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java @@ -13,6 +13,7 @@ import android.view.ViewGroup; import com.sothree.slidinguppanel.SlidingUpPanelLayout; import io.highfidelity.hifiinterface.R; +import io.highfidelity.hifiinterface.provider.UsersProvider; import io.highfidelity.hifiinterface.view.UserListAdapter; public class FriendsFragment extends Fragment { @@ -61,6 +62,7 @@ public class FriendsFragment extends Fragment { // .. // 2. adapt options // .. + rootView.findViewById(R.id.userActionVisit).setVisibility(user.online?View.VISIBLE:View.GONE); // 3. show mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED); } From 83ededfd37961ef157b1dd63497b32a2a090cc7e Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 13 Aug 2018 14:51:13 -0700 Subject: [PATCH 35/68] Pass collision filter flags into AllContactsCallback for more efficient collision filtering --- libraries/physics/src/PhysicsEngine.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index ef8c28bdc6..efe1bddc97 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -863,6 +863,9 @@ void PhysicsEngine::setShowBulletConstraintLimits(bool value) { } } +const int32_t CONTACT_CALLBACK_FLAG_ENTITY = BULLET_COLLISION_GROUP_STATIC | BULLET_COLLISION_GROUP_KINEMATIC | BULLET_COLLISION_GROUP_DYNAMIC; +const int32_t CONTACT_CALLBACK_FLAG_AVATAR = USER_COLLISION_GROUP_MY_AVATAR | USER_COLLISION_GROUP_OTHER_AVATAR; + struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { AllContactsCallback(MotionStateType desiredObjectType, const ShapeInfo& shapeInfo, const Transform& transform, btCollisionObject* myAvatarCollisionObject) : btCollisionWorld::ContactResultCallback(), @@ -879,6 +882,14 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { bulletTransform.setRotation(glmToBullet(transform.getRotation())); collisionObject.setWorldTransform(bulletTransform); + + m_collisionFilterGroup = ~0; // Everything collidable should collide with our test object unless we set the filter mask otherwise + if (desiredObjectType == MOTIONSTATE_TYPE_AVATAR) { + m_collisionFilterMask = CONTACT_CALLBACK_FLAG_AVATAR; + } + else { + m_collisionFilterMask = CONTACT_CALLBACK_FLAG_ENTITY; + } } ~AllContactsCallback() { @@ -890,10 +901,6 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { std::vector contacts; btCollisionObject* myAvatarCollisionObject; - bool needsCollision(btBroadphaseProxy* proxy) const override { - return true; - } - btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0, int partId0, int index0, const btCollisionObjectWrapper* colObj1, int partId1, int index1) override { const btCollisionObject* otherBody; btVector3 penetrationPoint; From 61d12923ea794373ee6b951ea16125f9ebc2aff2 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 13 Aug 2018 16:49:51 -0700 Subject: [PATCH 36/68] Do not copy list of collision pick contact points when filtering them --- interface/src/raypick/CollisionPick.cpp | 20 ++++++++++---------- interface/src/raypick/CollisionPick.h | 2 +- libraries/physics/src/PhysicsEngine.cpp | 2 +- libraries/physics/src/PhysicsEngine.h | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index 87c8c91e6d..a70882eed0 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -308,20 +308,18 @@ CollisionRegion CollisionPick::getMathematicalPick() const { return _mathPick; } -const std::vector CollisionPick::filterIntersections(const std::vector& intersections) const { - std::vector filteredIntersections; - +void CollisionPick::filterIntersections(std::vector& intersections) const { const QVector& ignoreItems = getIgnoreItems(); const QVector& includeItems = getIncludeItems(); bool isWhitelist = includeItems.size(); - for (const auto& intersection : intersections) { + for (int i = 0; i < intersections.size(); i++) { + auto& intersection = intersections[i]; const QUuid& id = intersection.foundID; - if (!ignoreItems.contains(id) && (!isWhitelist || includeItems.contains(id))) { - filteredIntersections.push_back(intersection); + if (ignoreItems.contains(id) || (isWhitelist && !includeItems.contains(id))) { + intersections[i] = intersections[intersections.size()-1]; + intersections.pop_back(); } } - - return filteredIntersections; } PickResultPointer CollisionPick::getEntityIntersection(const CollisionRegion& pick) { @@ -330,7 +328,8 @@ PickResultPointer CollisionPick::getEntityIntersection(const CollisionRegion& pi return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::vector(), std::vector()); } - const auto& entityIntersections = filterIntersections(_physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_ENTITY, *pick.shapeInfo, pick.transform)); + auto& entityIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_ENTITY, *pick.shapeInfo, pick.transform); + filterIntersections(entityIntersections); return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, entityIntersections, std::vector()); } @@ -344,7 +343,8 @@ PickResultPointer CollisionPick::getAvatarIntersection(const CollisionRegion& pi return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::vector(), std::vector()); } - const auto& avatarIntersections = filterIntersections(_physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_AVATAR, *pick.shapeInfo, pick.transform)); + auto& avatarIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_AVATAR, *pick.shapeInfo, pick.transform); + filterIntersections(avatarIntersections); return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, std::vector(), avatarIntersections); } diff --git a/interface/src/raypick/CollisionPick.h b/interface/src/raypick/CollisionPick.h index b3a7186893..bfc3487a62 100644 --- a/interface/src/raypick/CollisionPick.h +++ b/interface/src/raypick/CollisionPick.h @@ -92,7 +92,7 @@ protected: // Returns true if pick.shapeInfo is valid. Otherwise, attempts to get the shapeInfo ready for use. bool isShapeInfoReady(); void computeShapeInfo(CollisionRegion& pick, ShapeInfo& shapeInfo, QSharedPointer resource); - const std::vector filterIntersections(const std::vector& intersections) const; + void filterIntersections(std::vector& intersections) const; CollisionRegion _mathPick; PhysicsEnginePointer _physicsEngine; diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index efe1bddc97..cfe255e561 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -944,7 +944,7 @@ protected: } }; -const std::vector PhysicsEngine::getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const { +std::vector PhysicsEngine::getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const { // TODO: Give MyAvatar a motion state so we don't have to do this btCollisionObject* myAvatarCollisionObject = nullptr; if (desiredObjectType == MOTIONSTATE_TYPE_AVATAR && _myAvatarController) { diff --git a/libraries/physics/src/PhysicsEngine.h b/libraries/physics/src/PhysicsEngine.h index c5ab0cfdee..854d61844f 100644 --- a/libraries/physics/src/PhysicsEngine.h +++ b/libraries/physics/src/PhysicsEngine.h @@ -126,7 +126,7 @@ public: void setShowBulletConstraintLimits(bool value); // Function for getting colliding ObjectMotionStates in the world of specified type - const std::vector getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const; + std::vector getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const; private: QList removeDynamicsForBody(btRigidBody* body); From 81e24bb28ed02c3bb74d9ac0db2549eb44db7426 Mon Sep 17 00:00:00 2001 From: Cristian Duarte Date: Wed, 15 Aug 2018 17:29:28 -0300 Subject: [PATCH 37/68] Android - People - Remove connection (from People) working with API --- .../fragment/FriendsFragment.java | 46 ++++++++++++++++++- .../hifiinterface/view/UserListAdapter.java | 6 +-- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java index 37576a0e2f..306b965501 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java @@ -2,7 +2,9 @@ package io.highfidelity.hifiinterface.fragment; import android.app.Fragment; +import android.content.DialogInterface; import android.os.Bundle; +import android.support.v7.app.AlertDialog; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; @@ -13,6 +15,7 @@ import android.view.ViewGroup; import com.sothree.slidinguppanel.SlidingUpPanelLayout; import io.highfidelity.hifiinterface.R; +import io.highfidelity.hifiinterface.provider.EndpointUsersProvider; import io.highfidelity.hifiinterface.provider.UsersProvider; import io.highfidelity.hifiinterface.view.UserListAdapter; @@ -26,6 +29,8 @@ public class FriendsFragment extends Fragment { private View mUserActions; private UserListAdapter mUsersAdapter; private SlidingUpPanelLayout mSlidingUpPanelLayout; + private EndpointUsersProvider mUsersProvider; + private String mSelectedUsername; public FriendsFragment() { // Required empty public constructor @@ -42,6 +47,7 @@ public class FriendsFragment extends Fragment { View rootView = inflater.inflate(R.layout.fragment_friends, container, false); String accessToken = nativeGetAccessToken(); + mUsersProvider = new EndpointUsersProvider(accessToken); Log.d("[USERS]", "token : [" + accessToken + "]"); @@ -49,16 +55,21 @@ public class FriendsFragment extends Fragment { int numberOfColumns = 1; GridLayoutManager gridLayoutMgr = new GridLayoutManager(getContext(), numberOfColumns); mUsersView.setLayoutManager(gridLayoutMgr); - mUsersAdapter = new UserListAdapter(getContext(), accessToken); + + mUsersAdapter = new UserListAdapter(getContext(), mUsersProvider); mUserActions = rootView.findViewById(R.id.userActionsLayout); mSlidingUpPanelLayout = rootView.findViewById(R.id.sliding_layout); mSlidingUpPanelLayout.setPanelHeight(0); + + rootView.findViewById(R.id.userActionDelete).setOnClickListener(view -> onRemoveConnectionClick()); + mUsersAdapter.setClickListener(new UserListAdapter.ItemClickListener() { @Override public void onItemClick(View view, int position, UserListAdapter.User user) { // 1. 'select' user + mSelectedUsername = user.name; // .. // 2. adapt options // .. @@ -73,12 +84,44 @@ public class FriendsFragment extends Fragment { @Override public void onClick(View view) { mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + mSelectedUsername = null; } }); return rootView; } + private void onRemoveConnectionClick() { + if (mSelectedUsername == null) return; + + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setMessage("Remove this user from People?"); + builder.setPositiveButton("Remove", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + mUsersProvider.removeConnection(mSelectedUsername, new UsersProvider.UserActionCallback() { + @Override + public void requestOk() { + // CLD: Show success message + mUsersAdapter.loadUsers(); + } + + @Override + public void requestError(Exception e, String message) { + // CLD: Show error message? + } + }); + } + }); + builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + // Cancelled, nothing to do + } + }); + builder.show(); + } + /** * Processes the back pressed event and returns true if it was managed by this Fragment * @return @@ -86,6 +129,7 @@ public class FriendsFragment extends Fragment { public boolean onBackPressed() { if (mSlidingUpPanelLayout.getPanelState().equals(SlidingUpPanelLayout.PanelState.EXPANDED)) { mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + mSelectedUsername = null; return true; } else { return false; diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java index b92c0dd97a..c1ea698b08 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java @@ -38,14 +38,14 @@ public class UserListAdapter extends RecyclerView.Adapter mUsers = new ArrayList<>(); private ItemClickListener mClickListener; - public UserListAdapter(Context c, String accessToken) { + public UserListAdapter(Context c, UsersProvider usersProvider) { mContext = c; mInflater = LayoutInflater.from(mContext); - mProvider = new EndpointUsersProvider(accessToken); + mProvider = usersProvider; loadUsers(); } - private void loadUsers() { + public void loadUsers() { mProvider.retrieve(new UsersProvider.UsersCallback() { @Override public void retrieveOk(List users) { From 3217f61a53bf749e93bbe5d299b1abe375552ffd Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 15 Aug 2018 20:21:34 -0300 Subject: [PATCH 38/68] Android - People - Visit Online connections working --- android/app/src/main/cpp/native.cpp | 5 ++++ .../hifiinterface/InterfaceActivity.java | 5 ++++ .../hifiinterface/MainActivity.java | 16 ++++++++++- .../fragment/FriendsFragment.java | 27 +++++++++++++++++++ .../provider/EndpointUsersProvider.java | 14 ++++++++++ .../hifiinterface/view/UserListAdapter.java | 6 ++++- android/app/src/main/res/layout/user_item.xml | 1 + 7 files changed, 72 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index 9f0e088157..ce5af01f29 100644 --- a/android/app/src/main/cpp/native.cpp +++ b/android/app/src/main/cpp/native.cpp @@ -209,6 +209,11 @@ JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeGotoUr DependencyManager::get()->loadSettings(jniUrl.toString()); } +JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeGoToUser(JNIEnv* env, jobject obj, jstring username) { + QAndroidJniObject jniUsername("java/lang/String", "(Ljava/lang/String;)V", username); + DependencyManager::get()->goToUser(jniUsername.toString(), false); +} + JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnPause(JNIEnv* env, jobject obj) { } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java index 8fd8b9d0e6..f161783d6a 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java @@ -48,6 +48,7 @@ import com.google.vr.ndk.base.GvrApi;*/ public class InterfaceActivity extends QtActivity implements WebViewFragment.OnWebViewInteractionListener { public static final String DOMAIN_URL = "url"; + public static final String EXTRA_GOTO_USERNAME = "gotousername"; private static final String TAG = "Interface"; private static final int WEB_DRAWER_RIGHT_MARGIN = 262; private static final int WEB_DRAWER_BOTTOM_MARGIN = 150; @@ -59,6 +60,7 @@ public class InterfaceActivity extends QtActivity implements WebViewFragment.OnW private native long nativeOnCreate(InterfaceActivity instance, AssetManager assetManager); private native void nativeOnDestroy(); private native void nativeGotoUrl(String url); + private native void nativeGoToUser(String username); private native void nativeBeforeEnterBackground(); private native void nativeEnterBackground(); private native void nativeEnterForeground(); @@ -280,6 +282,9 @@ public class InterfaceActivity extends QtActivity implements WebViewFragment.OnW if (intent.hasExtra(DOMAIN_URL)) { webSlidingDrawer.setVisibility(View.GONE); nativeGotoUrl(intent.getStringExtra(DOMAIN_URL)); + } else if (intent.hasExtra(EXTRA_GOTO_USERNAME)) { + webSlidingDrawer.setVisibility(View.GONE); + nativeGoToUser(intent.getStringExtra(EXTRA_GOTO_USERNAME)); } } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java index d259e18ee7..1916962756 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -37,7 +37,8 @@ import io.highfidelity.hifiinterface.task.DownloadProfileImageTask; public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, LoginFragment.OnLoginInteractionListener, - HomeFragment.OnHomeInteractionListener { + HomeFragment.OnHomeInteractionListener, + FriendsFragment.OnHomeInteractionListener { private static final int PROFILE_PICTURE_PLACEHOLDER = R.drawable.default_profile_avatar; public static final String DEFAULT_FRAGMENT = "Home"; @@ -251,6 +252,14 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On startActivity(intent); } + private void goToUser(String username) { + Intent intent = new Intent(this, InterfaceActivity.class); + intent.putExtra(InterfaceActivity.EXTRA_GOTO_USERNAME, username); + finish(); + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); + startActivity(intent); + } + @Override public void onLoginCompleted() { loadHomeFragment(); @@ -280,6 +289,11 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On loadPrivacyPolicyFragment(); } + @Override + public void onVisitUserSelected(String username) { + goToUser(username); + } + private class RoundProfilePictureCallback implements Callback { @Override public void onSuccess() { diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java index 306b965501..4d48743883 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java @@ -2,6 +2,7 @@ package io.highfidelity.hifiinterface.fragment; import android.app.Fragment; +import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.support.v7.app.AlertDialog; @@ -32,6 +33,8 @@ public class FriendsFragment extends Fragment { private EndpointUsersProvider mUsersProvider; private String mSelectedUsername; + private OnHomeInteractionListener mListener; + public FriendsFragment() { // Required empty public constructor } @@ -65,6 +68,15 @@ public class FriendsFragment extends Fragment { rootView.findViewById(R.id.userActionDelete).setOnClickListener(view -> onRemoveConnectionClick()); + rootView.findViewById(R.id.userActionVisit).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (mListener != null && mSelectedUsername != null) { + mListener.onVisitUserSelected(mSelectedUsername); + } + } + }); + mUsersAdapter.setClickListener(new UserListAdapter.ItemClickListener() { @Override public void onItemClick(View view, int position, UserListAdapter.User user) { @@ -135,4 +147,19 @@ public class FriendsFragment extends Fragment { return false; } } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnHomeInteractionListener) { + mListener = (OnHomeInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnHomeInteractionListener"); + } + } + + public interface OnHomeInteractionListener { + void onVisitUserSelected(String username); + } } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java index 102d0995ee..af5a441737 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java @@ -85,6 +85,10 @@ public class EndpointUsersProvider implements UsersProvider { adapterUser.imageUrl = user.images.thumbnail; adapterUser.name = user.username; adapterUser.online = user.online; + adapterUser.locationName = (user.location != null ? + (user.location.root != null ? user.location.root.name : + (user.location.domain != null ? user.location.domain.name : "")) + : ""); adapterUsers.add(adapterUser); } usersCallback.retrieveOk(adapterUsers); @@ -199,6 +203,7 @@ public class EndpointUsersProvider implements UsersProvider { boolean online; String connection; Images images; + LocationData location; } class Images { @@ -208,4 +213,13 @@ public class EndpointUsersProvider implements UsersProvider { String tiny; } + class LocationData { + public LocationData() {} + NameContainer root; + NameContainer domain; + } + class NameContainer { + String name; + } + } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java index c1ea698b08..c1a69639c0 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java @@ -70,10 +70,12 @@ public class UserListAdapter extends RecyclerView.Adapter From 1a343c1c3313732321c97f364a9ac32ff935c518 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 15 Aug 2018 20:57:04 -0300 Subject: [PATCH 39/68] Android - People - Hide People menu if the user is not logged in --- .../java/io/highfidelity/hifiinterface/MainActivity.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java index 1916962756..1d34470146 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -58,6 +58,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On private View mLoginPanel; private View mProfilePanel; private TextView mLogoutOption; + private MenuItem mPeopleMenuItem; private boolean backToScene; @@ -77,6 +78,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On mDisplayName = mNavigationView.getHeaderView(0).findViewById(R.id.displayName); mProfilePicture = mNavigationView.getHeaderView(0).findViewById(R.id.profilePicture); + mPeopleMenuItem = mNavigationView.getMenu().findItem(R.id.action_people); + Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setTitleTextAppearance(this, R.style.HomeActionBarTitleStyle); setSupportActionBar(toolbar); @@ -167,11 +170,13 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On mLoginPanel.setVisibility(View.GONE); mProfilePanel.setVisibility(View.VISIBLE); mLogoutOption.setVisibility(View.VISIBLE); + mPeopleMenuItem.setVisible(true); updateProfileHeader(); } else { mLoginPanel.setVisibility(View.VISIBLE); mProfilePanel.setVisibility(View.GONE); mLogoutOption.setVisibility(View.GONE); + mPeopleMenuItem.setVisible(false); mDisplayName.setText(""); } } From 6f83c7bff0dd157d641502503a07a25fedcde260 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 15 Aug 2018 21:01:42 -0300 Subject: [PATCH 40/68] Android - People - Show name of user to delete in confirmation --- .../io/highfidelity/hifiinterface/fragment/FriendsFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java index 4d48743883..35e64aae2f 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java @@ -107,7 +107,7 @@ public class FriendsFragment extends Fragment { if (mSelectedUsername == null) return; AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setMessage("Remove this user from People?"); + builder.setMessage("Remove '" + mSelectedUsername + "' from People?"); builder.setPositiveButton("Remove", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { From 43b2a862242dc2b2539197fcf7746844d6edb6cf Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 15 Aug 2018 21:36:11 -0300 Subject: [PATCH 41/68] Android - People - Make list refreshable --- .../fragment/FriendsFragment.java | 25 +++++++++++++++++++ .../hifiinterface/view/UserListAdapter.java | 21 ++++++++++++++-- .../src/main/res/layout/fragment_friends.xml | 17 ++++++++----- 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java index 35e64aae2f..b30b387f4b 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java @@ -5,6 +5,7 @@ import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; +import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AlertDialog; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; @@ -34,6 +35,7 @@ public class FriendsFragment extends Fragment { private String mSelectedUsername; private OnHomeInteractionListener mListener; + private SwipeRefreshLayout mSwipeRefreshLayout; public FriendsFragment() { // Required empty public constructor @@ -54,12 +56,15 @@ public class FriendsFragment extends Fragment { Log.d("[USERS]", "token : [" + accessToken + "]"); + mSwipeRefreshLayout = rootView.findViewById(R.id.swipeRefreshLayout); + mUsersView = rootView.findViewById(R.id.rvUsers); int numberOfColumns = 1; GridLayoutManager gridLayoutMgr = new GridLayoutManager(getContext(), numberOfColumns); mUsersView.setLayoutManager(gridLayoutMgr); mUsersAdapter = new UserListAdapter(getContext(), mUsersProvider); + mSwipeRefreshLayout.setRefreshing(true); mUserActions = rootView.findViewById(R.id.userActionsLayout); @@ -90,6 +95,24 @@ public class FriendsFragment extends Fragment { mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED); } }); + + mUsersAdapter.setListener(new UserListAdapter.AdapterListener() { + @Override + public void onEmptyAdapter() { + mSwipeRefreshLayout.setRefreshing(false); + } + + @Override + public void onNonEmptyAdapter() { + mSwipeRefreshLayout.setRefreshing(false); + } + + @Override + public void onError(Exception e, String message) { + mSwipeRefreshLayout.setRefreshing(false); + } + }); + mUsersView.setAdapter(mUsersAdapter); mSlidingUpPanelLayout.setFadeOnClickListener(new View.OnClickListener() { @@ -100,6 +123,8 @@ public class FriendsFragment extends Fragment { } }); + mSwipeRefreshLayout.setOnRefreshListener(() -> mUsersAdapter.loadUsers()); + return rootView; } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java index c1a69639c0..2f1f1c8a82 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java @@ -2,7 +2,6 @@ package io.highfidelity.hifiinterface.view; import android.content.Context; import android.graphics.Bitmap; -import android.graphics.PorterDuff; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.support.v4.content.ContextCompat; @@ -23,7 +22,6 @@ import java.util.ArrayList; import java.util.List; import io.highfidelity.hifiinterface.R; -import io.highfidelity.hifiinterface.provider.EndpointUsersProvider; import io.highfidelity.hifiinterface.provider.UsersProvider; /** @@ -37,6 +35,7 @@ public class UserListAdapter extends RecyclerView.Adapter mUsers = new ArrayList<>(); private ItemClickListener mClickListener; + private AdapterListener mAdapterListener; public UserListAdapter(Context c, UsersProvider usersProvider) { mContext = c; @@ -45,17 +44,29 @@ public class UserListAdapter extends RecyclerView.Adapter users) { mUsers = new ArrayList<>(users); notifyDataSetChanged(); + if (mAdapterListener != null) { + if (mUsers.isEmpty()) { + mAdapterListener.onEmptyAdapter(); + } else { + mAdapterListener.onNonEmptyAdapter(); + } + } } @Override public void retrieveError(Exception e, String message) { Log.e("[USERS]", message, e); + if (mAdapterListener != null) mAdapterListener.onError(e, message); } }); } @@ -219,4 +230,10 @@ public class UserListAdapter extends RecyclerView.Adapter - + android:layout_height="match_parent"> + + Date: Thu, 16 Aug 2018 13:35:36 +1200 Subject: [PATCH 42/68] Fix variable names --- scripts/system/controllers/controllerModules/teleport.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index e7040208fb..07f7371aef 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -117,8 +117,8 @@ Script.include("/~/system/libraries/controllers.js"); var _this = this; this.hand = hand; - this.buttonStateXX = 0; // Left hand / right hand x-axis. - this.buttonStateXY = 0; // Left hand / right hand y-axis. + this.buttonStateX = 0; // Left hand / right hand x-axis. + this.buttonStateX = 0; // Left hand / right hand y-axis. this.BUTTON_TRANSITION_DELAY = 50; // Allow time for transition from direction buttons to touch-pad. this.buttonValue = 0; From a01b00b3d850b16fe23091b4651b03b4ae7230be Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Thu, 16 Aug 2018 12:36:25 -0300 Subject: [PATCH 43/68] delete access token log --- .../hifiinterface/provider/EndpointUsersProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java index af5a441737..7c32a8e8fb 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java @@ -53,7 +53,7 @@ public class EndpointUsersProvider implements UsersProvider { return chain.proceed(request); } }); - Log.d("[USERZ]", "Authorization: Bearer " + accessToken);// CLD DELETE THIS LINE! + OkHttpClient client = httpClient.build(); mRetrofit = new Retrofit.Builder() From aa4a6b2eaedb8f578d7bcd2a2dcd7a4e112028f0 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 13 Aug 2018 17:26:20 -0700 Subject: [PATCH 44/68] Convert entityIntersections/avatarIntersections lists in CollisionPickResult to shared pointers --- interface/src/raypick/CollisionPick.cpp | 27 +++++++++++++------------ interface/src/raypick/CollisionPick.h | 26 ++++++++++++++---------- libraries/physics/src/PhysicsEngine.cpp | 9 ++++----- libraries/physics/src/PhysicsEngine.h | 2 +- 4 files changed, 34 insertions(+), 30 deletions(-) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index a70882eed0..f05fb208f1 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -15,8 +15,8 @@ #include "ScriptEngineLogging.h" #include "UUIDHasher.h" -void buildObjectIntersectionsMap(IntersectionType intersectionType, const std::vector& objectIntersections, std::unordered_map& intersections, std::unordered_map& collisionPointPairs) { - for (auto& objectIntersection : objectIntersections) { +void buildObjectIntersectionsMap(IntersectionType intersectionType, const std::shared_ptr> objectIntersections, std::unordered_map& intersections, std::unordered_map& collisionPointPairs) { + for (auto& objectIntersection : *objectIntersections) { auto at = intersections.find(objectIntersection.foundID); if (at == intersections.end()) { QVariantMap intersectingObject; @@ -308,16 +308,17 @@ CollisionRegion CollisionPick::getMathematicalPick() const { return _mathPick; } -void CollisionPick::filterIntersections(std::vector& intersections) const { +void CollisionPick::filterIntersections(std::shared_ptr> intersections) const { const QVector& ignoreItems = getIgnoreItems(); const QVector& includeItems = getIncludeItems(); bool isWhitelist = includeItems.size(); - for (int i = 0; i < intersections.size(); i++) { - auto& intersection = intersections[i]; + int n = (int)intersections->size(); + for (int i = 0; i < n; i++) { + auto& intersection = (*intersections)[i]; const QUuid& id = intersection.foundID; if (ignoreItems.contains(id) || (isWhitelist && !includeItems.contains(id))) { - intersections[i] = intersections[intersections.size()-1]; - intersections.pop_back(); + intersection = (*intersections)[--n]; + intersections->pop_back(); } } } @@ -325,29 +326,29 @@ void CollisionPick::filterIntersections(std::vector& intersec PickResultPointer CollisionPick::getEntityIntersection(const CollisionRegion& pick) { if (!isShapeInfoReady()) { // Cannot compute result - return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::vector(), std::vector()); + return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::make_shared>(), std::make_shared>()); } auto& entityIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_ENTITY, *pick.shapeInfo, pick.transform); filterIntersections(entityIntersections); - return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, entityIntersections, std::vector()); + return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, entityIntersections, std::make_shared>()); } PickResultPointer CollisionPick::getOverlayIntersection(const CollisionRegion& pick) { - return std::make_shared(pick.toVariantMap(), isShapeInfoReady() ? CollisionPickResult::LOAD_STATE_LOADED : CollisionPickResult::LOAD_STATE_NOT_LOADED, std::vector(), std::vector()); + return std::make_shared(pick.toVariantMap(), isShapeInfoReady() ? CollisionPickResult::LOAD_STATE_LOADED : CollisionPickResult::LOAD_STATE_NOT_LOADED, std::make_shared>(), std::make_shared>()); } PickResultPointer CollisionPick::getAvatarIntersection(const CollisionRegion& pick) { if (!isShapeInfoReady()) { // Cannot compute result - return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::vector(), std::vector()); + return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::make_shared>(), std::make_shared>()); } auto& avatarIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_AVATAR, *pick.shapeInfo, pick.transform); filterIntersections(avatarIntersections); - return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, std::vector(), avatarIntersections); + return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, std::make_shared>(), avatarIntersections); } PickResultPointer CollisionPick::getHUDIntersection(const CollisionRegion& pick) { - return std::make_shared(pick.toVariantMap(), isShapeInfoReady() ? CollisionPickResult::LOAD_STATE_LOADED : CollisionPickResult::LOAD_STATE_NOT_LOADED, std::vector(), std::vector()); + return std::make_shared(pick.toVariantMap(), isShapeInfoReady() ? CollisionPickResult::LOAD_STATE_LOADED : CollisionPickResult::LOAD_STATE_NOT_LOADED, std::make_shared>(), std::make_shared>()); } \ No newline at end of file diff --git a/interface/src/raypick/CollisionPick.h b/interface/src/raypick/CollisionPick.h index bfc3487a62..2f383f3a58 100644 --- a/interface/src/raypick/CollisionPick.h +++ b/interface/src/raypick/CollisionPick.h @@ -24,10 +24,14 @@ public: CollisionPickResult() {} CollisionPickResult(const QVariantMap& pickVariant) : PickResult(pickVariant) {} - CollisionPickResult(const CollisionRegion& searchRegion, LoadState loadState, const std::vector& entityIntersections, const std::vector& avatarIntersections) : + CollisionPickResult(const CollisionRegion& searchRegion, + LoadState loadState, + std::shared_ptr> entityIntersections = std::make_shared>(), + std::shared_ptr> avatarIntersections = std::make_shared>() + ) : PickResult(searchRegion.toVariantMap()), loadState(loadState), - intersects(entityIntersections.size() || avatarIntersections.size()), + intersects(entityIntersections->size() || avatarIntersections->size()), entityIntersections(entityIntersections), avatarIntersections(avatarIntersections) { } @@ -41,8 +45,8 @@ public: LoadState loadState { LOAD_STATE_UNKNOWN }; bool intersects { false }; - std::vector entityIntersections; - std::vector avatarIntersections; + std::shared_ptr> entityIntersections { std::make_shared>() }; + std::shared_ptr> avatarIntersections { std::make_shared>() }; QVariantMap toVariantMap() const override; @@ -52,14 +56,14 @@ public: PickResultPointer compareAndProcessNewResult(const PickResultPointer& newRes) override { const std::shared_ptr newCollisionResult = std::static_pointer_cast(newRes); - for (ContactTestResult& entityIntersection : newCollisionResult->entityIntersections) { - entityIntersections.push_back(entityIntersection); + for (ContactTestResult& entityIntersection : *(newCollisionResult->entityIntersections)) { + entityIntersections->push_back(entityIntersection); } - for (ContactTestResult& avatarIntersection : newCollisionResult->avatarIntersections) { - avatarIntersections.push_back(avatarIntersection); + for (ContactTestResult& avatarIntersection : *(newCollisionResult->avatarIntersections)) { + avatarIntersections->push_back(avatarIntersection); } - intersects = entityIntersections.size() || avatarIntersections.size(); + intersects = entityIntersections->size() || avatarIntersections->size(); if (newCollisionResult->loadState == LOAD_STATE_NOT_LOADED || loadState == LOAD_STATE_UNKNOWN) { loadState = (LoadState)newCollisionResult->loadState; } @@ -81,7 +85,7 @@ public: CollisionRegion getMathematicalPick() const override; PickResultPointer getDefaultResult(const QVariantMap& pickVariant) const override { - return std::make_shared(pickVariant, CollisionPickResult::LOAD_STATE_UNKNOWN, std::vector(), std::vector()); + return std::make_shared(pickVariant, CollisionPickResult::LOAD_STATE_UNKNOWN, std::make_shared>(), std::make_shared>()); } PickResultPointer getEntityIntersection(const CollisionRegion& pick) override; PickResultPointer getOverlayIntersection(const CollisionRegion& pick) override; @@ -92,7 +96,7 @@ protected: // Returns true if pick.shapeInfo is valid. Otherwise, attempts to get the shapeInfo ready for use. bool isShapeInfoReady(); void computeShapeInfo(CollisionRegion& pick, ShapeInfo& shapeInfo, QSharedPointer resource); - void filterIntersections(std::vector& intersections) const; + void filterIntersections(std::shared_ptr> intersections) const; CollisionRegion _mathPick; PhysicsEnginePointer _physicsEngine; diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index cfe255e561..83ad0dc24a 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -871,7 +871,6 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { btCollisionWorld::ContactResultCallback(), desiredObjectType(desiredObjectType), collisionObject(), - contacts(), myAvatarCollisionObject(myAvatarCollisionObject) { const btCollisionShape* collisionShape = ObjectMotionState::getShapeManager()->getShape(shapeInfo); @@ -898,7 +897,7 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { MotionStateType desiredObjectType; btCollisionObject collisionObject; - std::vector contacts; + std::shared_ptr> contacts = std::make_shared>(); btCollisionObject* myAvatarCollisionObject; btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0, int partId0, int index0, const btCollisionObjectWrapper* colObj1, int partId1, int index1) override { @@ -917,7 +916,7 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { // TODO: Give MyAvatar a motion state so we don't have to do this if (desiredObjectType == MOTIONSTATE_TYPE_AVATAR && myAvatarCollisionObject && myAvatarCollisionObject == otherBody) { - contacts.emplace_back(Physics::getSessionUUID(), bulletToGLM(penetrationPoint), bulletToGLM(otherPenetrationPoint)); + contacts->emplace_back(Physics::getSessionUUID(), bulletToGLM(penetrationPoint), bulletToGLM(otherPenetrationPoint)); return 0; } @@ -933,7 +932,7 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { } // This is the correct object type. Add it to the list. - contacts.emplace_back(candidate->getObjectID(), bulletToGLM(penetrationPoint), bulletToGLM(otherPenetrationPoint)); + contacts->emplace_back(candidate->getObjectID(), bulletToGLM(penetrationPoint), bulletToGLM(otherPenetrationPoint)); return 0; } @@ -944,7 +943,7 @@ protected: } }; -std::vector PhysicsEngine::getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const { +std::shared_ptr> PhysicsEngine::getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const { // TODO: Give MyAvatar a motion state so we don't have to do this btCollisionObject* myAvatarCollisionObject = nullptr; if (desiredObjectType == MOTIONSTATE_TYPE_AVATAR && _myAvatarController) { diff --git a/libraries/physics/src/PhysicsEngine.h b/libraries/physics/src/PhysicsEngine.h index 854d61844f..64109199ed 100644 --- a/libraries/physics/src/PhysicsEngine.h +++ b/libraries/physics/src/PhysicsEngine.h @@ -126,7 +126,7 @@ public: void setShowBulletConstraintLimits(bool value); // Function for getting colliding ObjectMotionStates in the world of specified type - std::vector getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const; + std::shared_ptr> getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const; private: QList removeDynamicsForBody(btRigidBody* body); From 67ff05739a2c7d4593081d954391f40e76a60d59 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Wed, 15 Aug 2018 11:05:52 -0700 Subject: [PATCH 45/68] Take advantage of CollisionPickResult intersections being shared pointers to avoid copying on result comparison --- interface/src/raypick/CollisionPick.cpp | 27 +++++++++++++++++++++++++ interface/src/raypick/CollisionPick.h | 18 +---------------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index f05fb208f1..d763fc5c27 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -15,6 +15,33 @@ #include "ScriptEngineLogging.h" #include "UUIDHasher.h" +PickResultPointer CollisionPickResult::compareAndProcessNewResult(const PickResultPointer& newRes) { + const std::shared_ptr newCollisionResult = std::static_pointer_cast(newRes); + + if (entityIntersections->size()) { + for (ContactTestResult& entityIntersection : *(newCollisionResult->entityIntersections)) { + entityIntersections->push_back(entityIntersection); + } + } else { + entityIntersections = newCollisionResult->entityIntersections; + } + + if (avatarIntersections->size()) { + for (ContactTestResult& avatarIntersection : *(newCollisionResult->avatarIntersections)) { + avatarIntersections->push_back(avatarIntersection); + } + } else { + avatarIntersections = newCollisionResult->avatarIntersections; + } + + intersects = entityIntersections->size() || avatarIntersections->size(); + if (newCollisionResult->loadState == LOAD_STATE_NOT_LOADED || loadState == LOAD_STATE_UNKNOWN) { + loadState = (LoadState)newCollisionResult->loadState; + } + + return std::make_shared(*this); +} + void buildObjectIntersectionsMap(IntersectionType intersectionType, const std::shared_ptr> objectIntersections, std::unordered_map& intersections, std::unordered_map& collisionPointPairs) { for (auto& objectIntersection : *objectIntersections) { auto at = intersections.find(objectIntersection.foundID); diff --git a/interface/src/raypick/CollisionPick.h b/interface/src/raypick/CollisionPick.h index 2f383f3a58..40f2450776 100644 --- a/interface/src/raypick/CollisionPick.h +++ b/interface/src/raypick/CollisionPick.h @@ -53,23 +53,7 @@ public: bool doesIntersect() const override { return intersects; } bool checkOrFilterAgainstMaxDistance(float maxDistance) override { return true; } - PickResultPointer compareAndProcessNewResult(const PickResultPointer& newRes) override { - const std::shared_ptr newCollisionResult = std::static_pointer_cast(newRes); - - for (ContactTestResult& entityIntersection : *(newCollisionResult->entityIntersections)) { - entityIntersections->push_back(entityIntersection); - } - for (ContactTestResult& avatarIntersection : *(newCollisionResult->avatarIntersections)) { - avatarIntersections->push_back(avatarIntersection); - } - - intersects = entityIntersections->size() || avatarIntersections->size(); - if (newCollisionResult->loadState == LOAD_STATE_NOT_LOADED || loadState == LOAD_STATE_UNKNOWN) { - loadState = (LoadState)newCollisionResult->loadState; - } - - return std::make_shared(*this); - } + PickResultPointer compareAndProcessNewResult(const PickResultPointer& newRes) override; }; class CollisionPick : public Pick { From 130cb70a52d55c9d04c97da5780d56f213f0b333 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Thu, 16 Aug 2018 10:39:13 -0700 Subject: [PATCH 46/68] Do not create a reference to a shared pointer in CollisionPick.cpp --- interface/src/raypick/CollisionPick.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index d763fc5c27..d065d6fabe 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -356,7 +356,7 @@ PickResultPointer CollisionPick::getEntityIntersection(const CollisionRegion& pi return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::make_shared>(), std::make_shared>()); } - auto& entityIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_ENTITY, *pick.shapeInfo, pick.transform); + auto entityIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_ENTITY, *pick.shapeInfo, pick.transform); filterIntersections(entityIntersections); return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, entityIntersections, std::make_shared>()); } @@ -371,7 +371,7 @@ PickResultPointer CollisionPick::getAvatarIntersection(const CollisionRegion& pi return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::make_shared>(), std::make_shared>()); } - auto& avatarIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_AVATAR, *pick.shapeInfo, pick.transform); + auto avatarIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_AVATAR, *pick.shapeInfo, pick.transform); filterIntersections(avatarIntersections); return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, std::make_shared>(), avatarIntersections); } From 99760e2b401454cc2da9e37a2a6abe77a36caa85 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Thu, 16 Aug 2018 17:29:25 -0300 Subject: [PATCH 47/68] Android - People - Better navigation after logged in prevents log in screen to appear after pressing back --- .../hifiinterface/MainActivity.java | 74 +++++++++++++++---- android/app/src/main/res/values/strings.xml | 3 + 2 files changed, 64 insertions(+), 13 deletions(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java index 1d34470146..28af228541 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -7,6 +7,7 @@ import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; +import android.os.Handler; import android.support.annotation.NonNull; import android.support.design.widget.NavigationView; import android.support.v4.content.ContextCompat; @@ -114,7 +115,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On loadLoginFragment(); break; case "Home": - loadHomeFragment(); + loadHomeFragment(true); break; case "Privacy Policy": loadPrivacyPolicyFragment(); @@ -128,33 +129,57 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On } - private void loadHomeFragment() { + private void loadHomeFragment(boolean addToBackStack) { Fragment fragment = HomeFragment.newInstance(); - loadFragment(fragment, getString(R.string.home), true); + loadFragment(fragment, getString(R.string.home), getString(R.string.tagFragmentHome), addToBackStack); } private void loadLoginFragment() { Fragment fragment = LoginFragment.newInstance(); - loadFragment(fragment, getString(R.string.login), true); + loadFragment(fragment, getString(R.string.login), getString(R.string.tagFragmentLogin), true); } private void loadPrivacyPolicyFragment() { Fragment fragment = PolicyFragment.newInstance(); - loadFragment(fragment, getString(R.string.privacyPolicy), true); + loadFragment(fragment, getString(R.string.privacyPolicy), getString(R.string.tagFragmentPolicy), true); } private void loadPeopleFragment() { Fragment fragment = FriendsFragment.newInstance(); - loadFragment(fragment, getString(R.string.people), true); + loadFragment(fragment, getString(R.string.people), getString(R.string.tagFragmentPeople), true); } - private void loadFragment(Fragment fragment, String title, boolean addToBackStack) { + private void loadFragment(Fragment fragment, String title, String tag, boolean addToBackStack) { FragmentManager fragmentManager = getFragmentManager(); + + + // check if it's the same fragment + String currentFragmentName = fragmentManager.getBackStackEntryCount() > 0 + ? fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName() + : ""; + + Log.d("[BACK]", "Before it's " + currentFragmentName + ", now adding " + title + " (before) backstackCount " + fragmentManager.getBackStackEntryCount()); + + // check if it's the same fragment than the one being shown + if (currentFragmentName.equals(title)) { + mDrawerLayout.closeDrawer(mNavigationView); + return;// cancel as we are already in that fragment + } + + // go back until first transaction + int backStackEntryCount = fragmentManager.getBackStackEntryCount(); + for (int i = 0; i < backStackEntryCount - 1; i++) { + fragmentManager.popBackStackImmediate(); + } + + // this case is when we wanted to go home.. rollback already did that! + // But asking for a new Home fragment makes it easier to have an updated list so we let it to continue + FragmentTransaction ft = fragmentManager.beginTransaction(); - ft.replace(R.id.content_frame, fragment, getString(R.string.tagFragmentPeople)); + ft.replace(R.id.content_frame, fragment, tag); if (addToBackStack) { ft.addToBackStack(title); @@ -162,6 +187,14 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ft.commit(); setTitle(title); mDrawerLayout.closeDrawer(mNavigationView); + final Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + //Do something after 100ms + Log.d("[BACK]", "added " + title + " backstackCount " + fragmentManager.getBackStackEntryCount()); + } + }, 100); } @@ -217,7 +250,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch(item.getItemId()) { case R.id.action_home: - loadHomeFragment(); + loadHomeFragment(false); return true; case R.id.action_people: loadPeopleFragment(); @@ -239,6 +272,19 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On public void onLogoutClicked(View view) { nativeLogout(); updateLoginMenu(); + exitLoggedInFragment(); + + } + + private void exitLoggedInFragment() { + // If we are in a "logged in" fragment (like People), go back to home. This could be expanded to multiple fragments + FragmentManager fragmentManager = getFragmentManager(); + String currentFragmentName = fragmentManager.getBackStackEntryCount() > 0 + ? fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName() + : ""; + if (currentFragmentName.equals(getString(R.string.people))) { + loadHomeFragment(false); + } } public void onSelectedDomain(String domainUrl) { @@ -267,7 +313,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On @Override public void onLoginCompleted() { - loadHomeFragment(); + loadHomeFragment(false); updateLoginMenu(); if (backToScene) { backToScene = false; @@ -319,6 +365,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On public void onBackPressed() { // if a fragment needs to internally manage back presses.. FragmentManager fm = getFragmentManager(); + Log.d("[BACK]", "getBackStackEntryCount " + fm.getBackStackEntryCount()); Fragment friendsFragment = fm.findFragmentByTag(getString(R.string.tagFragmentPeople)); if (friendsFragment != null && friendsFragment instanceof FriendsFragment) { if (((FriendsFragment) friendsFragment).onBackPressed()) { @@ -326,19 +373,20 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On } } - int index = getFragmentManager().getBackStackEntryCount() - 1; + int index = fm.getBackStackEntryCount() - 1; + if (index > 0) { super.onBackPressed(); index--; if (index > -1) { - setTitle(getFragmentManager().getBackStackEntryAt(index).getName()); + setTitle(fm.getBackStackEntryAt(index).getName()); } if (backToScene) { backToScene = false; goToLastLocation(); } } else { - finishAffinity(); + finishAffinity(); } } diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index ea4e59a35a..dae4fe26f9 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -26,5 +26,8 @@ Online + tagFragmentHome + tagFragmentLogin + tagFragmentPolicy tagFragmentPeople From a3927f4d4c0a83151d1bc37b623440cca71ef6b2 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Thu, 16 Aug 2018 17:31:31 -0300 Subject: [PATCH 48/68] Android - People - Remove fragments and stack related logs --- .../highfidelity/hifiinterface/MainActivity.java | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java index 28af228541..db6f0fca24 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -7,7 +7,6 @@ import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; -import android.os.Handler; import android.support.annotation.NonNull; import android.support.design.widget.NavigationView; import android.support.v4.content.ContextCompat; @@ -155,18 +154,13 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On private void loadFragment(Fragment fragment, String title, String tag, boolean addToBackStack) { FragmentManager fragmentManager = getFragmentManager(); - // check if it's the same fragment String currentFragmentName = fragmentManager.getBackStackEntryCount() > 0 ? fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName() : ""; - - Log.d("[BACK]", "Before it's " + currentFragmentName + ", now adding " + title + " (before) backstackCount " + fragmentManager.getBackStackEntryCount()); - - // check if it's the same fragment than the one being shown if (currentFragmentName.equals(title)) { mDrawerLayout.closeDrawer(mNavigationView); - return;// cancel as we are already in that fragment + return; // cancel as we are already in that fragment } // go back until first transaction @@ -187,14 +181,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ft.commit(); setTitle(title); mDrawerLayout.closeDrawer(mNavigationView); - final Handler handler = new Handler(); - handler.postDelayed(new Runnable() { - @Override - public void run() { - //Do something after 100ms - Log.d("[BACK]", "added " + title + " backstackCount " + fragmentManager.getBackStackEntryCount()); - } - }, 100); } From bf733ded0f2b3f827e8eeb0332fe423f71d56aed Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 17 Aug 2018 09:08:28 +1200 Subject: [PATCH 49/68] Handle Vive controller not being available at start-up --- .../controllers/controllerModules/teleport.js | 57 ++++++++++++------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 07f7371aef..8d0fe2cfbf 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -117,10 +117,6 @@ Script.include("/~/system/libraries/controllers.js"); var _this = this; this.hand = hand; - this.buttonStateX = 0; // Left hand / right hand x-axis. - this.buttonStateX = 0; // Left hand / right hand y-axis. - this.BUTTON_TRANSITION_DELAY = 50; // Allow time for transition from direction buttons to touch-pad. - this.buttonValue = 0; this.disabled = false; // used by the 'Hifi-Teleport-Disabler' message handler this.active = false; @@ -195,8 +191,11 @@ Script.include("/~/system/libraries/controllers.js"); Pointers.removePointer(this.teleportParabolaHeadInvisible); }; + this.axisButtonStateX = 0; // Left/right axis button pressed. + this.axisButtonStateY = 0; // Up/down axis button pressed. + this.BUTTON_TRANSITION_DELAY = 100; // Allow time for transition from direction buttons to touch-pad. - this.buttonStateXX = function (value) { + this.axisButtonChangeX = function (value) { if (value !== 0) { // Don't lock right hand's x-axis buttons if snap turn. if (_this.hand === LEFT_HAND || !Controller.getValue(Controller.Hardware.Application.SnapTurn)) { @@ -205,18 +204,18 @@ Script.include("/~/system/libraries/controllers.js"); } else { // Delay direction button release until after teleport possibly pressed. Script.setTimeout(function () { - _this.buttonStateX = value; + _this.axisButtonStateX = value; }, _this.BUTTON_TRANSITION_DELAY); } }; - this.buttonStateXY = function (value) { + this.axisButtonChangeY = function (value) { if (value !== 0) { - _this.buttonStateY = value; + _this.axisButtonStateY = value; } else { // Delay direction button release until after teleport possibly pressed. Script.setTimeout(function () { - _this.buttonStateY = value; + _this.axisButtonStateY = value; }, _this.BUTTON_TRANSITION_DELAY); } }; @@ -224,7 +223,7 @@ Script.include("/~/system/libraries/controllers.js"); this.teleportLocked = function () { // Lock teleport if in advanced movement mode and have just transitioned from pressing a direction button. return Controller.getValue(Controller.Hardware.Application.AdvancedMovement) - && (_this.buttonStateX !== 0 || _this.buttonStateY !== 0); + && (_this.axisButtonStateX !== 0 || _this.axisButtonStateY !== 0); }; this.buttonPress = function (value) { @@ -386,6 +385,7 @@ Script.include("/~/system/libraries/controllers.js"); } var mappingName, teleportMapping; + var isViveMapped = false; function parseJSON(json) { try { @@ -429,21 +429,35 @@ Script.include("/~/system/libraries/controllers.js"); } } + function registerViveTeleportMapping() { + // Disable Vive teleport if touch is transitioning across touch-pad after pressing a direction button. + if (Controller.Hardware.Vive) { + var mappingName = 'Hifi-Teleporter-Dev-Vive-' + Math.random(); + var viveTeleportMapping = Controller.newMapping(mappingName); + viveTeleportMapping.from(Controller.Hardware.Vive.LSX).peek().to(leftTeleporter.axisButtonChangeX); + viveTeleportMapping.from(Controller.Hardware.Vive.LSY).peek().to(leftTeleporter.axisButtonChangeY); + viveTeleportMapping.from(Controller.Hardware.Vive.RSX).peek().to(rightTeleporter.axisButtonChangeX); + viveTeleportMapping.from(Controller.Hardware.Vive.RSY).peek().to(rightTeleporter.axisButtonChangeY); + Controller.enableMapping(mappingName); + isViveMapped = true; + } + } + + function onHardwareChanged() { + // Controller.Hardware.Vive is not immediately available at Interface start-up. + if (!isViveMapped && Controller.Hardware.Vive) { + registerViveTeleportMapping(); + } + } + + Controller.hardwareChanged.connect(onHardwareChanged); + function registerMappings() { mappingName = 'Hifi-Teleporter-Dev-' + Math.random(); teleportMapping = Controller.newMapping(mappingName); - // Disable Vive teleport if touch is transitioning across touch-pad after using a direction button. - if (Controller.Hardware.Vive) { - teleportMapping.from(Controller.Hardware.Vive.LX).peek().when(Controller.Hardware.Vive.LSX) - .to(leftTeleporter.buttonStateXX); - teleportMapping.from(Controller.Hardware.Vive.LY).peek().when(Controller.Hardware.Vive.LSY).invert() - .to(leftTeleporter.buttonStateXY); - teleportMapping.from(Controller.Hardware.Vive.RX).peek().when(Controller.Hardware.Vive.RSX) - .to(rightTeleporter.buttonStateXX); - teleportMapping.from(Controller.Hardware.Vive.RY).peek().when(Controller.Hardware.Vive.RSY).invert() - .to(rightTeleporter.buttonStateXY); - } + // Vive teleport button lock-out. + registerViveTeleportMapping(); // Teleport actions. teleportMapping.from(Controller.Standard.LeftPrimaryThumb).peek().to(leftTeleporter.buttonPress); @@ -459,6 +473,7 @@ Script.include("/~/system/libraries/controllers.js"); Controller.enableMapping(mappingName); function cleanup() { + Controller.hardwareChanged.disconnect(onHardwareChanged); teleportMapping.disable(); leftTeleporter.cleanup(); rightTeleporter.cleanup(); From 5328b48acc97cea77d806406c3cb38e66e032521 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 17 Aug 2018 09:09:11 +1200 Subject: [PATCH 50/68] Make Vive snap turn buttons lock teleport, also --- scripts/system/controllers/controllerModules/teleport.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 8d0fe2cfbf..05d90dde72 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -197,10 +197,7 @@ Script.include("/~/system/libraries/controllers.js"); this.axisButtonChangeX = function (value) { if (value !== 0) { - // Don't lock right hand's x-axis buttons if snap turn. - if (_this.hand === LEFT_HAND || !Controller.getValue(Controller.Hardware.Application.SnapTurn)) { - _this.buttonStateX = value; - } + _this.buttonStateX = value; } else { // Delay direction button release until after teleport possibly pressed. Script.setTimeout(function () { From 90429f07cb59a37d1bec3c2c8e0fda7196baf929 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 16 Aug 2018 14:38:32 -0700 Subject: [PATCH 51/68] don't forget to use enqueue the Transaction --- interface/src/avatar/AvatarManager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index bb517f4d60..09fa6dc573 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -277,6 +277,9 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { sortedAvatars.pop(); } + if (_shouldRender) { + qApp->getMain3DScene()->enqueueTransaction(transaction); + } _numAvatarsUpdated = numAvatarsUpdated; _numAvatarsNotUpdated = numAVatarsNotUpdated; From 4851b44de1720ff2dcb1ea76b7a6f9c07ee18500 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Thu, 16 Aug 2018 19:39:44 -0300 Subject: [PATCH 52/68] Android - People - Hide actions panel after remove --- .../highfidelity/hifiinterface/fragment/FriendsFragment.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java index b30b387f4b..a313b3591e 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java @@ -139,7 +139,8 @@ public class FriendsFragment extends Fragment { mUsersProvider.removeConnection(mSelectedUsername, new UsersProvider.UserActionCallback() { @Override public void requestOk() { - // CLD: Show success message + mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + mSelectedUsername = null; mUsersAdapter.loadUsers(); } From ccb5bae4b6c942acb304176a2feabb0ab440bfad Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Fri, 17 Aug 2018 14:24:04 -0300 Subject: [PATCH 53/68] Android - People - Code review --- .../hifiinterface/fragment/FriendsFragment.java | 6 ++++-- .../hifiinterface/view/UserListAdapter.java | 16 ++++++++++++---- android/app/src/main/res/values/strings.xml | 1 - 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java index a313b3591e..2a008d7950 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java @@ -90,7 +90,7 @@ public class FriendsFragment extends Fragment { // .. // 2. adapt options // .. - rootView.findViewById(R.id.userActionVisit).setVisibility(user.online?View.VISIBLE:View.GONE); + rootView.findViewById(R.id.userActionVisit).setVisibility(user.online ? View.VISIBLE : View.GONE); // 3. show mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED); } @@ -129,7 +129,9 @@ public class FriendsFragment extends Fragment { } private void onRemoveConnectionClick() { - if (mSelectedUsername == null) return; + if (mSelectedUsername == null) { + return; + } AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage("Remove '" + mSelectedUsername + "' from People?"); diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java index 2f1f1c8a82..9f62b21250 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java @@ -66,7 +66,9 @@ public class UserListAdapter extends RecyclerView.Adapter Interface Home - Friends People Open in browser Share link From 2933038d04ee0a4a55d46a2ea7110790df4d381b Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Fri, 17 Aug 2018 12:50:50 -0700 Subject: [PATCH 54/68] Rename PhysicsEngine::getCollidingInRegion to contactTest and change it to accept collision flags instead of a MotionState enum --- interface/src/raypick/CollisionPick.cpp | 5 ++-- libraries/physics/src/PhysicsEngine.cpp | 26 ++++++------------- libraries/physics/src/PhysicsEngine.h | 5 ++-- libraries/shared/src/PhysicsCollisionGroups.h | 1 + 4 files changed, 15 insertions(+), 22 deletions(-) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index d065d6fabe..59fe6504ca 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -12,6 +12,7 @@ #include +#include "PhysicsCollisionGroups.h" #include "ScriptEngineLogging.h" #include "UUIDHasher.h" @@ -356,7 +357,7 @@ PickResultPointer CollisionPick::getEntityIntersection(const CollisionRegion& pi return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::make_shared>(), std::make_shared>()); } - auto entityIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_ENTITY, *pick.shapeInfo, pick.transform); + auto entityIntersections = _physicsEngine->contactTest(USER_COLLISION_MASK_ENTITIES, *pick.shapeInfo, pick.transform); filterIntersections(entityIntersections); return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, entityIntersections, std::make_shared>()); } @@ -371,7 +372,7 @@ PickResultPointer CollisionPick::getAvatarIntersection(const CollisionRegion& pi return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::make_shared>(), std::make_shared>()); } - auto avatarIntersections = _physicsEngine->getCollidingInRegion(MOTIONSTATE_TYPE_AVATAR, *pick.shapeInfo, pick.transform); + auto avatarIntersections = _physicsEngine->contactTest(USER_COLLISION_MASK_AVATARS, *pick.shapeInfo, pick.transform); filterIntersections(avatarIntersections); return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, std::make_shared>(), avatarIntersections); } diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index 83ad0dc24a..37afadc21b 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -863,13 +863,9 @@ void PhysicsEngine::setShowBulletConstraintLimits(bool value) { } } -const int32_t CONTACT_CALLBACK_FLAG_ENTITY = BULLET_COLLISION_GROUP_STATIC | BULLET_COLLISION_GROUP_KINEMATIC | BULLET_COLLISION_GROUP_DYNAMIC; -const int32_t CONTACT_CALLBACK_FLAG_AVATAR = USER_COLLISION_GROUP_MY_AVATAR | USER_COLLISION_GROUP_OTHER_AVATAR; - struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { - AllContactsCallback(MotionStateType desiredObjectType, const ShapeInfo& shapeInfo, const Transform& transform, btCollisionObject* myAvatarCollisionObject) : + AllContactsCallback(int32_t mask, int32_t group, const ShapeInfo& shapeInfo, const Transform& transform, btCollisionObject* myAvatarCollisionObject) : btCollisionWorld::ContactResultCallback(), - desiredObjectType(desiredObjectType), collisionObject(), myAvatarCollisionObject(myAvatarCollisionObject) { const btCollisionShape* collisionShape = ObjectMotionState::getShapeManager()->getShape(shapeInfo); @@ -882,20 +878,14 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { collisionObject.setWorldTransform(bulletTransform); - m_collisionFilterGroup = ~0; // Everything collidable should collide with our test object unless we set the filter mask otherwise - if (desiredObjectType == MOTIONSTATE_TYPE_AVATAR) { - m_collisionFilterMask = CONTACT_CALLBACK_FLAG_AVATAR; - } - else { - m_collisionFilterMask = CONTACT_CALLBACK_FLAG_ENTITY; - } + m_collisionFilterMask = mask; + m_collisionFilterGroup = group; } ~AllContactsCallback() { ObjectMotionState::getShapeManager()->releaseShape(collisionObject.getCollisionShape()); } - MotionStateType desiredObjectType; btCollisionObject collisionObject; std::shared_ptr> contacts = std::make_shared>(); btCollisionObject* myAvatarCollisionObject; @@ -915,7 +905,7 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { } // TODO: Give MyAvatar a motion state so we don't have to do this - if (desiredObjectType == MOTIONSTATE_TYPE_AVATAR && myAvatarCollisionObject && myAvatarCollisionObject == otherBody) { + if ((m_collisionFilterMask & BULLET_COLLISION_GROUP_MY_AVATAR) && myAvatarCollisionObject && myAvatarCollisionObject == otherBody) { contacts->emplace_back(Physics::getSessionUUID(), bulletToGLM(penetrationPoint), bulletToGLM(otherPenetrationPoint)); return 0; } @@ -927,7 +917,7 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { const btMotionState* motionStateCandidate = collisionCandidate->getMotionState(); const ObjectMotionState* candidate = dynamic_cast(motionStateCandidate); - if (!candidate || candidate->getType() != desiredObjectType) { + if (!candidate) { return 0; } @@ -943,14 +933,14 @@ protected: } }; -std::shared_ptr> PhysicsEngine::getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const { +std::shared_ptr> PhysicsEngine::contactTest(uint16_t mask, const ShapeInfo& regionShapeInfo, const Transform& regionTransform, uint16_t group) const { // TODO: Give MyAvatar a motion state so we don't have to do this btCollisionObject* myAvatarCollisionObject = nullptr; - if (desiredObjectType == MOTIONSTATE_TYPE_AVATAR && _myAvatarController) { + if ((mask & USER_COLLISION_GROUP_MY_AVATAR) && _myAvatarController) { myAvatarCollisionObject = _myAvatarController->getCollisionObject(); } - auto contactCallback = AllContactsCallback(desiredObjectType, regionShapeInfo, regionTransform, myAvatarCollisionObject); + auto contactCallback = AllContactsCallback((int32_t)mask, (int32_t)group, regionShapeInfo, regionTransform, myAvatarCollisionObject); _dynamicsWorld->contactTest(&contactCallback.collisionObject, contactCallback); return contactCallback.contacts; diff --git a/libraries/physics/src/PhysicsEngine.h b/libraries/physics/src/PhysicsEngine.h index 64109199ed..7c4d5392d6 100644 --- a/libraries/physics/src/PhysicsEngine.h +++ b/libraries/physics/src/PhysicsEngine.h @@ -125,8 +125,9 @@ public: void setShowBulletConstraints(bool value); void setShowBulletConstraintLimits(bool value); - // Function for getting colliding ObjectMotionStates in the world of specified type - std::shared_ptr> getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const; + // Function for getting colliding objects in the world of specified type + // See PhysicsCollisionGroups.h for mask flags. + std::shared_ptr> contactTest(uint16_t mask, const ShapeInfo& regionShapeInfo, const Transform& regionTransform, uint16_t group = USER_COLLISION_GROUP_DYNAMIC) const; private: QList removeDynamicsForBody(btRigidBody* body); diff --git a/libraries/shared/src/PhysicsCollisionGroups.h b/libraries/shared/src/PhysicsCollisionGroups.h index ef18cb0b0e..cae3918a3f 100644 --- a/libraries/shared/src/PhysicsCollisionGroups.h +++ b/libraries/shared/src/PhysicsCollisionGroups.h @@ -104,6 +104,7 @@ const uint16_t ENTITY_COLLISION_MASK_DEFAULT = USER_COLLISION_GROUP_OTHER_AVATAR; const uint16_t USER_COLLISION_MASK_AVATARS = USER_COLLISION_GROUP_MY_AVATAR | USER_COLLISION_GROUP_OTHER_AVATAR; +const uint16_t USER_COLLISION_MASK_ENTITIES = USER_COLLISION_GROUP_STATIC | USER_COLLISION_GROUP_DYNAMIC | USER_COLLISION_GROUP_KINEMATIC; const int32_t NUM_USER_COLLISION_GROUPS = 5; From e3c39020dcd04da661ad87c833d411ce7f5f4327 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Fri, 17 Aug 2018 12:54:47 -0700 Subject: [PATCH 55/68] Exit early from CollisionPick::filterIntersections on empty blacklist --- interface/src/raypick/CollisionPick.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index 59fe6504ca..52650966d3 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -340,6 +340,11 @@ void CollisionPick::filterIntersections(std::shared_ptr& ignoreItems = getIgnoreItems(); const QVector& includeItems = getIncludeItems(); bool isWhitelist = includeItems.size(); + + if (!isWhitelist && !ignoreItems.size()) { + return; + } + int n = (int)intersections->size(); for (int i = 0; i < n; i++) { auto& intersection = (*intersections)[i]; From 6081d63f5317cc0bab726029dde9b727d4a7bfb1 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Fri, 17 Aug 2018 13:17:35 -0700 Subject: [PATCH 56/68] Use std::vector::insert for merging CollisionPickResults --- interface/src/raypick/CollisionPick.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index 52650966d3..a7ee534528 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -20,17 +20,13 @@ PickResultPointer CollisionPickResult::compareAndProcessNewResult(const PickResu const std::shared_ptr newCollisionResult = std::static_pointer_cast(newRes); if (entityIntersections->size()) { - for (ContactTestResult& entityIntersection : *(newCollisionResult->entityIntersections)) { - entityIntersections->push_back(entityIntersection); - } + entityIntersections->insert(entityIntersections->cend(), newCollisionResult->entityIntersections->begin(), newCollisionResult->entityIntersections->end()); } else { entityIntersections = newCollisionResult->entityIntersections; } if (avatarIntersections->size()) { - for (ContactTestResult& avatarIntersection : *(newCollisionResult->avatarIntersections)) { - avatarIntersections->push_back(avatarIntersection); - } + avatarIntersections->insert(avatarIntersections->cend(), newCollisionResult->avatarIntersections->begin(), newCollisionResult->avatarIntersections->end()); } else { avatarIntersections = newCollisionResult->avatarIntersections; } From 26576fa760bbce30a577e232c7573ba14686115b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 18 Aug 2018 09:34:16 +1200 Subject: [PATCH 57/68] Fix Vive left/right buttons not disabling teleport --- scripts/system/controllers/controllerModules/teleport.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 05d90dde72..db95f6b09b 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -116,7 +116,6 @@ Script.include("/~/system/libraries/controllers.js"); function Teleporter(hand) { var _this = this; this.hand = hand; - this.buttonValue = 0; this.disabled = false; // used by the 'Hifi-Teleport-Disabler' message handler this.active = false; @@ -197,7 +196,7 @@ Script.include("/~/system/libraries/controllers.js"); this.axisButtonChangeX = function (value) { if (value !== 0) { - _this.buttonStateX = value; + _this.axisButtonStateX = value; } else { // Delay direction button release until after teleport possibly pressed. Script.setTimeout(function () { From 51940898d9a7027a1b20e6fcb4bf78ac3d654b73 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Fri, 17 Aug 2018 16:23:31 -0700 Subject: [PATCH 58/68] Do not implicitly convert size of vector to bool in CollisionPick::filterIntersections --- interface/src/raypick/CollisionPick.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index a7ee534528..01264a252d 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -335,9 +335,9 @@ CollisionRegion CollisionPick::getMathematicalPick() const { void CollisionPick::filterIntersections(std::shared_ptr> intersections) const { const QVector& ignoreItems = getIgnoreItems(); const QVector& includeItems = getIncludeItems(); - bool isWhitelist = includeItems.size(); + bool isWhitelist = !includeItems.empty(); - if (!isWhitelist && !ignoreItems.size()) { + if (!isWhitelist && ignoreItems.empty()) { return; } From 2a182a00337ae57edc0109c77db8aca6cd4506fe Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 20 Aug 2018 09:24:07 -0700 Subject: [PATCH 59/68] Revert "Do not create a reference to a shared pointer in CollisionPick.cpp" This reverts commit 130cb70a52d55c9d04c97da5780d56f213f0b333. --- interface/src/raypick/CollisionPick.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index 01264a252d..004017ca15 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -358,7 +358,7 @@ PickResultPointer CollisionPick::getEntityIntersection(const CollisionRegion& pi return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::make_shared>(), std::make_shared>()); } - auto entityIntersections = _physicsEngine->contactTest(USER_COLLISION_MASK_ENTITIES, *pick.shapeInfo, pick.transform); + auto& entityIntersections = _physicsEngine->contactTest(USER_COLLISION_MASK_ENTITIES, *pick.shapeInfo, pick.transform); filterIntersections(entityIntersections); return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, entityIntersections, std::make_shared>()); } @@ -372,8 +372,8 @@ PickResultPointer CollisionPick::getAvatarIntersection(const CollisionRegion& pi // Cannot compute result return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::make_shared>(), std::make_shared>()); } - - auto avatarIntersections = _physicsEngine->contactTest(USER_COLLISION_MASK_AVATARS, *pick.shapeInfo, pick.transform); + + auto &avatarIntersections = _physicsEngine->contactTest(USER_COLLISION_MASK_AVATARS, *pick.shapeInfo, pick.transform); filterIntersections(avatarIntersections); return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, std::make_shared>(), avatarIntersections); } From 74f482b36133640d52725e6149e6af64c48ae28f Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 20 Aug 2018 10:15:28 -0700 Subject: [PATCH 60/68] Revert "Convert entityIntersections/avatarIntersections lists in" This reverts commit aa4a6b2eaedb8f578d7bcd2a2dcd7a4e112028f0. --- interface/src/raypick/CollisionPick.cpp | 36 ++++++++++++------------- interface/src/raypick/CollisionPick.h | 16 +++++------ libraries/physics/src/PhysicsEngine.cpp | 9 ++++--- libraries/physics/src/PhysicsEngine.h | 2 +- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index 004017ca15..b93c5b6dbb 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -19,19 +19,19 @@ PickResultPointer CollisionPickResult::compareAndProcessNewResult(const PickResultPointer& newRes) { const std::shared_ptr newCollisionResult = std::static_pointer_cast(newRes); - if (entityIntersections->size()) { - entityIntersections->insert(entityIntersections->cend(), newCollisionResult->entityIntersections->begin(), newCollisionResult->entityIntersections->end()); + if (entityIntersections.size()) { + entityIntersections.insert(entityIntersections.cend(), newCollisionResult->entityIntersections.begin(), newCollisionResult->entityIntersections.end()); } else { entityIntersections = newCollisionResult->entityIntersections; } - if (avatarIntersections->size()) { - avatarIntersections->insert(avatarIntersections->cend(), newCollisionResult->avatarIntersections->begin(), newCollisionResult->avatarIntersections->end()); + if (avatarIntersections.size()) { + avatarIntersections.insert(avatarIntersections.cend(), newCollisionResult->avatarIntersections.begin(), newCollisionResult->avatarIntersections.end()); } else { avatarIntersections = newCollisionResult->avatarIntersections; } - intersects = entityIntersections->size() || avatarIntersections->size(); + intersects = entityIntersections.size() || avatarIntersections.size(); if (newCollisionResult->loadState == LOAD_STATE_NOT_LOADED || loadState == LOAD_STATE_UNKNOWN) { loadState = (LoadState)newCollisionResult->loadState; } @@ -39,8 +39,8 @@ PickResultPointer CollisionPickResult::compareAndProcessNewResult(const PickResu return std::make_shared(*this); } -void buildObjectIntersectionsMap(IntersectionType intersectionType, const std::shared_ptr> objectIntersections, std::unordered_map& intersections, std::unordered_map& collisionPointPairs) { - for (auto& objectIntersection : *objectIntersections) { +void buildObjectIntersectionsMap(IntersectionType intersectionType, const std::vector& objectIntersections, std::unordered_map& intersections, std::unordered_map& collisionPointPairs) { + for (auto& objectIntersection : objectIntersections) { auto at = intersections.find(objectIntersection.foundID); if (at == intersections.end()) { QVariantMap intersectingObject; @@ -332,7 +332,7 @@ CollisionRegion CollisionPick::getMathematicalPick() const { return _mathPick; } -void CollisionPick::filterIntersections(std::shared_ptr> intersections) const { +void CollisionPick::filterIntersections(std::vector& intersections) const { const QVector& ignoreItems = getIgnoreItems(); const QVector& includeItems = getIncludeItems(); bool isWhitelist = !includeItems.empty(); @@ -341,13 +341,13 @@ void CollisionPick::filterIntersections(std::shared_ptrsize(); + int n = (int)intersections.size(); for (int i = 0; i < n; i++) { - auto& intersection = (*intersections)[i]; + auto& intersection = intersections[i]; const QUuid& id = intersection.foundID; if (ignoreItems.contains(id) || (isWhitelist && !includeItems.contains(id))) { - intersection = (*intersections)[--n]; - intersections->pop_back(); + intersections[i] = intersections[--n]; + intersections.pop_back(); } } } @@ -355,29 +355,29 @@ void CollisionPick::filterIntersections(std::shared_ptr(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::make_shared>(), std::make_shared>()); + return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::vector(), std::vector()); } auto& entityIntersections = _physicsEngine->contactTest(USER_COLLISION_MASK_ENTITIES, *pick.shapeInfo, pick.transform); filterIntersections(entityIntersections); - return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, entityIntersections, std::make_shared>()); + return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, entityIntersections, std::vector()); } PickResultPointer CollisionPick::getOverlayIntersection(const CollisionRegion& pick) { - return std::make_shared(pick.toVariantMap(), isShapeInfoReady() ? CollisionPickResult::LOAD_STATE_LOADED : CollisionPickResult::LOAD_STATE_NOT_LOADED, std::make_shared>(), std::make_shared>()); + return std::make_shared(pick.toVariantMap(), isShapeInfoReady() ? CollisionPickResult::LOAD_STATE_LOADED : CollisionPickResult::LOAD_STATE_NOT_LOADED, std::vector(), std::vector()); } PickResultPointer CollisionPick::getAvatarIntersection(const CollisionRegion& pick) { if (!isShapeInfoReady()) { // Cannot compute result - return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::make_shared>(), std::make_shared>()); + return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::vector(), std::vector()); } auto &avatarIntersections = _physicsEngine->contactTest(USER_COLLISION_MASK_AVATARS, *pick.shapeInfo, pick.transform); filterIntersections(avatarIntersections); - return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, std::make_shared>(), avatarIntersections); + return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, std::vector(), avatarIntersections); } PickResultPointer CollisionPick::getHUDIntersection(const CollisionRegion& pick) { - return std::make_shared(pick.toVariantMap(), isShapeInfoReady() ? CollisionPickResult::LOAD_STATE_LOADED : CollisionPickResult::LOAD_STATE_NOT_LOADED, std::make_shared>(), std::make_shared>()); + return std::make_shared(pick.toVariantMap(), isShapeInfoReady() ? CollisionPickResult::LOAD_STATE_LOADED : CollisionPickResult::LOAD_STATE_NOT_LOADED, std::vector(), std::vector()); } \ No newline at end of file diff --git a/interface/src/raypick/CollisionPick.h b/interface/src/raypick/CollisionPick.h index 40f2450776..6631238737 100644 --- a/interface/src/raypick/CollisionPick.h +++ b/interface/src/raypick/CollisionPick.h @@ -24,14 +24,10 @@ public: CollisionPickResult() {} CollisionPickResult(const QVariantMap& pickVariant) : PickResult(pickVariant) {} - CollisionPickResult(const CollisionRegion& searchRegion, - LoadState loadState, - std::shared_ptr> entityIntersections = std::make_shared>(), - std::shared_ptr> avatarIntersections = std::make_shared>() - ) : + CollisionPickResult(const CollisionRegion& searchRegion, LoadState loadState, const std::vector& entityIntersections, const std::vector& avatarIntersections) : PickResult(searchRegion.toVariantMap()), loadState(loadState), - intersects(entityIntersections->size() || avatarIntersections->size()), + intersects(entityIntersections.size() || avatarIntersections.size()), entityIntersections(entityIntersections), avatarIntersections(avatarIntersections) { } @@ -45,8 +41,8 @@ public: LoadState loadState { LOAD_STATE_UNKNOWN }; bool intersects { false }; - std::shared_ptr> entityIntersections { std::make_shared>() }; - std::shared_ptr> avatarIntersections { std::make_shared>() }; + std::vector entityIntersections; + std::vector avatarIntersections; QVariantMap toVariantMap() const override; @@ -69,7 +65,7 @@ public: CollisionRegion getMathematicalPick() const override; PickResultPointer getDefaultResult(const QVariantMap& pickVariant) const override { - return std::make_shared(pickVariant, CollisionPickResult::LOAD_STATE_UNKNOWN, std::make_shared>(), std::make_shared>()); + return std::make_shared(pickVariant, CollisionPickResult::LOAD_STATE_UNKNOWN, std::vector(), std::vector()); } PickResultPointer getEntityIntersection(const CollisionRegion& pick) override; PickResultPointer getOverlayIntersection(const CollisionRegion& pick) override; @@ -80,7 +76,7 @@ protected: // Returns true if pick.shapeInfo is valid. Otherwise, attempts to get the shapeInfo ready for use. bool isShapeInfoReady(); void computeShapeInfo(CollisionRegion& pick, ShapeInfo& shapeInfo, QSharedPointer resource); - void filterIntersections(std::shared_ptr> intersections) const; + void filterIntersections(std::vector& intersections) const; CollisionRegion _mathPick; PhysicsEnginePointer _physicsEngine; diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index 37afadc21b..5685e8a6f3 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -867,6 +867,7 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { AllContactsCallback(int32_t mask, int32_t group, const ShapeInfo& shapeInfo, const Transform& transform, btCollisionObject* myAvatarCollisionObject) : btCollisionWorld::ContactResultCallback(), collisionObject(), + contacts(), myAvatarCollisionObject(myAvatarCollisionObject) { const btCollisionShape* collisionShape = ObjectMotionState::getShapeManager()->getShape(shapeInfo); @@ -887,7 +888,7 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { } btCollisionObject collisionObject; - std::shared_ptr> contacts = std::make_shared>(); + std::vector contacts; btCollisionObject* myAvatarCollisionObject; btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0, int partId0, int index0, const btCollisionObjectWrapper* colObj1, int partId1, int index1) override { @@ -906,7 +907,7 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { // TODO: Give MyAvatar a motion state so we don't have to do this if ((m_collisionFilterMask & BULLET_COLLISION_GROUP_MY_AVATAR) && myAvatarCollisionObject && myAvatarCollisionObject == otherBody) { - contacts->emplace_back(Physics::getSessionUUID(), bulletToGLM(penetrationPoint), bulletToGLM(otherPenetrationPoint)); + contacts.emplace_back(Physics::getSessionUUID(), bulletToGLM(penetrationPoint), bulletToGLM(otherPenetrationPoint)); return 0; } @@ -922,7 +923,7 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { } // This is the correct object type. Add it to the list. - contacts->emplace_back(candidate->getObjectID(), bulletToGLM(penetrationPoint), bulletToGLM(otherPenetrationPoint)); + contacts.emplace_back(candidate->getObjectID(), bulletToGLM(penetrationPoint), bulletToGLM(otherPenetrationPoint)); return 0; } @@ -933,7 +934,7 @@ protected: } }; -std::shared_ptr> PhysicsEngine::contactTest(uint16_t mask, const ShapeInfo& regionShapeInfo, const Transform& regionTransform, uint16_t group) const { +std::vector PhysicsEngine::contactTest(uint16_t mask, const ShapeInfo& regionShapeInfo, const Transform& regionTransform, uint16_t group) const { // TODO: Give MyAvatar a motion state so we don't have to do this btCollisionObject* myAvatarCollisionObject = nullptr; if ((mask & USER_COLLISION_GROUP_MY_AVATAR) && _myAvatarController) { diff --git a/libraries/physics/src/PhysicsEngine.h b/libraries/physics/src/PhysicsEngine.h index 7c4d5392d6..c6e165632b 100644 --- a/libraries/physics/src/PhysicsEngine.h +++ b/libraries/physics/src/PhysicsEngine.h @@ -127,7 +127,7 @@ public: // Function for getting colliding objects in the world of specified type // See PhysicsCollisionGroups.h for mask flags. - std::shared_ptr> contactTest(uint16_t mask, const ShapeInfo& regionShapeInfo, const Transform& regionTransform, uint16_t group = USER_COLLISION_GROUP_DYNAMIC) const; + std::vector contactTest(uint16_t mask, const ShapeInfo& regionShapeInfo, const Transform& regionTransform, uint16_t group = USER_COLLISION_GROUP_DYNAMIC) const; private: QList removeDynamicsForBody(btRigidBody* body); From 444224a11a558fe4b6a856af70a8be4d122c24e5 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 20 Aug 2018 11:07:52 -0700 Subject: [PATCH 61/68] Fix ignoring elements in CollisionPick::filterIntersections --- interface/src/raypick/CollisionPick.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index b93c5b6dbb..8162b27b60 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -348,6 +348,7 @@ void CollisionPick::filterIntersections(std::vector& intersec if (ignoreItems.contains(id) || (isWhitelist && !includeItems.contains(id))) { intersections[i] = intersections[--n]; intersections.pop_back(); + --i; } } } From 5ffe539360dee992c14825ebd614523e2bde5a1e Mon Sep 17 00:00:00 2001 From: Liv Erickson Date: Mon, 20 Aug 2018 11:11:03 -0700 Subject: [PATCH 62/68] change to tutorial audio file from mono to stereo files --- cmake/externals/serverless-content/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/externals/serverless-content/CMakeLists.txt b/cmake/externals/serverless-content/CMakeLists.txt index 782e50dc27..b4cacd8f90 100644 --- a/cmake/externals/serverless-content/CMakeLists.txt +++ b/cmake/externals/serverless-content/CMakeLists.txt @@ -4,8 +4,8 @@ set(EXTERNAL_NAME serverless-content) ExternalProject_Add( ${EXTERNAL_NAME} - URL http://cdn.highfidelity.com/content-sets/serverless-tutorial-RC70v2.zip - URL_MD5 35fcc8e635e71d0b00a08455a2582448 + URL http://cdn.highfidelity.com/content-sets/serverless-tutorial-RC72.zip + URL_MD5 b1d8faf9266bfbff88274a484911eb99 CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" From 813290aad81e6b6203b840e04a23056d44da64f1 Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 20 Aug 2018 11:23:22 -0700 Subject: [PATCH 63/68] Do filtering with copy vector in CollisionPick::filterIntersections --- interface/src/raypick/CollisionPick.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index 8162b27b60..889a241bcc 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -341,16 +341,18 @@ void CollisionPick::filterIntersections(std::vector& intersec return; } + std::vector filteredIntersections; + int n = (int)intersections.size(); for (int i = 0; i < n; i++) { auto& intersection = intersections[i]; const QUuid& id = intersection.foundID; - if (ignoreItems.contains(id) || (isWhitelist && !includeItems.contains(id))) { - intersections[i] = intersections[--n]; - intersections.pop_back(); - --i; + if (!ignoreItems.contains(id) && (!isWhitelist || includeItems.contains(id))) { + filteredIntersections.push_back(intersection); } } + + intersections = filteredIntersections; } PickResultPointer CollisionPick::getEntityIntersection(const CollisionRegion& pick) { From 3068865a6c8f9624d816e17db6931b22943c8bd7 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Mon, 20 Aug 2018 11:42:28 -0700 Subject: [PATCH 64/68] fix MyAvatar collision bug at transitions b/w meshes --- libraries/physics/src/PhysicsEngine.cpp | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index ef8c28bdc6..3837cee7a8 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -28,24 +28,6 @@ #include "PhysicsLogging.h" -static bool flipNormalsMyAvatarVsBackfacingTriangles( btManifoldPoint& cp, - const btCollisionObjectWrapper* colObj0Wrap, int partId0, int index0, - const btCollisionObjectWrapper* colObj1Wrap, int partId1, int index1) { - if (colObj1Wrap->getCollisionShape()->getShapeType() == TRIANGLE_SHAPE_PROXYTYPE) { - auto triShape = static_cast(colObj1Wrap->getCollisionShape()); - const btVector3* v = triShape->m_vertices1; - btVector3 faceNormal = colObj1Wrap->getWorldTransform().getBasis() * btCross(v[1] - v[0], v[2] - v[0]); - float nDotF = btDot(faceNormal, cp.m_normalWorldOnB); - if (nDotF <= 0.0f) { - faceNormal.normalize(); - // flip the contact normal to be aligned with the face normal - cp.m_normalWorldOnB += -2.0f * nDotF * faceNormal; - } - } - // return value is currently ignored but to be future-proof: return false when not modifying friction - return false; -} - PhysicsEngine::PhysicsEngine(const glm::vec3& offset) : _originOffset(offset), _myAvatarController(nullptr) { @@ -88,9 +70,6 @@ void PhysicsEngine::init() { // in order for its broadphase collision queries to work correctly. Look at how we use // _activeStaticBodies to track and update the Aabb's of moved static objects. _dynamicsWorld->setForceUpdateAllAabbs(false); - - // register contact filter to help MyAvatar pass through backfacing triangles - gContactAddedCallback = flipNormalsMyAvatarVsBackfacingTriangles; } } From a891b74fac568e79a20c7e82fad63131d1fa35be Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Mon, 20 Aug 2018 12:31:21 -0700 Subject: [PATCH 65/68] Reset SafeLanding in all cases Also remove unused data member, elevate load priority only for entities with collisions, handle case of no nearby entities. --- interface/src/Application.cpp | 3 +- interface/src/octree/SafeLanding.cpp | 45 +++++++++++++++++----------- interface/src/octree/SafeLanding.h | 3 +- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index cf5da63dc8..ee50447a5b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5272,6 +5272,7 @@ void Application::resetPhysicsReadyInformation() { _nearbyEntitiesCountAtLastPhysicsCheck = 0; _nearbyEntitiesStabilityCount = 0; _physicsEnabled = false; + _octreeProcessor.startEntitySequence(); } @@ -6324,8 +6325,6 @@ void Application::clearDomainOctreeDetails() { // reset the model renderer getEntities()->clear(); - _octreeProcessor.startEntitySequence(); - auto skyStage = DependencyManager::get()->getSkyStage(); skyStage->setBackgroundMode(graphics::SunSkyStage::SKY_DEFAULT); diff --git a/interface/src/octree/SafeLanding.cpp b/interface/src/octree/SafeLanding.cpp index 16e357c9dd..3568dade08 100644 --- a/interface/src/octree/SafeLanding.cpp +++ b/interface/src/octree/SafeLanding.cpp @@ -31,22 +31,22 @@ bool SafeLanding::SequenceLessThan::operator()(const int& a, const int& b) const } void SafeLanding::startEntitySequence(QSharedPointer entityTreeRenderer) { - if (!_trackingEntities) { - auto entityTree = entityTreeRenderer->getTree(); + auto entityTree = entityTreeRenderer->getTree(); - if (entityTree) { - Locker lock(_lock); - _entityTree = entityTree; - _trackingEntities = true; - connect(std::const_pointer_cast(_entityTree).get(), - &EntityTree::addingEntity, this, &SafeLanding::addTrackedEntity); - connect(std::const_pointer_cast(_entityTree).get(), - &EntityTree::deletingEntity, this, &SafeLanding::deleteTrackedEntity); - _sequenceNumbers.clear(); - _initialStart = INVALID_SEQUENCE; - _initialEnd = INVALID_SEQUENCE; - EntityTreeRenderer::setEntityLoadingPriorityFunction(&ElevatedPriority); - } + if (entityTree) { + Locker lock(_lock); + _entityTree = entityTree; + _trackedEntities.clear(); + _trackingEntities = true; + connect(std::const_pointer_cast(_entityTree).get(), + &EntityTree::addingEntity, this, &SafeLanding::addTrackedEntity); + connect(std::const_pointer_cast(_entityTree).get(), + &EntityTree::deletingEntity, this, &SafeLanding::deleteTrackedEntity); + + _sequenceNumbers.clear(); + _initialStart = INVALID_SEQUENCE; + _initialEnd = INVALID_SEQUENCE; + EntityTreeRenderer::setEntityLoadingPriorityFunction(&ElevatedPriority); } } @@ -70,7 +70,9 @@ void SafeLanding::addTrackedEntity(const EntityItemID& entityID) { ModelEntityItem * modelEntity = std::dynamic_pointer_cast(entity).get(); static const std::set downloadedCollisionTypes { SHAPE_TYPE_COMPOUND, SHAPE_TYPE_SIMPLE_COMPOUND, SHAPE_TYPE_STATIC_MESH, SHAPE_TYPE_SIMPLE_HULL }; - if (downloadedCollisionTypes.count(modelEntity->getShapeType()) != 0) { + bool hasAABox; + entity->getAABox(hasAABox); + if (hasAABox && downloadedCollisionTypes.count(modelEntity->getShapeType()) != 0) { // Only track entities with downloaded collision bodies. _trackedEntities.emplace(entityID, entity); qCDebug(interfaceapp) << "Safe Landing: Tracking entity " << entity->getItemName(); @@ -117,11 +119,14 @@ bool SafeLanding::isLoadSequenceComplete() { bool SafeLanding::sequenceNumbersComplete() { if (_initialStart != INVALID_SEQUENCE) { Locker lock(_lock); - int sequenceSize = _initialStart < _initialEnd ? _initialEnd - _initialStart: + int sequenceSize = _initialStart <= _initialEnd ? _initialEnd - _initialStart: _initialEnd + SEQUENCE_MODULO - _initialStart; auto startIter = _sequenceNumbers.find(_initialStart); auto endIter = _sequenceNumbers.find(_initialEnd); - if (startIter != _sequenceNumbers.end() && endIter != _sequenceNumbers.end() && distance(startIter, endIter) == sequenceSize) { + if (sequenceSize == 0 || + (startIter != _sequenceNumbers.end() + && endIter != _sequenceNumbers.end() + && distance(startIter, endIter) == sequenceSize) ) { _trackingEntities = false; // Don't track anything else that comes in. return true; } @@ -143,6 +148,10 @@ bool SafeLanding::entityPhysicsComplete() { return _trackedEntities.empty(); } +float SafeLanding::ElevatedPriority(const EntityItem& entityItem) { + return entityItem.getCollisionless() ? 0.0f : 10.0f; +} + void SafeLanding::debugDumpSequenceIDs() const { int p = -1; qCDebug(interfaceapp) << "Sequence set size:" << _sequenceNumbers.size(); diff --git a/interface/src/octree/SafeLanding.h b/interface/src/octree/SafeLanding.h index 9a846294bf..64de50b883 100644 --- a/interface/src/octree/SafeLanding.h +++ b/interface/src/octree/SafeLanding.h @@ -55,9 +55,8 @@ private: }; std::set _sequenceNumbers; - std::set _trackedURLs; - static float ElevatedPriority(const EntityItem&) { return 10.0f; } + static float ElevatedPriority(const EntityItem& entityItem); static float StandardPriority(const EntityItem&) { return 0.0f; } static const int SEQUENCE_MODULO; From 9c36519e8762351e85adbee1aa6b75ca379ae6eb Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 20 Aug 2018 12:42:23 -0700 Subject: [PATCH 66/68] Fix cross-platform build error in ColliisonPick.cpp (binding to temporary) --- interface/src/raypick/CollisionPick.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index 889a241bcc..9f2e6da2e8 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -361,7 +361,7 @@ PickResultPointer CollisionPick::getEntityIntersection(const CollisionRegion& pi return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::vector(), std::vector()); } - auto& entityIntersections = _physicsEngine->contactTest(USER_COLLISION_MASK_ENTITIES, *pick.shapeInfo, pick.transform); + auto entityIntersections = _physicsEngine->contactTest(USER_COLLISION_MASK_ENTITIES, *pick.shapeInfo, pick.transform); filterIntersections(entityIntersections); return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, entityIntersections, std::vector()); } @@ -376,7 +376,7 @@ PickResultPointer CollisionPick::getAvatarIntersection(const CollisionRegion& pi return std::make_shared(pick.toVariantMap(), CollisionPickResult::LOAD_STATE_NOT_LOADED, std::vector(), std::vector()); } - auto &avatarIntersections = _physicsEngine->contactTest(USER_COLLISION_MASK_AVATARS, *pick.shapeInfo, pick.transform); + auto avatarIntersections = _physicsEngine->contactTest(USER_COLLISION_MASK_AVATARS, *pick.shapeInfo, pick.transform); filterIntersections(avatarIntersections); return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, std::vector(), avatarIntersections); } From 217e4efdda501cf7cb6813845b6c3a87944e80a4 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Mon, 20 Aug 2018 13:43:48 -0700 Subject: [PATCH 67/68] Fix regex for web i/f single-node kill --- domain-server/src/DomainServer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index c6b387c937..57c4692794 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -2439,8 +2439,8 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url } } else if (connection->requestOperation() == QNetworkAccessManager::DeleteOperation) { - const QString ALL_NODE_DELETE_REGEX_STRING = QString("\\%1\\/?$").arg(URI_NODES); - const QString NODE_DELETE_REGEX_STRING = QString("\\%1\\/(%2)\\/$").arg(URI_NODES).arg(UUID_REGEX_STRING); + const QString ALL_NODE_DELETE_REGEX_STRING = QString("%1/?$").arg(URI_NODES); + const QString NODE_DELETE_REGEX_STRING = QString("%1/(%2)$").arg(URI_NODES).arg(UUID_REGEX_STRING); QRegExp allNodesDeleteRegex(ALL_NODE_DELETE_REGEX_STRING); QRegExp nodeDeleteRegex(NODE_DELETE_REGEX_STRING); From 8d6aaf3fb5592e4ac243eae6e322e5a78c604f39 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Mon, 20 Aug 2018 17:50:29 -0700 Subject: [PATCH 68/68] Tidy some method names per reviewer comment --- interface/src/octree/OctreePacketProcessor.cpp | 2 +- interface/src/octree/SafeLanding.cpp | 8 ++++---- interface/src/octree/SafeLanding.h | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index f740995123..4bc6817a9e 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -112,7 +112,7 @@ void OctreePacketProcessor::processPacket(QSharedPointer messag auto renderer = qApp->getEntities(); if (renderer) { renderer->processDatagram(*message, sendingNode); - _safeLanding->sequenceNumberReceived(renderer->getLastOctreeMessageSequence()); + _safeLanding->noteReceivedsequenceNumber(renderer->getLastOctreeMessageSequence()); } } } break; diff --git a/interface/src/octree/SafeLanding.cpp b/interface/src/octree/SafeLanding.cpp index 3568dade08..31106457fb 100644 --- a/interface/src/octree/SafeLanding.cpp +++ b/interface/src/octree/SafeLanding.cpp @@ -95,7 +95,7 @@ void SafeLanding::setCompletionSequenceNumbers(int first, int last) { } } -void SafeLanding::sequenceNumberReceived(int sequenceNumber) { +void SafeLanding::noteReceivedsequenceNumber(int sequenceNumber) { if (_trackingEntities) { Locker lock(_lock); _sequenceNumbers.insert(sequenceNumber); @@ -103,7 +103,7 @@ void SafeLanding::sequenceNumberReceived(int sequenceNumber) { } bool SafeLanding::isLoadSequenceComplete() { - if (entityPhysicsComplete() && sequenceNumbersComplete()) { + if (isEntityPhysicsComplete() && isSequenceNumbersComplete()) { Locker lock(_lock); _trackedEntities.clear(); _initialStart = INVALID_SEQUENCE; @@ -116,7 +116,7 @@ bool SafeLanding::isLoadSequenceComplete() { return !_trackingEntities; } -bool SafeLanding::sequenceNumbersComplete() { +bool SafeLanding::isSequenceNumbersComplete() { if (_initialStart != INVALID_SEQUENCE) { Locker lock(_lock); int sequenceSize = _initialStart <= _initialEnd ? _initialEnd - _initialStart: @@ -134,7 +134,7 @@ bool SafeLanding::sequenceNumbersComplete() { return false; } -bool SafeLanding::entityPhysicsComplete() { +bool SafeLanding::isEntityPhysicsComplete() { Locker lock(_lock); for (auto entityMapIter = _trackedEntities.begin(); entityMapIter != _trackedEntities.end(); ++entityMapIter) { auto entity = entityMapIter->second; diff --git a/interface/src/octree/SafeLanding.h b/interface/src/octree/SafeLanding.h index 64de50b883..210dfbac25 100644 --- a/interface/src/octree/SafeLanding.h +++ b/interface/src/octree/SafeLanding.h @@ -27,7 +27,7 @@ public: void startEntitySequence(QSharedPointer entityTreeRenderer); void stopEntitySequence(); void setCompletionSequenceNumbers(int first, int last); - void sequenceNumberReceived(int sequenceNumber); + void noteReceivedsequenceNumber(int sequenceNumber); bool isLoadSequenceComplete(); private slots: @@ -35,9 +35,9 @@ private slots: void deleteTrackedEntity(const EntityItemID& entityID); private: - bool sequenceNumbersComplete(); + bool isSequenceNumbersComplete(); void debugDumpSequenceIDs() const; - bool entityPhysicsComplete(); + bool isEntityPhysicsComplete(); std::mutex _lock; using Locker = std::lock_guard;