From c77e23ed4ea8d27bfb9de8ef89e70c8b2de0b204 Mon Sep 17 00:00:00 2001 From: indigo Date: Tue, 26 Sep 2023 13:19:46 +0800 Subject: [PATCH] Init Repo --- CMakeLists.txt | 12 ++ CMakePresets.json | 109 ++++++++++++ README.md | 0 cmake/modules/FindMaya.cmake | 210 ++++++++++++++++++++++ src/BifrostUtils/BifrostArrayMapper.cpp | 226 ++++++++++++++++++++++++ src/BifrostUtils/BifrostArrayMapper.h | 34 ++++ src/BifrostUtils/BifrostUtils.mod | 8 + src/BifrostUtils/CMakeLists.txt | 28 +++ src/BifrostUtils/Plugin.cpp | 34 ++++ src/CMakeLists.txt | 1 + 10 files changed, 662 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 CMakePresets.json create mode 100644 README.md create mode 100644 cmake/modules/FindMaya.cmake create mode 100644 src/BifrostUtils/BifrostArrayMapper.cpp create mode 100644 src/BifrostUtils/BifrostArrayMapper.h create mode 100644 src/BifrostUtils/BifrostUtils.mod create mode 100644 src/BifrostUtils/CMakeLists.txt create mode 100644 src/BifrostUtils/Plugin.cpp create mode 100644 src/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..474d523 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,12 @@ +project(BifrostUtils) +cmake_minimum_required(VERSION 3.2) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} + ${CMAKE_SOURCE_DIR}/cmake/modules + ${CMAKE_SOURCE_DIR}/cmake/macros) + +include(CheckCXXCompilerFlag) + +CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) +CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) + +add_subdirectory(src) \ No newline at end of file diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..cb52c57 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,109 @@ +{ + "version": 2, + "configurePresets": [ + { + "name": "Maya2020", + "displayName": "Maya 2020", + "description": "Build as Visual Studio 15 2017", + "generator": "Visual Studio 17 2022", + "toolset": "v141", + "binaryDir": "${sourceDir}/build/${presetName}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_TOOLCHAIN_FILE": "", + "CMAKE_INSTALL_PREFIX": "${sourceDir}/install", + "CMAKE_CXX_FLAGS_RELWITHDEBINFO": "/Od /Zi", + "CMAKE_CXX_FLAGS_RELEASE": "/O2" + }, + "environment": { + "MAYA_VERSION": "2020" + } + }, + { + "name": "Maya2022", + "displayName": "Maya 2022", + "description": "Build as Visual Studio 16 2019", + "generator": "Visual Studio 17 2022", + "toolset": "v142", + "binaryDir": "${sourceDir}/build/${presetName}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_TOOLCHAIN_FILE": "", + "CMAKE_INSTALL_PREFIX": "${sourceDir}/install", + "CMAKE_CXX_FLAGS_RELWITHDEBINFO": "/Od /Zi", + "CMAKE_CXX_FLAGS_RELEASE": "/O2" + }, + "environment": { + "MAYA_VERSION": "2022" + } + }, + { + "name": "Maya2023", + "displayName": "Maya 2023", + "description": "Build as Visual Studio 16 2019", + "generator": "Visual Studio 17 2022", + "toolset": "v142", + "binaryDir": "${sourceDir}/build/${presetName}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "CMAKE_TOOLCHAIN_FILE": "", + "CMAKE_INSTALL_PREFIX": "${sourceDir}/install", + "CMAKE_CXX_FLAGS_RELWITHDEBINFO": "/Od /Zi", + "CMAKE_CXX_FLAGS_RELEASE": "/O2" + }, + "environment": { + "MAYA_VERSION": "2023" + } + } + ], + "buildPresets": [ + { + "name": "Maya2020_Release", + "description": "Release Build", + "displayName": "Maya 2020 Release", + "configurePreset": "Maya2020", + "configuration": "Release", + "targets": "install" + }, + { + "name": "Maya2020_RelWithDebInfo", + "description": "Release Build with Debug Info", + "displayName": "Maya 2020 RelWithDebInfo", + "configurePreset": "Maya2020", + "configuration": "RelWithDebInfo", + "targets": "install" + }, + { + "name": "Maya2022_Release", + "description": "Release Build", + "displayName": "Maya 2022 Release", + "configurePreset": "Maya2022", + "configuration": "Release", + "targets": "install" + }, + { + "name": "Maya2022_RelWithDebInfo", + "description": "Release Build with Debug Info", + "displayName": "Maya 2022 RelWithDebInfo", + "configurePreset": "Maya2022", + "configuration": "RelWithDebInfo", + "targets": "install" + }, + { + "name": "Maya2023_Release", + "description": "Release Build", + "displayName": "Maya 2023 Release", + "configurePreset": "Maya2023", + "configuration": "Release", + "targets": "install" + }, + { + "name": "Maya2023_RelWithDebInfo", + "description": "Release Build with Debug Info", + "displayName": "Maya 2023 RelWithDebInfo", + "configurePreset": "Maya2023", + "configuration": "RelWithDebInfo", + "targets": "install" + } + ] +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/cmake/modules/FindMaya.cmake b/cmake/modules/FindMaya.cmake new file mode 100644 index 0000000..d5a76c0 --- /dev/null +++ b/cmake/modules/FindMaya.cmake @@ -0,0 +1,210 @@ +include(FindPackageHandleStandardArgs) + +if(NOT DEFINED MAYA_VERSION) + set(MAYA_VERSION 2018) +endif() + +if(DEFINED ENV{MAYA_VERSION}) + set(MAYA_VERSION $ENV{MAYA_VERSION}) +endif() + +set(MAYA_BIN_SUFFIX "bin") +set(MAYA_INC_SUFFIX "include") +set(MAYA_LIB_SUFFIX "lib") + +if(WIN32) + set(MAYA_LOCATION "$ENV{ProgramFiles}/Autodesk/Maya${MAYA_VERSION}") + set(MAYA_PLUGIN_EXT ".mll") + set(MAYA_COMPILE_FLAGS "/MD /D \"NT_PLUGIN\" /D \"REQUIRE_IOSTREAM\" /D \"_BOOL\"" ) + set(MAYA_LINK_FLAGS " /export:initializePlugin /export:uninitializePlugin " ) +elseif(APPLE) + set(MAYA_LOCATION "/Applications/Autodesk/maya${MAYA_VERSION}") + set(MAYA_PLUGIN_EXT ".bundle") + set(MAYA_COMPILE_FLAGS "-DAW_NEW_IOSTREAMS -DCC_GNU_ -DOSMac_ -DOSMacOSX_ -DOSMac_MachO_ -DREQUIRE_IOSTREAM -fno-gnu-keywords -D_LANGUAGE_C_PLUS_PLUS") + set(MAYA_LINK_FLAGS "-fno-gnu-keywords -framework System -framework SystemConfiguration -framework CoreServices -framework Carbon -framework Cocoa -framework ApplicationServices -framework Quicktime -framework IOKit -bundle -fPIC -L${ALEMBIC_MAYA_LIB_ROOT} -Wl,-executable_path,${ALEMBIC_MAYA_LIB_ROOT}") +else() + set(MAYA_LOCATION "/usr/autodesk/maya${MAYA_VERSION}") + set(MAYA_PLUGIN_EXT ".so") + set(MAYA_COMPILE_FLAGS "-m64 -g -pthread -pipe -D_BOOL -DLINUX -DLINUX_64 -DREQUIRE_IOSTREAM -fPIC -Wno-deprecated -fno-gnu-keywords") + set(MAYA_LINK_FLAGS "-shared -m64 -g -pthread -pipe -D_BOOL -DLINUX -DLINUX_64 -DREQUIRE_IOSTREAM -fPIC -Wno-deprecated -fno-gnu-keywords -Wl,-Bsymbolic") +endif() + +set(MAYA_ROOT ${MAYA_LOCATION}) +string(REPLACE "\\" "/" MAYA_ROOT ${MAYA_ROOT}) + +if(DEFINED ENV{MAYA_LOCATION}) + set(MAYA_ROOT $ENV{MAYA_LOCATION}) +endif() + +set(MAYA_EXE MAYA_EXE-NOTFOUND) +find_program(MAYA_EXE maya + PATHS + ${MAYA_ROOT} + PATH_SUFFIXES + "${MAYA_BIN_SUFFIX}" + NO_DEFAULT_PATH + DOC "Maya Executable Path") + +set(MAYA_PY_EXE MAYA_PY_EXE-NOTFOUND) +find_program(MAYA_PY_EXE mayapy + PATHS + ${MAYA_ROOT} + PATH_SUFFIXES + "${MAYA_BIN_SUFFIX}" + NO_DEFAULT_PATH + DOC "Maya Python Executable Path") + +set(MAYA_INCLUDE_PATH MAYA_INCLUDE_PATH-NOTFOUND) +find_path(MAYA_INCLUDE_PATH "maya/MFn.h" + PATHS + ${MAYA_ROOT} + PATH_SUFFIXES + "${MAYA_INC_SUFFIX}" + NO_DEFAULT_PATH + DOC "Maya Include Dir") + +set(MAYA_OPENMAYA_LIBRARY MAYA_OPENMAYA_LIBRARY-NOTFOUND) +find_library(MAYA_OPENMAYA_LIBRARY OpenMaya + PATHS + "${MAYA_ROOT}/lib" + DOC "OpenMaya Libray Path") + +if(MAYA_OPENMAYA_LIBRARY) + set(MAYA_LIBRARY_PATH "${MAYA_ROOT}/lib") +endif() + +set(MAYA_OPENMAYAFX_LIBRARY MAYA_OPENMAYAFX_LIBRARY-NOTFOUND) +find_library(MAYA_OPENMAYAFX_LIBRARY OpenMayaFX + PATHS + "${MAYA_ROOT}/lib" + DOC "OpenMayaFX Libray Path") + +set(MAYA_OPENMAYAANIM_LIBRARY MAYA_OPENMAYAANIM_LIBRARY-NOTFOUND) +find_library(MAYA_OPENMAYAANIM_LIBRARY OpenMayaAnim + PATHS + "${MAYA_ROOT}/lib" + DOC "OpenMayaAnim Libray Path") + +set(MAYA_OPENMAYAUI_LIBRARY MAYA_OPENMAYAUI_LIBRARY-NOTFOUND) +find_library(MAYA_OPENMAYAUI_LIBRARY OpenMayaUI + PATHS + "${MAYA_ROOT}/lib" + DOC "OpenMayaUI Libray Path") + +set(MAYA_OPENMAYARENDER_LIBRARY MAYA_OPENMAYARENDER_LIBRARY-NOTFOUND) +find_library(MAYA_OPENMAYARENDER_LIBRARY OpenMayaRender + PATHS + "${MAYA_ROOT}/lib" + DOC "OpenMayaRender Libray Path") + +set(MAYA_FOUNDATION_LIBRARY MAYA_FOUNDATION_LIBRARY-NOTFOUND) +find_library(MAYA_FOUNDATION_LIBRARY Foundation + PATHS + "${MAYA_ROOT}/lib" + DOC "Foundation Libray Path") + +set(XGEN_PLUGIN "plug-ins/xgen") + +set(MAYA_XGEN_ROOT MAYA_XGEN_ROOT-NOTFOUND) +if(EXISTS "${MAYA_ROOT}/plug-ins/xgen") + set(MAYA_XGEN_ROOT "${MAYA_ROOT}/plug-ins/xgen") +endif() + +set(MAYA_XGEN_INCLUDE_PATH MAYA_XGEN_INCLUDE_PATH-NOTFOUND) + +find_path(MAYA_XGEN_INCLUDE_PATH "XGen/XgWinExport.h" + PATHS + ${MAYA_ROOT} + PATH_SUFFIXES + "${XGEN_PLUGIN}/${MAYA_INC_SUFFIX}" + NO_DEFAULT_PATH + DOC "Maya XGen Include Dir") + +if(MAYA_VERSION GREATER_EQUAL 2020) + find_path(MAYA_XGEN_INCLUDE_PATH "xgen/src/xgcore/XgConfig.h" + PATHS + ${MAYA_ROOT} + PATH_SUFFIXES + "${XGEN_PLUGIN}/${MAYA_INC_SUFFIX}" + NO_DEFAULT_PATH + DOC "Maya XGen Include Dir") +endif() + +set(MAYA_ADSKXGEN_LIBRARY MAYA_ADSKXGEN_LIBRARY-NOTFOUND) +find_library(MAYA_ADSKXGEN_LIBRARY + AdskXGen + libAdskXGen + PATHS + "${MAYA_ROOT}/plug-ins/xgen/lib" + DOC "libAdskXGen Libray Path") + +set(MAYA_XGEN_LIBRARY_PATH MAYA_XGEN_LIBRARY_PATH-NOTFOUND) +if(MAYA_ADSKXGEN_LIBRARY) + set(MAYA_XGEN_LIBRARY_PATH "${MAYA_ROOT}/plug-ins/xgen/lib") +endif() + +set(MAYA_ADSKXPD_LIBRARY MAYA_ADSKXPD_LIBRARY-NOTFOUND) +find_library(MAYA_ADSKXPD_LIBRARY + AdskXpd + libAdskXpd + PATHS + "${MAYA_ROOT}/plug-ins/xgen/lib" + DOC "libAdskXpd Libray Path") + +set(MAYA_ADSKSEEXPR_LIBRARY MAYA_ADSKSEEXPR_LIBRARY-NOTFOUND) +find_library(MAYA_ADSKSEEXPR_LIBRARY + AdskSeExpr + libAdskSeExpr + PATHS + "${MAYA_ROOT}/plug-ins/xgen/lib" + DOC "libAdskSeExpr Libray Path") + + +set(MAYA_LIBRARIES + ${MAYA_FOUNDATION_LIBRARY} + ${MAYA_OPENMAYA_LIBRARY} + ${MAYA_OPENMAYAANIM_LIBRARY} + ${MAYA_OPENMAYAFX_LIBRARY} + ${MAYA_OPENMAYARENDER_LIBRARY} + ${MAYA_OPENMAYAUI_LIBRARY}) + +set(MAYA_XGEN_LIBRARIES + ${MAYA_ADSKXGEN_LIBRARY} + ${MAYA_ADSKXPD_LIBRARY} + ${MAYA_ADSKSEEXPR_LIBRARY}) + +message(STATUS "MAYA_ROOT : ${MAYA_ROOT}") +message(STATUS "MAYA_EXE : ${MAYA_EXE}") +message(STATUS "MAYA_PY_EXE : ${MAYA_PY_EXE}") +message(STATUS "MAYA_INCLUDE_PATH : ${MAYA_INCLUDE_PATH}") +message(STATUS "MAYA_LIBRARY_PATH : ${MAYA_LIBRARY_PATH}") +message(STATUS "MAYA_FOUNDATION_LIBRARY : ${MAYA_FOUNDATION_LIBRARY}") +message(STATUS "MAYA_OPENMAYA_LIBRARY : ${MAYA_OPENMAYA_LIBRARY}") +message(STATUS "MAYA_OPENMAYAANIM_LIBRARY : ${MAYA_OPENMAYAANIM_LIBRARY}") +message(STATUS "MAYA_OPENMAYAFX_LIBRARY : ${MAYA_OPENMAYAFX_LIBRARY}") +message(STATUS "MAYA_OPENMAYARENDER_LIBRARY : ${MAYA_OPENMAYARENDER_LIBRARY}") +message(STATUS "MAYA_OPENMAYAUI_LIBRARY : ${MAYA_OPENMAYAUI_LIBRARY}") +message(STATUS "----------------------------------------------") +message(STATUS "Maya XGen SDK") +message(STATUS "----------------------------------------------") +message(STATUS "MAYA_XGEN_ROOT : ${MAYA_XGEN_ROOT}") +message(STATUS "MAYA_XGEN_INCLUDE_PATH : ${MAYA_XGEN_INCLUDE_PATH}") +message(STATUS "MAYA_XGEN_LIBRARY_PATH : ${MAYA_XGEN_LIBRARY_PATH}") +message(STATUS "MAYA_ADSKXGEN_LIBRARY : ${MAYA_ADSKXGEN_LIBRARY}") +message(STATUS "MAYA_ADSKXPD_LIBRARY : ${MAYA_ADSKXPD_LIBRARY}") +message(STATUS "MAYA_ADSKSEEXPR_LIBRARY : ${MAYA_ADSKSEEXPR_LIBRARY}") + +find_package_handle_standard_args(Maya + REQUIRED_VARS + MAYA_ROOT + MAYA_INCLUDE_PATH + MAYA_LIBRARY_PATH + MAYA_FOUNDATION_LIBRARY + MAYA_OPENMAYA_LIBRARY + MAYA_OPENMAYAANIM_LIBRARY + MAYA_OPENMAYAFX_LIBRARY + MAYA_OPENMAYARENDER_LIBRARY + MAYA_OPENMAYAUI_LIBRARY + VERSION_VAR + MAYA_VERSION + ) diff --git a/src/BifrostUtils/BifrostArrayMapper.cpp b/src/BifrostUtils/BifrostArrayMapper.cpp new file mode 100644 index 0000000..d45143d --- /dev/null +++ b/src/BifrostUtils/BifrostArrayMapper.cpp @@ -0,0 +1,226 @@ +#include "BifrostArrayMapper.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MTypeId BifrostArrayMapper::id = 0x80007; +MObject BifrostArrayMapper::mOutPositionPP; +MObject BifrostArrayMapper::mOutRotationPP; +MObject BifrostArrayMapper::mOutInstancePP; +MObject BifrostArrayMapper::mOutSizePP; +MObject BifrostArrayMapper::mParticleCount; +MObject BifrostArrayMapper::mPointPosition; +MObject BifrostArrayMapper::mArrayPoint; +MObject BifrostArrayMapper::mInstanceId; +MObject BifrostArrayMapper::mPointSize; +MObject BifrostArrayMapper::mPointRotation; + +BifrostArrayMapper::BifrostArrayMapper(){}; +BifrostArrayMapper::~BifrostArrayMapper(){}; + +void* BifrostArrayMapper::creator() +{ + return new BifrostArrayMapper(); +} + +MStatus BifrostArrayMapper::initialize() +{ + MStatus status; + MFnNumericAttribute nAttr; + MFnCompoundAttribute cAttr; + MFnTypedAttribute tAttr; + + mPointPosition = nAttr.createPoint("pointPosition", "pp"); + nAttr.setArray(true); + nAttr.setUsesArrayDataBuilder(true); + nAttr.setKeyable(true); + nAttr.setStorable(true); + nAttr.setReadable(true); + nAttr.setWritable(true); + + mPointRotation = nAttr.createPoint("pointRotation", "pr"); + nAttr.setArray(true); + nAttr.setUsesArrayDataBuilder(true); + nAttr.setKeyable(true); + nAttr.setStorable(true); + nAttr.setReadable(true); + nAttr.setWritable(true); + + mInstanceId = nAttr.create("instanceId", "iid", MFnNumericData::kLong, 0); + nAttr.setArray(true); + nAttr.setUsesArrayDataBuilder(true); + nAttr.setKeyable(true); + nAttr.setStorable(true); + nAttr.setReadable(true); + nAttr.setWritable(true); + + mPointSize = nAttr.create("pointSize", "ps", MFnNumericData::kFloat, 0); + nAttr.setArray(true); + nAttr.setUsesArrayDataBuilder(true); + nAttr.setKeyable(true); + nAttr.setStorable(true); + nAttr.setReadable(true); + nAttr.setWritable(true); + + mParticleCount = nAttr.create("pointCount", "pc", MFnNumericData::kInt, 0); + nAttr.setStorable(true); + + MVectorArray defaultVectorArray; + MFnVectorArrayData fnVectorArrayData; + fnVectorArrayData.create(defaultVectorArray); + + mOutPositionPP = tAttr.create("outPositionPP", "opos", MFnData::kVectorArray, fnVectorArrayData.object()); + tAttr.setWritable(true); + tAttr.setStorable(true); + + mOutRotationPP = tAttr.create("outRotationPP", "orot", MFnData::kVectorArray, fnVectorArrayData.object()); + tAttr.setWritable(true); + tAttr.setStorable(true); + + MDoubleArray defaultDoubleArray; + MFnDoubleArrayData fnDoubleArrayData; + fnDoubleArrayData.create(defaultDoubleArray); + + mOutInstancePP = tAttr.create("outInstanceIdPP", "oiid", MFnData::kDoubleArray, fnDoubleArrayData.object()); + tAttr.setWritable(true); + tAttr.setStorable(true); + + mOutSizePP = tAttr.create("outSizePP", "osiz", MFnData::kDoubleArray, fnDoubleArrayData.object()); + tAttr.setWritable(true); + tAttr.setStorable(true); + + addAttribute(mPointPosition); + addAttribute(mPointRotation); + addAttribute(mInstanceId); + addAttribute(mPointSize); + addAttribute(mParticleCount); + addAttribute(mOutPositionPP); + addAttribute(mOutRotationPP); + addAttribute(mOutInstancePP); + addAttribute(mOutSizePP); + + attributeAffects(mPointPosition, mOutPositionPP); + attributeAffects(mPointRotation, mOutRotationPP); + attributeAffects(mInstanceId, mOutInstancePP); + attributeAffects(mPointSize, mOutSizePP); + + attributeAffects(mPointPosition, mParticleCount); + attributeAffects(mPointRotation, mParticleCount); + attributeAffects(mInstanceId, mParticleCount); + attributeAffects(mPointSize, mParticleCount); + + return MS::kSuccess; +} + +MStatus BifrostArrayMapper::computePosition(const MPlug& plug, MDataBlock& block) +{ + MStatus status; + MFnVectorArrayData fnPosArrayData(block.outputValue(mOutPositionPP).data()); + MVectorArray outPosArray = fnPosArrayData.array(&status); + if(status == MS::kInvalidParameter) + return status; + MDataHandle particleCountHandle = block.outputValue(mParticleCount); + MArrayDataHandle inputArrayDataHandle = block.inputArrayValue(mPointPosition); + unsigned int elementCount = inputArrayDataHandle.elementCount(); + outPosArray.setLength(elementCount); + for(unsigned int i = 0; i < elementCount; i++ ) + { + inputArrayDataHandle.jumpToElement(i); + MFloatVector p = inputArrayDataHandle.inputValue().asFloatVector(); + outPosArray.set(MVector(p), i); + } + fnPosArrayData.set(outPosArray); + particleCountHandle.setInt(elementCount); + return status; +} + +MStatus BifrostArrayMapper::computeRotation(const MPlug& plug, MDataBlock& block) +{ + MStatus status; + MFnVectorArrayData fnRotArrayData(block.outputValue(mOutRotationPP).data()); + MVectorArray outRotArray = fnRotArrayData.array(&status); + if(status == MS::kInvalidParameter) + return status; + MDataHandle particleCountHandle = block.outputValue(mParticleCount); + MArrayDataHandle inputArrayDataHandle = block.inputArrayValue(mPointRotation); + unsigned int elementCount = inputArrayDataHandle.elementCount(); + outRotArray.setLength(elementCount); + for(unsigned int i = 0; i < elementCount; i++ ) + { + inputArrayDataHandle.jumpToElement(i); + MFloatVector p = inputArrayDataHandle.inputValue().asFloatVector(); + outRotArray.set(MVector(p), i); + } + fnRotArrayData.set(outRotArray); + particleCountHandle.setInt(elementCount); + return status; +} + +MStatus BifrostArrayMapper::computeInstanceId(const MPlug& plug, MDataBlock& block) +{ + MStatus status; + MFnDoubleArrayData fnInstArrayData(block.outputValue(mOutInstancePP).data()); + MDoubleArray outInstArray = fnInstArrayData.array(&status); + if(status == MS::kInvalidParameter) + return status; + MDataHandle particleCountHandle = block.outputValue(mParticleCount); + MArrayDataHandle inputArrayDataHandle = block.inputArrayValue(mInstanceId); + unsigned int elementCount = inputArrayDataHandle.elementCount(); + outInstArray.setLength(elementCount); + for(unsigned int i = 0; i < elementCount; i++ ) + { + inputArrayDataHandle.jumpToElement(i); + int instId = inputArrayDataHandle.inputValue().asInt(); + outInstArray.set((float)instId, i); + } + fnInstArrayData.set(outInstArray); + particleCountHandle.setInt(elementCount); + return status; +} + +MStatus BifrostArrayMapper::computeSize(const MPlug& plug, MDataBlock& block) +{ + MStatus status; + MFnDoubleArrayData fnSizeArrayData(block.outputValue(mOutSizePP).data()); + MDoubleArray outSizeArray = fnSizeArrayData.array(&status); + if(status == MS::kInvalidParameter) + return status; + MDataHandle particleCountHandle = block.outputValue(mParticleCount); + MArrayDataHandle inputArrayDataHandle = block.inputArrayValue(mPointSize); + unsigned int elementCount = inputArrayDataHandle.elementCount(); + outSizeArray.setLength(elementCount); + for(unsigned int i = 0; i < elementCount; i++ ) + { + inputArrayDataHandle.jumpToElement(i); + float s = inputArrayDataHandle.inputValue().asFloat(); + outSizeArray.set((float)s, i); + } + fnSizeArrayData.set(outSizeArray); + particleCountHandle.setInt(elementCount); + return status; +} + +MStatus BifrostArrayMapper::compute(const MPlug& plug, MDataBlock& block) +{ + MStatus status; + if(plug.attribute() == mOutPositionPP) + { + computePosition(plug, block); + } else if(plug.attribute() == mOutRotationPP) + { + computeRotation(plug, block); + } else if(plug.attribute() == mOutInstancePP) + { + computeInstanceId(plug, block); + } else if(plug.attribute() == mOutSizePP) + { + computeSize(plug, block); + } + return status; +} \ No newline at end of file diff --git a/src/BifrostUtils/BifrostArrayMapper.h b/src/BifrostUtils/BifrostArrayMapper.h new file mode 100644 index 0000000..53280e2 --- /dev/null +++ b/src/BifrostUtils/BifrostArrayMapper.h @@ -0,0 +1,34 @@ +#include +#include + +#define kNodeTypeName "bifrostArrayMapper" + +class BifrostArrayMapper : public MPxParticleAttributeMapperNode +{ +public: + BifrostArrayMapper(); + ~BifrostArrayMapper() override; + static void *creator(); + static MStatus initialize(); + + MStatus compute(const MPlug& plug, MDataBlock& block) override; + +protected: + MStatus computePosition(const MPlug& plug, MDataBlock& block); + MStatus computeRotation(const MPlug& plug, MDataBlock& block); + MStatus computeInstanceId(const MPlug& plug, MDataBlock& block); + MStatus computeSize(const MPlug& plug, MDataBlock& block); + +public: + static MTypeId id; + static MObject mOutPositionPP; + static MObject mOutRotationPP; + static MObject mOutInstancePP; + static MObject mOutSizePP; + static MObject mParticleCount; + static MObject mPointPosition; + static MObject mArrayPoint; + static MObject mInstanceId; + static MObject mPointSize; + static MObject mPointRotation; +}; \ No newline at end of file diff --git a/src/BifrostUtils/BifrostUtils.mod b/src/BifrostUtils/BifrostUtils.mod new file mode 100644 index 0000000..97747c4 --- /dev/null +++ b/src/BifrostUtils/BifrostUtils.mod @@ -0,0 +1,8 @@ ++ MAYA_VERSION:2020 BifrostUtils 1.0 . +plug-ins: plug-ins/2020 + ++ MAYA_VERSION:2022 BifrostUtils 1.0 . +plug-ins: plug-ins/2022 + ++ MAYA_VERSION:2023 BifrostUtils 1.0 . +plug-ins: plug-ins/2023 \ No newline at end of file diff --git a/src/BifrostUtils/CMakeLists.txt b/src/BifrostUtils/CMakeLists.txt new file mode 100644 index 0000000..e7919d1 --- /dev/null +++ b/src/BifrostUtils/CMakeLists.txt @@ -0,0 +1,28 @@ +project(BifrostUtils) + +find_package(Maya) + +set(SRC_FILES + "BifrostArrayMapper.h" + "BifrostArrayMapper.cpp" + "Plugin.cpp") + +set(RESOURCE_FILES + "BifrostUtils.mod") + +include_directories( + ${MAYA_INCLUDE_PATH} +) + +add_library(${PROJECT_NAME} SHARED ${SRC_FILES}) + +target_link_libraries(${PROJECT_NAME} ${MAYA_LIBRARIES}) + +set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS -D_CRT_SECURE_NO_WARNINGS) +set_target_properties(${PROJECT_NAME} PROPERTIES SUFFIX ".mll") + +install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION "${PROJECT_NAME}/plug-ins/${MAYA_VERSION}") + +foreach(f ${RESOURCE_FILES}) + install(FILES ${f} DESTINATION ${PROJECT_NAME}) +endforeach() \ No newline at end of file diff --git a/src/BifrostUtils/Plugin.cpp b/src/BifrostUtils/Plugin.cpp new file mode 100644 index 0000000..b12af4a --- /dev/null +++ b/src/BifrostUtils/Plugin.cpp @@ -0,0 +1,34 @@ +#include +#include +#include "BifrostArrayMapper.h" + +MStatus initializePlugin(MObject obj) +{ + MStatus status; + MFnPlugin plugin(obj, "Indigo 2023", "1.0", "Any"); + status = plugin.registerNode("bifrostArrayMapper", + BifrostArrayMapper::id, + BifrostArrayMapper::creator, + BifrostArrayMapper::initialize, + MPxNode::kParticleAttributeMapperNode); + if(!status){ + status.perror("[BifrostUtils] : Register bifrostArrayMapper node failed."); + return status; + } + MGlobal::displayInfo("[BifrostUtils] : Node bifrostArrayMapper loaded."); + return MS::kSuccess; +} + +MStatus uninitializePlugin(MObject obj) +{ + MStatus status; + MFnPlugin plugin(obj); + status = plugin.deregisterNode(BifrostArrayMapper::id); + + if(!status){ + status.perror("[BifrostUtils] : Deregister bifrostArrayMapper node failed."); + return status; + } + MGlobal::displayInfo("[BifrostUtils] : Node bifrostArrayMapper unloaded."); + return MS::kSuccess; +} \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..2d64451 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(BifrostUtils) \ No newline at end of file