Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
adf1384
Named Value and template support added to standard library. Allowing…
ld-kerley Dec 13, 2024
eb6e338
template the rest of the stdlib
anderslanglands Jun 9, 2025
5b67c7d
do Value: replacement on all attributes on all ports
anderslanglands Jun 9, 2025
ce0675b
various fixes to match output
anderslanglands Jun 9, 2025
4505159
Initial commit of tool to build markdown tables for node specificatio…
ld-kerley May 28, 2025
51fec25
addings spec doc strings for noise
ld-kerley Jun 13, 2025
86fd993
fill out stdlib
anderslanglands Jun 16, 2025
ed9cc0c
pull 'defaultgeomprop' for default and 'enum' for accepted values
anderslanglands Jun 16, 2025
903ea60
add pbrlib and nprlib
anderslanglands Jun 16, 2025
8fe73f7
formatting
anderslanglands Jun 20, 2025
8446ce6
bold generic defaults. get defaultinput where specified
anderslanglands Jun 22, 2025
c89d54f
tweaks to adjustment nodes
anderslanglands Jun 22, 2025
3e72eb7
shorten descs on image ports
anderslanglands Jun 22, 2025
e8b70d6
move texture parameter explanations to text at top of texture nodes s…
anderslanglands Jun 22, 2025
9c5ab4a
replace [ with ```
anderslanglands Jun 22, 2025
238fa95
ignore generated dirs in dev_spec
anderslanglands Jun 22, 2025
3f26ec2
replace conditionals with manual tables for now
anderslanglands Jun 22, 2025
581ff0f
italicize geomprop defaults
anderslanglands Jun 23, 2025
f976a0f
updates
anderslanglands Jun 23, 2025
ecd10d8
remove hrules
anderslanglands Jun 23, 2025
650829e
don't italicize empty default
anderslanglands Jun 23, 2025
8ebafd9
all latest updates:
anderslanglands Sep 7, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,21 @@ jobs:
compiler_version: "14"
python: 3.9

- name: Linux_GCC_14_Python311
- name: Linux_GCC_14_Python311_expand_lib
os: ubuntu-24.04
compiler: gcc
compiler_version: "14"
python: 3.11
test_render: ON
cmake_config: -DMATERIALX_BUILD_EXPAND_TEMPLATE_ELEMS=ON -DMATERIALX_BUILD_BAKE_NAMED_VALUES=ON

- name: Linux_GCC_14_Python311_unexpanded_lib
os: ubuntu-24.04
compiler: gcc
compiler_version: "14"
python: 3.11
test_render: ON
cmake_config: -DMATERIALX_BUILD_EXPAND_TEMPLATE_ELEMS=OFF -DMATERIALX_BUILD_BAKE_NAMED_VALUES=OFF

- name: Linux_GCC_CoverageAnalysis
os: ubuntu-24.04
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
build
dist
dev_spec/dest
dev_spec/nodes
.DS_Store
.cache
166 changes: 48 additions & 118 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ option(MATERIALX_BUILD_BENCHMARK_TESTS "Build benchmark tests." OFF)

option(MATERIALX_BUILD_SHARED_LIBS "Build MaterialX libraries as shared rather than static." OFF)
option(MATERIALX_BUILD_DATA_LIBRARY "Build generated products from the MaterialX data library." OFF)
option(MATERIALX_BUILD_EXPAND_TEMPLATE_ELEMS "Process the data library files at build time to expand any template elements." ON)
option(MATERIALX_BUILD_BAKE_NAMED_VALUES "Process the data library files at build time to bake out the named values." ON)
option(MATERIALX_BUILD_MONOLITHIC "Build a single monolithic MaterialX library." OFF)
option(MATERIALX_BUILD_USE_CCACHE "Enable the use of ccache to speed up build time, if present." ON)
option(MATERIALX_PYTHON_LTO "Enable link-time optimizations for MaterialX Python." ON)
Expand All @@ -68,6 +70,10 @@ if (MATERIALX_BUILD_IOS)
set(CMAKE_SYSTEM_NAME iOS)
endif()

list(APPEND CMAKE_MODULE_PATH
${PROJECT_SOURCE_DIR}/cmake/macros)
include(Public)

# Apple ecosystem cross-compilation
# https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-for-ios-tvos-visionos-or-watchos
set(MATERIALX_BUILD_APPLE_EMBEDDED OFF)
Expand Down Expand Up @@ -306,140 +312,64 @@ else()
endif()
endif()

# Shared functions
function(assign_source_group prefix)
foreach(_source IN ITEMS ${ARGN})
if(IS_ABSOLUTE "${_source}")
file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}")
else()
set(_source_rel "${_source}")
endif()
get_filename_component(_source_path "${_source_rel}" PATH)
string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")
source_group("${prefix}\\${_source_path_msvc}" FILES "${_source}")
endforeach()
endfunction(assign_source_group)

function(mx_add_library MATERIALX_MODULE_NAME)
set(options ADD_OBJECTIVE_C_CODE)
set(oneValueArgs EXPORT_DEFINE)
set(multiValueArgs
SOURCE_FILES
HEADER_FILES
INLINED_FILES
MTLX_MODULES)
cmake_parse_arguments(args
"${options}"
"${oneValueArgs}"
"${multiValueArgs}"
${ARGN})

if (APPLE AND args_ADD_OBJECTIVE_C_CODE)
file(GLOB_RECURSE materialx_source_oc "${CMAKE_CURRENT_SOURCE_DIR}/*.m*")
set_source_files_properties(${materialx_source_oc} PROPERTIES
COMPILE_FLAGS "-x objective-c++")
set(args_SOURCE_FILES ${args_SOURCE_FILES} ${materialx_source_oc})
endif()

assign_source_group("Source Files" ${args_SOURCE_FILES})
assign_source_group("Source Files" ${args_INLINED_FILES})
assign_source_group("Header Files" ${args_HEADER_FILES})

if (NOT MATERIALX_BUILD_MONOLITHIC)
set(TARGET_NAME ${MATERIALX_MODULE_NAME})
add_library(${TARGET_NAME})

# Create version resource
if(MATERIALX_BUILD_SHARED_LIBS AND MSVC)
configure_file(${PROJECT_SOURCE_DIR}/cmake/modules/MaterialXVersion.rc.in ${CMAKE_CURRENT_BINARY_DIR}/version.rc)
target_sources(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/version.rc)
endif()

target_link_libraries(${TARGET_NAME}
PUBLIC
${args_MTLX_MODULES}
${CMAKE_DL_LIBS})

target_include_directories(${TARGET_NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../>
$<INSTALL_INTERFACE:${MATERIALX_INSTALL_INCLUDE_PATH}>
PRIVATE
${EXTERNAL_INCLUDE_DIRS})

set_target_properties(
${TARGET_NAME} PROPERTIES
OUTPUT_NAME ${MATERIALX_MODULE_NAME}${MATERIALX_LIBNAME_SUFFIX}
COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS}"
LINK_FLAGS "${EXTERNAL_LINK_FLAGS}"
INSTALL_RPATH "${MATERIALX_SAME_DIR_RPATH}"
VERSION "${MATERIALX_LIBRARY_VERSION}"
SOVERSION "${MATERIALX_MAJOR_VERSION}")
else()
set(TARGET_NAME ${MATERIALX_MONOLITHIC_TARGET})
add_library(${MATERIALX_MODULE_NAME} ALIAS ${MATERIALX_MONOLITHIC_TARGET})

# Store the aliased MaterialX modules name to create CMake export aliases later.
set_property(GLOBAL APPEND PROPERTY MATERIALX_MODULES ${MATERIALX_MODULE_NAME})
endif()

set_target_properties(${TARGET_NAME} PROPERTIES CXX_VISIBILITY_PRESET hidden)
set_target_properties(${TARGET_NAME} PROPERTIES CMAKE_VISIBILITY_INLINES_HIDDEN 1)

target_sources(${TARGET_NAME}
PRIVATE
${args_SOURCE_FILES}
PUBLIC
FILE_SET
mxHeaders
TYPE
HEADERS
BASE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/..
${CMAKE_CURRENT_BINARY_DIR}/..
FILES
${args_HEADER_FILES}
${args_INLINED_FILES})

target_include_directories(${TARGET_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../>)

target_compile_definitions(${TARGET_NAME} PRIVATE "-D${args_EXPORT_DEFINE}")

if(NOT SKBUILD)
if(NOT MATERIALX_BUILD_MONOLITHIC)
install(TARGETS ${MATERIALX_MODULE_NAME}
EXPORT MaterialX
ARCHIVE DESTINATION ${MATERIALX_INSTALL_LIB_PATH}
LIBRARY DESTINATION ${MATERIALX_INSTALL_LIB_PATH}
RUNTIME DESTINATION bin
FILE_SET mxHeaders DESTINATION ${MATERIALX_INSTALL_INCLUDE_PATH})
endif()

install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${MATERIALX_MODULE_NAME}.pdb"
DESTINATION "${MATERIALX_INSTALL_LIB_PATH}/" OPTIONAL)
endif()

# Pass TARGET_NAME back to call site, so the caller can modify the build target.
set(TARGET_NAME ${TARGET_NAME} PARENT_SCOPE)
endfunction()

# Propagate shared library setting to NanoGUI
if(MATERIALX_BUILD_SHARED_LIBS)
set(BUILD_SHARED_LIBS "ON")
else()
set(BUILD_SHARED_LIBS "OFF")
endif()

# If we're baking the named "Value:" entries - then we have to also expand any
# template elements
if (MATERIALX_BUILD_BAKE_NAMED_VALUES)
set(MATERIALX_BUILD_EXPAND_TEMPLATE_ELEMS ON)
endif()

if (MATERIALX_BUILD_EXPAND_TEMPLATE_ELEMS OR MATERIALX_BUILD_BAKE_NAMED_VALUES)
set(MATERIALX_BUILD_DATA_LIBRARY ON)
endif()

# Build a monolithic target - needs to be added before the other build targets that may be included.
if (MATERIALX_BUILD_MONOLITHIC)
set(MATERIALX_MONOLITHIC_TARGET MaterialX)
add_subdirectory(source)
endif()

message("XXX : MATERIALX_BUILD_BAKE_NAMED_VALUES : ${MATERIALX_BUILD_BAKE_NAMED_VALUES}")
message("XXX : MATERIALX_BUILD_EXPAND_TEMPLATE_ELEMS : ${MATERIALX_BUILD_EXPAND_TEMPLATE_ELEMS}")
message("XXX : MATERIALX_BUILD_DATA_LIBRARY : ${MATERIALX_BUILD_DATA_LIBRARY}")

# Add core subdirectories
add_subdirectory(source/MaterialXCore)
add_subdirectory(source/MaterialXFormat)
if (MATERIALX_BUILD_EXPAND_TEMPLATE_ELEMS OR MATERIALX_BUILD_BAKE_NAMED_VALUES)
if (CMAKE_CROSSCOMPILING)
set(_MaterialXBuildLibrary "${CMAKE_BINARY_DIR}/BUILD_TOOLS/MaterialXBuildLibrary")

add_custom_command(
OUTPUT ${_MaterialXBuildLibrary}
COMMAND ${CMAKE_COMMAND}
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_BINARY_DIR}/BUILD_TOOLS
-DMATERIALX_MAJOR_VERSION=${MATERIALX_MAJOR_VERSION}
-DMATERIALX_MINOR_VERSION=${MATERIALX_MINOR_VERSION}
-DMATERIALX_BUILD_VERSION=${MATERIALX_BUILD_VERSION}
-DMATERIALX_NAMESPACE=${MATERIALX_NAMESPACE}
-DMATERIALX_BUILD_BAKE_NAMED_VALUES=ON
-B"BUILD_TOOLS"
-H"${CMAKE_SOURCE_DIR}/source/MaterialXBuildTools"
COMMAND ${CMAKE_COMMAND} --build BUILD_TOOLS
DEPENDS MaterialXCore MaterialXFormat
)
add_custom_target(MaterialXBuildLibrary ALL
DEPENDS ${_MaterialXBuildLibrary})
else()
set(_MaterialXBuildLibrary MaterialXBuildLibrary)
add_subdirectory(source/MaterialXBuildTools/buildLibrary)
add_subdirectory(source/MaterialXBuildTools/buildDocs)
add_subdirectory(dev_spec)
endif()
endif()

# Add shader generation subdirectories
add_subdirectory(source/MaterialXGenShader)
Expand Down
119 changes: 119 additions & 0 deletions cmake/macros/Public.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# Shared functions need to be extracted to allow them to be shared with the subproject
# in source/MaterialXBuildTools

function(assign_source_group prefix)
foreach(_source IN ITEMS ${ARGN})
if(IS_ABSOLUTE "${_source}")
file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}")
else()
set(_source_rel "${_source}")
endif()
get_filename_component(_source_path "${_source_rel}" PATH)
string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")
source_group("${prefix}\\${_source_path_msvc}" FILES "${_source}")
endforeach()
endfunction(assign_source_group)

function(mx_add_library MATERIALX_MODULE_NAME)
set(options ADD_OBJECTIVE_C_CODE)
set(oneValueArgs EXPORT_DEFINE)
set(multiValueArgs
SOURCE_FILES
HEADER_FILES
INLINED_FILES
MTLX_MODULES)
cmake_parse_arguments(args
"${options}"
"${oneValueArgs}"
"${multiValueArgs}"
${ARGN})

if (APPLE AND args_ADD_OBJECTIVE_C_CODE)
file(GLOB_RECURSE materialx_source_oc "${CMAKE_CURRENT_SOURCE_DIR}/*.m*")
set_source_files_properties(${materialx_source_oc} PROPERTIES
COMPILE_FLAGS "-x objective-c++")
set(args_SOURCE_FILES ${args_SOURCE_FILES} ${materialx_source_oc})
endif()

assign_source_group("Source Files" ${args_SOURCE_FILES})
assign_source_group("Source Files" ${args_INLINED_FILES})
assign_source_group("Header Files" ${args_HEADER_FILES})

if (NOT MATERIALX_BUILD_MONOLITHIC)
set(TARGET_NAME ${MATERIALX_MODULE_NAME})
add_library(${TARGET_NAME})

# Create version resource
if(MATERIALX_BUILD_SHARED_LIBS AND MSVC)
configure_file(${PROJECT_SOURCE_DIR}/cmake/modules/MaterialXVersion.rc.in ${CMAKE_CURRENT_BINARY_DIR}/version.rc)
target_sources(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/version.rc)
endif()

target_link_libraries(${TARGET_NAME}
PUBLIC
${args_MTLX_MODULES}
${CMAKE_DL_LIBS})

target_include_directories(${TARGET_NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../>
$<INSTALL_INTERFACE:${MATERIALX_INSTALL_INCLUDE_PATH}>
PRIVATE
${EXTERNAL_INCLUDE_DIRS})

set_target_properties(
${TARGET_NAME} PROPERTIES
OUTPUT_NAME ${MATERIALX_MODULE_NAME}${MATERIALX_LIBNAME_SUFFIX}
COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS}"
LINK_FLAGS "${EXTERNAL_LINK_FLAGS}"
INSTALL_RPATH "${MATERIALX_SAME_DIR_RPATH}"
VERSION "${MATERIALX_LIBRARY_VERSION}"
SOVERSION "${MATERIALX_MAJOR_VERSION}")
else()
set(TARGET_NAME ${MATERIALX_MONOLITHIC_TARGET})
add_library(${MATERIALX_MODULE_NAME} ALIAS ${MATERIALX_MONOLITHIC_TARGET})

# Store the aliased MaterialX modules name to create CMake export aliases later.
set_property(GLOBAL APPEND PROPERTY MATERIALX_MODULES ${MATERIALX_MODULE_NAME})
endif()

set_target_properties(${TARGET_NAME} PROPERTIES CXX_VISIBILITY_PRESET hidden)
set_target_properties(${TARGET_NAME} PROPERTIES CMAKE_VISIBILITY_INLINES_HIDDEN 1)

target_sources(${TARGET_NAME}
PRIVATE
${args_SOURCE_FILES}
PUBLIC
FILE_SET
mxHeaders
TYPE
HEADERS
BASE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/..
${CMAKE_CURRENT_BINARY_DIR}/..
FILES
${args_HEADER_FILES}
${args_INLINED_FILES})

target_include_directories(${TARGET_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../>)

target_compile_definitions(${TARGET_NAME} PRIVATE "-D${args_EXPORT_DEFINE}")

if(NOT SKBUILD)
if(NOT MATERIALX_BUILD_MONOLITHIC)
install(TARGETS ${MATERIALX_MODULE_NAME}
EXPORT MaterialX
ARCHIVE DESTINATION ${MATERIALX_INSTALL_LIB_PATH}
LIBRARY DESTINATION ${MATERIALX_INSTALL_LIB_PATH}
RUNTIME DESTINATION bin
FILE_SET mxHeaders DESTINATION ${MATERIALX_INSTALL_INCLUDE_PATH})
endif()

install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${MATERIALX_MODULE_NAME}.pdb"
DESTINATION "${MATERIALX_INSTALL_LIB_PATH}/" OPTIONAL)
endif()

# Pass TARGET_NAME back to call site, so the caller can modify the build target.
set(TARGET_NAME ${TARGET_NAME} PARENT_SCOPE)
endfunction()
31 changes: 31 additions & 0 deletions dev_spec/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@


set(MATX_LIBRARIES_DIR ${PROJECT_SOURCE_DIR}/libraries)
set(DOCS_OUTPUT_DIR ${PROJECT_SOURCE_DIR}/dev_spec/nodes)

set(MD_SRC_DIR ${PROJECT_SOURCE_DIR}/dev_spec/source)
set(MD_DEST_DIR ${PROJECT_SOURCE_DIR}/dev_spec/dest)

set(NODE_MD_MANIFEST ${DOCS_OUTPUT_DIR}/_manifest.txt)

file(GLOB_RECURSE MATERIALX_DATA_LIBRARY_MTLX_SOURCE_FILES
LIST_DIRECTORIES false
${MATX_LIBRARIES_DIR}/*.mtlx)

file(GLOB_RECURSE MATERIALX_MD_SOURCE_FILES
LIST_DIRECTORIES false
${MD_SRC_DIR}/*.md)

add_custom_command(
OUTPUT ${NODE_MD_MANIFEST}
COMMAND ${CMAKE_COMMAND} -E make_directory ${DOCS_OUTPUT_DIR}
COMMAND ${CMAKE_COMMAND} -E make_directory ${MD_DEST_DIR}
COMMAND MaterialXBuildDocs --sourceLibraryRoot ${MATX_LIBRARIES_DIR} --destDocRoot ${DOCS_OUTPUT_DIR} --sourceMDRoot ${MD_SRC_DIR} --destMDRoot ${MD_DEST_DIR} --manifestFile ${NODE_MD_MANIFEST}
DEPENDS ${MATERIALX_DATA_LIBRARY_MTLX_SOURCE_FILES} ${MATERIALX_MD_SOURCE_FILES} MaterialXBuildDocs
)

add_custom_target(MaterialXBuildSpecNodeTables ALL
DEPENDS ${NODE_MD_MANIFEST})



Loading
Loading