注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[3dmax] export plugin template  

2011-12-06 16:52:54|  分类: 3d_3dmax |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
可以为3dmax写各种plugin,我们最常用的就是导出插件。

通过 LibClassDesc() 得到一个 ClassDesc *,然后再获得具体的 SceneExport *
---------------------------------- DllMain.h -----------------------------------
#pragma once

#include <max.h>
#include <iparamb2.h>  // class ClassDesc2

#define KSDLL_EXPORT __declspec(dllexport)
---------------------------------- DllMain.cpp -----------------------------------
#include "DllMain.h"
#include "ExportVertex.h"

#pragma comment(lib, "core.lib")
#pragma comment(lib, "maxutil.lib")
#pragma comment(lib, "paramblk2.lib")  // ClassDesc2

static HINSTANCE g_hInstance = NULL;

class ExportVertexDesc : public ClassDesc2
{
public:
    virtual int IsPublic() { return TRUE; }
    virtual void* Create(BOOL loading = FALSE) { return new ExportVertex(); }
    virtual const TCHAR* ClassName() { return _T("ExportVertex ClassDesc2::ClassName"); }
    virtual SClass_ID SuperClassID() { return SCENE_EXPORT_CLASS_ID; }
    virtual Class_ID ClassID() { return Class_ID(0x76e74878, 0x6b1b735a); }
    virtual const TCHAR* Category() { return _T("ExportVertex ClassDesc2::Category"); }

    virtual const TCHAR* InternalName() { return _T("ExportVertex ClassDesc2::InternalName"); }
    HINSTANCE HInstance() { return g_hInstance; }
};

static ExportVertexDesc g_exportVertexDesc;

BOOL WINAPI DllMain(HINSTANCE hinstDLL, ULONG fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        g_hInstance = hinstDLL;
        DisableThreadLibraryCalls(hinstDLL);  // disable DLL_THREAD_ATTACH and DLL_THREAD_DETACH notifications
        break;
    }

    return TRUE;
}


#ifdef __cplusplus
extern "C" {
#endif

KSDLL_EXPORT int LibInitialize(void)
{
    return 1;
}

KSDLL_EXPORT int LibShutdown(void)
{
    return 1;
}

KSDLL_EXPORT const TCHAR* LibDescription()
{
    return _T("Kasicass' 3DMax Plugin!");
}

KSDLL_EXPORT int LibNumberClasses()
{
    return 1;
}

KSDLL_EXPORT ClassDesc* LibClassDesc(int i)
{
    switch (i)
    {
    case 0: return &g_exportVertexDesc;
    default: return NULL;
    }
}

// max用来识别plugin编译时SDK版本的
KSDLL_EXPORT ULONG LibVersion()
{
    return VERSION_3DSMAX;
}

#ifdef __cplusplus
}
#endif
---------------------------------- ExportVertex.h -----------------------------------
#pragma once

#include "DllMain.h"

class ExportVertex : public SceneExport
{
public:
    ExportVertex() {};
    virtual ~ExportVertex() {};

    virtual int ExtCount() { return 1; }
    virtual const TCHAR *Ext(int n) { return (n == 0) ? _T("KSVERTEX") : _T(""); }

    virtual const TCHAR *LongDesc()   { return _T("KSVertex, haha!"); }
    virtual const TCHAR *ShortDesc()  { return _T("KSVertex"); }
    virtual const TCHAR *AuthorName() { return _T("kasicass"); }
    virtual const TCHAR *CopyrightMessage() { return _T("nothing!"); }
    virtual const TCHAR *OtherMessage1() { return _T(""); }
    virtual const TCHAR *OtherMessage2() { return _T(""); }
    virtual unsigned int Version() { return 100; }        // v1.00 = 100

    virtual void ShowAbout(HWND hWnd) {}                // optional

    virtual int DoExport(const TCHAR *name, ExpInterface *ei, Interface *i, BOOL suppressPrompts=FALSE, DWORD options=0);
    virtual BOOL SupportsOptions(int ext, DWORD options);
};
---------------------------------- ExportVertex.cpp -----------------------------------
#include "ExportVertex.h"

// 导出场景数据
// name, filename
// ei, 用于遍历场景对象
// i, 用于调用3dmax的一些接口
// options, 同SupportsOptions
// 返回值, IMPEXP_FAIL/IMPEXP_SUCCESS/IMPEXP_CANCEL
int ExportVertex::DoExport(const TCHAR *name, ExpInterface *ei, Interface *i, BOOL suppressPrompts, DWORD options)
{
    ::MessageBox(NULL, name, _T("Export it!"), MB_OK);
    return IMPEXP_SUCCESS;
}

// 检测Plugin是否支持某个特性
// options, 目前只有 SCENE_EXPORT_SELECTED(导出选中物体) 这么一个选项
BOOL ExportVertex::SupportsOptions(int ext, DWORD options)
{
    if (ext == 0 && options == SCENE_EXPORT_SELECTED)
        return TRUE;

    return FALSE;
}
---------------------------------------------------------------------------------------------

编译好 .dle,放到 3dmax\plugins 目录。
然后启动 3dmax,选择 File => Export ...
[3dmax] export plugin template - kasicass - Code@Pig Home
 
编译过程中可能会碰到
unresolved external symbol "public: virtual wchar_t * __thiscall ClassDesc::GetRsrcString
请把 charset 设置为 Use Multi-Byte Character Set。(shit! 既然Unicode编译不过,搞毛TCHAR)

注意 LibXXX 那几个对外接口,要用 extern "C" 筐起来。

参考资料
3ds Max Programmer's SDK
  Getting Started
    Fundamental Concepts of the SDK
      Required DLL Functions

3ds Max Programmer's SDK
  Getting Started
    Fundamental Concepts of the SDK
      Class Descriptors

3ds Max Programmer's SDK
  Getting Started
    Fundamental Concepts of the SDK
      SDK Library File Descriptions
  评论这张
 
阅读(1316)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017