» fr.Dynamic Plugins Reference
This site relies heavily on Javascript. You should enable it if you want the full experience. Learn more.

fr.Dynamic Plugins Reference

English | Italian

The original english version of this page is newer and may contain information this translation does not have! Click here to view the english version.

PluginInfo

[PluginInfo(Name = "Template",
            Category = "Value",
            Help = "A Template",
            Tags = "simple, basic",
            Author = "vvvv group",
            AutoEvaluate = false)]

L’attribut PluginInfo, écrit au-dessus de votre plugin-class, permet de décrire un plugin à vvvv.
Entre parenthèses, vous trouvez une liste de paires “Name=Value” séparées par une virgule. Seuls les éléments Name et Category sont obligatoires, le reste est optionnel.
Sur le lien suivant, une liste complète des PluginInfos.

Pour plus d’infos sur AutoEvaluate , reportez-vous à la section Evaluate() ci-dessous.

Définir des pins

[Config("My Config Value")]
public ISpread<double> FConfig;
 
[Input("My Input String")]
public ISpread<string> FInput;
 
[Output("My Output Color")]
public ISpread<RGBAColor> FOutput;
Exemple d’attributs
//specify a default value for a pin
[Input("Input", DefaultValue = 255.0)]
 
//specify a not spreadable pin. 
//The pin has only one slice 
//and the user can't change that. 
[.., IsSingle = true)]
 
//specify the pins visibilty. 
[.., Visibility = PinVisibility.Hidden)]
 
//specify a pin to be of type filename 
//to show a file-dialog on rightclick.
[.., StringType = StringType.Filename)]
Exemple DiffSpread
[Input("Write", IsBang=true)]
IDiffSpread<bool> FDoWrite;
...
if (FDoWrite.IsChanged)
...
Exemple Spread de spreads
//create a two-dimensional spread
//exposed in vvvv with a data and
//a bin-size pin.
[..]
ISpread<ISpread<double>> FInput;
Exemple PinGroup
//create a dynamic pingroup, where 
//the user can specify the pin count 
//via the Inspektor. 
[.., IsPinGroup = true)]
ISpread<ISpread<double>> FInput;

Une pin est définie par deux lignes de code :

  • un attribut PinInfo (Config, Input ou Output)
  • une déclaration de variable
Attribut PinInfo

L’attribut PinInfo est écrit juste au-dessus de la déclaration d’input ou d’output et permet de définir une pin.
Entre les parenthèses, le premier argument (string) est obligatoire et spécifie le nom de la pin. Une autre série d’arguments sous forme « Name=Value », séparés par une virgule, vous permet de décrire un sous-type de la valeur de la pin en définissant des valeurs par défaut, minimum, maximum et bien plus encore.
Le lien suivant vous donnera une liste des PinInfos disponibles.

Déclaration de variables

Dans la plupart de cas, vous déclarerez vos entrées et sorties avec le type générique ISpread<T> où T est le type de votre choix :

float, double, bool, int, ..
pin « Value »
string
pin « String »
RGBAColor
pin « Color »

Lorsque vous voulez voir si une entrée a changé, utilisez simplement IDiffSpread<T> au lieu de ISpread<T> dans la déclaration et appelez .IsChanged.

Spread de spread

Si vous déclarez une variable ISpread<ISpread<T>>, vous obtenez gratuitement une pin BinSize à côté de la pin en question qui vous permettra de structurer vos données en bins. Vous pouvez aussi en faire une pin PinGroup où, au lieu de BinSize, vous aurez une pin de config PinCount (reportez-vous à l’exemple sur la gauche).

Ajouter/supprimer des pins

Il existe deux façons de faire ça pendant l’exécution :

  • facile : utiliser PinGroup -> cela ne fonctionne qu’en association avec ISpread<ISpread<T>> où T peut prendre n’importe-quelle valeur (référez-vous aux snippets à gauche)
  • flexible -> jetez un œil au code de la node Template (Value DynamicPins).
Callbacks de connexions

Dans les cas très rares où vous auriez besoin de réagir à des événements de connexion/déconnexion, utilisez Pin<T> au lieu de ISpread<T>, et lisez la page Pin(T) Events.

Evaluate

public void Evaluate(int SpreadMax)
{ 
  FOutput.SliceCount = SpreadMax;
 
  for (int i = 0; i < SpreadMax; i++)
    FOutput[i] = FInput[i] * 2;
}

C’est le cœur de votre plugin. La fonction Evaluate() s’exécute à chaque frame :

  • si quelque chose est connecté en aval
  • ou si vous avez défini AutoEvaluate=true (cf. PluginInfo, ci-dessus)

C’est ici que se trouveront les calculs principaux de votre plugin. Si vous cherchez un endroit où initialiser des bouts de code (c’est-à-dire ne les exécuter qu’une seule fois), reportez-vous à la section suivante (Constructeur).
La fonction prend en paramètre « SpreadMax », qui correspond au slicecount de tous les spreads connectés à toutes les entrées du plugin. C’est ce que vous utiliserez pour définir le slicecount des pins de sortie comme indiqué sur l’exemple de gauche.
Gardez à l’esprit que si UNE SEULE de vos pins d’entrée est un ISpread<ISpread<…>>, vous devrez calculer SpreadMax à la main comme expliqué ci-dessous. Ainsi, un spread 2d n’alimentera SpreadMax qu’avec le bin count, ce qui est en général ce que vous rechercherez.

SpreadMax = SpreadUtils.SpreadMax(FInput1, FInput2 /* indiquez TOUT vos inputs ici*/);

Le constructeur : initialiser des trucs

public MyNodeClassname()
{ 
  //initialize stuff
}
public class MyNodeClassname: 
IPluginEvaluate, 
IPartImportsSatisfiedNotification
{
...
 
public void OnImportsSatisfied()
{
  //access your in-/outputs here
}

Vous utiliserez un constructeur si des bouts de votre code ne doivent être exécutés qu’une fois. Notez qu’il est optionnel et que par conséquent la plupart des templates n’en ont pas.
Si vous voulez accéder aux variables que vous avez définies en entrée ou en sortie, vous devrez implémenter IPartImportsSatisfiedNotification comme montré dans l’exemple de gauche. Pour un cas pratique, reportez-vous à la node Template (Raw).

Le destructeur : jeter des trucs

public class MyNodeClassname: 
IPluginEvaluate, 
IDisposable
{
...
//called when the plugin gets 
//deleted
public void Dispose()
{
  //unsubscribe from events
  //and call dispose on resources
  //your plugin has created.
}

Dans le cas où votre plugin utiliserait des ressources devant être libérées lors de sa suppression, vous devrez implémenter l’interface IDisposable. Grâce à sa méthode Dispose, vous pourrez faire toutes vos tâches de nettoyage.

Accéder à la structure interne : HDEHost

[Import()]
public IPluginHost2 FPluginHost;
 
[Import()]
public IHDEHost FHDEHost;

Il existe deux points d’entrée pour accéder à la structure interne de vvvv :

  • si vous voulez obtenir/définir des informations sur votre plugin, regardez IPluginHost2
  • si vous voulez avoir accès à tout vvvv, lisez IHDEHost

Project Explorer

Appuyez sur Ctrl+J pour ouvrir la fenêtre Project Explorer. Vous y verrez une arborescence de tous vos projets et pourrez y ajouter/supprimer des documents et références.

Documents

Bien que vous pouvez définir plusieurs plugin-class dans votre document (créez les simplement les unes à la suite des autres), il est plus judicieux lorsque vous travaillez sur un grand nombre de nodes de les séparer dans plusieurs documents. Faite simplement un clic droit dans le Project Explorer et sélectionnez « Add … » pour ajouter un document existant ou en créer un nouveau.

References

Vous y référencerez :

  • des librairies du GAC
  • ou des librairies tierces (le driver d’un périphérique par exemple)

Usings

using System;
..
using VVVV.PluginInterfaces.V2;

Toutes les entités de .NET peuvent être atteintes via un chemin global étant le namespace dans lequel cette entité est définie suivi du nom de celle-ci. Par exemple, VVVV.PluginInterfaces.V2.ISpread<bool> est le chemin complet du type ISpread<bool> lui-même défini dans le namespace VVVV.PluginInterfaces.V2.
Les déclarations using vous permettent de raccourcir votre code en n’écrivant par exemple que ISpread<bool>. Vous devrez pour cela nécessairement utiliser le namespace (VVVV.PluginInterface.V2) au début de votre code.

Debugging

[Import()]
public ILogger Flogger;
...
 
Flogger.Log(LogType.Debug, "foo");

La façon la plus simple de débugger votre code est d’écrire des messages de log que vous pourrez visualiser dans le Renderer (TTY). Pour cela, importez ILogger et appelez .Log() comme indiqué dans l’exemple de gauche.

Points d’arrêt

Si vous voulez définir des points d’arrêts et avancer pas à pas dans votre code, il vous faudra un IDE comme SharpDevelop ou VisualStudio et suivre les étapes suivantes :

  • ouvrir le fichier .csproj de votre plugin
  • définir un point d’arrêt dans votre code
  • « attacher » l’IDE à l’instance en exécution de vvvv.

Lorsqu’un point d’arrêt sera rencontré, l’IDE stoppera vvvv et vous pourrez parcourir vos lignes de code.

Interfaces optionnelles à implémenter

  • IBackgroundColor permet à un plugin GUI de définir la couleur de fond de la fenêtre dans laquelle il se trouve (afin d’éviter l’effet de flicker quand la fenêtre passe en plein écran).
  • IQueryDelete permet à un plugin d’empêcher sa suppression.
  • IMainLoop permet de suivre des éléments du mainloop.
  • IDXDeviceService donne l’accès aux devices Direct3D9 créés par vvvv.
  • IStartable exécute du code au démarrage.

anonymous user login

Shoutbox

~14d ago

~17d ago

joreg: The Winter Season of vvvv workshops is now over but all recordings are still available for purchase: https://thenodeinstitute.org/ws23-vvvv-intermediates/

~23d ago

schlonzo: Love the new drag and drop functionality for links in latest previews!

~1mth ago

joreg: Workshop on 29 02: Create Sequencers and Precise Clock Based Tools. Signup here: https://thenodeinstitute.org/courses/ws23-vvvv-08-create-sequencers-and-precise-clock-based-tools-in-vvvv-gamma/

~1mth ago

joreg: Workshop on 22 02: Unlocking Shader Artistry: A Journey through ‘The Book of Shaders’ with FUSE. Signup here: https://thenodeinstitute.org/courses/ws23-vvvv-12-book-of-shaders/

~2mth ago

joreg: Talk and Workshop on February 15 & 16 in Frankfurt: https://visualprogramming.net/blog/vvvv-at-node-code-frankfurt/

~2mth ago

woei: @Joanie_AntiVJ: think so, looks doable