Accueil > > > RAYTRACER EN TEMPS RÉEL ET EN ASSEMBLEUR
RAYTRACER EN TEMPS RÉEL ET EN ASSEMBLEUR
Information sur la source
Description
Bonjour à tous ! Je viens de finir mon second RayTracer (du moins disons qu'il affiche quelque chose de potable) et je me suis dit que ça intéresserait peut-être certains d'entre vous d'avoir le code. Donc voici une petite démonstration sans prétention, ainsi que les portions de code chargé de l'affichage 3D. Sur ce, je retourne préparer la version 0.22, avec des effets d'éclairage cette fois-ci. Vous pouvez déplacer la caméra avec les flèches. Appuyez sur F1 pour afficher la liste des commandes ( il y a aussi pas mal d'effet visuel qui n'ont rien avoir avec le RayTracing, appuyez sur la touche "\" pour voir...). La compilation est prévue pour se faire sous Visual Studio C++ 2008, d'où le listing principal en C++ alors que la librairie est en ASM. Le RayTracing vaincra ! A bas la Projection !
Source
- #include <windows.h>
- #include "Hydrargyrum.h"
-
- #pragma comment(linker, "/entry:Main")
-
-
- void __stdcall Procedure3D(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam);
-
- DWORD ValeurContraste=256;
- DWORD ValeurLuminance=256;
- DWORD ValeurColoration=Coloration_Complete;
- DWORD ValeurFiltre=0;
- DWORD ValeurXincremental=0;
- DWORD StatutSession=1;
- DWORD AideON=0;
-
- HgHandle ImageAide=0;
- HgHandle PoliceComicSansMS=0;
-
- HgHandle ObjetTestPave1;
- HgHandle ObjetTestPave2;
- HgHandle ObjetTestPave3;
- HgHandle ObjetTestSphere1;
- DWORD AngleRotationObjetTest;
-
- struct HgCamera Camera1;
-
-
- int Main(int argc, char* argv[])
- {
-
- MSG BoiteMsg;
-
-
- HgCreerAffichage(Procedure3D,Mode_PleinEcran,1024,768,Couleur_32bits); //redimensionne
-
- ImageAide = HgChargerImage("Images/Aide.bmp"); //charge l'image d'aide
- PoliceComicSansMS = HgChargerPolice("Images/ComicSansMS.bmp","Images/ComicSansMS.txt"); //charge une police de texte
-
- Camera1.X=0;
- Camera1.Y=0;
- Camera1.Z=0;
- Camera1.Recul=500;
- Camera1.RotationX=0;
- Camera1.RotationY=0;
- Camera1.RotationZ=0;
- ObjetTestPave1 = HgChargerObjet(0,0,0,600,20,250,250,0x7f7fff,0x007fff,0x7f7fbf,0x0000ff,0x00ffff,0x00ff00);
- ObjetTestPave2 = HgChargerObjet(0,0,0,600,50,50,250,0xa0a0a0,0xc0c0c0,0xd0d0d0,0xc0c0c0,0xd0d0d0,0xa0a0a0);
- ObjetTestPave3 = HgChargerObjet(0,0,0,600,200,200,200,0xf02020,0xf04040,0xf06060,0xf08080,0xf0a0a0,0xf0c0c0);
- ObjetTestSphere1 = HgChargerObjet(1,0,0,600,100,0,0,0x6f6f6f,0,0,0,0,0);
-
- StatutSession=1;
- while (StatutSession == 1)
- {
- GetMessage(&BoiteMsg,0,0,0);
- DispatchMessage(&BoiteMsg);
- }
-
- ExitProcess(0);
-
-
-
- }
-
-
- void Procedure3D(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
- { long FPS;
- char TamponFPS[10]; //pour l'affichage du nombre d'images par secondes
-
- switch(mssg)
- {
- case WM_KEYDOWN:
- switch(wParam)
- {
- case VK_NUMPAD9: // touche plus
- ValeurContraste = ValeurContraste + 20;
- HgModifierContraste(ValeurContraste);
- return;
-
- case VK_NUMPAD6: // touche moins
- ValeurContraste = ValeurContraste - 20;
- HgModifierContraste(ValeurContraste);
- return;
-
- case VK_NUMPAD8: // touche plus
- ValeurLuminance = ValeurLuminance + 20;
- HgModifierLuminance(ValeurLuminance);
- return;
-
- case VK_NUMPAD5: // touche moins
- ValeurLuminance = ValeurLuminance - 20;
- HgModifierLuminance(ValeurLuminance);
- return;
-
- case VK_NUMPAD7: // touche rouge
- ValeurColoration = ValeurColoration ^ Rouge;
- HgModifierColoration(ValeurColoration);
- return;
-
- case VK_NUMPAD4: // touche vert
- ValeurColoration = ValeurColoration ^ Vert;
- HgModifierColoration(ValeurColoration);
- return;
-
- case VK_NUMPAD1: // touche bleu
- ValeurColoration = ValeurColoration ^ Bleu;
- HgModifierColoration(ValeurColoration);
- return;
-
- case VK_NUMPAD0: // touche noir et blanc
- ValeurColoration = Coloration_Noir_Blanc;
- HgModifierColoration(ValeurColoration);
- return;
-
- case VK_ESCAPE: // touche echap
- HgTerminerAffichage();
- ExitProcess(0);
- return;
-
- case VK_RETURN: // touche entrée
- HgTerminerAffichage();
- ExitProcess(0);
- return;
-
- case VK_F12: //touche F12 - Capture écran
- HgEnregistrerAffichage();
- return;
-
- case VK_F1: //touche F1 - Aide
- AideON = AideON ^ 1;
- return;
-
- case 0x31: // touche 1
- ValeurFiltre = ValeurFiltre ^ Filtre_Luminance_Contraste; //filtre 1 : LC
- HgModifierFiltre(ValeurFiltre);
- return;
-
- case 0x32: // touche 2
- ValeurFiltre = ValeurFiltre ^ Filtre_Dilatation; //filtre 2 : Dilatation
- HgModifierFiltre(ValeurFiltre);
- return;
-
- case 0x33: // touche 3
- ValeurFiltre = ValeurFiltre ^ Filtre_Erosion; //filtre 3 : Erosion
- HgModifierFiltre(ValeurFiltre);
- return;
-
- case 0x34: // touche 4
- ValeurFiltre = ValeurFiltre ^ Filtre_Contour; //filtre 4 : Contour
- HgModifierFiltre(ValeurFiltre);
- return;
-
- case 0x35: // touche 5
- ValeurFiltre = ValeurFiltre ^ Filtre_Coloration; //filtre 5 : Coloration
- HgModifierFiltre(ValeurFiltre);
- return;
-
- case 0x36: // touche 6
- ValeurFiltre = ValeurFiltre ^ Filtre_Gaussien; //filtre 6 : Gaussien
- HgModifierFiltre(ValeurFiltre);
- return;
-
- case 0x37: // touche 7
- ValeurFiltre = ValeurFiltre ^ Filtre_Gaussien_Pondere; //filtre 7 : Gaussien Pondéré
- HgModifierFiltre(ValeurFiltre);
- return;
-
- case 0x38: // touche 8
- ValeurFiltre = ValeurFiltre ^ Filtre_Mouvement; //filtre 8 : Motion Blur
- HgModifierFiltre(ValeurFiltre);
- return;
-
- case VK_BACK: // touche retour arriere
- HgModifierContraste(256);
- HgModifierLuminance(256);
- HgModifierColoration(Coloration_Complete);
- ValeurContraste=256;
- ValeurLuminance=256;
- ValeurFiltre=0;
- HgModifierFiltre(Filtre_Inactif);
- return;
-
- case VK_RIGHT: //flèche droite
- Camera1.X = Camera1.X + 10;
- return;
-
- case VK_LEFT: //flèche gauche
- Camera1.X = Camera1.X - 10;
- return;
-
- case VK_UP: //flèche haut
- Camera1.Z = Camera1.Z + 10;
- return;
-
- case VK_DOWN: //flèche bas
- Camera1.Z = Camera1.Z - 10;
- return;
-
- case 0x21: //flèche début
- Camera1.Y = Camera1.Y + 10;
- return;
-
- case 0x22: //flèche fin
- Camera1.Y = Camera1.Y - 10;
- return;
-
- }
-
- DefWindowProc(hdlg,mssg,wParam,lParam);
- return;
-
- case WM_PAINT:
-
- HgEffacerAffichage();
- HgAfficherTexte(200,10,PoliceComicSansMS,"Demonstration 3D : Lancer de Rayon",0,0xc0ffff);
- HgAfficherTexte(10,710,PoliceComicSansMS,"F1 = Aide",0,0xf0f0c0);
-
- HgDeplacerObjet(ObjetTestPave1,100,100,600,AngleRotationObjetTest,AngleRotationObjetTest,AngleRotationObjetTest);
- HgDeplacerObjet(ObjetTestPave2,100,-100,600,AngleRotationObjetTest,0,AngleRotationObjetTest);
- HgDeplacerObjet(ObjetTestPave3,-100,-100,600,0,AngleRotationObjetTest,AngleRotationObjetTest);
- HgDeplacerObjet(ObjetTestSphere1,-100,100,600,0,0,0);
- AngleRotationObjetTest = AngleRotationObjetTest + 11930464;
- HgAfficherLR(&Camera1);
-
- FPS = HgObtenirFPS();
- HgConvertirWORDversASCII(FPS,&TamponFPS);
- TamponFPS[5]=0; //ne garde que les bons chiffres
- HgAfficherTexte(600,10,PoliceComicSansMS,&TamponFPS,0,0xc0c0ff);
- HgAfficherTexte(670,10,PoliceComicSansMS,"FPS",0,0xc0c0ff);
-
- if (AideON == 1)
- { HgAfficherImageSpec(192,144,0,0,0,0,ImageAide,0,0x50,0xc0c0ff);}
-
- ValeurXincremental++;
- HgAfficher();
- return;
-
- case WM_CLOSE:
- HgTerminerAffichage();
- StatutSession = 0;
- ExitProcess(0);
- return;
-
- case WM_QUIT:
- HgTerminerAffichage();
- StatutSession = 0;
- ExitProcess(0);
- return;
-
- }
- DefWindowProc(hdlg,mssg,wParam,lParam);
- return;
- }
#include <windows.h>
#include "Hydrargyrum.h"
#pragma comment(linker, "/entry:Main")
void __stdcall Procedure3D(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam);
DWORD ValeurContraste=256;
DWORD ValeurLuminance=256;
DWORD ValeurColoration=Coloration_Complete;
DWORD ValeurFiltre=0;
DWORD ValeurXincremental=0;
DWORD StatutSession=1;
DWORD AideON=0;
HgHandle ImageAide=0;
HgHandle PoliceComicSansMS=0;
HgHandle ObjetTestPave1;
HgHandle ObjetTestPave2;
HgHandle ObjetTestPave3;
HgHandle ObjetTestSphere1;
DWORD AngleRotationObjetTest;
struct HgCamera Camera1;
int Main(int argc, char* argv[])
{
MSG BoiteMsg;
HgCreerAffichage(Procedure3D,Mode_PleinEcran,1024,768,Couleur_32bits); //redimensionne
ImageAide = HgChargerImage("Images/Aide.bmp"); //charge l'image d'aide
PoliceComicSansMS = HgChargerPolice("Images/ComicSansMS.bmp","Images/ComicSansMS.txt"); //charge une police de texte
Camera1.X=0;
Camera1.Y=0;
Camera1.Z=0;
Camera1.Recul=500;
Camera1.RotationX=0;
Camera1.RotationY=0;
Camera1.RotationZ=0;
ObjetTestPave1 = HgChargerObjet(0,0,0,600,20,250,250,0x7f7fff,0x007fff,0x7f7fbf,0x0000ff,0x00ffff,0x00ff00);
ObjetTestPave2 = HgChargerObjet(0,0,0,600,50,50,250,0xa0a0a0,0xc0c0c0,0xd0d0d0,0xc0c0c0,0xd0d0d0,0xa0a0a0);
ObjetTestPave3 = HgChargerObjet(0,0,0,600,200,200,200,0xf02020,0xf04040,0xf06060,0xf08080,0xf0a0a0,0xf0c0c0);
ObjetTestSphere1 = HgChargerObjet(1,0,0,600,100,0,0,0x6f6f6f,0,0,0,0,0);
StatutSession=1;
while (StatutSession == 1)
{
GetMessage(&BoiteMsg,0,0,0);
DispatchMessage(&BoiteMsg);
}
ExitProcess(0);
}
void Procedure3D(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{ long FPS;
char TamponFPS[10]; //pour l'affichage du nombre d'images par secondes
switch(mssg)
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_NUMPAD9: // touche plus
ValeurContraste = ValeurContraste + 20;
HgModifierContraste(ValeurContraste);
return;
case VK_NUMPAD6: // touche moins
ValeurContraste = ValeurContraste - 20;
HgModifierContraste(ValeurContraste);
return;
case VK_NUMPAD8: // touche plus
ValeurLuminance = ValeurLuminance + 20;
HgModifierLuminance(ValeurLuminance);
return;
case VK_NUMPAD5: // touche moins
ValeurLuminance = ValeurLuminance - 20;
HgModifierLuminance(ValeurLuminance);
return;
case VK_NUMPAD7: // touche rouge
ValeurColoration = ValeurColoration ^ Rouge;
HgModifierColoration(ValeurColoration);
return;
case VK_NUMPAD4: // touche vert
ValeurColoration = ValeurColoration ^ Vert;
HgModifierColoration(ValeurColoration);
return;
case VK_NUMPAD1: // touche bleu
ValeurColoration = ValeurColoration ^ Bleu;
HgModifierColoration(ValeurColoration);
return;
case VK_NUMPAD0: // touche noir et blanc
ValeurColoration = Coloration_Noir_Blanc;
HgModifierColoration(ValeurColoration);
return;
case VK_ESCAPE: // touche echap
HgTerminerAffichage();
ExitProcess(0);
return;
case VK_RETURN: // touche entrée
HgTerminerAffichage();
ExitProcess(0);
return;
case VK_F12: //touche F12 - Capture écran
HgEnregistrerAffichage();
return;
case VK_F1: //touche F1 - Aide
AideON = AideON ^ 1;
return;
case 0x31: // touche 1
ValeurFiltre = ValeurFiltre ^ Filtre_Luminance_Contraste; //filtre 1 : LC
HgModifierFiltre(ValeurFiltre);
return;
case 0x32: // touche 2
ValeurFiltre = ValeurFiltre ^ Filtre_Dilatation; //filtre 2 : Dilatation
HgModifierFiltre(ValeurFiltre);
return;
case 0x33: // touche 3
ValeurFiltre = ValeurFiltre ^ Filtre_Erosion; //filtre 3 : Erosion
HgModifierFiltre(ValeurFiltre);
return;
case 0x34: // touche 4
ValeurFiltre = ValeurFiltre ^ Filtre_Contour; //filtre 4 : Contour
HgModifierFiltre(ValeurFiltre);
return;
case 0x35: // touche 5
ValeurFiltre = ValeurFiltre ^ Filtre_Coloration; //filtre 5 : Coloration
HgModifierFiltre(ValeurFiltre);
return;
case 0x36: // touche 6
ValeurFiltre = ValeurFiltre ^ Filtre_Gaussien; //filtre 6 : Gaussien
HgModifierFiltre(ValeurFiltre);
return;
case 0x37: // touche 7
ValeurFiltre = ValeurFiltre ^ Filtre_Gaussien_Pondere; //filtre 7 : Gaussien Pondéré
HgModifierFiltre(ValeurFiltre);
return;
case 0x38: // touche 8
ValeurFiltre = ValeurFiltre ^ Filtre_Mouvement; //filtre 8 : Motion Blur
HgModifierFiltre(ValeurFiltre);
return;
case VK_BACK: // touche retour arriere
HgModifierContraste(256);
HgModifierLuminance(256);
HgModifierColoration(Coloration_Complete);
ValeurContraste=256;
ValeurLuminance=256;
ValeurFiltre=0;
HgModifierFiltre(Filtre_Inactif);
return;
case VK_RIGHT: //flèche droite
Camera1.X = Camera1.X + 10;
return;
case VK_LEFT: //flèche gauche
Camera1.X = Camera1.X - 10;
return;
case VK_UP: //flèche haut
Camera1.Z = Camera1.Z + 10;
return;
case VK_DOWN: //flèche bas
Camera1.Z = Camera1.Z - 10;
return;
case 0x21: //flèche début
Camera1.Y = Camera1.Y + 10;
return;
case 0x22: //flèche fin
Camera1.Y = Camera1.Y - 10;
return;
}
DefWindowProc(hdlg,mssg,wParam,lParam);
return;
case WM_PAINT:
HgEffacerAffichage();
HgAfficherTexte(200,10,PoliceComicSansMS,"Demonstration 3D : Lancer de Rayon",0,0xc0ffff);
HgAfficherTexte(10,710,PoliceComicSansMS,"F1 = Aide",0,0xf0f0c0);
HgDeplacerObjet(ObjetTestPave1,100,100,600,AngleRotationObjetTest,AngleRotationObjetTest,AngleRotationObjetTest);
HgDeplacerObjet(ObjetTestPave2,100,-100,600,AngleRotationObjetTest,0,AngleRotationObjetTest);
HgDeplacerObjet(ObjetTestPave3,-100,-100,600,0,AngleRotationObjetTest,AngleRotationObjetTest);
HgDeplacerObjet(ObjetTestSphere1,-100,100,600,0,0,0);
AngleRotationObjetTest = AngleRotationObjetTest + 11930464;
HgAfficherLR(&Camera1);
FPS = HgObtenirFPS();
HgConvertirWORDversASCII(FPS,&TamponFPS);
TamponFPS[5]=0; //ne garde que les bons chiffres
HgAfficherTexte(600,10,PoliceComicSansMS,&TamponFPS,0,0xc0c0ff);
HgAfficherTexte(670,10,PoliceComicSansMS,"FPS",0,0xc0c0ff);
if (AideON == 1)
{ HgAfficherImageSpec(192,144,0,0,0,0,ImageAide,0,0x50,0xc0c0ff);}
ValeurXincremental++;
HgAfficher();
return;
case WM_CLOSE:
HgTerminerAffichage();
StatutSession = 0;
ExitProcess(0);
return;
case WM_QUIT:
HgTerminerAffichage();
StatutSession = 0;
ExitProcess(0);
return;
}
DefWindowProc(hdlg,mssg,wParam,lParam);
return;
}
Conclusion
Si vous avez des questions, remarques, demandes... Je vous écoute. Pour ceux qui se poserait la question, les instructions bizarres que j'utilise sont le jeu d'instructions 'SSE' (y a bon, mangez-en !).
Historique
- 26 août 2008 14:25:53 :
- Note : Upload de la version complète de la librairie. Le '.zip' précédent ne contenait que le code des fonctions s'occupant de la 3D
- 26 août 2008 14:27:52 :
- Note : Upload de la version complète de la librairie. Le '.zip' précédent ne contenait que le code des fonctions s'occupant de la 3D
- 29 août 2008 00:27:21 :
- Correction d'une valeur non-initialisée à 0 dans HgCreerAffichage, ce qui provoquait parfois un plantage de la librairie. (Il est passé longtemps inaperçu celui-là...)
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Assembleur ... [ par pi0up51 ]
Voilà je voulais savoir qch ..Je fais un bac S spécialité Science de l'ingenieur et on fais de la programmation assembleur, sur un vieux microcontrole
Deux Questions (Pas compliqué) [ par Dalamar ]
Je commence en Assembleur et j'ai deux questions:1-Je travaille avec dev-c++ et je voudrais savoir comment on inclus de l'assembleur2-J'ai trouvé u
Quel assembleur choisir ? [ par trinitacs ]
J'aimerai savoir quel est le meilleur assembleur qui existe ou si il en faut mixer. Je début difficielment l'asm avec NASM. Faut-il choisir MASM, TASM
langage c /assembleur [ par almai467 ]
salut ..!mon projet de fin d'annee est un logiciel (compteur internet) qui compte la duree de la connexion internet et le cout avec le langage c je c'
Programmation assembleur d'un pilote de souris serie [ par Scaq ]
COUCOU, C SCAQ...J'ai du mal à recevoir les données de ma souris serie
compilateur assembleur [ par morganitos ]
Salut a tous ce qui liront ce message.Je débute en programmation assembleur et voici ma question : où pourrai-je trouver un assembleur, un linker ...(
aide pour faire jeux 3d [ par ghyslain ]
nous somme en train de faire un jeu 3d de dragon ball z sur pc.sa ne peux que etre une bonne experience.pour nous aider nous avons besoin de:_programm
Petit problème pour le nul en assembleur que je suis Merci d'avance [ par rgc50 ]
Trouver parmis les 5 nombres 67, 79, 15, e3, 72 le nombre le pls élevé, on le stockera le résultat en 0100 (en assembleur 68000 (MOTOROLA)).
Pb assembleur très facile (pas pour moi) Merci d'avance [ par rgc50 ]
Trouver parmis les 5 nombres 67, 79, 15, e3, 72 le nombre le pls élevé, on le stockera le résultat en 0100 (en assembleur 68000 (MOTOROLA)).
Commander un PCF 8574 en assembleur 68000 [ par Apophis74 ]
Je cherche quelqu'un qui pourrait m'adier à faire communiquer ma carte Coldfire 5307 avec une carte d'ES PCF8574 via le bus I2C en assembleur 68000. M
|
Derniers Blogs
CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks [HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL[HYPER-V 3] PRéSENTATION DES COMMANDLETS POWERSHELL par Pierrick CATRO-BROUILLET
Avec la sortie prochaine de la Beta Consumer Preview de Windows 8, j'avais envie de revenir sur une des fonctionnalités que j'attends le plus et que, en bon geek que je suis, j'utilise déjà : Hyper-V 3 ainsi son module PowerShell.
Il y a déjà pléthor...
Cliquez pour lire la suite de l'article par Pierrick CATRO-BROUILLET IIS7 - COMPRESSION GZIPIIS7 - COMPRESSION GZIP par cyril
La compression GZIP permet d'améliorer les performances de navigation en compressant ce qu'envoie le serveur à un client. Pour comprendre comment cela fonctionne, regardons ce qu'il se passe au niveau HTTP lorsqu'un client tente d'accéder à une ress...
Cliquez pour lire la suite de l'article par cyril
Logiciels
Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning Academy System (17.1.3.0)ACADEMY SYSTEM (17.1.3.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|