File: Open3DAddCompiledMaterials.cmake

package info (click to toggle)
open3d 0.16.1%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 80,688 kB
  • sloc: cpp: 193,088; python: 24,973; ansic: 8,356; javascript: 1,869; sh: 1,473; makefile: 236; xml: 69
file content (69 lines) | stat: -rw-r--r-- 2,604 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# open3d_add_compiled_materials(<target>
#    OUTPUT_DIRECTORY <dir>
#    SOURCES <mat1> [<mat2>...]
# )
#
# Compiles the given materials with the Filament material compiler defined in the FILAMENT_MATC variable and stores them into <dir>.
# The list of full paths to the compiled materials is stored in the COMPILED_MATERIALS property of <target>.
#
# Use add_dependencies(<other_target> <target>) to build the materials before <other_target> is built.
function(open3d_add_compiled_materials target)
    cmake_parse_arguments(PARSE_ARGV 1 ARG "" "OUTPUT_DIRECTORY" "SOURCES")

    # Check correct usage
    if (ARG_UNPARSED_ARGUMENTS)
        message(FATAL_ERROR "Unknown arguments: ${ARG_UNPARSED_ARGUMENTS}")
    endif()

    if (ARG_KEYWORDS_MISSING_VALUES)
        message(FATAL_ERROR "Missing values for arguments: ${ARG_KEYWORDS_MISSING_VALUES}")
    endif()

    if (NOT ARG_OUTPUT_DIRECTORY)
        message(FATAL_ERROR "No output directory for the material files specified.")
    endif()

    if (NOT ARG_SOURCES)
        message(FATAL_ERROR "No material files specified for compilation.")
    endif()

    if (NOT FILAMENT_MATC)
        message(FATAL_ERROR "Filament material compiler FILAMENT_MATC not specified.")
    endif()

    # Determine material compiler flags
    if (IOS OR ANDROID)
        set(FILAMENT_MATC_ARGS "--platform=mobile")
    else()
        set(FILAMENT_MATC_ARGS "--platform=desktop")
    endif()

    get_filename_component(OUTPUT_DIRECTORY_FULL_PATH "${ARG_OUTPUT_DIRECTORY}" ABSOLUTE)

    # Build compiled materials
    foreach (mat IN LISTS ARG_SOURCES)
        get_filename_component(MATERIAL_FULL_PATH "${mat}" ABSOLUTE)

        get_filename_component(MATERIAL_NAME "${mat}" NAME_WE)
        set(COMPILED_MATERIAL_FULL_PATH "${OUTPUT_DIRECTORY_FULL_PATH}/${MATERIAL_NAME}.filamat")

        file(RELATIVE_PATH COMPILED_MATERIAL_RELATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}" "${COMPILED_MATERIAL_FULL_PATH}")

        add_custom_command(
            OUTPUT ${COMPILED_MATERIAL_FULL_PATH}
            COMMAND ${FILAMENT_MATC} ${FILAMENT_MATC_ARGS} -o ${COMPILED_MATERIAL_FULL_PATH} ${MATERIAL_FULL_PATH}
            COMMENT "Building Material object ${COMPILED_MATERIAL_RELATIVE_PATH}"
            MAIN_DEPENDENCY ${mat} DEPENDS Open3D::3rdparty_filament
            VERBATIM
        )

        list(APPEND COMPILED_MATERIALS "${COMPILED_MATERIAL_FULL_PATH}")
    endforeach()

    add_custom_target(${target} ALL
        DEPENDS ${COMPILED_MATERIALS}
    )

    set_target_properties(${target} PROPERTIES COMPILED_MATERIALS "${COMPILED_MATERIALS}")

endfunction()