DLL plug-in interface is a new, faster and more elaborate plug-in interface for JED. However, there's a tradeoff - you'll need to know quite a bit of programming and use some "real" programming language to be be able to use it. Note that this interface is an addition to the old OLE interface, not the replacement. You can use the plug-ins of both types at the same time.
In order to be able to create this new type of plug-ins you need a programming language that can create Windows 95 DLLs (Dynamic Link Libraries) and support Microsoft COM (Common Object Model) interface. That includes C++ and Delphi 2.0+, at least. However at this time (version 0.91) only Delphi 2.0 and 3.0 interface units are provided. It shouldn't be too hard to translate them to C++ headers though. I hope to do it in later versions.
Unfortunately, I don't have time to explain the whole things in details, so here's some key point that hopefully should be enough to get you started.
The way the plug-in interface works is the following - you place a .DLL of a plugin to the JED's plug-in directory (along with optional .DSC file, which is the same as for OLE plug-ins) and it shows up in Plugins menu in JED. When you select the plug-in in the menu, JED loads the .DLL to memory, and invokes the function in your DLL named "JEDPluginLoad", passing a COM interface object as a parameter to it. You can use this object to access JED's data and functions, much like the TJEDApp object in OLE plug-ins. The function should return true if your plug-in worked successfully and false if some error occured (that'll just make JED report the error, you can report it yourself and just return true always).
A note - when you select plug-in in Plugins menu second, third, etc. time, JED uses the already loaded DLL (so your variable will have the values you left in them after your plug-in worked the first time). In some cases you might need to handle this situation in some special way.
The COM interface object passed to JEDPluginLoad function is the key to the entire interface with JED. Oops! I just realized something. I forgot to add "stdcall;" to the declaration of JEDPluginLoad function type, so JED calls it using Delphi call convention, passing parameters via registers. Ahem... Well, I can fix it in the next version by allowing to have an alternative function JEDPluginLoadNew() or something. For now it look like you'd have to use Delphi to make JED plug-ins. Or maybe C-style register call convention is compatible with it? Oh, well.
Anyway, that interface object passed to JEDPluginLoad is declared in the interface units provided as object IJED. Here's the quick description of function whose purpose/parameters are not too obvious.
Function GetLevel:IJEDLevel;
Procedure GetLevelHeader(var lh:TLevelHeader;flags:integer); Procedure SetLevelHeader(const lh:TLevelHeader;flags:integer); Procedure GetSector(sec:integer;var rec:TJEDSectorRec;flags:integer); [...]
Function FindCollideBox(sec:integer;const bbox:TJEDBox;cx,cy,cz:double;var cbox:TJEDBox):boolean;Finds sector's collide box. bbox is sector's bounding box (returned by FindBBox() ).
Procedure RotatePoint(ax1,ay1,az1,ax2,ay2,az2:double;angle:double;var x,y,z:double);
IsPointOnSurface(sc,sf:integer;x,y,z:double):boolean;
Function CleaveSurface(sc,sf:integer; const cnormal:TJEDvector; cx,cy,cz:double):integer; Function CleaveSector(sec:integer; const cnormal:TJEDvector; cx,cy,cz:double):integer; Function CleaveEdge(sc,sf,ed:integer; const cnormal:TJEDvector; cx,cy,cz:double):boolean;
Procedure CalculateDefaultUVNormals(sc,sf:integer; orgvx:integer; var un,vn:TJEDVector); Procedure CalcUVNormals(sc,sf:integer; var un,vn:TJEDVector); Procedure ArrangeTexture(sc,sf:integer; orgvx:integer; const un,vn:TJEDvector); Procedure ArrangeTextureBy(sc,sf:integer;const un,vn:TJEDvector;refx,refy,refz,refu,refv:double);
Procedure RemoveSurfaceReferences(sc,sf:integer); Procedure RemoveSectorReferences(sec:integer;surfs:boolean);ct;