PMXGfB^̃vOC@\(PEPlugin )ɂ


vOCƂ

ÅOg@\łB
vOC@\gƂɂAOPMXGfB^ɒǉ@\邱Ƃ\ɂȂ܂B


vOCłł邱

Eff[^(PMX)̎擾^CӕύX^XV
EGfB^{̂̈ꕔ
EPmxVieweVieẅꕔ

.NET̋@\͊{IɑSĎgp\Ȃ̂ŁACӂ̑tH[NҏW⏕sȂǂ\ƂȂ܂B
ꕔ@\ɐ\Ȃdl̕ύXꍇ܂B


쐬ɕKvȂ

.NETt[[N4.0ȏ̃NXCu쐬ł
etc) Microsoft VisualStudio.NET 2010 / Microsoft VisualC# 2010 Express Edition 

CSScriptvOCgp邱ƂŁAL̊JȂĂvOC@\𗘗p^쐬邱Ƃ͉\łB



(VC#2010̏ꍇ)

1. NXCuƂăvWFNg쐬
2. PMXGfB^"PEPlugin.dll"QƐݒ֒ǉ
3. 쐬郉CuNX"PEPlugin.IPEPlugin"A
@܂"PEPlugin.PEPluginClass"h"Run(IPERunArgs args)"\bhI[o[Ch

4. KvȏLqrh
5Doオ"*.dll"t@CPMXGfB^"plugin"tH_փRs[(zzDLLP̂ŔzzĂ)

vOCDLL̎sΏۊ "AnyCPU"  (x86Ɠ܂)
Ԃł̓rh"PEPlugin.dll"DLLƓꏊɐ(Rs[)邩܂񂪁A͕Kv܂B
̃vOCDLLPMXGfB^̃vOC쐬ɂ̂ݎgpĂB


vOC̋N@

1. "_plugin"tH_ɃvOCDLLۑAPMXGfB^ċN
2. [ҏW]-[vOC] j[ɃvOCo^Ă̂ŁACӂɋN

PMXGfB^NɓɎsvOC쐬\ł(q)
j[ւ̓o^CӂɕύX\ł



vOC̋N@ - ODLL̒ڎs

[ҏW]-[vOCDLL̒ڎs] 瑀tH[\̂ŁAΏۂDLLIŎsB

AxsvOCDLLPMXGfB^Ƀ[hꂽ܂܂ɂȂ̂(.NET̎dl)A
DLL̍XVsꍇ͖{̂̍ċNKvȖ͗lB



OubW@\ɂ

PEExBridge.dll Ɋ܂܂@\ŁAO̊JȂǂ璼ڃvOCAZus\ȋ@\B

LOsł̒ӓ_ʂA
xsAZuDLLA[ĥ悤Ȃ̂(ɂ͎dl̑啝ύXKv)
󎎍Iȋ@\ɗ܂܂B

gpɂ͂܂PMXGfB^s\ԂŋNKv܂B
Np[^"-ex"tċNƊO̎s\ԂɂȂ܂B

gƂẮANCAg PEExBridge.dll QƂA

1. PEExBridgeClient ̃CX^X
2. Connect() Őڑ - ڑłȂꍇ͗OI
PMXGfB^NĂꍇ͍ŏ(s\Ԃ)N{̂ΏہB
AUSIȂN̖̑{̂LɂȂ邱Ƃ͂܂B

3. RunPlugin() 琶vOCDLLƃvOCnĎs

ƂŊOCӂɃvOCs\łB

PMXGfB^_[tҏWȂǃ[_s̏ꍇ͂܂ȂƎv܂B

DLLA[h̖肪̂ŁAxsƓDLLt@CPMXGfB^烍bNXVłȂȂ܂B
JpƂĂ̎gp͓̂łӂB





vOC쐬TIPS

vOC̎śH
void Run(IPERunArgs args) \bh(ȉA֐)ɎsLqĂB
zXg(PMXGfB^)ւ̃ANZX Run֐ɓn IPERunArgs C^[tFCXʂčsƂł܂B


PMXf[^̕ҏW

vOCł PMXGfB^PMXff[^ԐړIɕҏW邱Ƃ\łB菇ƂẮA
IPERunArgs.Host.Connector.Pmx ȉ̊ep܂B

1. ݂PMXf[^̕擾 : IPXPmx IPXPmxConnector.GetCurrentState()
2. IPXPmx Ƃ PMXff[^Ԃ̂łʂĕҏW(PMXGfB^͕ύXȂ)
3. ҏWꂽIPXPmxf[^PXGfB^XV : void IPXPmxConnector.Update(****)  // ނ܂


) fύXꍇ

// PEPluginClassh̃I[o[Ch
public override void Run(IPERunArgs args)
{
    try{
        // ݂PMXf[^𕡐擾
        PEPlugin.Pmx.IPXPmx pe = args.Host.Connector.Pmx.GetCurrentState();

        // fύX
        pe.ModelInfo.ModelName = "ύX܂";

        // ҏWfPMXGfB^XV
        args.Host.Connector.Pmx.Update(pe);
        // wb_̂ݍXVꍇ(XVΏۂ肳ĂׂyȂ܂)
        //args.Host.Connector.Pmx.Update(pe, PEPlugin.Pmx.PmxUpdateObject.ModelInfo, -1);

        // GfB^̕\XVꍇ(ꕔĕ\XV̕Kv܂ | FormXV͋dl݊p:Pmd)
        args.Host.Connector.Form.UpdateList(PEPlugin.Pmd.UpdateObject.Header);
    }
    catch {
        // OLb`:KXݒ肵Ă
    }
}




r_ɂ

IuWFNg̊Ǘ͌JĂC^[tFCXčsdlȂ̂ŁA
ڃCX^X͐ł܂B

IuWFNg̒ǉ╡Ȃǂł͐p̃r_琶Kv܂B

PMXp̊eIuWFNg

  PEPlugin.PEStaticBuilder.Pmx

琶ł܂B

dl IPEVector3 ȂǃxNglnC^[tFCX V3() ȂǎĂNXőp\ł(ڂ"CSScript.txt"Q)




vOCIvV̕ύX

IPEPluginOption y PEPluginOption pĐݒ肵܂Bȉ̃IvVڂύX\łB

EPMXGfB^NɃvOCs
Ej[ւ̓o^̉
Ej[֓o^eLXg(̏ꍇ̓vOCo^܂)


IPEPluginOption  // IvVe
bool Bootup { get; }  // Ns
bool RegisterMenu { get; }  // vOCj[ւ̓o^
string RegisterMenuText { get; }  // vOCj[ւ̓o^eLXg(̏ꍇ̓vOCgp)

vOCNX IPEPlugin.Option Cӂ̃IvVݒ̒lԂ悤ɎĂB
PEPluginOption h̏ꍇ͈ȉ̂悤ɃRXgN^ɂ m_option Đݒ肷邱ƂłΉ\łB


) m_optionĐݒ肵ăIvVύX

// PEPluginClasshNX
public class NewPlugin : PEPluginClass
    // RXgN^
    public NewPlugin() : base()
    {
        // Bootup:false | RegistMenu:true | RegistMenuText:"VKvOC"
        //  j["VKvOC"œo^j[sBNɂ͎sȂB
        m_option = new PEPluginOption(false, true, "VKvOC");
    }
}



ƎNXւ̃vOCC^[tFCX̎(p)

evOCŎgpNXPMXGfB^̃vOCC^[tFCXꍇA
vOCverUP(C^[tFCXւ̔Cӂ̒ǉȂ)ɂ
ȍ~̃o[Wł͎gp邱Ƃ̂łȂJvOCƂȂĂ܂Ƃ܂B

PEPlugin.IPEPlugin ȊO͋ɗ͎(p)sȂƂ𐄏܂B





PMXf[^\

܂PMXGfB^{̂̊e^uɑΉf[^\ɂȂĂ܂B


IPXPmx vOCpPMXC^[tFCX

Ewb_
IPXHeader Header { get; }

Ef
IPXModelInfo ModelInfo { get; }

E_Xg
IList<IPXVertex> Vertex { get; }

EގXg(ʂ͍ގ)
IList<IPXMaterial> Material { get; }

E{[Xg
IList<IPXBone> Bone { get; }

E[tXg
IList<IPXMorph> Morph { get; }

E\gXg
IList<IPXNode> Node { get; }

ẼXg
IList<IPXBody> Body { get; }

EJointXg
IList<IPXJoint> Joint { get; }

ESoftBodyXg
IList<IPXSoftBody> SoftBody { get; }


eC^[tFCX̌ʃf[^ɂĂ̐́A
vOCDLLIuWFNguEUȂǂŊmFȂǂĂ({Iɂ̓GfB^{̂Ɠ\ɂȂĂ܂)



try-catch ̃XX

vOCPMXGfB^NꍇAvOCŔOߑ邱ƂłȂ悤ł(vǉ)

ꍇɂẮAł̗OɂPMXGfB^{̂IĂ܂ꍇ邩܂̂ŁA
Run()֐ɂẮAKOɂėOߑĂ(XbhԏɂĂl)




\̍XV

PMXf[^̍XVsGfB^{̂mFĂAΉӏύXĂȂꍇ܂B
eViewȂǂ̑łlɃf̕\ɕύXȂꍇ܂B

͓f[^̕ύXXgViewɔfĂȂ󋵂ɂȂ܂(Ȃ炩̑ƍXV)

ȉ̂悤Ȋ֐gƂœKXXV܂B
IPXPmxViewConnector.UpdateModel()
IPEFormConnector.UpdateList()
IPEFormConnector.Selected****Index()
IPXPmxViewConnector.UpdateView()
XVn



Form𗘗pvOC쐬

CӂFormNX𗘗pvOC쐬邱Ƃ\łB

ƂāANXCuɔCӂ̃tH[ǉꍇ́A
ȉ̂悤Ȏ菇ŃvOCgƂ\ƂȂ܂B

ۂ͂̑ɁAǉtH[ɃzXgƂł悤Ȏdg݂KvɂȂ܂B


)
1. NXCuNsɃIvVݒ(j[ɂo^)
2. NXCuFormǉ
3. Run֐ɋNƃj[Ăяoł̕򂵂Lq

// N
if (args.IsBootup) {
    // tH[̏
    m_form = new *****Form();
    // tH[փzXgIuWFNg̒ʒmȂ
    ....
}
// j[Ăяo
else{
    // tH[̕\Ԃ̕ύX
    m_form.Visible = !m_form.Visible;    // \Ԃ̐؂ւ
}

4. tH[{^ŔjȂ悤ɕύX(Form.FormClosingCxgǉ)
if (e.CloseReason == CloseReason.UserClosing) {
    // N[YLZ
    e.Cancel = true;
    // tH[\ݒ
    this.Visible = false;
}

5. Dispose()I[o[ChAtH[̌n(Form.Close())


̋@\𗘗p邱ƂŁAPMXGfB^{̂
̃GfB^@\ǉ邱Ƃ\ɂȂ܂B




ߋverƂ̌݊

vOC@\ PMXGfB^ ̑Ogł PMDGfB^ ɎĂ@\̂܂܈pł܂B
View֌WȂǂ̓KV[̂܂

vOC̓ɂ͍Œ 64bitւ̈ڍsKvɂȂ܂(ΉpAnyCPUō쐬ꂽvOC͂̂܂ܓ܂)

ȊO͊{Iɓ\œ삷Ǝv܂Aׂdl̕ύXȂǂ܂̂ŁA
삵Ȃ\\邱ƂɂӂB

SlimDX  DLL 𗘗pꍇ "o[W" ݒ False ɕύXĂƂŁA
GfB^̓DLLXVꂽꍇłpėpł悤ɂȂ邩܂B





ȏ


XV

0.0.6.0 PMXGfB^



