Comment faire un PlugIn pour Deled

Partagez votre expérience de PureBasic avec les autres utilisateurs.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Comment faire un PlugIn pour Deled

Message par comtois »

Pour ceux qui connaissent Deled (un excellent éditeur 3D), vous savez sans doute qu'il est possible de développer ses propres plugins.

J'ai commencé ce soir par curiosité, je n'ai pas été très loin, pour l'instant je me contente d'envoyer une requête et d'afficher la réponse dans un MessageRequester. Pour ceux qui ont du courage, il est possible d'écrire ses propres plugins pour importer ou exporter dans un format particulier, ou encore modifier la scène en cours d'édition. Les échanges entre le PlugIn et Deled se font en XML !
C'est pas cool ça ? Bref voila le début de mon code, des fois que ça intéresse quelqu'un de bosser sur le sujet :)


Il faut compiler avec le format de l' exécutable = Shared Dll.
Et ensuite il suffit de copier la Dll dans le répertoire PlugIn de Deled et de lancer Deled , pour vérifier si le plugIn est correctement chargé allez dans le menu de Deled Plugins --> Plugin information, vous devriez apercevoir votre plugin avec ses caractéristiques.

Pour voir une réponse intéressante, créer une nouvelle scène et ajouter un objet (Un cube par exemple) puis lancez le plugIn.

Par exemple en ajoutant un simple rectangle, j'obtiens la réponse :

Code : Tout sélectionner

---------------------------
Réponse CallBack
---------------------------
<scene version="1.6">

  <primitives highestID="1">

    <primitive id="1" name="rectangle1" type="rectangle" visible="true" snap="vertex" autoUV="true" groupID="-1">

      <tag>User info</tag>

      <vertices>

        <vertex id="0" x="-384" y="192" z="0" />

        <vertex id="1" x="128" y="192" z="0" />

        <vertex id="2" x="128" y="-320" z="0" />

        <vertex id="3" x="-384" y="-320" z="0" />

      </vertices>

      <polygons>

        <poly mid="0">

          <vertex vid="0" u0="-3" v0="-1.5" />

          <vertex vid="1" u0="1" v0="-1.5" />

          <vertex vid="2" u0="1" v0="2.5" />

          <vertex vid="3" u0="-3" v0="2.5" />

        </poly>

      </polygons>

    </primitive>

  </primitives>

</scene>
---------------------------
OK   
---------------------------

ATTENTION : Je n'ai pas lu toute la doc, j'ai sûrement oublié de faire des trucs, et je n'ai pas testé à fond ce début d'essai .

Code : Tout sélectionner

;This chapter lists all methods that should be exported through a DeleD plugin DLL file.

Enumeration 
#PR_GETMEM 
#PR_GETDATA 
#PR_SETDATA 
EndEnumeration

Structure TCallBackRecord 
   RequestID.l    ;reason for executing callback (0,1 or 2)
   *RequestXML    ;XML Data send by the plugin To DeleD
   *ResponseXML   ;XML data send by DeleD to the plugin
   ResponseSize.l ;size of the response XML data in bytes
EndStructure

Global PluginName.s
Global PluginDescription.s
Global PluginDeleDVersion.s
Global PluginVersion.s
Global PluginAuthor.s
Global PluginEmail.s

Prototype TCallBackProc(*ACallBackRecord.TCallBackRecord) 
Global DeledCallBack.TCallBackProc 
ProcedureDLL PluginName()
  ;This function returns a pointer To a character string 
  ;containing the name of the plugin As being displayed 
  ;in the Plugin menu With DeleD. Typically, 
  ;this character string is between 10 And 20 characters in size. 
  PluginName = "PlugIn PureBasic"
  ProcedureReturn @PluginName 
EndProcedure

ProcedureDLL PluginDescription()
  ;This function returns a pointer To a character string 
  ;containing the description of the plugin. 
  ;This description is displayed in the Plugin window within DeleD. 
  PluginDescription = "Description"
  ProcedureReturn @PluginDescription
EndProcedure

ProcedureDLL PluginDeleDVersion()
  ;This function returns a pointer To a character string 
  ;showing the minimal version of DeleD needed To execute this plugin. 
  ;DeleD uses this version number To determine If the plugin can be run And thus, 
  ;If it should be listed in the Plugin menu. 
  PluginDeleDVersion = "1.7"
  ProcedureReturn @PluginDeleDVersion
EndProcedure

ProcedureDLL PluginVersion()
  ;This function returns a pointer To a character string 
  ;showing the current version of the plugin itself. 
  PluginVersion = "1.0 beta 1"
  ProcedureReturn @PluginVersion
EndProcedure

ProcedureDLL PluginAuthor()
  ;This function returns a pointer To a character string 
  ;showing the name of the author of the plugin. 
  PluginAuthor = "Comtois"
  ProcedureReturn @PluginAuthor
EndProcedure

ProcedureDLL PluginEmail()
  ;This function returns a pointer To a character string 
  ;showing the emailaddress of the author of the plugin. 
  PluginEmail = "Comtois@Truc.fr"
  ProcedureReturn @PluginEmail
EndProcedure

ProcedureDLL PluginSetCallback(aCallBackProc.TCallBackProc)
  ;At startup, DeleD initializes all available plugins And calls 
  ;the PluginSetCallback routine automatically For each plugin. 
  ;This Procedure saves a pointer To DeleD's callback routine 
  ;(As provided in the TCallBack parameter) into a parameter local To the plugin. 
  ;The plugin then uses that local parameter To issue a callback To DeleD.
  DeledCallBack = aCallBackProc 
EndProcedure

ProcedureDLL PluginExecute(); stdcall;
  ;This Procedure is executed when the user executes a plugin 
  ;from the Plugin menu within DeleD. 

  ;
  Protected MaVariable.TCallBackRecord


  If OpenWindow(0, 0, 0, 222, 200, "ButtonGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
    ButtonGadget(1, 10,  40, 200, 20, "Quitter", #PB_Button_Left)
    
    ;CallBack
    MaVariable\RequestID = #PR_GETMEM
    Texte$= "<request> <primitives subset="+Chr(34)+"all"+Chr(34)+ "retrieveID="+Chr(34)+"false"+Chr(34)+ "/> </request>"
    MaVariable\RequestXML = @Texte$
    
    DeledCallBack(@MaVariable)
    MaVariable\ResponseXML=AllocateMemory(MaVariable\ResponseSize)
    MaVariable\RequestID = #PR_GETDATA
    DeledCallBack(@MaVariable)
    MessageRequester("Réponse CallBack",PeekS(MaVariable\ResponseXML),0)
    FreeMemory(MaVariable\ResponseXML)
    
    Repeat 
      event = WindowEvent()
      Select event
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 1
              Quit = 1
          EndSelect
      EndSelect        
    Until quit
    CloseWindow(0)
  EndIf

EndProcedure
Dernière modification par comtois le mer. 01/août/2007 19:43, modifié 2 fois.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Deled est en effet très bon produit, il sert beaucoups pour la modélisation de monde
pour des imports dans des jeux par exemples. Une de ces principales utilité, c'est le lightmapping,
qu'il fait très bien.

La creation de plugin sous cet outil peut etre très interessant. Si j'ai un peu de temps devant
moi d'ici à ce WE, je teste ton code, pour voir si je peux t'aider... ;)

(je m'étais essayé il y a quelques années a faire un plugin pour Milkshape, ce qui est plutot facile
avec ce modeleur...)
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Ben là aussi ça a l'air facile, tout est en XML , aussi bien les requêtes que les réponses ,et depuis que PB a une lib XML c'est que du bonheur :)

Il faut encore bosser le sujet pour mieux comprendre les données reçues, et comment agir dessus, l'été n'est pas une saison propice pour ça, j'ai trop de choses à faire pour m'attarder là dessus :)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Comme tu dis, le temps nous est compté et très limité, mais je vais quand même
essayer un petit peu, même si je ne vais pas jusqu'au fond du truc, pouvoir acquerir des
connaissances supplementaires sur un logiciel comme cela c'est toujours un plus
indiscutable, surtout pour moi qui évolue quasiment 100% dans l'univers 3D ....

8)
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Cette version affiche la scène dans un TreeGadget, et utilise la lib XML pour parser la réponse. Freak a mis à jour la lib, j'espère qu'avec la nouvelle version je n'aurai plus le status = 4 :)

Code : Tout sélectionner

;Comtois le 03/08/07
;PureBasic 4.10 beta 2

;This chapter lists all methods that should be exported through a DeleD plugin DLL file.

Enumeration 
#Panel
#Button
#TreePrimitive
#TreeMaterial
#TreeLight  
EndEnumeration


Enumeration 
#PR_GETMEM 
#PR_GETDATA 
#PR_SETDATA 
EndEnumeration

Structure TCallBackRecord 
   RequestID.l    ;reason for executing callback (0,1 or 2)
   *RequestXML    ;XML Data send by the plugin To DeleD
   *ResponseXML   ;XML data send by DeleD to the plugin
   ResponseSize.l ;size of the response XML data in bytes
EndStructure

Global PluginName.s
Global PluginDescription.s
Global PluginDeleDVersion.s
Global PluginVersion.s
Global PluginAuthor.s
Global PluginEmail.s

Prototype TCallBackProc(*ACallBackRecord.TCallBackRecord) 
Global DeledCallBack.TCallBackProc 

ProcedureDLL PluginName()
  ;This function returns a pointer To a character string 
  ;containing the name of the plugin As being displayed 
  ;in the Plugin menu With DeleD. Typically, 
  ;this character string is between 10 And 20 characters in size. 
  PluginName = "PlugIn PureBasic"
  ProcedureReturn @PluginName 
EndProcedure

ProcedureDLL PluginDescription()
  ;This function returns a pointer To a character string 
  ;containing the description of the plugin. 
  ;This description is displayed in the Plugin window within DeleD. 
  PluginDescription = "Description"
  ProcedureReturn @PluginDescription
EndProcedure

ProcedureDLL PluginDeleDVersion()
  ;This function returns a pointer To a character string 
  ;showing the minimal version of DeleD needed To execute this plugin. 
  ;DeleD uses this version number To determine If the plugin can be run And thus, 
  ;If it should be listed in the Plugin menu. 
  PluginDeleDVersion = "1.7"
  ProcedureReturn @PluginDeleDVersion
EndProcedure

ProcedureDLL PluginVersion()
  ;This function returns a pointer To a character string 
  ;showing the current version of the plugin itself. 
  PluginVersion = "1.0 beta 1"
  ProcedureReturn @PluginVersion
EndProcedure

ProcedureDLL PluginAuthor()
  ;This function returns a pointer To a character string 
  ;showing the name of the author of the plugin. 
  PluginAuthor = "Comtois"
  ProcedureReturn @PluginAuthor
EndProcedure

ProcedureDLL PluginEmail()
  ;This function returns a pointer To a character string 
  ;showing the emailaddress of the author of the plugin. 
  PluginEmail = "Comtois@Truc.fr"
  ProcedureReturn @PluginEmail
EndProcedure

ProcedureDLL PluginSetCallback(aCallBackProc.TCallBackProc)
  ;At startup, DeleD initializes all available plugins And calls 
  ;the PluginSetCallback routine automatically For each plugin. 
  ;This Procedure saves a pointer To DeleD's callback routine 
  ;(As provided in the TCallBack parameter) into a parameter local To the plugin. 
  ;The plugin then uses that local parameter To issue a callback To DeleD.
  DeledCallBack = aCallBackProc 
EndProcedure


Procedure AddNode(Tree,*Node, Position)
  name$ = GetXMLNodeName(*Node)
  If ExamineXMLAttributes(*Node)
    While NextXMLAttribute(*Node)
      name$ + " "+XMLAttributeName(*node)+"="+ XMLAttributeValue(*node) + " " 
    Wend
  EndIf

  AddGadgetItem (Tree, -1, name$, 0, position)
  For child = 1 To XMLChildCount(*Node)
    *child = ChildXMLNode(*Node, child)
    AddNode(Tree,*child, position+1)
  Next 
EndProcedure

Procedure MaCallBack(Tree.l,Type.s)
  Protected MaVariable.TCallBackRecord
  
  MaVariable\RequestID = #PR_GETMEM
  Texte$= "<request>" 
  Texte$ +   "<" + type + " subset="+Chr(34)+"all"+Chr(34)
  Texte$ +     "retrieveID=" + Chr(34) + "false" + Chr(34)
  Texte$ +   "/>"
  Texte$ + "</request>"
  
  MaVariable\RequestXML = @Texte$
  
  DeledCallBack(@MaVariable)
  MaVariable\ResponseXML=AllocateMemory(MaVariable\ResponseSize)
  MaVariable\RequestID = #PR_GETDATA
  DeledCallBack(@MaVariable)
  
  CatchXML(Tree, MaVariable\ResponseXML, MaVariable\ResponseSize)
  
  status = XMLStatus(TRee)
  
  If status = 4 ; (Normalement il faut tester 0)
    AddNode(Tree,MainXMLNode(Tree), 0)
  EndIf
  
  FreeMemory(MaVariable\ResponseXML)
EndProcedure

ProcedureDLL PluginExecute(); stdcall;
  ;This Procedure is executed when the user executes a plugin 
  ;from the Plugin menu within DeleD. 

  ;
  Protected MaVariable.TCallBackRecord


  If OpenWindow(0, 0, 0, 600, 400, "PlugIn PureBasic", #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
    PanelGadget(#Panel,5,5,595,350)
    AddGadgetItem(#Panel, -1, "primitives")
    TreeGadget(#TreePrimitive, 0, 0, 590, 325) 
    AddGadgetItem(#Panel, -1, "materials")
    TreeGadget(#TreeMaterial, 0, 0, 590, 325) 
    AddGadgetItem(#Panel, -1, "lights")
    TreeGadget(#TreeLight, 0, 0, 590, 325) 
    CloseGadgetList()
    ButtonGadget(#Button, 10,  370, 200, 20, "Quit")
    CloseGadgetList()

    MaCallBack(#TreePrimitive,"primitives")
    MaCallBack(#TreeMaterial,"materials")
    MaCallBack(#TreeLight,"lights")
    
    Repeat 
      event = WindowEvent()
      Select event
        Case 0
          Delay(10)
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #Button
              Quit = 1
          EndSelect
      EndSelect        
    Until quit
    CloseWindow(0)
    For i = #Panel To #TreeLight
      FreeGadget(i)
    Next i
  EndIf
EndProcedure
Dernière modification par comtois le sam. 04/août/2007 7:22, modifié 3 fois.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

:D :D

J'essais cela sur ma station demain, sur laquelle j'ai Deled

beau travail ;)
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Maintenant j'affiche la scène complète dans un arbre , enfin 3. Un arbre pour les primitives, un autre pour les matières et le dernier pour les lumières.

Y'a le code source et la dll dans l'archive.

http://herved25.free.fr/sources/TestPlugIn.zip

Après la lecture de la scène, normalement la prochaine étape devrait être l'écriture ou la modification de la scène. Peut-être ce week-end ou cet hiver ?
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Répondre