0

在 C# 中为 3dsmax 创建修改器插件时如何正确实现 ChannelsChanged 和 ChannelsUsed?

当我要求 VS 实现派生自 Autodesk.Max.Plugins.Modifier 的抽象类时,我得到以下实现:

public override uint ChannelsChanged {

  get { throw new NotImplementedException(); }
}

public override uint ChannelsUsed {

  get { throw new NotImplementedException(); }
}

在 C++ 中,我应该这样做:

ChannelMask ChannelsChanged() {return PART_GEOM|TEXMAP_CHANNEL|VERTCOLOR_CHANNEL; }

一些 C++ 定义像GEOMOBJECT_CLASS_ID在 C# SDK 中显示为SClass_ID.Geomobject. 但是我在 Autodesk.Max 的对象浏览器中找不到类似这些标志的东西。除了这一点之外,还有很多信息缺失。我在任何地方都没有找到 C# 中修饰符的示例或操作方法。

非常感谢任何帮助。

4

1 回答 1

0

方法期望 auint作为返回值的事实暗示 Autodesk 未能为对象通道 PartID 实现强枚举。

您可以根据 c++ SDK 中定义的值定义自己的枚举来处理它。

[Flags]
enum ChannelPartID : uint
{
    // The topology channel - the face or polygon structures. 
    TOPO_CHANNEL = 1 << 0,
    // The vertices of the object. 
    GEOM_CHANNEL = 1 << 1,
    // The texture vertices and procedural mappings. 
    TEXMAP_CHANNEL = 1 << 2,
    // This is no longer used. 
    MTL_CHANNEL = 1 << 3,
    // The sub-object selection channel. 
    SELECT_CHANNEL = 1 << 4,        
    // The current level of selection. 
    SUBSEL_TYPE_CHANNEL = 1 << 5,
    // The miscellaneous bits controlling the item's display. 
    DISP_ATTRIB_CHANNEL = 1 << 6,
    // The color per vertex channel. 
    VERTCOLOR_CHANNEL = 1 << 7
    // The used internally by 3ds Max for stripping. 
    GFX_DATA_CHANNEL = 1 << 8,
    // Displacement approximation. 
    DISP_APPROX_CHANNEL = 1 << 9,
    // The channel used by extension channel objects. 
    EXTENSION_CHANNEL = 1 << 13,
    // The ObjectState Transform that flows down the pipeline. 
    TM_CHANNEL = 1 << 10,
    // For internal use. 
    EDGEVISIBILITY_CHANNEL = 1 << 11,
    // For internal use. 
    DONT_RECREATE_TRISTRIP_CHANNEL = 1 << 12,
    // This is no longer used. 
    GLOBMTL_CHANNEL = 1 << 31,
    OBJ_CHANNELS = TOPO_CHANNEL | GEOM_CHANNEL | SELECT_CHANNEL | TEXMAP_CHANNEL | MTL_CHANNEL | SUBSEL_TYPE_CHANNEL | DISP_ATTRIB_CHANNEL | VERTCOLOR_CHANNEL | GFX_DATA_CHANNEL | DISP_APPROX_CHANNEL | EXTENSION_CHANNEL,
    ALL_CHANNELS = OBJ_CHANNELS | TM_CHANNEL | GLOBMTL_CHANNEL 
}

然后在你的方法中像这样使用它

public override uint ChannelsChanged 
{
  get { return (uint)(ChannelPartID.PART_GEOM | ChannelPartID.TEXMAP_CHANNEL | ChannelPartID.VERTCOLOR_CHANNEL); }
} 
于 2014-06-08T08:33:20.497 回答