Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
26 changes: 24 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ option(MATERIALX_BUILD_DOCS "Create HTML documentation using Doxygen. Requires t

option(MATERIALX_BUILD_GEN_GLSL "Build the GLSL shader generator back-end." ON)
option(MATERIALX_BUILD_GEN_OSL "Build the OSL shader generator back-end." ON)
option(MATERIALX_BUILD_GEN_OSL_NODES "Build the OSL nodes shader generator back-end." ON)
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)
Expand Down Expand Up @@ -84,6 +85,7 @@ if (CMAKE_SYSTEM_NAME MATCHES "iOS" OR CMAKE_SYSTEM_NAME MATCHES "tvOS" OR CMAKE
set(MATERIALX_BUILD_GRAPH_EDITOR OFF)
set(MATERIALX_BUILD_GEN_GLSL OFF)
set(MATERIALX_BUILD_GEN_OSL OFF)
set(MATERIALX_BUILD_GEN_OSL_NODES OFF)
set(MATERIALX_BUILD_GEN_MDL OFF)
set(MATERIALX_BUILD_TESTS OFF)
endif()
Expand All @@ -103,6 +105,7 @@ if (MATERIALX_BUILD_APPLE_FRAMEWORK)
endif()

if (MATERIALX_BUILD_JS)
set(MATERIALX_BUILD_GEN_OSL_NODES OFF)
set(MATERIALX_BUILD_RENDER OFF)
set(MATERIALX_BUILD_TESTS OFF)
endif()
Expand Down Expand Up @@ -136,6 +139,12 @@ if(SKBUILD)
set(MATERIALX_PYTHON_FOLDER_NAME "MaterialX")
endif()

if (MATERIALX_BUILD_GEN_OSL_NODES)
set(MATERIALX_BUILD_GEN_OSL ON)
set(MATERIALX_BUILD_RENDER ON)
set(MATERIALX_BUILD_RENDER_PLATFORMS ON)
endif()

# Helpers for MDL validation
if (MATERIALX_BUILD_GEN_MDL)
set(MATERIALX_MDLC_EXECUTABLE "" CACHE FILEPATH "Full path to the mdlc binary.")
Expand All @@ -162,6 +171,7 @@ set(MATERIALX_LIBNAME_SUFFIX "" CACHE STRING "Specify a suffix to all libraries
mark_as_advanced(MATERIALX_BUILD_DOCS)
mark_as_advanced(MATERIALX_BUILD_GEN_GLSL)
mark_as_advanced(MATERIALX_BUILD_GEN_OSL)
mark_as_advanced(MATERIALX_BUILD_GEN_OSL_NODES)
mark_as_advanced(MATERIALX_BUILD_GEN_MDL)
mark_as_advanced(MATERIALX_BUILD_GEN_MSL)
mark_as_advanced(MATERIALX_BUILD_RENDER)
Expand Down Expand Up @@ -215,7 +225,7 @@ endif()

# Allow the OSL CMake package to provide binary locations for render tests.
# This will not override explicitly provided oslc, testrender, and include paths.
if(MATERIALX_BUILD_RENDER AND MATERIALX_BUILD_GEN_OSL AND MATERIALX_BUILD_TESTS)
if((MATERIALX_BUILD_RENDER AND MATERIALX_BUILD_GEN_OSL AND MATERIALX_BUILD_TESTS) OR MATERIALX_BUILD_GEN_OSL_NODES)
find_package(OSL QUIET)
if(OSL_FOUND)
if(NOT MATERIALX_OSL_BINARY_OSLC)
Expand All @@ -225,6 +235,10 @@ if(MATERIALX_BUILD_RENDER AND MATERIALX_BUILD_GEN_OSL AND MATERIALX_BUILD_TESTS)
# OSL does not yet export a CMake target for testrender.
set(MATERIALX_OSL_BINARY_TESTRENDER $<TARGET_FILE_DIR:OSL::oslc>/testrender)
endif()
if(NOT MATERIALX_OSL_INCLUDE_PATH)
# OSL does not yet export a CMake target for testrender.
set(MATERIALX_OSL_INCLUDE_PATH $<TARGET_FILE_DIR:OSL::oslc>/../include)
endif()
endif()
endif()

Expand All @@ -244,6 +258,10 @@ if (MATERIALX_BUILD_GEN_MDL)
add_definitions(-DMATERIALX_INSTALL_MDL_MODULE_PATH=\"${MATERIALX_INSTALL_MDL_MODULE_PATH}\")
endif()

if (MATERIALX_BUILD_GEN_OSL_NODES)
set(MATERIALX_BUILD_DATA_LIBRARY ON)
endif()

# Adjust the default installation path
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX "${PROJECT_BINARY_DIR}/installed" CACHE PATH "Default install path" FORCE)
Expand Down Expand Up @@ -449,7 +467,7 @@ add_subdirectory(source/MaterialXFormat)

# Add shader generation subdirectories
add_subdirectory(source/MaterialXGenShader)
if(MATERIALX_BUILD_GEN_GLSL OR MATERIALX_BUILD_GEN_OSL OR MATERIALX_BUILD_GEN_MDL OR MATERIALX_BUILD_GEN_MSL)
if(MATERIALX_BUILD_GEN_GLSL OR MATERIALX_BUILD_GEN_OSL OR MATERIALX_BUILD_GEN_OSL_NODES OR MATERIALX_BUILD_GEN_MDL OR MATERIALX_BUILD_GEN_MSL)
if (MATERIALX_BUILD_GEN_GLSL)
add_definitions(-DMATERIALX_BUILD_GEN_GLSL)
add_subdirectory(source/MaterialXGenGlsl)
Expand All @@ -458,6 +476,10 @@ if(MATERIALX_BUILD_GEN_GLSL OR MATERIALX_BUILD_GEN_OSL OR MATERIALX_BUILD_GEN_MD
add_definitions(-DMATERIALX_BUILD_GEN_OSL)
add_subdirectory(source/MaterialXGenOsl)
endif()
if (MATERIALX_BUILD_GEN_OSL_NODES)
add_definitions(-DMATERIALX_BUILD_GEN_OSL_NODES)
add_subdirectory(source/MaterialXGenOslNodes)
endif()
if (MATERIALX_BUILD_GEN_MDL)
add_definitions(-DMATERIALX_BUILD_GEN_MDL)
add_subdirectory(source/MaterialXGenMdl)
Expand Down
27 changes: 27 additions & 0 deletions libraries/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,33 @@ if(MATERIALX_BUILD_DATA_LIBRARY)
add_custom_target(MaterialXBuildData ALL
DEPENDS ${MATERIALX_DATA_LIBRARY_BUILD_FILES})

if (MATERIALX_BUILD_GEN_OSL_NODES AND MATERIALX_OSL_BINARY_OSLC)

set(OSO_BUILD_PATH ${CMAKE_CURRENT_BINARY_DIR}/DataLibraryBuild/targets/genoslnodes/osos)
set(MTLX_BUILD_PATH ${CMAKE_CURRENT_BINARY_DIR}/DataLibraryBuild/targets/genoslnodes)

set(SENTINEL_FILE ${CMAKE_CURRENT_BINARY_DIR}/buildosos.sentinel)

add_custom_command(
OUTPUT ${SENTINEL_FILE}
COMMAND touch ${SENTINEL_FILE}
COMMAND cmake -E make_directory ${OSO_BUILD_PATH}
COMMAND cmake -E make_directory ${MTLX_BUILD_PATH}
COMMAND MaterialXGenOslNodes_LibsToOso
--outputOsoPath ${OSO_BUILD_PATH}
--outputMtlxPath ${MTLX_BUILD_PATH}
--oslCompilerPath ${MATERIALX_OSL_BINARY_OSLC}
--oslIncludePath ${MATERIALX_OSL_INCLUDE_PATH}
--libraryRelativeOsoPath libraries/targets/genoslnodes/osos
--removeNdPrefix true
DEPENDS ${MATERIALX_DATA_LIBRARY_SOURCE_FILES} MaterialXGenOslNodes_LibsToOso
)

add_custom_target(MaterialXBuild_genoslnodes_buildOsos ALL DEPENDS ${SENTINEL_FILE})
add_dependencies(MaterialXBuildData MaterialXBuild_genoslnodes_buildOsos)

endif()

set(DATA_LIBRARY_DIR ${DATA_LIBRARY_BUILD_DIR})
else()
set(DATA_LIBRARY_DIR ${CMAKE_CURRENT_SOURCE_DIR})
Expand Down
14 changes: 14 additions & 0 deletions libraries/targets/genoslnodes.mtlx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0"?>
<materialx version="1.39">

<!--
Copyright Contributors to the MaterialX Project
SPDX-License-Identifier: Apache-2.0
-->

<!-- ======================================================================== -->
<!-- Base target definition for OSL targets using shader generation. -->
<!-- ======================================================================== -->
<targetdef name="genoslnodes" />

</materialx>
2 changes: 2 additions & 0 deletions python/Scripts/generateshader.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ def main():
gentarget = opts.target
if gentarget == 'osl':
shadergen = mx_gen_osl.OslShaderGenerator.create()
if gentarget == 'oslnodes':
shadergen = mx_gen_osl.OslNodeShaderGenerator.create()
elif gentarget == 'mdl':
shadergen = mx_gen_mdl.MdlShaderGenerator.create()
elif gentarget == 'essl':
Expand Down
2 changes: 1 addition & 1 deletion resources/Materials/TestSuite/_options.mtlx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

<!-- Comma separated list of target" specifiers to indicate which
code generators to use. -->
<input name="targets" type="string" value="genglsl,genosl,genmdl,genessl,genmsl" />
<input name="targets" type="string" value="genglsl,genosl,genoslnodes,genmdl,genessl,genmsl" />

<!-- Check the count of number of implementations used for a given generator -->
<input name="checkImplCount" type="boolean" value="true" />
Expand Down
4 changes: 3 additions & 1 deletion source/MaterialXGenOsl/OslShaderGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,9 @@ ShaderPtr OslShaderGenerator::createShader(const string& name, ElementPtr elemen
const auto& outputSockets = graph->getOutputSockets();
const auto* singleOutput = outputSockets.size() == 1 ? outputSockets[0] : NULL;

const bool isSurfaceShaderOutput = singleOutput && singleOutput->getType() == Type::SURFACESHADER;
const bool isSurfaceShaderOutput = context.getOptions().oslImplicitSurfaceShaderConversion
&& singleOutput && singleOutput->getType() == Type::SURFACESHADER;

if (isSurfaceShaderOutput)
{
graph->inlineNodeBeforeOutput(outputSockets[0], "_surfacematerial_", "ND_surfacematerial", "surfaceshader", "out", context);
Expand Down
46 changes: 46 additions & 0 deletions source/MaterialXGenOslNodes/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
file(GLOB_RECURSE materialx_source
"${CMAKE_CURRENT_SOURCE_DIR}/OslNodesShaderGenerator.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/OslNodesSyntax.cpp"
)
file(GLOB_RECURSE materialx_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h*")

mx_add_library(MaterialXGenOslNodes
SOURCE_FILES
${materialx_source}
HEADER_FILES
${materialx_headers}
MTLX_MODULES
MaterialXGenShader
MaterialXCore
EXPORT_DEFINE
MATERIALX_GENOSLNODES_EXPORTS)


file(GLOB GenNodes_SRC "${CMAKE_CURRENT_SOURCE_DIR}/LibsToOso.cpp")

set(MATERIALX_LIBRARIES
MaterialXCore
MaterialXFormat
MaterialXGenShader
MaterialXGenOsl
MaterialXRenderOsl)

add_executable(MaterialXGenOslNodes_LibsToOso ${GenNodes_SRC})

target_link_libraries(
MaterialXGenOslNodes_LibsToOso
${MATERIALX_LIBRARIES})

set_target_properties(
MaterialXGenOslNodes_LibsToOso PROPERTIES
INSTALL_RPATH "${MATERIALX_UP_ONE_RPATH}")

# TODO: We likely want to install that file elsewhere and not under `bin`,
# if at all, as we maybe want to keep this executable available at build time only.
install(TARGETS MaterialXGenOslNodes_LibsToOso
EXPORT MaterialX
RUNTIME DESTINATION ${MATERIALX_INSTALL_BIN_PATH})
if(MSVC)
install(FILES $<TARGET_PDB_FILE:MaterialXGenOslNodes_LibsToOso>
DESTINATION ${MATERIALX_INSTALL_BIN_PATH} OPTIONAL)
endif()
22 changes: 22 additions & 0 deletions source/MaterialXGenOslNodes/Export.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//
// Copyright Contributors to the MaterialX Project
// SPDX-License-Identifier: Apache-2.0
//

#ifndef MATERIALX_GENOSLNODES_EXPORT_H
#define MATERIALX_GENOSLNODES_EXPORT_H

#include <MaterialXCore/Library.h>

/// @file
/// Macros for declaring imported and exported symbols.

#if defined(MATERIALX_GENOSLNODES_EXPORTS)
#define MX_GENOSLNODES_API MATERIALX_SYMBOL_EXPORT
#define MX_GENOSLNODES_EXTERN_TEMPLATE(...) MATERIALX_EXPORT_EXTERN_TEMPLATE(__VA_ARGS__)
#else
#define MX_GENOSLNODES_API MATERIALX_SYMBOL_IMPORT
#define MX_GENOSLNODES_EXTERN_TEMPLATE(...) MATERIALX_IMPORT_EXTERN_TEMPLATE(__VA_ARGS__)
#endif

#endif
Loading