diff --git a/android/app/build.gradle b/android/app/build.gradle index 54405a8746..d3463411b8 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -145,5 +145,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/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index 82fd86b3dd..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) { } @@ -285,6 +290,18 @@ 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) { + auto accountManager = DependencyManager::get(); + return accountManager->isLoggedIn(); +} + +JNIEXPORT jstring JNICALL +Java_io_highfidelity_hifiinterface_fragment_FriendsFragment_nativeGetAccessToken(JNIEnv *env, jobject instance) { + auto accountManager = DependencyManager::get(); + 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/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 54161f60c6..db6f0fca24 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; @@ -36,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"; @@ -56,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; @@ -75,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); @@ -109,40 +114,69 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On loadLoginFragment(); break; case "Home": - loadHomeFragment(); + loadHomeFragment(true); break; case "Privacy Policy": loadPrivacyPolicyFragment(); break; + case "People": + loadPeopleFragment(); + break; default: Log.e(TAG, "Unknown fragment " + fragment); } } - private void loadHomeFragment() { + private void loadHomeFragment(boolean addToBackStack) { Fragment fragment = HomeFragment.newInstance(); - loadFragment(fragment, getString(R.string.home), false); + 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 loadFragment(Fragment fragment, String title, boolean addToBackStack) { + private void loadPeopleFragment() { + Fragment fragment = FriendsFragment.newInstance(); + + loadFragment(fragment, getString(R.string.people), getString(R.string.tagFragmentPeople), true); + } + + 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() + : ""; + 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); + ft.replace(R.id.content_frame, fragment, tag); + if (addToBackStack) { - ft.addToBackStack(null); + ft.addToBackStack(title); } ft.commit(); setTitle(title); @@ -155,11 +189,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(""); } } @@ -200,7 +236,10 @@ 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(); return true; } return false; @@ -219,6 +258,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) { @@ -237,9 +289,17 @@ 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(); + loadHomeFragment(false); updateLoginMenu(); if (backToScene) { backToScene = false; @@ -266,6 +326,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() { @@ -284,15 +349,30 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On @Override public void onBackPressed() { - int index = getFragmentManager().getBackStackEntryCount() - 1; - if (index > -1) { + // 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()) { + return; + } + } + + int index = fm.getBackStackEntryCount() - 1; + + if (index > 0) { super.onBackPressed(); + index--; + if (index > -1) { + setTitle(fm.getBackStackEntryAt(index).getName()); + } if (backToScene) { backToScene = false; goToLastLocation(); } } else { - finishAffinity(); + finishAffinity(); } } 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..2a008d7950 --- /dev/null +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java @@ -0,0 +1,193 @@ +package io.highfidelity.hifiinterface.fragment; + + +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; +import android.util.Log; +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.provider.EndpointUsersProvider; +import io.highfidelity.hifiinterface.provider.UsersProvider; +import io.highfidelity.hifiinterface.view.UserListAdapter; + +public class FriendsFragment extends Fragment { + + public native boolean nativeIsLoggedIn(); + + public native String nativeGetAccessToken(); + + private RecyclerView mUsersView; + private View mUserActions; + private UserListAdapter mUsersAdapter; + private SlidingUpPanelLayout mSlidingUpPanelLayout; + private EndpointUsersProvider mUsersProvider; + private String mSelectedUsername; + + private OnHomeInteractionListener mListener; + private SwipeRefreshLayout mSwipeRefreshLayout; + + 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(); + mUsersProvider = new EndpointUsersProvider(accessToken); + + 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); + + mSlidingUpPanelLayout = rootView.findViewById(R.id.sliding_layout); + mSlidingUpPanelLayout.setPanelHeight(0); + + 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) { + // 1. 'select' user + mSelectedUsername = user.name; + // .. + // 2. adapt options + // .. + rootView.findViewById(R.id.userActionVisit).setVisibility(user.online ? View.VISIBLE : View.GONE); + // 3. show + 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() { + @Override + public void onClick(View view) { + mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + mSelectedUsername = null; + } + }); + + mSwipeRefreshLayout.setOnRefreshListener(() -> mUsersAdapter.loadUsers()); + + return rootView; + } + + private void onRemoveConnectionClick() { + if (mSelectedUsername == null) { + return; + } + + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setMessage("Remove '" + mSelectedUsername + "' 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() { + mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + mSelectedUsername = null; + 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 + */ + public boolean onBackPressed() { + if (mSlidingUpPanelLayout.getPanelState().equals(SlidingUpPanelLayout.PanelState.EXPANDED)) { + mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); + mSelectedUsername = null; + return true; + } else { + 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 new file mode 100644 index 0000000000..7c32a8e8fb --- /dev/null +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/EndpointUsersProvider.java @@ -0,0 +1,225 @@ +package io.highfidelity.hifiinterface.provider; + +import android.util.Log; + +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.Body; +import retrofit2.http.DELETE; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Path; +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( + CONNECTION_FILTER_CONNECTIONS, + 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; + 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); + } + + @Override + public void onFailure(Call call, Throwable t) { + usersCallback.retrieveError(new Exception(t), "Error calling Users API"); + } + }); + } + + 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 { + 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; + LocationData location; + } + + class Images { + public Images() {} + String hero; + String thumbnail; + 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/provider/UsersProvider.java b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UsersProvider.java new file mode 100644 index 0000000000..0088506407 --- /dev/null +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/provider/UsersProvider.java @@ -0,0 +1,35 @@ +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 { + + public static String CONNECTION_TYPE_FRIEND = "friend"; + public static String CONNECTION_FILTER_CONNECTIONS = "connections"; + + void retrieve(UsersProvider.UsersCallback usersCallback); + + interface UsersCallback { + void retrieveOk(List users); + 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 new file mode 100644 index 0000000000..9f62b21250 --- /dev/null +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/UserListAdapter.java @@ -0,0 +1,247 @@ +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.content.ContextCompat; +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.ImageView; +import android.widget.TextView; + +import com.squareup.picasso.Callback; +import com.squareup.picasso.Picasso; + +import java.util.ArrayList; +import java.util.List; + +import io.highfidelity.hifiinterface.R; +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<>(); + private ItemClickListener mClickListener; + private AdapterListener mAdapterListener; + + public UserListAdapter(Context c, UsersProvider usersProvider) { + mContext = c; + mInflater = LayoutInflater.from(mContext); + mProvider = usersProvider; + loadUsers(); + } + + public void setListener(AdapterListener adapterListener) { + mAdapterListener = adapterListener; + } + + public void loadUsers() { + mProvider.retrieve(new UsersProvider.UsersCallback() { + @Override + public void retrieveOk(List 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); + } + } + }); + } + + @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.mOnlineInfo.setVisibility(aUser.online? View.VISIBLE : View.GONE); + holder.mLocation.setText("- " + aUser.locationName); // Bring info from the API and use it here + + holder.mFriendStar.onBindSet(aUser.name, aUser.connection.equals(UsersProvider.CONNECTION_TYPE_FRIEND)); + Uri uri = Uri.parse(aUser.imageUrl); + Picasso.get().load(uri).into(holder.mImage, new RoundProfilePictureCallback(holder.mImage)); + } + + private class RoundProfilePictureCallback implements Callback { + private ImageView mProfilePicture; + public RoundProfilePictureCallback(ImageView imageView) { + mProfilePicture = imageView; + } + + @Override + public void onSuccess() { + Bitmap imageBitmap = ((BitmapDrawable) mProfilePicture.getDrawable()).getBitmap(); + RoundedBitmapDrawable imageDrawable = RoundedBitmapDrawableFactory.create(mProfilePicture.getContext().getResources(), imageBitmap); + imageDrawable.setCircular(true); + imageDrawable.setCornerRadius(Math.max(imageBitmap.getWidth(), imageBitmap.getHeight()) / 2.0f); + mProfilePicture.setImageDrawable(imageDrawable); + } + + @Override + public void onError(Exception e) { + mProfilePicture.setImageResource(R.drawable.default_profile_avatar); + } + } + + @Override + public int getItemCount() { + return mUsers.size(); + } + + public class ToggleWrapper { + + private ViewGroup mFrame; + private ImageView mImage; + private boolean mChecked = false; + private String mUsername; + private boolean waitingChangeConfirm = false; + + public ToggleWrapper(ViewGroup toggleFrame) { + mFrame = toggleFrame; + mImage = toggleFrame.findViewById(R.id.userFavImage); + mFrame.setOnClickListener(view -> toggle()); + } + + private void refreshUI() { + mImage.setColorFilter(ContextCompat.getColor(mImage.getContext(), + mChecked ? R.color.starSelectedTint : R.color.starUnselectedTint)); + } + + class RollbackUICallback implements UsersProvider.UserActionCallback { + + boolean previousStatus; + + RollbackUICallback(boolean previousStatus) { + this.previousStatus = previousStatus; + } + + @Override + public void requestOk() { + if (!waitingChangeConfirm) { + return; + } + mFrame.setClickable(true); + // nothing to do, new status was set + } + + @Override + public void requestError(Exception e, String message) { + if (!waitingChangeConfirm) { + return; + } + // new status was not set, rolling back + mChecked = previousStatus; + mFrame.setClickable(true); + refreshUI(); + } + + } + + protected void toggle() { + // TODO API CALL TO CHANGE + final boolean previousStatus = mChecked; + mChecked = !mChecked; + mFrame.setClickable(false); + refreshUI(); + waitingChangeConfirm = true; + if (mChecked) { + mProvider.addFriend(mUsername, new RollbackUICallback(previousStatus)); + } else { + mProvider.removeFriend(mUsername, new RollbackUICallback(previousStatus)); + } + } + + protected void onBindSet(String username, boolean checked) { + mChecked = checked; + mUsername = username; + waitingChangeConfirm = false; + mFrame.setClickable(true); + refreshUI(); + } + } + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + + TextView mUsername; + TextView mOnline; + View mOnlineInfo; + TextView mLocation; + ImageView mImage; + ToggleWrapper mFriendStar; + + public ViewHolder(View itemView) { + super(itemView); + mUsername = itemView.findViewById(R.id.userName); + mOnline = itemView.findViewById(R.id.userOnline); + mImage = itemView.findViewById(R.id.userImage); + mOnlineInfo = itemView.findViewById(R.id.userOnlineInfo); + mLocation = itemView.findViewById(R.id.userLocation); + mFriendStar = new ToggleWrapper(itemView.findViewById(R.id.userFav)); + itemView.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + int position = getAdapterPosition(); + if (mClickListener != null) { + mClickListener.onItemClick(view, position, mUsers.get(position)); + } + } + } + + // allows clicks events to be caught + public void setClickListener(ItemClickListener itemClickListener) { + this.mClickListener = itemClickListener; + } + + public interface ItemClickListener { + void onItemClick(View view, int position, User user); + } + + public static class User { + public String name; + public String imageUrl; + public String connection; + public boolean online; + + public String locationName; + + public User() {} + } + + public interface AdapterListener { + void onEmptyAdapter(); + void onNonEmptyAdapter(); + void onError(Exception e, String message); + } +} 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_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/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/layout/fragment_friends.xml b/android/app/src/main/res/layout/fragment_friends.xml new file mode 100644 index 0000000000..c98878f68e --- /dev/null +++ b/android/app/src/main/res/layout/fragment_friends.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + 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..5ad1dcc5ee --- /dev/null +++ b/android/app/src/main/res/layout/user_item.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/menu/menu_navigation.xml b/android/app/src/main/res/menu/menu_navigation.xml index cf80c84177..3cce64f9f5 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/colors.xml b/android/app/src/main/res/values/colors.xml index 7e6cf52d36..e4bbb60544 100644 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -18,4 +18,8 @@ #99000000 #292929 #23B2E7 + #62D5C6 + #FBD92A + #8A8A8A + #40000000 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 + diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 4f5f29e671..b158aba59d 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 + People Open in browser Share link Shared a link @@ -21,5 +22,11 @@ No places exist with that name Privacy Policy Your Last Location + Online + + tagFragmentHome + tagFragmentLogin + tagFragmentPolicy + tagFragmentPeople diff --git a/android/build.gradle b/android/build.gradle index b85aba79a1..a6de0d469c 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -28,6 +28,7 @@ allprojects { repositories { jcenter() google() + mavenCentral() } } 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 "" 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/cmake/macros/SetPackagingParameters.cmake b/cmake/macros/SetPackagingParameters.cmake index c40691c632..0f8975e9b5 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 c51e4ffd72..7f6884f478 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://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 + !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 ; Good. Now we can carry on writing the real installer. 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); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 14a9af09d2..f6c7afdd5a 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 }; }; @@ -2695,26 +2681,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 @@ -2727,9 +2701,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\" } }" }; @@ -2768,8 +2739,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 { @@ -2811,8 +2780,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 @@ -4562,7 +4529,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(); } } @@ -4620,10 +4586,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(); @@ -4951,7 +4913,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) { @@ -5300,6 +5261,7 @@ void Application::resetPhysicsReadyInformation() { _nearbyEntitiesCountAtLastPhysicsCheck = 0; _nearbyEntitiesStabilityCount = 0; _physicsEnabled = false; + _octreeProcessor.startEntitySequence(); } @@ -5537,7 +5499,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; @@ -5546,7 +5508,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(); } @@ -6350,7 +6312,6 @@ void Application::clearDomainOctreeDetails() { _octreeServerSceneStats.clear(); }); - _octreeProcessor.resetCompletionSequenceNumber(); // reset the model renderer getEntities()->clear(); @@ -8342,7 +8303,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 66388afbde..742cf075f6 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/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; diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 063b07f699..4bc6817a9e 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -16,8 +16,11 @@ #include "Application.h" #include "Menu.h" #include "SceneScriptingInterface.h" +#include "SafeLanding.h" -OctreePacketProcessor::OctreePacketProcessor() { +OctreePacketProcessor::OctreePacketProcessor(): + _safeLanding(new SafeLanding()) +{ setObjectName("Octree Packet Processor"); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); @@ -26,6 +29,8 @@ OctreePacketProcessor::OctreePacketProcessor() { packetReceiver.registerDirectListenerForTypes(octreePackets, this, "handleOctreePacket"); } +OctreePacketProcessor::~OctreePacketProcessor() { } + void OctreePacketProcessor::handleOctreePacket(QSharedPointer message, SharedNodePointer senderNode) { queueReceivedPacket(message, senderNode); } @@ -107,6 +112,7 @@ void OctreePacketProcessor::processPacket(QSharedPointer messag auto renderer = qApp->getEntities(); if (renderer) { renderer->processDatagram(*message, sendingNode); + _safeLanding->noteReceivedsequenceNumber(renderer->getLastOctreeMessageSequence()); } } } break; @@ -115,8 +121,7 @@ void OctreePacketProcessor::processPacket(QSharedPointer messag // Read sequence # OCTREE_PACKET_SEQUENCE completionNumber; message->readPrimitive(&completionNumber); - - _completionSequenceNumber = completionNumber; + _safeLanding->setCompletionSequenceNumbers(0, completionNumber); } break; default: { @@ -125,22 +130,10 @@ void OctreePacketProcessor::processPacket(QSharedPointer messag } } -void OctreePacketProcessor::resetCompletionSequenceNumber() { - _completionSequenceNumber = INVALID_SEQUENCE; +void OctreePacketProcessor::startEntitySequence() { + _safeLanding->startEntitySequence(qApp->getEntities()); } -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); +bool OctreePacketProcessor::isLoadSequenceComplete() const { + return _safeLanding->isLoadSequenceComplete(); } diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index edba48a238..f9c24ddc51 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -15,21 +15,22 @@ #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; + void startEntitySequence(); + bool isLoadSequenceComplete() const; signals: void packetVersionMismatch(); -public slots: - void resetCompletionSequenceNumber(); - protected: virtual void processPacket(QSharedPointer message, SharedNodePointer sendingNode) override; @@ -37,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 new file mode 100644 index 0000000000..31106457fb --- /dev/null +++ b/interface/src/octree/SafeLanding.cpp @@ -0,0 +1,172 @@ +// +// 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" +#include "EntityTreeRenderer.h" +#include "ModelEntityItem.h" +#include "InterfaceLogging.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); +} + +void SafeLanding::startEntitySequence(QSharedPointer entityTreeRenderer) { + auto entityTree = entityTreeRenderer->getTree(); + + 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); + } +} + +void SafeLanding::stopEntitySequence() { + Locker lock(_lock); + _trackingEntities = false; + _initialStart = INVALID_SEQUENCE; + _initialEnd = INVALID_SEQUENCE; + _trackedEntities.clear(); + _sequenceNumbers.clear(); +} + +void SafeLanding::addTrackedEntity(const EntityItemID& entityID) { + if (_trackingEntities) { + Locker lock(_lock); + EntityItemPointer entity = _entityTree->findEntityByID(entityID); + + if (entity && !entity->getCollisionless()) { + const auto& entityType = entity->getType(); + if (entityType == EntityTypes::Model) { + 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 }; + 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(); + } + } + } + } +} + +void SafeLanding::deleteTrackedEntity(const EntityItemID& entityID) { + Locker lock(_lock); + _trackedEntities.erase(entityID); +} + +void SafeLanding::setCompletionSequenceNumbers(int first, int last) { + Locker lock(_lock); + if (_initialStart == INVALID_SEQUENCE) { + _initialStart = first; + _initialEnd = last; + } +} + +void SafeLanding::noteReceivedsequenceNumber(int sequenceNumber) { + if (_trackingEntities) { + Locker lock(_lock); + _sequenceNumbers.insert(sequenceNumber); + } +} + +bool SafeLanding::isLoadSequenceComplete() { + if (isEntityPhysicsComplete() && isSequenceNumbersComplete()) { + Locker lock(_lock); + _trackedEntities.clear(); + _initialStart = INVALID_SEQUENCE; + _initialEnd = INVALID_SEQUENCE; + _entityTree = nullptr; + EntityTreeRenderer::setEntityLoadingPriorityFunction(StandardPriority); + qCDebug(interfaceapp) << "Safe Landing: load sequence complete"; + } + + return !_trackingEntities; +} + +bool SafeLanding::isSequenceNumbersComplete() { + if (_initialStart != INVALID_SEQUENCE) { + Locker lock(_lock); + int sequenceSize = _initialStart <= _initialEnd ? _initialEnd - _initialStart: + _initialEnd + SEQUENCE_MODULO - _initialStart; + auto startIter = _sequenceNumbers.find(_initialStart); + auto endIter = _sequenceNumbers.find(_initialEnd); + 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; + } + } + return false; +} + +bool SafeLanding::isEntityPhysicsComplete() { + Locker lock(_lock); + 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(); +} + +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(); + 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 new file mode 100644 index 0000000000..210dfbac25 --- /dev/null +++ b/interface/src/octree/SafeLanding.h @@ -0,0 +1,65 @@ +// +// 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 + +#include +#include + +#include "EntityItem.h" + +class EntityTreeRenderer; +class EntityItemID; + +class SafeLanding : public QObject { +public: + void startEntitySequence(QSharedPointer entityTreeRenderer); + void stopEntitySequence(); + void setCompletionSequenceNumbers(int first, int last); + void noteReceivedsequenceNumber(int sequenceNumber); + bool isLoadSequenceComplete(); + +private slots: + void addTrackedEntity(const EntityItemID& entityID); + void deleteTrackedEntity(const EntityItemID& entityID); + +private: + bool isSequenceNumbersComplete(); + void debugDumpSequenceIDs() const; + bool isEntityPhysicsComplete(); + + std::mutex _lock; + using Locker = std::lock_guard; + bool _trackingEntities { false }; + EntityTreePointer _entityTree; + using EntityMap = std::map; + EntityMap _trackedEntities; + + static constexpr int INVALID_SEQUENCE = -1; + int _initialStart { INVALID_SEQUENCE }; + int _initialEnd { INVALID_SEQUENCE }; + + struct SequenceLessThan { + bool operator()(const int& a, const int& b) const; + }; + + std::set _sequenceNumbers; + + static float ElevatedPriority(const EntityItem& entityItem); + static float StandardPriority(const EntityItem&) { return 0.0f; } + + static const int SEQUENCE_MODULO; +}; + +#endif // hifi_SafeLanding_h diff --git a/interface/src/raypick/CollisionPick.cpp b/interface/src/raypick/CollisionPick.cpp index 87c8c91e6d..9f2e6da2e8 100644 --- a/interface/src/raypick/CollisionPick.cpp +++ b/interface/src/raypick/CollisionPick.cpp @@ -12,9 +12,33 @@ #include +#include "PhysicsCollisionGroups.h" #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()) { + 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()); + } 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::vector& objectIntersections, std::unordered_map& intersections, std::unordered_map& collisionPointPairs) { for (auto& objectIntersection : objectIntersections) { auto at = intersections.find(objectIntersection.foundID); @@ -308,20 +332,27 @@ 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) { + bool isWhitelist = !includeItems.empty(); + + if (!isWhitelist && ignoreItems.empty()) { + 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))) { filteredIntersections.push_back(intersection); } } - return filteredIntersections; + intersections = filteredIntersections; } PickResultPointer CollisionPick::getEntityIntersection(const CollisionRegion& pick) { @@ -330,7 +361,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->contactTest(USER_COLLISION_MASK_ENTITIES, *pick.shapeInfo, pick.transform); + filterIntersections(entityIntersections); return std::make_shared(pick, CollisionPickResult::LOAD_STATE_LOADED, entityIntersections, std::vector()); } @@ -343,8 +375,9 @@ PickResultPointer CollisionPick::getAvatarIntersection(const CollisionRegion& pi // Cannot compute result 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->contactTest(USER_COLLISION_MASK_AVATARS, *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..6631238737 100644 --- a/interface/src/raypick/CollisionPick.h +++ b/interface/src/raypick/CollisionPick.h @@ -49,23 +49,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 { @@ -92,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); - const std::vector filterIntersections(const std::vector& intersections) const; + void filterIntersections(std::vector& intersections) const; CollisionRegion _mathPick; PhysicsEnginePointer _physicsEngine; 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/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 136fb281d5..34d8dbbaef 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); } 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/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index ef8c28bdc6..163005bc81 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; } } @@ -864,9 +843,8 @@ void PhysicsEngine::setShowBulletConstraintLimits(bool value) { } 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(), contacts(), myAvatarCollisionObject(myAvatarCollisionObject) { @@ -879,21 +857,19 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback { bulletTransform.setRotation(glmToBullet(transform.getRotation())); collisionObject.setWorldTransform(bulletTransform); + + m_collisionFilterMask = mask; + m_collisionFilterGroup = group; } ~AllContactsCallback() { ObjectMotionState::getShapeManager()->releaseShape(collisionObject.getCollisionShape()); } - MotionStateType desiredObjectType; btCollisionObject collisionObject; 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; @@ -909,7 +885,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; } @@ -921,7 +897,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; } @@ -937,14 +913,14 @@ protected: } }; -const std::vector PhysicsEngine::getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) 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 (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 c5ab0cfdee..c6e165632b 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 - const std::vector 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::vector 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/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/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; diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index 92e3168147..db95f6b09b 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -190,8 +190,42 @@ Script.include("/~/system/libraries/controllers.js"); Pointers.removePointer(this.teleportParabolaHeadInvisible); }; - this.buttonPress = function(value) { - _this.buttonValue = value; + 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.axisButtonChangeX = function (value) { + if (value !== 0) { + _this.axisButtonStateX = value; + } else { + // Delay direction button release until after teleport possibly pressed. + Script.setTimeout(function () { + _this.axisButtonStateX = value; + }, _this.BUTTON_TRANSITION_DELAY); + } + }; + + this.axisButtonChangeY = function (value) { + if (value !== 0) { + _this.axisButtonStateY = value; + } else { + // Delay direction button release until after teleport possibly pressed. + Script.setTimeout(function () { + _this.axisButtonStateY = 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.axisButtonStateX !== 0 || _this.axisButtonStateY !== 0); + }; + + this.buttonPress = function (value) { + if (value === 0 || !_this.teleportLocked()) { + _this.buttonValue = value; + } }; this.parameters = makeDispatcherModuleParameters( @@ -347,6 +381,7 @@ Script.include("/~/system/libraries/controllers.js"); } var mappingName, teleportMapping; + var isViveMapped = false; function parseJSON(json) { try { @@ -390,12 +425,39 @@ 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); - teleportMapping.from(Controller.Standard.RightPrimaryThumb).peek().to(rightTeleporter.buttonPress); + // Vive teleport button lock-out. + registerViveTeleportMapping(); + + // 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); @@ -407,6 +469,7 @@ Script.include("/~/system/libraries/controllers.js"); Controller.enableMapping(mappingName); function cleanup() { + Controller.hardwareChanged.disconnect(onHardwareChanged); teleportMapping.disable(); leftTeleporter.cleanup(); rightTeleporter.cleanup(); diff --git a/scripts/system/edit.js b/scripts/system/edit.js index 2499a244b8..adee7c6236 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) { 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)) {