Init Repo

This commit is contained in:
2023-09-26 13:19:46 +08:00
commit c77e23ed4e
10 changed files with 662 additions and 0 deletions
+226
View File
@@ -0,0 +1,226 @@
#include "BifrostArrayMapper.h"
#include <maya/MFnNumericAttribute.h>
#include <maya/MFnCompoundAttribute.h>
#include <maya/MFnTypedAttribute.h>
#include <maya/MFnVectorArrayData.h>
#include <maya/MFnIntArrayData.h>
#include <maya/MFnFloatArrayData.h>
#include <maya/MFnDoubleArrayData.h>
#include <maya/MVectorArray.h>
#include <maya/MDoubleArray.h>
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;
}
+34
View File
@@ -0,0 +1,34 @@
#include <maya/MPxParticleAttributeMapperNode.h>
#include <maya/MTypeId.h>
#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;
};
+8
View File
@@ -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
+28
View File
@@ -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()
+34
View File
@@ -0,0 +1,34 @@
#include <maya/MFnPlugin.h>
#include <maya/MGlobal.h>
#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;
}