From b9c857130a2dd6ca8899495c4af9a8d281cd2c8d Mon Sep 17 00:00:00 2001 From: Philip Rideout Date: Fri, 14 Feb 2020 15:15:25 -0800 Subject: [PATCH] Introduce gltfio-lite. This is 466 KB insted of the usual 850 KB. It assumes that users do not need spec-gloss, non-lit, or a special transparency mode. (uncompressed SO size on arm64) We can add a new maven project for this next week. --- android/gltfio-android/CMakeLists.txt | 31 +++++++++++++++------------ libs/gltfio/CMakeLists.txt | 26 +++++++++++++++++++++- libs/gltfio/src/AssetLoader.cpp | 10 +++++++++ libs/gltfio/src/UbershaderLoader.cpp | 16 ++++++++++++++ 4 files changed, 68 insertions(+), 15 deletions(-) diff --git a/android/gltfio-android/CMakeLists.txt b/android/gltfio-android/CMakeLists.txt index 38c3671527..696bbbe9fc 100644 --- a/android/gltfio-android/CMakeLists.txt +++ b/android/gltfio-android/CMakeLists.txt @@ -13,6 +13,10 @@ add_library(gltfio_resources STATIC IMPORTED) set_target_properties(gltfio_resources PROPERTIES IMPORTED_LOCATION ${FILAMENT_DIR}/lib/${ANDROID_ABI}/libgltfio_resources.a) +add_library(gltfio_resources_lite STATIC IMPORTED) +set_target_properties(gltfio_resources_lite PROPERTIES IMPORTED_LOCATION + ${FILAMENT_DIR}/lib/${ANDROID_ABI}/libgltfio_resources_lite.a) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-stack-protector") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-rtti") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ffast-math -ffp-contract=fast") @@ -25,7 +29,7 @@ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-Bsymbolic-funct set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libgltfio-jni.map") -add_library(gltfio-jni SHARED +set(GLTFIO_SRCS ${GLTFIO_DIR}/include/gltfio/Animator.h ${GLTFIO_DIR}/include/gltfio/AssetLoader.h ${GLTFIO_DIR}/include/gltfio/MaterialProvider.h @@ -60,7 +64,7 @@ add_library(gltfio-jni SHARED ../common/NioUtils.cpp ) -target_include_directories(gltfio-jni PRIVATE +set(GLTFIO_INCLUDE_DIRS .. ${FILAMENT_DIR}/include ${FILAMENT_DIR}/include/gltfio/resources @@ -70,17 +74,16 @@ target_include_directories(gltfio-jni PRIVATE ../../libs/utils/include ) -set_target_properties(gltfio-jni PROPERTIES LINK_DEPENDS - ${CMAKE_CURRENT_SOURCE_DIR}/libgltfio-jni.symbols) +add_library(gltfio-jni SHARED ${GLTFIO_SRCS}) +target_include_directories(gltfio-jni PRIVATE ${GLTFIO_INCLUDE_DIRS}) +set_target_properties(gltfio-jni PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libgltfio-jni.symbols) +set_target_properties(gltfio-jni PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libgltfio-jni.map) +target_link_libraries(gltfio-jni filament-jni utils gltfio_resources log) -# Force a relink when the version script is changed. -set_target_properties(gltfio-jni PROPERTIES LINK_DEPENDS - ${CMAKE_CURRENT_SOURCE_DIR}/libgltfio-jni.map) +add_library(gltfio-jni-lite SHARED ${GLTFIO_SRCS}) +target_include_directories(gltfio-jni-lite PRIVATE ${GLTFIO_INCLUDE_DIRS}) +set_target_properties(gltfio-jni-lite PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libgltfio-jni.symbols) +set_target_properties(gltfio-jni-lite PROPERTIES LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libgltfio-jni.map) +target_link_libraries(gltfio-jni-lite filament-jni utils gltfio_resources_lite log) -# The ordering in the following list is important because CMake does not have dependency information. -target_link_libraries(gltfio-jni - filament-jni - utils - gltfio_resources - log -) +target_compile_definitions(gltfio-jni-lite PUBLIC GLTFIO_LITE=1) diff --git a/libs/gltfio/CMakeLists.txt b/libs/gltfio/CMakeLists.txt index 914be02a32..2bf24499db 100644 --- a/libs/gltfio/CMakeLists.txt +++ b/libs/gltfio/CMakeLists.txt @@ -98,6 +98,29 @@ add_custom_command(OUTPUT ${DUMMY_SRC} COMMAND echo "//" > ${DUMMY_SRC}) add_library(gltfio_resources ${DUMMY_SRC} ${RESGEN_SOURCE}) +# ================================================================================================== +# Build "lite" resources library, which contains only one material +# ================================================================================================== + +set(RESOURCE_BINS "${RESOURCE_DIR}/lit_opaque.filamat") + +get_resgen_vars(${RESOURCE_DIR} gltfresources_lite) + +add_custom_command( + OUTPUT ${RESGEN_OUTPUTS} + COMMAND resgen ${RESGEN_FLAGS} ${RESOURCE_BINS} + DEPENDS resgen ${RESOURCE_BINS} +) + +if (DEFINED RESGEN_SOURCE_FLAGS) + set_source_files_properties(${RESGEN_SOURCE} PROPERTIES COMPILE_FLAGS ${RESGEN_SOURCE_FLAGS}) +endif() + +set(DUMMY_SRC "${RESOURCE_DIR}/dummy.c") +add_custom_command(OUTPUT ${DUMMY_SRC} COMMAND echo "//" > ${DUMMY_SRC}) + +add_library(gltfio_resources_lite ${DUMMY_SRC} ${RESGEN_SOURCE}) + # ================================================================================================== # Build the "core" library (no filamat or pipeline) # ================================================================================================== @@ -141,9 +164,10 @@ if (NOT WEBGL AND NOT ANDROID AND NOT IOS) else() - install(TARGETS gltfio_core gltfio_resources ARCHIVE DESTINATION lib/${DIST_DIR}) + install(TARGETS gltfio_core gltfio_resources gltfio_resources_lite ARCHIVE DESTINATION lib/${DIST_DIR}) install(DIRECTORY ${PUBLIC_HDR_DIR}/gltfio DESTINATION include) install(FILES ${RESOURCE_DIR}/gltfresources.h DESTINATION include/gltfio/resources) + install(FILES ${RESOURCE_DIR}/gltfresources_lite.h DESTINATION include/gltfio/resources) endif() diff --git a/libs/gltfio/src/AssetLoader.cpp b/libs/gltfio/src/AssetLoader.cpp index 16d426ad62..7d7245a35e 100644 --- a/libs/gltfio/src/AssetLoader.cpp +++ b/libs/gltfio/src/AssetLoader.cpp @@ -362,6 +362,11 @@ void FAssetLoader::createRenderable(const cgltf_node* node, Entity entity) { UvMap uvmap {}; bool hasVertexColor = primitiveHasVertexColor(inputPrim); MaterialInstance* mi = createMaterialInstance(inputPrim->material, &uvmap, hasVertexColor); + if (!mi) { + mError = true; + continue; + } + mResult->mDependencyGraph.addEdge(entity, mi); builder.material(index, mi); @@ -868,6 +873,11 @@ MaterialInstance* FAssetLoader::createMaterialInstance(const cgltf_material* inp // This not only creates a material instance, it modifies the material key according to our // rendering constraints. For example, Filament only supports 2 sets of texture coordinates. MaterialInstance* mi = mMaterials->createMaterialInstance(&matkey, uvmap, inputMat->name); + if (!mi) { + slog.e << "No material with the specified requirements exists." << io::endl; + return nullptr; + } + mResult->mMaterialInstances.push_back(mi); if (inputMat->alpha_mode == cgltf_alpha_mode_mask) { diff --git a/libs/gltfio/src/UbershaderLoader.cpp b/libs/gltfio/src/UbershaderLoader.cpp index 8ac495050f..e182a0e141 100644 --- a/libs/gltfio/src/UbershaderLoader.cpp +++ b/libs/gltfio/src/UbershaderLoader.cpp @@ -22,7 +22,11 @@ #include +#if GLTFIO_LITE +#include "gltfresources_lite.h" +#else #include "gltfresources.h" +#endif using namespace filament; using namespace filament::math; @@ -61,10 +65,20 @@ public: filament::Engine* mEngine; }; +#if GLTFIO_LITE + +#define CREATE_MATERIAL(name) Material::Builder() \ + .package(GLTFRESOURCES_LITE_ ## name ## _DATA, GLTFRESOURCES_LITE_ ## name ## _SIZE) \ + .build(*mEngine); + +#else + #define CREATE_MATERIAL(name) Material::Builder() \ .package(GLTFRESOURCES_ ## name ## _DATA, GLTFRESOURCES_ ## name ## _SIZE) \ .build(*mEngine); +#endif + #define MATINDEX(shading, alpha) (int(shading) + 3 * int(alpha)) UbershaderLoader::UbershaderLoader(Engine* engine) : mEngine(engine) { @@ -105,6 +119,7 @@ Material* UbershaderLoader::getMaterial(const MaterialKey& config) const { } switch (matindex) { case MATINDEX(LIT, AlphaMode::OPAQUE): mMaterials[matindex] = CREATE_MATERIAL(LIT_OPAQUE); break; + #if !GLTFIO_LITE case MATINDEX(LIT, AlphaMode::MASK): mMaterials[matindex] = CREATE_MATERIAL(LIT_MASKED); break; case MATINDEX(LIT, AlphaMode::BLEND): mMaterials[matindex] = CREATE_MATERIAL(LIT_FADE); break; case MATINDEX(UNLIT, AlphaMode::OPAQUE): mMaterials[matindex] = CREATE_MATERIAL(UNLIT_OPAQUE); break; @@ -113,6 +128,7 @@ Material* UbershaderLoader::getMaterial(const MaterialKey& config) const { case MATINDEX(SPECULAR_GLOSSINESS, AlphaMode::OPAQUE): mMaterials[matindex] = CREATE_MATERIAL(SPECULARGLOSSINESS_OPAQUE); break; case MATINDEX(SPECULAR_GLOSSINESS, AlphaMode::MASK): mMaterials[matindex] = CREATE_MATERIAL(SPECULARGLOSSINESS_MASKED); break; case MATINDEX(SPECULAR_GLOSSINESS, AlphaMode::BLEND): mMaterials[matindex] = CREATE_MATERIAL(SPECULARGLOSSINESS_FADE); break; + #endif } return mMaterials[matindex]; }