SDK et documentations

Cette section contient les différents SDK et documentation permettant de personaliser glAir :

Les plugins de visualisation

Pour l'instant glAir permet l'ajout de plugins de visualisation qui sont lancés au bout de 5 secondes d'inactivitées. Pour réaliser un plugin, il suffit d'écrire une dll exportant une fonction de création qui retourne un pointeur sur une structure PluginStruct.
Voici l'interface à integrer dans vos projets :
#ifndef PLUGIN_H_
#define PLUGIN_H_
extern "C"{

	typedef int  (*INIT_FUNC)   (void);
	typedef int  (*RELEASE_FUNC)(void);
	typedef void (*RENDER_FUNC) (void);
	typedef unsigned int (*LOAD_TEXTURE_FUNC)(const char *file);
	
	
	typedef struct {
		// set by player
		float spectrum[2][16]; // [1][16] clamped float array
		float dt;
		LOAD_TEXTURE_FUNC texture_loader;
		// set by the plugin
		INIT_FUNC initialize;
		RELEASE_FUNC release;
		RENDER_FUNC render;
	} PluginStruct;

	typedef PluginStruct *(*CREATE_FUNC)(void);
#ifdef PLUGIN
	extern __declspec( dllexport ) PluginStruct * create();
#endif
}
#endif
L'attribut spectrum est renseigné par glAir et contiend le spectre du mp3. le pointeur de fontction texture_loader permet de faire charger une texture par le player. Et dt est mis à jour a chaque frame et contiend le temps ecoulé en milliseconde depuis la dernière frame.
L'exemple suivant représente l'implémentation du plugin SimpleSpectre.dll
// SpectrumPlugin.h
#define PLUGIN // declare the plugin interface

#include <glAir/plugin.h>
/* our rendering function */
void render();

/* our initialization function */
int init();
 
/* our release function */
int release();

// initialisation of a the PluginStruct object
static PluginStruct instance = { {0}, // reserved for the spectrum data
                                   0, // time info
                                   0, // reserved to store the texture 
                                      //loader function
                                   init, // our functions 
                                   release, 
                                   render};
// SimpleSpectrum.cpp
#include "SimpleSpectrum.h"
#include <windows.h>
#include <GL/GL.h>
#include <GL/GLU.h>

#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")

int init(){ 
	return 1;
}
int release(){
	return 1;
}


 // simly rendering a bar graph from the spectrum datas
void render(void){
	float L = 600;
	float step = 2*L/16;
	int j = 0;

	glDisable(GL_BLEND);
	glDisable(GL_TEXTURE_2D);
	glPopMatrix();
	
  glBegin(GL_QUADS);
	glColor4f(0, 0, 0.0, 0.7);
	glNormal3f(0, 0, 1);
	for (float x = -L; x < L; x+=step){
		glVertex3f(x, -500*instance.spectrum[1][j], -200);
		glVertex3f(x+step*0.9, -500*instance.spectrum[1][j], -200);	
		glVertex3f(x+step*0.9, 500*instance.spectrum[0][j], -200);				
		glVertex3f(x, 500*instance.spectrum[0][j], -200);
		j++;
	}
	glEnd();
	glPopMatrix();
}


/* the dll creation proc */
PluginStruct * create(){
	return &instance;
}

Les skins

Pour réaliser une skin il suffit de réaliser une scène 3ds en respectant plusieurs consignes.
  • La taille de la scène doit être la même que les skins de bases, dans la vue Top de 3ds la skin doit tenir dans une boite centrée de coté 600~650 (cf image en dessous)
  • Les 3 zones de texte doivent être des boites(du moins une face plane) orientées de la même façon que dans les skin de bases, c'est à dire de face dans la vue Top de 3ds.
  • Tous les meshs doivent posséder un materiaux (les textures ne sont pour l'instant pas affichés, mais pourrait l'être si l'on m'en fait la demande).
  • Les meshs doivent posséder des noms précis (les majuscules/minuscules comptent):
    • "play" : tout mesh dont le nom commence par "play" sera considéré comme bouton play
    • "stop" : idem
    • "previous" : idem
    • "next" : idem
    • "pause" : idem
    • "stop" : idem
    • "quit" : idem
    • "repeat" : je le fait tourner lorsqu'il est sélectionné
    • "resize" : pour redimensionner à la souris (pour le jour où ça fonctionnera bien ;) ) en attendant il est plus logique de le mettre en bas à droite.
    • "Vol:1", "Vol:2", "Vol:3", "Vol:4", "Vol:5" : j'y attache le contrôle du volume. je module la couleur par defaut à la main en fonction du niveau du volume
    • "top" : le mesh nommé "top" est associé a l'action always on top, je fais tourner le mesh sur lui même
    • "time", "title", "back" : sont réservé pout les boites de support de l'affichage du texte
    • "TitleBar" : tout ce qui commence par "TitleBar" pourra être clickable et permetre le déplacement /orientation du player.
    ensuite vous pouvez rajouter tout ce que vous voulez, je l'afficherai simplement
  • Pour les matériaux il est conseillé d'utiliser un slot rien que pour la "TitleBar" et de ne pas attribuer le même matérial au bouton par exemple. Ceci permet de mieux adapter les couleurs du player au style de couleurs de windows.
    Sur cette image, les couleurs définies dans le 3ds (en haut) pour les éléments interactifs sont modifiés pour s'adapter à la couleur des fenêtres de windows (orange dans mon cas).

Le fichier de configuration

glAir utilise un fichier de configuration au format xml : glAir.xml
 1 <?xml version="1.0" encoding="utf-8"?>
 2 
 3 <glAir>
L'attribut size permet de spécifier la taille (hauteur et largeur) du player au lancement.
 4   <size width="250" height="250"></size>
L'attribut font permet de spécifier le fichier de font utilisé.
 5   <font url="font.bmp"></font>
 6   
Le noeud skin renseigne les paramètre de la skin utilisée.
  • url : le nom du fichier 3ds
  • windows_color_style : Permet d'appliquer à certains éléments de la skin les couleurs par défaut de windows.
 7   <skin url="egg_bilbox.3ds" windows_color_style="0">
Le noeud materials sert à adapter plus finement les couleur de la skin. Il permet de remplacer les valeurs de chaque material utilisé dans le 3ds et donc de configurer le look de la skin sans avoir de modeleur à disposition.
 8     <materials>
Chaque material de substitution est identifié par son nom sous 3ds (chaque skin possède ses propres nom de matériaux). Pour chaque material on peut spécifier une ou plusieurs des propriétés suivantes :
  • diffuse : 3 composantes rouge verte bleu, avec une valeur comprise entre 0 et 1.
  • specular : 3 composantes rouge verte bleu, avec une valeur comprise entre 0 et 1.
  • ambient : 3 composantes rouge verte bleu, avec une valeur comprise entre 0 et 1.
  • shininess : 1 composantes avec une valeur comprise entre 0 et 128.
 9       <material name="02 - Default">
10         <diffuse r="1.0" g="0.5" b="0.5"/>
12         <specular r="0.5" g="0.5" b="0.5"/>
13         <shininess  value="12.0" />
14       </material>
15       <material name="01 - Default">
16         <diffuse r="1.0" g="0.5" b="0.5"/>
17         <ambient r="1.0" g="0.5" b="0.5"/>
18         <specular r="0.5" g="0.5" b="0.5"/>
19         <shininess  value="12.0" />
20       </material>
21       <material name="09 - Default">
22         <diffuse r="1.0" g="0.5" b="0.5"/>
23         <ambient r="1.0" g="0.5" b="0.5"/>
24         <specular r="0.5" g="0.5" b="0.5"/>
25         <shininess  value="12.0" />
26       </material>
27       <material name="03 - Default">
28         <diffuse r="1.0" g="0.5" b="0.5"/>
29         <ambient r="1.0" g="0.5" b="0.5"/>
30         <specular r="0.5" g="0.5" b="0.5"/>
31         <shininess  value="12.0" />
32       </material>
33     </materials>
34   </skin>
35 
La section plugins permet de spécifier les plugins de visu utilisés.
36   <plugins>
pour chaque plugin on doit renseigner :
  • url : le nom du fichier de la dll.
  • onIdle : à pour valeur 0 ou 1. S'il vaut 0 le plugin est toujours visible. S'il vaut 1, le plugin n'est visible que lorsque le player entre en mode veille.
37     <plugin url="SimpleSpectrum.dll" onIdle="1"></plugin>
38     <plugin url="Balls.dll" onIdle="1"></plugin>
39     <plugin url="Cubes.dll" onIdle="1"></plugin>
40   </plugins>
41 
idle permet de configurer le temps que met le player à se mettre en veille. La valeur se donne en milisecondes (i.e. 5000 pour 5 seconde). Si la valeur vaut 0 le player n'entre jamais en mode veille.
42   <idle value="35000"></idle>
43 
44 </glAir>