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.
This commit is contained in:
Philip Rideout
2020-02-14 15:15:25 -08:00
parent a9bbc6d3c4
commit b9c857130a
4 changed files with 68 additions and 15 deletions

View File

@@ -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)

View File

@@ -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()

View File

@@ -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) {

View File

@@ -22,7 +22,11 @@
#include <math/mat4.h>
#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];
}