3dsmax SDK c ++ bonesdef.h - PullRequest
       38

3dsmax SDK c ++ bonesdef.h

0 голосов
/ 10 июня 2018

Это мой код, который отлично работает, если я поместил его в проект BonesDef:

#include "mods.h"
#include "bonesdef.h"
#include <maxscript/macros/define_instantiation_functions.h>
#include "modstack.h"

Modifier* FindSkinModifier(INode* nodePtr)
{
    Object* ObjectPtr = nodePtr->GetObjectRef();
    if (!ObjectPtr) return NULL;
    while (ObjectPtr && ObjectPtr->SuperClassID() == GEN_DERIVOB_CLASS_ID)
    {
        IDerivedObject *DerivedObjectPtr = (IDerivedObject *)(ObjectPtr);
        int ModStackIndex = 0;
        while (ModStackIndex < DerivedObjectPtr->NumModifiers())
        {
            Modifier* ModifierPtr = DerivedObjectPtr->GetModifier(ModStackIndex);
            if (ModifierPtr->ClassID() == Class_ID(SKIN_CLASSID)) 
            {
                return ModifierPtr;
            }
            ModStackIndex++;
        }
        ObjectPtr = DerivedObjectPtr->GetObjRef();
    }
    return NULL;
}

void RecursiveRemoveUnusedBones(INode* node)
{
    Modifier* skin = FindSkinModifier(node);
    if (skin)
    {
        ISkin* iskin = (ISkin*)skin->GetInterface(I_SKIN);
        BonesDefMod* bmod = (BonesDefMod*)iskin;
        ISkinContextData* skinData = iskin->GetContextInterface(node);
        BitArray usedbones = BitArray(iskin->GetNumBones());
        for (int i = 0; i < skinData->GetNumPoints(); i++)
        {
            for (int j = 0; j < skinData->GetNumAssignedBones(i); j++)
            {
                int boneIndex = skinData->GetAssignedBone(i, j);
                float boneWeight = skinData->GetBoneWeight(i, j);
                if (boneWeight > 0) usedbones.Set(boneIndex);
            }
        }
        for (int i = usedbones.GetSize(); i >= 0; i--)
        {
            if (usedbones[i] != 1) bmod->RemoveBone(i);
        }
    }

    for (int i = 0; i < node->NumberOfChildren(); ++i)
    {
        RecursiveRemoveUnusedBones(node->GetChildNode(i));
    }
}

def_visible_primitive(RemoveUnusedBones, "RemoveUnusedBones");
Value* RemoveUnusedBones_cf(Value **arg_list, int count)
{
    RecursiveRemoveUnusedBones(GetCOREInterface()->GetRootNode());
    return &ok;
}

Но проблема в том, что если я поместил этот код в свой проект вне проекта BonesDef, я получил несколько ошибок:

Severity    Code    Description    Project    File    Line    Suppression State
Error    LNK2001    unresolved external symbol "public: void __cdecl BonesDefMod::RemoveBone(int)" (?RemoveBone@BonesDefMod@@QEAAXH@Z)    SamplePlugin    C:\Users\Mehdi\Documents\Visual Studio 2015\Projects\SamplePlugin\Source.obj    1

Severity    Code    Description    Project    File    Line    Suppression State
Error    LNK2001    unresolved external symbol "public: static class IObjParam * BonesDefMod::ip" (?ip@BonesDefMod@@2PEAVIObjParam@@EA)    SamplePlugin    C:\Users\Mehdi\Documents\Visual Studio 2015\Projects\SamplePlugin\Source.obj    1    

Это мое дополнительное включение:

F:\Software\3dsMax\SDK\3ds Max 2018 SDK\maxsdk\obj\x64\Release\bonesdef\
F:\Software\3dsMax\SDK\3ds Max 2018 SDK\maxsdk\include\XRef
F:\Software\3dsMax\SDK\3ds Max 2018 SDK\maxsdk\samples\modifiers\bonesdef
F:\Software\3dsMax\SDK\3ds Max 2018 SDK\maxsdk\include
%(AdditionalIncludeDirectories)

и Библиотека:

F:\Software\3dsMax\SDK\3ds Max 2018 SDK\maxsdk\lib\x64\Release
%(AdditionalLibraryDirectories)

Но никогда не в состоянии построить.У меня вопрос, как я могу настроить проект, чтобы я мог использовать (вызывать) функции BonesDef (Skin)?

1 Ответ

0 голосов
/ 08 августа 2018

Я наконец понял, как создать отдельный проект и включить функции BonesDef!Мы должны выполнить следующие шаги:

  1. Включить BonesDef.h.
  2. Создать статическую библиотеку BonesDef (.lib).
  3. Добавить эту библиотеку в настройки проекта/ Additional Library.
  4. Скопировать список зависимостей из проекта BonesDef / Additional Dependency и добавить его в наш проект.
  5. Добавить BonesDef.lib к параметру Additional Dependency.
...