Skip to content

Commit 5133fcf

Browse files
committed
Named Constants and template support added to standard library
Allowing for significant reduction in the size of the source for the standard library Templates can be nested and replace multiple variables simultaneously Templates can be expanded and diff in cmake stage - allowing for easy validation of appropriate template expansion Leaves the libraries folder untouched for now, to facilitate easier hands on experimentation with the new grammar Also includes documentation building tools - which have been the proving ground for the new template grammar. Builds specification docs to a temporary folder (for now) from a new template location - again for easy validation that the expansion is correct. The documentation work was critical to ensuring this initial template system is fully featured enough to be useful, and uncovered a number of discrepancies with the human edited specification. This is one of the strong advantages of using a template expansion based system.
1 parent 0cf8916 commit 5133fcf

File tree

299 files changed

+30016
-393
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

299 files changed

+30016
-393
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
build
22
dist
33
.DS_Store
4+
.cache
5+
6+
# temporary addition while we're iterating on building the specification from source
7+
documents/SpecificationBuild
8+

CMakeLists.txt

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ project(MaterialX VERSION ${MATERIALX_LIBRARY_VERSION})
3636
option(MATERIALX_BUILD_PYTHON "Build the MaterialX Python package from C++ bindings. Requires Python 3.9 or greater." OFF)
3737
option(MATERIALX_BUILD_VIEWER "Build the MaterialX Viewer." OFF)
3838
option(MATERIALX_BUILD_GRAPH_EDITOR "Build the MaterialX Graph Editor." OFF)
39-
option(MATERIALX_BUILD_DOCS "Create HTML documentation using Doxygen. Requires that Doxygen be installed." OFF)
39+
option(MATERIALX_BUILD_DOCS "(deprecated) use MATERIALX_BUILD_DOXYGEN_DOCS." OFF)
40+
option(MATERIALX_BUILD_DOXYGEN_DOCS "Create HTML documentation using Doxygen. Requires that Doxygen be installed." OFF)
41+
option(MATERIALX_BUILD_SPECIFICATION_DOCS "Create Specification documentation, using the data library templates." OFF)
4042

4143
option(MATERIALX_BUILD_GEN_GLSL "Build the GLSL shader generator back-end." ON)
4244
option(MATERIALX_BUILD_GEN_OSL "Build the OSL shader generator back-end." ON)
@@ -51,6 +53,8 @@ option(MATERIALX_BUILD_BENCHMARK_TESTS "Build benchmark tests." OFF)
5153

5254
option(MATERIALX_BUILD_SHARED_LIBS "Build MaterialX libraries as shared rather than static." OFF)
5355
option(MATERIALX_BUILD_DATA_LIBRARY "Build generated products from the MaterialX data library." OFF)
56+
option(MATERIALX_BUILD_EXPAND_TEMPLATE_ELEMS "Process the data library files at build time to expand any template elements." ON)
57+
option(MATERIALX_BUILD_BAKE_NAMED_VALUES "Process the data library files at build time to bake out the named values." ON)
5458
option(MATERIALX_BUILD_MONOLITHIC "Build a single monolithic MaterialX library." OFF)
5559
option(MATERIALX_BUILD_USE_CCACHE "Enable the use of ccache to speed up build time, if present." ON)
5660
option(MATERIALX_PYTHON_LTO "Enable link-time optimizations for MaterialX Python." ON)
@@ -107,6 +111,11 @@ if (MATERIALX_BUILD_JS)
107111
set(MATERIALX_BUILD_TESTS OFF)
108112
endif()
109113

114+
# to maintain legacy cmake argument
115+
if (MATERIALX_BUILD_DOCS)
116+
set(MATERIALX_BUILD_DOXYGEN_DOCS ON)
117+
endif()
118+
110119
# All hardware shading languages currently depend on the GLSL shader generator.
111120
if(MATERIALX_BUILD_GEN_MSL)
112121
set(MATERIALX_BUILD_GEN_GLSL ON)
@@ -437,6 +446,16 @@ else()
437446
set(BUILD_SHARED_LIBS "OFF")
438447
endif()
439448

449+
# If we're baking the named "Constant:" entries - then we have to also expand any
450+
# template elements
451+
if (MATERIALX_BUILD_BAKE_NAMED_VALUES)
452+
set(MATERIALX_BUILD_EXPAND_TEMPLATE_ELEMS ON)
453+
endif()
454+
455+
if (MATERIALX_BUILD_EXPAND_TEMPLATE_ELEMS OR MATERIALX_BUILD_BAKE_NAMED_VALUES)
456+
set(MATERIALX_BUILD_DATA_LIBRARY ON)
457+
endif()
458+
440459
# Build a monolithic target - needs to be added before the other build targets that may be included.
441460
if (MATERIALX_BUILD_MONOLITHIC)
442461
set(MATERIALX_MONOLITHIC_TARGET MaterialX)
@@ -446,6 +465,32 @@ endif()
446465
# Add core subdirectories
447466
add_subdirectory(source/MaterialXCore)
448467
add_subdirectory(source/MaterialXFormat)
468+
if (MATERIALX_BUILD_EXPAND_TEMPLATE_ELEMS OR MATERIALX_BUILD_BAKE_NAMED_VALUES)
469+
if (CMAKE_CROSSCOMPILING)
470+
set(_MaterialXBuildLibrary "${CMAKE_BINARY_DIR}/BUILD_TOOLS/MaterialXBuildLibrary")
471+
472+
add_custom_command(
473+
OUTPUT ${_MaterialXBuildLibrary}
474+
COMMAND ${CMAKE_COMMAND}
475+
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
476+
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_BINARY_DIR}/BUILD_TOOLS
477+
-DMATERIALX_MAJOR_VERSION=${MATERIALX_MAJOR_VERSION}
478+
-DMATERIALX_MINOR_VERSION=${MATERIALX_MINOR_VERSION}
479+
-DMATERIALX_BUILD_VERSION=${MATERIALX_BUILD_VERSION}
480+
-DMATERIALX_NAMESPACE=${MATERIALX_NAMESPACE}
481+
-DMATERIALX_BUILD_BAKE_NAMED_VALUES=ON
482+
-B"BUILD_TOOLS"
483+
-H"${CMAKE_SOURCE_DIR}/source/MaterialXBuildTools"
484+
COMMAND ${CMAKE_COMMAND} --build BUILD_TOOLS
485+
DEPENDS MaterialXCore MaterialXFormat
486+
)
487+
add_custom_target(MaterialXBuildLibrary ALL
488+
DEPENDS ${_MaterialXBuildLibrary})
489+
else()
490+
set(_MaterialXBuildLibrary MaterialXBuildLibrary)
491+
add_subdirectory(source/MaterialXBuildTools/buildLibrary)
492+
endif()
493+
endif()
449494

450495
# Add shader generation subdirectories
451496
add_subdirectory(source/MaterialXGenShader)
@@ -467,6 +512,7 @@ if(MATERIALX_BUILD_GEN_GLSL OR MATERIALX_BUILD_GEN_OSL OR MATERIALX_BUILD_GEN_MD
467512
add_subdirectory(source/MaterialXGenMsl)
468513
endif()
469514
add_subdirectory(libraries)
515+
add_subdirectory(templates)
470516
endif()
471517

472518
# Add rendering and viewer subdirectories
@@ -511,8 +557,11 @@ if(MATERIALX_BUILD_PYTHON)
511557
add_subdirectory(python)
512558
endif()
513559

514-
if(MATERIALX_BUILD_DOCS)
560+
if(MATERIALX_BUILD_DOXYGEN_DOCS OR MATERIALX_BUILD_SPECIFICATION_DOCS)
515561
add_subdirectory(documents)
562+
if (MATERIALX_BUILD_SPECIFICATION_DOCS)
563+
add_subdirectory(source/MaterialXBuildTools/buildDocs)
564+
endif()
516565
endif()
517566

518567
if(MATERIALX_BUILD_JS)

documents/CMakeLists.txt

Lines changed: 81 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,81 @@
1-
set(DOXYGEN_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
2-
set(DOXYGEN_HTML_OUTPUT_DIR ${DOXYGEN_OUTPUT_DIR}/html)
3-
set(DOXYGEN_INPUT_LIST ${CMAKE_CURRENT_BINARY_DIR}/MainPage.md)
4-
5-
set(MATERIALX_DOXYGEN_SOURCE_FOLDERS
6-
${PROJECT_SOURCE_DIR}/source/MaterialXCore
7-
${PROJECT_SOURCE_DIR}/source/MaterialXFormat
8-
${PROJECT_SOURCE_DIR}/source/MaterialXGenShader
9-
${PROJECT_SOURCE_DIR}/source/MaterialXGenShader/Nodes
10-
${PROJECT_SOURCE_DIR}/source/MaterialXGenGlsl
11-
${PROJECT_SOURCE_DIR}/source/MaterialXGenGlsl/Nodes
12-
${PROJECT_SOURCE_DIR}/source/MaterialXGenOsl
13-
${PROJECT_SOURCE_DIR}/source/MaterialXGenMdl
14-
${PROJECT_SOURCE_DIR}/source/MaterialXRender
15-
${PROJECT_SOURCE_DIR}/source/MaterialXRenderHw
16-
${PROJECT_SOURCE_DIR}/source/MaterialXRenderGlsl
17-
${PROJECT_SOURCE_DIR}/source/MaterialXRenderOsl)
18-
19-
find_package(Doxygen REQUIRED)
20-
21-
foreach(FOLDER ${MATERIALX_DOXYGEN_SOURCE_FOLDERS})
22-
file(GLOB FOLDER_HEADERS ${FOLDER}/*.h)
23-
list(APPEND DOXYGEN_INPUT_LIST ${FOLDER_HEADERS})
24-
endforeach()
25-
26-
string (REPLACE ";" " " DOXYGEN_INPUT_STR "${DOXYGEN_INPUT_LIST}")
27-
28-
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
29-
30-
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/MainPage.md
31-
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/DeveloperGuide/MainPage.md ${CMAKE_CURRENT_BINARY_DIR}
32-
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
33-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/DeveloperGuide/MainPage.md)
34-
35-
add_custom_command(OUTPUT ${DOXYGEN_HTML_OUTPUT_DIR}/index.html
36-
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/DoxygenAwesome ${CMAKE_CURRENT_BINARY_DIR}
37-
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/Images ${CMAKE_CURRENT_BINARY_DIR}
38-
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
39-
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
40-
DEPENDS ${DOXYGEN_INPUT_LIST} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
41-
COMMENT "Generating HTML documentation: ${DOXYGEN_HTML_OUTPUT_DIR}/index.html")
42-
add_custom_target(MaterialXDocs ALL DEPENDS ${DOXYGEN_HTML_OUTPUT_DIR}/index.html)
43-
44-
install(DIRECTORY ${DOXYGEN_HTML_OUTPUT_DIR}
45-
DESTINATION "documents" MESSAGE_NEVER)
1+
2+
if (MATERIALX_BUILD_DOXYGEN_DOCS)
3+
4+
set(DOXYGEN_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
5+
set(DOXYGEN_HTML_OUTPUT_DIR ${DOXYGEN_OUTPUT_DIR}/html)
6+
set(DOXYGEN_INPUT_LIST ${CMAKE_CURRENT_BINARY_DIR}/MainPage.md)
7+
8+
set(MATERIALX_DOXYGEN_SOURCE_FOLDERS
9+
${PROJECT_SOURCE_DIR}/source/MaterialXCore
10+
${PROJECT_SOURCE_DIR}/source/MaterialXFormat
11+
${PROJECT_SOURCE_DIR}/source/MaterialXGenShader
12+
${PROJECT_SOURCE_DIR}/source/MaterialXGenShader/Nodes
13+
${PROJECT_SOURCE_DIR}/source/MaterialXGenGlsl
14+
${PROJECT_SOURCE_DIR}/source/MaterialXGenGlsl/Nodes
15+
${PROJECT_SOURCE_DIR}/source/MaterialXGenOsl
16+
${PROJECT_SOURCE_DIR}/source/MaterialXGenMdl
17+
${PROJECT_SOURCE_DIR}/source/MaterialXRender
18+
${PROJECT_SOURCE_DIR}/source/MaterialXRenderHw
19+
${PROJECT_SOURCE_DIR}/source/MaterialXRenderGlsl
20+
${PROJECT_SOURCE_DIR}/source/MaterialXRenderOsl)
21+
22+
find_package(Doxygen REQUIRED)
23+
24+
foreach(FOLDER ${MATERIALX_DOXYGEN_SOURCE_FOLDERS})
25+
file(GLOB FOLDER_HEADERS ${FOLDER}/*.h)
26+
list(APPEND DOXYGEN_INPUT_LIST ${FOLDER_HEADERS})
27+
endforeach()
28+
29+
string (REPLACE ";" " " DOXYGEN_INPUT_STR "${DOXYGEN_INPUT_LIST}")
30+
31+
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
32+
33+
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/MainPage.md
34+
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/DeveloperGuide/MainPage.md ${CMAKE_CURRENT_BINARY_DIR}
35+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
36+
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/DeveloperGuide/MainPage.md)
37+
38+
add_custom_command(OUTPUT ${DOXYGEN_HTML_OUTPUT_DIR}/index.html
39+
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/DoxygenAwesome ${CMAKE_CURRENT_BINARY_DIR}
40+
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/Images ${CMAKE_CURRENT_BINARY_DIR}
41+
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
42+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
43+
DEPENDS ${DOXYGEN_INPUT_LIST} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
44+
COMMENT "Generating HTML documentation: ${DOXYGEN_HTML_OUTPUT_DIR}/index.html")
45+
add_custom_target(MaterialXDocs ALL DEPENDS ${DOXYGEN_HTML_OUTPUT_DIR}/index.html)
46+
47+
install(DIRECTORY ${DOXYGEN_HTML_OUTPUT_DIR}
48+
DESTINATION "documents" MESSAGE_NEVER)
49+
endif()
50+
51+
52+
if (MATERIALX_BUILD_SPECIFICATION_DOCS)
53+
set(MATERIALX_DATA_LIBRARY_TEMPLATE_DIR ${PROJECT_SOURCE_DIR}/templates)
54+
set(MATERIALX_SPECIFICATION_TEMPLATE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/SpecificationTemplates)
55+
#Ulitmately we may decide to move this directly to ${CMAKE_CURRENT_SOURCE_DIR}/Specification
56+
set(MATERIALX_SPECIFICATION_DEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/SpecificationBuild)
57+
58+
set(DOCS_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/nodes)
59+
set(NODE_MD_MANIFEST ${DOCS_OUTPUT_DIR}/_manifest.txt)
60+
61+
file(GLOB_RECURSE MATERIALX_DATA_LIBRARY_MTLX_SOURCE_FILES
62+
LIST_DIRECTORIES false
63+
${MATERIALX_DATA_LIBRARY_TEMPLATE_DIR}/*.mtlx)
64+
65+
file(GLOB_RECURSE MATERIALX_MD_SOURCE_FILES
66+
LIST_DIRECTORIES false
67+
${MATERIALX_SPECIFICATION_TEMPLATE_SOURCE_DIR}/*.template.md)
68+
69+
add_custom_command(
70+
OUTPUT ${NODE_MD_MANIFEST}
71+
COMMAND ${CMAKE_COMMAND} -E make_directory ${DOCS_OUTPUT_DIR}
72+
COMMAND ${CMAKE_COMMAND} -E make_directory ${MATERIALX_SPECIFICATION_DEST_DIR}
73+
COMMAND MaterialXBuildDocs --sourceLibraryRoot ${MATERIALX_DATA_LIBRARY_TEMPLATE_DIR} --destDocRoot ${DOCS_OUTPUT_DIR} --sourceMDRoot ${MATERIALX_SPECIFICATION_TEMPLATE_SOURCE_DIR} --destMDRoot ${MATERIALX_SPECIFICATION_DEST_DIR} --manifestFile ${NODE_MD_MANIFEST}
74+
DEPENDS ${MATERIALX_DATA_LIBRARY_MTLX_SOURCE_FILES} ${MATERIALX_MD_SOURCE_FILES} MaterialXBuildDocs
75+
)
76+
77+
add_custom_target(MaterialXBuildSpecificationDocs ALL
78+
DEPENDS ${NODE_MD_MANIFEST})
79+
80+
endif()
81+

0 commit comments

Comments
 (0)