From deaf7e0e5dc9572387ea7f291a78f963bbe06af2 Mon Sep 17 00:00:00 2001 From: dunkels Date: Wed, 12 May 2021 10:38:07 +0200 Subject: [PATCH 01/33] Updated JsNode to JsValue --- source/JsMaterialX/JsMaterialXCore/JsNode.cpp | 18 ++ .../JsMaterialXCore/JsProperty.cpp | 45 +++-- .../JsMaterialXCore/JsTraversal.cpp | 14 +- .../JsMaterialX/JsMaterialXCore/JsTypes.cpp | 172 ++++++++---------- source/JsMaterialX/JsMaterialXCore/JsTypes.js | 32 ++-- source/JsMaterialX/JsMaterialXCore/JsUnit.cpp | 31 ++-- source/JsMaterialX/JsMaterialXCore/JsUtil.cpp | 35 +--- source/JsMaterialX/JsMaterialXCore/JsUtil.js | 16 +- .../JsMaterialX/JsMaterialXCore/JsValue.cpp | 84 ++++++--- source/JsMaterialX/JsMaterialXCore/JsValue.js | 30 +-- source/JsMaterialX/initMaterialX.js | 9 +- source/JsMaterialX/test/basics.spec.js | 24 +-- 12 files changed, 276 insertions(+), 234 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsNode.cpp b/source/JsMaterialX/JsMaterialXCore/JsNode.cpp index f457c77713..6d7ae311c9 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsNode.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsNode.cpp @@ -18,9 +18,17 @@ extern "C" .function("getConnectedNode", &mx::Node::getConnectedNode) .function("setConnectedNodeName", &mx::Node::setConnectedNodeName) .function("getConnectedNodeName", &mx::Node::getConnectedNodeName) + .function("setConnectedOutput", &mx::Node::setConnectedOutput) + .function("getConnectedOutput", &mx::Node::getConnectedOutput) .function("getNodeDef", &mx::Node::getNodeDef) .function("getImplementation", &mx::Node::getImplementation) + .function("getUpstreamEdge", &mx::Node::getUpstreamEdge) + .function("getUpstreamEdgeCount", &mx::Node::getUpstreamEdgeCount) + .function("getNodeDefOutput", &mx::Node::getNodeDefOutput) .function("getDownstreamPorts", &mx::Node::getDownstreamPorts) + .function("getDeclaration", &mx::Node::getDeclaration) + .function("addInputFromNodeDef", &mx::Node::addInputFromNodeDef) + .function("validate", &mx::Node::validate, ems::allow_raw_pointers()) .class_property("CATEGORY", &mx::Node::CATEGORY); ems::class_>("GraphElement") @@ -30,7 +38,10 @@ extern "C" .function("addNodeInstance", &mx::GraphElement::addNodeInstance) .function("getNode", &mx::GraphElement::getNode) .function("getNodes", &mx::GraphElement::getNodes) + .function("getNodesOfType", &mx::GraphElement::getNodesOfType) .function("removeNode", &mx::GraphElement::removeNode) + .function("addMaterialNode", &mx::GraphElement::addMaterialNode) + .function("getMaterialNodes", &mx::GraphElement::getMaterialNodes) .function("addBackdrop", &mx::GraphElement::addBackdrop) .function("getBackdrop", &mx::GraphElement::getBackdrop) .function("getBackdrops", &mx::GraphElement::getBackdrops) @@ -44,6 +55,12 @@ extern "C" .smart_ptr>("NodeGraph") .function("setNodeDef", &mx::NodeGraph::setNodeDef) .function("getNodeDef", &mx::NodeGraph::getNodeDef) + .function("getImplementation", &mx::NodeGraph::getImplementation) + .function("getDeclaration", &mx::NodeGraph::getDeclaration) + .function("addInterfaceName", &mx::NodeGraph::addInterfaceName) + .function("removeInterfaceName", &mx::NodeGraph::removeInterfaceName) + .function("modifyInterfaceName", &mx::NodeGraph::modifyInterfaceName) + .function("validate", &mx::NodeGraph::validate, ems::allow_raw_pointers()) .class_property("CATEGORY", &mx::NodeGraph::CATEGORY); ems::class_>("Backdrop") @@ -60,6 +77,7 @@ extern "C" .function("getHeight", &mx::Backdrop::getHeight) .function("setContainsElements", &mx::Backdrop::setContainsElements) .function("getContainsElements", &mx::Backdrop::getContainsElements) + .function("validate", &mx::Backdrop::validate, ems::allow_raw_pointers()) .class_property("CATEGORY", &mx::Backdrop::CATEGORY) .class_property("CONTAINS_ATTRIBUTE", &mx::Backdrop::CONTAINS_ATTRIBUTE) .class_property("WIDTH_ATTRIBUTE", &mx::Backdrop::WIDTH_ATTRIBUTE) diff --git a/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp b/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp index 7eddc6fab5..bb58fedb31 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp @@ -8,7 +8,7 @@ namespace ems = emscripten; namespace mx = MaterialX; #define BIND_PROPERTYSET_TYPE_INSTANCE(NAME, T) \ -.function("_setPropertyValue" #NAME, &mx::PropertySet::setPropertyValue) +.function("setPropertyValue" #NAME, &mx::PropertySet::setPropertyValue) extern "C" { @@ -34,32 +34,36 @@ extern "C" .function("getCollectionString", &mx::PropertyAssign::getCollectionString) .function("setCollection", &mx::PropertyAssign::setCollection) .function("getCollection", &mx::PropertyAssign::getCollection) - .class_property("CATEGORY", &mx::PropertyAssign::CATEGORY); + .class_property("CATEGORY", &mx::PropertyAssign::CATEGORY) + .class_property("PROPERTY_ATTRIBUTE", &mx::PropertyAssign::PROPERTY_ATTRIBUTE) + .class_property("GEOM_ATTRIBUTE", &mx::PropertyAssign::GEOM_ATTRIBUTE) + .class_property("COLLECTION_ATTRIBUTE", &mx::PropertyAssign::COLLECTION_ATTRIBUTE); ems::class_>("PropertySet") .smart_ptr_constructor("PropertySet", &std::make_shared) .smart_ptr>("PropertySet") .function("addProperty", &mx::PropertySet::addProperty) + .function("getProperty", &mx::PropertySet::getProperty) .function("getProperties", &mx::PropertySet::getProperties) .function("removeProperty", &mx::PropertySet::removeProperty) - .function("_getPropertyValue", &mx::PropertySet::getPropertyValue) - BIND_PROPERTYSET_TYPE_INSTANCE(integer, int) - BIND_PROPERTYSET_TYPE_INSTANCE(boolean, bool) - BIND_PROPERTYSET_TYPE_INSTANCE(float, float) - BIND_PROPERTYSET_TYPE_INSTANCE(color3, mx::Color3) - BIND_PROPERTYSET_TYPE_INSTANCE(color4, mx::Color4) - BIND_PROPERTYSET_TYPE_INSTANCE(vector2, mx::Vector2) - BIND_PROPERTYSET_TYPE_INSTANCE(vector3, mx::Vector3) - BIND_PROPERTYSET_TYPE_INSTANCE(vector4, mx::Vector4) - BIND_PROPERTYSET_TYPE_INSTANCE(matrix33, mx::Matrix33) - BIND_PROPERTYSET_TYPE_INSTANCE(matrix44, mx::Matrix44) - BIND_PROPERTYSET_TYPE_INSTANCE(string, std::string) - BIND_PROPERTYSET_TYPE_INSTANCE(integerarray, mx::IntVec) - BIND_PROPERTYSET_TYPE_INSTANCE(booleanarray, mx::BoolVec) - BIND_PROPERTYSET_TYPE_INSTANCE(floatarray, mx::FloatVec) - BIND_PROPERTYSET_TYPE_INSTANCE(stringarray, mx::StringVec) + .function("getPropertyValue", &mx::PropertySet::getPropertyValue) + BIND_PROPERTYSET_TYPE_INSTANCE(Integer, int) + BIND_PROPERTYSET_TYPE_INSTANCE(Boolean, bool) + BIND_PROPERTYSET_TYPE_INSTANCE(Float, float) + BIND_PROPERTYSET_TYPE_INSTANCE(Color3, mx::Color3) + BIND_PROPERTYSET_TYPE_INSTANCE(Color4, mx::Color4) + BIND_PROPERTYSET_TYPE_INSTANCE(Vector2, mx::Vector2) + BIND_PROPERTYSET_TYPE_INSTANCE(Vector3, mx::Vector3) + BIND_PROPERTYSET_TYPE_INSTANCE(Vector4, mx::Vector4) + BIND_PROPERTYSET_TYPE_INSTANCE(Matrix33, mx::Matrix33) + BIND_PROPERTYSET_TYPE_INSTANCE(Matrix44, mx::Matrix44) + BIND_PROPERTYSET_TYPE_INSTANCE(String, std::string) + BIND_PROPERTYSET_TYPE_INSTANCE(IntegerArray, mx::IntVec) + BIND_PROPERTYSET_TYPE_INSTANCE(BooleanArray, mx::BoolVec) + BIND_PROPERTYSET_TYPE_INSTANCE(FloatArray, mx::FloatVec) + BIND_PROPERTYSET_TYPE_INSTANCE(StringArray, mx::StringVec) .class_property("CATEGORY", &mx::Property::CATEGORY); - + ems::class_>("PropertySetAssign") .smart_ptr_constructor("PropertySetAssign", &std::make_shared) .smart_ptr>("PropertySetAssign") @@ -68,6 +72,7 @@ extern "C" .function("getPropertySetString", &mx::PropertySetAssign::getPropertySetString) .function("setPropertySet", &mx::PropertySetAssign::setPropertySet) .function("getPropertySet", &mx::PropertySetAssign::getPropertySet) - .class_property("CATEGORY", &mx::PropertySetAssign::CATEGORY); + .class_property("CATEGORY", &mx::PropertySetAssign::CATEGORY) + .class_property("PROPERTY_SET_ATTRIBUTE", &mx::PropertySetAssign::PROPERTY_SET_ATTRIBUTE); } } \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp b/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp index 52fa09bb44..526543c1c0 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp @@ -26,7 +26,7 @@ extern "C" .function("getElementDepth", &mx::TreeIterator::getElementDepth) .function("setPruneSubtree", &mx::TreeIterator::setPruneSubtree) .function("getPruneSubtree", &mx::TreeIterator::getPruneSubtree) - .function("__iter__", ems::optional_override([](mx::TreeIterator &it) -> mx::TreeIterator & { + .function("iter", ems::optional_override([](mx::TreeIterator &it) -> mx::TreeIterator & { return it.begin(1); })) .function("next", ems::optional_override([](mx::TreeIterator &it) { @@ -45,7 +45,7 @@ extern "C" .function("getNodeDepth", &mx::GraphIterator::getNodeDepth) .function("setPruneSubgraph", &mx::GraphIterator::setPruneSubgraph) .function("getPruneSubgraph", &mx::GraphIterator::getPruneSubgraph) - .function("__iter__", ems::optional_override([](mx::GraphIterator &it) -> mx::GraphIterator & { + .function("iter", ems::optional_override([](mx::GraphIterator &it) -> mx::GraphIterator & { return it.begin(1); })) .function("next", ems::optional_override([](mx::GraphIterator &it) { @@ -58,7 +58,7 @@ extern "C" ems::class_("InheritanceIterator") .smart_ptr_constructor("InheritanceIterator", &std::make_shared) - .function("__iter__", ems::optional_override([](mx::InheritanceIterator &it) -> mx::InheritanceIterator & { + .function("begin", ems::optional_override([](mx::InheritanceIterator &it) -> mx::InheritanceIterator & { return it.begin(1); })) .function("next", ems::optional_override([](mx::InheritanceIterator &it) { @@ -66,5 +66,13 @@ extern "C" throw mx::Exception("Could not get the next element."); return *it; })); + + + // TODO Wrap ExceptionFoundCycle? + + ems::constant("NULL_EDGE", mx::NULL_EDGE); + ems::constant("NULL_TREE_ITERATOR", mx::NULL_TREE_ITERATOR); + ems::constant("NULL_GRAPH_ITERATOR", mx::NULL_GRAPH_ITERATOR); + ems::constant("NULL_INHERITANCE_ITERATOR", mx::NULL_INHERITANCE_ITERATOR); } } \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp b/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp index 3c90b89408..4074d5dcbc 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp @@ -8,42 +8,46 @@ namespace ems = emscripten; namespace mx = MaterialX; -#define BIND_VECTOR_SUBCLASS(V) \ - .function("equals", ems::optional_override([](V &self, const V &rhs) { return self == rhs; })) \ - .function("not_equals", ems::optional_override([](V &self, const V &rhs) { return self != rhs; })) \ - .function("add", ems::optional_override([](V &self, const V &rhs) { return self + rhs; })) \ - .function("sub", ems::optional_override([](V &self, const V &rhs) { return self - rhs; })) \ - .function("multiply", ems::optional_override([](V &self, const V &rhs) { return self * rhs; })) \ - .function("divide", ems::optional_override([](V &self, const V &rhs) { return self / rhs; })) \ - .function("getMagnitude", ems::optional_override([](V &self) { return self.V::getMagnitude(); })) \ - .function("getNormalized", ems::optional_override([](V &self) { return self.V::getNormalized(); })) \ - .function("dot", ems::optional_override([](V &self, const V &rhs) { return self.V::dot(rhs); })) \ - .function("getItem", ems::optional_override([](V &self, size_t i) { return self[i]; })) \ - .function("setItem", ems::optional_override([](V &self, size_t i, float f) { self[i] = f; })) \ - .function("toString", ems::optional_override([](const V &self) { return toValueString(self); })) \ - .function("copy", ems::optional_override([](const V &self) { return V(self); })) \ - .function("numElements", ems::optional_override([](const V &self) { return self.V::numElements(); })) \ - .function("length", ems::optional_override([](const V &self) { return self.V::numElements(); })) +#define BIND_VECTOR_SUBCLASS(V) \ + .function("equals", ems::optional_override([](V &self, const V &rhs) { return self == rhs; })) \ + .function("not_equals", ems::optional_override([](V &self, const V &rhs) { return self != rhs; })) \ + .function("add", ems::optional_override([](V &self, const V &rhs) { return self + rhs; })) \ + .function("sub", ems::optional_override([](V &self, const V &rhs) { return self - rhs; })) \ + .function("multiply", ems::optional_override([](V &self, const V &rhs) { return self * rhs; })) \ + .function("multiplyScalar", ems::optional_override([](V &self, float s) { return self * s; })) \ + .function("divide", ems::optional_override([](V &self, const V &rhs) { return self / rhs; })) \ + .function("divideScalar", ems::optional_override([](V &self, float s) { return self / s; })) \ + .function("negate", ems::optional_override([](V &self) { return -self; })) \ + .function("getMagnitude", ems::optional_override([](V &self) { return self.V::getMagnitude(); })) \ + .function("getNormalized", ems::optional_override([](V &self) { return self.V::getNormalized(); })) \ + .function("dot", ems::optional_override([](V &self, const V &rhs) { return self.V::dot(rhs); })) \ + .function("getItem", ems::optional_override([](V &self, size_t i) { return self[i]; })) \ + .function("setItem", ems::optional_override([](V &self, size_t i, float f) { self[i] = f; })) \ + .function("toString", ems::optional_override([](const V &self) { return toValueString(self); })) \ + .function("copy", ems::optional_override([](const V &self) { return V(self); })) \ + .function("length", ems::optional_override([](const V &self) { return self.V::numElements(); })) -#define BIND_MATRIX_SUBCLASS(M) \ - .function("equals", ems::optional_override([](M &self, const M &rhs) { return self == rhs; })) \ - .function("not_equals", ems::optional_override([](M &self, const M &rhs) { return self != rhs; })) \ - .function("add", ems::optional_override([](M &self, const M &rhs) { return self + rhs; })) \ - .function("sub", ems::optional_override([](M &self, const M &rhs) { return self - rhs; })) \ - .function("multiply", ems::optional_override([](M &self, const M &rhs) { return self * rhs; })) \ - .function("divide", ems::optional_override([](M &self, const M &rhs) { return self / rhs; })) \ - .function("getItem", ems::optional_override([](M &self, size_t row, size_t col) { return self[row][col]; })) \ - .function("setItem", ems::optional_override([](M &self, size_t row, size_t col, float f) { self[row][col] = f; })) \ - .function("toString", ems::optional_override([](const M &self) { return toValueString(self); })) \ - .function("copy", ems::optional_override([](const M &self) { return M(self); })) \ - .function("isEquivalent", ems::optional_override([](const M &self, const M &rhs, float tolerance) { return self.M::isEquivalent(rhs, tolerance); })) \ - .function("getTranspose", ems::optional_override([](const M &self) { return self.M::getTranspose(); })) \ - .function("getDeterminant", ems::optional_override([](const M &self) { return self.M::getDeterminant(); })) \ - .function("getAdjugate", ems::optional_override([](const M &self) { return self.M::getAdjugate(); })) \ - .function("getInverse", ems::optional_override([](const M &self) { return self.M::getInverse(); })) \ - .function("numRows", ems::optional_override([](const M &self) { return self.M::numRows(); })) \ - .function("numColumns", ems::optional_override([](const M &self) { return self.M::numColumns(); })) \ - .function("length", ems::optional_override([](const M &self) { return self.M::numRows(); })) +#define BIND_MATRIX_SUBCLASS(M) \ + .function("equals", ems::optional_override([](M &self, const M &rhs) { return self == rhs; })) \ + .function("not_equals", ems::optional_override([](M &self, const M &rhs) { return self != rhs; })) \ + .function("add", ems::optional_override([](M &self, const M &rhs) { return self + rhs; })) \ + .function("sub", ems::optional_override([](M &self, const M &rhs) { return self - rhs; })) \ + .function("multiply", ems::optional_override([](M &self, const M &rhs) { return self * rhs; })) \ + .function("multiplyScalar", ems::optional_override([](M &self, float s) { return self * s; })) \ + .function("divide", ems::optional_override([](M &self, const M &rhs) { return self / rhs; })) \ + .function("divideScalar", ems::optional_override([](M &self, float s) { return self / s; })) \ + .function("getItem", ems::optional_override([](M &self, size_t row, size_t col) { return self[row][col]; })) \ + .function("setItem", ems::optional_override([](M &self, size_t row, size_t col, float f) { self[row][col] = f; })) \ + .function("toString", ems::optional_override([](const M &self) { return toValueString(self); })) \ + .function("copy", ems::optional_override([](const M &self) { return M(self); })) \ + .function("isEquivalent", ems::optional_override([](const M &self, const M &rhs, float tolerance) { return self.M::isEquivalent(rhs, tolerance); })) \ + .function("getTranspose", ems::optional_override([](const M &self) { return self.M::getTranspose(); })) \ + .function("getDeterminant", ems::optional_override([](const M &self) { return self.M::getDeterminant(); })) \ + .function("getAdjugate", ems::optional_override([](const M &self) { return self.M::getAdjugate(); })) \ + .function("getInverse", ems::optional_override([](const M &self) { return self.M::getInverse(); })) \ + .function("numRows", ems::optional_override([](const M &self) { return self.M::numRows(); })) \ + .function("numColumns", ems::optional_override([](const M &self) { return self.M::numColumns(); })) \ + .function("length", ems::optional_override([](const M &self) { return self.M::numRows(); })) extern "C" { @@ -64,10 +68,19 @@ extern "C" BIND_VECTOR_SUBCLASS(mx::Vector3) .function("cross", &mx::Vector3::cross); + ems::class_>("Quaternion") + .constructor<>() + .constructor() + BIND_VECTOR_SUBCLASS(mx::Vector4) + .function("multiplyQuaternion", ems::optional_override([](const mx::Quaternion &self, const mx::Quaternion &q) { return self * q; })) + .function("getNormalized", ems::optional_override([](mx::Quaternion &self) { return self.getNormalized(); })) + .class_function("createFromAxisAngle", &mx::Quaternion::createFromAxisAngle) + .class_property("IDENTITY", &mx::Quaternion::IDENTITY); + ems::class_>("Vector4") .constructor<>() .constructor() - BIND_VECTOR_SUBCLASS(mx::Vector4); + BIND_VECTOR_SUBCLASS(mx::Vector4); ems::class_>("Color3") .constructor<>() @@ -83,75 +96,50 @@ extern "C" .constructor<>() .constructor() BIND_MATRIX_SUBCLASS(mx::Matrix33) - .function("createScale", ems::optional_override([](const mx::Matrix33 &self, const mx::Vector2 &v) { return self.mx::Matrix33::createScale(v); })) - .function("createTranslation", ems::optional_override([](const mx::Matrix33 &self, const mx::Vector2 &v) { return self.mx::Matrix33::createTranslation(v); })) + .function("multiplyVector3", ems::optional_override([](const mx::Matrix33 &self, const mx::Vector3 &v) { return self.mx::Matrix33::multiply(v); })) .function("transformPoint", ems::optional_override([](const mx::Matrix33 &self, const mx::Vector2 &v) { return self.mx::Matrix33::transformPoint(v); })) .function("transformVector", ems::optional_override([](const mx::Matrix33 &self, const mx::Vector2 &v) { return self.mx::Matrix33::transformVector(v); })) .function("transformNormal", ems::optional_override([](const mx::Matrix33 &self, const mx::Vector3 &v) { return self.mx::Matrix33::transformNormal(v); })) - .function("createRotation", ems::optional_override([](const mx::Matrix33 &self, float angle) { return self.mx::Matrix33::createRotation(angle); })) + .class_function("createTranslation", &mx::Matrix33::createTranslation) + .class_function("createScale", &mx::Matrix33::createScale) + .class_function("createRotation", &mx::Matrix33::createRotation) .class_property("IDENTITY", &mx::Matrix33::IDENTITY); ems::class_>("Matrix44") .constructor<>() .constructor() BIND_MATRIX_SUBCLASS(mx::Matrix44) - .function("createScale", ems::optional_override([](const mx::Matrix44 &self, const mx::Vector3 &v) { return self.mx::Matrix44::createScale(v); })) - .function("createTranslation", ems::optional_override([](const mx::Matrix44 &self, const mx::Vector3 &v) { return self.mx::Matrix44::createTranslation(v); })) + .function("multiplyVector4", ems::optional_override([](const mx::Matrix44 &self, const mx::Vector4 &v) { return self.mx::Matrix44::multiply(v); })) .function("transformPoint", ems::optional_override([](const mx::Matrix44 &self, const mx::Vector3 &v) { return self.mx::Matrix44::transformPoint(v); })) .function("transformVector", ems::optional_override([](const mx::Matrix44 &self, const mx::Vector3 &v) { return self.mx::Matrix44::transformVector(v); })) .function("transformNormal", ems::optional_override([](const mx::Matrix44 &self, const mx::Vector3 &v) { return self.mx::Matrix44::transformNormal(v); })) - .function("createRotationX", ems::optional_override([](const mx::Matrix44 &self, float angle) { return self.mx::Matrix44::createRotationX(angle); })) - .function("createRotationY", ems::optional_override([](const mx::Matrix44 &self, float angle) { return self.mx::Matrix44::createRotationY(angle); })) - .function("createRotationZ", ems::optional_override([](const mx::Matrix44 &self, float angle) { return self.mx::Matrix44::createRotationZ(angle); })) + .class_function("createTranslation", &mx::Matrix44::createTranslation) + .class_function("createScale", &mx::Matrix44::createScale) + .class_function("createRotationX", &mx::Matrix44::createRotationX) + .class_function("createRotationY", &mx::Matrix44::createRotationY) + .class_function("createRotationZ", &mx::Matrix44::createRotationZ) + .class_function("createRotation", &mx::Matrix44::createRotation) .class_property("IDENTITY", &mx::Matrix44::IDENTITY); - ems::function("DEFAULT_TYPE_STRING", ems::optional_override([]() { - return mx::DEFAULT_TYPE_STRING; - })); - ems::function("EMPTY_STRING", ems::optional_override([]() { - return mx::EMPTY_STRING; - })); - ems::function("FILENAME_TYPE_STRING", ems::optional_override([]() { - return mx::FILENAME_TYPE_STRING; - })); - ems::function("GEOMNAME_TYPE_STRING", ems::optional_override([]() { - return mx::GEOMNAME_TYPE_STRING; - })); - ems::function("SURFACE_SHADER_TYPE_STRING", ems::optional_override([]() { - return mx::SURFACE_SHADER_TYPE_STRING; - })); - ems::function("DISPLACEMENT_SHADER_TYPE_STRING", ems::optional_override([]() { - return mx::DISPLACEMENT_SHADER_TYPE_STRING; - })); - ems::function("VOLUME_SHADER_TYPE_STRING", ems::optional_override([]() { - return mx::VOLUME_SHADER_TYPE_STRING; - })); - ems::function("LIGHT_SHADER_TYPE_STRING", ems::optional_override([]() { - return mx::LIGHT_SHADER_TYPE_STRING; - })); - ems::function("MULTI_OUTPUT_TYPE_STRING", ems::optional_override([]() { - return mx::MULTI_OUTPUT_TYPE_STRING; - })); - ems::function("NONE_TYPE_STRING", ems::optional_override([]() { - return mx::NONE_TYPE_STRING; - })); - ems::function("VALUE_STRING_TRUE", ems::optional_override([]() { - return mx::VALUE_STRING_TRUE; - })); - ems::function("VALUE_STRING_FALSE", ems::optional_override([]() { - return mx::VALUE_STRING_FALSE; - })); - ems::function("NAME_PREFIX_SEPARATOR", ems::optional_override([]() { - return mx::NAME_PREFIX_SEPARATOR; - })); - ems::function("NAME_PATH_SEPARATOR", ems::optional_override([]() { - return mx::NAME_PATH_SEPARATOR; - })); - ems::function("ARRAY_VALID_SEPARATORS", ems::optional_override([]() { - return mx::ARRAY_VALID_SEPARATORS; - })); - ems::function("ARRAY_PREFERRED_SEPARATOR", ems::optional_override([]() { - return mx::ARRAY_PREFERRED_SEPARATOR; - })); + ems::constant("DEFAULT_TYPE_STRING", mx::DEFAULT_TYPE_STRING); + ems::constant("EMPTY_STRING", mx::EMPTY_STRING); + ems::constant("FILENAME_TYPE_STRING", mx::FILENAME_TYPE_STRING); + ems::constant("GEOMNAME_TYPE_STRING", mx::GEOMNAME_TYPE_STRING); + ems::constant("STRING_TYPE_STRING", mx::STRING_TYPE_STRING); + ems::constant("SURFACE_SHADER_TYPE_STRING", mx::SURFACE_SHADER_TYPE_STRING); + ems::constant("DISPLACEMENT_SHADER_TYPE_STRING", mx::DISPLACEMENT_SHADER_TYPE_STRING); + ems::constant("VOLUME_SHADER_TYPE_STRING", mx::VOLUME_SHADER_TYPE_STRING); + ems::constant("LIGHT_SHADER_TYPE_STRING", mx::LIGHT_SHADER_TYPE_STRING); + ems::constant("MATERIAL_TYPE_STRING", mx::MATERIAL_TYPE_STRING); + ems::constant("SURFACE_MATERIAL_NODE_STRING", mx::SURFACE_MATERIAL_NODE_STRING); + ems::constant("VOLUME_MATERIAL_NODE_STRING", mx::VOLUME_MATERIAL_NODE_STRING); + ems::constant("MULTI_OUTPUT_TYPE_STRING", mx::MULTI_OUTPUT_TYPE_STRING); + ems::constant("NONE_TYPE_STRING", mx::NONE_TYPE_STRING); + ems::constant("VALUE_STRING_TRUE", mx::VALUE_STRING_TRUE); + ems::constant("VALUE_STRING_FALSE", mx::VALUE_STRING_FALSE); + ems::constant("NAME_PREFIX_SEPARATOR", mx::NAME_PREFIX_SEPARATOR); + ems::constant("NAME_PATH_SEPARATOR", mx::NAME_PATH_SEPARATOR); + ems::constant("ARRAY_VALID_SEPARATORS", mx::ARRAY_VALID_SEPARATORS); + ems::constant("ARRAY_PREFERRED_SEPARATOR", mx::ARRAY_PREFERRED_SEPARATOR); } } \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsTypes.js b/source/JsMaterialX/JsMaterialXCore/JsTypes.js index a2f9496a01..02ecf9ecef 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsTypes.js +++ b/source/JsMaterialX/JsMaterialXCore/JsTypes.js @@ -7,20 +7,20 @@ addWrapper(function(Module, api) { api.Color4 = wrapperFactory(Module.Color4); api.Matrix33 = wrapperFactory(Module.Matrix33); api.Matrix44 = wrapperFactory(Module.Matrix44); - api.DEFAULT_TYPE_STRING = Module.DEFAULT_TYPE_STRING(); - api.EMPTY_STRING = Module.EMPTY_STRING(); - api.FILENAME_TYPE_STRING = Module.FILENAME_TYPE_STRING(); - api.GEOMNAME_TYPE_STRING = Module.GEOMNAME_TYPE_STRING(); - api.SURFACE_SHADER_TYPE_STRING = Module.SURFACE_SHADER_TYPE_STRING(); - api.DISPLACEMENT_SHADER_TYPE_STRING = Module.DISPLACEMENT_SHADER_TYPE_STRING(); - api.VOLUME_SHADER_TYPE_STRING = Module.VOLUME_SHADER_TYPE_STRING(); - api.LIGHT_SHADER_TYPE_STRING = Module.LIGHT_SHADER_TYPE_STRING(); - api.MULTI_OUTPUT_TYPE_STRING = Module.MULTI_OUTPUT_TYPE_STRING(); - api.NONE_TYPE_STRING = Module.NONE_TYPE_STRING(); - api.VALUE_STRING_TRUE = Module.VALUE_STRING_TRUE(); - api.VALUE_STRING_FALSE = Module.VALUE_STRING_FALSE(); - api.NAME_PREFIX_SEPARATOR = Module.NAME_PREFIX_SEPARATOR(); - api.NAME_PATH_SEPARATOR = Module.NAME_PATH_SEPARATOR(); - api.ARRAY_VALID_SEPARATORS = Module.ARRAY_VALID_SEPARATORS(); - api.ARRAY_PREFERRED_SEPARATOR = Module.ARRAY_PREFERRED_SEPARATOR(); + api.DEFAULT_TYPE_STRING = Module.DEFAULT_TYPE_STRING; + api.EMPTY_STRING = Module.EMPTY_STRING; + api.FILENAME_TYPE_STRING = Module.FILENAME_TYPE_STRING; + api.GEOMNAME_TYPE_STRING = Module.GEOMNAME_TYPE_STRING; + api.SURFACE_SHADER_TYPE_STRING = Module.SURFACE_SHADER_TYPE_STRING; + api.DISPLACEMENT_SHADER_TYPE_STRING = Module.DISPLACEMENT_SHADER_TYPE_STRING; + api.VOLUME_SHADER_TYPE_STRING = Module.VOLUME_SHADER_TYPE_STRING; + api.LIGHT_SHADER_TYPE_STRING = Module.LIGHT_SHADER_TYPE_STRING; + api.MULTI_OUTPUT_TYPE_STRING = Module.MULTI_OUTPUT_TYPE_STRING; + api.NONE_TYPE_STRING = Module.NONE_TYPE_STRING; + api.VALUE_STRING_TRUE = Module.VALUE_STRING_TRUE; + api.VALUE_STRING_FALSE = Module.VALUE_STRING_FALSE; + api.NAME_PREFIX_SEPARATOR = Module.NAME_PREFIX_SEPARATOR; + api.NAME_PATH_SEPARATOR = Module.NAME_PATH_SEPARATOR; + api.ARRAY_VALID_SEPARATORS = Module.ARRAY_VALID_SEPARATORS; + api.ARRAY_PREFERRED_SEPARATOR = Module.ARRAY_PREFERRED_SEPARATOR; }); diff --git a/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp b/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp index bca577700e..5cdd91069b 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp @@ -16,23 +16,28 @@ extern "C" ems::class_("UnitConverter") .smart_ptr>("UnitConverter") .smart_ptr>("UnitConverter") - .function("convert_float", ems::select_overload(&mx::UnitConverter::convert)) - .function("convert_vector2", ems::select_overload(&mx::UnitConverter::convert)) - .function("convert_vector3", ems::select_overload(&mx::UnitConverter::convert)) - .function("convert_vector4", ems::select_overload(&mx::UnitConverter::convert)) + .function("convertFloat", ems::select_overload(&mx::UnitConverter::convert)) + .function("convertVector2", ems::select_overload(&mx::UnitConverter::convert)) + .function("convertVector3", ems::select_overload(&mx::UnitConverter::convert)) + .function("convertVector4", ems::select_overload(&mx::UnitConverter::convert)) .function("getUnitAsInteger", &mx::UnitConverter::getUnitAsInteger) - .function("getUnitFromInteger", &mx::UnitConverter::getUnitFromInteger); + .function("getUnitFromInteger", &mx::UnitConverter::getUnitFromInteger) + .function("write", &mx::UnitConverter::write, ems::pure_virtual()); ems::class_>("LinearUnitConverter") .smart_ptr>("LinearUnitConverter") .smart_ptr>("LinearUnitConverter") - .function("convert_float", ems::select_overload(&mx::LinearUnitConverter::convert)) - .function("convert_vector2", ems::select_overload(&mx::LinearUnitConverter::convert)) - .function("convert_vector3", ems::select_overload(&mx::LinearUnitConverter::convert)) - .function("convert_vector4", ems::select_overload(&mx::LinearUnitConverter::convert)) + .function("convertFloat", ems::select_overload(&mx::LinearUnitConverter::convert)) + .function("convertVector2", ems::select_overload(&mx::LinearUnitConverter::convert)) + .function("convertVector3", ems::select_overload(&mx::LinearUnitConverter::convert)) + .function("convertVector4", ems::select_overload(&mx::LinearUnitConverter::convert)) .function("getUnitAsInteger", &mx::LinearUnitConverter::getUnitAsInteger) .function("getUnitFromInteger", &mx::LinearUnitConverter::getUnitFromInteger) - .function("getUnitScale", &mx::LinearUnitConverter::getUnitScale); + .function("getUnitType", &mx::LinearUnitConverter::getUnitType) + .function("write", &mx::LinearUnitConverter::write) + .function("getUnitScale", &mx::LinearUnitConverter::getUnitScale) + .function("conversionRatio", &mx::LinearUnitConverter::conversionRatio) + .class_function("create", &mx::LinearUnitConverter::create); ems::class_("UnitConverterRegistry") .smart_ptr>("UnitConverterRegistry") @@ -41,8 +46,8 @@ extern "C" .function("removeUnitConverter", &mx::UnitConverterRegistry::removeUnitConverter) .function("getUnitConverter", &mx::UnitConverterRegistry::getUnitConverter) .function("clearUnitConverters", &mx::UnitConverterRegistry::clearUnitConverters) - .function("create", ems::optional_override([](mx::UnitConverterRegistry &self) { - return self.mx::UnitConverterRegistry::create(); - })); + .function("getUnitAsInteger", &mx::UnitConverterRegistry::getUnitAsInteger) + .function("write", &mx::UnitConverterRegistry::write) + .class_function("create", &mx::UnitConverterRegistry::create); } } \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp index 73f2b9fb73..ef06176f18 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -16,38 +17,22 @@ namespace mx = MaterialX; extern "C" { - EMSCRIPTEN_BINDINGS(my_module) + EMSCRIPTEN_BINDINGS(util) { ems::function("getVersionString", &mx::getVersionString); - ems::function("createValidName", &mx::createValidName); // arg0 === {std::string}, arg1 === {unicode representing character} - ems::function("isValidName", &mx::isValidName); - ems::function("incrementName", &mx::incrementName); // The following function throw: Cannot call {function name} due to unbound types: XXXXX ems::function("getVersionIntegers", ems::optional_override([]() { - std::tuple version = mx::getVersionIntegers(); - return arrayToVec((int *)&version, 3); - })); - - ems::function("splitString", ems::optional_override([](std::string str, std::string sep) { - const std::string &str1 = str; - const std::string &sep2 = sep; - return mx::splitString(str1, sep2); + auto version = mx::getVersionIntegers(); + return ems::val::array((int *)&version, (int *)&version + 3); })); - ems::function("replaceSubstrings", ems::optional_override([](std::string str, ems::val newValue) { - mx::StringMap separatorMapper; - ems::val keys = ems::val::global("Object").call("keys", newValue); - int length = keys["length"].as(); - for (int i = 0; i < length; ++i) - { - std::string key = keys[i].as().c_str(); - std::string value = newValue[key].as(); - separatorMapper[key] = value; - } - return mx::replaceSubstrings(str, separatorMapper); - })); + ems::function("createValidName", &mx::createValidName); // arg0 === {std::string}, arg1 === {unicode representing character} + ems::function("isValidName", &mx::isValidName); + ems::function("incrementName", &mx::incrementName); - ems::function("prettyPrint", &mx::prettyPrint); + ems::function("splitNamePath", &mx::splitNamePath); + ems::function("createNamePath", &mx::createNamePath); + ems::function("parentNamePath", &mx::parentNamePath); } } \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsUtil.js b/source/JsMaterialX/JsMaterialXCore/JsUtil.js index 747688369e..0058bc628f 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUtil.js +++ b/source/JsMaterialX/JsMaterialXCore/JsUtil.js @@ -10,20 +10,6 @@ addWrapper(function(Module, api) { api.incrementName = Module.incrementName; api.getVersionIntegers = function() { - var vec = Module.getVersionIntegers(); - return vecToArray(vec); + return Module.getVersionIntegers(); }; - - // TODO: Do we really need to map such helper functions? JS already has a String.split method. - api.splitString = function(str, spl) { - var vecStr = Module.splitString(str, spl); - var size = vecStr.size(); - var result = []; - for (var i = 0; i < size; i++) { - result.push(vecStr.get(i)); - } - return result; - }; - - api.replaceSubstrings = Module.replaceSubstrings; }); diff --git a/source/JsMaterialX/JsMaterialXCore/JsValue.cpp b/source/JsMaterialX/JsMaterialXCore/JsValue.cpp index dd47e66b7b..a9b726ed5c 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsValue.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsValue.cpp @@ -8,38 +8,80 @@ namespace ems = emscripten; namespace mx = MaterialX; #define BIND_TYPE_INSTANCE(NAME, T) \ - ems::class_, ems::base>("TypedValue_" #NAME) \ + ems::class_, ems::base>("TypedValue" #NAME) \ .smart_ptr>>("TypedValue") \ + .function("copy", &mx::TypedValue::copy) \ + .function("setData", ems::select_overload(&mx::TypedValue::setData)) \ + .function("setDataTypedValue", ems::select_overload& value)>(&mx::TypedValue::setData)) \ .function("getData", &mx::TypedValue::getData) \ - .function("getValueString", &mx::TypedValue::getValueString) \ .function("getTypeString", &mx::TypedValue::getTypeString) \ - .class_function("createValue", &mx::Value::createValue); + .function("getValueString", &mx::TypedValue::getValueString) \ + .class_function("createFromString", &mx::TypedValue::createFromString); + +#define BIND_TYPE_SPECIFIC_VALUE_FUNCS(NAME, T) \ + .class_function("createValue" #NAME, &mx::Value::createValue) \ + .function("isA" #NAME, &mx::Value::isA) \ + .function("asA" #NAME, &mx::Value::asA) + +#define BIND_GLOBAL_FUNCS(NAME, T) \ + ems::function("getTypeString", &mx::getTypeString); \ + ems::function("toValueString", &mx::toValueString); \ + ems::function("fromValueString", &mx::fromValueString); extern "C" { EMSCRIPTEN_BINDINGS(value) { + ems::enum_("FloatFormat") + .value("FloatFormatDefault", mx::Value::FloatFormat::FloatFormatDefault) + .value("FloatFormatFixed", mx::Value::FloatFormat::FloatFormatFixed) + .value("FloatFormatScientific", mx::Value::FloatFormat::FloatFormatScientific) + ; + ems::class_("Value") .smart_ptr>("Value") .smart_ptr>("Value") - .function("getValueString", &mx::Value::getValueString) + .function("copy", &mx::Value::copy) .function("getTypeString", &mx::Value::getTypeString) - .class_function("createValueFromStrings", &mx::Value::createValueFromStrings); - - BIND_TYPE_INSTANCE(integer, int) - BIND_TYPE_INSTANCE(boolean, bool) - BIND_TYPE_INSTANCE(float, float) - BIND_TYPE_INSTANCE(color3, mx::Color3) - BIND_TYPE_INSTANCE(color4, mx::Color4) - BIND_TYPE_INSTANCE(vector2, mx::Vector2) - BIND_TYPE_INSTANCE(vector3, mx::Vector3) - BIND_TYPE_INSTANCE(vector4, mx::Vector4) - BIND_TYPE_INSTANCE(matrix33, mx::Matrix33) - BIND_TYPE_INSTANCE(matrix44, mx::Matrix44) - BIND_TYPE_INSTANCE(string, std::string) - BIND_TYPE_INSTANCE(integerarray, mx::IntVec) - BIND_TYPE_INSTANCE(booleanarray, mx::BoolVec) - BIND_TYPE_INSTANCE(floatarray, mx::FloatVec) - BIND_TYPE_INSTANCE(stringarray, mx::StringVec) + .function("getValueString", &mx::Value::getValueString) + .class_function("createValueFromStrings", &mx::Value::createValueFromStrings) + .class_function("setFloatFormat", &mx::Value::setFloatFormat) + .class_function("setFloatPrecision", &mx::Value::setFloatPrecision) + .class_function("getFloatFormat", &mx::Value::getFloatFormat) + .class_function("getFloatPrecision", &mx::Value::getFloatPrecision) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(Integer, int) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(Boolean, bool) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(Float, float) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(Color3, mx::Color3) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(Color4, mx::Color4) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(Vector2, mx::Vector2) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(Vector3, mx::Vector3) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(Vector4, mx::Vector4) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(Matrix33, mx::Matrix33) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(Matrix44, mx::Matrix44) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(String, std::string) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(IntegerArray, mx::IntVec) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(BooleanArray, mx::BoolVec) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(FloatArray, mx::FloatVec) + BIND_TYPE_SPECIFIC_VALUE_FUNCS(StringArray, mx::StringVec) + ; + + BIND_TYPE_INSTANCE(Integer, int) + BIND_TYPE_INSTANCE(Boolean, bool) + BIND_TYPE_INSTANCE(Float, float) + BIND_TYPE_INSTANCE(Color3, mx::Color3) + BIND_TYPE_INSTANCE(Color4, mx::Color4) + BIND_TYPE_INSTANCE(Vector2, mx::Vector2) + BIND_TYPE_INSTANCE(Vector3, mx::Vector3) + BIND_TYPE_INSTANCE(Vector4, mx::Vector4) + BIND_TYPE_INSTANCE(Matrix33, mx::Matrix33) + BIND_TYPE_INSTANCE(Matrix44, mx::Matrix44) + BIND_TYPE_INSTANCE(String, std::string) + BIND_TYPE_INSTANCE(IntegerArray, mx::IntVec) + BIND_TYPE_INSTANCE(BooleanArray, mx::BoolVec) + BIND_TYPE_INSTANCE(FloatArray, mx::FloatVec) + BIND_TYPE_INSTANCE(StringArray, mx::StringVec) + + BIND_GLOBAL_FUNCS(Integer, int) } } \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsValue.js b/source/JsMaterialX/JsMaterialXCore/JsValue.js index 22cb101eb9..c9e0af95db 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsValue.js +++ b/source/JsMaterialX/JsMaterialXCore/JsValue.js @@ -1,21 +1,21 @@ // jsValue addWrapper(function(Module, api) { var typedValues = [ - 'TypedValue_integer', - 'TypedValue_boolean', - 'TypedValue_float', - 'TypedValue_color3', - 'TypedValue_color4', - 'TypedValue_vector2', - 'TypedValue_vector3', - 'TypedValue_vector4', - 'TypedValue_matrix33', - 'TypedValue_matrix44', - 'TypedValue_string', - 'TypedValue_integerarray', - 'TypedValue_booleanarray', - 'TypedValue_floatarray', - 'TypedValue_stringarray' + 'TypedValueInteger', + 'TypedValueBoolean', + 'TypedValueFloat', + 'TypedValueColor3', + 'TypedValueColor4', + 'TypedValueVector2', + 'TypedValueVector3', + 'TypedValueVector4', + 'TypedValueMatrix33', + 'TypedValueMatrix44', + 'TypedValueString', + 'TypedValueIntegerArray', + 'TypedValueBooleanArray', + 'TypedValueFloatArray', + 'TypedValueStringArray' ]; function iterateTypedValues(cb) { diff --git a/source/JsMaterialX/initMaterialX.js b/source/JsMaterialX/initMaterialX.js index 78f9d1640c..01ffc86927 100644 --- a/source/JsMaterialX/initMaterialX.js +++ b/source/JsMaterialX/initMaterialX.js @@ -111,9 +111,14 @@ function addWrapper(wrapperCb) { Module.onRuntimeInitialized = function() { var MaterialX = {}; // Generate wrappers + for (var i = 0; i < _wrappers.length; i++) { - var wrapper = _wrappers[parseInt(i)]; - wrapper(Module, MaterialX); + try { + var wrapper = _wrappers[parseInt(i)]; + wrapper(Module, MaterialX); + } catch(e) { + console.log(e); + } } MaterialX['getExceptionMessage'] = Module.getExceptionMessage; Module['getMaterialX'] = function() { diff --git a/source/JsMaterialX/test/basics.spec.js b/source/JsMaterialX/test/basics.spec.js index 63bb65a59a..9d24f2ed89 100644 --- a/source/JsMaterialX/test/basics.spec.js +++ b/source/JsMaterialX/test/basics.spec.js @@ -111,8 +111,8 @@ describe('Basics', () => { it('Matrices', () => { // Translation and scale - const trans = new mx.Matrix44().createTranslation(new mx.Vector3(1, 2, 3)); - const scale = new mx.Matrix44().createScale(new mx.Vector3(2, 2, 2)); + const trans = mx.Matrix44.createTranslation(new mx.Vector3(1, 2, 3)); + const scale = mx.Matrix44.createScale(new mx.Vector3(2, 2, 2)); expect(trans.equals(new mx.Matrix44(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 3, 1))); expect(scale.equals(new mx.Matrix44(2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1))); @@ -127,7 +127,7 @@ describe('Basics', () => { expect(scale.getTranspose().equals(scale)).to.be.true; expect(trans.getDeterminant()).to.equal(1); expect(scale.getDeterminant()).to.equal(8); - expect(trans.getInverse().equals(new mx.Matrix44().createTranslation(new mx.Vector3(-1, -2, -3)))).to.be.true; + expect(trans.getInverse().equals(mx.Matrix44.createTranslation(new mx.Vector3(-1, -2, -3)))).to.be.true; // Matrix product const prod1 = trans.multiply(scale); @@ -152,19 +152,19 @@ describe('Basics', () => { // 2D rotation const _epsilon = 1e-4; - const rot1 = new mx.Matrix33().createRotation(Math.PI / 2); - const rot2 = new mx.Matrix33().createRotation(Math.PI); + const rot1 = mx.Matrix33.createRotation(Math.PI / 2); + const rot2 = mx.Matrix33.createRotation(Math.PI); expect(rot1.multiply(rot1).isEquivalent(rot2, _epsilon)); - expect(rot2.isEquivalent(new mx.Matrix33().createScale(new mx.Vector2(-1, -1)), _epsilon)); + expect(rot2.isEquivalent(mx.Matrix33.createScale(new mx.Vector2(-1, -1)), _epsilon)); expect(rot2.multiply(rot2).isEquivalent(mx.Matrix33.IDENTITY, _epsilon)); // 3D rotation - const rotX = new mx.Matrix44().createRotationX(Math.PI); - const rotY = new mx.Matrix44().createRotationY(Math.PI); - const rotZ = new mx.Matrix44().createRotationZ(Math.PI); - expect(rotX.multiply(rotY).isEquivalent(new mx.Matrix44().createScale(new mx.Vector3(-1, -1, 1)), _epsilon)); - expect(rotX.multiply(rotZ).isEquivalent(new mx.Matrix44().createScale(new mx.Vector3(-1, 1, -1)), _epsilon)); - expect(rotY.multiply(rotZ).isEquivalent(new mx.Matrix44().createScale(new mx.Vector3(1, -1, -1)), _epsilon)); + const rotX = mx.Matrix44.createRotationX(Math.PI); + const rotY = mx.Matrix44.createRotationY(Math.PI); + const rotZ = mx.Matrix44.createRotationZ(Math.PI); + expect(rotX.multiply(rotY).isEquivalent(mx.Matrix44.createScale(new mx.Vector3(-1, -1, 1)), _epsilon)); + expect(rotX.multiply(rotZ).isEquivalent(mx.Matrix44.createScale(new mx.Vector3(-1, 1, -1)), _epsilon)); + expect(rotY.multiply(rotZ).isEquivalent(mx.Matrix44.createScale(new mx.Vector3(1, -1, -1)), _epsilon)); // Matrix copy const trans2 = trans.copy(); From 5930f7bc3cc876411abb7e6b40d824935a9163d2 Mon Sep 17 00:00:00 2001 From: Sebastian Dunkel Date: Wed, 12 May 2021 12:29:21 +0200 Subject: [PATCH 02/33] Iterator protocol implemented --- .../JsMaterialXCore/JsTraversal.cpp | 41 +++++++------------ source/JsMaterialX/JsMaterialXCore/JsUtil.cpp | 9 ---- .../JsMaterialX/JsMaterialXCore/JsVariant.cpp | 4 +- source/JsMaterialX/test/codeExamples.spec.js | 8 ++-- source/JsMaterialX/test/readXml.spec.js | 4 +- source/JsMaterialX/test/testHelpers.js | 4 +- 6 files changed, 24 insertions(+), 46 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp b/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp index 526543c1c0..e8692d231d 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp @@ -9,6 +9,18 @@ namespace ems = emscripten; namespace mx = MaterialX; +#define BIND_ITERABLE_PROTOCOL(NAME) \ + .function("next", ems::optional_override([](mx::NAME &it) { \ + bool done = ++it == it.end(); \ + ems::val result = ems::val::object(); \ + result.set("done", done); \ + if (!done) result.set("value", *it); \ + return result; \ + })); \ + EM_ASM( \ + Module[#NAME]['prototype'][Symbol.iterator] = function() { return this; }; \ + ); + extern "C" { EMSCRIPTEN_BINDINGS(traversal) @@ -26,14 +38,7 @@ extern "C" .function("getElementDepth", &mx::TreeIterator::getElementDepth) .function("setPruneSubtree", &mx::TreeIterator::setPruneSubtree) .function("getPruneSubtree", &mx::TreeIterator::getPruneSubtree) - .function("iter", ems::optional_override([](mx::TreeIterator &it) -> mx::TreeIterator & { - return it.begin(1); - })) - .function("next", ems::optional_override([](mx::TreeIterator &it) { - if (++it == it.end()) - throw mx::Exception("Could not get the next element."); - return *it; - })); + BIND_ITERABLE_PROTOCOL(TreeIterator) ems::class_("GraphIterator") .smart_ptr_constructor("GraphIterator", &std::make_shared) @@ -45,27 +50,11 @@ extern "C" .function("getNodeDepth", &mx::GraphIterator::getNodeDepth) .function("setPruneSubgraph", &mx::GraphIterator::setPruneSubgraph) .function("getPruneSubgraph", &mx::GraphIterator::getPruneSubgraph) - .function("iter", ems::optional_override([](mx::GraphIterator &it) -> mx::GraphIterator & { - return it.begin(1); - })) - .function("next", ems::optional_override([](mx::GraphIterator &it) { - if (++it == it.end()) - throw mx::Exception("Could not get the next element."); - - return *it; - })); + BIND_ITERABLE_PROTOCOL(GraphIterator) ems::class_("InheritanceIterator") .smart_ptr_constructor("InheritanceIterator", &std::make_shared) - - .function("begin", ems::optional_override([](mx::InheritanceIterator &it) -> mx::InheritanceIterator & { - return it.begin(1); - })) - .function("next", ems::optional_override([](mx::InheritanceIterator &it) { - if (++it == it.end()) - throw mx::Exception("Could not get the next element."); - return *it; - })); + BIND_ITERABLE_PROTOCOL(InheritanceIterator) // TODO Wrap ExceptionFoundCycle? diff --git a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp index ef06176f18..0fc31e098d 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp @@ -1,14 +1,5 @@ -#include "../helpers.h" -#include #include -#include -#include -#include -#include -#include -#include - #include #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp b/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp index c88b66a5af..5eec66a378 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp @@ -34,6 +34,8 @@ extern "C" .function("setVariantString", &mx::VariantAssign::setVariantString) .function("hasVariantString", &mx::VariantAssign::hasVariantString) .function("getVariantString", &mx::VariantAssign::getVariantString) - .class_property("CATEGORY", &mx::VariantAssign::CATEGORY); + .class_property("CATEGORY", &mx::VariantAssign::CATEGORY) + .class_property("VARIANT_SET_ATTRIBUTE", &mx::VariantAssign::VARIANT_SET_ATTRIBUTE) + .class_property("VARIANT_ATTRIBUTE", &mx::VariantAssign::VARIANT_ATTRIBUTE); } } \ No newline at end of file diff --git a/source/JsMaterialX/test/codeExamples.spec.js b/source/JsMaterialX/test/codeExamples.spec.js index 777e8fe1e5..283febf096 100644 --- a/source/JsMaterialX/test/codeExamples.spec.js +++ b/source/JsMaterialX/test/codeExamples.spec.js @@ -88,12 +88,12 @@ describe('Code Examples', () => { // Traverse the document tree in depth-first order. const elements = doc.traverseTree(); - let elem = elements.next(); - expect(elem).to.exist; + //let elem = elements.next(); + //expect(elem).to.exist; let elementCount = 0; let nodeCount = 0; let fileCount = 0; - while (elem) { + for(let elem of elements) { elementCount++; // Display the filename of each image node. if (elem instanceof mx.Node) { @@ -106,7 +106,7 @@ describe('Code Examples', () => { expect(filename).to.equal('greysphere_calibration.png'); } } - elem = elements.next(); + //elem = elements.next(); } expect(elementCount).to.equal(21); expect(nodeCount).to.equal(5); diff --git a/source/JsMaterialX/test/readXml.spec.js b/source/JsMaterialX/test/readXml.spec.js index 5c414605f9..8a69ab6425 100644 --- a/source/JsMaterialX/test/readXml.spec.js +++ b/source/JsMaterialX/test/readXml.spec.js @@ -46,12 +46,10 @@ describe('Build Document', () => { // Traverse the document tree. let valueElementCount = 0; const treeIter = doc.traverseTree(); - let elem = treeIter.next(); - while (elem) { + for(const elem of treeIter) { if (elem instanceof mx.ValueElement) { valueElementCount++; } - elem = treeIter.next(); } expect(valueElementCount).to.be.greaterThan(0); diff --git a/source/JsMaterialX/test/testHelpers.js b/source/JsMaterialX/test/testHelpers.js index 5b206c4001..43994ba97c 100644 --- a/source/JsMaterialX/test/testHelpers.js +++ b/source/JsMaterialX/test/testHelpers.js @@ -22,10 +22,8 @@ export function initMaterialX() { * @param {function} elemCb - callback called on each element. The element is passed to the callback. */ export function traverse(elements, elemCb) { - var elem = elements.next(); - while (elem) { + for(const elem of elements) { elemCb && elemCb(elem); - elem = elements.next(); } } From cf229af66bb5d4f5077ddaef863c095d3c67e616 Mon Sep 17 00:00:00 2001 From: Sebastian Dunkel Date: Fri, 14 May 2021 11:10:21 +0200 Subject: [PATCH 03/33] Added default args and validate bindings --- .../JsMaterialXCore/JsDocument.cpp | 3 +- .../JsMaterialX/JsMaterialXCore/JsElement.cpp | 8 ++--- .../JsMaterialX/JsMaterialXCore/JsElement.js | 1 - .../JsMaterialXCore/JsInterface.cpp | 5 ++- source/JsMaterialX/JsMaterialXCore/JsNode.cpp | 32 ++++++++++--------- .../JsMaterialXCore/JsProperty.cpp | 2 +- source/JsMaterialX/JsMaterialXCore/JsUtil.cpp | 9 ++++-- source/JsMaterialX/JsMaterialXCore/JsUtil.js | 9 ++---- .../JsMaterialX/JsMaterialXCore/JsVariant.cpp | 4 ++- source/JsMaterialX/helpers.h | 14 +++++++- source/JsMaterialX/test/traverseGraph.spec.js | 2 +- 11 files changed, 53 insertions(+), 36 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp index 8ef7c5dd8c..7c2f2099c6 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp @@ -89,6 +89,7 @@ extern "C" .function("getColorManagementSystem", &mx::Document::getColorManagementSystem) .function("setColorManagementConfig", &mx::Document::setColorManagementConfig) .function("hasColorManagementConfig", &mx::Document::hasColorManagementConfig) - .function("getColorManagementConfig", &mx::Document::getColorManagementConfig); + .function("getColorManagementConfig", &mx::Document::getColorManagementConfig) + BIND_VALIDATE(mx::Document); } } \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp index 9a9bc6dbd7..df6c658aa1 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp @@ -95,10 +95,7 @@ extern "C" .function("hasSourceUri", &mx::Element::hasSourceUri) .function("getSourceUri", &mx::Element::getSourceUri) .function("getActiveSourceUri", &mx::Element::getActiveSourceUri) - .function("validate", ems::optional_override([](mx::Element &self, std::string message) { - bool res = self.mx::Element::validate(&message); - return res; - })) + BIND_VALIDATE(mx::Element) .function("copyContentFrom", ems::optional_override([](mx::Element &self, mx::ConstElementPtr source) { const mx::ConstElementPtr &source1 = source; return self.mx::Element::copyContentFrom(source1); @@ -195,7 +192,8 @@ extern "C" BIND_VALUE_ELEMENT_FUNC_INSTANCE(integerarray, mx::IntVec) BIND_VALUE_ELEMENT_FUNC_INSTANCE(booleanarray, mx::BoolVec) BIND_VALUE_ELEMENT_FUNC_INSTANCE(floatarray, mx::FloatVec) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(stringarray, mx::StringVec); + BIND_VALUE_ELEMENT_FUNC_INSTANCE(stringarray, mx::StringVec) + BIND_VALIDATE(mx::ValueElement); ems::class_>("Token") .smart_ptr_constructor("Token", &std::make_shared) diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.js b/source/JsMaterialX/JsMaterialXCore/JsElement.js index 75b2722015..73c5c296af 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.js +++ b/source/JsMaterialX/JsMaterialXCore/JsElement.js @@ -8,7 +8,6 @@ addWrapper(function (Module, api) { copyContentFrom: [REQUIRED], getUpstreamEdge: [0], getUpstreamElement: [0], - validate: [''], createStringResolver: [api.EMPTY_STRING], traverseGraph: [], }); diff --git a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp index cb2d0fbcd0..1ff0c61bf9 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp @@ -26,7 +26,8 @@ extern "C" .function("setConnectedNode", &mx::PortElement::setConnectedNode) .function("getConnectedNode", &mx::PortElement::getConnectedNode) .function("hasOutputString", &mx::PortElement::hasOutputString) - .function("getOutputString", &mx::PortElement::getOutputString); + .function("getOutputString", &mx::PortElement::getOutputString) + BIND_VALIDATE(mx::PortElement); ems::class_>("Input") .smart_ptr_constructor("Input", &std::make_shared) @@ -36,12 +37,14 @@ extern "C" .function("getDefaultGeomPropString", &mx::Input::getDefaultGeomPropString) .function("getDefaultGeomProp", &mx::Input::getDefaultGeomProp) .function("getConnectedOutput", &mx::Input::getConnectedOutput) + BIND_VALIDATE(mx::Input) .class_property("CATEGORY", &mx::Input::CATEGORY); ems::class_>("Output") .smart_ptr_constructor("Output", &std::make_shared) .smart_ptr>("Output") .function("hasUpstreamCycle", &mx::Output::hasUpstreamCycle) + BIND_VALIDATE(mx::Output) .class_property("CATEGORY", &mx::Output::CATEGORY) .class_property("DEFAULT_INPUT_ATTRIBUTE", &mx::Output::DEFAULT_INPUT_ATTRIBUTE); diff --git a/source/JsMaterialX/JsMaterialXCore/JsNode.cpp b/source/JsMaterialX/JsMaterialXCore/JsNode.cpp index 6d7ae311c9..471ef58f0d 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsNode.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsNode.cpp @@ -7,6 +7,8 @@ namespace ems = emscripten; namespace mx = MaterialX; +using stRef = const std::string&; + extern "C" { EMSCRIPTEN_BINDINGS(node) @@ -20,33 +22,33 @@ extern "C" .function("getConnectedNodeName", &mx::Node::getConnectedNodeName) .function("setConnectedOutput", &mx::Node::setConnectedOutput) .function("getConnectedOutput", &mx::Node::getConnectedOutput) - .function("getNodeDef", &mx::Node::getNodeDef) - .function("getImplementation", &mx::Node::getImplementation) - .function("getUpstreamEdge", &mx::Node::getUpstreamEdge) + BIND_FUNC("getNodeDef", mx::Node, getNodeDef, 0, 1, stRef) + BIND_FUNC("getImplementation", mx::Node, getImplementation, 0, 1, stRef) + BIND_FUNC("getUpstreamEdge", mx::Node, getUpstreamEdge, 0, 1, size_t) .function("getUpstreamEdgeCount", &mx::Node::getUpstreamEdgeCount) .function("getNodeDefOutput", &mx::Node::getNodeDefOutput) .function("getDownstreamPorts", &mx::Node::getDownstreamPorts) - .function("getDeclaration", &mx::Node::getDeclaration) + BIND_FUNC("getDeclaration", mx::Node, getDeclaration, 0, 1, stRef) .function("addInputFromNodeDef", &mx::Node::addInputFromNodeDef) - .function("validate", &mx::Node::validate, ems::allow_raw_pointers()) + BIND_VALIDATE(mx::Node) .class_property("CATEGORY", &mx::Node::CATEGORY); - + ems::class_>("GraphElement") .smart_ptr>("GraphElement") .smart_ptr>("GraphElement") - .function("addNode", &mx::GraphElement::addNode) - .function("addNodeInstance", &mx::GraphElement::addNodeInstance) + BIND_FUNC("addNode", mx::GraphElement, addNode, 1, 3, stRef, stRef, stRef) + BIND_FUNC("addNodeInstance", mx::GraphElement, addNodeInstance, 1, 2, mx::ConstNodeDefPtr, stRef) .function("getNode", &mx::GraphElement::getNode) - .function("getNodes", &mx::GraphElement::getNodes) + BIND_FUNC("getNodes", mx::GraphElement, getNodes, 0, 1, stRef) .function("getNodesOfType", &mx::GraphElement::getNodesOfType) .function("removeNode", &mx::GraphElement::removeNode) - .function("addMaterialNode", &mx::GraphElement::addMaterialNode) + BIND_FUNC("addMaterialNode", mx::GraphElement, addMaterialNode, 0, 2, stRef, mx::ConstNodePtr) .function("getMaterialNodes", &mx::GraphElement::getMaterialNodes) - .function("addBackdrop", &mx::GraphElement::addBackdrop) + BIND_FUNC("addBackdrop", mx::GraphElement, addBackdrop, 0, 1, stRef) .function("getBackdrop", &mx::GraphElement::getBackdrop) .function("getBackdrops", &mx::GraphElement::getBackdrops) .function("removeBackdrop", &mx::GraphElement::removeBackdrop) - .function("flattenSubgraphs", &mx::GraphElement::flattenSubgraphs) + BIND_FUNC("flattenSubgraphs", mx::GraphElement, flattenSubgraphs, 0, 2, stRef, mx::NodePredicate) .function("topologicalSort", &mx::GraphElement::topologicalSort) .function("asStringDot", &mx::GraphElement::asStringDot); @@ -56,11 +58,11 @@ extern "C" .function("setNodeDef", &mx::NodeGraph::setNodeDef) .function("getNodeDef", &mx::NodeGraph::getNodeDef) .function("getImplementation", &mx::NodeGraph::getImplementation) - .function("getDeclaration", &mx::NodeGraph::getDeclaration) + BIND_FUNC("getDeclaration", mx::NodeGraph, getDeclaration, 0, 1, stRef) .function("addInterfaceName", &mx::NodeGraph::addInterfaceName) .function("removeInterfaceName", &mx::NodeGraph::removeInterfaceName) .function("modifyInterfaceName", &mx::NodeGraph::modifyInterfaceName) - .function("validate", &mx::NodeGraph::validate, ems::allow_raw_pointers()) + BIND_VALIDATE(mx::NodeGraph) .class_property("CATEGORY", &mx::NodeGraph::CATEGORY); ems::class_>("Backdrop") @@ -77,7 +79,7 @@ extern "C" .function("getHeight", &mx::Backdrop::getHeight) .function("setContainsElements", &mx::Backdrop::setContainsElements) .function("getContainsElements", &mx::Backdrop::getContainsElements) - .function("validate", &mx::Backdrop::validate, ems::allow_raw_pointers()) + BIND_VALIDATE(mx::Backdrop) .class_property("CATEGORY", &mx::Backdrop::CATEGORY) .class_property("CONTAINS_ATTRIBUTE", &mx::Backdrop::CONTAINS_ATTRIBUTE) .class_property("WIDTH_ATTRIBUTE", &mx::Backdrop::WIDTH_ATTRIBUTE) diff --git a/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp b/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp index bb58fedb31..83c56aafc7 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp @@ -8,7 +8,7 @@ namespace ems = emscripten; namespace mx = MaterialX; #define BIND_PROPERTYSET_TYPE_INSTANCE(NAME, T) \ -.function("setPropertyValue" #NAME, &mx::PropertySet::setPropertyValue) + BIND_FUNC("setPropertyValue" #NAME, mx::PropertySet, setPropertyValue, 2, 3, const std::string&, const T&, const std::string&) extern "C" { diff --git a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp index 0fc31e098d..6c8506c301 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp @@ -12,13 +12,18 @@ extern "C" { ems::function("getVersionString", &mx::getVersionString); - // The following function throw: Cannot call {function name} due to unbound types: XXXXX ems::function("getVersionIntegers", ems::optional_override([]() { auto version = mx::getVersionIntegers(); return ems::val::array((int *)&version, (int *)&version + 3); })); - ems::function("createValidName", &mx::createValidName); // arg0 === {std::string}, arg1 === {unicode representing character} + ems::function("createValidName", ems::optional_override([](std::string name) { + return mx::createValidName(name); + })); + ems::function("createValidName", ems::optional_override([](std::string name, std::string replaceChar) { + return mx::createValidName(name, replaceChar.front()); + })); + ems::function("isValidName", &mx::isValidName); ems::function("incrementName", &mx::incrementName); diff --git a/source/JsMaterialX/JsMaterialXCore/JsUtil.js b/source/JsMaterialX/JsMaterialXCore/JsUtil.js index 0058bc628f..d2fa4f08cc 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUtil.js +++ b/source/JsMaterialX/JsMaterialXCore/JsUtil.js @@ -1,15 +1,10 @@ // jsUtil addWrapper(function(Module, api) { - // TODO: Wrap functions and provide default args api.getVersionString = Module.getVersionString; - api.createValidName = function(str, char) { - return Module.createValidName(str, char.charCodeAt(0)); - }; + api.createValidName = Module.createValidName; api.isValidName = Module.isValidName; api.incrementName = Module.incrementName; - api.getVersionIntegers = function() { - return Module.getVersionIntegers(); - }; + api.getVersionIntegers = Module.getVersionIntegers; }); diff --git a/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp b/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp index 5eec66a378..5743850726 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp @@ -7,6 +7,8 @@ namespace ems = emscripten; namespace mx = MaterialX; +using stRef = const std::string&; + extern "C" { EMSCRIPTEN_BINDINGS(variant) @@ -19,7 +21,7 @@ extern "C" ems::class_>("VariantSet") .smart_ptr_constructor("VariantSet", &std::make_shared) .smart_ptr>("VariantSet") - .function("addVariant", &mx::VariantSet::addVariant) + BIND_FUNC("addVariant", mx::VariantSet, addVariant, 0, 1, stRef) .function("getVariant", &mx::VariantSet::getVariant) .function("getVariants", &mx::VariantSet::getVariants) .function("removeVariant", &mx::VariantSet::removeVariant) diff --git a/source/JsMaterialX/helpers.h b/source/JsMaterialX/helpers.h index d7f56709b1..2c65661637 100644 --- a/source/JsMaterialX/helpers.h +++ b/source/JsMaterialX/helpers.h @@ -10,7 +10,6 @@ std::vector arrayToVec(myClass *arr, int size) return dest; } - // Binding helpers #define UNPACK(...) __VA_ARGS__ @@ -347,4 +346,17 @@ API(JSNAME, ems::optional_override([](SELF) { \ #define BIND_0_0(...) \ BIND_0(__VA_ARGS__) +#define BIND_VALIDATE(CLASSNAME) \ + .function("validate", ems::optional_override([](CLASSNAME &self) { \ + return self.CLASSNAME::validate(); \ + })) \ + .function("validate", ems::optional_override([](CLASSNAME &self, ems::val message) { \ + std::string nativeMessage; \ + bool handleMessage = message.typeOf().as() == "object"; \ + bool res = self.CLASSNAME::validate(handleMessage ? &nativeMessage : nullptr); \ + if (!res && handleMessage) \ + message.set("message", nativeMessage); \ + return res; \ + })) + #endif // JSMATERIALX_HELPERS_H \ No newline at end of file diff --git a/source/JsMaterialX/test/traverseGraph.spec.js b/source/JsMaterialX/test/traverseGraph.spec.js index 17d0190a86..d591716a95 100644 --- a/source/JsMaterialX/test/traverseGraph.spec.js +++ b/source/JsMaterialX/test/traverseGraph.spec.js @@ -177,7 +177,7 @@ describe('Traverse Graph', () => { return output.hasUpstreamCycle(); }) ).to.be.true; - expect( + expect( isCycle(() => { return doc.validate(); }) From f69b231481b8410bbcd6f7990085168d0b857b2e Mon Sep 17 00:00:00 2001 From: Sebastian Dunkel Date: Fri, 14 May 2021 11:24:01 +0200 Subject: [PATCH 04/33] Updated default arg binding funcs to new name --- source/JsMaterialX/JsMaterialXCore/JsNode.cpp | 22 +++++++++---------- .../JsMaterialXCore/JsProperty.cpp | 2 +- .../JsMaterialX/JsMaterialXCore/JsVariant.cpp | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsNode.cpp b/source/JsMaterialX/JsMaterialXCore/JsNode.cpp index 471ef58f0d..341735b9ec 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsNode.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsNode.cpp @@ -22,13 +22,13 @@ extern "C" .function("getConnectedNodeName", &mx::Node::getConnectedNodeName) .function("setConnectedOutput", &mx::Node::setConnectedOutput) .function("getConnectedOutput", &mx::Node::getConnectedOutput) - BIND_FUNC("getNodeDef", mx::Node, getNodeDef, 0, 1, stRef) - BIND_FUNC("getImplementation", mx::Node, getImplementation, 0, 1, stRef) - BIND_FUNC("getUpstreamEdge", mx::Node, getUpstreamEdge, 0, 1, size_t) + BIND_MEMBER_FUNC("getNodeDef", mx::Node, getNodeDef, 0, 1, stRef) + BIND_MEMBER_FUNC("getImplementation", mx::Node, getImplementation, 0, 1, stRef) + BIND_MEMBER_FUNC("getUpstreamEdge", mx::Node, getUpstreamEdge, 0, 1, size_t) .function("getUpstreamEdgeCount", &mx::Node::getUpstreamEdgeCount) .function("getNodeDefOutput", &mx::Node::getNodeDefOutput) .function("getDownstreamPorts", &mx::Node::getDownstreamPorts) - BIND_FUNC("getDeclaration", mx::Node, getDeclaration, 0, 1, stRef) + BIND_MEMBER_FUNC("getDeclaration", mx::Node, getDeclaration, 0, 1, stRef) .function("addInputFromNodeDef", &mx::Node::addInputFromNodeDef) BIND_VALIDATE(mx::Node) .class_property("CATEGORY", &mx::Node::CATEGORY); @@ -36,19 +36,19 @@ extern "C" ems::class_>("GraphElement") .smart_ptr>("GraphElement") .smart_ptr>("GraphElement") - BIND_FUNC("addNode", mx::GraphElement, addNode, 1, 3, stRef, stRef, stRef) - BIND_FUNC("addNodeInstance", mx::GraphElement, addNodeInstance, 1, 2, mx::ConstNodeDefPtr, stRef) + BIND_MEMBER_FUNC("addNode", mx::GraphElement, addNode, 1, 3, stRef, stRef, stRef) + BIND_MEMBER_FUNC("addNodeInstance", mx::GraphElement, addNodeInstance, 1, 2, mx::ConstNodeDefPtr, stRef) .function("getNode", &mx::GraphElement::getNode) - BIND_FUNC("getNodes", mx::GraphElement, getNodes, 0, 1, stRef) + BIND_MEMBER_FUNC("getNodes", mx::GraphElement, getNodes, 0, 1, stRef) .function("getNodesOfType", &mx::GraphElement::getNodesOfType) .function("removeNode", &mx::GraphElement::removeNode) - BIND_FUNC("addMaterialNode", mx::GraphElement, addMaterialNode, 0, 2, stRef, mx::ConstNodePtr) + BIND_MEMBER_FUNC("addMaterialNode", mx::GraphElement, addMaterialNode, 0, 2, stRef, mx::ConstNodePtr) .function("getMaterialNodes", &mx::GraphElement::getMaterialNodes) - BIND_FUNC("addBackdrop", mx::GraphElement, addBackdrop, 0, 1, stRef) + BIND_MEMBER_FUNC("addBackdrop", mx::GraphElement, addBackdrop, 0, 1, stRef) .function("getBackdrop", &mx::GraphElement::getBackdrop) .function("getBackdrops", &mx::GraphElement::getBackdrops) .function("removeBackdrop", &mx::GraphElement::removeBackdrop) - BIND_FUNC("flattenSubgraphs", mx::GraphElement, flattenSubgraphs, 0, 2, stRef, mx::NodePredicate) + BIND_MEMBER_FUNC("flattenSubgraphs", mx::GraphElement, flattenSubgraphs, 0, 2, stRef, mx::NodePredicate) .function("topologicalSort", &mx::GraphElement::topologicalSort) .function("asStringDot", &mx::GraphElement::asStringDot); @@ -58,7 +58,7 @@ extern "C" .function("setNodeDef", &mx::NodeGraph::setNodeDef) .function("getNodeDef", &mx::NodeGraph::getNodeDef) .function("getImplementation", &mx::NodeGraph::getImplementation) - BIND_FUNC("getDeclaration", mx::NodeGraph, getDeclaration, 0, 1, stRef) + BIND_MEMBER_FUNC("getDeclaration", mx::NodeGraph, getDeclaration, 0, 1, stRef) .function("addInterfaceName", &mx::NodeGraph::addInterfaceName) .function("removeInterfaceName", &mx::NodeGraph::removeInterfaceName) .function("modifyInterfaceName", &mx::NodeGraph::modifyInterfaceName) diff --git a/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp b/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp index 83c56aafc7..1812477b97 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp @@ -8,7 +8,7 @@ namespace ems = emscripten; namespace mx = MaterialX; #define BIND_PROPERTYSET_TYPE_INSTANCE(NAME, T) \ - BIND_FUNC("setPropertyValue" #NAME, mx::PropertySet, setPropertyValue, 2, 3, const std::string&, const T&, const std::string&) + BIND_MEMBER_FUNC("setPropertyValue" #NAME, mx::PropertySet, setPropertyValue, 2, 3, const std::string&, const T&, const std::string&) extern "C" { diff --git a/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp b/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp index 5743850726..01eda45741 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp @@ -21,7 +21,7 @@ extern "C" ems::class_>("VariantSet") .smart_ptr_constructor("VariantSet", &std::make_shared) .smart_ptr>("VariantSet") - BIND_FUNC("addVariant", mx::VariantSet, addVariant, 0, 1, stRef) + BIND_MEMBER_FUNC("addVariant", mx::VariantSet, addVariant, 0, 1, stRef) .function("getVariant", &mx::VariantSet::getVariant) .function("getVariants", &mx::VariantSet::getVariants) .function("removeVariant", &mx::VariantSet::removeVariant) From 15056440abb0871ebc03e8c877f5d5edc990b60a Mon Sep 17 00:00:00 2001 From: Cedrick Muenstermann Date: Fri, 14 May 2021 12:28:00 +0200 Subject: [PATCH 05/33] Update JsDefinition to JsLook --- .../JsMaterialXCore/JsDefinition.cpp | 52 +++++++- .../JsMaterialXCore/JsDocument.cpp | 18 ++- .../JsMaterialX/JsMaterialXCore/JsElement.cpp | 114 +++++++++--------- source/JsMaterialX/JsMaterialXCore/JsGeom.cpp | 51 ++++---- .../JsMaterialXCore/JsInterface.cpp | 75 ++++++++---- source/JsMaterialX/JsMaterialXCore/JsLook.cpp | 29 ++++- 6 files changed, 231 insertions(+), 108 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp index f96a460461..db8827fd4f 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp @@ -8,6 +8,9 @@ namespace ems = emscripten; namespace mx = MaterialX; +#define BIND_VALUE_ELEMENT_FUNC_INSTANCE(NAME, T) \ + .function("setValue" #NAME, &mx::AttributeDef::setValue) + extern "C" { EMSCRIPTEN_BINDINGS(definition) @@ -25,12 +28,14 @@ extern "C" .function("isVersionCompatible", &mx::NodeDef::isVersionCompatible) .class_property("CATEGORY", &mx::NodeDef::CATEGORY) .class_property("NODE_ATTRIBUTE", &mx::NodeDef::NODE_ATTRIBUTE) + .class_property("NODE_GROUP_ATTRIBUTE", &mx::NodeDef::NODE_GROUP_ATTRIBUTE) .class_property("TEXTURE_NODE_GROUP", &mx::NodeDef::TEXTURE_NODE_GROUP) .class_property("PROCEDURAL_NODE_GROUP", &mx::NodeDef::PROCEDURAL_NODE_GROUP) .class_property("GEOMETRIC_NODE_GROUP", &mx::NodeDef::GEOMETRIC_NODE_GROUP) .class_property("ADJUSTMENT_NODE_GROUP", &mx::NodeDef::ADJUSTMENT_NODE_GROUP) .class_property("CONDITIONAL_NODE_GROUP", &mx::NodeDef::CONDITIONAL_NODE_GROUP) - .class_property("ORGANIZATION_NODE_GROUP", &mx::NodeDef::ORGANIZATION_NODE_GROUP); + .class_property("ORGANIZATION_NODE_GROUP", &mx::NodeDef::ORGANIZATION_NODE_GROUP) + .class_property("TRANSLATION_NODE_GROUP", &mx::NodeDef::TRANSLATION_NODE_GROUP); ems::class_>("Implementation") .smart_ptr_constructor("Implementation", &std::make_shared) @@ -64,6 +69,12 @@ extern "C" .class_property("SEMANTIC_ATTRIBUTE", &mx::TypeDef::SEMANTIC_ATTRIBUTE) .class_property("CONTEXT_ATTRIBUTE", &mx::TypeDef::CONTEXT_ATTRIBUTE); + ems::class_>("TargetDef") + .smart_ptr_constructor("TargetDef", &std::make_shared) + .smart_ptr>("TargetDef") + .function("getMatchingTargets", &mx::TargetDef::getMatchingTargets) + .class_property("CATEGORY", &mx::TargetDef::CATEGORY); + ems::class_>("Member") .smart_ptr_constructor("Member", &std::make_shared) .smart_ptr>("Member") @@ -83,6 +94,7 @@ extern "C" .function("addUnit", &mx::UnitDef::addUnit) .function("getUnit", &mx::UnitDef::getUnit) .function("getUnits", &mx::UnitDef::getUnits) + .function("reomveUnit", &mx::UnitDef::removeUnit) .class_property("CATEGORY", &mx::UnitDef::CATEGORY) .class_property("UNITTYPE_ATTRIBUTE", &mx::UnitDef::UNITTYPE_ATTRIBUTE); @@ -91,5 +103,43 @@ extern "C" .smart_ptr>("UnitTypeDef") .function("getUnitDefs", &mx::UnitTypeDef::getUnitDefs) .class_property("CATEGORY", &mx::UnitTypeDef::CATEGORY); + + ems::class_>("AttributeDef") + .smart_ptr_constructor("AttributeDef", &std::make_shared) + .smart_ptr>("AttributeDef") + .function("setAttrName", &mx::AttributeDef::setAttrName) + .function("hasAttrName", &mx::AttributeDef::hasAttrName) + .function("getAttrName", &mx::AttributeDef::getAttrName) + .function("setValueString", &mx::AttributeDef::setValueString) + .function("hasValueString", &mx::AttributeDef::hasValueString) + .function("getValueString", &mx::AttributeDef::getValueString) + // .function("setValue", &mx::AttributeDef::setValue) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Integer, int) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Boolean, bool) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Float, float) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Color3, mx::Color3) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Color4, mx::Color4) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Vector2, mx::Vector2) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Vector3, mx::Vector3) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Vector4, mx::Vector4) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Matrix33, mx::Matrix33) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Matrix44, mx::Matrix44) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(String, std::string) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(IntegerArray, mx::IntVec) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(BooleanArray, mx::BoolVec) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(FloatArray, mx::FloatVec) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(StringArray, mx::StringVec) + .function("hasValue", &mx::AttributeDef::hasValue) + .function("getValue", &mx::AttributeDef::getValue) + .function("setElements", &mx::AttributeDef::setElements) + .function("hasElements", &mx::AttributeDef::hasElements) + .function("getElements", &mx::AttributeDef::getElements) + .function("setExportable", &mx::AttributeDef::setExportable) + .function("getExportable", &mx::AttributeDef::getExportable) + .class_property("CATEGORY", &mx::AttributeDef::CATEGORY) + .class_property("ATTRNAME_ATTRIBUTE", &mx::AttributeDef::ATTRNAME_ATTRIBUTE) + .class_property("VALUE_ATTRIBUTE", &mx::AttributeDef::VALUE_ATTRIBUTE) + .class_property("ELEMENTS_ATTRIBUTE", &mx::AttributeDef::ELEMENTS_ATTRIBUTE) + .class_property("EXPORTABLE_ATTRIBUTE", &mx::AttributeDef::EXPORTABLE_ATTRIBUTE); } } \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp index 7c2f2099c6..65a9d18c28 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp @@ -43,6 +43,7 @@ extern "C" .function("getLook", &mx::Document::getLook) .function("getLooks", &mx::Document::getLooks) .function("removeLook", &mx::Document::removeLook) + .function("mergeLooks", &mx::Document::mergeLooks) BIND_MEMBER_FUNC("addLookGroup", mx::Document, addLookGroup, 0, 1, stRef) .function("getLookGroup", &mx::Document::getLookGroup) .function("getLookGroups", &mx::Document::getLookGroups) @@ -62,7 +63,14 @@ extern "C" .function("getNodeDefs", &mx::Document::getNodeDefs) .function("removeNodeDef", &mx::Document::removeNodeDef) .function("getMatchingNodeDefs", &mx::Document::getMatchingNodeDefs) - .function("getMatchingImplementations", &mx::Document::getMatchingImplementations) + .function("addAttributeDef", &mx::Document::addAttributeDef) + .function("getAttributeDef", &mx::Document::getAttributeDef) + .function("getAttributeDefs", &mx::Document::getAttributeDefs) + .function("removeAttributeDef", &mx::Document::removeAttributeDef) + .function("addTargetDef", &mx::Document::addTargetDef) + .function("getTargetDef", &mx::Document::getTargetDef) + .function("getTargetDefs", &mx::Document::getTargetDefs) + .function("removeTargetDef", &mx::Document::removeTargetDef) BIND_MEMBER_FUNC("addPropertySet", mx::Document, addPropertySet, 0, 1, stRef) .function("getPropertySet", &mx::Document::getPropertySet) .function("getPropertySets", &mx::Document::getPropertySets) @@ -75,6 +83,7 @@ extern "C" .function("getImplementation", &mx::Document::getImplementation) .function("getImplementations", &mx::Document::getImplementations) .function("removeImplementation", &mx::Document::removeImplementation) + .function("getMatchingImplementations", &mx::Document::getMatchingImplementations) .function("addUnitDef", &mx::Document::addUnitDef) .function("getUnitDef", &mx::Document::getUnitDef) .function("getUnitDefs", &mx::Document::getUnitDefs) @@ -83,6 +92,7 @@ extern "C" .function("getUnitTypeDef", &mx::Document::getUnitTypeDef) .function("getUnitTypeDefs", &mx::Document::getUnitTypeDefs) .function("removeUnitTypeDef", &mx::Document::removeUnitTypeDef) + .function("getVersionIntegers", &mx::Document::getVersionIntegers) .function("upgradeVersion", &mx::Document::upgradeVersion) .function("setColorManagementSystem", &mx::Document::setColorManagementSystem) .function("hasColorManagementSystem", &mx::Document::hasColorManagementSystem) @@ -90,6 +100,10 @@ extern "C" .function("setColorManagementConfig", &mx::Document::setColorManagementConfig) .function("hasColorManagementConfig", &mx::Document::hasColorManagementConfig) .function("getColorManagementConfig", &mx::Document::getColorManagementConfig) - BIND_VALIDATE(mx::Document); + BIND_VALIDATE(mx::Document) + .function("invalidateCache", &mx::Document::invalidateCache) + .class_property("CATEGORY", &mx::Document::CATEGORY) + .class_property("CMS_ATTRIBUTE", &mx::Document::CMS_ATTRIBUTE) + .class_property("CMS_CONFIG_ATTRIBUTE", &mx::Document::CMS_CONFIG_ATTRIBUTE); } } \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp index df6c658aa1..e1c0e5d842 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp @@ -16,10 +16,10 @@ namespace mx = MaterialX; .function("setValue" #NAME, &mx::ValueElement::setValue) #define BIND_ELEMENT_FUNC_INSTANCE(T) \ - .function("_addChild" #T, &mx::Element::addChild) \ - .function("_getChildOfType" #T, &mx::Element::getChildOfType) \ - .function("_getChildrenOfType" #T, &mx::Element::getChildrenOfType) \ - .function("_removeChildOfType" #T, &mx::Element::removeChildOfType) + .function("addChild" #T, &mx::Element::addChild) \ + .function("getChildOfType" #T, &mx::Element::getChildOfType) \ + .function("getChildrenOfType" #T, &mx::Element::getChildrenOfType) \ + .function("removeChildOfType" #T, &mx::Element::removeChildOfType) extern "C" { @@ -30,41 +30,59 @@ extern "C" .smart_ptr>("Element") // mx::ConstElementPtr .function("setCategory", &mx::Element::setCategory) .function("getCategory", &mx::Element::getCategory) - .function("getName", &mx::Element::getName) .function("setName", &mx::Element::setName) + .function("getName", &mx::Element::getName) .function("getNamePath", &mx::Element::getNamePath) // might need to do something with the mx::ConstElementPtr relativeTo parameter - .function("setInheritsFrom", &mx::Element::setInheritsFrom) - .function("hasInheritedBase", &mx::Element::hasInheritedBase) + .function("getDescendant", &mx::Element::getDescendant) .function("setFilePrefix", &mx::Element::setFilePrefix) - .function("setColorSpace", &mx::Element::setColorSpace) - .function("setGeomPrefix", &mx::Element::setGeomPrefix) - .function("setInheritString", &mx::Element::setInheritString) - .function("setNamespace", &mx::Element::setNamespace) - .function("setDocString", &mx::Element::setDocString) - .function("addChildOfCategory", &mx::Element::addChildOfCategory) + .function("hasFilePrefix", &mx::Element::hasFilePrefix) + .function("getFilePrefix", &mx::Element::getFilePrefix) .function("getActiveFilePrefix", &mx::Element::getActiveFilePrefix) + .function("setGeomPrefix", &mx::Element::setGeomPrefix) + .function("hasGeomPrefix", &mx::Element::hasGeomPrefix) + .function("getGeomPrefix", &mx::Element::getGeomPrefix) .function("getActiveGeomPrefix", &mx::Element::getActiveGeomPrefix) + .function("setColorSpace", &mx::Element::setColorSpace) + .function("hasColorSpace", &mx::Element::hasColorSpace) + .function("getColorSpace", &mx::Element::getColorSpace) .function("getActiveColorSpace", &mx::Element::getActiveColorSpace) + .function("setInheritString", &mx::Element::setInheritString) + .function("hasInheritString", &mx::Element::hasInheritString) + .function("getInheritString", &mx::Element::getInheritString) + .function("setInheritsFrom", &mx::Element::setInheritsFrom) .function("getInheritsFrom", &mx::Element::getInheritsFrom) + .function("hasInheritedBase", &mx::Element::hasInheritedBase) .function("hasInheritanceCycle", &mx::Element::hasInheritanceCycle) - .function("getQualifiedName", &mx::Element::getQualifiedName) - .function("hasFilePrefix", &mx::Element::hasFilePrefix) - .function("hasGeomPrefix", &mx::Element::hasGeomPrefix) - .function("hasColorSpace", &mx::Element::hasColorSpace) - .function("hasInheritString", &mx::Element::hasInheritString) + .function("setNamespace", &mx::Element::setNamespace) .function("hasNamespace", &mx::Element::hasNamespace) - .function("getFilePrefix", &mx::Element::getFilePrefix) - .function("getGeomPrefix", &mx::Element::getGeomPrefix) - .function("getColorSpace", &mx::Element::getColorSpace) - .function("getInheritString", &mx::Element::getInheritString) .function("getNamespace", &mx::Element::getNamespace) + .function("getQualifiedName", &mx::Element::getQualifiedName) + .function("setDocString", &mx::Element::setDocString) .function("getDocString", &mx::Element::getDocString) + .function("addChildOfCategory", &mx::Element::addChildOfCategory) + .function("changeChildCategory", &mx::Element::changeChildCategory) .function("getChild", &mx::Element::getChild) .function("getChildren", &mx::Element::getChildren) .function("setChildIndex", &mx::Element::setChildIndex) .function("getChildIndex", &mx::Element::getChildIndex) .function("removeChild", &mx::Element::removeChild) + BIND_ELEMENT_FUNC_INSTANCE(mx::Collection) + BIND_ELEMENT_FUNC_INSTANCE(mx::Document) + BIND_ELEMENT_FUNC_INSTANCE(mx::GeomInfo) + BIND_ELEMENT_FUNC_INSTANCE(mx::GeomProp) + BIND_ELEMENT_FUNC_INSTANCE(mx::Implementation) + BIND_ELEMENT_FUNC_INSTANCE(mx::Look) + BIND_ELEMENT_FUNC_INSTANCE(mx::MaterialAssign) + BIND_ELEMENT_FUNC_INSTANCE(mx::Node) + BIND_ELEMENT_FUNC_INSTANCE(mx::NodeDef) + BIND_ELEMENT_FUNC_INSTANCE(mx::NodeGraph) + BIND_ELEMENT_FUNC_INSTANCE(mx::Property) + BIND_ELEMENT_FUNC_INSTANCE(mx::PropertySet) + BIND_ELEMENT_FUNC_INSTANCE(mx::PropertySetAssign) + BIND_ELEMENT_FUNC_INSTANCE(mx::Token) + BIND_ELEMENT_FUNC_INSTANCE(mx::TypeDef) + BIND_ELEMENT_FUNC_INSTANCE(mx::Visibility) .function("setAttribute", &mx::Element::setAttribute) .function("hasAttribute", &mx::Element::hasAttribute) @@ -105,22 +123,7 @@ extern "C" .function("createStringResolver", &mx::Element::createStringResolver) .function("asString", &mx::Element::asString) .function("__str__", &mx::Element::asString) - BIND_ELEMENT_FUNC_INSTANCE(mx::Collection) - BIND_ELEMENT_FUNC_INSTANCE(mx::Document) - BIND_ELEMENT_FUNC_INSTANCE(mx::GeomInfo) - BIND_ELEMENT_FUNC_INSTANCE(mx::GeomProp) - BIND_ELEMENT_FUNC_INSTANCE(mx::Implementation) - BIND_ELEMENT_FUNC_INSTANCE(mx::Look) - BIND_ELEMENT_FUNC_INSTANCE(mx::MaterialAssign) - BIND_ELEMENT_FUNC_INSTANCE(mx::Node) - BIND_ELEMENT_FUNC_INSTANCE(mx::NodeDef) - BIND_ELEMENT_FUNC_INSTANCE(mx::NodeGraph) - BIND_ELEMENT_FUNC_INSTANCE(mx::Property) - BIND_ELEMENT_FUNC_INSTANCE(mx::PropertySet) - BIND_ELEMENT_FUNC_INSTANCE(mx::PropertySetAssign) - BIND_ELEMENT_FUNC_INSTANCE(mx::Token) - BIND_ELEMENT_FUNC_INSTANCE(mx::TypeDef) - BIND_ELEMENT_FUNC_INSTANCE(mx::Visibility) + .class_property("NAME_ATTRIBUTE", &mx::Element::NAME_ATTRIBUTE) .class_property("FILE_PREFIX_ATTRIBUTE", &mx::Element::FILE_PREFIX_ATTRIBUTE) .class_property("GEOM_PREFIX_ATTRIBUTE", &mx::Element::GEOM_PREFIX_ATTRIBUTE) @@ -152,6 +155,22 @@ extern "C" .function("setImplementationName", &mx::ValueElement::setImplementationName) .function("hasImplementationName", &mx::ValueElement::hasImplementationName) .function("getImplementationName", &mx::ValueElement::getImplementationName) + // .function("setValue", &mx::ValueElement::setValue) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Integer, int) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Boolean, bool) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Float, float) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Color3, mx::Color3) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Color4, mx::Color4) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Vector2, mx::Vector2) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Vector3, mx::Vector3) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Vector4, mx::Vector4) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Matrix33, mx::Matrix33) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(Matrix44, mx::Matrix44) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(String, std::string) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(IntegerArray, mx::IntVec) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(BooleanArray, mx::BoolVec) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(FloatArray, mx::FloatVec) + BIND_VALUE_ELEMENT_FUNC_INSTANCE(StringArray, mx::StringVec) .function("getValue", &mx::ValueElement::getValue) .function("getDefaultValue", &mx::ValueElement::getDefaultValue) .function("setUnit", &mx::ValueElement::setUnit) @@ -163,6 +182,7 @@ extern "C" .function("getUnitType", &mx::ValueElement::getUnitType) .function("setIsUniform", &mx::ValueElement::setIsUniform) .function("getIsUniform", &mx::ValueElement::getIsUniform) + BIND_VALIDATE(mx::ValueElement) .class_property("VALUE_ATTRIBUTE", &mx::ValueElement::VALUE_ATTRIBUTE) .class_property("INTERFACE_NAME_ATTRIBUTE", &mx::ValueElement::INTERFACE_NAME_ATTRIBUTE) .class_property("IMPLEMENTATION_NAME_ATTRIBUTE", &mx::ValueElement::IMPLEMENTATION_NAME_ATTRIBUTE) @@ -177,23 +197,7 @@ extern "C" .class_property("UI_SOFT_MIN_ATTRIBUTE", &mx::ValueElement::UI_SOFT_MIN_ATTRIBUTE) .class_property("UI_SOFT_MAX_ATTRIBUTE", &mx::ValueElement::UI_SOFT_MAX_ATTRIBUTE) .class_property("UI_STEP_ATTRIBUTE", &mx::ValueElement::UI_STEP_ATTRIBUTE) - .class_property("UI_ADVANCED_ATTRIBUTE", &mx::ValueElement::UI_ADVANCED_ATTRIBUTE) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(integer, int) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(boolean, bool) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(float, float) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(color3, mx::Color3) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(color4, mx::Color4) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(vector2, mx::Vector2) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(vector3, mx::Vector3) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(vector4, mx::Vector4) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(matrix33, mx::Matrix33) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(matrix44, mx::Matrix44) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(string, std::string) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(integerarray, mx::IntVec) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(booleanarray, mx::BoolVec) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(floatarray, mx::FloatVec) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(stringarray, mx::StringVec) - BIND_VALIDATE(mx::ValueElement); + .class_property("UI_ADVANCED_ATTRIBUTE", &mx::ValueElement::UI_ADVANCED_ATTRIBUTE); ems::class_>("Token") .smart_ptr_constructor("Token", &std::make_shared) diff --git a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp index 3089ca1382..0b82b3275c 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp @@ -8,7 +8,7 @@ namespace ems = emscripten; namespace mx = MaterialX; #define BIND_GEOMINFO_FUNC_INSTANCE(NAME, T) \ -.function("_setGeomPropValue" #NAME, &mx::GeomInfo::setGeomPropValue) +.function("setGeomPropValue" #NAME, &mx::GeomInfo::setGeomPropValue) extern "C" { @@ -20,11 +20,15 @@ extern "C" .function("setGeom", &mx::GeomElement::setGeom) .function("hasGeom", &mx::GeomElement::hasGeom) .function("getGeom", &mx::GeomElement::getGeom) + .function("getActiveGeom", &mx::GeomElement::getActiveGeom) .function("setCollectionString", &mx::GeomElement::setCollectionString) .function("hasCollectionString", &mx::GeomElement::hasCollectionString) .function("getCollectionString", &mx::GeomElement::getCollectionString) .function("setCollection", &mx::GeomElement::setCollection) - .function("getCollection", &mx::GeomElement::getCollection); + .function("getCollection", &mx::GeomElement::getCollection) + BIND_VALIDATE(mx::GeomElement) + .class_property("GEOM_ATTRIBUTE", &mx::GeomElement::GEOM_ATTRIBUTE) + .class_property("COLLECTION_ATTRIBUTE", &mx::GeomElement::COLLECTION_ATTRIBUTE); ems::class_>("GeomInfo") .smart_ptr_constructor("GeomInfo", &std::make_shared) @@ -37,22 +41,24 @@ extern "C" .function("getToken", &mx::GeomInfo::getToken) .function("getTokens", &mx::GeomInfo::getTokens) .function("removeToken", &mx::GeomInfo::removeToken) + .function("addTokens", &mx::GeomInfo::addTokens) + .function("setTokenValue", &mx::GeomInfo::setTokenValue) + BIND_GEOMINFO_FUNC_INSTANCE(Integer, int) + BIND_GEOMINFO_FUNC_INSTANCE(Boolean, bool) + BIND_GEOMINFO_FUNC_INSTANCE(Float, float) + BIND_GEOMINFO_FUNC_INSTANCE(Color3, mx::Color3) + BIND_GEOMINFO_FUNC_INSTANCE(Color4, mx::Color4) + BIND_GEOMINFO_FUNC_INSTANCE(Vector2, mx::Vector2) + BIND_GEOMINFO_FUNC_INSTANCE(Vector3, mx::Vector3) + BIND_GEOMINFO_FUNC_INSTANCE(Vector4, mx::Vector4) + BIND_GEOMINFO_FUNC_INSTANCE(Matrix33, mx::Matrix33) + BIND_GEOMINFO_FUNC_INSTANCE(Matrix44, mx::Matrix44) + BIND_GEOMINFO_FUNC_INSTANCE(String, std::string) + BIND_GEOMINFO_FUNC_INSTANCE(IntegerArray, mx::IntVec) + BIND_GEOMINFO_FUNC_INSTANCE(BooleanArray, mx::BoolVec) + BIND_GEOMINFO_FUNC_INSTANCE(FloatArray, mx::FloatVec) + BIND_GEOMINFO_FUNC_INSTANCE(StringArray, mx::StringVec) .function("setTokenValue", &mx::GeomInfo::setTokenValue) - BIND_GEOMINFO_FUNC_INSTANCE(integer, int) - BIND_GEOMINFO_FUNC_INSTANCE(boolean, bool) - BIND_GEOMINFO_FUNC_INSTANCE(float, float) - BIND_GEOMINFO_FUNC_INSTANCE(color3, mx::Color3) - BIND_GEOMINFO_FUNC_INSTANCE(color4, mx::Color4) - BIND_GEOMINFO_FUNC_INSTANCE(vector2, mx::Vector2) - BIND_GEOMINFO_FUNC_INSTANCE(vector3, mx::Vector3) - BIND_GEOMINFO_FUNC_INSTANCE(vector4, mx::Vector4) - BIND_GEOMINFO_FUNC_INSTANCE(matrix33, mx::Matrix33) - BIND_GEOMINFO_FUNC_INSTANCE(matrix44, mx::Matrix44) - BIND_GEOMINFO_FUNC_INSTANCE(string, std::string) - BIND_GEOMINFO_FUNC_INSTANCE(integerarray, mx::IntVec) - BIND_GEOMINFO_FUNC_INSTANCE(booleanarray, mx::BoolVec) - BIND_GEOMINFO_FUNC_INSTANCE(floatarray, mx::FloatVec) - BIND_GEOMINFO_FUNC_INSTANCE(stringarray, mx::StringVec) .class_property("CATEGORY", &mx::GeomInfo::CATEGORY); ems::class_>("GeomProp") @@ -72,9 +78,6 @@ extern "C" .function("setIndex", &mx::GeomPropDef::setIndex) .function("hasIndex", &mx::GeomPropDef::hasIndex) .function("getIndex", &mx::GeomPropDef::getIndex) - .function("setGeomProp", &mx::GeomPropDef::setGeomProp) - .function("hasGeomProp", &mx::GeomPropDef::hasGeomProp) - .function("getGeomProp", &mx::GeomPropDef::getGeomProp) .class_property("CATEGORY", &mx::GeomPropDef::CATEGORY); ems::class_>("Collection") @@ -83,9 +86,11 @@ extern "C" .function("setIncludeGeom", &mx::Collection::setIncludeGeom) .function("hasIncludeGeom", &mx::Collection::hasIncludeGeom) .function("getIncludeGeom", &mx::Collection::getIncludeGeom) + .function("getActiveIncludeGeom", &mx::Collection::getActiveIncludeGeom) .function("setExcludeGeom", &mx::Collection::setExcludeGeom) .function("hasExcludeGeom", &mx::Collection::hasExcludeGeom) .function("getExcludeGeom", &mx::Collection::getExcludeGeom) + .function("getActiveExcludeGeom", &mx::Collection::getActiveExcludeGeom) .function("setIncludeCollectionString", &mx::Collection::setIncludeCollectionString) .function("hasIncludeCollectionString", &mx::Collection::hasIncludeCollectionString) .function("getIncludeCollectionString", &mx::Collection::getIncludeCollectionString) @@ -94,7 +99,11 @@ extern "C" .function("getIncludeCollections", &mx::Collection::getIncludeCollections) .function("hasIncludeCycle", &mx::Collection::hasIncludeCycle) .function("matchesGeomString", &mx::Collection::matchesGeomString) - .class_property("CATEGORY", &mx::Collection::CATEGORY); + BIND_VALIDATE(mx::Collection) + .class_property("CATEGORY", &mx::Collection::CATEGORY) + .class_property("INCLUDE_GEOM_ATTRIBUTE", &mx::Collection::INCLUDE_GEOM_ATTRIBUTE) + .class_property("EXCLUDE_GEOM_ATTRIBUTE", &mx::Collection::EXCLUDE_GEOM_ATTRIBUTE) + .class_property("INCLUDE_COLLECTION_ATTRIBUTE", &mx::Collection::INCLUDE_COLLECTION_ATTRIBUTE); ems::function("geomStringsMatch", &mx::geomStringsMatch); diff --git a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp index 1ff0c61bf9..b4e2cac912 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp @@ -20,14 +20,26 @@ extern "C" .smart_ptr>("PortElement") .smart_ptr>("PortElement") .function("setNodeName", &mx::PortElement::setNodeName) + .function("hasNodeName", &mx::PortElement::hasNodeName) .function("getNodeName", &mx::PortElement::getNodeName) + .function("setNodeGraphString", &mx::PortElement::setNodeGraphString) + .function("hasNodeGraphString", &mx::PortElement::hasNodeGraphString) + .function("getNodeGraphString", &mx::PortElement::getNodeGraphString) + .function("setOutputString", &mx::PortElement::setOutputString) + .function("hasOutputString", &mx::PortElement::hasOutputString) + .function("getOutputString", &mx::PortElement::getOutputString) .function("setChannels", &mx::PortElement::setChannels) + .function("hasChannels", &mx::PortElement::hasChannels) .function("getChannels", &mx::PortElement::getChannels) + .function("validChannelsCharacters", &mx::PortElement::validChannelsCharacters) + .function("validChannelsString", &mx::PortElement::validChannelsString) .function("setConnectedNode", &mx::PortElement::setConnectedNode) .function("getConnectedNode", &mx::PortElement::getConnectedNode) - .function("hasOutputString", &mx::PortElement::hasOutputString) - .function("getOutputString", &mx::PortElement::getOutputString) - BIND_VALIDATE(mx::PortElement); + BIND_VALIDATE(mx::PortElement) + .class_property("NODE_NAME_ATTRIBUTE", &mx::PortElement::NODE_NAME_ATTRIBUTE) + .class_property("NODE_GRAPH_ATTRIBUTE", &mx::PortElement::NODE_GRAPH_ATTRIBUTE) + .class_property("OUTPUT_ATTRIBUTE", &mx::PortElement::OUTPUT_ATTRIBUTE) + .class_property("CHANNELS_ATTRIBUTE", &mx::PortElement::CHANNELS_ATTRIBUTE); ems::class_>("Input") .smart_ptr_constructor("Input", &std::make_shared) @@ -36,13 +48,20 @@ extern "C" .function("hasDefaultGeomPropString", &mx::Input::hasDefaultGeomPropString) .function("getDefaultGeomPropString", &mx::Input::getDefaultGeomPropString) .function("getDefaultGeomProp", &mx::Input::getDefaultGeomProp) + .function("getConnectedNode", &mx::Input::getConnectedNode) + .function("setConnectedOutput", &mx::Input::setConnectedOutput) .function("getConnectedOutput", &mx::Input::getConnectedOutput) + .function("getInterfaceInput", &mx::Input::getInterfaceInput) + .function("addTokens", &mx::Input::addTokens) BIND_VALIDATE(mx::Input) - .class_property("CATEGORY", &mx::Input::CATEGORY); + .class_property("CATEGORY", &mx::Input::CATEGORY) + .class_property("DEFAULT_GEOM_PROP_ATTRIBUTE", &mx::Input::DEFAULT_GEOM_PROP_ATTRIBUTE); ems::class_>("Output") .smart_ptr_constructor("Output", &std::make_shared) .smart_ptr>("Output") + .function("getUpstreamEdge", &mx::Output::getUpstreamEdge) + .function("getUpstreamEdgeCount", &mx::Output::getUpstreamEdgeCount) .function("hasUpstreamCycle", &mx::Output::hasUpstreamCycle) BIND_VALIDATE(mx::Output) .class_property("CATEGORY", &mx::Output::CATEGORY) @@ -69,6 +88,8 @@ extern "C" .function("removeOutput", &mx::InterfaceElement::removeOutput) .function("getActiveOutput", &mx::InterfaceElement::getActiveOutput) .function("getActiveOutputs", &mx::InterfaceElement::getActiveOutputs) + .function("setConnectedOutput", &mx::InterfaceElement::setConnectedOutput) + .function("getConnectedOutput", &mx::InterfaceElement::getConnectedOutput) .function("addToken", &mx::InterfaceElement::addToken) .function("getToken", &mx::InterfaceElement::getToken) @@ -76,46 +97,50 @@ extern "C" .function("removeToken", &mx::InterfaceElement::removeToken) .function("getActiveToken", &mx::InterfaceElement::getActiveToken) .function("getActiveTokens", &mx::InterfaceElement::getActiveTokens) + .function("addTokens", &mx::InterfaceElement::addTokens) + .function("getValueElement", &mx::InterfaceElement::getValueElement) .function("getActiveValueElement", &mx::InterfaceElement::getActiveValueElement) .function("getActiveValueElements", &mx::InterfaceElement::getActiveValueElements) + BIND_INTERFACE_TYPE_INSTANCE(Integer, int) + BIND_INTERFACE_TYPE_INSTANCE(Boolean, bool) + BIND_INTERFACE_TYPE_INSTANCE(Float, float) + BIND_INTERFACE_TYPE_INSTANCE(Color3, mx::Color3) + BIND_INTERFACE_TYPE_INSTANCE(Color4, mx::Color4) + BIND_INTERFACE_TYPE_INSTANCE(Vector2, mx::Vector2) + BIND_INTERFACE_TYPE_INSTANCE(Vector3, mx::Vector3) + BIND_INTERFACE_TYPE_INSTANCE(Vector4, mx::Vector4) + BIND_INTERFACE_TYPE_INSTANCE(Matrix33, mx::Matrix33) + BIND_INTERFACE_TYPE_INSTANCE(Matrix44, mx::Matrix44) + BIND_INTERFACE_TYPE_INSTANCE(String, std::string) + BIND_INTERFACE_TYPE_INSTANCE(IntegerArray, mx::IntVec) + BIND_INTERFACE_TYPE_INSTANCE(BooleanArray, mx::BoolVec) + BIND_INTERFACE_TYPE_INSTANCE(FloatArray, mx::FloatVec) + BIND_INTERFACE_TYPE_INSTANCE(StringArray, mx::StringVec) .function("getInputValue", &mx::InterfaceElement::getInputValue) + .function("setTokenValue", &mx::InterfaceElement::setTokenValue) + .function("getTokenValue", &mx::InterfaceElement::getTokenValue) + .function("setTarget", &mx::InterfaceElement::setTarget) - .function("getTarget", &mx::InterfaceElement::getTarget) .function("hasTarget", &mx::InterfaceElement::hasTarget) + .function("getTarget", &mx::InterfaceElement::getTarget) .function("setVersionString", &mx::InterfaceElement::setVersionString) - .function("getVersionString", &mx::InterfaceElement::getVersionString) .function("hasVersionString", &mx::InterfaceElement::hasVersionString) - .function("setDefaultVersion", &mx::InterfaceElement::setDefaultVersion) - .function("getDefaultVersion", &mx::InterfaceElement::getDefaultVersion) + .function("getVersionString", &mx::InterfaceElement::getVersionString) + .function("setVersionIntegers", &mx::InterfaceElement::getVersionIntegers) .function("getVersionIntegers", ems::optional_override([](mx::InterfaceElement &self) { // std::pair throws a unbound type error when invoking the function in javascript // As a result, the std:pair will be converted into an array. std::pair versionInts = self.getVersionIntegers(); return arrayToVec((int *)&versionInts, 2); })) + .function("setDefaultVersion", &mx::InterfaceElement::setDefaultVersion) + .function("getDefaultVersion", &mx::InterfaceElement::getDefaultVersion) - .function("setTokenValue", &mx::InterfaceElement::setTokenValue) - .function("getTokenValue", &mx::InterfaceElement::getTokenValue) .function("getDeclaration", &mx::InterfaceElement::getDeclaration) .function("isTypeCompatible", &mx::InterfaceElement::isTypeCompatible) - BIND_INTERFACE_TYPE_INSTANCE(integer, int) - BIND_INTERFACE_TYPE_INSTANCE(boolean, bool) - BIND_INTERFACE_TYPE_INSTANCE(float, float) - BIND_INTERFACE_TYPE_INSTANCE(color3, mx::Color3) - BIND_INTERFACE_TYPE_INSTANCE(color4, mx::Color4) - BIND_INTERFACE_TYPE_INSTANCE(vector2, mx::Vector2) - BIND_INTERFACE_TYPE_INSTANCE(vector3, mx::Vector3) - BIND_INTERFACE_TYPE_INSTANCE(vector4, mx::Vector4) - BIND_INTERFACE_TYPE_INSTANCE(matrix33, mx::Matrix33) - BIND_INTERFACE_TYPE_INSTANCE(matrix44, mx::Matrix44) - BIND_INTERFACE_TYPE_INSTANCE(string, std::string) - BIND_INTERFACE_TYPE_INSTANCE(integerarray, mx::IntVec) - BIND_INTERFACE_TYPE_INSTANCE(booleanarray, mx::BoolVec) - BIND_INTERFACE_TYPE_INSTANCE(floatarray, mx::FloatVec) - BIND_INTERFACE_TYPE_INSTANCE(stringarray, mx::StringVec) .class_property("NODE_DEF_ATTRIBUTE", &mx::InterfaceElement::NODE_DEF_ATTRIBUTE) .class_property("TARGET_ATTRIBUTE", &mx::InterfaceElement::TARGET_ATTRIBUTE) diff --git a/source/JsMaterialX/JsMaterialXCore/JsLook.cpp b/source/JsMaterialX/JsMaterialXCore/JsLook.cpp index 13b37147a4..1b756f95ef 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsLook.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsLook.cpp @@ -25,31 +25,40 @@ extern "C" .function("getPropertyAssigns", &mx::Look::getPropertyAssigns) .function("getActivePropertyAssigns", &mx::Look::getActivePropertyAssigns) .function("removePropertyAssign", &mx::Look::removePropertyAssign) + .function("addPropertySetAssign", &mx::Look::addPropertySetAssign) .function("getPropertySetAssign", &mx::Look::getPropertySetAssign) .function("getPropertySetAssigns", &mx::Look::getPropertySetAssigns) .function("getActivePropertySetAssigns", &mx::Look::getActivePropertySetAssigns) .function("removePropertySetAssign", &mx::Look::removePropertySetAssign) + .function("addVariantAssign", &mx::Look::addVariantAssign) .function("getVariantAssign", &mx::Look::getVariantAssign) .function("getVariantAssigns", &mx::Look::getVariantAssigns) .function("getActiveVariantAssigns", &mx::Look::getActiveVariantAssigns) .function("removeVariantAssign", &mx::Look::removeVariantAssign) + .function("addVisibility", &mx::Look::addVisibility) .function("getVisibility", &mx::Look::getVisibility) .function("getVisibilities", &mx::Look::getVisibilities) .function("getActiveVisibilities", &mx::Look::getActiveVisibilities) .function("removeVisibility", &mx::Look::removeVisibility) + .function("append", &mx::Look::append) + .class_property("CATEGORY", &mx::Look::CATEGORY); ems::class_>("LookGroup") .smart_ptr_constructor("LookGroup", &std::make_shared) .smart_ptr>("LookGroup") - .function("getLooks", &mx::LookGroup::getLooks) .function("setLooks", &mx::LookGroup::setLooks) - .function("getEnabledLooksString", &mx::LookGroup::getEnabledLooksString) + .function("getLooks", &mx::LookGroup::getLooks) .function("setEnabledLooks", &mx::LookGroup::setEnabledLooks) + .function("getEnabledLooksString", &mx::LookGroup::getEnabledLooksString) + .function("getEnabledLooks", &mx::LookGroup::getEnabledLooks) + .function("appendLookGroup", &mx::LookGroup::appendLookGroup) + .function("appnedLook", &mx::LookGroup::appendLook) + .function("combineLooks", &mx::LookGroup::combineLooks) .class_property("CATEGORY", &mx::LookGroup::CATEGORY) .class_property("LOOKS_ATTRIBUTE", &mx::LookGroup::LOOKS_ATTRIBUTE) .class_property("ENABLED_ATTRIBUTE", &mx::LookGroup::ENABLED_ATTRIBUTE); @@ -63,7 +72,15 @@ extern "C" .function("setExclusive", &mx::MaterialAssign::setExclusive) .function("getExclusive", &mx::MaterialAssign::getExclusive) .function("getReferencedMaterial", &mx::MaterialAssign::getReferencedMaterial) - .class_property("CATEGORY", &mx::MaterialAssign::CATEGORY); + .function("addVariantAssign", &mx::MaterialAssign::addVariantAssign) + .function("getVariantAssign", &mx::MaterialAssign::getVariantAssign) + .function("getVariantAssigns", &mx::MaterialAssign::getVariantAssigns) + .function("getActiveVariantAssigns", &mx::MaterialAssign::getActiveVariantAssigns) + .function("removeVariantAssign", &mx::MaterialAssign::removeVariantAssign) + .class_property("CATEGORY", &mx::MaterialAssign::CATEGORY) + .class_property("MATERIAL_ATTRIBUTE", &mx::MaterialAssign::MATERIAL_ATTRIBUTE) + .class_property("EXCLUSIVE_ATTRIBUTE", &mx::MaterialAssign::EXCLUSIVE_ATTRIBUTE); + ems::class_>("Visibility") .smart_ptr_constructor("Visibility", &std::make_shared) @@ -79,6 +96,10 @@ extern "C" .function("getVisibilityType", &mx::Visibility::getVisibilityType) .function("setVisible", &mx::Visibility::setVisible) .function("getVisible", &mx::Visibility::getVisible) - .class_property("CATEGORY", &mx::Visibility::CATEGORY); + .class_property("CATEGORY", &mx::Visibility::CATEGORY) + .class_property("VIEWER_GEOM_ATTRIBUTE", &mx::Visibility::VIEWER_GEOM_ATTRIBUTE) + .class_property("VIEWER_COLLECTION_ATTRIBUTE", &mx::Visibility::VIEWER_COLLECTION_ATTRIBUTE) + .class_property("VISIBILITY_TYPE_ATTRIBUTE", &mx::Visibility::VISIBILITY_TYPE_ATTRIBUTE) + .class_property("VISIBLE_ATTRIBUTE", &mx::Visibility::VISIBLE_ATTRIBUTE); } } \ No newline at end of file From fbe18848eff63378e4268a730c9e279ab5253ff9 Mon Sep 17 00:00:00 2001 From: Cedrick Muenstermann Date: Fri, 14 May 2021 17:27:59 +0200 Subject: [PATCH 06/33] Default Args for JsDefinition to JsLook --- .../JsMaterialXCore/JsDefinition.cpp | 10 ++++- .../JsMaterialXCore/JsDefinition.js | 8 +--- .../JsMaterialXCore/JsDocument.cpp | 4 +- .../JsMaterialX/JsMaterialXCore/JsElement.cpp | 25 ++++++------ .../JsMaterialX/JsMaterialXCore/JsElement.js | 39 +------------------ source/JsMaterialX/JsMaterialXCore/JsGeom.cpp | 8 ++-- .../JsMaterialXCore/JsInterface.cpp | 16 ++++---- .../JsMaterialXCore/JsInterface.js | 33 +--------------- source/JsMaterialX/JsMaterialXCore/JsLook.cpp | 18 +++++---- source/JsMaterialX/JsMaterialXCore/JsLook.js | 8 +--- 10 files changed, 54 insertions(+), 115 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp index db8827fd4f..1889f81431 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp @@ -8,6 +8,8 @@ namespace ems = emscripten; namespace mx = MaterialX; +using stRef = const std::string&; + #define BIND_VALUE_ELEMENT_FUNC_INSTANCE(NAME, T) \ .function("setValue" #NAME, &mx::AttributeDef::setValue) @@ -24,8 +26,10 @@ extern "C" .function("setNodeGroup", &mx::NodeDef::setNodeGroup) .function("hasNodeGroup", &mx::NodeDef::hasNodeGroup) .function("getNodeGroup", &mx::NodeDef::getNodeGroup) - .function("getImplementation", &mx::NodeDef::getImplementation) + BIND_MEMBER_FUNC("getImplementation", mx::NodeDef, getImplementation, 0, 1, stRef) + BIND_VALIDATE(mx::NodeDef) .function("isVersionCompatible", &mx::NodeDef::isVersionCompatible) + BIND_MEMBER_FUNC("getDeclaration", mx::NodeDef, getDeclaration, 0, 1, stRef) .class_property("CATEGORY", &mx::NodeDef::CATEGORY) .class_property("NODE_ATTRIBUTE", &mx::NodeDef::NODE_ATTRIBUTE) .class_property("NODE_GROUP_ATTRIBUTE", &mx::NodeDef::NODE_GROUP_ATTRIBUTE) @@ -48,6 +52,8 @@ extern "C" .function("getFunction", &mx::Implementation::getFunction) .function("setNodeDef", &mx::Implementation::setNodeDef) .function("getNodeDef", &mx::Implementation::getNodeDef) + BIND_VALIDATE(mx::Implementation) + BIND_MEMBER_FUNC("getDeclaration", mx::Implementation, getDeclaration, 0, 1, stRef) .class_property("CATEGORY", &mx::Implementation::CATEGORY) .class_property("FILE_ATTRIBUTE", &mx::Implementation::FILE_ATTRIBUTE) .class_property("FUNCTION_ATTRIBUTE", &mx::Implementation::FUNCTION_ATTRIBUTE); @@ -61,7 +67,7 @@ extern "C" .function("setContext", &mx::TypeDef::setContext) .function("hasContext", &mx::TypeDef::hasContext) .function("getContext", &mx::TypeDef::getContext) - .function("addMember", &mx::TypeDef::addMember) + BIND_MEMBER_FUNC("addMember", mx::TypeDef, addMember, 0, 1, stRef) .function("getMember", &mx::TypeDef::getMember) .function("getMembers", &mx::TypeDef::getMembers) .function("removeMember", &mx::TypeDef::removeMember) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDefinition.js b/source/JsMaterialX/JsMaterialXCore/JsDefinition.js index 47ed9fc3b6..f2ca1a9243 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDefinition.js +++ b/source/JsMaterialX/JsMaterialXCore/JsDefinition.js @@ -1,17 +1,13 @@ // JsDefinition addWrapper(function(Module, api) { /** Setup the NodeDef class */ - api.NodeDef = wrapperFactory(Module.NodeDef, { - getImplementation: [api.EMPTY_STRING] - }); + api.NodeDef = wrapperFactory(Module.NodeDef); /** Setup the Implementation class */ api.Implementation = wrapperFactory(Module.Implementation); /** Setup the TypeDef class */ - api.TypeDef = wrapperFactory(Module.TypeDef, { - addMember: [api.EMPTY_STRING] - }); + api.TypeDef = wrapperFactory(Module.TypeDef); /** Setup the Member class */ api.Member = wrapperFactory(Module.Member); diff --git a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp index 65a9d18c28..72a5f9b1db 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp @@ -63,11 +63,11 @@ extern "C" .function("getNodeDefs", &mx::Document::getNodeDefs) .function("removeNodeDef", &mx::Document::removeNodeDef) .function("getMatchingNodeDefs", &mx::Document::getMatchingNodeDefs) - .function("addAttributeDef", &mx::Document::addAttributeDef) + BIND_MEMBER_FUNC("addAttributeDef", mx::Document, addAttributeDef, 0, 1, stRef) .function("getAttributeDef", &mx::Document::getAttributeDef) .function("getAttributeDefs", &mx::Document::getAttributeDefs) .function("removeAttributeDef", &mx::Document::removeAttributeDef) - .function("addTargetDef", &mx::Document::addTargetDef) + BIND_MEMBER_FUNC("addTargetDef", mx::Document, addTargetDef, 0, 1, stRef) .function("getTargetDef", &mx::Document::getTargetDef) .function("getTargetDefs", &mx::Document::getTargetDefs) .function("removeTargetDef", &mx::Document::removeTargetDef) diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp index e1c0e5d842..96c0f94978 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp @@ -9,16 +9,18 @@ #include #include +using stRef = const std::string&; + namespace ems = emscripten; namespace mx = MaterialX; #define BIND_VALUE_ELEMENT_FUNC_INSTANCE(NAME, T) \ - .function("setValue" #NAME, &mx::ValueElement::setValue) + BIND_MEMBER_FUNC("setValue" #NAME, mx::ValueElement, setValue, 1, 2, const T&, stRef) -#define BIND_ELEMENT_FUNC_INSTANCE(T) \ - .function("addChild" #T, &mx::Element::addChild) \ - .function("getChildOfType" #T, &mx::Element::getChildOfType) \ - .function("getChildrenOfType" #T, &mx::Element::getChildrenOfType) \ +#define BIND_ELEMENT_FUNC_INSTANCE(T) \ + BIND_MEMBER_FUNC("addChild" #T, mx::Element, addChild, 0, 1, stRef) \ + .function("getChildOfType" #T, &mx::Element::getChildOfType) \ + BIND_MEMBER_FUNC("getChildrenOfType" #T, mx::Element, getChildrenOfType, 0, 1, stRef) \ .function("removeChildOfType" #T, &mx::Element::removeChildOfType) extern "C" @@ -32,7 +34,7 @@ extern "C" .function("getCategory", &mx::Element::getCategory) .function("setName", &mx::Element::setName) .function("getName", &mx::Element::getName) - .function("getNamePath", &mx::Element::getNamePath) // might need to do something with the mx::ConstElementPtr relativeTo parameter + BIND_MEMBER_FUNC_RAW_PTR("getNamePath", mx::Element, getNamePath, 0, 1, mx::ConstElementPtr) .function("getDescendant", &mx::Element::getDescendant) .function("setFilePrefix", &mx::Element::setFilePrefix) .function("hasFilePrefix", &mx::Element::hasFilePrefix) @@ -60,7 +62,7 @@ extern "C" .function("setDocString", &mx::Element::setDocString) .function("getDocString", &mx::Element::getDocString) - .function("addChildOfCategory", &mx::Element::addChildOfCategory) + BIND_MEMBER_FUNC("addChildOfCategory", mx::Element, addChildOfCategory, 1, 2, stRef, std::string) .function("changeChildCategory", &mx::Element::changeChildCategory) .function("getChild", &mx::Element::getChild) .function("getChildren", &mx::Element::getChildren) @@ -104,9 +106,9 @@ extern "C" .function("traverseTree", &mx::Element::traverseTree) .function("traverseGraph", &mx::Element::traverseGraph) - .function("getUpstreamEdge", &mx::Element::getUpstreamEdge) + BIND_MEMBER_FUNC("getUpstreamEdge", mx::Element, getUpstreamEdge, 0, 1, std::size_t) .function("getUpstreamEdgeCount", &mx::Element::getUpstreamEdgeCount) - .function("getUpstreamElement", &mx::Element::getUpstreamElement) + BIND_MEMBER_FUNC("getUpstreamElement", mx::Element, getUpstreamElement, 0, 1, std::size_t) .function("traverseInheritance", &mx::Element::traverseInheritance) .function("setSourceUri", &mx::Element::setSourceUri) @@ -120,7 +122,7 @@ extern "C" })) .function("clearContent", &mx::Element::clearContent) .function("createValidChildName", &mx::Element::createValidChildName) - .function("createStringResolver", &mx::Element::createStringResolver) + BIND_MEMBER_FUNC("createStringResolver", mx::Element, createStringResolver, 0, 1, stRef) .function("asString", &mx::Element::asString) .function("__str__", &mx::Element::asString) @@ -148,7 +150,7 @@ extern "C" .function("setValueString", &mx::ValueElement::setValueString) .function("hasValueString", &mx::ValueElement::hasValueString) .function("getValueString", &mx::ValueElement::getValueString) - .function("getResolvedValueString", &mx::ValueElement::getResolvedValueString) + BIND_MEMBER_FUNC_RAW_PTR("getResolvedValueString", mx::ValueElement, getResolvedValueString, 0, 1, mx::StringResolverPtr) .function("setInterfaceName", &mx::ValueElement::setInterfaceName) .function("hasInterfaceName", &mx::ValueElement::hasInterfaceName) .function("getInterfaceName", &mx::ValueElement::getInterfaceName) @@ -173,6 +175,7 @@ extern "C" BIND_VALUE_ELEMENT_FUNC_INSTANCE(StringArray, mx::StringVec) .function("getValue", &mx::ValueElement::getValue) .function("getDefaultValue", &mx::ValueElement::getDefaultValue) + BIND_MEMBER_FUNC_RAW_PTR("getResolvedValue", mx::ValueElement, getResolvedValue, 0, 1, mx::StringResolverPtr) .function("setUnit", &mx::ValueElement::setUnit) .function("hasUnit", &mx::ValueElement::hasUnit) .function("getUnit", &mx::ValueElement::getUnit) diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.js b/source/JsMaterialX/JsMaterialXCore/JsElement.js index 73c5c296af..6c02a1954f 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.js +++ b/source/JsMaterialX/JsMaterialXCore/JsElement.js @@ -2,48 +2,13 @@ addWrapper(function (Module, api) { /** Setup the Element class */ - api.Element = wrapperFactory(Module.Element, { - getNamePath: [null], - addChildOfCategory: [REQUIRED, api.EMPTY_STRING], - copyContentFrom: [REQUIRED], - getUpstreamEdge: [0], - getUpstreamElement: [0], - createStringResolver: [api.EMPTY_STRING], - traverseGraph: [], - }); + api.Element = wrapperFactory(Module.Element); /** Setup the TypedElement class */ api.TypedElement = wrapperFactory(Module.TypedElement); - var funcs = [ - 'setValueinteger', - 'setValueboolean', - 'setValuefloat', - 'setValuecolor3', - 'setValuecolor4', - 'setValuevector2', - 'setValuevector3', - 'setValuevector4', - 'setValuematrix33', - 'setValuematrix44', - 'setValuestring', - 'setValueintegerarray', - 'setValuebooleanarray', - 'setValuefloatarray', - 'setValuestringarray', - ]; - - var defaultArgs = { - getResolvedValueString: [null], - }; - - for (var i = 0; i < funcs.length; i++) { - var name = funcs[parseInt(i, 10)]; - defaultArgs[String(name)] = [REQUIRED, api.EMPTY_STRING]; - } - /** Setup the ValueElement class */ - api.ValueElement = wrapperFactory(Module.ValueElement, defaultArgs); + api.ValueElement = wrapperFactory(Module.ValueElement); /** Setup the Token class */ api.Token = wrapperFactory(Module.Token); diff --git a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp index 0b82b3275c..fdedeb3e2a 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp @@ -7,8 +7,10 @@ namespace ems = emscripten; namespace mx = MaterialX; +using stRef = const std::string&; + #define BIND_GEOMINFO_FUNC_INSTANCE(NAME, T) \ -.function("setGeomPropValue" #NAME, &mx::GeomInfo::setGeomPropValue) + BIND_MEMBER_FUNC("setGeomPropValue" #NAME, mx::GeomInfo, setGeomPropValue, 2, 3, stRef, const T&, stRef) extern "C" { @@ -33,11 +35,11 @@ extern "C" ems::class_>("GeomInfo") .smart_ptr_constructor("GeomInfo", &std::make_shared) .smart_ptr>("GeomInfo") - .function("addGeomProp", &mx::GeomInfo::addGeomProp) + BIND_MEMBER_FUNC("addGeomProp", mx::GeomInfo, addGeomProp, 0, 1, stRef) .function("getGeomProp", &mx::GeomInfo::getGeomProp) .function("getGeomProps", &mx::GeomInfo::getGeomProps) .function("removeGeomProp", &mx::GeomInfo::removeGeomProp) - .function("addToken", &mx::GeomInfo::addToken) + BIND_MEMBER_FUNC("addToken", mx::GeomInfo, addToken, 0, 1, stRef) .function("getToken", &mx::GeomInfo::getToken) .function("getTokens", &mx::GeomInfo::getTokens) .function("removeToken", &mx::GeomInfo::removeToken) diff --git a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp index b4e2cac912..76d04f9b31 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp @@ -5,11 +5,13 @@ #include #include +using stRef = const std::string&; + namespace ems = emscripten; namespace mx = MaterialX; #define BIND_INTERFACE_TYPE_INSTANCE(NAME, T) \ -.function("setInputValue" #NAME, &mx::InterfaceElement::setInputValue) + BIND_MEMBER_FUNC("setInputValue" #NAME, mx::InterfaceElement, setInputValue, 2, 3, stRef, const T&, stRef) extern "C" { @@ -60,7 +62,7 @@ extern "C" ems::class_>("Output") .smart_ptr_constructor("Output", &std::make_shared) .smart_ptr>("Output") - .function("getUpstreamEdge", &mx::Output::getUpstreamEdge) + BIND_MEMBER_FUNC("getUpstreamEdge", mx::Output, getUpstreamEdge, 0, 1, std::size_t) .function("getUpstreamEdgeCount", &mx::Output::getUpstreamEdgeCount) .function("hasUpstreamCycle", &mx::Output::hasUpstreamCycle) BIND_VALIDATE(mx::Output) @@ -74,14 +76,14 @@ extern "C" .function("hasNodeDefString", &mx::InterfaceElement::hasNodeDefString) .function("getNodeDefString", &mx::InterfaceElement::getNodeDefString) - .function("addInput", &mx::InterfaceElement::addInput) + BIND_MEMBER_FUNC("addInput", mx::InterfaceElement, addInput, 0, 2, stRef, stRef) .function("getInput", &mx::InterfaceElement::getInput) .function("getInputs", &mx::InterfaceElement::getInputs) .function("getInputCount", &mx::InterfaceElement::getInputCount) .function("removeInput", &mx::InterfaceElement::removeInput) .function("getActiveInput", &mx::InterfaceElement::getActiveInput) .function("getActiveInputs", &mx::InterfaceElement::getActiveInputs) - .function("addOutput", &mx::InterfaceElement::addOutput) + BIND_MEMBER_FUNC("addOutput", mx::InterfaceElement, addOutput, 0, 2, stRef, stRef) .function("getOutput", &mx::InterfaceElement::getOutput) .function("getOutputs", &mx::InterfaceElement::getOutputs) .function("getOutputCount", &mx::InterfaceElement::getOutputCount) @@ -91,7 +93,7 @@ extern "C" .function("setConnectedOutput", &mx::InterfaceElement::setConnectedOutput) .function("getConnectedOutput", &mx::InterfaceElement::getConnectedOutput) - .function("addToken", &mx::InterfaceElement::addToken) + BIND_MEMBER_FUNC("addToken", mx::InterfaceElement, addToken, 0, 1, stRef) .function("getToken", &mx::InterfaceElement::getToken) .function("getTokens", &mx::InterfaceElement::getTokens) .function("removeToken", &mx::InterfaceElement::removeToken) @@ -117,7 +119,7 @@ extern "C" BIND_INTERFACE_TYPE_INSTANCE(BooleanArray, mx::BoolVec) BIND_INTERFACE_TYPE_INSTANCE(FloatArray, mx::FloatVec) BIND_INTERFACE_TYPE_INSTANCE(StringArray, mx::StringVec) - .function("getInputValue", &mx::InterfaceElement::getInputValue) + BIND_MEMBER_FUNC("getInputValue", mx::InterfaceElement, getInputValue, 1, 2, stRef, stRef) .function("setTokenValue", &mx::InterfaceElement::setTokenValue) .function("getTokenValue", &mx::InterfaceElement::getTokenValue) @@ -139,7 +141,7 @@ extern "C" .function("setDefaultVersion", &mx::InterfaceElement::setDefaultVersion) .function("getDefaultVersion", &mx::InterfaceElement::getDefaultVersion) - .function("getDeclaration", &mx::InterfaceElement::getDeclaration) + BIND_MEMBER_FUNC("getDeclaration", mx::InterfaceElement, getDeclaration, 0, 1, stRef) .function("isTypeCompatible", &mx::InterfaceElement::isTypeCompatible) .class_property("NODE_DEF_ATTRIBUTE", &mx::InterfaceElement::NODE_DEF_ATTRIBUTE) diff --git a/source/JsMaterialX/JsMaterialXCore/JsInterface.js b/source/JsMaterialX/JsMaterialXCore/JsInterface.js index a8e8bf38e9..486924662c 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsInterface.js +++ b/source/JsMaterialX/JsMaterialXCore/JsInterface.js @@ -10,37 +10,6 @@ addWrapper(function(Module, api) { /** Setup the Output class */ api.Output = wrapperFactory(Module.Output); - var funcs = [ - 'setInputValueinteger', - 'setInputValueboolean', - 'setInputValuefloat', - 'setInputValuecolor3', - 'setInputValuecolor4', - 'setInputValuevector2', - 'setInputValuevector3', - 'setInputValuevector4', - 'setInputValuematrix33', - 'setInputValuematrix44', - 'setInputValuestring', - 'setInputValueintegerarray', - 'setInputValuebooleanarray', - 'setInputValuefloatarray', - 'setInputValuestringarray' - ]; - - var defaultArgs = { - addInput: [api.EMPTY_STRING, api.DEFAULT_TYPE_STRING], - addOutput: [api.EMPTY_STRING, api.DEFAULT_TYPE_STRING], - addToken: [api.EMPTY_STRING], - getInputValue: [REQUIRED, api.EMPTY_STRING], - getDeclaration: [api.EMPTY_STRING] - }; - - for (var i = 0; i < funcs.length; i++) { - var name = funcs[parseInt(i, 10)]; - defaultArgs[String(name)] = [REQUIRED, REQUIRED, api.EMPTY_STRING]; - } - /** Setup the InterfaceElement class */ - api.InterfaceElement = wrapperFactory(Module.InterfaceElement, defaultArgs); + api.InterfaceElement = wrapperFactory(Module.InterfaceElement); }); diff --git a/source/JsMaterialX/JsMaterialXCore/JsLook.cpp b/source/JsMaterialX/JsMaterialXCore/JsLook.cpp index 1b756f95ef..d7ea9cb589 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsLook.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsLook.cpp @@ -4,6 +4,8 @@ #include #include +using stRef = const std::string&; + namespace ems = emscripten; namespace mx = MaterialX; @@ -14,31 +16,31 @@ extern "C" ems::class_>("Look") .smart_ptr_constructor("Look", &std::make_shared) .smart_ptr>("Look") - .function("addMaterialAssign", &mx::Look::addMaterialAssign) + BIND_MEMBER_FUNC("addMaterialAssign", mx::Look, addMaterialAssign, 0, 2, stRef, stRef) .function("getMaterialAssign", &mx::Look::getMaterialAssign) .function("getMaterialAssigns", &mx::Look::getMaterialAssigns) .function("getActiveMaterialAssigns", &mx::Look::getActiveMaterialAssigns) .function("removeMaterialAssign", &mx::Look::removeMaterialAssign) - .function("addPropertyAssign", &mx::Look::addPropertyAssign) + BIND_MEMBER_FUNC("addPropertyAssign", mx::Look, addPropertyAssign, 0, 1, stRef) .function("getPropertyAssign", &mx::Look::getPropertyAssign) .function("getPropertyAssigns", &mx::Look::getPropertyAssigns) .function("getActivePropertyAssigns", &mx::Look::getActivePropertyAssigns) .function("removePropertyAssign", &mx::Look::removePropertyAssign) - .function("addPropertySetAssign", &mx::Look::addPropertySetAssign) + BIND_MEMBER_FUNC("addPropertySetAssign", mx::Look, addPropertySetAssign, 0, 1, stRef) .function("getPropertySetAssign", &mx::Look::getPropertySetAssign) .function("getPropertySetAssigns", &mx::Look::getPropertySetAssigns) .function("getActivePropertySetAssigns", &mx::Look::getActivePropertySetAssigns) .function("removePropertySetAssign", &mx::Look::removePropertySetAssign) - .function("addVariantAssign", &mx::Look::addVariantAssign) + BIND_MEMBER_FUNC("addVariantAssign", mx::Look, addVariantAssign, 0, 1, stRef) .function("getVariantAssign", &mx::Look::getVariantAssign) .function("getVariantAssigns", &mx::Look::getVariantAssigns) .function("getActiveVariantAssigns", &mx::Look::getActiveVariantAssigns) .function("removeVariantAssign", &mx::Look::removeVariantAssign) - .function("addVisibility", &mx::Look::addVisibility) + BIND_MEMBER_FUNC("addVisibility", mx::Look, addVisibility, 0, 1, stRef) .function("getVisibility", &mx::Look::getVisibility) .function("getVisibilities", &mx::Look::getVisibilities) .function("getActiveVisibilities", &mx::Look::getActiveVisibilities) @@ -56,8 +58,8 @@ extern "C" .function("setEnabledLooks", &mx::LookGroup::setEnabledLooks) .function("getEnabledLooksString", &mx::LookGroup::getEnabledLooksString) .function("getEnabledLooks", &mx::LookGroup::getEnabledLooks) - .function("appendLookGroup", &mx::LookGroup::appendLookGroup) - .function("appnedLook", &mx::LookGroup::appendLook) + BIND_MEMBER_FUNC_RAW_PTR("appendLookGroup", mx::LookGroup, appendLookGroup, 1, 2, mx::LookGroupPtr, stRef) + BIND_MEMBER_FUNC("appendLook", mx::LookGroup, appendLook, 1, 2, stRef, stRef) .function("combineLooks", &mx::LookGroup::combineLooks) .class_property("CATEGORY", &mx::LookGroup::CATEGORY) .class_property("LOOKS_ATTRIBUTE", &mx::LookGroup::LOOKS_ATTRIBUTE) @@ -72,7 +74,7 @@ extern "C" .function("setExclusive", &mx::MaterialAssign::setExclusive) .function("getExclusive", &mx::MaterialAssign::getExclusive) .function("getReferencedMaterial", &mx::MaterialAssign::getReferencedMaterial) - .function("addVariantAssign", &mx::MaterialAssign::addVariantAssign) + BIND_MEMBER_FUNC("addVariantAssign", mx::MaterialAssign, addVariantAssign, 0, 1, stRef) .function("getVariantAssign", &mx::MaterialAssign::getVariantAssign) .function("getVariantAssigns", &mx::MaterialAssign::getVariantAssigns) .function("getActiveVariantAssigns", &mx::MaterialAssign::getActiveVariantAssigns) diff --git a/source/JsMaterialX/JsMaterialXCore/JsLook.js b/source/JsMaterialX/JsMaterialXCore/JsLook.js index 9885fb0f7d..654aa0d5bf 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsLook.js +++ b/source/JsMaterialX/JsMaterialXCore/JsLook.js @@ -1,13 +1,7 @@ // jsLook addWrapper(function(Module, api) { /** Setup the Look class */ - api.Look = wrapperFactory(Module.Look, { - addMaterialAssign: [api.EMPTY_STRING, api.EMPTY_STRING], - addPropertyAssign: [api.EMPTY_STRING], - addPropertySetAssign: [api.EMPTY_STRING], - addVariantAssign: [api.EMPTY_STRING], - addVisibility: [api.EMPTY_STRING] - }); + api.Look = wrapperFactory(Module.Look); /** Setup the LookGroup class */ api.LookGroup = wrapperFactory(Module.LookGroup); From 308e34a44e9f9ca8e02fc6619d0db089892200fe Mon Sep 17 00:00:00 2001 From: munoza Date: Tue, 11 May 2021 14:30:25 +0200 Subject: [PATCH 07/33] chore: Style improvements - Substitute some instances of optional_override by select_overload - Use ems::Constants for exposing Constants --- .../JsMaterialX/JsMaterialXCore/JsElement.cpp | 16 +- .../JsMaterialX/JsMaterialXCore/JsTypes.cpp | 139 +++++++++--------- source/JsMaterialX/test/traverseGraph.spec.js | 1 + 3 files changed, 73 insertions(+), 83 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp index 96c0f94978..f976bd68d5 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp @@ -91,18 +91,10 @@ extern "C" .function("getAttribute", &mx::Element::getAttribute) .function("getAttributeNames", &mx::Element::getAttributeNames) .function("removeAttribute", &mx::Element::removeAttribute) - .function("getSelf", ems::optional_override([](mx::Element &self) { - return self.mx::Element::getSelf(); - })) - .function("getParent", ems::optional_override([](mx::Element &self) { - return self.mx::Element::getParent(); - })) - .function("getRoot", ems::optional_override([](mx::Element &self) { - return self.mx::Element::getRoot(); - })) - .function("getDocument", ems::optional_override([](mx::Element &self) { - return self.mx::Element::getDocument(); - })) + .function("getSelf", ems::select_overload(&mx::Element::getSelf)) + .function("getParent", ems::select_overload(&mx::Element::getParent)) + .function("getRoot", ems::select_overload(&mx::Element::getRoot)) + .function("getDocument", ems::select_overload(&mx::Element::getDocument)) .function("traverseTree", &mx::Element::traverseTree) .function("traverseGraph", &mx::Element::traverseGraph) diff --git a/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp b/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp index 4074d5dcbc..88e1fa366b 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp @@ -49,24 +49,22 @@ namespace mx = MaterialX; .function("numColumns", ems::optional_override([](const M &self) { return self.M::numColumns(); })) \ .function("length", ems::optional_override([](const M &self) { return self.M::numRows(); })) -extern "C" +EMSCRIPTEN_BINDINGS(types) { - EMSCRIPTEN_BINDINGS(types) - { - ems::class_("VectorBase"); - ems::class_("MatrixBase"); + ems::class_("VectorBase"); + ems::class_("MatrixBase"); - ems::class_>("Vector2") - .constructor<>() - .constructor() - BIND_VECTOR_SUBCLASS(mx::Vector2) - .function("cross", &mx::Vector2::cross); + ems::class_>("Vector2") + .constructor<>() + .constructor() + BIND_VECTOR_SUBCLASS(mx::Vector2) + .function("cross", &mx::Vector2::cross); - ems::class_>("Vector3") - .constructor<>() - .constructor() - BIND_VECTOR_SUBCLASS(mx::Vector3) - .function("cross", &mx::Vector3::cross); + ems::class_>("Vector3") + .constructor<>() + .constructor() + BIND_VECTOR_SUBCLASS(mx::Vector3) + .function("cross", &mx::Vector3::cross); ems::class_>("Quaternion") .constructor<>() @@ -82,64 +80,63 @@ extern "C" .constructor() BIND_VECTOR_SUBCLASS(mx::Vector4); - ems::class_>("Color3") - .constructor<>() - .constructor() - BIND_VECTOR_SUBCLASS(mx::Color3); + ems::class_>("Color3") + .constructor<>() + .constructor() + BIND_VECTOR_SUBCLASS(mx::Color3); - ems::class_>("Color4") - .constructor<>() - .constructor() - BIND_VECTOR_SUBCLASS(mx::Color4); + ems::class_>("Color4") + .constructor<>() + .constructor() + BIND_VECTOR_SUBCLASS(mx::Color4); - ems::class_>("Matrix33") - .constructor<>() - .constructor() - BIND_MATRIX_SUBCLASS(mx::Matrix33) - .function("multiplyVector3", ems::optional_override([](const mx::Matrix33 &self, const mx::Vector3 &v) { return self.mx::Matrix33::multiply(v); })) - .function("transformPoint", ems::optional_override([](const mx::Matrix33 &self, const mx::Vector2 &v) { return self.mx::Matrix33::transformPoint(v); })) - .function("transformVector", ems::optional_override([](const mx::Matrix33 &self, const mx::Vector2 &v) { return self.mx::Matrix33::transformVector(v); })) - .function("transformNormal", ems::optional_override([](const mx::Matrix33 &self, const mx::Vector3 &v) { return self.mx::Matrix33::transformNormal(v); })) - .class_function("createTranslation", &mx::Matrix33::createTranslation) - .class_function("createScale", &mx::Matrix33::createScale) - .class_function("createRotation", &mx::Matrix33::createRotation) - .class_property("IDENTITY", &mx::Matrix33::IDENTITY); + ems::class_>("Matrix33") + .constructor<>() + .constructor() + BIND_MATRIX_SUBCLASS(mx::Matrix33) + .function("multiplyVector3", ems::optional_override([](const mx::Matrix33 &self, const mx::Vector3 &v) { return self.mx::Matrix33::multiply(v); })) + .function("transformPoint", ems::optional_override([](const mx::Matrix33 &self, const mx::Vector2 &v) { return self.mx::Matrix33::transformPoint(v); })) + .function("transformVector", ems::optional_override([](const mx::Matrix33 &self, const mx::Vector2 &v) { return self.mx::Matrix33::transformVector(v); })) + .function("transformNormal", ems::optional_override([](const mx::Matrix33 &self, const mx::Vector3 &v) { return self.mx::Matrix33::transformNormal(v); })) + .class_function("createTranslation", &mx::Matrix33::createTranslation) + .class_function("createScale", &mx::Matrix33::createScale) + .class_function("createRotation", &mx::Matrix33::createRotation) + .class_property("IDENTITY", &mx::Matrix33::IDENTITY); - ems::class_>("Matrix44") - .constructor<>() - .constructor() - BIND_MATRIX_SUBCLASS(mx::Matrix44) - .function("multiplyVector4", ems::optional_override([](const mx::Matrix44 &self, const mx::Vector4 &v) { return self.mx::Matrix44::multiply(v); })) - .function("transformPoint", ems::optional_override([](const mx::Matrix44 &self, const mx::Vector3 &v) { return self.mx::Matrix44::transformPoint(v); })) - .function("transformVector", ems::optional_override([](const mx::Matrix44 &self, const mx::Vector3 &v) { return self.mx::Matrix44::transformVector(v); })) - .function("transformNormal", ems::optional_override([](const mx::Matrix44 &self, const mx::Vector3 &v) { return self.mx::Matrix44::transformNormal(v); })) - .class_function("createTranslation", &mx::Matrix44::createTranslation) - .class_function("createScale", &mx::Matrix44::createScale) - .class_function("createRotationX", &mx::Matrix44::createRotationX) - .class_function("createRotationY", &mx::Matrix44::createRotationY) - .class_function("createRotationZ", &mx::Matrix44::createRotationZ) - .class_function("createRotation", &mx::Matrix44::createRotation) - .class_property("IDENTITY", &mx::Matrix44::IDENTITY); + ems::class_>("Matrix44") + .constructor<>() + .constructor() + BIND_MATRIX_SUBCLASS(mx::Matrix44) + .function("multiplyVector4", ems::optional_override([](const mx::Matrix44 &self, const mx::Vector4 &v) { return self.mx::Matrix44::multiply(v); })) + .function("transformPoint", ems::optional_override([](const mx::Matrix44 &self, const mx::Vector3 &v) { return self.mx::Matrix44::transformPoint(v); })) + .function("transformVector", ems::optional_override([](const mx::Matrix44 &self, const mx::Vector3 &v) { return self.mx::Matrix44::transformVector(v); })) + .function("transformNormal", ems::optional_override([](const mx::Matrix44 &self, const mx::Vector3 &v) { return self.mx::Matrix44::transformNormal(v); })) + .class_function("createTranslation", &mx::Matrix44::createTranslation) + .class_function("createScale", &mx::Matrix44::createScale) + .class_function("createRotationX", &mx::Matrix44::createRotationX) + .class_function("createRotationY", &mx::Matrix44::createRotationY) + .class_function("createRotationZ", &mx::Matrix44::createRotationZ) + .class_function("createRotation", &mx::Matrix44::createRotation) + .class_property("IDENTITY", &mx::Matrix44::IDENTITY); - ems::constant("DEFAULT_TYPE_STRING", mx::DEFAULT_TYPE_STRING); - ems::constant("EMPTY_STRING", mx::EMPTY_STRING); - ems::constant("FILENAME_TYPE_STRING", mx::FILENAME_TYPE_STRING); - ems::constant("GEOMNAME_TYPE_STRING", mx::GEOMNAME_TYPE_STRING); - ems::constant("STRING_TYPE_STRING", mx::STRING_TYPE_STRING); - ems::constant("SURFACE_SHADER_TYPE_STRING", mx::SURFACE_SHADER_TYPE_STRING); - ems::constant("DISPLACEMENT_SHADER_TYPE_STRING", mx::DISPLACEMENT_SHADER_TYPE_STRING); - ems::constant("VOLUME_SHADER_TYPE_STRING", mx::VOLUME_SHADER_TYPE_STRING); - ems::constant("LIGHT_SHADER_TYPE_STRING", mx::LIGHT_SHADER_TYPE_STRING); - ems::constant("MATERIAL_TYPE_STRING", mx::MATERIAL_TYPE_STRING); - ems::constant("SURFACE_MATERIAL_NODE_STRING", mx::SURFACE_MATERIAL_NODE_STRING); - ems::constant("VOLUME_MATERIAL_NODE_STRING", mx::VOLUME_MATERIAL_NODE_STRING); - ems::constant("MULTI_OUTPUT_TYPE_STRING", mx::MULTI_OUTPUT_TYPE_STRING); - ems::constant("NONE_TYPE_STRING", mx::NONE_TYPE_STRING); - ems::constant("VALUE_STRING_TRUE", mx::VALUE_STRING_TRUE); - ems::constant("VALUE_STRING_FALSE", mx::VALUE_STRING_FALSE); - ems::constant("NAME_PREFIX_SEPARATOR", mx::NAME_PREFIX_SEPARATOR); - ems::constant("NAME_PATH_SEPARATOR", mx::NAME_PATH_SEPARATOR); - ems::constant("ARRAY_VALID_SEPARATORS", mx::ARRAY_VALID_SEPARATORS); - ems::constant("ARRAY_PREFERRED_SEPARATOR", mx::ARRAY_PREFERRED_SEPARATOR); - } + ems::constant("DEFAULT_TYPE_STRING", mx::DEFAULT_TYPE_STRING); + ems::constant("EMPTY_STRING", mx::EMPTY_STRING); + ems::constant("FILENAME_TYPE_STRING", mx::FILENAME_TYPE_STRING); + ems::constant("GEOMNAME_TYPE_STRING", mx::GEOMNAME_TYPE_STRING); + ems::constant("STRING_TYPE_STRING", mx::STRING_TYPE_STRING); + ems::constant("SURFACE_SHADER_TYPE_STRING", mx::SURFACE_SHADER_TYPE_STRING); + ems::constant("DISPLACEMENT_SHADER_TYPE_STRING", mx::DISPLACEMENT_SHADER_TYPE_STRING); + ems::constant("VOLUME_SHADER_TYPE_STRING", mx::VOLUME_SHADER_TYPE_STRING); + ems::constant("LIGHT_SHADER_TYPE_STRING", mx::LIGHT_SHADER_TYPE_STRING); + ems::constant("MATERIAL_TYPE_STRING", mx::MATERIAL_TYPE_STRING); + ems::constant("SURFACE_MATERIAL_NODE_STRING", mx::SURFACE_MATERIAL_NODE_STRING); + ems::constant("VOLUME_MATERIAL_NODE_STRING", mx::VOLUME_MATERIAL_NODE_STRING); + ems::constant("MULTI_OUTPUT_TYPE_STRING", mx::MULTI_OUTPUT_TYPE_STRING); + ems::constant("NONE_TYPE_STRING", mx::NONE_TYPE_STRING); + ems::constant("VALUE_STRING_TRUE", mx::VALUE_STRING_TRUE); + ems::constant("VALUE_STRING_FALSE", mx::VALUE_STRING_FALSE); + ems::constant("NAME_PREFIX_SEPARATOR", mx::NAME_PREFIX_SEPARATOR); + ems::constant("NAME_PATH_SEPARATOR", mx::NAME_PATH_SEPARATOR); + ems::constant("ARRAY_VALID_SEPARATORS", mx::ARRAY_VALID_SEPARATORS); + ems::constant("ARRAY_PREFERRED_SEPARATOR", mx::ARRAY_PREFERRED_SEPARATOR); } \ No newline at end of file diff --git a/source/JsMaterialX/test/traverseGraph.spec.js b/source/JsMaterialX/test/traverseGraph.spec.js index d591716a95..cebe08475d 100644 --- a/source/JsMaterialX/test/traverseGraph.spec.js +++ b/source/JsMaterialX/test/traverseGraph.spec.js @@ -123,6 +123,7 @@ describe('Traverse Graph', () => { const graphIter = output.traverseGraph(); traverse(graphIter, (edge) => { const upstreamElem = edge.getUpstreamElement(); + expect(upstreamElem.getSelf()).to.be.an.instanceof(mx.Element); if (upstreamElem instanceof mx.Node) { nodeCount++; } From bab04558f9c0c275ffc83d9f679aa7613a8bc750 Mon Sep 17 00:00:00 2001 From: munoza Date: Mon, 17 May 2021 09:59:53 +0200 Subject: [PATCH 08/33] Consolidate test with python main.py --- source/JsMaterialX/test/basics.spec.js | 35 +- source/JsMaterialX/test/readXml.spec.js | 130 +++---- source/JsMaterialX/test/traverseGraph.spec.js | 340 +++++++++--------- 3 files changed, 249 insertions(+), 256 deletions(-) diff --git a/source/JsMaterialX/test/basics.spec.js b/source/JsMaterialX/test/basics.spec.js index 9d24f2ed89..c4730eb3c2 100644 --- a/source/JsMaterialX/test/basics.spec.js +++ b/source/JsMaterialX/test/basics.spec.js @@ -113,8 +113,14 @@ describe('Basics', () => { // Translation and scale const trans = mx.Matrix44.createTranslation(new mx.Vector3(1, 2, 3)); const scale = mx.Matrix44.createScale(new mx.Vector3(2, 2, 2)); - expect(trans.equals(new mx.Matrix44(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 3, 1))); - expect(scale.equals(new mx.Matrix44(2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1))); + expect(trans.equals(new mx.Matrix44(1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 1, 2, 3, 1))); + expect(scale.equals(new mx.Matrix44(2, 0, 0, 0, + 0, 2, 0, 0, + 0, 0, 2, 0, + 0, 0, 0, 1))); // Indexing operators expect(trans.getItem(3, 2)).to.equal(3); @@ -123,11 +129,17 @@ describe('Basics', () => { trans.setItem(3, 2, 3); // Matrix methods - expect(trans.getTranspose().equals(new mx.Matrix44(1, 0, 0, 1, 0, 1, 0, 2, 0, 0, 1, 3, 0, 0, 0, 1))).to.be.true; + expect(trans.getTranspose().equals( + new mx.Matrix44(1, 0, 0, 1, + 0, 1, 0, 2, + 0, 0, 1, 3, + 0, 0, 0, 1) + )).to.be.true; expect(scale.getTranspose().equals(scale)).to.be.true; expect(trans.getDeterminant()).to.equal(1); expect(scale.getDeterminant()).to.equal(8); - expect(trans.getInverse().equals(mx.Matrix44.createTranslation(new mx.Vector3(-1, -2, -3)))).to.be.true; + expect(trans.getInverse().equals( + mx.Matrix44.createTranslation(new mx.Vector3(-1, -2, -3)))).to.be.true; // Matrix product const prod1 = trans.multiply(scale); @@ -135,9 +147,18 @@ describe('Basics', () => { const prod3 = multiplyMatrix(trans, 2); let prod4 = trans; prod4 = prod4.multiply(scale); - expect(prod1.equals(new mx.Matrix44(2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 4, 6, 1))); - expect(prod2.equals(new mx.Matrix44(2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 1, 2, 3, 1))); - expect(prod3.equals(new mx.Matrix44(2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 4, 6, 2))); + expect(prod1.equals(new mx.Matrix44(2, 0, 0, 0, + 0, 2, 0, 0, + 0, 0, 2, 0, + 2, 4, 6, 1))); + expect(prod2.equals(new mx.Matrix44(2, 0, 0, 0, + 0, 2, 0, 0, + 0, 0, 2, 0, + 1, 2, 3, 1))); + expect(prod3.equals(new mx.Matrix44(2, 0, 0, 0, + 0, 2, 0, 0, + 0, 0, 2, 0, + 2, 4, 6, 2))); expect(prod4.equals(prod1)); // Matrix division diff --git a/source/JsMaterialX/test/readXml.spec.js b/source/JsMaterialX/test/readXml.spec.js index 8a69ab6425..68f6cf5dc7 100644 --- a/source/JsMaterialX/test/readXml.spec.js +++ b/source/JsMaterialX/test/readXml.spec.js @@ -13,90 +13,72 @@ const _exampleFilenames = [ 'PreShaderComposite.mtlx', ]; -describe('Build Document', () => { +it('Read XML', async () => { let mx; - before(async () => { - mx = await initMaterialX(); - }); - - it('Read the standard library', () => { - let mtlxStrs = getMtlxStrings(_libraryFilenames, '../../../libraries/stdlib'); - const libs = []; - mtlxStrs.forEach((mtlxStr) => { - const lib = mx.createDocument(); - mx.readFromXmlString(lib, mtlxStr); - libs.push(lib); - }); - mtlxStrs = getMtlxStrings(_exampleFilenames, '../../../resources/Materials/Examples/Syntax'); - // Read and validate each example document. - mtlxStrs.forEach((mtlxStr) => { - const doc = mx.createDocument(); - mx.readFromXmlString(doc, mtlxStr); - expect(doc.validate()).to.be.true; + mx = await initMaterialX(); - // Copy the document. - const copiedDoc = doc.copy(); - expect(copiedDoc).to.eql(doc); - copiedDoc.addLook(); - // Make sure that the original doc does not contain any looks. - expect(copiedDoc.getLooks().length).to.equal(1); - expect(doc.getLooks().length).to.equal(0); + // Read the standard library' + let mtlxStrs = getMtlxStrings(_libraryFilenames, '../../../libraries/stdlib'); + const libs = []; + mtlxStrs.forEach((mtlxStr) => { + const lib = mx.createDocument(); + mx.readFromXmlString(lib, mtlxStr); + libs.push(lib); + }); - // Traverse the document tree. - let valueElementCount = 0; - const treeIter = doc.traverseTree(); - for(const elem of treeIter) { - if (elem instanceof mx.ValueElement) { - valueElementCount++; - } - } - expect(valueElementCount).to.be.greaterThan(0); + mtlxStrs = getMtlxStrings(_exampleFilenames, '../../../resources/Materials/Examples/Syntax'); + // Read and validate each example document. + mtlxStrs.forEach((mtlxStr) => { + const doc = mx.createDocument(); + mx.readFromXmlString(doc, mtlxStr); + expect(doc.validate()).to.be.true; - // // Traverse upstream from each shader input. - // const materials = doc.getMaterials(); - // materials.forEach((material) => { - // expect(material.getPrimaryShaderNodeDef()).to.exist; - // let edgeCount = 0; + // Copy the document. + const copiedDoc = doc.copy(); + expect(copiedDoc).to.eql(doc); + copiedDoc.addLook(); + // Make sure that the original doc does not contain any looks. + expect(copiedDoc.getLooks().length).to.equal(1); + expect(doc.getLooks().length).to.equal(0); - // const primaryShaderInputs = material.getPrimaryShaderInputs(); - // primaryShaderInputs.forEach((shaderInput) => { - // const boundValue = shaderInput.getBoundValue(material); - // const upstreamElement = shaderInput.getUpstreamElement(material); - // expect(boundValue !== null || upstreamElement !== null).to.be.true; - // traverse(shaderInput.traverseGraph(material), () => { - // edgeCount++; - // }); - // }); - // expect(edgeCount).to.be.greaterThan(0); - // }); + // Traverse the document tree. + let valueElementCount = 0; + const treeIter = doc.traverseTree(); + for(const elem of treeIter) { + if (elem instanceof mx.ValueElement) { + valueElementCount++; + } + } + expect(valueElementCount).to.be.greaterThan(0); - // Serialize to XML. - const writeOptions = new mx.XmlWriteOptions(); - writeOptions.writeXIncludeEnable = false; - const xmlString = mx.writeToXmlString(doc, writeOptions); - // Verify that the serialized document is identical. - const writtenDoc = mx.createDocument(); - mx.readFromXmlString(writtenDoc, xmlString); - expect(writtenDoc).to.eql(doc); + // Serialize to XML. + const writeOptions = new mx.XmlWriteOptions(); + writeOptions.writeXIncludeEnable = false; + const xmlString = mx.writeToXmlString(doc, writeOptions); - // Combine document with the standard library. - const doc2 = doc.copy(); - libs.forEach((lib) => { - doc2.importLibrary(lib); - }); + // Verify that the serialized document is identical. + const writtenDoc = mx.createDocument(); + mx.readFromXmlString(writtenDoc, xmlString); + expect(writtenDoc).to.eql(doc); - expect(doc2.validate()).to.be.true; + // Combine document with the standard library. + const doc2 = doc.copy(); + libs.forEach((lib) => { + doc2.importLibrary(lib); }); - // Read the same document twice, and verify that duplicate elements - // are skipped. - const doc = mx.createDocument(); - const filenames = ['MaterialBasic.mtlx']; - mtlxStrs = getMtlxStrings(filenames, '../../../resources/Materials/Examples/Syntax'); - mx.readFromXmlString(doc, mtlxStrs[0]); - const readOptions = new mx.XmlReadOptions(); - mx.readFromXmlString(doc, mtlxStrs[0], readOptions); - expect(doc.validate()).to.be.true; + + expect(doc2.validate()).to.be.true; }); + + // Read the same document twice, and verify that duplicate elements + // are skipped. + const doc = mx.createDocument(); + const filenames = ['MaterialBasic.mtlx']; + mtlxStrs = getMtlxStrings(filenames, '../../../resources/Materials/Examples/Syntax'); + mx.readFromXmlString(doc, mtlxStrs[0]); + const readOptions = new mx.XmlReadOptions(); + mx.readFromXmlString(doc, mtlxStrs[0], readOptions); + expect(doc.validate()).to.be.true; }); diff --git a/source/JsMaterialX/test/traverseGraph.spec.js b/source/JsMaterialX/test/traverseGraph.spec.js index cebe08475d..387f3ad121 100644 --- a/source/JsMaterialX/test/traverseGraph.spec.js +++ b/source/JsMaterialX/test/traverseGraph.spec.js @@ -1,198 +1,188 @@ import { expect } from 'chai'; import { traverse, initMaterialX } from './testHelpers'; -describe('Traverse Graph', () => { +it('Traverse Graph', async () => { let mx, doc, image2, constant, multiply, contrast, mix, output; - before(async () => { - mx = await initMaterialX(); - // Create a document. - doc = mx.createDocument(); - // Create a node graph with the following structure: - // - // [image1] [constant] [image2] - // \ / | - // [multiply] [contrast] [noise3d] - // \____________ | ____________/ - // [mix] - // | - // [output] - // - const nodeGraph = doc.addNodeGraph(); - const image1 = nodeGraph.addNode('image'); - image2 = nodeGraph.addNode('image'); - constant = nodeGraph.addNode('constant'); - multiply = nodeGraph.addNode('multiply'); - contrast = nodeGraph.addNode('contrast'); - const noise3d = nodeGraph.addNode('noise3d'); - mix = nodeGraph.addNode('mix'); - output = nodeGraph.addOutput(); - multiply.setConnectedNode('in1', image1); - multiply.setConnectedNode('in2', constant); - contrast.setConnectedNode('in', image2); - mix.setConnectedNode('fg', multiply); - mix.setConnectedNode('bg', contrast); - mix.setConnectedNode('mask', noise3d); - output.setConnectedNode(mix); - }); - - it('Validate the document', () => { - expect(doc.validate()).to.be.true; - }); - - it('Traverse the document tree (implicit iterator)', () => { - const elements = doc.traverseTree(); - let nodeCount = 0; - traverse(elements, (elem) => { - // Display the filename of each image node. - if (elem instanceof mx.Node) { - nodeCount++; - } - }); - expect(nodeCount).to.equal(7); - }); - - it('Traverse the document tree (explicit iterator)', () => { - const treeIter = doc.traverseTree(); - let nodeCount = 0; - let maxElementDepth = 0; - traverse(treeIter, (elem) => { - // Display the filename of each image node. - if (elem instanceof mx.Node) { - nodeCount++; + function isCycle(cb) { + try { + return cb(); + } catch (exceptionPtr) { + const message = mx.getExceptionMessage(exceptionPtr); + if (message.indexOf('Encountered cycle') !== -1) { + return true; } - maxElementDepth = Math.max(maxElementDepth, treeIter.getElementDepth()); - }); + return false; + } + } - expect(nodeCount).to.equal(7); - expect(maxElementDepth).to.equal(3); - }); + mx = await initMaterialX(); + // Create a document. + doc = mx.createDocument(); + // Create a node graph with the following structure: + // + // [image1] [constant] [image2] + // \ / | + // [multiply] [contrast] [noise3d] + // \____________ | ____________/ + // [mix] + // | + // [output] + // + const nodeGraph = doc.addNodeGraph(); + const image1 = nodeGraph.addNode('image'); + image2 = nodeGraph.addNode('image'); + constant = nodeGraph.addNode('constant'); + multiply = nodeGraph.addNode('multiply'); + contrast = nodeGraph.addNode('contrast'); + const noise3d = nodeGraph.addNode('noise3d'); + mix = nodeGraph.addNode('mix'); + output = nodeGraph.addOutput(); + multiply.setConnectedNode('in1', image1); + multiply.setConnectedNode('in2', constant); + contrast.setConnectedNode('in', image2); + mix.setConnectedNode('fg', multiply); + mix.setConnectedNode('bg', contrast); + mix.setConnectedNode('mask', noise3d); + output.setConnectedNode(mix); - it('Traverse the document tree (prune subtree)', () => { - const treeIter = doc.traverseTree(); - let nodeCount = 0; - traverse(treeIter, (elem) => { - // Display the filename of each image node. - if (elem instanceof mx.Node) { - nodeCount++; - } - if (elem instanceof mx.NodeGraph) { - treeIter.setPruneSubtree(true); - } - }); + expect(doc.validate()).to.be.true; + // TODO: select check message - expect(nodeCount).to.equal(0); + // Traverse the document tree (implicit iterator). + const elements = doc.traverseTree(); + let nodeCount = 0; + traverse(elements, (elem) => { + // Display the filename of each image node. + if (elem instanceof mx.Node) { + nodeCount++; + } }); + expect(nodeCount).to.equal(7); - it('Traverse upstream from the graph output (implicit iterator)', () => { - let nodeCount = 0; - traverse(output.traverseGraph(), (edge) => { - const upstreamElem = edge.getUpstreamElement(); - const connectingElem = edge.getConnectingElement(); - const downstreamElem = edge.getDownstreamElement(); - if (upstreamElem instanceof mx.Node) { - nodeCount++; - if (downstreamElem instanceof mx.Node) { - expect(connectingElem instanceof mx.Input).to.be.true; - } - } - }); - expect(nodeCount).to.equal(7); + // Traverse the document tree (explicit iterator) + let treeIter = doc.traverseTree(); + nodeCount = 0; + let maxElementDepth = 0; + traverse(treeIter, (elem) => { + // Display the filename of each image node. + if (elem instanceof mx.Node) { + nodeCount++; + } + maxElementDepth = Math.max(maxElementDepth, treeIter.getElementDepth()); }); - it('Traverse upstream from the graph output (explicit iterator)', () => { - let nodeCount = 0; - let maxElementDepth = 0; - let maxNodeDepth = 0; - const graphIter = output.traverseGraph(); - traverse(graphIter, (edge) => { - const upstreamElem = edge.getUpstreamElement(); - if (upstreamElem instanceof mx.Node) { - nodeCount++; - } - maxElementDepth = Math.max(maxElementDepth, graphIter.getElementDepth()); - maxNodeDepth = Math.max(maxNodeDepth, graphIter.getNodeDepth()); - }); + expect(nodeCount).to.equal(7); + expect(maxElementDepth).to.equal(3); - expect(nodeCount).to.equal(7); - expect(maxElementDepth).to.equal(3); - expect(maxNodeDepth).to.equal(3); + // Traverse the document tree (prune subtree). + nodeCount = 0; + treeIter = doc.traverseTree(); + traverse(treeIter, (elem) => { + // Display the filename of each image node. + if (elem instanceof mx.Node) { + nodeCount++; + } + if (elem instanceof mx.NodeGraph) { + treeIter.setPruneSubtree(true); + } }); - it('Traverse upstream from the graph output (prune subgraph)', () => { - let nodeCount = 0; - const graphIter = output.traverseGraph(); - traverse(graphIter, (edge) => { - const upstreamElem = edge.getUpstreamElement(); - expect(upstreamElem.getSelf()).to.be.an.instanceof(mx.Element); - if (upstreamElem instanceof mx.Node) { - nodeCount++; + expect(nodeCount).to.equal(0); + + // Traverse upstream from the graph output (implicit iterator) + nodeCount = 0; + traverse(output.traverseGraph(), (edge) => { + const upstreamElem = edge.getUpstreamElement(); + const connectingElem = edge.getConnectingElement(); + const downstreamElem = edge.getDownstreamElement(); + if (upstreamElem instanceof mx.Node) { + nodeCount++; + if (downstreamElem instanceof mx.Node) { + expect(connectingElem instanceof mx.Input).to.be.true; } - if (upstreamElem.getCategory() === 'multiply') { - graphIter.setPruneSubgraph(true); - } - }); - expect(nodeCount).to.equal(5); + } }); + expect(nodeCount).to.equal(7); - function isCycle(cb) { - try { - return cb(); - } catch (exceptionPtr) { - const message = mx.getExceptionMessage(exceptionPtr); - if (message.indexOf('Encountered cycle') !== -1) { - return true; - } - return false; + // Traverse upstream from the graph output (explicit iterator) + nodeCount = 0; + maxElementDepth = 0; + let maxNodeDepth = 0; + let graphIter = output.traverseGraph(); + traverse(graphIter, (edge) => { + const upstreamElem = edge.getUpstreamElement(); + if (upstreamElem instanceof mx.Node) { + nodeCount++; } - } - it('Create and detect a cycle', () => { - multiply.setConnectedNode('in2', mix); - - expect( - isCycle(() => { - return output.hasUpstreamCycle(); - }) - ).to.be.true; - expect( - isCycle(() => { - return doc.validate(); - }) - ).to.be.true; - multiply.setConnectedNode('in2', constant); - expect( - isCycle(() => { - return output.hasUpstreamCycle(); - }) - ).to.be.false; - expect( - isCycle(() => { - return doc.validate(); - }) - ).to.be.true; + maxElementDepth = Math.max(maxElementDepth, graphIter.getElementDepth()); + maxNodeDepth = Math.max(maxNodeDepth, graphIter.getNodeDepth()); }); - it('Create and detect a loop', () => { - contrast.setConnectedNode('in', contrast); - expect( - isCycle(() => { - return output.hasUpstreamCycle(); - }) - ).to.be.true; - expect( - isCycle(() => { - return doc.validate(); - }) - ).to.be.true; - contrast.setConnectedNode('in', image2); - expect( - isCycle(() => { - return output.hasUpstreamCycle(); - }) - ).to.be.false; - expect( - isCycle(() => { - return doc.validate(); - }) - ).to.be.true; + expect(nodeCount).to.equal(7); + expect(maxElementDepth).to.equal(3); + expect(maxNodeDepth).to.equal(3); + + // Traverse upstream from the graph output (prune subgraph) + nodeCount = 0; + graphIter = output.traverseGraph(); + traverse(graphIter, (edge) => { + const upstreamElem = edge.getUpstreamElement(); + expect(upstreamElem.getSelf()).to.be.an.instanceof(mx.Element); + if (upstreamElem instanceof mx.Node) { + nodeCount++; + } + if (upstreamElem.getCategory() === 'multiply') { + graphIter.setPruneSubgraph(true); + } }); + expect(nodeCount).to.equal(5); + + // Create and detect a cycle + multiply.setConnectedNode('in2', mix); + + expect( + isCycle(() => { + return output.hasUpstreamCycle(); + }) + ).to.be.true; + expect( + isCycle(() => { + return doc.validate(); + }) + ).to.be.true; + multiply.setConnectedNode('in2', constant); + expect( + isCycle(() => { + return output.hasUpstreamCycle(); + }) + ).to.be.false; + expect( + isCycle(() => { + return doc.validate(); + }) + ).to.be.true; + + // Create and detect a loop + contrast.setConnectedNode('in', contrast); + expect( + isCycle(() => { + return output.hasUpstreamCycle(); + }) + ).to.be.true; + expect( + isCycle(() => { + return doc.validate(); + }) + ).to.be.true; + contrast.setConnectedNode('in', image2); + expect( + isCycle(() => { + return output.hasUpstreamCycle(); + }) + ).to.be.false; + expect( + isCycle(() => { + return doc.validate(); + }) + ).to.be.true; }); From aeea4b572284730394f3c064606c22174af09089 Mon Sep 17 00:00:00 2001 From: Cedrick Muenstermann Date: Mon, 17 May 2021 13:58:50 +0200 Subject: [PATCH 09/33] Fix tests --- documents/DeveloperGuide/CodeExamples.md | 4 ++-- .../JsMaterialX/JsMaterialXCore/JsDocument.cpp | 7 ++++++- source/JsMaterialX/JsMaterialXCore/JsGeom.cpp | 4 ++-- source/JsMaterialX/test/codeExamples.spec.js | 8 ++++---- source/JsMaterialX/test/document.spec.js | 18 +++++++++--------- 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/documents/DeveloperGuide/CodeExamples.md b/documents/DeveloperGuide/CodeExamples.md index 57e3cf9203..efaa2c7443 100644 --- a/documents/DeveloperGuide/CodeExamples.md +++ b/documents/DeveloperGuide/CodeExamples.md @@ -93,8 +93,8 @@ Module().then((_module) => { // Create a simple shader interface. const simpleSrf = doc.addNodeDef('ND_simpleSrf', 'surfaceshader', 'simpleSrf'); - const diffColor = simpleSrf.setInputValuecolor3('diffColor', new mx.Color3(1.0, 1.0, 1.0)); - const specColor = simpleSrf.setInputValuecolor3('specColor', new mx.Color3(0.0, 0.0, 0.0)); + const diffColor = simpleSrf.setInputValueColor3('diffColor', new mx.Color3(1.0, 1.0, 1.0)); + const specColor = simpleSrf.setInputValueColor3('specColor', new mx.Color3(0.0, 0.0, 0.0)); const roughness = simpleSrf.setParameterValuefloat('roughness', 0.25); // Create a material that instantiates the shader. diff --git a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp index 72a5f9b1db..01b31549cc 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp @@ -92,7 +92,12 @@ extern "C" .function("getUnitTypeDef", &mx::Document::getUnitTypeDef) .function("getUnitTypeDefs", &mx::Document::getUnitTypeDefs) .function("removeUnitTypeDef", &mx::Document::removeUnitTypeDef) - .function("getVersionIntegers", &mx::Document::getVersionIntegers) + .function("getVersionIntegers", ems::optional_override([](mx::Document &self) { + // std::pair throws a unbound type error when invoking the function in javascript + // As a result, the std:pair will be converted into an array. + std::pair versionInts = self.getVersionIntegers(); + return arrayToVec((int *)&versionInts, 2); + })) .function("upgradeVersion", &mx::Document::upgradeVersion) .function("setColorManagementSystem", &mx::Document::setColorManagementSystem) .function("hasColorManagementSystem", &mx::Document::hasColorManagementSystem) diff --git a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp index fdedeb3e2a..6fae06eae4 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp @@ -28,7 +28,7 @@ extern "C" .function("getCollectionString", &mx::GeomElement::getCollectionString) .function("setCollection", &mx::GeomElement::setCollection) .function("getCollection", &mx::GeomElement::getCollection) - BIND_VALIDATE(mx::GeomElement) + // BIND_VALIDATE(mx::GeomElement) .class_property("GEOM_ATTRIBUTE", &mx::GeomElement::GEOM_ATTRIBUTE) .class_property("COLLECTION_ATTRIBUTE", &mx::GeomElement::COLLECTION_ATTRIBUTE); @@ -101,7 +101,7 @@ extern "C" .function("getIncludeCollections", &mx::Collection::getIncludeCollections) .function("hasIncludeCycle", &mx::Collection::hasIncludeCycle) .function("matchesGeomString", &mx::Collection::matchesGeomString) - BIND_VALIDATE(mx::Collection) + // BIND_VALIDATE(mx::Collection) .class_property("CATEGORY", &mx::Collection::CATEGORY) .class_property("INCLUDE_GEOM_ATTRIBUTE", &mx::Collection::INCLUDE_GEOM_ATTRIBUTE) .class_property("EXCLUDE_GEOM_ATTRIBUTE", &mx::Collection::EXCLUDE_GEOM_ATTRIBUTE) diff --git a/source/JsMaterialX/test/codeExamples.spec.js b/source/JsMaterialX/test/codeExamples.spec.js index 283febf096..1193794974 100644 --- a/source/JsMaterialX/test/codeExamples.spec.js +++ b/source/JsMaterialX/test/codeExamples.spec.js @@ -15,7 +15,7 @@ describe('Code Examples', () => { expect(nodes.length).to.equal(1); expect(nodes[0]).to.eql(image); - image.setInputValuestring('file', 'image1.tif', 'filename'); + image.setInputValueString('file', 'image1.tif', 'filename'); const input = image.getInput('file'); expect(input).to.not.be.null; expect(input.getValue().getData()).to.equal('image1.tif'); @@ -36,17 +36,17 @@ describe('Code Examples', () => { expect(nodeDefs.length).to.equal(1); expect(nodeDefs[0]).to.eql(simpleSrf); - simpleSrf.setInputValuecolor3('diffColor', new mx.Color3(1.0, 1.0, 1.0)); + simpleSrf.setInputValueColor3('diffColor', new mx.Color3(1.0, 1.0, 1.0)); let inputValue = simpleSrf.getInputValue('diffColor'); expect(inputValue).to.not.be.null; expect(inputValue.getData()).to.eql(new mx.Color3(1.0, 1.0, 1.0)); - simpleSrf.setInputValuecolor3('specColor', new mx.Color3(0.0, 0.0, 0.0)); + simpleSrf.setInputValueColor3('specColor', new mx.Color3(0.0, 0.0, 0.0)); inputValue = simpleSrf.getInputValue('specColor'); expect(inputValue).to.not.be.null; expect(inputValue.getData()).to.eql(new mx.Color3(0.0, 0.0, 0.0)); - const roughness = simpleSrf.setInputValuefloat('roughness', 0.25); + const roughness = simpleSrf.setInputValueFloat('roughness', 0.25); inputValue = simpleSrf.getInputValue('roughness'); expect(inputValue).to.not.be.null; expect(inputValue.getData()).to.equal(0.25); diff --git a/source/JsMaterialX/test/document.spec.js b/source/JsMaterialX/test/document.spec.js index 19d7986d8a..fe536c91e0 100644 --- a/source/JsMaterialX/test/document.spec.js +++ b/source/JsMaterialX/test/document.spec.js @@ -43,24 +43,24 @@ describe('Build Document', () => { it('Set constant node color', () => { const color = new mx.Color3(0.1, 0.2, 0.3); - constant.setInputValuecolor3('value', color); + constant.setInputValueColor3('value', color); expect(constant.getInputValue('value').getData()).to.eql(color); }); it('Set image node file', () => { const file = 'image1.tif'; - image.setInputValuestring('file', file, 'filename'); + image.setInputValueString('file', file, 'filename'); expect(image.getInputValue('file').getData()).to.eql(file); }); it('Create a custom nodedef', () => { const nodeDef = doc.addNodeDef('nodeDef1', 'float', 'turbulence3d'); - nodeDef.setInputValueinteger('octaves', 3); - nodeDef.setInputValuefloat('lacunarity', 2.0); - nodeDef.setInputValuefloat('gain', 0.5); + nodeDef.setInputValueInteger('octaves', 3); + nodeDef.setInputValueFloat('lacunarity', 2.0); + nodeDef.setInputValueFloat('gain', 0.5); const custom = nodeGraph.addNode('turbulence3d', 'turbulence1', 'float'); expect(custom.getInputValue('octaves').getData()).to.equal(3); - custom.setInputValueinteger('octaves', 5); + custom.setInputValueInteger('octaves', 5); expect(custom.getInputValue('octaves').getData()).to.equal(5); }); @@ -78,9 +78,9 @@ describe('Build Document', () => { // let diffColor, specColor, roughness, texId; // it('Create a simple shader interface', () => { // const shaderDef = doc.addNodeDef('shader1', 'surfaceshader', 'simpleSrf'); - // diffColor = shaderDef.setInputValuecolor3('diffColor', new mx.Color3(1.0, 1.0, 1.0)); - // specColor = shaderDef.setInputValuecolor3('specColor', new mx.Color3(0.0, 0.0, 0.0)); - // roughness = shaderDef.setInputValuefloat('roughness', 0.25); + // diffColor = shaderDef.setInputValueColor3('diffColor', new mx.Color3(1.0, 1.0, 1.0)); + // specColor = shaderDef.setInputValueColor3('specColor', new mx.Color3(0.0, 0.0, 0.0)); + // roughness = shaderDef.setInputValueFloat('roughness', 0.25); // texId = shaderDef.setTokenValue('texId', '01'); // expect(roughness.getIsUniform()).to.equal(false); // roughness.setIsUniform(true); From f1dd0854ce67326e15a89895077e39f336b89caf Mon Sep 17 00:00:00 2001 From: Cedrick Muenstermann Date: Mon, 17 May 2021 14:01:59 +0200 Subject: [PATCH 10/33] Add JsMaterial bindings --- source/JsMaterialX/CMakeLists.txt | 1 + .../JsMaterialXCore/JsMaterial.cpp | 43 +++++++++++++++++++ .../JsMaterialX/JsMaterialXCore/JsMaterial.js | 4 ++ 3 files changed, 48 insertions(+) create mode 100644 source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp create mode 100644 source/JsMaterialX/JsMaterialXCore/JsMaterial.js diff --git a/source/JsMaterialX/CMakeLists.txt b/source/JsMaterialX/CMakeLists.txt index f49389500c..5cf3553120 100644 --- a/source/JsMaterialX/CMakeLists.txt +++ b/source/JsMaterialX/CMakeLists.txt @@ -5,6 +5,7 @@ set(OUTPUT_LIBS ${PROJECT_BINARY_DIR}/source/) set(SOURCE_FOLDER ${CMAKE_SOURCE_DIR}/source) set(CORE_DEPS ${OUTPUT_CORE}JsTypes.cpp + ${OUTPUT_CORE}JsMaterial.cpp ${OUTPUT_CORE}JsUnit.cpp ${OUTPUT_CORE}JsExceptions.cpp ${OUTPUT_CORE}JsUtil.cpp diff --git a/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp b/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp new file mode 100644 index 0000000000..f341dd002c --- /dev/null +++ b/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp @@ -0,0 +1,43 @@ +#include "../helpers.h" +#include + +#include +#include + +#include +#include + +namespace ems = emscripten; +namespace mx = MaterialX; + +extern "C" +{ + EMSCRIPTEN_BINDINGS(material) + { + ems::function("getShaderNodes", ems::optional_override([](mx::NodePtr materialNode) { + std::unordered_set set = mx::getShaderNodes(materialNode); + // Put all elements into an std::vector + std::vector vec; + vec.insert(vec.end(), set.begin(), set.end()); + return vec; + })); + ems::function("getShaderNodes", ems::optional_override([](mx::NodePtr materialNode, const std::string& nodeType) { + std::unordered_set set = mx::getShaderNodes(materialNode, nodeType); + // Put all elements into an std::vector + std::vector vec; + vec.insert(vec.end(), set.begin(), set.end()); + return vec; + })); + ems::function("getShaderNodes", ems::optional_override([](mx::NodePtr materialNode, + const std::string& nodeType, + const std::string& target) { + std::unordered_set set = mx::getShaderNodes(materialNode, nodeType, target); + // Put all elements into an std::vector + std::vector vec; + vec.insert(vec.end(), set.begin(), set.end()); + return vec; + })); + + ems::function("getConnectedOutputs", &mx::getConnectedOutputs); + } +} \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsMaterial.js b/source/JsMaterialX/JsMaterialXCore/JsMaterial.js new file mode 100644 index 0000000000..fa39f62796 --- /dev/null +++ b/source/JsMaterialX/JsMaterialXCore/JsMaterial.js @@ -0,0 +1,4 @@ +addWrapper(function(Module, api) { + api.getShaderNodes = Module.getShaderNodes; + api.getConnectedOutputs = Module.getConnectedOutputs; +}); \ No newline at end of file From 15a98cae6942fbe79a885dd2ceead78547a581fe Mon Sep 17 00:00:00 2001 From: Cedrick Muenstermann Date: Mon, 17 May 2021 16:11:06 +0200 Subject: [PATCH 11/33] Add some of the missing bindings + fixes --- .../JsMaterialXCore/JsDefinition.cpp | 38 ++++---- .../JsMaterialXCore/JsDocument.cpp | 2 + .../JsMaterialX/JsMaterialXCore/JsElement.cpp | 94 +++++++++++++------ 3 files changed, 85 insertions(+), 49 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp index 1889f81431..577b171b0c 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp @@ -10,8 +10,8 @@ namespace mx = MaterialX; using stRef = const std::string&; -#define BIND_VALUE_ELEMENT_FUNC_INSTANCE(NAME, T) \ - .function("setValue" #NAME, &mx::AttributeDef::setValue) +#define BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(NAME, T) \ + BIND_MEMBER_FUNC("setValue" #NAME, mx::AttributeDef, setValue, 1, 2, const T&, stRef) extern "C" { @@ -23,6 +23,7 @@ extern "C" .function("setNodeString", &mx::NodeDef::setNodeString) .function("hasNodeString", &mx::NodeDef::hasNodeString) .function("getNodeString", &mx::NodeDef::getNodeString) + .function("getType", &mx::NodeDef::getType) .function("setNodeGroup", &mx::NodeDef::setNodeGroup) .function("hasNodeGroup", &mx::NodeDef::hasNodeGroup) .function("getNodeGroup", &mx::NodeDef::getNodeGroup) @@ -100,7 +101,7 @@ extern "C" .function("addUnit", &mx::UnitDef::addUnit) .function("getUnit", &mx::UnitDef::getUnit) .function("getUnits", &mx::UnitDef::getUnits) - .function("reomveUnit", &mx::UnitDef::removeUnit) + .function("removeUnit", &mx::UnitDef::removeUnit) .class_property("CATEGORY", &mx::UnitDef::CATEGORY) .class_property("UNITTYPE_ATTRIBUTE", &mx::UnitDef::UNITTYPE_ATTRIBUTE); @@ -119,22 +120,21 @@ extern "C" .function("setValueString", &mx::AttributeDef::setValueString) .function("hasValueString", &mx::AttributeDef::hasValueString) .function("getValueString", &mx::AttributeDef::getValueString) - // .function("setValue", &mx::AttributeDef::setValue) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(Integer, int) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(Boolean, bool) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(Float, float) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(Color3, mx::Color3) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(Color4, mx::Color4) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(Vector2, mx::Vector2) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(Vector3, mx::Vector3) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(Vector4, mx::Vector4) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(Matrix33, mx::Matrix33) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(Matrix44, mx::Matrix44) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(String, std::string) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(IntegerArray, mx::IntVec) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(BooleanArray, mx::BoolVec) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(FloatArray, mx::FloatVec) - BIND_VALUE_ELEMENT_FUNC_INSTANCE(StringArray, mx::StringVec) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(Integer, int) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(Boolean, bool) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(Float, float) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(Color3, mx::Color3) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(Color4, mx::Color4) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(Vector2, mx::Vector2) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(Vector3, mx::Vector3) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(Vector4, mx::Vector4) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(Matrix33, mx::Matrix33) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(Matrix44, mx::Matrix44) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(String, std::string) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(IntegerArray, mx::IntVec) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(BooleanArray, mx::BoolVec) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(FloatArray, mx::FloatVec) + BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(StringArray, mx::StringVec) .function("hasValue", &mx::AttributeDef::hasValue) .function("getValue", &mx::AttributeDef::getValue) .function("setElements", &mx::AttributeDef::setElements) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp index 01b31549cc..7ebb560d4b 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp @@ -17,6 +17,8 @@ extern "C" ems::class_>("Document") .smart_ptr_constructor("Document", &std::make_shared) .smart_ptr>("Document") + // At the moment only the Document type is used. Once more types are added this binding needs to be adapted accordingly. + .class_function("createDocument", &mx::Document::createDocument) .function("initialize", &mx::Document::initialize) .function("copy", &mx::Document::copy) .function("importLibrary", &mx::Document::importLibrary) diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp index f976bd68d5..3918a26af4 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp @@ -17,11 +17,17 @@ namespace mx = MaterialX; #define BIND_VALUE_ELEMENT_FUNC_INSTANCE(NAME, T) \ BIND_MEMBER_FUNC("setValue" #NAME, mx::ValueElement, setValue, 1, 2, const T&, stRef) -#define BIND_ELEMENT_FUNC_INSTANCE(T) \ - BIND_MEMBER_FUNC("addChild" #T, mx::Element, addChild, 0, 1, stRef) \ - .function("getChildOfType" #T, &mx::Element::getChildOfType) \ - BIND_MEMBER_FUNC("getChildrenOfType" #T, mx::Element, getChildrenOfType, 0, 1, stRef) \ - .function("removeChildOfType" #T, &mx::Element::removeChildOfType) +#define BIND_ELEMENT_CHILD_FUNC_INSTANCE(NAME, T) \ + BIND_MEMBER_FUNC("addChild" #NAME, mx::Element, addChild, 0, 1, stRef) \ + .function("getChildOfType" #NAME, &mx::Element::getChildOfType) \ + BIND_MEMBER_FUNC("getChildrenOfType" #NAME, mx::Element, getChildrenOfType, 0, 1, stRef) \ + .function("removeChildOfType" #NAME, &mx::Element::removeChildOfType) \ + .function("getAncestorOfType" #NAME, &mx::Element::getAncestorOfType) \ + .function("resolveRootNameReference" #NAME, &mx::Element::resolveRootNameReference) + +#define BIND_ELEMENT_FUNC_INSTANCE(NAME, T) \ + .function("setTypedAttribute" #NAME, &mx::Element::setTypedAttribute) \ + .function("getTypedAttribute" #NAME, &mx::Element::getTypedAttribute) extern "C" { @@ -69,22 +75,22 @@ extern "C" .function("setChildIndex", &mx::Element::setChildIndex) .function("getChildIndex", &mx::Element::getChildIndex) .function("removeChild", &mx::Element::removeChild) - BIND_ELEMENT_FUNC_INSTANCE(mx::Collection) - BIND_ELEMENT_FUNC_INSTANCE(mx::Document) - BIND_ELEMENT_FUNC_INSTANCE(mx::GeomInfo) - BIND_ELEMENT_FUNC_INSTANCE(mx::GeomProp) - BIND_ELEMENT_FUNC_INSTANCE(mx::Implementation) - BIND_ELEMENT_FUNC_INSTANCE(mx::Look) - BIND_ELEMENT_FUNC_INSTANCE(mx::MaterialAssign) - BIND_ELEMENT_FUNC_INSTANCE(mx::Node) - BIND_ELEMENT_FUNC_INSTANCE(mx::NodeDef) - BIND_ELEMENT_FUNC_INSTANCE(mx::NodeGraph) - BIND_ELEMENT_FUNC_INSTANCE(mx::Property) - BIND_ELEMENT_FUNC_INSTANCE(mx::PropertySet) - BIND_ELEMENT_FUNC_INSTANCE(mx::PropertySetAssign) - BIND_ELEMENT_FUNC_INSTANCE(mx::Token) - BIND_ELEMENT_FUNC_INSTANCE(mx::TypeDef) - BIND_ELEMENT_FUNC_INSTANCE(mx::Visibility) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Collection, mx::Collection) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Document, mx::Document) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(GeomInfo, mx::GeomInfo) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(GeomProp, mx::GeomProp) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Implementation, mx::Implementation) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Look, mx::Look) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(MaterialAssign, mx::MaterialAssign) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Node, mx::Node) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(NodeDef, mx::NodeDef) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(NodeGraph, mx::NodeGraph) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Property, mx::Property) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(PropertySet, mx::PropertySet) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(PropertySetAssign, mx::PropertySetAssign) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Token, mx::Token) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(TypeDef, mx::TypeDef) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Visibility, mx::Visibility) .function("setAttribute", &mx::Element::setAttribute) .function("hasAttribute", &mx::Element::hasAttribute) @@ -95,6 +101,21 @@ extern "C" .function("getParent", ems::select_overload(&mx::Element::getParent)) .function("getRoot", ems::select_overload(&mx::Element::getRoot)) .function("getDocument", ems::select_overload(&mx::Element::getDocument)) + BIND_ELEMENT_FUNC_INSTANCE(Integer, int) + BIND_ELEMENT_FUNC_INSTANCE(Boolean, bool) + BIND_ELEMENT_FUNC_INSTANCE(Float, float) + BIND_ELEMENT_FUNC_INSTANCE(Color3, mx::Color3) + BIND_ELEMENT_FUNC_INSTANCE(Color4, mx::Color4) + BIND_ELEMENT_FUNC_INSTANCE(Vector2, mx::Vector2) + BIND_ELEMENT_FUNC_INSTANCE(Vector3, mx::Vector3) + BIND_ELEMENT_FUNC_INSTANCE(Vector4, mx::Vector4) + BIND_ELEMENT_FUNC_INSTANCE(Matrix33, mx::Matrix33) + BIND_ELEMENT_FUNC_INSTANCE(Matrix44, mx::Matrix44) + BIND_ELEMENT_FUNC_INSTANCE(String, std::string) + BIND_ELEMENT_FUNC_INSTANCE(IntegerArray, mx::IntVec) + BIND_ELEMENT_FUNC_INSTANCE(BooleanArray, mx::BoolVec) + BIND_ELEMENT_FUNC_INSTANCE(FloatArray, mx::FloatVec) + BIND_ELEMENT_FUNC_INSTANCE(StringArray, mx::StringVec) .function("traverseTree", &mx::Element::traverseTree) .function("traverseGraph", &mx::Element::traverseGraph) @@ -108,13 +129,11 @@ extern "C" .function("getSourceUri", &mx::Element::getSourceUri) .function("getActiveSourceUri", &mx::Element::getActiveSourceUri) BIND_VALIDATE(mx::Element) - .function("copyContentFrom", ems::optional_override([](mx::Element &self, mx::ConstElementPtr source) { - const mx::ConstElementPtr &source1 = source; - return self.mx::Element::copyContentFrom(source1); - })) + .function("copyContentFrom", &mx::Element::copyContentFrom) .function("clearContent", &mx::Element::clearContent) .function("createValidChildName", &mx::Element::createValidChildName) BIND_MEMBER_FUNC("createStringResolver", mx::Element, createStringResolver, 0, 1, stRef) + .function("addTokens", &mx::Element::addTokens) .function("asString", &mx::Element::asString) .function("__str__", &mx::Element::asString) @@ -149,7 +168,6 @@ extern "C" .function("setImplementationName", &mx::ValueElement::setImplementationName) .function("hasImplementationName", &mx::ValueElement::hasImplementationName) .function("getImplementationName", &mx::ValueElement::getImplementationName) - // .function("setValue", &mx::ValueElement::setValue) BIND_VALUE_ELEMENT_FUNC_INSTANCE(Integer, int) BIND_VALUE_ELEMENT_FUNC_INSTANCE(Boolean, bool) BIND_VALUE_ELEMENT_FUNC_INSTANCE(Float, float) @@ -165,9 +183,10 @@ extern "C" BIND_VALUE_ELEMENT_FUNC_INSTANCE(BooleanArray, mx::BoolVec) BIND_VALUE_ELEMENT_FUNC_INSTANCE(FloatArray, mx::FloatVec) BIND_VALUE_ELEMENT_FUNC_INSTANCE(StringArray, mx::StringVec) + .function("hasValue", &mx::ValueElement::hasValue) .function("getValue", &mx::ValueElement::getValue) - .function("getDefaultValue", &mx::ValueElement::getDefaultValue) BIND_MEMBER_FUNC_RAW_PTR("getResolvedValue", mx::ValueElement, getResolvedValue, 0, 1, mx::StringResolverPtr) + .function("getDefaultValue", &mx::ValueElement::getDefaultValue) .function("setUnit", &mx::ValueElement::setUnit) .function("hasUnit", &mx::ValueElement::hasUnit) .function("getUnit", &mx::ValueElement::getUnit) @@ -184,7 +203,6 @@ extern "C" .class_property("IMPLEMENTATION_TYPE_ATTRIBUTE", &mx::ValueElement::IMPLEMENTATION_TYPE_ATTRIBUTE) .class_property("ENUM_ATTRIBUTE", &mx::ValueElement::ENUM_ATTRIBUTE) .class_property("ENUM_VALUES_ATTRIBUTE", &mx::ValueElement::ENUM_VALUES_ATTRIBUTE) - .class_property("UNIT_ATTRIBUTE", &mx::ValueElement::UNIT_ATTRIBUTE) .class_property("UI_NAME_ATTRIBUTE", &mx::ValueElement::UI_NAME_ATTRIBUTE) .class_property("UI_FOLDER_ATTRIBUTE", &mx::ValueElement::UI_FOLDER_ATTRIBUTE) .class_property("UI_MIN_ATTRIBUTE", &mx::ValueElement::UI_MIN_ATTRIBUTE) @@ -192,12 +210,24 @@ extern "C" .class_property("UI_SOFT_MIN_ATTRIBUTE", &mx::ValueElement::UI_SOFT_MIN_ATTRIBUTE) .class_property("UI_SOFT_MAX_ATTRIBUTE", &mx::ValueElement::UI_SOFT_MAX_ATTRIBUTE) .class_property("UI_STEP_ATTRIBUTE", &mx::ValueElement::UI_STEP_ATTRIBUTE) - .class_property("UI_ADVANCED_ATTRIBUTE", &mx::ValueElement::UI_ADVANCED_ATTRIBUTE); + .class_property("UI_ADVANCED_ATTRIBUTE", &mx::ValueElement::UI_ADVANCED_ATTRIBUTE) + .class_property("UNIT_ATTRIBUTE", &mx::ValueElement::UNIT_ATTRIBUTE) + .class_property("UNITTYPE_ATTRIBUTE", &mx::ValueElement::UNITTYPE_ATTRIBUTE) + .class_property("UNIFORM_ATTRIBUTE", &mx::ValueElement::UNIFORM_ATTRIBUTE); + ems::class_>("Token") .smart_ptr_constructor("Token", &std::make_shared) .class_property("CATEGORY", &mx::Token::CATEGORY); + ems::class_>("CommentElement") + .smart_ptr_constructor("CommentElement", &std::make_shared) + .class_property("CATEGORY", &mx::CommentElement::CATEGORY); + + ems::class_>("GenericElement") + .smart_ptr_constructor("GenericElement", &std::make_shared) + .class_property("CATEGORY", &mx::GenericElement::CATEGORY); + ems::class_("StringResolver") .smart_ptr>("StringResolver") .class_function("create", &mx::StringResolver::create) // Static function for creating a mx::StringResolver instance @@ -229,8 +259,12 @@ extern "C" return obj; })) - .function("resolve", &mx::StringResolver::resolve); + .function("resolve", &mx::StringResolver::resolve) + .class_function("isResolvedType", &mx::StringResolver::isResolvedType); ems::class_("ElementPredicate"); + + ems::function("targetStringsMatch", &mx::targetStringsMatch); + ems::function("prettyPrint", &mx::prettyPrint); } } \ No newline at end of file From 4dda06ec1bf31dd99172ad3fbe874503c1ad80e0 Mon Sep 17 00:00:00 2001 From: Cedrick Muenstermann Date: Mon, 17 May 2021 21:07:13 +0200 Subject: [PATCH 12/33] Add more missing bindings, adapt getVersionIntegers bindings, remove incorrect use of BIND_MEMBER_FUNC_RAW_PTR, remove newlines --- documents/DeveloperGuide/CodeExamples.md | 4 +- .../JsMaterialXCore/JsDocument.cpp | 16 +++---- .../JsMaterialX/JsMaterialXCore/JsElement.cpp | 44 ++++++++----------- source/JsMaterialX/JsMaterialXCore/JsGeom.cpp | 19 ++++---- source/JsMaterialX/JsMaterialXCore/JsGeom.js | 6 ++- .../JsMaterialXCore/JsInterface.cpp | 17 ++----- source/JsMaterialX/JsMaterialXCore/JsLook.cpp | 11 ++--- source/JsMaterialX/JsMaterialXCore/JsLook.js | 2 + .../JsMaterialXCore/JsMaterial.cpp | 7 +-- 9 files changed, 56 insertions(+), 70 deletions(-) diff --git a/documents/DeveloperGuide/CodeExamples.md b/documents/DeveloperGuide/CodeExamples.md index efaa2c7443..57e3cf9203 100644 --- a/documents/DeveloperGuide/CodeExamples.md +++ b/documents/DeveloperGuide/CodeExamples.md @@ -93,8 +93,8 @@ Module().then((_module) => { // Create a simple shader interface. const simpleSrf = doc.addNodeDef('ND_simpleSrf', 'surfaceshader', 'simpleSrf'); - const diffColor = simpleSrf.setInputValueColor3('diffColor', new mx.Color3(1.0, 1.0, 1.0)); - const specColor = simpleSrf.setInputValueColor3('specColor', new mx.Color3(0.0, 0.0, 0.0)); + const diffColor = simpleSrf.setInputValuecolor3('diffColor', new mx.Color3(1.0, 1.0, 1.0)); + const specColor = simpleSrf.setInputValuecolor3('specColor', new mx.Color3(0.0, 0.0, 0.0)); const roughness = simpleSrf.setParameterValuefloat('roughness', 0.25); // Create a material that instantiates the shader. diff --git a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp index 7ebb560d4b..097098701f 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp @@ -23,10 +23,10 @@ extern "C" .function("copy", &mx::Document::copy) .function("importLibrary", &mx::Document::importLibrary) .function("getReferencedSourceUris", ems::optional_override([](mx::Document &self) { - mx::StringSet referenced = self.mx::Document::getReferencedSourceUris(); - int size = referenced.size(); - return arrayToVec((std::string *)&referenced, size); - })) + mx::StringSet referenced = self.mx::Document::getReferencedSourceUris(); + int size = referenced.size(); + return arrayToVec((std::string *)&referenced, size); + })) BIND_MEMBER_FUNC("addNodeGraph", mx::Document, addNodeGraph, 0, 1, stRef) .function("getNodeGraph", &mx::Document::getNodeGraph) .function("getNodeGraphs", &mx::Document::getNodeGraphs) @@ -95,11 +95,9 @@ extern "C" .function("getUnitTypeDefs", &mx::Document::getUnitTypeDefs) .function("removeUnitTypeDef", &mx::Document::removeUnitTypeDef) .function("getVersionIntegers", ems::optional_override([](mx::Document &self) { - // std::pair throws a unbound type error when invoking the function in javascript - // As a result, the std:pair will be converted into an array. - std::pair versionInts = self.getVersionIntegers(); - return arrayToVec((int *)&versionInts, 2); - })) + auto version = mx::getVersionIntegers(); + return ems::val::array((int *)&version, (int *)&version + 2); + })) .function("upgradeVersion", &mx::Document::upgradeVersion) .function("setColorManagementSystem", &mx::Document::setColorManagementSystem) .function("hasColorManagementSystem", &mx::Document::hasColorManagementSystem) diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp index 3918a26af4..cf133cf6b8 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp @@ -40,7 +40,7 @@ extern "C" .function("getCategory", &mx::Element::getCategory) .function("setName", &mx::Element::setName) .function("getName", &mx::Element::getName) - BIND_MEMBER_FUNC_RAW_PTR("getNamePath", mx::Element, getNamePath, 0, 1, mx::ConstElementPtr) + BIND_MEMBER_FUNC("getNamePath", mx::Element, getNamePath, 0, 1, mx::ConstElementPtr) .function("getDescendant", &mx::Element::getDescendant) .function("setFilePrefix", &mx::Element::setFilePrefix) .function("hasFilePrefix", &mx::Element::hasFilePrefix) @@ -67,7 +67,6 @@ extern "C" .function("getQualifiedName", &mx::Element::getQualifiedName) .function("setDocString", &mx::Element::setDocString) .function("getDocString", &mx::Element::getDocString) - BIND_MEMBER_FUNC("addChildOfCategory", mx::Element, addChildOfCategory, 1, 2, stRef, std::string) .function("changeChildCategory", &mx::Element::changeChildCategory) .function("getChild", &mx::Element::getChild) @@ -91,7 +90,6 @@ extern "C" BIND_ELEMENT_CHILD_FUNC_INSTANCE(Token, mx::Token) BIND_ELEMENT_CHILD_FUNC_INSTANCE(TypeDef, mx::TypeDef) BIND_ELEMENT_CHILD_FUNC_INSTANCE(Visibility, mx::Visibility) - .function("setAttribute", &mx::Element::setAttribute) .function("hasAttribute", &mx::Element::hasAttribute) .function("getAttribute", &mx::Element::getAttribute) @@ -117,12 +115,10 @@ extern "C" BIND_ELEMENT_FUNC_INSTANCE(FloatArray, mx::FloatVec) BIND_ELEMENT_FUNC_INSTANCE(StringArray, mx::StringVec) .function("traverseTree", &mx::Element::traverseTree) - .function("traverseGraph", &mx::Element::traverseGraph) BIND_MEMBER_FUNC("getUpstreamEdge", mx::Element, getUpstreamEdge, 0, 1, std::size_t) .function("getUpstreamEdgeCount", &mx::Element::getUpstreamEdgeCount) BIND_MEMBER_FUNC("getUpstreamElement", mx::Element, getUpstreamElement, 0, 1, std::size_t) - .function("traverseInheritance", &mx::Element::traverseInheritance) .function("setSourceUri", &mx::Element::setSourceUri) .function("hasSourceUri", &mx::Element::hasSourceUri) @@ -136,7 +132,6 @@ extern "C" .function("addTokens", &mx::Element::addTokens) .function("asString", &mx::Element::asString) .function("__str__", &mx::Element::asString) - .class_property("NAME_ATTRIBUTE", &mx::Element::NAME_ATTRIBUTE) .class_property("FILE_PREFIX_ATTRIBUTE", &mx::Element::FILE_PREFIX_ATTRIBUTE) .class_property("GEOM_PREFIX_ATTRIBUTE", &mx::Element::GEOM_PREFIX_ATTRIBUTE) @@ -161,7 +156,7 @@ extern "C" .function("setValueString", &mx::ValueElement::setValueString) .function("hasValueString", &mx::ValueElement::hasValueString) .function("getValueString", &mx::ValueElement::getValueString) - BIND_MEMBER_FUNC_RAW_PTR("getResolvedValueString", mx::ValueElement, getResolvedValueString, 0, 1, mx::StringResolverPtr) + BIND_MEMBER_FUNC("getResolvedValueString", mx::ValueElement, getResolvedValueString, 0, 1, mx::StringResolverPtr) .function("setInterfaceName", &mx::ValueElement::setInterfaceName) .function("hasInterfaceName", &mx::ValueElement::hasInterfaceName) .function("getInterfaceName", &mx::ValueElement::getInterfaceName) @@ -185,7 +180,7 @@ extern "C" BIND_VALUE_ELEMENT_FUNC_INSTANCE(StringArray, mx::StringVec) .function("hasValue", &mx::ValueElement::hasValue) .function("getValue", &mx::ValueElement::getValue) - BIND_MEMBER_FUNC_RAW_PTR("getResolvedValue", mx::ValueElement, getResolvedValue, 0, 1, mx::StringResolverPtr) + BIND_MEMBER_FUNC("getResolvedValue", mx::ValueElement, getResolvedValue, 0, 1, mx::StringResolverPtr) .function("getDefaultValue", &mx::ValueElement::getDefaultValue) .function("setUnit", &mx::ValueElement::setUnit) .function("hasUnit", &mx::ValueElement::hasUnit) @@ -215,7 +210,6 @@ extern "C" .class_property("UNITTYPE_ATTRIBUTE", &mx::ValueElement::UNITTYPE_ATTRIBUTE) .class_property("UNIFORM_ATTRIBUTE", &mx::ValueElement::UNIFORM_ATTRIBUTE); - ems::class_>("Token") .smart_ptr_constructor("Token", &std::make_shared) .class_property("CATEGORY", &mx::Token::CATEGORY); @@ -239,26 +233,26 @@ extern "C" .function("setUvTileString", &mx::StringResolver::setUvTileString) .function("setFilenameSubstitution", &mx::StringResolver::setFilenameSubstitution) .function("getFilenameSubstitutions", ems::optional_override([](mx::StringResolver &self) { - std::unordered_map res = self.mx::StringResolver::getFilenameSubstitutions(); - ems::val obj = ems::val::object(); - for (std::pair element : res) - { - obj.set(element.first, element.second); - } + std::unordered_map res = self.mx::StringResolver::getFilenameSubstitutions(); + ems::val obj = ems::val::object(); + for (std::pair element : res) + { + obj.set(element.first, element.second); + } - return obj; - })) + return obj; + })) .function("setGeomNameSubstitution", &mx::StringResolver::setGeomNameSubstitution) .function("getGeomNameSubstitutions", ems::optional_override([](mx::StringResolver &self) { - std::unordered_map res = self.mx::StringResolver::getGeomNameSubstitutions(); - ems::val obj = ems::val::object(); - for (std::pair element : res) - { - obj.set(element.first, element.second); - } + std::unordered_map res = self.mx::StringResolver::getGeomNameSubstitutions(); + ems::val obj = ems::val::object(); + for (std::pair element : res) + { + obj.set(element.first, element.second); + } - return obj; - })) + return obj; + })) .function("resolve", &mx::StringResolver::resolve) .class_function("isResolvedType", &mx::StringResolver::isResolvedType); diff --git a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp index 6fae06eae4..bd6c80a2ea 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp @@ -16,6 +16,12 @@ extern "C" { EMSCRIPTEN_BINDINGS(geom) { + ems::constant("GEOM_PATH_SEPARATOR", mx::GEOM_PATH_SEPARATOR); + ems::constant("UNIVERSAL_GEOM_NAME", mx::UNIVERSAL_GEOM_NAME); + ems::constant("UDIM_TOKEN", mx::UDIM_TOKEN); + ems::constant("UDIMSET", mx::UDIMSET); + ems::constant("UV_TILE_TOKEN", mx::UV_TILE_TOKEN); + ems::class_>("GeomElement") .smart_ptr>("GeomElement") .smart_ptr>("GeomElement") @@ -44,7 +50,6 @@ extern "C" .function("getTokens", &mx::GeomInfo::getTokens) .function("removeToken", &mx::GeomInfo::removeToken) .function("addTokens", &mx::GeomInfo::addTokens) - .function("setTokenValue", &mx::GeomInfo::setTokenValue) BIND_GEOMINFO_FUNC_INSTANCE(Integer, int) BIND_GEOMINFO_FUNC_INSTANCE(Boolean, bool) BIND_GEOMINFO_FUNC_INSTANCE(Float, float) @@ -80,7 +85,10 @@ extern "C" .function("setIndex", &mx::GeomPropDef::setIndex) .function("hasIndex", &mx::GeomPropDef::hasIndex) .function("getIndex", &mx::GeomPropDef::getIndex) - .class_property("CATEGORY", &mx::GeomPropDef::CATEGORY); + .class_property("CATEGORY", &mx::GeomPropDef::CATEGORY) + .class_property("GEOM_PROP_ATTRIBUTE", &mx::GeomPropDef::GEOM_PROP_ATTRIBUTE) + .class_property("SPACE_ATTRIBUTE", &mx::GeomPropDef::SPACE_ATTRIBUTE) + .class_property("INDEX_ATTRIBUTE", &mx::GeomPropDef::INDEX_ATTRIBUTE); ems::class_>("Collection") .smart_ptr_constructor("Collection", &std::make_shared) @@ -107,11 +115,6 @@ extern "C" .class_property("EXCLUDE_GEOM_ATTRIBUTE", &mx::Collection::EXCLUDE_GEOM_ATTRIBUTE) .class_property("INCLUDE_COLLECTION_ATTRIBUTE", &mx::Collection::INCLUDE_COLLECTION_ATTRIBUTE); - ems::function("geomStringsMatch", &mx::geomStringsMatch); - - ems::function("UNIVERSAL_GEOM_NAME", ems::optional_override([]() { - return mx::UNIVERSAL_GEOM_NAME; - })); - + ems::function("geomStringsMatch", &mx::geomStringsMatch); } } \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsGeom.js b/source/JsMaterialX/JsMaterialXCore/JsGeom.js index 5f41e02a34..c1d6ef3a31 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsGeom.js +++ b/source/JsMaterialX/JsMaterialXCore/JsGeom.js @@ -17,5 +17,9 @@ addWrapper(function(Module, api) { api.geomStringsMatch = wrapperFunction(Module.geomStringsMatch); - api.UNIVERSAL_GEOM_NAME = Module.UNIVERSAL_GEOM_NAME(); + api.GEOM_PATH_SEPARATOR = Module.GEOM_PATH_SEPARATOR; + api.UNIVERSAL_GEOM_NAME = Module.UNIVERSAL_GEOM_NAME; + api.UDIM_TOKEN = Module.UDIM_TOKEN; + api.UDIMSET = Module.UDIMSET; + api.UV_TILE_TOKEN = Module.UV_TILE_TOKEN; }); diff --git a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp index 76d04f9b31..ba0e58daf2 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp @@ -17,7 +17,6 @@ extern "C" { EMSCRIPTEN_BINDINGS(interface) { - ems::class_>("PortElement") .smart_ptr>("PortElement") .smart_ptr>("PortElement") @@ -75,7 +74,6 @@ extern "C" .function("setNodeDefString", &mx::InterfaceElement::setNodeDefString) .function("hasNodeDefString", &mx::InterfaceElement::hasNodeDefString) .function("getNodeDefString", &mx::InterfaceElement::getNodeDefString) - BIND_MEMBER_FUNC("addInput", mx::InterfaceElement, addInput, 0, 2, stRef, stRef) .function("getInput", &mx::InterfaceElement::getInput) .function("getInputs", &mx::InterfaceElement::getInputs) @@ -92,7 +90,6 @@ extern "C" .function("getActiveOutputs", &mx::InterfaceElement::getActiveOutputs) .function("setConnectedOutput", &mx::InterfaceElement::setConnectedOutput) .function("getConnectedOutput", &mx::InterfaceElement::getConnectedOutput) - BIND_MEMBER_FUNC("addToken", mx::InterfaceElement, addToken, 0, 1, stRef) .function("getToken", &mx::InterfaceElement::getToken) .function("getTokens", &mx::InterfaceElement::getTokens) @@ -100,7 +97,6 @@ extern "C" .function("getActiveToken", &mx::InterfaceElement::getActiveToken) .function("getActiveTokens", &mx::InterfaceElement::getActiveTokens) .function("addTokens", &mx::InterfaceElement::addTokens) - .function("getValueElement", &mx::InterfaceElement::getValueElement) .function("getActiveValueElement", &mx::InterfaceElement::getActiveValueElement) .function("getActiveValueElements", &mx::InterfaceElement::getActiveValueElements) @@ -120,30 +116,23 @@ extern "C" BIND_INTERFACE_TYPE_INSTANCE(FloatArray, mx::FloatVec) BIND_INTERFACE_TYPE_INSTANCE(StringArray, mx::StringVec) BIND_MEMBER_FUNC("getInputValue", mx::InterfaceElement, getInputValue, 1, 2, stRef, stRef) - .function("setTokenValue", &mx::InterfaceElement::setTokenValue) .function("getTokenValue", &mx::InterfaceElement::getTokenValue) - .function("setTarget", &mx::InterfaceElement::setTarget) .function("hasTarget", &mx::InterfaceElement::hasTarget) .function("getTarget", &mx::InterfaceElement::getTarget) - .function("setVersionString", &mx::InterfaceElement::setVersionString) .function("hasVersionString", &mx::InterfaceElement::hasVersionString) .function("getVersionString", &mx::InterfaceElement::getVersionString) .function("setVersionIntegers", &mx::InterfaceElement::getVersionIntegers) .function("getVersionIntegers", ems::optional_override([](mx::InterfaceElement &self) { - // std::pair throws a unbound type error when invoking the function in javascript - // As a result, the std:pair will be converted into an array. - std::pair versionInts = self.getVersionIntegers(); - return arrayToVec((int *)&versionInts, 2); - })) + auto version = mx::getVersionIntegers(); + return ems::val::array((int *)&version, (int *)&version + 2); + })) .function("setDefaultVersion", &mx::InterfaceElement::setDefaultVersion) .function("getDefaultVersion", &mx::InterfaceElement::getDefaultVersion) - BIND_MEMBER_FUNC("getDeclaration", mx::InterfaceElement, getDeclaration, 0, 1, stRef) .function("isTypeCompatible", &mx::InterfaceElement::isTypeCompatible) - .class_property("NODE_DEF_ATTRIBUTE", &mx::InterfaceElement::NODE_DEF_ATTRIBUTE) .class_property("TARGET_ATTRIBUTE", &mx::InterfaceElement::TARGET_ATTRIBUTE) .class_property("VERSION_ATTRIBUTE", &mx::InterfaceElement::VERSION_ATTRIBUTE) diff --git a/source/JsMaterialX/JsMaterialXCore/JsLook.cpp b/source/JsMaterialX/JsMaterialXCore/JsLook.cpp index d7ea9cb589..84952d4bbd 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsLook.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsLook.cpp @@ -21,33 +21,27 @@ extern "C" .function("getMaterialAssigns", &mx::Look::getMaterialAssigns) .function("getActiveMaterialAssigns", &mx::Look::getActiveMaterialAssigns) .function("removeMaterialAssign", &mx::Look::removeMaterialAssign) - BIND_MEMBER_FUNC("addPropertyAssign", mx::Look, addPropertyAssign, 0, 1, stRef) .function("getPropertyAssign", &mx::Look::getPropertyAssign) .function("getPropertyAssigns", &mx::Look::getPropertyAssigns) .function("getActivePropertyAssigns", &mx::Look::getActivePropertyAssigns) .function("removePropertyAssign", &mx::Look::removePropertyAssign) - BIND_MEMBER_FUNC("addPropertySetAssign", mx::Look, addPropertySetAssign, 0, 1, stRef) .function("getPropertySetAssign", &mx::Look::getPropertySetAssign) .function("getPropertySetAssigns", &mx::Look::getPropertySetAssigns) .function("getActivePropertySetAssigns", &mx::Look::getActivePropertySetAssigns) .function("removePropertySetAssign", &mx::Look::removePropertySetAssign) - BIND_MEMBER_FUNC("addVariantAssign", mx::Look, addVariantAssign, 0, 1, stRef) .function("getVariantAssign", &mx::Look::getVariantAssign) .function("getVariantAssigns", &mx::Look::getVariantAssigns) .function("getActiveVariantAssigns", &mx::Look::getActiveVariantAssigns) .function("removeVariantAssign", &mx::Look::removeVariantAssign) - BIND_MEMBER_FUNC("addVisibility", mx::Look, addVisibility, 0, 1, stRef) .function("getVisibility", &mx::Look::getVisibility) .function("getVisibilities", &mx::Look::getVisibilities) .function("getActiveVisibilities", &mx::Look::getActiveVisibilities) .function("removeVisibility", &mx::Look::removeVisibility) - .function("append", &mx::Look::append) - .class_property("CATEGORY", &mx::Look::CATEGORY); ems::class_>("LookGroup") @@ -58,7 +52,7 @@ extern "C" .function("setEnabledLooks", &mx::LookGroup::setEnabledLooks) .function("getEnabledLooksString", &mx::LookGroup::getEnabledLooksString) .function("getEnabledLooks", &mx::LookGroup::getEnabledLooks) - BIND_MEMBER_FUNC_RAW_PTR("appendLookGroup", mx::LookGroup, appendLookGroup, 1, 2, mx::LookGroupPtr, stRef) + BIND_MEMBER_FUNC("appendLookGroup", mx::LookGroup, appendLookGroup, 1, 2, mx::LookGroupPtr, stRef) BIND_MEMBER_FUNC("appendLook", mx::LookGroup, appendLook, 1, 2, stRef, stRef) .function("combineLooks", &mx::LookGroup::combineLooks) .class_property("CATEGORY", &mx::LookGroup::CATEGORY) @@ -83,7 +77,6 @@ extern "C" .class_property("MATERIAL_ATTRIBUTE", &mx::MaterialAssign::MATERIAL_ATTRIBUTE) .class_property("EXCLUSIVE_ATTRIBUTE", &mx::MaterialAssign::EXCLUSIVE_ATTRIBUTE); - ems::class_>("Visibility") .smart_ptr_constructor("Visibility", &std::make_shared) .smart_ptr>("Visibility") @@ -103,5 +96,7 @@ extern "C" .class_property("VIEWER_COLLECTION_ATTRIBUTE", &mx::Visibility::VIEWER_COLLECTION_ATTRIBUTE) .class_property("VISIBILITY_TYPE_ATTRIBUTE", &mx::Visibility::VISIBILITY_TYPE_ATTRIBUTE) .class_property("VISIBLE_ATTRIBUTE", &mx::Visibility::VISIBLE_ATTRIBUTE); + + ems::function("getGeometryBindings", &mx::getGeometryBindings); } } \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsLook.js b/source/JsMaterialX/JsMaterialXCore/JsLook.js index 654aa0d5bf..fc9215b0ce 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsLook.js +++ b/source/JsMaterialX/JsMaterialXCore/JsLook.js @@ -11,4 +11,6 @@ addWrapper(function(Module, api) { /** Setup the Visibility class */ api.Visibility = wrapperFactory(Module.Visibility); + + api.getGeometryBindings = Module.getGeometryBindings; }); diff --git a/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp b/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp index f341dd002c..e484581705 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp @@ -21,7 +21,8 @@ extern "C" vec.insert(vec.end(), set.begin(), set.end()); return vec; })); - ems::function("getShaderNodes", ems::optional_override([](mx::NodePtr materialNode, const std::string& nodeType) { + ems::function("getShaderNodes", ems::optional_override([](mx::NodePtr materialNode, + const std::string& nodeType) { std::unordered_set set = mx::getShaderNodes(materialNode, nodeType); // Put all elements into an std::vector std::vector vec; @@ -29,8 +30,8 @@ extern "C" return vec; })); ems::function("getShaderNodes", ems::optional_override([](mx::NodePtr materialNode, - const std::string& nodeType, - const std::string& target) { + const std::string& nodeType, + const std::string& target) { std::unordered_set set = mx::getShaderNodes(materialNode, nodeType, target); // Put all elements into an std::vector std::vector vec; From 994e0ad7c27eef13ce419def46ac5d8fb3cb4574 Mon Sep 17 00:00:00 2001 From: Sebastian Dunkel Date: Tue, 18 May 2021 10:33:16 +0200 Subject: [PATCH 13/33] addressed pr comments --- .../JsMaterialXCore/JsProperty.cpp | 2 +- .../JsMaterialXCore/JsTraversal.cpp | 4 +++ .../JsMaterialX/JsMaterialXCore/JsTypes.cpp | 32 +++++++++---------- source/JsMaterialX/JsMaterialXCore/JsTypes.js | 1 - source/JsMaterialX/JsMaterialXCore/JsUnit.cpp | 22 ++++++------- source/JsMaterialX/JsMaterialXCore/JsUtil.cpp | 3 ++ source/JsMaterialX/JsMaterialXCore/JsUtil.js | 2 ++ source/JsMaterialX/test/basics.spec.js | 4 +-- 8 files changed, 39 insertions(+), 31 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp b/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp index 1812477b97..d3dfdfc939 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp @@ -46,7 +46,6 @@ extern "C" .function("getProperty", &mx::PropertySet::getProperty) .function("getProperties", &mx::PropertySet::getProperties) .function("removeProperty", &mx::PropertySet::removeProperty) - .function("getPropertyValue", &mx::PropertySet::getPropertyValue) BIND_PROPERTYSET_TYPE_INSTANCE(Integer, int) BIND_PROPERTYSET_TYPE_INSTANCE(Boolean, bool) BIND_PROPERTYSET_TYPE_INSTANCE(Float, float) @@ -62,6 +61,7 @@ extern "C" BIND_PROPERTYSET_TYPE_INSTANCE(BooleanArray, mx::BoolVec) BIND_PROPERTYSET_TYPE_INSTANCE(FloatArray, mx::FloatVec) BIND_PROPERTYSET_TYPE_INSTANCE(StringArray, mx::StringVec) + .function("getPropertyValue", &mx::PropertySet::getPropertyValue) .class_property("CATEGORY", &mx::Property::CATEGORY); ems::class_>("PropertySetAssign") diff --git a/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp b/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp index e8692d231d..44d8302f40 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp @@ -27,6 +27,10 @@ extern "C" { ems::class_("Edge") .smart_ptr_constructor("Edge", &std::make_shared) + .function("equals", ems::optional_override([](mx::Edge &self, const mx::Edge &rhs) { return self == rhs; })) + .function("notEquals", ems::optional_override([](mx::Edge &self, const mx::Edge &rhs) { return self != rhs; })) + .function("lessThan", ems::optional_override([](mx::Edge &self, const mx::Edge &rhs) { return self < rhs; })) + .function("notNull", &mx::Edge::operator bool) .function("getDownstreamElement", &mx::Edge::getDownstreamElement) .function("getConnectingElement", &mx::Edge::getConnectingElement) .function("getUpstreamElement", &mx::Edge::getUpstreamElement) diff --git a/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp b/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp index 88e1fa366b..af18222401 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp @@ -10,7 +10,7 @@ namespace mx = MaterialX; #define BIND_VECTOR_SUBCLASS(V) \ .function("equals", ems::optional_override([](V &self, const V &rhs) { return self == rhs; })) \ - .function("not_equals", ems::optional_override([](V &self, const V &rhs) { return self != rhs; })) \ + .function("notEquals", ems::optional_override([](V &self, const V &rhs) { return self != rhs; })) \ .function("add", ems::optional_override([](V &self, const V &rhs) { return self + rhs; })) \ .function("sub", ems::optional_override([](V &self, const V &rhs) { return self - rhs; })) \ .function("multiply", ems::optional_override([](V &self, const V &rhs) { return self * rhs; })) \ @@ -25,11 +25,12 @@ namespace mx = MaterialX; .function("setItem", ems::optional_override([](V &self, size_t i, float f) { self[i] = f; })) \ .function("toString", ems::optional_override([](const V &self) { return toValueString(self); })) \ .function("copy", ems::optional_override([](const V &self) { return V(self); })) \ - .function("length", ems::optional_override([](const V &self) { return self.V::numElements(); })) + .function("length", ems::optional_override([](const V &self) { return self.V::numElements(); })) \ + .function("data", ems::optional_override([](V& self) { return ems::val(ems::typed_memory_view(self.numElements(), self.data())); })) #define BIND_MATRIX_SUBCLASS(M) \ .function("equals", ems::optional_override([](M &self, const M &rhs) { return self == rhs; })) \ - .function("not_equals", ems::optional_override([](M &self, const M &rhs) { return self != rhs; })) \ + .function("notEquals", ems::optional_override([](M &self, const M &rhs) { return self != rhs; })) \ .function("add", ems::optional_override([](M &self, const M &rhs) { return self + rhs; })) \ .function("sub", ems::optional_override([](M &self, const M &rhs) { return self - rhs; })) \ .function("multiply", ems::optional_override([](M &self, const M &rhs) { return self * rhs; })) \ @@ -66,19 +67,19 @@ EMSCRIPTEN_BINDINGS(types) BIND_VECTOR_SUBCLASS(mx::Vector3) .function("cross", &mx::Vector3::cross); - ems::class_>("Quaternion") - .constructor<>() - .constructor() - BIND_VECTOR_SUBCLASS(mx::Vector4) - .function("multiplyQuaternion", ems::optional_override([](const mx::Quaternion &self, const mx::Quaternion &q) { return self * q; })) - .function("getNormalized", ems::optional_override([](mx::Quaternion &self) { return self.getNormalized(); })) - .class_function("createFromAxisAngle", &mx::Quaternion::createFromAxisAngle) - .class_property("IDENTITY", &mx::Quaternion::IDENTITY); + ems::class_>("Vector4") + .constructor<>() + .constructor() + BIND_VECTOR_SUBCLASS(mx::Vector4); - ems::class_>("Vector4") - .constructor<>() - .constructor() - BIND_VECTOR_SUBCLASS(mx::Vector4); + ems::class_>("Quaternion") + .constructor<>() + .constructor() + BIND_VECTOR_SUBCLASS(mx::Vector4) + .function("multiplyQuaternion", ems::optional_override([](const mx::Quaternion &self, const mx::Quaternion &q) { return self * q; })) + .function("getNormalized", ems::optional_override([](mx::Quaternion &self) { return self.getNormalized(); })) + .class_function("createFromAxisAngle", &mx::Quaternion::createFromAxisAngle) + .class_property("IDENTITY", &mx::Quaternion::IDENTITY); ems::class_>("Color3") .constructor<>() @@ -120,7 +121,6 @@ EMSCRIPTEN_BINDINGS(types) .class_property("IDENTITY", &mx::Matrix44::IDENTITY); ems::constant("DEFAULT_TYPE_STRING", mx::DEFAULT_TYPE_STRING); - ems::constant("EMPTY_STRING", mx::EMPTY_STRING); ems::constant("FILENAME_TYPE_STRING", mx::FILENAME_TYPE_STRING); ems::constant("GEOMNAME_TYPE_STRING", mx::GEOMNAME_TYPE_STRING); ems::constant("STRING_TYPE_STRING", mx::STRING_TYPE_STRING); diff --git a/source/JsMaterialX/JsMaterialXCore/JsTypes.js b/source/JsMaterialX/JsMaterialXCore/JsTypes.js index 02ecf9ecef..c9b1979488 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsTypes.js +++ b/source/JsMaterialX/JsMaterialXCore/JsTypes.js @@ -8,7 +8,6 @@ addWrapper(function(Module, api) { api.Matrix33 = wrapperFactory(Module.Matrix33); api.Matrix44 = wrapperFactory(Module.Matrix44); api.DEFAULT_TYPE_STRING = Module.DEFAULT_TYPE_STRING; - api.EMPTY_STRING = Module.EMPTY_STRING; api.FILENAME_TYPE_STRING = Module.FILENAME_TYPE_STRING; api.GEOMNAME_TYPE_STRING = Module.GEOMNAME_TYPE_STRING; api.SURFACE_SHADER_TYPE_STRING = Module.SURFACE_SHADER_TYPE_STRING; diff --git a/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp b/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp index 5cdd91069b..d52440b4ff 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp @@ -17,37 +17,37 @@ extern "C" .smart_ptr>("UnitConverter") .smart_ptr>("UnitConverter") .function("convertFloat", ems::select_overload(&mx::UnitConverter::convert)) + .function("getUnitAsInteger", &mx::UnitConverter::getUnitAsInteger) + .function("getUnitFromInteger", &mx::UnitConverter::getUnitFromInteger) .function("convertVector2", ems::select_overload(&mx::UnitConverter::convert)) .function("convertVector3", ems::select_overload(&mx::UnitConverter::convert)) .function("convertVector4", ems::select_overload(&mx::UnitConverter::convert)) - .function("getUnitAsInteger", &mx::UnitConverter::getUnitAsInteger) - .function("getUnitFromInteger", &mx::UnitConverter::getUnitFromInteger) .function("write", &mx::UnitConverter::write, ems::pure_virtual()); ems::class_>("LinearUnitConverter") .smart_ptr>("LinearUnitConverter") .smart_ptr>("LinearUnitConverter") + .class_function("create", &mx::LinearUnitConverter::create) + .function("getUnitType", &mx::LinearUnitConverter::getUnitType) + .function("write", &mx::LinearUnitConverter::write) + .function("getUnitScale", &mx::LinearUnitConverter::getUnitScale) + .function("conversionRatio", &mx::LinearUnitConverter::conversionRatio) .function("convertFloat", ems::select_overload(&mx::LinearUnitConverter::convert)) .function("convertVector2", ems::select_overload(&mx::LinearUnitConverter::convert)) .function("convertVector3", ems::select_overload(&mx::LinearUnitConverter::convert)) .function("convertVector4", ems::select_overload(&mx::LinearUnitConverter::convert)) .function("getUnitAsInteger", &mx::LinearUnitConverter::getUnitAsInteger) - .function("getUnitFromInteger", &mx::LinearUnitConverter::getUnitFromInteger) - .function("getUnitType", &mx::LinearUnitConverter::getUnitType) - .function("write", &mx::LinearUnitConverter::write) - .function("getUnitScale", &mx::LinearUnitConverter::getUnitScale) - .function("conversionRatio", &mx::LinearUnitConverter::conversionRatio) - .class_function("create", &mx::LinearUnitConverter::create); - + .function("getUnitFromInteger", &mx::LinearUnitConverter::getUnitFromInteger); + ems::class_("UnitConverterRegistry") .smart_ptr>("UnitConverterRegistry") .smart_ptr>("UnitConverterRegistry") + .class_function("create", &mx::UnitConverterRegistry::create) .function("addUnitConverter", &mx::UnitConverterRegistry::addUnitConverter) .function("removeUnitConverter", &mx::UnitConverterRegistry::removeUnitConverter) .function("getUnitConverter", &mx::UnitConverterRegistry::getUnitConverter) .function("clearUnitConverters", &mx::UnitConverterRegistry::clearUnitConverters) .function("getUnitAsInteger", &mx::UnitConverterRegistry::getUnitAsInteger) - .function("write", &mx::UnitConverterRegistry::write) - .class_function("create", &mx::UnitConverterRegistry::create); + .function("write", &mx::UnitConverterRegistry::write); } } \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp index 6c8506c301..caae07f034 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp @@ -10,6 +10,8 @@ extern "C" { EMSCRIPTEN_BINDINGS(util) { + ems::constant("EMPTY_STRING", mx::EMPTY_STRING); + ems::function("getVersionString", &mx::getVersionString); ems::function("getVersionIntegers", ems::optional_override([]() { @@ -25,6 +27,7 @@ extern "C" })); ems::function("isValidName", &mx::isValidName); + ems::function("isValidNamespace", &mx::isValidNamespace); ems::function("incrementName", &mx::incrementName); ems::function("splitNamePath", &mx::splitNamePath); diff --git a/source/JsMaterialX/JsMaterialXCore/JsUtil.js b/source/JsMaterialX/JsMaterialXCore/JsUtil.js index d2fa4f08cc..12fe784d95 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUtil.js +++ b/source/JsMaterialX/JsMaterialXCore/JsUtil.js @@ -1,5 +1,7 @@ // jsUtil addWrapper(function(Module, api) { + api.EMPTY_STRING = Module.EMPTY_STRING; + api.getVersionString = Module.getVersionString; api.createValidName = Module.createValidName; diff --git a/source/JsMaterialX/test/basics.spec.js b/source/JsMaterialX/test/basics.spec.js index c4730eb3c2..223f24aca7 100644 --- a/source/JsMaterialX/test/basics.spec.js +++ b/source/JsMaterialX/test/basics.spec.js @@ -84,7 +84,7 @@ describe('Basics', () => { const v4 = v2.copy(); expect(v4.equals(v2)).to.be.true; v4.setItem(0, v4.getItem(0) + 1); - expect(v4.not_equals(v2)).to.be.true; + expect(v4.notEquals(v2)).to.be.true; }); function multiplyMatrix(matrix, val) { @@ -191,6 +191,6 @@ describe('Basics', () => { const trans2 = trans.copy(); expect(trans2.equals(trans)).to.be.true; trans2.setItem(0, 0, trans2.getItem(0, 0) + 1); - expect(trans2.not_equals(trans)).to.be.true; + expect(trans2.notEquals(trans)).to.be.true; }); }); From 77217c77fd976ec859bd5e5c85be65ba7f64ed05 Mon Sep 17 00:00:00 2001 From: Sebastian Dunkel Date: Tue, 18 May 2021 10:41:51 +0200 Subject: [PATCH 14/33] addressed more review comments --- source/JsMaterialX/JsMaterialXCore/JsValue.cpp | 6 ++---- source/JsMaterialX/test/codeExamples.spec.js | 3 --- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsValue.cpp b/source/JsMaterialX/JsMaterialXCore/JsValue.cpp index a9b726ed5c..260599cd9c 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsValue.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsValue.cpp @@ -35,8 +35,7 @@ extern "C" ems::enum_("FloatFormat") .value("FloatFormatDefault", mx::Value::FloatFormat::FloatFormatDefault) .value("FloatFormatFixed", mx::Value::FloatFormat::FloatFormatFixed) - .value("FloatFormatScientific", mx::Value::FloatFormat::FloatFormatScientific) - ; + .value("FloatFormatScientific", mx::Value::FloatFormat::FloatFormatScientific); ems::class_("Value") .smart_ptr>("Value") @@ -63,8 +62,7 @@ extern "C" BIND_TYPE_SPECIFIC_VALUE_FUNCS(IntegerArray, mx::IntVec) BIND_TYPE_SPECIFIC_VALUE_FUNCS(BooleanArray, mx::BoolVec) BIND_TYPE_SPECIFIC_VALUE_FUNCS(FloatArray, mx::FloatVec) - BIND_TYPE_SPECIFIC_VALUE_FUNCS(StringArray, mx::StringVec) - ; + BIND_TYPE_SPECIFIC_VALUE_FUNCS(StringArray, mx::StringVec); BIND_TYPE_INSTANCE(Integer, int) BIND_TYPE_INSTANCE(Boolean, bool) diff --git a/source/JsMaterialX/test/codeExamples.spec.js b/source/JsMaterialX/test/codeExamples.spec.js index 1193794974..48b180a9c0 100644 --- a/source/JsMaterialX/test/codeExamples.spec.js +++ b/source/JsMaterialX/test/codeExamples.spec.js @@ -88,8 +88,6 @@ describe('Code Examples', () => { // Traverse the document tree in depth-first order. const elements = doc.traverseTree(); - //let elem = elements.next(); - //expect(elem).to.exist; let elementCount = 0; let nodeCount = 0; let fileCount = 0; @@ -106,7 +104,6 @@ describe('Code Examples', () => { expect(filename).to.equal('greysphere_calibration.png'); } } - //elem = elements.next(); } expect(elementCount).to.equal(21); expect(nodeCount).to.equal(5); From 3fa6eb61189da4402d4eaa99254d2bdf22781ae2 Mon Sep 17 00:00:00 2001 From: Sebastian Dunkel Date: Tue, 18 May 2021 11:47:36 +0200 Subject: [PATCH 15/33] temporary workaround for issues with wrapping code --- source/JsMaterialX/JsMaterialXCore/JsTypes.js | 1 + 1 file changed, 1 insertion(+) diff --git a/source/JsMaterialX/JsMaterialXCore/JsTypes.js b/source/JsMaterialX/JsMaterialXCore/JsTypes.js index c9b1979488..0d17218a18 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsTypes.js +++ b/source/JsMaterialX/JsMaterialXCore/JsTypes.js @@ -7,6 +7,7 @@ addWrapper(function(Module, api) { api.Color4 = wrapperFactory(Module.Color4); api.Matrix33 = wrapperFactory(Module.Matrix33); api.Matrix44 = wrapperFactory(Module.Matrix44); + api.EMPTY_STRING = Module.EMPTY_STRING; api.DEFAULT_TYPE_STRING = Module.DEFAULT_TYPE_STRING; api.FILENAME_TYPE_STRING = Module.FILENAME_TYPE_STRING; api.GEOMNAME_TYPE_STRING = Module.GEOMNAME_TYPE_STRING; From c628f382251195a85e6941a1e36f45425ee5f9ff Mon Sep 17 00:00:00 2001 From: Cedrick Muenstermann Date: Tue, 18 May 2021 12:02:25 +0200 Subject: [PATCH 16/33] add bindings for JsElement: equal, notEqual, isA, asA --- .../JsMaterialX/JsMaterialXCore/JsElement.cpp | 54 +++++++++++++------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp index cf133cf6b8..16d5e9943b 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp @@ -17,13 +17,15 @@ namespace mx = MaterialX; #define BIND_VALUE_ELEMENT_FUNC_INSTANCE(NAME, T) \ BIND_MEMBER_FUNC("setValue" #NAME, mx::ValueElement, setValue, 1, 2, const T&, stRef) -#define BIND_ELEMENT_CHILD_FUNC_INSTANCE(NAME, T) \ - BIND_MEMBER_FUNC("addChild" #NAME, mx::Element, addChild, 0, 1, stRef) \ - .function("getChildOfType" #NAME, &mx::Element::getChildOfType) \ - BIND_MEMBER_FUNC("getChildrenOfType" #NAME, mx::Element, getChildrenOfType, 0, 1, stRef) \ - .function("removeChildOfType" #NAME, &mx::Element::removeChildOfType) \ - .function("getAncestorOfType" #NAME, &mx::Element::getAncestorOfType) \ - .function("resolveRootNameReference" #NAME, &mx::Element::resolveRootNameReference) +#define BIND_ELEMENT_CHILD_FUNC_INSTANCE(NAME, T) \ + BIND_MEMBER_FUNC("addChild" #NAME, mx::Element, addChild, 0, 1, stRef) \ + .function("getChildOfType" #NAME, &mx::Element::getChildOfType) \ + BIND_MEMBER_FUNC("getChildrenOfType" #NAME, mx::Element, getChildrenOfType, 0, 1, stRef) \ + .function("removeChildOfType" #NAME, &mx::Element::removeChildOfType) \ + .function("getAncestorOfType" #NAME, &mx::Element::getAncestorOfType) \ + .function("resolveRootNameReference" #NAME, &mx::Element::resolveRootNameReference) \ + BIND_MEMBER_FUNC("isA" #NAME, mx::Element, isA, 0, 1, stRef) \ + .function("asA" #NAME, ems::select_overload()>(&mx::Element::asA)) #define BIND_ELEMENT_FUNC_INSTANCE(NAME, T) \ .function("setTypedAttribute" #NAME, &mx::Element::setTypedAttribute) \ @@ -36,6 +38,8 @@ extern "C" ems::class_("Element") .smart_ptr>("Element") .smart_ptr>("Element") // mx::ConstElementPtr + .function("equals", ems::optional_override([](mx::Element& self, const mx::Element& rhs) { return self == rhs; })) + .function("notEquals", ems::optional_override([](mx::Element& self, const mx::Element& rhs) { return self != rhs; })) .function("setCategory", &mx::Element::setCategory) .function("getCategory", &mx::Element::getCategory) .function("setName", &mx::Element::setName) @@ -74,22 +78,38 @@ extern "C" .function("setChildIndex", &mx::Element::setChildIndex) .function("getChildIndex", &mx::Element::getChildIndex) .function("removeChild", &mx::Element::removeChild) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Backdrop, mx::Backdrop) BIND_ELEMENT_CHILD_FUNC_INSTANCE(Collection, mx::Collection) - BIND_ELEMENT_CHILD_FUNC_INSTANCE(Document, mx::Document) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(CommentElement, mx::CommentElement) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(GenericElement, mx::GenericElement) BIND_ELEMENT_CHILD_FUNC_INSTANCE(GeomInfo, mx::GeomInfo) - BIND_ELEMENT_CHILD_FUNC_INSTANCE(GeomProp, mx::GeomProp) - BIND_ELEMENT_CHILD_FUNC_INSTANCE(Implementation, mx::Implementation) - BIND_ELEMENT_CHILD_FUNC_INSTANCE(Look, mx::Look) BIND_ELEMENT_CHILD_FUNC_INSTANCE(MaterialAssign, mx::MaterialAssign) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(PropertySetAssign, mx::PropertySetAssign) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Visibility, mx::Visibility) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(GeomPropDef, mx::GeomPropDef) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Look, mx::Look) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(LookGroup, mx::LookGroup) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(PropertySet, mx::PropertySet) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(TypeDef, mx::TypeDef) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(AttributeDef, mx::AttributeDef) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Document, mx::Document) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(NodeGraph, mx::NodeGraph) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Implementation, mx::Implementation) BIND_ELEMENT_CHILD_FUNC_INSTANCE(Node, mx::Node) BIND_ELEMENT_CHILD_FUNC_INSTANCE(NodeDef, mx::NodeDef) - BIND_ELEMENT_CHILD_FUNC_INSTANCE(NodeGraph, mx::NodeGraph) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Variant, mx::Variant) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Member, mx::Member) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(TargetDef, mx::TargetDef) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(GeomProp, mx::GeomProp) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Input, mx::Input) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Output, mx::Output) BIND_ELEMENT_CHILD_FUNC_INSTANCE(Property, mx::Property) - BIND_ELEMENT_CHILD_FUNC_INSTANCE(PropertySet, mx::PropertySet) - BIND_ELEMENT_CHILD_FUNC_INSTANCE(PropertySetAssign, mx::PropertySetAssign) - BIND_ELEMENT_CHILD_FUNC_INSTANCE(Token, mx::Token) - BIND_ELEMENT_CHILD_FUNC_INSTANCE(TypeDef, mx::TypeDef) - BIND_ELEMENT_CHILD_FUNC_INSTANCE(Visibility, mx::Visibility) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(PropertyAssign, mx::PropertyAssign) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(Unit, mx::Unit) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(UnitDef, mx::UnitDef) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(UnitTypeDef, mx::UnitTypeDef) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(VariantAssign, mx::VariantAssign) + BIND_ELEMENT_CHILD_FUNC_INSTANCE(VariantSet, mx::VariantSet) .function("setAttribute", &mx::Element::setAttribute) .function("hasAttribute", &mx::Element::hasAttribute) .function("getAttribute", &mx::Element::getAttribute) From e7635cd4b71e893432805892ba769fb721354dad Mon Sep 17 00:00:00 2001 From: Philipp Frericks Date: Tue, 18 May 2021 13:28:49 +0200 Subject: [PATCH 17/33] Automatic conversion of array <-> vector --- source/JsMaterialX/CMakeLists.txt | 1 - .../JsMaterialXCore/JsDefinition.cpp | 3 +- .../JsMaterialXCore/JsDocument.cpp | 3 +- .../JsMaterialX/JsMaterialXCore/JsElement.cpp | 3 +- .../JsMaterialXCore/JsExceptions.cpp | 4 +- source/JsMaterialX/JsMaterialXCore/JsGeom.cpp | 3 +- .../JsMaterialXCore/JsInterface.cpp | 3 +- source/JsMaterialX/JsMaterialXCore/JsLook.cpp | 3 +- .../JsMaterialXCore/JsMaterial.cpp | 3 +- source/JsMaterialX/JsMaterialXCore/JsNode.cpp | 5 +- .../JsMaterialXCore/JsProperty.cpp | 3 +- .../JsMaterialXCore/JsRegisteredVectors.cpp | 53 -------------- .../JsMaterialXCore/JsTraversal.cpp | 3 +- .../JsMaterialX/JsMaterialXCore/JsTypes.cpp | 3 +- source/JsMaterialX/JsMaterialXCore/JsUnit.cpp | 3 +- source/JsMaterialX/JsMaterialXCore/JsUtil.cpp | 3 +- .../JsMaterialX/JsMaterialXCore/JsValue.cpp | 3 +- .../JsMaterialX/JsMaterialXCore/JsVariant.cpp | 3 +- source/JsMaterialX/initMaterialX.js | 23 ------- source/JsMaterialX/vectorHelper.h | 69 +++++++++++++++++++ 20 files changed, 102 insertions(+), 95 deletions(-) delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsRegisteredVectors.cpp create mode 100644 source/JsMaterialX/vectorHelper.h diff --git a/source/JsMaterialX/CMakeLists.txt b/source/JsMaterialX/CMakeLists.txt index 5cf3553120..84eafbcdcd 100644 --- a/source/JsMaterialX/CMakeLists.txt +++ b/source/JsMaterialX/CMakeLists.txt @@ -19,7 +19,6 @@ set(CORE_DEPS ${OUTPUT_CORE}JsTypes.cpp ${OUTPUT_CORE}JsGeom.cpp ${OUTPUT_CORE}JsVariant.cpp ${OUTPUT_CORE}JsValue.cpp - ${OUTPUT_CORE}JsRegisteredVectors.cpp ${OUTPUT_CORE}JsTraversal.cpp) set(FORMAT_DEPS ${OUTPUT_FORMAT}JsXmlIo.cpp) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp index 577b171b0c..fb33cac442 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp @@ -1,8 +1,9 @@ +#include "../vectorHelper.h" #include "../helpers.h" + #include -#include #include namespace ems = emscripten; diff --git a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp index 097098701f..7d92af5bc2 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp @@ -1,7 +1,8 @@ +#include "../vectorHelper.h" #include "../helpers.h" + #include -#include #include namespace ems = emscripten; diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp index 16d5e9943b..5ce874394d 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp @@ -1,4 +1,6 @@ +#include "../vectorHelper.h" #include "../helpers.h" + #include #include #include @@ -6,7 +8,6 @@ #include #include -#include #include using stRef = const std::string&; diff --git a/source/JsMaterialX/JsMaterialXCore/JsExceptions.cpp b/source/JsMaterialX/JsMaterialXCore/JsExceptions.cpp index 3331a9449a..d6f76c11b6 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsExceptions.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsExceptions.cpp @@ -1,7 +1,7 @@ -#include -#include #include +#include + namespace ems = emscripten; namespace exceptions diff --git a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp index bd6c80a2ea..6bea407c94 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp @@ -1,7 +1,8 @@ +#include "../vectorHelper.h" #include "../helpers.h" + #include -#include #include namespace ems = emscripten; diff --git a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp index ba0e58daf2..60e328cadf 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp @@ -1,8 +1,9 @@ +#include "../vectorHelper.h" #include "../helpers.h" + #include #include -#include #include using stRef = const std::string&; diff --git a/source/JsMaterialX/JsMaterialXCore/JsLook.cpp b/source/JsMaterialX/JsMaterialXCore/JsLook.cpp index 84952d4bbd..2debd8e29e 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsLook.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsLook.cpp @@ -1,7 +1,8 @@ +#include "../vectorHelper.h" #include "../helpers.h" + #include -#include #include using stRef = const std::string&; diff --git a/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp b/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp index e484581705..053f6a14b4 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp @@ -1,7 +1,8 @@ +#include "../vectorHelper.h" #include "../helpers.h" + #include -#include #include #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsNode.cpp b/source/JsMaterialX/JsMaterialXCore/JsNode.cpp index 341735b9ec..524d6aeb35 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsNode.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsNode.cpp @@ -1,7 +1,8 @@ +#include "../vectorHelper.h" #include "../helpers.h" + #include -#include #include namespace ems = emscripten; @@ -25,7 +26,7 @@ extern "C" BIND_MEMBER_FUNC("getNodeDef", mx::Node, getNodeDef, 0, 1, stRef) BIND_MEMBER_FUNC("getImplementation", mx::Node, getImplementation, 0, 1, stRef) BIND_MEMBER_FUNC("getUpstreamEdge", mx::Node, getUpstreamEdge, 0, 1, size_t) - .function("getUpstreamEdgeCount", &mx::Node::getUpstreamEdgeCount) + .function("getUpstreamEdgeCount", &mx::Node::getUpstreamEdgeCount) .function("getNodeDefOutput", &mx::Node::getNodeDefOutput) .function("getDownstreamPorts", &mx::Node::getDownstreamPorts) BIND_MEMBER_FUNC("getDeclaration", mx::Node, getDeclaration, 0, 1, stRef) diff --git a/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp b/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp index d3dfdfc939..5156343657 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp @@ -1,7 +1,8 @@ +#include "../vectorHelper.h" #include "../helpers.h" + #include -#include #include namespace ems = emscripten; diff --git a/source/JsMaterialX/JsMaterialXCore/JsRegisteredVectors.cpp b/source/JsMaterialX/JsMaterialXCore/JsRegisteredVectors.cpp deleted file mode 100644 index e3cfbbd173..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsRegisteredVectors.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "../helpers.h" -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -namespace ems = emscripten; -namespace mx = MaterialX; - -extern "C" -{ - EMSCRIPTEN_BINDINGS(registered_vectors) - { - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - ems::register_vector("vector"); - } -} \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp b/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp index 44d8302f40..4b99a1bb77 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp @@ -1,6 +1,7 @@ +#include "../vectorHelper.h" #include "../helpers.h" -#include +#include #include #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp b/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp index af18222401..fa1a983bff 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp @@ -1,8 +1,9 @@ +#include "../vectorHelper.h" #include "../helpers.h" + #include #include -#include #include namespace ems = emscripten; diff --git a/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp b/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp index d52440b4ff..f963c1e12a 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp @@ -1,7 +1,8 @@ +#include "../vectorHelper.h" #include "../helpers.h" + #include -#include #include namespace ems = emscripten; diff --git a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp index caae07f034..e6e9a0b921 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp @@ -1,6 +1,7 @@ +#include "../vectorHelper.h" + #include -#include #include namespace ems = emscripten; diff --git a/source/JsMaterialX/JsMaterialXCore/JsValue.cpp b/source/JsMaterialX/JsMaterialXCore/JsValue.cpp index 260599cd9c..494cbda752 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsValue.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsValue.cpp @@ -1,7 +1,8 @@ +#include "../vectorHelper.h" #include "../helpers.h" + #include -#include #include namespace ems = emscripten; diff --git a/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp b/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp index 01eda45741..58969d42cb 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp @@ -1,7 +1,8 @@ +#include "../vectorHelper.h" #include "../helpers.h" + #include -#include #include namespace ems = emscripten; diff --git a/source/JsMaterialX/initMaterialX.js b/source/JsMaterialX/initMaterialX.js index 01ffc86927..218927e234 100644 --- a/source/JsMaterialX/initMaterialX.js +++ b/source/JsMaterialX/initMaterialX.js @@ -1,22 +1,3 @@ -/** - * Creates a js array from the passed in vector instance - * @param {Vector} vec - Wasm vector - * @param {Boolean} [needDelete=true] - deletes the vector after generating the array. - * @return {Array} - Array representing the wasm vector - */ -function vecToArray(vec, needDelete=true) { - var size = vec.size(); - var result = []; - for (var i = 0; i < size; i++) { - result.push(vec.get(i)); - } - if(needDelete) { - // avoid memory leak - vec.delete(); - } - return result; -} - /** * Generates valid arguments when calling the function * Throws an error if arguments are missing. @@ -70,10 +51,6 @@ function wrapperFunction(func, defaultArgs = []) { return function() { var args = argGen(arguments, defaultArgs); var ret = func.apply(this, args); - // Convert the vector into an array. - if (ret && ret.constructor && ret.constructor.name && ret.constructor.name.indexOf('vector') === 0) { - ret = vecToArray(ret); - } return ret; }; } diff --git a/source/JsMaterialX/vectorHelper.h b/source/JsMaterialX/vectorHelper.h new file mode 100644 index 0000000000..d054ea8960 --- /dev/null +++ b/source/JsMaterialX/vectorHelper.h @@ -0,0 +1,69 @@ +/** + * Include this in every file that defines Emscripten bindings for functions with + * std::vector parameters or return types, to automatically convert them to / from JS arrays. + * It actually doesn't hurt to include this in every binding file ;) + * Note that this only works for types that are known to Emscripten, i.e. primitive (built-in) types + * and types that have bindings defined. + */ + +#ifndef JSMATERIALX_VECTOR_HELPERS_H +#define JSMATERIALX_VECTOR_HELPERS_H + +#ifdef __EMSCRIPTEN__ + +#include + +#include +#include + +namespace emscripten { +namespace internal { + +template +struct TypeID> { + static constexpr TYPEID get() { + return LightTypeID::get(); + } +}; + +template +struct TypeID> { + static constexpr TYPEID get() { + return LightTypeID::get(); + } +}; + +template +struct TypeID&> { + static constexpr TYPEID get() { + return LightTypeID::get(); + } +}; + +template +struct TypeID&> { + static constexpr TYPEID get() { + return LightTypeID::get(); + } +}; + +template +struct BindingType> { + using ValBinding = BindingType; + using WireType = ValBinding::WireType; + + static WireType toWireType(const std::vector &vec) { + return ValBinding::toWireType(val::array(vec)); + } + + static std::vector fromWireType(WireType value) { + return vecFromJSArray(ValBinding::fromWireType(value)); + } +}; + + +} // namespace internal +} // namespace emscripten + +#endif // __EMSCRIPTEN__ +#endif // JSMATERIALX_VECTOR_HELPERS_H \ No newline at end of file From 678bde851f67d456e6aac10be7c4d96c4e16c7b9 Mon Sep 17 00:00:00 2001 From: Sebastian Dunkel Date: Tue, 18 May 2021 15:12:38 +0200 Subject: [PATCH 18/33] removed unnecessary binding --- source/JsMaterialX/JsMaterialXCore/JsElement.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp index 5ce874394d..6f861ad20c 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp @@ -152,7 +152,6 @@ extern "C" BIND_MEMBER_FUNC("createStringResolver", mx::Element, createStringResolver, 0, 1, stRef) .function("addTokens", &mx::Element::addTokens) .function("asString", &mx::Element::asString) - .function("__str__", &mx::Element::asString) .class_property("NAME_ATTRIBUTE", &mx::Element::NAME_ATTRIBUTE) .class_property("FILE_PREFIX_ATTRIBUTE", &mx::Element::FILE_PREFIX_ATTRIBUTE) .class_property("GEOM_PREFIX_ATTRIBUTE", &mx::Element::GEOM_PREFIX_ATTRIBUTE) From 552c8403ced06447bab5abb805286c640b247b27 Mon Sep 17 00:00:00 2001 From: Philipp Frericks Date: Thu, 20 May 2021 18:05:31 +0200 Subject: [PATCH 19/33] Fix vector <-> array conversion for vectors of smart pointers --- .../JsMaterialXCore/JsDefinition.cpp | 1 - source/JsMaterialX/JsMaterialXCore/JsUtil.js | 1 + source/JsMaterialX/test/basics.spec.js | 44 +++++++++++++++++-- source/JsMaterialX/vectorHelper.h | 24 ++++++++++ 4 files changed, 65 insertions(+), 5 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp index fb33cac442..0c2a8fce76 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp @@ -1,4 +1,3 @@ - #include "../vectorHelper.h" #include "../helpers.h" diff --git a/source/JsMaterialX/JsMaterialXCore/JsUtil.js b/source/JsMaterialX/JsMaterialXCore/JsUtil.js index 12fe784d95..7839383250 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUtil.js +++ b/source/JsMaterialX/JsMaterialXCore/JsUtil.js @@ -4,6 +4,7 @@ addWrapper(function(Module, api) { api.getVersionString = Module.getVersionString; api.createValidName = Module.createValidName; + api.createNamePath = Module.createNamePath; api.isValidName = Module.isValidName; api.incrementName = Module.incrementName; diff --git a/source/JsMaterialX/test/basics.spec.js b/source/JsMaterialX/test/basics.spec.js index 223f24aca7..bb43e92ad0 100644 --- a/source/JsMaterialX/test/basics.spec.js +++ b/source/JsMaterialX/test/basics.spec.js @@ -2,10 +2,13 @@ import { expect } from 'chai'; import { initMaterialX } from './testHelpers'; describe('Basics', () => { - let mx, testValues; + let mx; before(async () => { mx = await initMaterialX(); - testValues = { + }); + + it('DataTypes', () => { + const testValues = { integer: '1', boolean: 'true', float: '1.1', @@ -22,9 +25,7 @@ describe('Basics', () => { floatarray: '1.1, 2.1, 3.1', stringarray: "'one', 'two', 'three'", }; - }); - it('DataTypes', () => { for (let type in testValues) { const value = testValues[String(type)]; const newValue = mx.Value.createValueFromStrings(value, type); @@ -193,4 +194,39 @@ describe('Basics', () => { trans2.setItem(0, 0, trans2.getItem(0, 0) + 1); expect(trans2.notEquals(trans)).to.be.true; }); + + it('Array conversion', () => { + // Functions that return vectors in C++ should return an array in JS + const doc = mx.createDocument(); + const nodeGraph = doc.addNodeGraph(); + doc.addNodeGraph(); + const nodeGraphs = doc.getNodeGraphs(); + expect(nodeGraphs).to.be.an.instanceof(Array); + expect(nodeGraphs.length).to.equal(2); + + // Elements fetched through the vector -> array conversion should be editable and changes should be reflected + // in the original objects. + // Note: We cannot simply compare these objects for equality, since they're separately constructed pointers + // to the same object. + const backdrop = nodeGraph.addBackdrop(); + const backDrops = nodeGraphs[0].getBackdrops(); + expect(backDrops.length).to.equal(1); + nodeGraphs[0].addBackdrop(); + expect(nodeGraph.getBackdrops().length).to.equal(2); + + // Functions that expect vectors as parameters in C++ should accept arrays in JS + // Built-in types + const pathSegments = ['path', 'to', 'something']; + const namePath = mx.createNamePath(pathSegments); + expect(namePath).to.equal(pathSegments.join(mx.NAME_PATH_SEPARATOR)); + + // Complex (smart pointer) types + const node1 = nodeGraph.addNode('node1'); + const node2 = nodeGraph.addNode('node2'); + backdrop.setContainsElements([node1, node2]); + const nodes = backdrop.getContainsElements(); + expect(nodes.length).to.equal(2); + expect(nodes[0].getName()).to.equal('node1'); + expect(nodes[1].getName()).to.equal('node2'); + }); }); diff --git a/source/JsMaterialX/vectorHelper.h b/source/JsMaterialX/vectorHelper.h index d054ea8960..3797c85475 100644 --- a/source/JsMaterialX/vectorHelper.h +++ b/source/JsMaterialX/vectorHelper.h @@ -61,6 +61,30 @@ struct BindingType> { } }; +/** + * Vectors of smart pointers need special treatment. The above generic toWireType definition uses val::array(vec), + * which constructs a val::array using val::array.call("push", element). This leads to invalid (deleted) smart + * pointers on the JS side, since the generated code constructs the smart pointer object, pushes it into a JS array, + * and then deletes the smart pointer object (i.e. sets the ref count to 0). Using val::array.set() doesn't suffer from + * this issue. + */ +template +struct BindingType>> { + using ValBinding = BindingType; + using WireType = ValBinding::WireType; + + static WireType toWireType(const std::vector> &vec) { + auto arr = val::array(); + for (int i = 0; i < vec.size(); ++i) { + arr.set(i, vec.at(i)); + } + return ValBinding::toWireType(arr); + } + + static std::vector> fromWireType(WireType value) { + return vecFromJSArray>(ValBinding::fromWireType(value)); + } +}; } // namespace internal } // namespace emscripten From ccdcf3fde06308ab102f5c75da4eb9cc8c2a4d4c Mon Sep 17 00:00:00 2001 From: Philipp Frericks Date: Fri, 21 May 2021 10:58:00 +0200 Subject: [PATCH 20/33] Remove JS wrapper code --- source/JsMaterialX/CMakeLists.txt | 3 - .../JsMaterialXCore/JsDefinition.js | 23 ------- .../JsMaterialX/JsMaterialXCore/JsDocument.js | 8 --- .../JsMaterialX/JsMaterialXCore/JsElement.js | 20 ------ source/JsMaterialX/JsMaterialXCore/JsGeom.js | 25 -------- .../JsMaterialXCore/JsInterface.js | 15 ----- source/JsMaterialX/JsMaterialXCore/JsLook.js | 16 ----- .../JsMaterialX/JsMaterialXCore/JsMaterial.js | 4 -- source/JsMaterialX/JsMaterialXCore/JsNode.js | 23 ------- .../JsMaterialX/JsMaterialXCore/JsProperty.js | 14 ----- .../JsMaterialXCore/JsTraversal.js | 61 ------------------- source/JsMaterialX/JsMaterialXCore/JsTypes.js | 26 -------- source/JsMaterialX/JsMaterialXCore/JsUnit.js | 9 --- source/JsMaterialX/JsMaterialXCore/JsUtil.js | 13 ---- source/JsMaterialX/JsMaterialXCore/JsValue.js | 35 ----------- .../JsMaterialX/JsMaterialXCore/JsVariant.js | 13 ---- source/JsMaterialX/initMaterialX.js | 8 +-- source/JsMaterialX/test/testHelpers.js | 2 +- 18 files changed, 2 insertions(+), 316 deletions(-) delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsDefinition.js delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsDocument.js delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsElement.js delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsGeom.js delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsInterface.js delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsLook.js delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsMaterial.js delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsNode.js delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsProperty.js delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsTraversal.js delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsTypes.js delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsUnit.js delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsUtil.js delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsValue.js delete mode 100644 source/JsMaterialX/JsMaterialXCore/JsVariant.js diff --git a/source/JsMaterialX/CMakeLists.txt b/source/JsMaterialX/CMakeLists.txt index 84eafbcdcd..310968d6a4 100644 --- a/source/JsMaterialX/CMakeLists.txt +++ b/source/JsMaterialX/CMakeLists.txt @@ -29,9 +29,6 @@ set(JS_LINK_FLAGS "-I${SOURCE_FOLDER} ") # Add all of the required flags for emcc string(APPEND JS_LINK_FLAGS "-s WASM=1 -s DISABLE_EXCEPTION_CATCHING=0 -s MODULARIZE=1 -s EXPORT_ES6=1 -s USE_ES6_IMPORT_META=0 -s MEMORY_GROWTH_LINEAR_STEP=32MB -s ALLOW_MEMORY_GROWTH=1 ") -# Add the post javascript core files -string(APPEND JS_LINK_FLAGS "--post-js ${OUTPUT_CORE}JsTypes.js --post-js ${OUTPUT_CORE}JsUnit.js --post-js ${OUTPUT_CORE}JsGeom.js --post-js ${OUTPUT_CORE}JsDefinition.js --post-js ${OUTPUT_CORE}JsDocument.js --post-js ${OUTPUT_CORE}JsElement.js --post-js ${OUTPUT_CORE}JsInterface.js --post-js ${OUTPUT_CORE}JsLook.js --post-js ${OUTPUT_CORE}JsNode.js --post-js ${OUTPUT_CORE}JsProperty.js --post-js ${OUTPUT_CORE}JsTraversal.js --post-js ${OUTPUT_CORE}JsUtil.js --post-js ${OUTPUT_CORE}JsValue.js --post-js ${OUTPUT_CORE}JsVariant.js ") - # Add the post javascript format files string(APPEND JS_LINK_FLAGS "--post-js ${OUTPUT_FORMAT}JsXmlIo.js --post-js ${CMAKE_CURRENT_SOURCE_DIR}/initMaterialX.js ") diff --git a/source/JsMaterialX/JsMaterialXCore/JsDefinition.js b/source/JsMaterialX/JsMaterialXCore/JsDefinition.js deleted file mode 100644 index f2ca1a9243..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsDefinition.js +++ /dev/null @@ -1,23 +0,0 @@ -// JsDefinition -addWrapper(function(Module, api) { - /** Setup the NodeDef class */ - api.NodeDef = wrapperFactory(Module.NodeDef); - - /** Setup the Implementation class */ - api.Implementation = wrapperFactory(Module.Implementation); - - /** Setup the TypeDef class */ - api.TypeDef = wrapperFactory(Module.TypeDef); - - /** Setup the Member class */ - api.Member = wrapperFactory(Module.Member); - - /** Setup the Unit class */ - api.Unit = wrapperFactory(Module.Unit); - - /** Setup the UnitDef class */ - api.UnitDef = wrapperFactory(Module.UnitDef); - - /** Setup the UnitTypeDef class */ - api.UnitTypeDef = wrapperFactory(Module.UnitTypeDef); -}); diff --git a/source/JsMaterialX/JsMaterialXCore/JsDocument.js b/source/JsMaterialX/JsMaterialXCore/JsDocument.js deleted file mode 100644 index ae53bb99ee..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsDocument.js +++ /dev/null @@ -1,8 +0,0 @@ -// jsDocument -addWrapper(function(Module, api) { - /** Setup the Document class */ - api.createDocument = wrapperFunction(Module.createDocument); - - api.Document = wrapperFactory(Module.Document); - -}); diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.js b/source/JsMaterialX/JsMaterialXCore/JsElement.js deleted file mode 100644 index 6c02a1954f..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.js +++ /dev/null @@ -1,20 +0,0 @@ -// jsElement -addWrapper(function (Module, api) { - - /** Setup the Element class */ - api.Element = wrapperFactory(Module.Element); - - /** Setup the TypedElement class */ - api.TypedElement = wrapperFactory(Module.TypedElement); - - /** Setup the ValueElement class */ - api.ValueElement = wrapperFactory(Module.ValueElement); - - /** Setup the Token class */ - api.Token = wrapperFactory(Module.Token); - - /** Setup the StringResolver class */ - api.StringResolver = wrapperFactory(Module.StringResolver); - - api.prettyPrint = Module.prettyPrint; -}); diff --git a/source/JsMaterialX/JsMaterialXCore/JsGeom.js b/source/JsMaterialX/JsMaterialXCore/JsGeom.js deleted file mode 100644 index c1d6ef3a31..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsGeom.js +++ /dev/null @@ -1,25 +0,0 @@ -// jsGeom -addWrapper(function(Module, api) { - /** Setup the GeomElement class */ - api.GeomElement = wrapperFactory(Module.GeomElement); - - /** Setup the GeomInfo class */ - api.GeomInfo = wrapperFactory(Module.GeomInfo); - - /** Setup the GeomProp class */ - api.GeomProp = wrapperFactory(Module.GeomProp); - - /** Setup the GeomPropDef class */ - api.GeomPropDef = wrapperFactory(Module.GeomPropDef); - - /** Setup the Collection class */ - api.Collection = wrapperFactory(Module.Collection); - - api.geomStringsMatch = wrapperFunction(Module.geomStringsMatch); - - api.GEOM_PATH_SEPARATOR = Module.GEOM_PATH_SEPARATOR; - api.UNIVERSAL_GEOM_NAME = Module.UNIVERSAL_GEOM_NAME; - api.UDIM_TOKEN = Module.UDIM_TOKEN; - api.UDIMSET = Module.UDIMSET; - api.UV_TILE_TOKEN = Module.UV_TILE_TOKEN; -}); diff --git a/source/JsMaterialX/JsMaterialXCore/JsInterface.js b/source/JsMaterialX/JsMaterialXCore/JsInterface.js deleted file mode 100644 index 486924662c..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsInterface.js +++ /dev/null @@ -1,15 +0,0 @@ -// jsInterface -addWrapper(function(Module, api) { - - /** Setup the PortElement class */ - api.PortElement = wrapperFactory(Module.PortElement); - - /** Setup the Input class */ - api.Input = wrapperFactory(Module.Input); - - /** Setup the Output class */ - api.Output = wrapperFactory(Module.Output); - - /** Setup the InterfaceElement class */ - api.InterfaceElement = wrapperFactory(Module.InterfaceElement); -}); diff --git a/source/JsMaterialX/JsMaterialXCore/JsLook.js b/source/JsMaterialX/JsMaterialXCore/JsLook.js deleted file mode 100644 index fc9215b0ce..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsLook.js +++ /dev/null @@ -1,16 +0,0 @@ -// jsLook -addWrapper(function(Module, api) { - /** Setup the Look class */ - api.Look = wrapperFactory(Module.Look); - - /** Setup the LookGroup class */ - api.LookGroup = wrapperFactory(Module.LookGroup); - - /** Setup the MaterialAssign class */ - api.MaterialAssign = wrapperFactory(Module.MaterialAssign); - - /** Setup the Visibility class */ - api.Visibility = wrapperFactory(Module.Visibility); - - api.getGeometryBindings = Module.getGeometryBindings; -}); diff --git a/source/JsMaterialX/JsMaterialXCore/JsMaterial.js b/source/JsMaterialX/JsMaterialXCore/JsMaterial.js deleted file mode 100644 index fa39f62796..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsMaterial.js +++ /dev/null @@ -1,4 +0,0 @@ -addWrapper(function(Module, api) { - api.getShaderNodes = Module.getShaderNodes; - api.getConnectedOutputs = Module.getConnectedOutputs; -}); \ No newline at end of file diff --git a/source/JsMaterialX/JsMaterialXCore/JsNode.js b/source/JsMaterialX/JsMaterialXCore/JsNode.js deleted file mode 100644 index e1a077fd30..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsNode.js +++ /dev/null @@ -1,23 +0,0 @@ -// jsNode -addWrapper(function(Module, api) { - /** Setup the Node class */ - api.Node = wrapperFactory(Module.Node, { - getNodeDef: [api.EMPTY_STRING], - getImplementation: [api.EMPTY_STRING] - }); - - /** Setup the GraphElement class */ - api.GraphElement = wrapperFactory(Module.GraphElement, { - addNode: [REQUIRED, api.EMPTY_STRING, api.DEFAULT_TYPE_STRING], - addNodeInstance: [REQUIRED, api.EMPTY_STRING], - getNodes: [api.EMPTY_STRING], - addBackdrop: [api.EMPTY_STRING], - flattenSubgraphs: [api.EMPTY_STRING, null] - }); - - /** Setup the NodeGraph class */ - api.NodeGraph = wrapperFactory(Module.NodeGraph); - - /** Setup the Backdrop class */ - api.Backdrop = wrapperFactory(Module.Backdrop); -}); diff --git a/source/JsMaterialX/JsMaterialXCore/JsProperty.js b/source/JsMaterialX/JsMaterialXCore/JsProperty.js deleted file mode 100644 index ce7931e60b..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsProperty.js +++ /dev/null @@ -1,14 +0,0 @@ -// jsProperty -addWrapper(function(Module, api) { - /** Setup the Property class */ - api.Property = wrapperFactory(Module.Property); - - /** Setup the PropertyAssign class */ - api.PropertyAssign = wrapperFactory(Module.PropertyAssign); - - /** Setup the PropertySet class */ - api.PropertySet = wrapperFactory(Module.PropertySet); - - /** Setup the PropertySetAssign class */ - api.PropertySetAssign = wrapperFactory(Module.PropertySetAssign); -}); diff --git a/source/JsMaterialX/JsMaterialXCore/JsTraversal.js b/source/JsMaterialX/JsMaterialXCore/JsTraversal.js deleted file mode 100644 index 4ae6a53bd2..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsTraversal.js +++ /dev/null @@ -1,61 +0,0 @@ -// jsTraversal -addWrapper(function(Module, api) { - /** Setup the Edge class */ - api.Edge = wrapperFactory(Module.Edge); - - /** Setup the TreeIterator class */ - api.TreeIterator = wrapperFactory(Module.TreeIterator); - - var _next1 = Module.TreeIterator.prototype.next; - api.TreeIterator.prototype.next = function() { - try { - return _next1.apply(this, arguments); - } catch (err) { - let message = err.message ? err.message : ''; - if (typeof err === 'number') { - message = Module.getExceptionMessage(err); - } - if (message && message.indexOf('Could not get the next element.') !== -1) { - return null; - } - throw err; - } - }; - - /** Setup the GraphIterator class */ - api.GraphIterator = wrapperFactory(Module.GraphIterator); - var _next2 = Module.GraphIterator.prototype.next; - api.GraphIterator.prototype.next = function() { - try { - return _next2.apply(this, arguments); - } catch (err) { - let message = err.message ? err.message : ''; - if (typeof err === 'number') { - message = Module.getExceptionMessage(err); - } - if (message && message.indexOf('Could not get the next element.') !== -1) { - return null; - } - throw err; - } - }; - - /** Setup the InheritanceIterator class */ - api.InheritanceIterator = wrapperFactory(Module.InheritanceIterator); - - var _next3 = Module.InheritanceIterator.prototype.next; - api.InheritanceIterator.prototype.next = function() { - try { - return _next3.apply(this, arguments); - } catch (err) { - let message = err.message ? err.message : ''; - if (typeof err === 'number') { - message = Module.getExceptionMessage(err); - } - if (message && message.indexOf('Could not get the next element.') !== -1) { - return null; - } - throw err; - } - }; -}); diff --git a/source/JsMaterialX/JsMaterialXCore/JsTypes.js b/source/JsMaterialX/JsMaterialXCore/JsTypes.js deleted file mode 100644 index 0d17218a18..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsTypes.js +++ /dev/null @@ -1,26 +0,0 @@ -// jsTypes -addWrapper(function(Module, api) { - api.Vector2 = wrapperFactory(Module.Vector2); - api.Vector3 = wrapperFactory(Module.Vector3); - api.Vector4 = wrapperFactory(Module.Vector4); - api.Color3 = wrapperFactory(Module.Color3); - api.Color4 = wrapperFactory(Module.Color4); - api.Matrix33 = wrapperFactory(Module.Matrix33); - api.Matrix44 = wrapperFactory(Module.Matrix44); - api.EMPTY_STRING = Module.EMPTY_STRING; - api.DEFAULT_TYPE_STRING = Module.DEFAULT_TYPE_STRING; - api.FILENAME_TYPE_STRING = Module.FILENAME_TYPE_STRING; - api.GEOMNAME_TYPE_STRING = Module.GEOMNAME_TYPE_STRING; - api.SURFACE_SHADER_TYPE_STRING = Module.SURFACE_SHADER_TYPE_STRING; - api.DISPLACEMENT_SHADER_TYPE_STRING = Module.DISPLACEMENT_SHADER_TYPE_STRING; - api.VOLUME_SHADER_TYPE_STRING = Module.VOLUME_SHADER_TYPE_STRING; - api.LIGHT_SHADER_TYPE_STRING = Module.LIGHT_SHADER_TYPE_STRING; - api.MULTI_OUTPUT_TYPE_STRING = Module.MULTI_OUTPUT_TYPE_STRING; - api.NONE_TYPE_STRING = Module.NONE_TYPE_STRING; - api.VALUE_STRING_TRUE = Module.VALUE_STRING_TRUE; - api.VALUE_STRING_FALSE = Module.VALUE_STRING_FALSE; - api.NAME_PREFIX_SEPARATOR = Module.NAME_PREFIX_SEPARATOR; - api.NAME_PATH_SEPARATOR = Module.NAME_PATH_SEPARATOR; - api.ARRAY_VALID_SEPARATORS = Module.ARRAY_VALID_SEPARATORS; - api.ARRAY_PREFERRED_SEPARATOR = Module.ARRAY_PREFERRED_SEPARATOR; -}); diff --git a/source/JsMaterialX/JsMaterialXCore/JsUnit.js b/source/JsMaterialX/JsMaterialXCore/JsUnit.js deleted file mode 100644 index 76b5c95ae3..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsUnit.js +++ /dev/null @@ -1,9 +0,0 @@ -// jsUnit -addWrapper(function (Module, api) { - /** Setup the UnitConverter class */ - api.ValueElement = wrapperFactory(Module.UnitConverter); - /** Setup the UnitConverter class */ - api.ValueElement = wrapperFactory(Module.LinearUnitConverter); - /** Setup the UnitConverterRegistry class */ - api.ValueElement = wrapperFactory(Module.UnitConverterRegistry); -}); diff --git a/source/JsMaterialX/JsMaterialXCore/JsUtil.js b/source/JsMaterialX/JsMaterialXCore/JsUtil.js deleted file mode 100644 index 7839383250..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsUtil.js +++ /dev/null @@ -1,13 +0,0 @@ -// jsUtil -addWrapper(function(Module, api) { - api.EMPTY_STRING = Module.EMPTY_STRING; - - api.getVersionString = Module.getVersionString; - api.createValidName = Module.createValidName; - api.createNamePath = Module.createNamePath; - - api.isValidName = Module.isValidName; - api.incrementName = Module.incrementName; - - api.getVersionIntegers = Module.getVersionIntegers; -}); diff --git a/source/JsMaterialX/JsMaterialXCore/JsValue.js b/source/JsMaterialX/JsMaterialXCore/JsValue.js deleted file mode 100644 index c9e0af95db..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsValue.js +++ /dev/null @@ -1,35 +0,0 @@ -// jsValue -addWrapper(function(Module, api) { - var typedValues = [ - 'TypedValueInteger', - 'TypedValueBoolean', - 'TypedValueFloat', - 'TypedValueColor3', - 'TypedValueColor4', - 'TypedValueVector2', - 'TypedValueVector3', - 'TypedValueVector4', - 'TypedValueMatrix33', - 'TypedValueMatrix44', - 'TypedValueString', - 'TypedValueIntegerArray', - 'TypedValueBooleanArray', - 'TypedValueFloatArray', - 'TypedValueStringArray' - ]; - - function iterateTypedValues(cb) { - for (var i = 0; i < typedValues.length; i++) { - var typedValue = typedValues[parseInt(i, 10)]; - cb && cb(typedValue); - } - } - - /** Setup the Value class */ - api.Value = wrapperFactory(Module.Value); - - /** Setup the typedValue classes */ - iterateTypedValues(function(typedValue) { - api[String(typedValue)] = wrapperFactory(Module[typedValue]); - }); -}); diff --git a/source/JsMaterialX/JsMaterialXCore/JsVariant.js b/source/JsMaterialX/JsMaterialXCore/JsVariant.js deleted file mode 100644 index 6a5a73f8d9..0000000000 --- a/source/JsMaterialX/JsMaterialXCore/JsVariant.js +++ /dev/null @@ -1,13 +0,0 @@ -// jsVariant -addWrapper(function(Module, api) { - /** Setup the Variant class */ - api.Variant = wrapperFactory(Module.Variant); - - /** Setup the VariantSet class */ - api.VariantSet = wrapperFactory(Module.VariantSet, { - 'addVariant': [''] - }); - - /** Setup the VariantAssign class */ - api.VariantAssign = wrapperFactory(Module.VariantAssign); -}); diff --git a/source/JsMaterialX/initMaterialX.js b/source/JsMaterialX/initMaterialX.js index 218927e234..0a32883c54 100644 --- a/source/JsMaterialX/initMaterialX.js +++ b/source/JsMaterialX/initMaterialX.js @@ -86,19 +86,13 @@ function addWrapper(wrapperCb) { } Module.onRuntimeInitialized = function() { - var MaterialX = {}; // Generate wrappers - for (var i = 0; i < _wrappers.length; i++) { try { var wrapper = _wrappers[parseInt(i)]; - wrapper(Module, MaterialX); + wrapper(Module, Module); } catch(e) { console.log(e); } } - MaterialX['getExceptionMessage'] = Module.getExceptionMessage; - Module['getMaterialX'] = function() { - return MaterialX; - }; }; diff --git a/source/JsMaterialX/test/testHelpers.js b/source/JsMaterialX/test/testHelpers.js index 43994ba97c..c42dd2b031 100644 --- a/source/JsMaterialX/test/testHelpers.js +++ b/source/JsMaterialX/test/testHelpers.js @@ -11,7 +11,7 @@ export function initMaterialX() { // Note: Module is not a promise. // The then function is defined by emscripten. Module().then((module) => { - resolve(module.getMaterialX()); + resolve(module); }); }); } From e8bd224727091c45e11c716dc86b7d546bd0420a Mon Sep 17 00:00:00 2001 From: Sebastian Dunkel Date: Fri, 21 May 2021 13:47:18 +0200 Subject: [PATCH 21/33] addressed pr comments --- source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp | 3 --- source/JsMaterialX/JsMaterialXCore/JsUtil.cpp | 4 +++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp b/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp index 4b99a1bb77..0da81359c4 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp @@ -61,9 +61,6 @@ extern "C" .smart_ptr_constructor("InheritanceIterator", &std::make_shared) BIND_ITERABLE_PROTOCOL(InheritanceIterator) - - // TODO Wrap ExceptionFoundCycle? - ems::constant("NULL_EDGE", mx::NULL_EDGE); ems::constant("NULL_TREE_ITERATOR", mx::NULL_TREE_ITERATOR); ems::constant("NULL_GRAPH_ITERATOR", mx::NULL_GRAPH_ITERATOR); diff --git a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp index e6e9a0b921..f19fbea18a 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp @@ -16,10 +16,12 @@ extern "C" ems::function("getVersionString", &mx::getVersionString); ems::function("getVersionIntegers", ems::optional_override([]() { - auto version = mx::getVersionIntegers(); + std::tuple version = mx::getVersionIntegers(); return ems::val::array((int *)&version, (int *)&version + 3); })); + // Emscripten expects to provide a number from JS for a cpp 'char' parameter. + // Using a string seems to be the better interface for JS ems::function("createValidName", ems::optional_override([](std::string name) { return mx::createValidName(name); })); From cdf839cba1c270b26344938bd3bfcf3d05924e7e Mon Sep 17 00:00:00 2001 From: Philipp Frericks Date: Fri, 21 May 2021 14:04:00 +0200 Subject: [PATCH 22/33] Update array <-> vector test --- source/JsMaterialX/test/basics.spec.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/source/JsMaterialX/test/basics.spec.js b/source/JsMaterialX/test/basics.spec.js index bb43e92ad0..f6b1461728 100644 --- a/source/JsMaterialX/test/basics.spec.js +++ b/source/JsMaterialX/test/basics.spec.js @@ -221,12 +221,14 @@ describe('Basics', () => { expect(namePath).to.equal(pathSegments.join(mx.NAME_PATH_SEPARATOR)); // Complex (smart pointer) types - const node1 = nodeGraph.addNode('node1'); - const node2 = nodeGraph.addNode('node2'); - backdrop.setContainsElements([node1, node2]); + const node1 = nodeGraph.addNode('node'); + const node2 = nodeGraph.addNode('node'); + const node3 = nodeGraph.addNode('node', 'anotherNode'); + backdrop.setContainsElements([node1, node2, node3]); const nodes = backdrop.getContainsElements(); - expect(nodes.length).to.equal(2); - expect(nodes[0].getName()).to.equal('node1'); - expect(nodes[1].getName()).to.equal('node2'); + expect(nodes.length).to.equal(3); + expect(nodes[0].getName()).to.equal('node1'); // Name auto-constructed from category + expect(nodes[1].getName()).to.equal('node2'); // Name auto-constructed from category + expect(nodes[2].getName()).to.equal('anotherNode'); // Name set explicitly at creation time }); }); From 611300a99584b516a62296505b6a8dfbc743f94c Mon Sep 17 00:00:00 2001 From: Sebastian Dunkel Date: Fri, 21 May 2021 16:15:41 +0200 Subject: [PATCH 23/33] moved stRef to helper.h --- source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp | 2 -- source/JsMaterialX/JsMaterialXCore/JsDocument.cpp | 4 ---- source/JsMaterialX/JsMaterialXCore/JsElement.cpp | 2 -- source/JsMaterialX/JsMaterialXCore/JsGeom.cpp | 2 -- source/JsMaterialX/JsMaterialXCore/JsInterface.cpp | 2 -- source/JsMaterialX/JsMaterialXCore/JsLook.cpp | 2 -- source/JsMaterialX/JsMaterialXCore/JsNode.cpp | 2 -- source/JsMaterialX/JsMaterialXCore/JsVariant.cpp | 2 -- source/JsMaterialX/helpers.h | 2 ++ 9 files changed, 2 insertions(+), 18 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp index 0c2a8fce76..17ef5beb91 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp @@ -8,8 +8,6 @@ namespace ems = emscripten; namespace mx = MaterialX; -using stRef = const std::string&; - #define BIND_ATTRIBUTE_DEF_FUNC_INSTANCE(NAME, T) \ BIND_MEMBER_FUNC("setValue" #NAME, mx::AttributeDef, setValue, 1, 2, const T&, stRef) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp index 7d92af5bc2..883e4d7585 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp @@ -3,13 +3,9 @@ #include -#include - namespace ems = emscripten; namespace mx = MaterialX; -using stRef = const std::string&; - extern "C" { EMSCRIPTEN_BINDINGS(document) diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp index 6f861ad20c..8b69e1bd52 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp @@ -10,8 +10,6 @@ #include -using stRef = const std::string&; - namespace ems = emscripten; namespace mx = MaterialX; diff --git a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp index 6bea407c94..0d5390e0f9 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp @@ -8,8 +8,6 @@ namespace ems = emscripten; namespace mx = MaterialX; -using stRef = const std::string&; - #define BIND_GEOMINFO_FUNC_INSTANCE(NAME, T) \ BIND_MEMBER_FUNC("setGeomPropValue" #NAME, mx::GeomInfo, setGeomPropValue, 2, 3, stRef, const T&, stRef) diff --git a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp index 60e328cadf..c47f67eab9 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp @@ -6,8 +6,6 @@ #include -using stRef = const std::string&; - namespace ems = emscripten; namespace mx = MaterialX; diff --git a/source/JsMaterialX/JsMaterialXCore/JsLook.cpp b/source/JsMaterialX/JsMaterialXCore/JsLook.cpp index 2debd8e29e..598002dde5 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsLook.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsLook.cpp @@ -5,8 +5,6 @@ #include -using stRef = const std::string&; - namespace ems = emscripten; namespace mx = MaterialX; diff --git a/source/JsMaterialX/JsMaterialXCore/JsNode.cpp b/source/JsMaterialX/JsMaterialXCore/JsNode.cpp index 524d6aeb35..46be396c2b 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsNode.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsNode.cpp @@ -8,8 +8,6 @@ namespace ems = emscripten; namespace mx = MaterialX; -using stRef = const std::string&; - extern "C" { EMSCRIPTEN_BINDINGS(node) diff --git a/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp b/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp index 58969d42cb..18078392e0 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp @@ -8,8 +8,6 @@ namespace ems = emscripten; namespace mx = MaterialX; -using stRef = const std::string&; - extern "C" { EMSCRIPTEN_BINDINGS(variant) diff --git a/source/JsMaterialX/helpers.h b/source/JsMaterialX/helpers.h index 2c65661637..b068c1a131 100644 --- a/source/JsMaterialX/helpers.h +++ b/source/JsMaterialX/helpers.h @@ -3,6 +3,8 @@ #include +using stRef = const std::string&; + template std::vector arrayToVec(myClass *arr, int size) { From 8d2dee81e91f205527ca8df66e28115f08ff0d1e Mon Sep 17 00:00:00 2001 From: Sebastian Dunkel Date: Fri, 21 May 2021 16:24:51 +0200 Subject: [PATCH 24/33] added bind.h include again --- source/JsMaterialX/JsMaterialXCore/JsDocument.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp index 883e4d7585..e30e574d28 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp @@ -3,6 +3,8 @@ #include +#include + namespace ems = emscripten; namespace mx = MaterialX; From cfecad4560c775d90632409e04d90c921a6a24df Mon Sep 17 00:00:00 2001 From: Cedrick Muenstermann Date: Fri, 21 May 2021 17:25:35 +0200 Subject: [PATCH 25/33] Fix getVersionIntegers --- source/JsMaterialX/JsMaterialXCore/JsDocument.cpp | 5 +---- .../JsMaterialX/JsMaterialXCore/JsInterface.cpp | 5 +---- source/JsMaterialX/JsMaterialXCore/JsUtil.cpp | 15 ++++++++++++--- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp index e30e574d28..2495f00344 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp @@ -93,10 +93,7 @@ extern "C" .function("getUnitTypeDef", &mx::Document::getUnitTypeDef) .function("getUnitTypeDefs", &mx::Document::getUnitTypeDefs) .function("removeUnitTypeDef", &mx::Document::removeUnitTypeDef) - .function("getVersionIntegers", ems::optional_override([](mx::Document &self) { - auto version = mx::getVersionIntegers(); - return ems::val::array((int *)&version, (int *)&version + 2); - })) + .function("getVersionIntegers", &mx::Document::getVersionIntegers) .function("upgradeVersion", &mx::Document::upgradeVersion) .function("setColorManagementSystem", &mx::Document::setColorManagementSystem) .function("hasColorManagementSystem", &mx::Document::hasColorManagementSystem) diff --git a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp index c47f67eab9..9b5dc0e107 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp @@ -124,10 +124,7 @@ extern "C" .function("hasVersionString", &mx::InterfaceElement::hasVersionString) .function("getVersionString", &mx::InterfaceElement::getVersionString) .function("setVersionIntegers", &mx::InterfaceElement::getVersionIntegers) - .function("getVersionIntegers", ems::optional_override([](mx::InterfaceElement &self) { - auto version = mx::getVersionIntegers(); - return ems::val::array((int *)&version, (int *)&version + 2); - })) + .function("getVersionIntegers", &mx::InterfaceElement::getVersionIntegers) .function("setDefaultVersion", &mx::InterfaceElement::setDefaultVersion) .function("getDefaultVersion", &mx::InterfaceElement::getDefaultVersion) BIND_MEMBER_FUNC("getDeclaration", mx::InterfaceElement, getDeclaration, 0, 1, stRef) diff --git a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp index f19fbea18a..5423c028f6 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp @@ -15,10 +15,19 @@ extern "C" ems::function("getVersionString", &mx::getVersionString); + ems::value_array>("IntegerPair") + .element(&std::pair::first) + .element(&std::pair::second); + + ems::value_array>("Integer3Array") + .element(emscripten::index<0>()) + .element(emscripten::index<1>()) + .element(emscripten::index<2>()); + ems::function("getVersionIntegers", ems::optional_override([]() { - std::tuple version = mx::getVersionIntegers(); - return ems::val::array((int *)&version, (int *)&version + 3); - })); + std::tuple version = mx::getVersionIntegers(); + return std::array { std::get<0>(version), std::get<1>(version), std::get<02>(version) }; + })); // Emscripten expects to provide a number from JS for a cpp 'char' parameter. // Using a string seems to be the better interface for JS From 01682d123409403321685c2359a6c4ab9ef6af14 Mon Sep 17 00:00:00 2001 From: Philipp Frericks Date: Fri, 21 May 2021 17:54:34 +0200 Subject: [PATCH 26/33] Fix C++ internal exception handling. --- CMakeLists.txt | 3 + source/JsMaterialX/CMakeLists.txt | 9 +-- source/JsMaterialX/test/basics.spec.js | 10 ++++ source/JsMaterialX/test/traverseGraph.spec.js | 60 +++---------------- 4 files changed, 24 insertions(+), 58 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 75252bead7..99d586717e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -217,6 +217,9 @@ else() if(MATERIALX_WARNINGS_AS_ERRORS) add_compile_options(-Werror) endif() + if(MATERIALX_BUILD_JS) + add_compile_options(-fexceptions) + endif() endif() # Shared functions diff --git a/source/JsMaterialX/CMakeLists.txt b/source/JsMaterialX/CMakeLists.txt index 310968d6a4..aef3c37e90 100644 --- a/source/JsMaterialX/CMakeLists.txt +++ b/source/JsMaterialX/CMakeLists.txt @@ -23,11 +23,8 @@ set(CORE_DEPS ${OUTPUT_CORE}JsTypes.cpp set(FORMAT_DEPS ${OUTPUT_FORMAT}JsXmlIo.cpp) -# Include the source directory -set(JS_LINK_FLAGS "-I${SOURCE_FOLDER} ") - -# Add all of the required flags for emcc -string(APPEND JS_LINK_FLAGS "-s WASM=1 -s DISABLE_EXCEPTION_CATCHING=0 -s MODULARIZE=1 -s EXPORT_ES6=1 -s USE_ES6_IMPORT_META=0 -s MEMORY_GROWTH_LINEAR_STEP=32MB -s ALLOW_MEMORY_GROWTH=1 ") +# Linker flags +set(JS_LINK_FLAGS "-I${SOURCE_FOLDER} -s WASM=1 -s DISABLE_EXCEPTION_CATCHING=0 -s MODULARIZE=1 -s EXPORT_ES6=1 -s USE_ES6_IMPORT_META=0 -s MEMORY_GROWTH_LINEAR_STEP=32MB -s ALLOW_MEMORY_GROWTH=1 ") # Add the post javascript format files string(APPEND JS_LINK_FLAGS "--post-js ${OUTPUT_FORMAT}JsXmlIo.js --post-js ${CMAKE_CURRENT_SOURCE_DIR}/initMaterialX.js ") @@ -36,12 +33,12 @@ if (EXTERNAL_LINK_FLAGS) string(APPEND JS_LINK_FLAGS "${EXTERNAL_LINK_FLAGS} ") endif() +# Compiler flags set(JS_COMPILE_FLAGS "") if (EXTERNAL_COMPILE_FLAGS) string(APPEND JS_COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS} ") endif() - if (CMAKE_BUILD_TYPE MATCHES Debug) message("JS: Building Debug") string(APPEND JS_LINK_FLAGS "--bind ") diff --git a/source/JsMaterialX/test/basics.spec.js b/source/JsMaterialX/test/basics.spec.js index f6b1461728..b9eb1c3128 100644 --- a/source/JsMaterialX/test/basics.spec.js +++ b/source/JsMaterialX/test/basics.spec.js @@ -231,4 +231,14 @@ describe('Basics', () => { expect(nodes[1].getName()).to.equal('node2'); // Name auto-constructed from category expect(nodes[2].getName()).to.equal('anotherNode'); // Name set explicitly at creation time }); + + it('C++ exception handling', () => { + // Exceptions that are thrown and caught in C++ shouldn't bubble up to JS + const doc = mx.createDocument(); + const nodeGraph1 = doc.addNodeGraph(); + const nodeGraph2 = doc.addNodeGraph(); + nodeGraph1.setInheritsFrom(nodeGraph2); + nodeGraph2.setInheritsFrom(nodeGraph1); + expect(nodeGraph1.hasInheritanceCycle()).to.be.true; + }); }); diff --git a/source/JsMaterialX/test/traverseGraph.spec.js b/source/JsMaterialX/test/traverseGraph.spec.js index 387f3ad121..64767b1a6a 100644 --- a/source/JsMaterialX/test/traverseGraph.spec.js +++ b/source/JsMaterialX/test/traverseGraph.spec.js @@ -3,17 +3,6 @@ import { traverse, initMaterialX } from './testHelpers'; it('Traverse Graph', async () => { let mx, doc, image2, constant, multiply, contrast, mix, output; - function isCycle(cb) { - try { - return cb(); - } catch (exceptionPtr) { - const message = mx.getExceptionMessage(exceptionPtr); - if (message.indexOf('Encountered cycle') !== -1) { - return true; - } - return false; - } - } mx = await initMaterialX(); // Create a document. @@ -139,50 +128,17 @@ it('Traverse Graph', async () => { // Create and detect a cycle multiply.setConnectedNode('in2', mix); - - expect( - isCycle(() => { - return output.hasUpstreamCycle(); - }) - ).to.be.true; - expect( - isCycle(() => { - return doc.validate(); - }) - ).to.be.true; + expect(output.hasUpstreamCycle()).to.be.true; + expect(doc.validate()).to.be.false; multiply.setConnectedNode('in2', constant); - expect( - isCycle(() => { - return output.hasUpstreamCycle(); - }) - ).to.be.false; - expect( - isCycle(() => { - return doc.validate(); - }) - ).to.be.true; + expect(output.hasUpstreamCycle()).to.be.false; + expect(doc.validate()).to.be.true; // Create and detect a loop contrast.setConnectedNode('in', contrast); - expect( - isCycle(() => { - return output.hasUpstreamCycle(); - }) - ).to.be.true; - expect( - isCycle(() => { - return doc.validate(); - }) - ).to.be.true; + expect(output.hasUpstreamCycle()).to.be.true; + expect(doc.validate()).to.be.false; contrast.setConnectedNode('in', image2); - expect( - isCycle(() => { - return output.hasUpstreamCycle(); - }) - ).to.be.false; - expect( - isCycle(() => { - return doc.validate(); - }) - ).to.be.true; + expect(output.hasUpstreamCycle()).to.be.false; + expect(doc.validate()).to.be.true; }); From 9aa97f5acb116f2730827af7956a36b4b9259495 Mon Sep 17 00:00:00 2001 From: Sebastian Dunkel Date: Tue, 25 May 2021 16:40:49 +0200 Subject: [PATCH 27/33] Removed second validate overload --- source/JsMaterialX/JsMaterialXCore/JsGeom.cpp | 4 ++-- source/JsMaterialX/helpers.h | 10 +--------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp index 0d5390e0f9..58ce6a3b50 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp @@ -33,7 +33,7 @@ extern "C" .function("getCollectionString", &mx::GeomElement::getCollectionString) .function("setCollection", &mx::GeomElement::setCollection) .function("getCollection", &mx::GeomElement::getCollection) - // BIND_VALIDATE(mx::GeomElement) + BIND_VALIDATE(mx::GeomElement) .class_property("GEOM_ATTRIBUTE", &mx::GeomElement::GEOM_ATTRIBUTE) .class_property("COLLECTION_ATTRIBUTE", &mx::GeomElement::COLLECTION_ATTRIBUTE); @@ -108,7 +108,7 @@ extern "C" .function("getIncludeCollections", &mx::Collection::getIncludeCollections) .function("hasIncludeCycle", &mx::Collection::hasIncludeCycle) .function("matchesGeomString", &mx::Collection::matchesGeomString) - // BIND_VALIDATE(mx::Collection) + BIND_VALIDATE(mx::Collection) .class_property("CATEGORY", &mx::Collection::CATEGORY) .class_property("INCLUDE_GEOM_ATTRIBUTE", &mx::Collection::INCLUDE_GEOM_ATTRIBUTE) .class_property("EXCLUDE_GEOM_ATTRIBUTE", &mx::Collection::EXCLUDE_GEOM_ATTRIBUTE) diff --git a/source/JsMaterialX/helpers.h b/source/JsMaterialX/helpers.h index b068c1a131..898f8e8a48 100644 --- a/source/JsMaterialX/helpers.h +++ b/source/JsMaterialX/helpers.h @@ -350,15 +350,7 @@ BIND_0(__VA_ARGS__) #define BIND_VALIDATE(CLASSNAME) \ .function("validate", ems::optional_override([](CLASSNAME &self) { \ - return self.CLASSNAME::validate(); \ - })) \ - .function("validate", ems::optional_override([](CLASSNAME &self, ems::val message) { \ - std::string nativeMessage; \ - bool handleMessage = message.typeOf().as() == "object"; \ - bool res = self.CLASSNAME::validate(handleMessage ? &nativeMessage : nullptr); \ - if (!res && handleMessage) \ - message.set("message", nativeMessage); \ - return res; \ + return self.validate(); \ })) #endif // JSMATERIALX_HELPERS_H \ No newline at end of file From 9c70c3282647a8e03733ebe8f73fea5735251f31 Mon Sep 17 00:00:00 2001 From: Sebastian Dunkel Date: Tue, 25 May 2021 17:42:23 +0200 Subject: [PATCH 28/33] Removed validate bindings from children --- source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp | 2 -- source/JsMaterialX/JsMaterialXCore/JsDocument.cpp | 1 - source/JsMaterialX/JsMaterialXCore/JsElement.cpp | 13 +++++++++++-- source/JsMaterialX/JsMaterialXCore/JsGeom.cpp | 2 -- source/JsMaterialX/JsMaterialXCore/JsInterface.cpp | 3 --- source/JsMaterialX/JsMaterialXCore/JsNode.cpp | 3 --- source/JsMaterialX/helpers.h | 5 ----- 7 files changed, 11 insertions(+), 18 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp index 17ef5beb91..18bd8c71ba 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp @@ -26,7 +26,6 @@ extern "C" .function("hasNodeGroup", &mx::NodeDef::hasNodeGroup) .function("getNodeGroup", &mx::NodeDef::getNodeGroup) BIND_MEMBER_FUNC("getImplementation", mx::NodeDef, getImplementation, 0, 1, stRef) - BIND_VALIDATE(mx::NodeDef) .function("isVersionCompatible", &mx::NodeDef::isVersionCompatible) BIND_MEMBER_FUNC("getDeclaration", mx::NodeDef, getDeclaration, 0, 1, stRef) .class_property("CATEGORY", &mx::NodeDef::CATEGORY) @@ -51,7 +50,6 @@ extern "C" .function("getFunction", &mx::Implementation::getFunction) .function("setNodeDef", &mx::Implementation::setNodeDef) .function("getNodeDef", &mx::Implementation::getNodeDef) - BIND_VALIDATE(mx::Implementation) BIND_MEMBER_FUNC("getDeclaration", mx::Implementation, getDeclaration, 0, 1, stRef) .class_property("CATEGORY", &mx::Implementation::CATEGORY) .class_property("FILE_ATTRIBUTE", &mx::Implementation::FILE_ATTRIBUTE) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp index 2495f00344..9850e64082 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp @@ -101,7 +101,6 @@ extern "C" .function("setColorManagementConfig", &mx::Document::setColorManagementConfig) .function("hasColorManagementConfig", &mx::Document::hasColorManagementConfig) .function("getColorManagementConfig", &mx::Document::getColorManagementConfig) - BIND_VALIDATE(mx::Document) .function("invalidateCache", &mx::Document::invalidateCache) .class_property("CATEGORY", &mx::Document::CATEGORY) .class_property("CMS_ATTRIBUTE", &mx::Document::CMS_ATTRIBUTE) diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp index 8b69e1bd52..5ac3f9a4f5 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp @@ -143,7 +143,17 @@ extern "C" .function("hasSourceUri", &mx::Element::hasSourceUri) .function("getSourceUri", &mx::Element::getSourceUri) .function("getActiveSourceUri", &mx::Element::getActiveSourceUri) - BIND_VALIDATE(mx::Element) + .function("validate", ems::optional_override([](mx::Element &self) { + return self.validate(); + })) + .function("validate", ems::optional_override([](mx::Element &self, ems::val message) { + std::string nativeMessage; + bool handleMessage = message.typeOf().as() == "object"; + bool res = self.validate(handleMessage ? &nativeMessage : nullptr); + if (!res && handleMessage) + message.set("message", nativeMessage); + return res; + })) .function("copyContentFrom", &mx::Element::copyContentFrom) .function("clearContent", &mx::Element::clearContent) .function("createValidChildName", &mx::Element::createValidChildName) @@ -209,7 +219,6 @@ extern "C" .function("getUnitType", &mx::ValueElement::getUnitType) .function("setIsUniform", &mx::ValueElement::setIsUniform) .function("getIsUniform", &mx::ValueElement::getIsUniform) - BIND_VALIDATE(mx::ValueElement) .class_property("VALUE_ATTRIBUTE", &mx::ValueElement::VALUE_ATTRIBUTE) .class_property("INTERFACE_NAME_ATTRIBUTE", &mx::ValueElement::INTERFACE_NAME_ATTRIBUTE) .class_property("IMPLEMENTATION_NAME_ATTRIBUTE", &mx::ValueElement::IMPLEMENTATION_NAME_ATTRIBUTE) diff --git a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp index 58ce6a3b50..866888f9e6 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp @@ -33,7 +33,6 @@ extern "C" .function("getCollectionString", &mx::GeomElement::getCollectionString) .function("setCollection", &mx::GeomElement::setCollection) .function("getCollection", &mx::GeomElement::getCollection) - BIND_VALIDATE(mx::GeomElement) .class_property("GEOM_ATTRIBUTE", &mx::GeomElement::GEOM_ATTRIBUTE) .class_property("COLLECTION_ATTRIBUTE", &mx::GeomElement::COLLECTION_ATTRIBUTE); @@ -108,7 +107,6 @@ extern "C" .function("getIncludeCollections", &mx::Collection::getIncludeCollections) .function("hasIncludeCycle", &mx::Collection::hasIncludeCycle) .function("matchesGeomString", &mx::Collection::matchesGeomString) - BIND_VALIDATE(mx::Collection) .class_property("CATEGORY", &mx::Collection::CATEGORY) .class_property("INCLUDE_GEOM_ATTRIBUTE", &mx::Collection::INCLUDE_GEOM_ATTRIBUTE) .class_property("EXCLUDE_GEOM_ATTRIBUTE", &mx::Collection::EXCLUDE_GEOM_ATTRIBUTE) diff --git a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp index 9b5dc0e107..bcd66efc46 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp @@ -35,7 +35,6 @@ extern "C" .function("validChannelsString", &mx::PortElement::validChannelsString) .function("setConnectedNode", &mx::PortElement::setConnectedNode) .function("getConnectedNode", &mx::PortElement::getConnectedNode) - BIND_VALIDATE(mx::PortElement) .class_property("NODE_NAME_ATTRIBUTE", &mx::PortElement::NODE_NAME_ATTRIBUTE) .class_property("NODE_GRAPH_ATTRIBUTE", &mx::PortElement::NODE_GRAPH_ATTRIBUTE) .class_property("OUTPUT_ATTRIBUTE", &mx::PortElement::OUTPUT_ATTRIBUTE) @@ -53,7 +52,6 @@ extern "C" .function("getConnectedOutput", &mx::Input::getConnectedOutput) .function("getInterfaceInput", &mx::Input::getInterfaceInput) .function("addTokens", &mx::Input::addTokens) - BIND_VALIDATE(mx::Input) .class_property("CATEGORY", &mx::Input::CATEGORY) .class_property("DEFAULT_GEOM_PROP_ATTRIBUTE", &mx::Input::DEFAULT_GEOM_PROP_ATTRIBUTE); @@ -63,7 +61,6 @@ extern "C" BIND_MEMBER_FUNC("getUpstreamEdge", mx::Output, getUpstreamEdge, 0, 1, std::size_t) .function("getUpstreamEdgeCount", &mx::Output::getUpstreamEdgeCount) .function("hasUpstreamCycle", &mx::Output::hasUpstreamCycle) - BIND_VALIDATE(mx::Output) .class_property("CATEGORY", &mx::Output::CATEGORY) .class_property("DEFAULT_INPUT_ATTRIBUTE", &mx::Output::DEFAULT_INPUT_ATTRIBUTE); diff --git a/source/JsMaterialX/JsMaterialXCore/JsNode.cpp b/source/JsMaterialX/JsMaterialXCore/JsNode.cpp index 46be396c2b..2006ccec64 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsNode.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsNode.cpp @@ -29,7 +29,6 @@ extern "C" .function("getDownstreamPorts", &mx::Node::getDownstreamPorts) BIND_MEMBER_FUNC("getDeclaration", mx::Node, getDeclaration, 0, 1, stRef) .function("addInputFromNodeDef", &mx::Node::addInputFromNodeDef) - BIND_VALIDATE(mx::Node) .class_property("CATEGORY", &mx::Node::CATEGORY); ems::class_>("GraphElement") @@ -61,7 +60,6 @@ extern "C" .function("addInterfaceName", &mx::NodeGraph::addInterfaceName) .function("removeInterfaceName", &mx::NodeGraph::removeInterfaceName) .function("modifyInterfaceName", &mx::NodeGraph::modifyInterfaceName) - BIND_VALIDATE(mx::NodeGraph) .class_property("CATEGORY", &mx::NodeGraph::CATEGORY); ems::class_>("Backdrop") @@ -78,7 +76,6 @@ extern "C" .function("getHeight", &mx::Backdrop::getHeight) .function("setContainsElements", &mx::Backdrop::setContainsElements) .function("getContainsElements", &mx::Backdrop::getContainsElements) - BIND_VALIDATE(mx::Backdrop) .class_property("CATEGORY", &mx::Backdrop::CATEGORY) .class_property("CONTAINS_ATTRIBUTE", &mx::Backdrop::CONTAINS_ATTRIBUTE) .class_property("WIDTH_ATTRIBUTE", &mx::Backdrop::WIDTH_ATTRIBUTE) diff --git a/source/JsMaterialX/helpers.h b/source/JsMaterialX/helpers.h index 898f8e8a48..8a1f846cbd 100644 --- a/source/JsMaterialX/helpers.h +++ b/source/JsMaterialX/helpers.h @@ -348,9 +348,4 @@ API(JSNAME, ems::optional_override([](SELF) { \ #define BIND_0_0(...) \ BIND_0(__VA_ARGS__) -#define BIND_VALIDATE(CLASSNAME) \ - .function("validate", ems::optional_override([](CLASSNAME &self) { \ - return self.validate(); \ - })) - #endif // JSMATERIALX_HELPERS_H \ No newline at end of file From 9d8a770e76faa949f09027c75a9374ec24f3b973 Mon Sep 17 00:00:00 2001 From: Philipp Frericks Date: Wed, 26 May 2021 10:59:48 +0200 Subject: [PATCH 29/33] Remove arrayToVec helper --- source/JsMaterialX/JsMaterialXCore/JsDocument.cpp | 5 ++--- source/JsMaterialX/helpers.h | 7 ------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp index 9850e64082..9c153a10cf 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp @@ -22,9 +22,8 @@ extern "C" .function("copy", &mx::Document::copy) .function("importLibrary", &mx::Document::importLibrary) .function("getReferencedSourceUris", ems::optional_override([](mx::Document &self) { - mx::StringSet referenced = self.mx::Document::getReferencedSourceUris(); - int size = referenced.size(); - return arrayToVec((std::string *)&referenced, size); + mx::StringSet set = self.getReferencedSourceUris(); + return ems::val::array(set.begin(), set.end()); })) BIND_MEMBER_FUNC("addNodeGraph", mx::Document, addNodeGraph, 0, 1, stRef) .function("getNodeGraph", &mx::Document::getNodeGraph) diff --git a/source/JsMaterialX/helpers.h b/source/JsMaterialX/helpers.h index 8a1f846cbd..6e3ce2218a 100644 --- a/source/JsMaterialX/helpers.h +++ b/source/JsMaterialX/helpers.h @@ -5,13 +5,6 @@ using stRef = const std::string&; -template -std::vector arrayToVec(myClass *arr, int size) -{ - std::vector dest(arr, arr + size); - return dest; -} - // Binding helpers #define UNPACK(...) __VA_ARGS__ From e90e180c34eab7d18252a272482fae28f7f014ef Mon Sep 17 00:00:00 2001 From: kohakukun Date: Wed, 26 May 2021 10:59:25 +0200 Subject: [PATCH 30/33] Add inheritanceIterator test --- source/JsMaterialX/test/traverseGraph.spec.js | 294 ++++++++++-------- 1 file changed, 160 insertions(+), 134 deletions(-) diff --git a/source/JsMaterialX/test/traverseGraph.spec.js b/source/JsMaterialX/test/traverseGraph.spec.js index 64767b1a6a..ab0e042c25 100644 --- a/source/JsMaterialX/test/traverseGraph.spec.js +++ b/source/JsMaterialX/test/traverseGraph.spec.js @@ -1,144 +1,170 @@ import { expect } from 'chai'; import { traverse, initMaterialX } from './testHelpers'; -it('Traverse Graph', async () => { - let mx, doc, image2, constant, multiply, contrast, mix, output; - - mx = await initMaterialX(); - // Create a document. - doc = mx.createDocument(); - // Create a node graph with the following structure: - // - // [image1] [constant] [image2] - // \ / | - // [multiply] [contrast] [noise3d] - // \____________ | ____________/ - // [mix] - // | - // [output] - // - const nodeGraph = doc.addNodeGraph(); - const image1 = nodeGraph.addNode('image'); - image2 = nodeGraph.addNode('image'); - constant = nodeGraph.addNode('constant'); - multiply = nodeGraph.addNode('multiply'); - contrast = nodeGraph.addNode('contrast'); - const noise3d = nodeGraph.addNode('noise3d'); - mix = nodeGraph.addNode('mix'); - output = nodeGraph.addOutput(); - multiply.setConnectedNode('in1', image1); - multiply.setConnectedNode('in2', constant); - contrast.setConnectedNode('in', image2); - mix.setConnectedNode('fg', multiply); - mix.setConnectedNode('bg', contrast); - mix.setConnectedNode('mask', noise3d); - output.setConnectedNode(mix); - - expect(doc.validate()).to.be.true; - // TODO: select check message - - // Traverse the document tree (implicit iterator). - const elements = doc.traverseTree(); - let nodeCount = 0; - traverse(elements, (elem) => { - // Display the filename of each image node. - if (elem instanceof mx.Node) { - nodeCount++; - } +describe('Traversal', () => { + let mx; + before(async () => { + mx = await initMaterialX(); }); - expect(nodeCount).to.equal(7); - // Traverse the document tree (explicit iterator) - let treeIter = doc.traverseTree(); - nodeCount = 0; - let maxElementDepth = 0; - traverse(treeIter, (elem) => { - // Display the filename of each image node. - if (elem instanceof mx.Node) { - nodeCount++; - } - maxElementDepth = Math.max(maxElementDepth, treeIter.getElementDepth()); - }); - - expect(nodeCount).to.equal(7); - expect(maxElementDepth).to.equal(3); - - // Traverse the document tree (prune subtree). - nodeCount = 0; - treeIter = doc.traverseTree(); - traverse(treeIter, (elem) => { - // Display the filename of each image node. - if (elem instanceof mx.Node) { - nodeCount++; - } - if (elem instanceof mx.NodeGraph) { - treeIter.setPruneSubtree(true); - } - }); - - expect(nodeCount).to.equal(0); + it('Traverse Graph', async () => { + let doc, image2, constant, multiply, contrast, mix, output; + + // Create a document. + doc = mx.createDocument(); + // Create a node graph with the following structure: + // + // [image1] [constant] [image2] + // \ / | + // [multiply] [contrast] [noise3d] + // \____________ | ____________/ + // [mix] + // | + // [output] + // + const nodeGraph = doc.addNodeGraph(); + const image1 = nodeGraph.addNode('image'); + image2 = nodeGraph.addNode('image'); + constant = nodeGraph.addNode('constant'); + multiply = nodeGraph.addNode('multiply'); + contrast = nodeGraph.addNode('contrast'); + const noise3d = nodeGraph.addNode('noise3d'); + mix = nodeGraph.addNode('mix'); + output = nodeGraph.addOutput(); + multiply.setConnectedNode('in1', image1); + multiply.setConnectedNode('in2', constant); + contrast.setConnectedNode('in', image2); + mix.setConnectedNode('fg', multiply); + mix.setConnectedNode('bg', contrast); + mix.setConnectedNode('mask', noise3d); + output.setConnectedNode(mix); + + expect(doc.validate()).to.be.true; + // TODO: select check message - // Traverse upstream from the graph output (implicit iterator) - nodeCount = 0; - traverse(output.traverseGraph(), (edge) => { - const upstreamElem = edge.getUpstreamElement(); - const connectingElem = edge.getConnectingElement(); - const downstreamElem = edge.getDownstreamElement(); - if (upstreamElem instanceof mx.Node) { - nodeCount++; - if (downstreamElem instanceof mx.Node) { - expect(connectingElem instanceof mx.Input).to.be.true; + // Traverse the document tree (implicit iterator). + const elements = doc.traverseTree(); + let nodeCount = 0; + traverse(elements, (elem) => { + // Display the filename of each image node. + if (elem instanceof mx.Node) { + nodeCount++; } - } - }); - expect(nodeCount).to.equal(7); - - // Traverse upstream from the graph output (explicit iterator) - nodeCount = 0; - maxElementDepth = 0; - let maxNodeDepth = 0; - let graphIter = output.traverseGraph(); - traverse(graphIter, (edge) => { - const upstreamElem = edge.getUpstreamElement(); - if (upstreamElem instanceof mx.Node) { - nodeCount++; - } - maxElementDepth = Math.max(maxElementDepth, graphIter.getElementDepth()); - maxNodeDepth = Math.max(maxNodeDepth, graphIter.getNodeDepth()); + }); + expect(nodeCount).to.equal(7); + + // Traverse the document tree (explicit iterator) + let treeIter = doc.traverseTree(); + nodeCount = 0; + let maxElementDepth = 0; + traverse(treeIter, (elem) => { + // Display the filename of each image node. + if (elem instanceof mx.Node) { + nodeCount++; + } + maxElementDepth = Math.max(maxElementDepth, treeIter.getElementDepth()); + }); + + expect(nodeCount).to.equal(7); + expect(maxElementDepth).to.equal(3); + + // Traverse the document tree (prune subtree). + nodeCount = 0; + treeIter = doc.traverseTree(); + traverse(treeIter, (elem) => { + // Display the filename of each image node. + if (elem instanceof mx.Node) { + nodeCount++; + } + if (elem instanceof mx.NodeGraph) { + treeIter.setPruneSubtree(true); + } + }); + + expect(nodeCount).to.equal(0); + + // Traverse upstream from the graph output (implicit iterator) + nodeCount = 0; + traverse(output.traverseGraph(), (edge) => { + const upstreamElem = edge.getUpstreamElement(); + const connectingElem = edge.getConnectingElement(); + const downstreamElem = edge.getDownstreamElement(); + if (upstreamElem instanceof mx.Node) { + nodeCount++; + if (downstreamElem instanceof mx.Node) { + expect(connectingElem instanceof mx.Input).to.be.true; + } + } + }); + expect(nodeCount).to.equal(7); + + // Traverse upstream from the graph output (explicit iterator) + nodeCount = 0; + maxElementDepth = 0; + let maxNodeDepth = 0; + let graphIter = output.traverseGraph(); + traverse(graphIter, (edge) => { + const upstreamElem = edge.getUpstreamElement(); + if (upstreamElem instanceof mx.Node) { + nodeCount++; + } + maxElementDepth = Math.max(maxElementDepth, graphIter.getElementDepth()); + maxNodeDepth = Math.max(maxNodeDepth, graphIter.getNodeDepth()); + }); + + expect(nodeCount).to.equal(7); + expect(maxElementDepth).to.equal(3); + expect(maxNodeDepth).to.equal(3); + + // Traverse upstream from the graph output (prune subgraph) + nodeCount = 0; + graphIter = output.traverseGraph(); + traverse(graphIter, (edge) => { + const upstreamElem = edge.getUpstreamElement(); + expect(upstreamElem.getSelf()).to.be.an.instanceof(mx.Element); + if (upstreamElem instanceof mx.Node) { + nodeCount++; + } + if (upstreamElem.getCategory() === 'multiply') { + graphIter.setPruneSubgraph(true); + } + }); + expect(nodeCount).to.equal(5); + + // Create and detect a cycle + multiply.setConnectedNode('in2', mix); + expect(output.hasUpstreamCycle()).to.be.true; + expect(doc.validate()).to.be.false; + multiply.setConnectedNode('in2', constant); + expect(output.hasUpstreamCycle()).to.be.false; + expect(doc.validate()).to.be.true; + + // Create and detect a loop + contrast.setConnectedNode('in', contrast); + expect(output.hasUpstreamCycle()).to.be.true; + expect(doc.validate()).to.be.false; + contrast.setConnectedNode('in', image2); + expect(output.hasUpstreamCycle()).to.be.false; + expect(doc.validate()).to.be.true; }); - - expect(nodeCount).to.equal(7); - expect(maxElementDepth).to.equal(3); - expect(maxNodeDepth).to.equal(3); - - // Traverse upstream from the graph output (prune subgraph) - nodeCount = 0; - graphIter = output.traverseGraph(); - traverse(graphIter, (edge) => { - const upstreamElem = edge.getUpstreamElement(); - expect(upstreamElem.getSelf()).to.be.an.instanceof(mx.Element); - if (upstreamElem instanceof mx.Node) { - nodeCount++; - } - if (upstreamElem.getCategory() === 'multiply') { - graphIter.setPruneSubgraph(true); + + it("Traverse inheritance", () => { + const doc = mx.createDocument(); + const nodeDefParent = doc.addNodeDef(); + nodeDefParent.setName('BaseClass'); + const nodeDefInheritanceLevel1 = doc.addNodeDef(); + nodeDefInheritanceLevel1.setName('InheritanceLevel1'); + const nodeDefInheritanceLevel2 = doc.addNodeDef(); + nodeDefInheritanceLevel2.setName('InheritanceLevel2'); + nodeDefInheritanceLevel2.setInheritsFrom(nodeDefInheritanceLevel1); + nodeDefInheritanceLevel1.setInheritsFrom(nodeDefParent); + const inheritanceIterator = nodeDefInheritanceLevel2.traverseInheritance(); + let inheritanceChainLength = 0; + for(const elem of inheritanceIterator) { + if (elem instanceof mx.NodeDef) { + inheritanceChainLength++; + } } + expect(inheritanceChainLength).to.equal(2);; }); - expect(nodeCount).to.equal(5); - - // Create and detect a cycle - multiply.setConnectedNode('in2', mix); - expect(output.hasUpstreamCycle()).to.be.true; - expect(doc.validate()).to.be.false; - multiply.setConnectedNode('in2', constant); - expect(output.hasUpstreamCycle()).to.be.false; - expect(doc.validate()).to.be.true; - - // Create and detect a loop - contrast.setConnectedNode('in', contrast); - expect(output.hasUpstreamCycle()).to.be.true; - expect(doc.validate()).to.be.false; - contrast.setConnectedNode('in', image2); - expect(output.hasUpstreamCycle()).to.be.false; - expect(doc.validate()).to.be.true; -}); +}); \ No newline at end of file From 07f2643688bb7e114eb0cedf5ac7befb8d3f0b92 Mon Sep 17 00:00:00 2001 From: Sebastian Dunkel Date: Wed, 26 May 2021 11:10:53 +0200 Subject: [PATCH 31/33] addressed review comments --- source/JsMaterialX/{helpers.h => Helpers.h} | 0 source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp | 9 +++++++-- source/JsMaterialX/JsMaterialXCore/JsDocument.cpp | 9 +++++++-- source/JsMaterialX/JsMaterialXCore/JsElement.cpp | 9 +++++++-- source/JsMaterialX/JsMaterialXCore/JsExceptions.cpp | 5 +++++ source/JsMaterialX/JsMaterialXCore/JsGeom.cpp | 9 +++++++-- source/JsMaterialX/JsMaterialXCore/JsInterface.cpp | 11 ++++++++--- source/JsMaterialX/JsMaterialXCore/JsLook.cpp | 9 +++++++-- source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp | 9 +++++++-- source/JsMaterialX/JsMaterialXCore/JsNode.cpp | 9 +++++++-- source/JsMaterialX/JsMaterialXCore/JsProperty.cpp | 9 +++++++-- source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp | 9 +++++++-- source/JsMaterialX/JsMaterialXCore/JsTypes.cpp | 9 +++++++-- source/JsMaterialX/JsMaterialXCore/JsUnit.cpp | 9 +++++++-- source/JsMaterialX/JsMaterialXCore/JsUtil.cpp | 7 ++++++- source/JsMaterialX/JsMaterialXCore/JsValue.cpp | 9 +++++++-- source/JsMaterialX/JsMaterialXCore/JsVariant.cpp | 9 +++++++-- source/JsMaterialX/JsMaterialXFormat/JsXmlIo.cpp | 7 ++++++- source/JsMaterialX/{vectorHelper.h => VectorHelper.h} | 0 19 files changed, 116 insertions(+), 31 deletions(-) rename source/JsMaterialX/{helpers.h => Helpers.h} (100%) rename source/JsMaterialX/{vectorHelper.h => VectorHelper.h} (100%) diff --git a/source/JsMaterialX/helpers.h b/source/JsMaterialX/Helpers.h similarity index 100% rename from source/JsMaterialX/helpers.h rename to source/JsMaterialX/Helpers.h diff --git a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp index 18bd8c71ba..e4e90cfc1e 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDefinition.cpp @@ -1,5 +1,10 @@ -#include "../vectorHelper.h" -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" +#include "../Helpers.h" #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp index 9c153a10cf..6b1021105f 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsDocument.cpp @@ -1,5 +1,10 @@ -#include "../vectorHelper.h" -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" +#include "../Helpers.h" #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp index 5ac3f9a4f5..9430fcb568 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsElement.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsElement.cpp @@ -1,5 +1,10 @@ -#include "../vectorHelper.h" -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" +#include "../Helpers.h" #include #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsExceptions.cpp b/source/JsMaterialX/JsMaterialXCore/JsExceptions.cpp index d6f76c11b6..761b75bda6 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsExceptions.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsExceptions.cpp @@ -1,3 +1,8 @@ +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + #include #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp index 866888f9e6..0196a2e1e9 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsGeom.cpp @@ -1,5 +1,10 @@ -#include "../vectorHelper.h" -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" +#include "../Helpers.h" #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp index bcd66efc46..36f2c4327e 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp @@ -1,5 +1,10 @@ -#include "../vectorHelper.h" -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" +#include "../Helpers.h" #include #include @@ -120,7 +125,7 @@ extern "C" .function("setVersionString", &mx::InterfaceElement::setVersionString) .function("hasVersionString", &mx::InterfaceElement::hasVersionString) .function("getVersionString", &mx::InterfaceElement::getVersionString) - .function("setVersionIntegers", &mx::InterfaceElement::getVersionIntegers) + .function("setVersionIntegers", &mx::InterfaceElement::setVersionIntegers) .function("getVersionIntegers", &mx::InterfaceElement::getVersionIntegers) .function("setDefaultVersion", &mx::InterfaceElement::setDefaultVersion) .function("getDefaultVersion", &mx::InterfaceElement::getDefaultVersion) diff --git a/source/JsMaterialX/JsMaterialXCore/JsLook.cpp b/source/JsMaterialX/JsMaterialXCore/JsLook.cpp index 598002dde5..3df6cf859b 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsLook.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsLook.cpp @@ -1,5 +1,10 @@ -#include "../vectorHelper.h" -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" +#include "../Helpers.h" #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp b/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp index 053f6a14b4..59c6f98ee7 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsMaterial.cpp @@ -1,5 +1,10 @@ -#include "../vectorHelper.h" -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" +#include "../Helpers.h" #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsNode.cpp b/source/JsMaterialX/JsMaterialXCore/JsNode.cpp index 2006ccec64..0ade3d7126 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsNode.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsNode.cpp @@ -1,5 +1,10 @@ -#include "../vectorHelper.h" -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" +#include "../Helpers.h" #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp b/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp index 5156343657..ceccadc7a2 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsProperty.cpp @@ -1,5 +1,10 @@ -#include "../vectorHelper.h" -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" +#include "../Helpers.h" #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp b/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp index 0da81359c4..917dcaf182 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsTraversal.cpp @@ -1,5 +1,10 @@ -#include "../vectorHelper.h" -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" +#include "../Helpers.h" #include #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp b/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp index fa1a983bff..d6cf3d8cea 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsTypes.cpp @@ -1,5 +1,10 @@ -#include "../vectorHelper.h" -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" +#include "../Helpers.h" #include #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp b/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp index f963c1e12a..b9814d3f00 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsUnit.cpp @@ -1,5 +1,10 @@ -#include "../vectorHelper.h" -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" +#include "../Helpers.h" #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp index 5423c028f6..932d1c53c5 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsUtil.cpp @@ -1,4 +1,9 @@ -#include "../vectorHelper.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsValue.cpp b/source/JsMaterialX/JsMaterialXCore/JsValue.cpp index 494cbda752..2eb2b1b612 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsValue.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsValue.cpp @@ -1,5 +1,10 @@ -#include "../vectorHelper.h" -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" +#include "../Helpers.h" #include diff --git a/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp b/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp index 18078392e0..b3dfc716de 100644 --- a/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp +++ b/source/JsMaterialX/JsMaterialXCore/JsVariant.cpp @@ -1,5 +1,10 @@ -#include "../vectorHelper.h" -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../VectorHelper.h" +#include "../Helpers.h" #include diff --git a/source/JsMaterialX/JsMaterialXFormat/JsXmlIo.cpp b/source/JsMaterialX/JsMaterialXFormat/JsXmlIo.cpp index 05137adb18..ad19c686e4 100644 --- a/source/JsMaterialX/JsMaterialXFormat/JsXmlIo.cpp +++ b/source/JsMaterialX/JsMaterialXFormat/JsXmlIo.cpp @@ -1,4 +1,9 @@ -#include "../helpers.h" +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + +#include "../Helpers.h" #include #include diff --git a/source/JsMaterialX/vectorHelper.h b/source/JsMaterialX/VectorHelper.h similarity index 100% rename from source/JsMaterialX/vectorHelper.h rename to source/JsMaterialX/VectorHelper.h From a1b378ac3cf1ec00af8657fc30f14662e0f153ed Mon Sep 17 00:00:00 2001 From: kohakukun Date: Wed, 26 May 2021 11:15:36 +0200 Subject: [PATCH 32/33] add while loop test --- source/JsMaterialX/test/traverseGraph.spec.js | 53 +++++++++++++------ 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/source/JsMaterialX/test/traverseGraph.spec.js b/source/JsMaterialX/test/traverseGraph.spec.js index ab0e042c25..97678be493 100644 --- a/source/JsMaterialX/test/traverseGraph.spec.js +++ b/source/JsMaterialX/test/traverseGraph.spec.js @@ -148,23 +148,42 @@ describe('Traversal', () => { expect(doc.validate()).to.be.true; }); - it("Traverse inheritance", () => { - const doc = mx.createDocument(); - const nodeDefParent = doc.addNodeDef(); - nodeDefParent.setName('BaseClass'); - const nodeDefInheritanceLevel1 = doc.addNodeDef(); - nodeDefInheritanceLevel1.setName('InheritanceLevel1'); - const nodeDefInheritanceLevel2 = doc.addNodeDef(); - nodeDefInheritanceLevel2.setName('InheritanceLevel2'); - nodeDefInheritanceLevel2.setInheritsFrom(nodeDefInheritanceLevel1); - nodeDefInheritanceLevel1.setInheritsFrom(nodeDefParent); - const inheritanceIterator = nodeDefInheritanceLevel2.traverseInheritance(); - let inheritanceChainLength = 0; - for(const elem of inheritanceIterator) { - if (elem instanceof mx.NodeDef) { - inheritanceChainLength++; + describe("Traverse inheritance", () => { + let nodeDefInheritanceLevel2, nodeDefInheritanceLevel1, nodeDefParent; + beforeEach(() => { + const doc = mx.createDocument(); + nodeDefParent = doc.addNodeDef(); + nodeDefParent.setName('BaseClass'); + nodeDefInheritanceLevel1 = doc.addNodeDef(); + nodeDefInheritanceLevel1.setName('InheritanceLevel1'); + nodeDefInheritanceLevel2 = doc.addNodeDef(); + nodeDefInheritanceLevel2.setName('InheritanceLevel2'); + nodeDefInheritanceLevel2.setInheritsFrom(nodeDefInheritanceLevel1); + nodeDefInheritanceLevel1.setInheritsFrom(nodeDefParent); + }); + + it('for of loop', () => { + const inheritanceIterator = nodeDefInheritanceLevel2.traverseInheritance(); + let inheritanceChainLength = 0; + for(const elem of inheritanceIterator) { + if (elem instanceof mx.NodeDef) { + inheritanceChainLength++; + } + } + expect(inheritanceChainLength).to.equal(2);; + }); + + it('while loop', () => { + const inheritanceIterator = nodeDefInheritanceLevel2.traverseInheritance(); + let inheritanceChainLength = 0; + let elem = inheritanceIterator.next(); + while (!elem.done) { + if (elem.value instanceof mx.NodeDef) { + inheritanceChainLength++; + } + elem = inheritanceIterator.next(); } - } - expect(inheritanceChainLength).to.equal(2);; + expect(inheritanceChainLength).to.equal(2);; + }); }); }); \ No newline at end of file From 8a89e1b761d683c26c4731125bde294e73b987dd Mon Sep 17 00:00:00 2001 From: Sebastian Dunkel Date: Wed, 26 May 2021 11:27:55 +0200 Subject: [PATCH 33/33] added missing copyright headers --- source/JsMaterialX/Helpers.h | 5 +++++ source/JsMaterialX/MaterialXLib.cpp | 5 +++++ source/JsMaterialX/VectorHelper.h | 5 +++++ source/JsMaterialX/initMaterialX.js | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/source/JsMaterialX/Helpers.h b/source/JsMaterialX/Helpers.h index 6e3ce2218a..45b72a2d48 100644 --- a/source/JsMaterialX/Helpers.h +++ b/source/JsMaterialX/Helpers.h @@ -1,3 +1,8 @@ +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + #ifndef JSMATERIALX_HELPERS_H #define JSMATERIALX_HELPERS_H diff --git a/source/JsMaterialX/MaterialXLib.cpp b/source/JsMaterialX/MaterialXLib.cpp index 34a29dadbd..5467d32f33 100644 --- a/source/JsMaterialX/MaterialXLib.cpp +++ b/source/JsMaterialX/MaterialXLib.cpp @@ -1,3 +1,8 @@ +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + // This file is used as the executable in the CMakeLists.txt file. // The WASM binary and the JavaScript code will be placed will be placed into the _build/source/JsMaterialX/ folder // The files will be called JsMaterialX.wasm and JsMaterialX.js \ No newline at end of file diff --git a/source/JsMaterialX/VectorHelper.h b/source/JsMaterialX/VectorHelper.h index 3797c85475..6c95b94c1a 100644 --- a/source/JsMaterialX/VectorHelper.h +++ b/source/JsMaterialX/VectorHelper.h @@ -1,3 +1,8 @@ +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + /** * Include this in every file that defines Emscripten bindings for functions with * std::vector parameters or return types, to automatically convert them to / from JS arrays. diff --git a/source/JsMaterialX/initMaterialX.js b/source/JsMaterialX/initMaterialX.js index 0a32883c54..ad9b10b997 100644 --- a/source/JsMaterialX/initMaterialX.js +++ b/source/JsMaterialX/initMaterialX.js @@ -1,3 +1,8 @@ +// +// TM & (c) 2021 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd. +// All rights reserved. See LICENSE.txt for license. +// + /** * Generates valid arguments when calling the function * Throws an error if arguments are missing.