PMDGfB^̃vOC@\(PEPlugin )ɂ


vOCĉH

vOC@\gƂɂAOPMDGfB^ɒǉ@\邱Ƃ\ɂȂ܂B

PMXΉɂ]PMDpvOC̎gpł̓f[^lsɂȂꍇ܂B


vOCłł邱

EPMDf[^̎擾^CӕύX^XV
EGfB^{̂̈ꕔ
EPMDVieweVieẅꕔ

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


쐬ɕKvȂ

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

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



(C#2010̏ꍇ)

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

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

Ԃł̓rh"PEPlugin.dll"DLLƓꏊɐ(Rs[)邩܂񂪁A͕Kv܂B
̃vOCDLLPMDGfB^̃vOC쐬ɂ̂ݎgpĂB


vOC̋N@

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

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



vOC̋N@ - ODLL̒ڎs

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

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



OubW@\ɂ

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

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

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

gƂẮANCAg PEExBridge.dll QƂA

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

3. RunPlugin() 琶vOCDLLƃvOCnĎs

ƂŊOCӂɃvOCs\łB

PMDGfB^\ҏWȂǃ[_s̏ꍇ͂܂ȂƎv܂B

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





vOC쐬TIPS

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


PMDf[^̕ҏW

!!!
݂PMDGfB^ł͓tH[}bgPMXƂȂAPMD̓G~[gɂҏWs܂B
vOC@\ɂĂPMDp̃vOCPMXł삷悤ŒsĂ܂A
f[^tH[}bg̈Ⴂɂ萳ɓ삵Ȃڂ⌇鍀ڂ܂B

PMXɂĂ IPXPmx C^[tFCXp邱ƂŒڃvOC舵\łB
ڍׂɂĂ͉LuPMX(IPXPmx)ɂāvQƂĂB

APMXΏۂ̃vOC͑ΉPMDGfB^łPMDf̕ҏWł̂܂ܓ삷悤݌vĂ܂
(tH[}bg̈ႢȂǂɂ葽̖肪邩܂)
---!!!


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

1. ݂PMDf[^̕擾 : IPEPmd IPEPmdConnector.GetCurrentState()
2. IPEPmd Ƃ PMDff[^Ԃ̂łʂĕҏW(PMDGfB^͕ύXȂ)
3. ҏWꂽIPEPmdf[^PMDGfB^XV : void IPEPmdConnector.Update(****)  // ނ܂


) fύXꍇ

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

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

        // ҏWfPMDGfB^XV
        args.Host.Connector.Pmd.Update(pe);
        // wb_̂ݍXVꍇ(XVΏۂ肳ĂׂyȂ܂)
        //args.Host.Connector.Pmd.Update(pe, PEPlugin.Pmd.UpdateObject.Header, -1);

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



r_ɂ

̃vOCł́A舵f[^̂قڂׂĂC^[tFCX`ƂȂĂ̂ŁA
𒼐ڃCX^XĎ舵Ƃ͂ł܂B

vOCPMDf[^(IPEPmd) Ȃǂ̕ҏWŕKvɂȂeCX^X́A
zXgɓnr_pč쐬Kv܂B

IPERunArgs.Host.Builder ȉɊep֐܂B


) IPEVector3 ̍쐬 (Vector3f[^)

~:s\
IPEVector3 v = new IPEVector3();    // C^[tFCXȂ̂newł܂B

:\
IPEVector3 v = args.Host.Builder.CreateVector3();   // ̂悤Ƀr_ʂĐĂ


A{vOCŗpӂĂxNgnf[^͈ꎞۑp̋@\Ă܂̂ŁA
ۂ̉^pł͊eCuŗpӂĂxNgnf[^֕ϊĂgpB

SlimDX̒l^Ƃ̑݉^p\ȃNXIuWFNgĂ܂(ڂ"CSScript.txt"Q)

V[g̃r_ IPERunArgs.Host.Builder.SC ȉɎĂ܂B
PEStaticBuilder ƂzXgȂr_gƂ\ł(QƐ̓zXgƓ)



vOCIvV̕ύX

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

EPMDGfB^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)

̕ύXɂߋ쐬ꂽvOC͓sɂȂꍇ܂(vărh)

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ŎgpNXPMDGfB^̃vOCC^[tFCXꍇA
vOCverUP(C^[tFCXւ̔Cӂ̒ǉȂ)ɂ
ȍ~̃o[Wł͎gp邱Ƃ̂łȂJvOCƂȂĂ܂Ƃ܂B

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





PMDf[^\

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

ef[^Ԃ̑Ή̓XgłIndexpĂ̂ŁA
Xg̏ύXǉ^폜Ȃǂł͑ΉSẲӏύXKv܂
vOCł͎IɑΉ܂̂łӂ(GfB^{̂̑ł͓ŐIɒĂ܂)


IPEPmd vOCpPMDC^[tFCX

Ewb_(f^Rg^pΉ)
IPEHeader Header { get; }

E_Xg
IList<IPEVertex> Vertex { get; }

Eʒ_Xg
IList<int> Face { get; }

EގXg
IList<IPEMaterial> Material { get; }

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

EIKXg
IList<IPEIK> IK { get; }

E\Xg
IList<IPEExpression> Expression { get; }

E\gXg
IList<int> FrameExpression { get; }

E\gXg
IList<IPEFrameBone> FrameBone { get; }

EToonꗗ[10]
string[] ToonName { get; }

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

EJointXg
IList<IPEJoint> Joint { get; }


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

0.0.0.2\̊ǗIndexɂāAPMDGfB^vOCɍ킹ĕύXBق͂ȂȂ܂



try-catch ̃XX

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

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




\XVȂII

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

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

ȉ̂悤Ȋ֐gƂœKXXV܂B
IPEPMDViewConnector.UpdateModel()
IPEFormConnector.UpdateList()
IPEFormConnector.Selected****Index()
IPEPMDViewConnector.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邱ƂŁAPMDGfB^{̂
̃GfB^@\ǉ邱Ƃ\ɂȂ܂B





PMDf̊ȈՃf[^t[

㗬ύXꍇȂΏۗvfύXKv܂B
)Xgr̃{[폜XgԂύXɂȂ̂ŁÃ{[IndexSčĒ(폜ԍȍ~S-1)

----
{[

 _(XLjO) 

 IK

 \g

   WCg

----
ގ  (ʒ_)

----
_

 (ʒ_Index)

 \

----
\  \g





gPMD(IPEXPmd)ɂ - eXtend PMD

0.0.0.3ȍ~AIuWFNgQƘA^̊gPMDvOCɎ܂B
ʏPMD(IPEPmd)ƈقȂ_͈ȉ̂悤ɂȂ܂B


----

EIuWFNgԂ̎Qƕ@
ʏPMD(IPEPmd)  : XgIndexl
gPMD(IPEXPmd) : eIuWFNg𒼐ڎQ

E(ʒ_Index)̈
ʏPMD(IPEPmd)  : _IndeẍꊇXg\Aގ̐ݒɂ؂萔肳
gPMD(IPEXPmd) : eގɊi[A3_1g̏|SƂĊǗ(Ώے_̓IuWFNgQ)

EXgւ̗vfǉ^}
ʏPMD(IPEPmd)  : ֘ASĂIndexv
gPMD(IPEXPmd) : ǉvf̎Qƒl̂ݐݒŏ\

EXgvf̏ύX
ʏPMD(IPEPmd)  : ֘ASĂIndexv
gPMD(IPEXPmd) : ǉύX̕KvȂBA{[̂悤ɏʉʂɂē삪قȂꍇ͒ӂKv

EXgvf̍폜
ʏPMD(IPEPmd)  : ֘ASĂIndexv
gPMD(IPEXPmd) : Xgł̎QƂ͍XVȂ(nullĐݒ萄)BPMDϊ̐KɂĎ

EXgvf̃IuWFNgւ
ʏPMD(IPEPmd)  : Index̕KvȂ
gPMD(IPEXPmd) : QƑSėvύXBT|[g݂͌̂Ƃ떢

EXV
ʏPMD(IPEPmd)  : ʂɍXV\
gPMD(IPEXPmd) : ŜxɍXVKv(ʍXVs\)

EPMDւ̕ϊ
ʏPMD(IPEPmd)  : ʕϊ̏ꍇ͌y
gPMD(IPEXPmd) : KꊇϊsKv̂ŔrIdȂ

----



gPMDł̗vfҏWłIndex̕KvȂ̂ŁAXgrւ̑}A
Cӂ̗\̒ǉ^폜ȂǂrIeՂɍsƂ\łB

ʁAړIɃIuWFNgQƂ̂ŁAȂǂɂĕsӂɎQƒlOĂ܂ꍇ܂B
QƂ̏ꍇPMDϊɎIɍ폜鍀ڂ̂łӂB

Kɂ
K菇
1.QƐ撸_݂Ȃꍇ -> :폜 \:_ItZbg폜
2.QƐ{[݂Ȃꍇ -> _:0ԌŒ {[e:-1 {[q:0 {[IKe:0 IK_IK:IK폜 IK_Target:IK폜 IK_Link:Link폜 {[g:폜 :
3.QƐ\݂Ȃꍇ -> \g:폜
4.QƐ捄݂̂Ȃꍇ -> Joint:0ԍ




PMX(IPXPmx)ɂ

PMXҏWΏۂƂvOCC^[tFCXłB

{Iȃf[^\舵@ɂĂ͏LPMDڂPMDGfB^̕ҏWʋyPMXdlQlɂĂB
ef[^̎舵ɂẮA傤ǒʏPMD(IPEPmd)ƊgPMD(IPEXPmd)nCubh`ɂȂĂ܂B

Ef[^̐ڑ F IuWFNgQ | gPMD
Eʂ̎舵 : ގɒ_QƂ̃XgǗ | gPMD
EXVΏ : \gȂǈꕔČʂɍXV\  | ʏPMD

PMDGfB^PMXҏWƂ͌`قȂ̂ŒӂĂ(PMXҏWIndexł̃f[^ڑAʂPMD̈ꊇXgɂȂĂ܂)

܂EFCglό`@\̎舵ȂPMDƂ͍וł̈Ⴂ̂łӂB

sPMDGfB^łPMXWtH[}bgƂȂĂ̂ŁAvOC@\͑SPMX(IPXPmx)ł̍쐬]܂Ǝv܂B

PMDf͓ňUPMX֕ϊAo͎ɍēxPMD֖߂dlȂ̂ŁAPMXp̃vOĈ܂ܓKp邱Ƃ\łB






C|[g^GNX|[gvOCɂ

PMXC^[tFCXł́AC|[g^GNX|[gΏۃt@Cg邽߂̃vOC@\łB

PEPlugin.IPEImportPlugin : C|[gpvOCC^[tFCX
PEPlugin.IPEExportPlugin : GNX|[gpvOCC^[tFCX

ꂼNXAZu(*.dll)ʏvOCƓl"plugin"tH_(NO)zuĂƁA
Ώۃt@C`̃C|[g^GNX|[gvOČĂяos܂B

C|[g^GNX|[g̓t@CgqŌĂяo𔻕ʂĂ̂ŁAgqɑ΂ĕ̃vOCo^邱Ƃ͂ł܂B
gqɑ΂ĕ̃C|[g^GNX|[gvOCzuĂꍇNɃG[\܂(o^D)

PMDGfB^ł́AD&Dɂt@CI[vȂǂC|[gփ_CNĝŁA
vOCǉɂΏۃt@CgĂꍇ͂̌Ăяos܂B

܂C|[g̒ǉC|[g@\PMD/PMX/XƓlɑΏۂƂ܂B


Caption^Ext vpeBɂ

C|[g^GNX|[gC^[tFCXł͋ʂ

Caption : t@C
Ext : t@Cgq(".***")  :PMD -> ".pmd"

ƂvpeBKv܂B
Ext(gq)̓vOCĂяoł̔ʂɎgp܂B啶͋ʂ܂B
Caption  Ext Ƃ킹āAt@C_CAÕtB^\Ŏgp܂('|'͎gps)


Import

PEPlugin.Pmx.IPXPmx Import(string path, PEPlugin.IPERunArgs args)

t@CpX(path)  PMXIuWFNgւ̕ϊ̋LqKvłB
PMXIuWFNgɂĂ̓r_璼ڐĂBzXg擾IuWFNgł͐ɓ삵܂B

null ߂ƃG[Ƃ݂ȂAC|[g𒆒f܂B

args ͒ʏvOCƓ悤ɃzXǧĂяoɗp\łAԂ̕ύXȂǈӐ}Ȃ͍sȂłB


Export

void Export(PEPlugin.Pmx.IPXPmx pmx, string path, PEPlugin.IPERunArgs args)

nPMXIuWFNgƕۑt@CpXKXϊĕۑĂB

args ̎舵ImportƓlłB
















XV

0.0.4.5 C|[g^GNX|[gǉ
0.0.4.0 PMXΉ
0.0.3.0 VMD^VME^Os@\ǉ
0.0.1.0 FXg
0.0.0.4 ڍs
0.0.0.3 gPMDǉBsC
0.0.0.2 \^\g̎舵ύX(PMDGfB^̕ύX)
0.0.0.1 ŌJ()



