Skip to content

Commit

Permalink
Merge branch 'dev_1.39' into nodedef_creation_api
Browse files Browse the repository at this point in the history
  • Loading branch information
jstone-lucasfilm authored May 24, 2024
2 parents 41099a1 + e7654d4 commit 616f00e
Show file tree
Hide file tree
Showing 35 changed files with 825 additions and 784 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ jobs:
run: find source \( -name *.h -o -name *.cpp -o -name *.mm -o -name *.inl \) ! -path "*/External/*" ! -path "*/NanoGUI/*" | xargs clang-format -i --verbose

- name: CMake Generate
run: cmake -S . -B build -DMATERIALX_BUILD_PYTHON=ON -DMATERIALX_BUILD_VIEWER=ON -DMATERIALX_BUILD_GRAPH_EDITOR=ON -DMATERIALX_TEST_RENDER=OFF -DMATERIALX_WARNINGS_AS_ERRORS=ON ${{matrix.cmake_config}}
run: cmake -S . -B build -DMATERIALX_BUILD_PYTHON=ON -DMATERIALX_BUILD_VIEWER=ON -DMATERIALX_BUILD_GRAPH_EDITOR=ON -DMATERIALX_BUILD_TESTS=ON -DMATERIALX_TEST_RENDER=OFF -DMATERIALX_WARNINGS_AS_ERRORS=ON ${{matrix.cmake_config}}

- name: CMake Build
run: cmake --build build --target install --config Release --parallel 2
Expand Down
124 changes: 119 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,11 @@ option(MATERIALX_BUILD_GEN_MDL "Build the MDL shader generator back-end." ON)
option(MATERIALX_BUILD_GEN_MSL "Build the MSL shader generator back-end." ON)
option(MATERIALX_BUILD_RENDER "Build the MaterialX Render modules." ON)
option(MATERIALX_BUILD_OIIO "Build OpenImageIO support for MaterialXRender." OFF)
option(MATERIALX_BUILD_TESTS "Build unit tests." ON)
option(MATERIALX_BUILD_TESTS "Build unit tests." OFF)
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_MONOLITHIC "Build a single monolithic MaterialX library." OFF)
option(MATERIALX_PYTHON_LTO "Enable link-time optimizations for MaterialX Python." ON)
option(MATERIALX_INSTALL_PYTHON "Install the MaterialX Python package as a third-party library when the install target is built." ON)
option(MATERIALX_INSTALL_RESOURCES "Install the resources folder when building render modules." ON)
Expand All @@ -61,6 +62,7 @@ option(MATERIALX_BUILD_IOS "Build MaterialX for iOS." OFF)
if (MATERIALX_BUILD_IOS)
set(CMAKE_SYSTEM_NAME iOS)
add_definitions(-DTARGET_OS_IOS=1)
set(MATERIALX_BUILD_MONOLITHIC ON)
set(MATERIALX_BUILD_PYTHON OFF)
set(MATERIALX_BUILD_VIEWER OFF)
set(MATERIALX_BUILD_GRAPH_EDITOR OFF)
Expand All @@ -71,9 +73,6 @@ if (MATERIALX_BUILD_IOS)
endif()

if (MATERIALX_BUILD_JS)
set(MATERIALX_BUILD_GEN_OSL OFF)
set(MATERIALX_BUILD_GEN_MSL OFF)
set(MATERIALX_BUILD_GEN_MDL OFF)
set(MATERIALX_BUILD_RENDER OFF)
set(MATERIALX_BUILD_TESTS OFF)
endif()
Expand Down Expand Up @@ -135,9 +134,9 @@ mark_as_advanced(MATERIALX_BUILD_GEN_MDL)
mark_as_advanced(MATERIALX_BUILD_GEN_MSL)
mark_as_advanced(MATERIALX_BUILD_RENDER)
mark_as_advanced(MATERIALX_BUILD_OIIO)
mark_as_advanced(MATERIALX_BUILD_TESTS)
mark_as_advanced(MATERIALX_BUILD_BENCHMARK_TESTS)
mark_as_advanced(MATERIALX_BUILD_SHARED_LIBS)
mark_as_advanced(MATERIALX_BUILD_MONOLITHIC)
mark_as_advanced(MATERIALX_NAMESPACE_SUFFIX)
mark_as_advanced(MATERIALX_LIBNAME_SUFFIX)
mark_as_advanced(MATERIALX_PYTHON_LTO)
Expand Down Expand Up @@ -267,13 +266,113 @@ function(assign_source_group prefix)
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
LIBRARIES)
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("Header Files" ${args_HEADER_FILES})

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

# Create version resource
if(MATERIALX_BUILD_SHARED_LIBS AND MSVC)
configure_file(${CMAKE_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}
${args_LIBRARIES}
${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})

target_sources(${TARGET_NAME} PRIVATE ${args_SOURCE_FILES})
target_sources(${TARGET_NAME} PRIVATE ${args_HEADER_FILES})

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

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

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

install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/"
DESTINATION ${MATERIALX_INSTALL_INCLUDE_PATH}/${MATERIALX_MODULE_NAME}/ MESSAGE_NEVER
FILES_MATCHING
PATTERN "*.h*"
PATTERN "*.inl")

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

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

# Add core subdirectories
add_subdirectory(source/MaterialXCore)
add_subdirectory(source/MaterialXFormat)
Expand Down Expand Up @@ -359,6 +458,21 @@ if(NOT SKBUILD)
set(MATERIALX_GEN_CONFIG_PATH "${MATERIALX_INSTALL_LIB_PATH}/cmake/${CMAKE_PROJECT_NAME}")

include(CMakePackageConfigHelpers)

if (MATERIALX_BUILD_MONOLITHIC)
# export aliases for the MaterialX modules built in this monolithic build to be
# less disruptive to downstream probjects.
get_property(MATERIALX_MODULES GLOBAL PROPERTY MATERIALX_MODULES)
set(EXPORT_ALIASES "# Aliased targets for the the monolithic build\n")
foreach (MODULE ${MATERIALX_MODULES})
string(APPEND EXPORT_ALIASES "add_library(${MODULE} ALIAS MaterialX)\n")
endforeach ()

if (NOT MATERIALX_MODULES)
message(FATAL_ERROR "Building MaterialX as a monolithic library, but did not find any libraries to alias.")
endif()
endif()

configure_package_config_file(cmake/modules/MaterialXConfig.cmake.in
${CMAKE_BINARY_DIR}/cmake/${CMAKE_PROJECT_NAME}Config.cmake
INSTALL_DESTINATION "${MATERIALX_GEN_CONFIG_PATH}"
Expand Down
2 changes: 2 additions & 0 deletions cmake/modules/MaterialXConfig.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,5 @@ if(@MATERIALX_BUILD_RENDER@ AND @MATERIALX_INSTALL_RESOURCES@)
endif()

check_required_components(@CMAKE_PROJECT_NAME@)

@EXPORT_ALIASES@
83 changes: 0 additions & 83 deletions javascript/MaterialXTest/browser/esslShaderGenerator.spec.js

This file was deleted.

104 changes: 104 additions & 0 deletions javascript/MaterialXTest/browser/shaderGenerator.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
// MaterialX is served through a script tag in the test setup.

function createStandardSurfaceMaterial(mx)
{
const doc = mx.createDocument();
const ssName = 'SR_default';
const ssNode = doc.addChildOfCategory('standard_surface', ssName);
ssNode.setType('surfaceshader');
const smNode = doc.addChildOfCategory('surfacematerial', 'Default');
smNode.setType('material');
const shaderElement = smNode.addInput('surfaceshader');
shaderElement.setType('surfaceshader');
shaderElement.setNodeName(ssName);
expect(doc.validate()).to.be.true;
return doc;
}

describe('Generate Shaders', function ()
{
let mx;
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl2');

this.timeout(60000);

before(async function ()
{
mx = await MaterialX();
});

it('Compile Shaders', () =>
{
const doc = createStandardSurfaceMaterial(mx);

const generators = []
if (typeof mx.EsslShaderGenerator != 'undefined')
generators.push(new mx.EsslShaderGenerator());
if (typeof mx.GlslShaderGenerator != 'undefined')
generators.push(new mx.GlslShaderGenerator());
if (typeof mx.MslShaderGenerator != 'undefined')
generators.push(new mx.MslShaderGenerator());
if (typeof mx.OslShaderGenerator != 'undefined')
generators.push(new mx.OslShaderGenerator());
if (typeof mx.VkShaderGenerator != 'undefined')
generators.push(new mx.VkShaderGenerator());
if (typeof mx.MdlShaderGenerator != 'undefined')
generators.push(new mx.MdlShaderGenerator());

const elem = mx.findRenderableElement(doc);
for (let gen of generators)
{
console.log("Generating shader for " + gen.getTarget() + "...");

const genContext = new mx.GenContext(gen);
const stdlib = mx.loadStandardLibraries(genContext);
doc.importLibrary(stdlib);

try
{
const mxShader = gen.generate(elem.getNamePath(), elem, genContext);

const fShader = mxShader.getSourceCode("pixel");

if (gen.getTarget() == 'essl')
{
const vShader = mxShader.getSourceCode("vertex");

const glVertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(glVertexShader, vShader);
gl.compileShader(glVertexShader);
if (!gl.getShaderParameter(glVertexShader, gl.COMPILE_STATUS))
{
console.error("-------- VERTEX SHADER FAILED TO COMPILE: ----------------");
console.error("--- VERTEX SHADER LOG ---");
console.error(gl.getShaderInfoLog(glVertexShader));
console.error("--- VERTEX SHADER START ---");
console.error(fShader);
console.error("--- VERTEX SHADER END ---");
}
expect(gl.getShaderParameter(glVertexShader, gl.COMPILE_STATUS)).to.equal(true);

const glPixelShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(glPixelShader, fShader);
gl.compileShader(glPixelShader);
if (!gl.getShaderParameter(glPixelShader, gl.COMPILE_STATUS))
{
console.error("-------- PIXEL SHADER FAILED TO COMPILE: ----------------");
console.error("--- PIXEL SHADER LOG ---");
console.error(gl.getShaderInfoLog(glPixelShader));
console.error("--- PIXEL SHADER START ---");
console.error(fShader);
console.error("--- PIXEL SHADER END ---");
}
expect(gl.getShaderParameter(glPixelShader, gl.COMPILE_STATUS)).to.equal(true);
}
}
catch (errPtr)
{
console.error("-------- Failed code generation: ----------------");
console.error(mx.getExceptionMessage(errPtr));
}
}
});
});
1 change: 1 addition & 0 deletions libraries/bxdf/open_pbr_surface.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@
<input name="color" type="color3" nodename="base_color_nonnegative" />
<input name="roughness" type="float" interfacename="base_diffuse_roughness" />
<input name="normal" type="vector3" interfacename="geometry_normal" />
<input name="energy_compensation" type="boolean" value="true" />
</oren_nayar_diffuse_bsdf>
<convert name="subsurface_selector" type="float">
<input name="in" type="boolean" interfacename="geometry_thin_walled" />
Expand Down
Loading

0 comments on commit 616f00e

Please sign in to comment.