begin process at 2012 05 27 17:40:27
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

OpenGL

 > PARTICLE ENGINE 2D OPENGL DEV-C++ - EFFETS DE FEU ETC [ MOTEUR DE PARTICULES ]

PARTICLE ENGINE 2D OPENGL DEV-C++ - EFFETS DE FEU ETC [ MOTEUR DE PARTICULES ]


 Information sur la source

Note :
9,94 / 10 - par 17 personnes
9,94 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :OpenGL Niveau :Débutant Date de création :14/06/2004 Date de mise à jour :01/09/2005 19:42:31 Vu / téléchargé :20 405 / 1 098

Auteur : Kirua

Ecrire un message privé
Site perso
Commentaire sur cette source (139)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Le code se présente sous la forme d'un ensemble de classes C++ qui forment, au global, un système de particules en 2D pour OpenGL.

Le concept: on dessine un très grand nombre (des milliers) de "particules" (carrés colorés et texturés plus ou moins transparents selon un facteur hasard et leur "âge": les particules meurent quand leur Vie atteint 0, c'est-à-dire lorsqu'elle sont complètement transparentes) à l'écran. Ces particules qui sont projetées (vive la théorie vectorielle ^^) dans une certaine direction à une certaine vitesse donnent un joli effet de feu dans le cas présenté ici, mais selon les paramètres on peut obtenir une trainée de poussière derrière un obus, une nuée d'étoiles etc... C'est une technique très amusante car si vous bidouillez avec les paramètres, vous obtiendrez souvent des choses étonnantes :)

Les specs:

- Génération dynamique de la texture des particules -> on ne doit pas fournir d'image
- Possibilité de coincer l'orientation des particules entre deux angles en degrés ([0,360])
   A noter: 40->140 est l'inverse de 140->40, il ne faut pas écrire -220->40
- Vitesse paramétrable ainsi que le facteur de réduction/croissance de celle-ci
- séparation en classes claires (j'espère ^^)
- Couleur paramétrable (au singulier, contacter Wett pour le pluriel ^^)

Le point original:

La classe CLieu représente un lieu géométrique de points (cercle, disque, rectangle "plaquette", point, mais aussi droite, parabole etc si l'on veut les coder). Ainsi, en associant un CLieu à un CParticleEngine, on peut aisément déterminer l'aspect de l'animation. Le feu en bas d'écran est une plaquette "ligne" (je n'ai pas codé les lignes, mais ça revient à ça). Le cercle est un cercle aplati à un facteur de 0.5 pour donner l'effet de perspective, et le flambeau vert est un point avec des angles de projections [40,140]°.

Je ne pense pas que cela existait déjà, en tout cas je ne l'ai jamais vu. Changer le Lieu en pleine animation devrait donner lieu à une transition intéressante, je n'ai pas encore testé, mais cela devient très simple grâce à ce système.

Source

  • //Exemple de config:
  • Engine2.SetFourchetteAngles(80, 100);
  • Engine2.SetFourchetteVitesse(1, 15);
  • Engine2.Rayon = 8;
  • Engine2.Lieu.Type = liCercle;
  • Engine2.Lieu.SetCentreEtRayon(400, 325, 250, 0.5);
  • Engine2.FacteurVitesse = 0.95;
  • Engine2.Couleur = CParticleEngine::clrEnergieBleue;
  • Engine2.CreerParticules(NbPart2);
  • //Note: le 4ème paramètre de SetCentreEtRayon() est le facteur de compression du lieu selon l'axe Y (cercle -> ellipse)
  • //cf ZIP évidemment
//Exemple de config:

    Engine2.SetFourchetteAngles(80, 100);
    Engine2.SetFourchetteVitesse(1, 15);
    Engine2.Rayon = 8;
    Engine2.Lieu.Type = liCercle;
    Engine2.Lieu.SetCentreEtRayon(400, 325, 250, 0.5);
    Engine2.FacteurVitesse = 0.95;
    Engine2.Couleur = CParticleEngine::clrEnergieBleue;
    Engine2.CreerParticules(NbPart2);


//Note: le 4ème paramètre de SetCentreEtRayon() est le facteur de compression du lieu selon l'axe Y (cercle -> ellipse)

//cf ZIP évidemment

 Conclusion

L'exemple du zip:

Dans l'exemple vous verrez un feu "classique" étendu en bas de l'écran et poussé par un vent vers la droite (jouez avec les flèches gauche/droite pour changer ça), un cercle énergétique bleu au centre de l'écran dont vous pouvez changer le rayon avec les touches haut/bas et une flamme/lampe/chalumeau verte au centre du cercle (j'avais plus de place ^^).
Si vous appuyez sur Enter, les particules cessent d'être régénérées, et les systèmes s'éteignent. Si vous rappuyez sur Enter, la régénération reprend son cours normal.


Ne regardez pas trop le main.cpp, c'est le bordel. Remarquez juste qu'il a fallu générer la texture en appelant Engine1.GenerateTexture(25) (25 = ID de la texture, arbitraire, oui c'est dégueulasse de faire ça comme ça) APRÈS avoir activé OpenGL et que les méthodes CreerParticules(x) sont appelées APRÈS les configurations des Engine_. Cela pour que les particules initiales respectent les contraintes du système.

Vous ne devrez créer que des objets CParticleEngine si vous utilisez ce code. Voyez le main.cpp pour la configuration de ces objets et leur utilisation (Objet.Deplacer(); Objet.Dessiner();).


TODO:

- implémenter une fonction Initialiser(type) pour paramétrer l'objet directement avec une configuration par défaut pour un feu, une lampe, des étoiles etc...
- utiliser une display list pour les particules d'un ParticleEngine [FAIT]
- rétablir un système d'axes non modifié (pour l'axe Y, s'entend)
- Passer en 3D?
- éliminer l'effet de discrétisation des positions des particules qui donne lieu à un effet de quadrillage indésiré dans certains cas.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

20 octobre 2004 16:19:40 :
Correction de (certaines ^^) fautes d'orthographe; plus de TODO;
01 septembre 2005 19:42:31 :
Suite à une mise à jour de G++, une liberté sur le standard que je m'étais permise n'est plus acceptée. C'est maintenant corrigé. Il y a trois exe dans le zip nommés nom.exe.cutable. Je vous laisse deviner comment les lancer :P. Merci à Florent Weillaert pour l'alerte ^^.

 Sources du même auteur

Source avec Zip DÉFI CHIFFRES DES CHIFFRES ET DES LETTRES, IA RECHERCHE EN P...
Source avec Zip Source avec une capture SIMULATION DE LA GRAVITATION SELON NEWTON (OPENGL / DEVC++)
Source avec Zip Source avec une capture CLASSE DE VECTEURS EN 2D / 3D PORTABLE, UTILISATION POUR SIM...
Source avec Zip Source avec une capture SNAKE 3D OPENGL DEV C++
Source avec Zip Source avec une capture TEMPS DEPUIS LE DÉMARRAGE DE WINDOWS

 Sources de la même categorie

Source avec Zip Source avec une capture AFFICHER DES COURBES DE BEZIER par shorzy
Source avec Zip Source avec une capture BASE/MOTEUR 3D EN QT/OPENGL (COMPLET ET FONCTIONNEL!) POUR U... par envi33
Source avec Zip Source avec une capture CLASSE AVEC OPENGL - OBJETS 3D ET ANIMATIONS par rasta63
Source avec Zip Source avec une capture LETTRES 3D AVEC OPENGL ET QT par opossum_farceur
Source avec Zip CUBE 3D GLUT32 VC++ ET DEVC++ par bobby03

Commentaires et avis

Commentaire de BumpMANN le 14/06/2004 23:39:45

10/10! sans contestes ! Bravo!

Commentaire de xarier le 15/06/2004 00:49:53

10/10 bravo amigos

Commentaire de BruNews le 15/06/2004 00:54:16 administrateur CS

Kirua, c'est joli tout plein et pour une fois voila un opengl qui daigne tourner chez moi.

Commentaire de Kirua le 15/06/2004 08:43:21

viens d'avr une idée, je la poste ici pour que je m'en souvienne parce que là je peux pas coder. Pour faire une trainée derrière le centre de l'objet, il faut déplacer le point Lieu du moteur de particules, et pas effectuer une translation supplémentaire. Comme ça, les particules ne se déplacent pas avec la translation. (faites pas attention, je me parle tout seul, c'est un post-it ;-))

Commentaire de Kirua le 15/06/2004 08:50:19

Désolé pour le mail supplémentaire, je viens de coder ça et ça marche! Suis content ^^, ça prend quasi rien comme lignes!

J'ai rajouté dans le zip un exécutable Win32 Particle2D_trainee.exe pour vous montrer l'effet, et un fichier main_trainee.cpp par lequel il faut remplacer main.cpp si vous voulez compiler cet exemple-là. Les seules modifs apportée au flambeau:


    //les particules vont vers l'arrière
    Engine3.SetFourchetteAngles(180-40, 180+40);
    //le centre du jet commence plus à gauche (100px)
    Engine3.Lieu.SetPoint(100, 335);

et dans la boucle principale:

            Engine3.Lieu.Param1+=15;

Ce qui déplace le centre du jet de 15 px vers la droite 30 fois par seconde!

Commentaire de Cyberboy2054 le 15/06/2004 10:37:17

Trop fort, j adore l effet de trainée :)
On peut par dessus ton systeme de gestionnaire de particules imaginer un gestionnaire des gestionnaires. Pour quoi faire ? ben au lieu d avoir
Engine1.Deplacer();
Engine2.Deplacer();
Engine3.Deplacer();
dans ta boucle principale, tu cree un gestionnaire qui n est ni plus ni pour qu une liste des moteur de particules, et qui se chargerait de mettre a jour et afficher les systemes de particules, puis supprimer ceux qui sont morts. Chais pas si je suis clair, mais ca fait un truc comme ca
class PartManager
{
std::list <CParticleEngine*> m_List;
public:
void AddSystem (CParticleEngine* pEngine)
{
m_List.push_back(pEngine);
}
void Update ()
{
// met a jour les systemes, supprime ceux qui sont usagés
}
void Draw ()
{
// dessine les systemes presents
}
};

comme ca tu peut initialiser le manager
PartManager g_Manager;
g_Manager.AddSystem (&Engine1); g_Manager.AddSystem (&Engine2); g_Manager.AddSystem (&Engine3);

puis dans la boucle principale
g_Manager.Update ();
g_Manager.Draw();

Voili voulou :)

Commentaire de Cyberboy2054 le 15/06/2004 10:53:56

Au passage, si tu code un moteur 2D, on va problablement avoir plein de trucs a se raconter :)
Meme si le mien utilise SDL pour le rendu a la place d opengl, les concepts restent les memes ...

Commentaire de Funto66 le 15/06/2004 10:54:04

L'effet est magnifique même sur ma carte graphique, même envoûtant des fois lol, bravo ;)

J'ai recompilé sous Visual C++ en supprimant tous lles errors et warnings (y'en avait un paquet :(, mais c'était surtout des histoires de conversions de types implicites ) je t'enverrai ça.

J'ai vu aussi dans ta génération de textures que tu utilisais un filtre GL_LINEAR; vu que les particules sont toutes petites on ne voit aucune différence lorsque l'on filtre en GL_NEAREST, et, chez moi en tous cas, les performances sont bien meilleures.

Extrait de ton code : "texPixels = (GLubyte *) malloc(texSize);" -> et toi qui me reprochais d'utiliser malloc() au lieu de new[]....d'ailleurs dans ce cas l'allocation dynamique n'est pas obligatoire vu que la taille de la texture allouée ne change pas...
Euh...d'ailleurs je viens de m'en rendre compte : si j'ai bien compris, ta texture est appliquée à chaque particule, chacune toute petite. Et ta texture fait 256x256??? C'est énorme !

PS : "//quelques couleurs remarquables qui seront souvent utilisées
static SRVB clrFeu, clrEnergieBleue, clrNauseabond;"

Mdr la couleur clrNauseabond :p

Commentaire de Kirua le 15/06/2004 11:02:27

CyberBoy: C'est une bonne idée, et je fais ça assez souvent quand je code une classe. Si j'en ai l'utilité, je le coderai (faudra juste rajouter une méthode pour savoir si le système est mort). Pas compliqué, mais je pense pas le coder ici. Dans mon moteur de RPG plus tard oui ;)

Funto: pourtant moi Dev m'embête déjà bcp pr que j'exprime les cast littéralement, comprends pas où il t'en a trouvé d'autres ton VC :(

La partie du code de génération de la texture n'est pas de moi, je l'ai extrait d'un code, d'ailleurs je dois encore rajouter les crédits de l'auteur. J'ai juste cherché à l'inclure dans ma classe sans chercher plus loin, je vais modifier ça, en effet c'est un peu idiot. Quant au malloc/free, je trouve ça moche :p je devrasi récrire la fct en fait.

j'adore ce vert ^^ autant que le bleu et le rouge/jaune en fait. Mais si l'animation n'est pas sur un fond noir, ça tue tout l'effet :( :( :(

Commentaire de Funto66 le 15/06/2004 11:58:45

Moi aussi j'adore ce vert ;)
Pour les casts, en fait, c'est surtout avec l'usage de constantes; 1.0 est un double et 1.0f et un float.
Y'avait aussi des erreurs dûes à l'inclusion de GL/gl.h sans inclusion de windows.h avant (je sais c'est stupide mais Visual C++ veut ça...), et aussi M_PI n'était pas défini dans math.h.
Y'a aussi un truc qui est bizarre, c'est que ça compile impec sur les 2 compilos alors que tu fais des #include <cmath>, #include <cstdio>...etc sans aucun using namespace std...

Je t'envoie le mail avec la version VC++ée.

PS : à un moment dans un commentaire tu fais référence au RPG Engine, je sais pas si c volontaire ou si c un oubli...

Commentaire de LordBob le 15/06/2004 11:59:20

c'est tres jolie !!! :)

Commentaire de Kirua le 15/06/2004 14:25:01

je savais pas pour le f après un nombre, je pensais que c'était facultatif, mais sans incidence.
je savais pas non plus que les libraires <c___> faisaient partie de l'espace de nom std, faudra que je modifie ça.

ben oui je fais référence en RPG Engine, bien entendu ^^ c'est pour ça que je l'ai créé ce moteur de particules, pour faire les effets des combats. Mais ça va faire bizarre ce truc "moderne" avec les graphismes rétro (vieillot? :p) du rpg...

Commentaire de gagah1 le 15/06/2004 14:44:21

Magnifique effet! 10/10.
J'ai recompilé la source en changeant la valeur du timer en 15ms et même avec des nombres de particules 3000, l'effet est plus naturel. Bravo!!!!!!!

Commentaire de Funto66 le 15/06/2004 14:58:56

Bah de toutes façons ils utilisent bien ça dans Final Fantaisy non?
Bon c'est sûr je pense pas que ton RPG ressemblera niveaux graphismes à Final mais bon ça sera un 1er pas :p

Commentaire de Kirua le 15/06/2004 15:03:10

ils utilisent ça dans les final fantasy en 3D, qui n'ont rien de rétro depuis 6 ans ^^ regarde FF7, c'est une pure bombe, et ça date de ...

je me demande juste ce que ça va faire ces grosses boules d'énergies dans les mains de mes sprites en 2D bien plate sur fond 2D bien plat ...

Commentaire de xarier le 15/06/2004 15:30:33

pense tu pas creé un jeu like street fighter et utiliser les particule comme des bull ( Hadouken) ca serait super :)

Commentaire de Kirua le 15/06/2004 15:37:02

à part Tekken 3 et DOA 3 j'aime bof les jeux de combat, et puis, c'est pas parce que j'ai l'anim que je vais faire le jeu, ça me paraît rapide comme saut^^ Mais le code source est à toi, tu es libres d'en faire ce que tu veux ;-)

Commentaire de xarier le 15/06/2004 16:19:28

Alors  tekken Vs Street :) :)

Commentaire de BumpMANN le 15/06/2004 16:49:09

Qui a osé mettre 9? O_o

Commentaire de xarier le 15/06/2004 17:03:33

il ont pas posé 9 mais oui
car il avait deja 10 + 8 / 2 = 9 mais c pas grave je vais faire en sorte que sa augmente regarde now

Kiruna mirite un 10/10 et ca va rester

Commentaire de xarier le 15/06/2004 17:03:53

il ont pas posé 9 mais oui
car il avait deja 10 + 8 / 2 = 9 mais c pas grave je vais faire en sorte que sa augmente regarde now

Kiruna mirite un 10/10 et je vais faire en sorte qu'il a

Commentaire de xarier le 15/06/2004 17:10:25

Bh ca na rien donner He j'ai mi la un 10/10 il ca n a fait aucun effet

Commentaire de Wett le 15/06/2004 17:22:29

Salut! Comme d'hab, excellente source ;)
Je viens de voir qu'une particule est gérée à l'aide de vecteurs, mais dans ta classe moteur c'est avec des angles... O_o plutot space comme truc... encore que non c'est pas idiot tu peux donner une fourchette et c'est bien mieux!
Simple question (pas trop le temps d'étudier ta source) le moteur est 2D ou 3D? On peut gérer un mouvement de caméra? Je pense à un exemple simple : une chute d'eau (vitesse initiale horizontale, acceleration verticale, couleur bleue-blanche (tu devrais mettre aussi des plages de couleur, genre possibilité de melanger selon des proportions + ou - alétoires plusieurs couleurs) ) ensuite on pourrait tourner autour, etc. Et donc l'intégrer dans un vrai moteur 3D! Meme en 2D ça peut toujours servir...
Tu devrais aussir permettre de gérer la mortalité de tes particules de differentes manières : pourcentage de mort à chaque secondes (genre la radioactivité), distance du point initial, temps etc... Que le tout soit paramétrable et bien sur soit tout de meme plus ou moins aléatoire comme tu t'es attaché à la faire jusqu'à présent...
Bon voila un peu à court d'idée là mais j'espere que ça t'aidera... Et en fait meme apres avoir regardé ta source je comprends pas bien comment tu gere la vitesse et l'accéleration d'une particule... Un mélange d'angles et de vecteurs ok je comprends mais... La vitesse ET l'accélération ont un angle bien distinct? Je repense toujours à mon exemple de chute d'eau : c'est réalisable? Désolé de poser des questions bêtes je peux pas compiler d'ici sinon j'aurais bien essayé voir ce que je pouvais faire ;)
a+ et encore bravo!

Commentaire de Kirua le 15/06/2004 17:41:25

Salut Wett, thx pr le commentaire élaboré ^^

Le moteur est 2D complètement, donc pour l'adapter à de la 3D, faudrait du travail, à commencer par récrire une classe CVecteur3D et à remplacer tous les calculs de position (récrire Lieu et ses paramètres aussi...).

C'est vrai que la mortalité c'est le seul truc que j'ai pas rendu paramétrable, je devrais changer ça (juste quelques lignes mais dans plusieurs classes). Faut d'ailleurs aussi récrire la génération de texture.

Le mouvement de caméra, ben c'est en 2D, y a pas moyen ;-) mais si tu déplaces le lieu du système, les particules mortes renaissent toujours dans le nouveau lieu, ce qui permet les effets de trainées, puisque les particules en vie continuent de se mouvoir selon leur mvmt originel, indépendemment du déplacement du système. Tu pourras aussi simplement faire des transitions d'un point à un cercle puis d'un cercle à une droite, le tout en changeant les couleurs, ce serait simple à coder.

Pour les variations de couleurs d'ailleurs, c'est une idée... pas long à coder non plus mais il y a un problème: une particule ponctuelle doit garder la même couleur tout le temps, donc il faudrait donner une propriété Couleur à chaque particule (SRVB = 3*4 octets). Pour 10 000 particules ça fait 120 Ko de plus... c'est trop coûteux je trouve. A nouveau, c'est vrmt trivial à coder, donc si ça amuse qq un :)

Quant au mvmt des particules, m'étais demandé d'abord: est-ce que je dois gérer la gravitation? -> c'est tt léger, ça n'a "pas" de masse, donc non. Donc, il s'agira d'un mvmt rectiligne uniforme? pas vrmnt, elles sont quand même freinées par leur milieu... donc j'ai opté (sur conseil d'un tuto ;-)) pour l'option suivante: à chaque déplacement, je me contente de multiplier le vecteur vitesse (pas accélération!) par le scalaire FacteurVitesse (ce qui aura pour effet de modifier le module de la vitesse et donc la valeur scalaire de la vitesse) et ensuite j'additionne le vecteur vitesse au vecteur position de la particule, ce qui a pour effet de bien déplacer la particule dans le sens et la direction du vecteur vitesse.

Les composantes du vecteur, par trigonométrie élémentaire, sont calculées selon les sinus et cosinus de l'angle (cf. Cercle Trigonométrique) et le module, ben c'est du Pythagore :)


PS: si vous avez la possibilité de compielr chez vous, essayez de remplacer dans le code "main_trainee.cpp" le code d'initialisation de l'engine3 (la boule qui se déplace) par ça:

    Engine3.SetFourchetteAngles(360-40, 0+40);
    Engine3.SetFourchetteVitesse(4, 25);
    Engine3.Rayon = 8;
    Engine3.Lieu.Type = liPoint;
    Engine3.Lieu.SetPoint(100, 335);
    Engine3.FacteurVitesse = 0.95;
    Engine3.Couleur = CParticleEngine::clrFeu; //CParticleEngine::clrNauseabond;
    Engine3.CreerParticules(NbPart3);

ça fait un jet amusant ^^

Commentaire de neo_00110010101 le 15/06/2004 20:35:26

excellent, magnifique, beau ... comme la note :)

tu n'as pas mis longtemps à sortir ta "petite" source que j'attendais :]

Commentaire de gagah1 le 15/06/2004 20:49:08

Salut!
J'ai regardé la source. Si tu mets le rayon (taille de particule) en valeur aléatoire comprise dans une fourchette et si la texture au lieu de rond , tu mets en ovale comme suit:
GLuint dist = (unsigned)hypot(float(i-(texHeight/2)),float(j-(texWidth)/2))*2.0); l'effet sera plus réel.
Aussi, gère independamment le timer.
Dans la texture un 64x64 sera suffit ,meme 32x32 ,car le particule est petit, là tu perds quelque ms en utilisant 256x256.
A part celà c'est très bien.
J'ai remarqué aussi la presence de glBegin(GL_TRIANGLE_STRIP) dans le boucle for(...), tu peut mettre cela en dehors du boucle en remplaçant par (gl_Begin(GL_QUADS)) et changer le 4e glTexCoord en 3e. On gagne aussi quelque ms. Voilà , bonne prog!

Commentaire de Kirua le 15/06/2004 20:55:06

le rayon des particules, tu suggères qu'une particule ait un rayon fixe généré aléatoirement, ou que le rayon de la particule soit redéfini à chaque frame? parce que dans le premier cas, c'est la même réponse qu'à Wett pr les couleurs: il faut minimiser les données nécessitées par les particules parce qu'il y en a bcp! faut être raisonnable dans la paramétrisation ^^

pour le timer, je l'ai vrmnt écrit en 4 secondes ;) c'était seulement pour l'application de démo (et de test). dans mon rpg, ce sera le timer du jeu qui fera la loi, et dans vos applications (éventuellement), ce sera le vôtre, pas de souci.

pour les triangles, j'ai suivi un conseil sur un site qui disait que les triangles étaient plus rapides à dessiner qu'un rectangle (même 4 triangles dans ce cas-ci! étonnant non?).

quant à la texture, c'est un des points à changer en effet.

Commentaire de djl le 15/06/2004 20:55:09

exelent ! 10/10

Commentaire de Kirua le 15/06/2004 21:03:41

Voici le code pour des textures plus petites (j'ai juste dû apporter qq modifs pour qu'il ne faille (mtnt) plus que changer les deux premières lignes pour changer la définition de la texture:

j'ai changé ça:
     float color = 255-(dist*1.8);
en ça:
     float color = 255-(dist*1.8*(256./texWidth));


//---------------------------------------------------------------
void CParticleEngine::GenerateTexture(int id)
{
int texWidth = 64;
int texHeight = 64;
GLubyte *texPixels, *p;
int texSize;
int i, j;
int radius;

texSize = texWidth*texHeight*4*sizeof(GLubyte);
texPixels = (GLubyte *) malloc(texSize);
if (texPixels == NULL)
  return;

p = texPixels;
for (i=0; i<texHeight; ++i)
{
   for (j=0; j<texWidth; ++j)
   {
     GLuint dist = (unsigned)hypot(float(i - (texHeight / 2)),float(j - (texWidth / 2)));
    
     float color = 255-(dist*1.8*(256./texWidth));
     if (color < 0) color = 0;
     p[0] = (char)color;
     p[1] = (char)color;
     p[2] = (char)color;
     p[3] = (char)color;  
     p+=4;
   }
}

glBindTexture (GL_TEXTURE_2D, id);
//glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, 3, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, texPixels);

free(texPixels);

TextureID = id;
}
//-------------------------------------------------------------

Commentaire de Funto66 le 15/06/2004 23:47:16

Tous les CParticuleEngine utilisent la même texture; ça serait pas mieux de créer son ID en static?
Je veux dire, plutôt que de donner un ID de texture arbitraire à chaque CParticuleEngine, d'autant plus que cet ID est le même pour tous, je verrai la chose comme ça :
- un membre de CParticleEngine : static GLuint IdTexture;
- à l'appel du constructeur de CParticuleEngine :

static bool PremierPassage= true;
if(PremierPassage)
{
glGenTextures(1, &IdTexture); // Evite d'utiliser un ID arbitraire; par contre dans tout le programme faudra utiliser des glGenTextures au lieu d'IDs arbitraires, ce qui est beaucoup plus clair et fiable.

// ICI : génération de la texture...
PremierPassage = false;
}

- la méthode CParticuleEngine::Dessiner() utilise IdTexture.

Commentaire de Xs le 16/06/2004 00:10:43

Salut !

Si tu veux t'en servir dans un ptit rpg 2D, j'ai trouvé ca (c'est a peu prêt comme ca que je m'en servirai dans le mien) :

Engine3.SetFourchetteAngles(80, 100);
Engine3.SetFourchetteVitesse(4, 15);
Engine3.Rayon = 8;
Engine3.Lieu.Type = liPoint;
Engine3.Lieu.SetPoint(400, 335);
Engine3.FacteurVitesse = 0.95;
Engine3.Couleur = CParticleEngine::clrFeu;
Engine3.CreerParticules(50);

50 particules seulement pour un truc assez sympa.

Sinon, je suis pas habitué à l'openGL (je fais du DX9) donc je me pose une qustion : tes particules, ce sont bien des triangles ? Je veux dire, qu'est ce que tu dessines ? Un carré ou un triangle ? ou autre chose ?

merci

Commentaire de xarier le 16/06/2004 00:24:42

bh jj'ai pas vue mais la plus part des fois en utilise des carré la aussi je pense qu'il utilisé des carré

Commentaire de xarier le 16/06/2004 00:25:31

bh jj'ai pas vue mais la plus part des fois en utilise des carré la aussi je pense qu'il utilisé des carré

Commentaire de Kirua le 16/06/2004 07:59:44

Funto, ton postulat de départ est erroné: tous les CParticleEngine's n'utilisent pas la même texture, et c'est bien pour ça que j'ai opté pour ce système. Ce qui est vrai, c'est que je pourrais avoir un flag qui détermine si la texture a déjà été générée, et j'y ai pensé. Mais on ne veut pas forcément créer la texture! Donc je laisse ça au gestionnaire de CParticleEngine's (je dois lui trouver un nom ;-))

Salut Xs. Ton effet esxt OK pour un petit flambeau ou qqch du genre, en effet, faudra que je pense à le mettre dans les donjons :p
Si tu veux convertir le code pour DirectX, c'est vraiment, vraiment easy. Tu ne dois changer que la méthode de Dessiner de CParticleEngine ainsi que la fonction GenerateTexte. C'est tout!
Je dessine en fait 4 triangles qui forment un carré. J'ai lu que c'était "mieux", et en général je fais confiance ;-)

Commentaire de Wett le 16/06/2004 10:53:11

Kirua pour les couleurs, il ne faudrait pas conserver les couleurs pour chaque particule, simplement conserver par ex 255 couleurs differentes max et de conserver uniquement l'indice de la couleur dans chaque particule... ça reduit à un octet.. et on se reduit à meme pas 10Ko en plus, ça se tiens je trouve...
Sinon c'est dommage que tout soit en 2D pure meme si je comprends que ça te simplifie grandement la tache... Je verrais si je peux pas trafiquer un peu ça des que j'aurais à nouveau acces à internet depuis mon pc ;) idem pour les couleurs ^^

Commentaire de Kirua le 16/06/2004 10:59:24

la 3D serait pas plus dure à coder (effectuer la modif mtnt est lourd, mais si depuis le début j'avais tout orienté 3D, ça n'aurait pas été sensiblement plus compliqué). je l'ai fait en 2D parce que mon moteur de jeu est en 2D et que donc, ben pas besoin de 3D ^^

Commentaire de Xs le 16/06/2004 11:12:52

Merci pour l'info Kirua mais : 4 triangles pour un carré ? Un carré moi je le divise en 2 triangles non :S ?

Sinon, je vois pas trop pourquoi vous vous prenez la tête avec des 120Ko, 10Ko, etc... : je vous rappel qu'un jeu (2D qui plus est) doit être 100% orienté vitesse : donc vaut mieux stocker quelques données pour gagner quelques fps (multipliés par le nombre de particules) que quelques kilo.. A moins que vous soyez restés à l'époque des HDD de 3Mo : Ce ne sont pas quelques centaines de kilo qui vont surcharger un HDD d'une 50aine de gigas (Les nouveaux jeux se fichent de leur consommation en place : ils veulent juste aller vite : quake3, ut2k4..) !

cordialement

Commentaire de Wett le 16/06/2004 11:18:35

Ici il n'est pas du tout question de HDD ou de sacrifier de la vitesse pour conserver de la mémoire (c'est fini l'époque des 512Ko de ram... On en est conscient t'inquiete!), simplement d'optimisations et d'éviter de bouffer trop de ram pour un simple moteur de particules, qui n'est qu'un supplément dans un moteur et non un programme à lui tout seul... Donc plus il est léger (autant en mémoire qu'en temps machine) mieux c'est!

Commentaire de Kirua le 16/06/2004 11:20:24

les 120 Ko ils vont ds les gencives de la RAM, et c'est pas parce que t'as 1024 Mo de RAM que 120 Ko ça ne représente rien. La fonction new d'allocation mémoire est très lente, elle doit chercher des plages mémoire continues dans la mémoire vive. Si tu cherches un tronçon continu de 120Ko tu risque de plus t'amuser que si tu cherches 4 octets pour stocker ton int. Le résultat il est clair: vitesse d'exécution en chûte. Puis je vois pas le rapport avec un disque dur ^^ si tu stockes ces données ds le DD t'es parti pour la gloire avec ta vitesse d'exécution ;-)

Commentaire de Xs le 16/06/2004 11:23:43

Arg :D

Vous avez tout les deux raisons et Kirua a un excellent argument que je ne connaissais pas :D Pour le HDD, je me suis emmelé les pinceaux et pensais à la RAM (mais une fois que j'ai dis HDD je suis partis dedans :'( )

merci, je m'en vais, tête baissée, programmer un moteur en DX :D
cordialement

Commentaire de Wett le 16/06/2004 11:24:22

LOOL j'imagine trop le concept : Pour optimiser l'acces à la ram et eviter de trop en bouffer... Privilégiez la mémoire virtuelle!!! ARGGG ou mieux : ils vont nous sortir de la HDDR à debit maxi de.... 50Mo/s!!! la galere... Pardon private joke ^^

Commentaire de Xs le 16/06/2004 11:30:57

Spa bien de se moquer :'(
Jtaurai toi à la première gaffe  :D

Commentaire de Wett le 16/06/2004 11:33:42

je me moquais pas de toi promis ^^ Juste je reprennais le concept parce qu'il se defandait ^^ Et t'inquiete si tu veux m'avoir à la 1ere gaffe tu va pas chercher longtemps ;o)

Commentaire de Kirua le 16/06/2004 11:49:47

malheureusement avec Wett on risque de chercher longtemps parce qu'il s'enferme à Lyon. Il sait qu'il dit bcp de bêtises alors il se met ds un endroit où y a que des daubes comme connexions internet, et comme ça il risque pas de se dévoiler... naaah, c bientôt les vacances, tu vas retourner chez toi, pas vrai? on t'aura plus svt :)

le truc de l'opéro new qui est lent, j'ai pas trouvé ça tout seul, c'était dans un document sur les optimisations à prendre en compte en C++, tout spécialement en ce qui concerne les chaînes de caractères (qui sont dég. en C/C++ ;))

http://www.joelonsoftware.com/articles/fog0000000319.html

ça vaut vrmnt le coup de le lire en entier

Commentaire de Kirua le 16/06/2004 11:54:25

L'extrait qui nous intéresse: (url du document, commentaire précédent). ça parle de malloc et free en fait, pas de new et delete, mais je suppose que c'est le même genre de fonctionnement (?)

That opens another whole can of worms: memory allocators. Do you know how malloc works? The nature of malloc is that it has a long linked list of available blocks of memory called the free chain. When you call malloc, it walks the linked list looking for a block of memory that is big enough for your request. Then it cuts that block into two blocks -- one the size you asked for, the other with the extra bytes, and gives you the block you asked for, and puts the leftover block (if any) back into the linked list. When you call free, it adds the block you freed onto the free chain. Eventually, the free chain gets chopped up into little pieces and you ask for a big piece and there are no big pieces available the size you want. So malloc calls a timeout and starts rummaging around the free chain, sorting things out, and merging adjacent small free blocks into larger blocks. This takes 3 1/2 days. The end result of all this mess is that the performance characteristic of malloc is that it's never very fast (it always walks the free chain), and sometimes, unpredictably, it's shockingly slow while it cleans up. (This is, incidentally, the same performance characteristic of garbage collected systems, surprise surprise, so all the claims people make about how garbage collection imposes a performance penalty are not entirely true, since typical malloc implementations had the same kind of performance penalty, albeit milder.)

Smart programmers minimize the potential distruption of malloc by always allocating blocks of memory that are powers of 2 in size. You know, 4 bytes, 8 bytes, 16 bytes, 18446744073709551616 bytes, etc. For reasons that should be intuitive to anyone who plays with Lego, this minimizes the amount of weird fragmentation that goes on in the free chain. Although it may seem like this wastes space, it is also easy to see how it never wastes more than 50% of the space. So your program uses no more than twice as much memory as it needs to, which is not that big a deal.

Commentaire de StanOfSky le 16/06/2004 14:12:03

ouai la fonction la plus rapide est bien triangle_strip donc faire des carré. a noter que les objets 3d sont tres souvent exporté sont un format triangle_strip pour l'optimisation du rendu.
bien entendu 2 triangles = un carré (ou rectangle ou paralelogramme)

pour ce qui est de allocation en effet c assez lent c pourquoi fau faire ses allocation au tout début quitte à prevoir l'espace que tu devras allouer
de maniere générales tous les calculs lourds qui n'ont pas besoin d'etre dynamique ou qui peuvent etre précalculé doivent etre fait au debut quitte a perdre un peu d'espace ram pour plus de rapidité dans l'exécution.

sinon c vrai que le moteur est assez bleuffant, le rendu est vraiment tres beau.
mais chez moi c po tres rapide donc reste à optimisez tout ca.
parce qu'avec 6500 particules pour les 2 premiers et 2000 pour le 3e ca rame un peu
et pourtant j'ai une GF2 1600+ qui supporte parfaitement UT2004 ou warcraft iii ;)

Commentaire de xarier le 16/06/2004 14:19:58

hi bh la chez moii ca marche vraimment tres lent avec 6500 alors si quelqu'un peu l'optimizer :

j'ai un p4 1.60 GHz 520 mo ram .

Merci

Commentaire de Xs le 16/06/2004 14:22:31

euh chez moi aucuns problémes avec 6500*2 + 2000 particules sur une G4 Ti4200 128Mo, 512 DDR et un 1.1Ghz (AMD TBird)

Commentaire de xarier le 16/06/2004 14:43:00

bh ca peut que ca soit ma carte graphique car j'ai une de  32 Mo

Commentaire de Wett le 16/06/2004 14:53:02

Là c'est sur, le seul facteur c'est la vitesse brute de la carte graphique qui joue, les effets sont simples et ne demandent pas je pense plus de 16 Mo de ram... Et c'est pas le proco qui prend donc --> CG

Commentaire de Kirua le 16/06/2004 15:18:35

hmm, l'exe du zip est compilé avec la texture à 256*256 pixels. si vous recompilez avec le code que j'ai mis plus haut (je me souviens plus si j'ai modifé le zip avec la màj...) pour passer à une texture 64*64 (32*32 c'est pas très beau), vous aurez des meilleures perf!

ts vos ordinateurs st excellents, si mon moteur est lent sur ces ordis, c'est la faute du programmeur qui est un incapable, ça c'est du certain ;-)

Commentaire de xarier le 16/06/2004 16:03:40

non mais please moi j'ai pas le devc++ alors la je ne peut avoir L'image. peut tu le recompiler pour Moi
ta mon mail ta msn alors ..fill le moi please :)

Commentaire de Funto66 le 16/06/2004 18:16:56

J'admet mon erreur (quelques dizaines de posts plus haut lol), je savais pas que tu voulais laisser au programmeur la possibilité d'utiliser une autre texture que celle que produit GenerateTexture().

Au sujet de malloc()/free() vs new[]/delete[] en fait la principale différence c'est que new[]/delete[] appellent le constructeur de chaque objet alloué, C++ oblige.

Donc, quand on alloue des GLubyte comme dans ce cas, en toute logique new[] les initialisera à 0 (c'est ce que fait le constructeur par défaut non?) alors qu'on n'en a pas besoin -> garde les malloc()/free().
Arrêtez-moi si j'ai (encore...) dit une connerie, je ne suis pas sûr du tout de ce que j'avance mais c'est ce il me semble que c'est ça...

Ah oui aussi; y'a un glDisable(GL_TEXTURE_2D); à la fin de CParticleEngine::Dessiner() ; ça pourra conduire un gars qui veut utiliser le moteur de particules et qui n'aura pas lu le code à se demander pourquoi sa *** de texture ne veut pas s'afficher...
Le mieux dans ce cas-là c'est d'utiliser glPushAttrib()/glPopAttrib().

Commentaire de xarier le 16/06/2004 18:35:31

Hoola pardon pour tout a heur car j'avait pas lue la  source.
Mais apres que je l'ai lue  j'ai changer l'image 256/256 par 32/32
et ca merche meiux :)

Commentaire de Kirua le 16/06/2004 18:51:45

les types embarqués du C++ n'ont pas de constructeur, donc si je n'utilise pas GLuint mais unsigned int, je peux utiliser les new[] et delete[] sans perte de performance.

Pour les glPushAttrib tu as parfaitement raison. J'ai compris à quoi ça servait en lisant quelques codes, mais comme je n'étais pas absolument certain du fonctionnement, je ne l'ai pas implémenté. D'ailleurs je devrais généraliser l'usage de cette fonction! Est-ce que tu pourrais me donner un mot d'explication sur ces fonctions, et aussi (si tu sais) me dire si ces appels répétés à glEnable/glDisable sont couteux, où si ils ne font que modifier des flags (bool) ?

Xarier, tu as su compiler alors?

Commentaire de Cyberboy2054 le 16/06/2004 19:57:05

Ben Opengl c est une machine a état. Ca veut dire qu elle fait toujours la meme chose tant que son etat ne change pas. Et comme ces états sont sur la CG, lui faire appel coute cher ... C est pour quoi vaut mieux eviter
for  (....)
{
glBegin (...)
}
et mettre plutot
glBegin (..);
for (...)
{

}
car a chaque fois que tu passe dans ta boucle tu demande de faire qqch qui ne sert a rien (sil te plait la CG, mets moi les blending dans son état actuel ...), ce qui est forcément couteux.

Commentaire de Kirua le 16/06/2004 20:32:42

ok, merci pr l'info.
j'ai jamais mis de glEnable dans une boucle, c'est déjà ça :p quoiqu'au final, le programme étant une boucle, ça revient à ça aussi, mais en moins con ^^.

Commentaire de StanOfSky le 17/06/2004 12:19:49

ouai ya des petites techniques pour optimiser un peu les rendu opengl....
ya
* utiliser des listes d'affichage (bon la ct po possible bien que...)
* utiliser des tableau de points (pareil encore pour faire un carré c po nécessaire bien que...)
* penser à changer les états une fois pour toutes, ou tout du moins un minimum de fois : cad a dire eviter de les mettres dans une boucle
* générer les textures de facon aproprié : ici gl8linear sert pas a grand chose, fau mettre gl_nearest
* utiliser push et pop au lieu de faire des rotation ou translation supplémentaires, et surtout utiliser les opérations matricielle de opengl (gltranslate etc...) car elles seront bcp plus optimisées que toutes celle que tu pourras faire

parce que la faut qd meme une grosse carte graphique pour des effets qui sont pourtant tres basiques ;)

pour ce qui est des new et delete, ca n'apelle pa de constructeur pour les types de base comme les int, double etc....
par contre apres fau savoir ce qu'on veut...si on fait du C++ on  utilise des new et delete po malloc (a part dans certain constructeur pour des utilisations bien particulieres) ou alors on fait du C

Commentaire de Funto66 le 17/06/2004 23:50:15

Pour glPushAttrib()/glPopAttrib() , d'après ce que je me rappelle de "OpenGL 1.2", ça permet de mettre dans une pile des "attributs", en gros une partie de l'état actuel d'OpenGL : des informations relatives à l'éclairage, à la couleur...etc, presque tout quoi.
Mais exactement, comment l'utiliser, ben j'ai pas le bouquin sur moi et j'ai la flemme de le chercher lol.

Pour les appels à glEnable()/glDisable(), je ne pense pas que ça soit vraiment coûteux (comme tu dis, à mon avis ce sont des flags) mais je n'en suis pas sûr du tout.

En fait, plutôt que d'utiliser push/pop attrib, tu pourrais aussi faire un truc du genre :

GLboolean texture_enabled = glIsEnabled(GL_TEXTURE_2D);
glDisable(GL_TEXTURE_2D);
if(texture_enabled) glEnable(GL_TEXTURE_2D);

(je sais pas du tout si ce que je viens d'écrire est compilable).

Commentaire de Kirua le 17/06/2004 23:57:17

l'idée y est. mtnt, je trouverais étonnant si c t tellement couteux que ça que OpenGL n'ai pas ce système "built-in"

examen de latin demain (enfin, presque ajd), je go :/

Commentaire de Cyberboy2054 le 18/06/2004 19:33:50

En fait le truc avec glPushAttrib c est que c est lent si tu lui passe en parametre GL_ALL_ATTRIB_BITS, ce qui fait une sauvegarde de TOUS les etats. Par contre, si tu touche un peu au blending, un peu aux textures ... tu peux tres bien faire glPushAttrib (GL_TEXTURE | GL_BLEND ); afin de sauvegarder l etat d opengl avant ta fonction  puis un glPopAttrib() afin de les retablir en sortant.
Mais le truc de Funto marche aussi très bien, c est dailleurs ce qu il est conseillé de faire dans la plupart des cas, cad ceux ou tu sais ce que tu modifie. GL_ALL_ATTRIB_BITS, c est la solution du flemmand (Oui je l utilise ? et alors ?) car ca evite davoir a chercher quels etats tu modifie pour ne pas les alterer.
Ca evite de modifier definitivement les etats d opengl, alors que tu n en as besoin que pour une portion de ton code.
Chuis sur que j ai du dire plusieurs fois la meme chose, mais j ai un peu la flemme de relire la ... =)

Commentaire de Kirua le 18/06/2004 19:50:38

c'est très clair, pas de souci, je devrai penser à l'implémenter.
là j'ai codé mon premier algo pour n reines, temps de programmation < 1h.

Commentaire de cppdupdup34 le 18/06/2004 20:43:55

c'est tres zoli

Commentaire de StanOfSky le 18/06/2004 22:52:19

en fait je parlais pas de glPush/PopAttrib mais de glPush/PopMatrix() puisque je parlai des matrices de transformation 3D (rtanslate, rotate etc...) de meme vau mieux utilisser les opérations matricielle d'OpenGL
j'ai pu exactement le graphique de fonctionnement du moteur graphique OpenGL mais changer les etats sans arret ralenti le fonctionnement donc vau mieux les changer qu'au bon moment et pas toutes les 2sec...

Commentaire de Kirua le 18/06/2004 22:56:11

"pas toutes les deux secondes"
...
à 30 FPS ça fait bcp de fois par 2 secondes :/

Commentaire de eldered le 19/06/2004 09:39:06

Très sympas, beau travail Kirua.

Commentaire de Wett le 21/06/2004 01:23:54

Et voila comment optimiser un code en une seule leçon!
Alors maintenant je sais pourquoi tu laissais la texture en 256x256...

CParticleEngine.cpp ligne 108 tu mettais
GLuint dist = (unsigned)hypot(float(i - (texHeight / 2)),float(j - (texWidth / 2)));

Alors forcément qd la texture était pas en 256x256 ben le calcul était faux...
On remplace par
GLuint dist = (unsigned)hypot(float(i - (texHeight / 2))*256.0f/texHeight,float(j - (texWidth / 2))*256.0f/texWidth);

Et hop, on met la texture en 16x16, on a strictement le meme resultat graphique, et des perfs... 10x supérieures??? Je sais pas j'ai pas d'affichage du fps mais c'est bien plus que flagrant... Ce que je sais c'est qu'en mettant 20 000 à chaque systeme, sur ma geforce4Mx, ben je dois tourner dans les 20fps...
lool pardon je me fait plaisir mais ça me troublait depuis un bout de temps que pour un dessin si petit, une texture si grosse soit necessaire, alors maintenant que je peux compiler...

Commentaire de Wett le 21/06/2004 03:07:01

Bon décidemment j'ai décidé de faire mumuse avec ton programme :)
Alors j'ai commencé à rajouter (c'est sale mais ça marche) une gestion d'accélération (gravité...) Et franchement ça rend bien! :)

Néanmoins quelques limitations : Il faudrait prévoir de laisser choisir la marge de mortalité des particules (hyper important pour une fontaine, moi comme j'ai fait il faut attendre qlq secondes avant d'avoir qlq chose de fluide et bien réparti) ou alors de ne pas toutes les créer au meme moment (genre donner un nombre max à ne pas depasser et un flux = le nb de particules lancées par seconde)
Encore autre chose : pour ta classe vecteur, passer en float au lieu de int, c'est vraiment trop visible, perso je vois des rangées de particules... Bon qlq part en tout cas y'a des int à passer en float, pas forcément dans la classe vecteur à bien y réfléchir...

Bref voila ce que ça donne :
http://perso.wanadoo.fr/wett/images/screen1.jpg

Les modifs sont simples, que des ajouts ou qlq modifs:

*CParticle.h

CParticle(int AngleMin, int AngleMax, int VMin, int VMax, int Accelx, int Accely, CVecteur2D Pos);
CVecteur2D Acceleration;

*CParticle.cpp

Dans CParticle::CParticle( etc )
Acceleration.X = Accelx;
Acceleration.Y = Accely;

Dans void CParticle::Deplacer()
Vitesse += Acceleration;

*CParticleEngine.h

int   Accelx, Accely;

*CParticuleEngine.cpp

Dans void CParticleEngine::CreerParticules(int nb)
Particules[i] = CParticle(AngleMin, AngleMax, VMin, VMax, Accelx, Accely, Lieu.GetCouple());

Et bien sur dans main.cpp, on désactive les 2 premiers engine et le 3e:

    Engine3.SetFourchetteAngles(-10, 10);
    Engine3.Accely = -1;
    Engine3.SetFourchetteVitesse(-10, 10);
    Engine3.Rayon = 8;
    Engine3.Lieu.Type = liPlaquette;
    Engine3.Lieu.SetCoinsRect(350, 250, 100, 0);
    Engine3.Couleur = CParticleEngine::clrEnergieBleue;
    Engine3.CreerParticules(NbPart3);

Sans oublier les qlq modifs pour pas lagguer ;)
Voila je crois n'avoir rien oublié, sinon bah vous voyez surement ou je veux en venir et vous modifiez en conséquence :)
Encore merci kirua pour cette source! A+ et bonne prog

Commentaire de Wett le 21/06/2004 03:24:43

:) Encore moi :) Promis apres je vais me coucher :)

un autre rendu style jet d'eau que j'aime bien, toujours rien d'extraordinaire mais bon :)

    Engine3.SetFourchetteAngles(40, 60);
    Engine3.Accely = -2;
    Engine3.SetFourchetteVitesse(15, 20);
    Engine3.Rayon = 8;
    Engine3.Lieu.Type = liPoint;
    Engine3.Lieu.SetPoint(400, 335);
    Engine3.Couleur = CParticleEngine::clrEnergieBleue;
    Engine3.CreerParticules(NbPart3);

Pour un petit apercu, http://perso.wanadoo.fr/wett/images/screen2.jpg

Commentaire de Funto66 le 21/06/2004 14:45:45

Yeah, j'attends avec impatience l'update :)

Commentaire de xarier le 21/06/2004 15:30:07

oui moi aussi j'attend avec impatience !!!!!!!!!!!!

Commentaire de Wett le 21/06/2004 16:53:24

Ben le kirua ça fait qlq jours que je le vois plus du tout... Kirua mon ami ou es-tu? :p

Commentaire de Kirua le 22/06/2004 13:10:46

Aaaaah, mes amiiis :-D
j'ai un secret à vous confier ...

<whisper>
je suis en vacances
</whisper>

J'ai passé mon examen de français avec brio ^^ (mention Très Bien), et mtnt je suis libre.

J'ai lu tous tes comments Wett, merci de t'être intéressé à mon code, ça me donne l'impression qu'il était assez propre :p L'idée de l'accélération est bienvenue, c'est d'ailleurs un grand classique des moteurs de particules. Les particules n'ayant pas de masse, je m'étais dit qu'une simulation de gravitation serait une insulte à Newton, mais il est mort: l'effet sur tes screens est franchement chouette! La manière dont tu l'as implémenté ne me satisfait paaaas tout à fait, comme j'ai déjà dit: hors de question de rajouter des propriétés à CParticle, pas de place pour ça. Je préfère de loin donner soit un vecteur Acceleration à CParticleEngine. Le générer aléatoirement entre deux bornes n'est pas une option, puisqu'il faut que le vecteur soit le même pour une particule à chaque instant (aaah, dé-rîves enchantées (suis allé à la mer hier)). Le mouvement de la particule sera de tte façon bien différent en fct de sa vitesse (vectorielle) de départ, pas de panique.

En fait, le "facteur vitesse" devait rendre un effet de frottement dans l'air (réduction/croissance du module de la vitesse, mais conservation de la direction), avec l'accélération,  ça va faire de plus en plus vrai ^^

j'ai un peu de temps dans une heure ou deux, et après j'vais m'hydrater toute la nuit.

Commentaire de Wett le 22/06/2004 13:29:32

Ouais c'est vrai c'etait idiot de mettre le vecteur acceleration dans CPArticle puisque c'est tjs le meme j'avais pas fait attention... Le mettre dans CParticleEngine suffit puis on update directement à partir de là... Ca se fait aisément ;) Des que j'ai un peu de temps je modifie ça si tu l'as pas fait et je m'occupe de la gestion des couleurs (promis je rajoute que 1 octet par particule, je peux pas faire moins ^^) et de la gestion de flux (qui va permettre un rendu carrément chouette et plus simple d'utilisation dès qu'on gere des particules à longue vie)
Pour le facteur vitesse c'est pas idiot faut voir les resultats... En tout cas le laisser en option!

En tout cas bravo pour tes exams ;) Et content de te voir libre ;)

Commentaire de Kirua le 22/06/2004 13:34:21

vive la liberté.

le facteur vitesse est à 1.0f par défaut, comme ça, aucun effet. le mettre à plus que 1 accélère la particule (effet contraire aux frottements cinétiques) et le mettre à moins de 1 (mais plus que 0) crée un effet de frottement cinétique justement.

c'est quoi l'histoire de flux? pr la mortalité, je suis bien d'accord qu'il faut la rendre paramétrable. je vais coder l'accélération mtnt, occupe toi des couleurs plutôt ;) tu vas créer une palette 256?

eh, l'effet de facteur vitesse, il est activé depuis le premier post de la source, t'avais pas vu?

Commentaire de Kirua le 22/06/2004 14:29:16

http://nboumal.free.fr/ParticleEngine2DAccelerationRouge.png

- mortalité paramétrable
- accélération paramétrable

on voit en effet l'apparition de lignes sur lesquelles les particules ne passent jamais, c'est embêtant :(

laissez-moi 4 min pr mettre le zip à jour

Commentaire de Kirua le 22/06/2004 14:37:04

Le zip est à jour, mais sauf erreur il faut mtnt qu'il soit répercuté sur tous les miroirs CS.
Si dans le zip l'exe principal (Particle2D.exe) n'affiche pas la même chose que dans le screenshot de mon commentaire précédent, c'est que vous n'avez pas le nouveau zip. Vous pouvez aussi le voir au code source si vous n'être pas sous win: dans CParticle.h, les deux constructeurs doivent être devenus ceux-ci:

        CParticle(float MinMort, float MaxMort);

        CParticle(float MinMort, float MaxMort, int AngleMin, int AngleMax, int VMin, int VMax, CVecteur2D Pos);

Commentaire de Wett le 22/06/2004 15:09:59

L'histoire de flux, c'est pour eviter un effet que j'ai eu lorsque tu met une mortalité trop faible, tu te retrouve avec 6500 Particules lancées d'un seul coup et puis apres plus rien jusqu'à ce quelle meurent toutes et apres 10 sec à peu près elles sont bien réparties... C'est assez moche au début :) donc en mettant un flux, plutot que de lancer 6500 d'un coup tu en lance par ex 1000 en 1 seconde, mais bien réparties (tu en lance 1000/fps par frame) et là des le debut c'est bien repartit :)
Zouli ton screen :) Je m'occupe des couleurs, mais ce soir je fait un réseau donc si j'ai pas le tps de te le finir ça attendra demain :)

Commentaire de Funto66 le 23/06/2004 00:34:00

Très joli :)
Mais à part Particule2D_trainee.exe, ça rame bien sur mon PC :'(

Commentaire de xarier le 23/06/2004 00:37:17

meme avi que mon cher ami funto ;-)

Commentaire de AmK le 25/06/2004 13:33:16

houlaaa kirua je sens que j'aurai du boulot aprés le bac , notament decortiquer tout ce que t'as fait pendant mon hibernation :d
allez 10/10 !

Commentaire de Kirua le 25/06/2004 17:22:31

ouééééé, amk t'es pas mort :-D tu vas en france alors ette année??

Commentaire de Wett le 25/06/2004 17:32:18

Heuuu c'est pas un forum ici qd meme :)
(J'aime bien jouer les mecs chiants :p surtout que mon post n'a pas plus de rapport avec ta source que le tien ^^)

Commentaire de neo_00110010101 le 25/06/2004 17:52:55

rien qu'à voir le nombre de commentaires ! "seulement" 86 avec celui-là ! c'est énorme !

Commentaire de xarier le 25/06/2004 17:57:48

alors Kirua est maintenant conu lol

Commentaire de Funto66 le 26/06/2004 00:55:35

Je pense qu'il l'était déjà avant qd même...;)

Commentaire de Kirua le 26/06/2004 16:22:02

je transforme les sources des autres en forums et parfois on me le reproche, alors qd c'est un code source à moi, je me gêne pas ;) j'aime autant avoir une discu libre comme ça, pas forcément en rapport direct avec le code source, puis ça amène souvent à des considérations autres (par exemple, j'ai déjà eu ds un cas similaire une très intéressante conversation sur Microsoft avec un certain Maya de cppfrance, très intéressant).

Commentaire de xarier le 26/06/2004 16:42:14

DIT Kirua pourquoi tu lance j'ammais ton msn :)

Commentaire de Kirua le 26/06/2004 16:47:03

par amour pour la langue française

Commentaire de neo_00110010101 le 26/06/2004 16:48:10

xarier >> ben c'est quand même lourd MSN (surtout quand on a 53 contacts...) meu bon (non je ne vais quand même pas les bloquer !)

Commentaire de xarier le 26/06/2004 16:53:27

ben moi je la lance est quand quelqu'un me casse la tete je le blog c facile :)

Kirua --> par amour pour la langue française ?

Commentaire de neo_00110010101 le 26/06/2004 16:58:42

mouais ... (idée méchante inside ! petits plissements des yeux, tête de diable ...) c'est interessant comme technique :]

Pour Kirua, j'pense qu'il n'aime pas écrire "com sa" chose fréquente sur les chats ...

Commentaire de xarier le 26/06/2004 17:06:50

Ben moi j'ai bien ecrire commenca car c coolll
voila ce forum va devenir le plus visité par le monde des programmeur lol
aller les mec en continu : (pour faire de ce forum le plus visité par cppfrance :) ) HE kIRUA C KOI TON avi
Lol

Commentaire de neo_00110010101 le 26/06/2004 17:10:28

ben moi je pense que ........ et puis voilà quoi +1 post ^^

Commentaire de xarier le 26/06/2004 17:13:51

Lol  puisque en parle de tout la voila :
dit les mec vous avez vue mon site que j'ai creé hier pour mon prog WinMFX www.winmfx.fr.fm ( un peu de pun )

Commentaire de neo_00110010101 le 26/06/2004 17:30:41

"La sources" avec un "s" ?? ^^
sinon t'm vraiment les couleurs flash ? le BG devient bleu !

J'dois avoué que lorsque tu as sorti ta source, je pensais que www.winmfx.fr.fm était un site professionnel ! en tout cas il est réussi !

Commentaire de BumpMANN le 26/06/2004 17:48:15

Ca fourmille ici ^_^ ca me rappelle ma premiere source héhé (allez hop une 20aine de commentaires par jour, tu part le week-end et tu te retrouve avec 70 emails :P)

note: discussions de deux grands bavard (et ouééé) Kirua et xarier ;)

Commentaire de Wett le 26/06/2004 19:13:47

et hop le 98e message... Pour qui le 100e?

Commentaire de Wett le 26/06/2004 19:14:41

Dans www.winmfx.fr.fm j'aime beaucoup le lien vers www.coder-studio.com :) Ca fait plaisir :)

Commentaire de Wett le 26/06/2004 19:16:31

POUR MOI LE 100e!! Désolé je suis un gamin mais je me lache un peu...
Et non msn n'est pas chiant il suffit d'eviter les contacts un peu boulets... Perso j'ai rarement plus de 10 gars connectés en meme tps! Et (presque) pas de mec lourd :)

Commentaire de neo_00110010101 le 26/06/2004 19:21:07

pfffff flooder va !! ^^ et ben moi, pour continuer ma série des 0 et des 1 je vais mettre le 101 !!!!!!!!!!!!!!

Commentaire de Kirua le 26/06/2004 19:27:27

ça s'apparente quasiment à du mailbombing tout ça! savez que c'est punissable par la loi ;)

Commentaire de Wett le 26/06/2004 20:32:00

Ouais là qd même c'est vraiment abusé, si Nix passe par là va y'avoir du grabuge...

Commentaire de Kirua le 26/06/2004 21:21:57

Nix passe jamais par là, et puis y a assez de choses à corriger sur les sites pr qu'il commence à s'occuper du boulot des adminsen plus ;)
fin remarque, je dis qu'il passe jamais... c'est surtout parce qu'il est adepte des techno microsoft.

Commentaire de xarier le 26/06/2004 22:47:58

Re :
je reviend j'etait partie a une fete et la je vein pour rammener quelque CD lol :

See you
N 105 lol

Commentaire de Wett le 26/06/2004 23:27:34

Heu... Soit.

Commentaire de xarier le 27/06/2004 00:19:01

Voila : Je reveind wow quel fete super j'aurait bien aimmer que vous soyait avec moi :)

Commentaire de Kirua le 27/06/2004 12:30:40

dis, exagère pas qd même, c'est pelant d'avoir un mail pour lire ça, on est tous très contents que tu te sois bien amusé, maintenant terminé. et c'est pas la peine de répondre "ok".

Commentaire de Kirua le 27/06/2004 12:31:59

dis, exagère pas qd même, c'est pelant d'avoir un mail pour lire ça, on est tous très contents que tu te sois bien amusé, maintenant terminé. et c'est pas la peine de répondre "ok".

Commentaire de pyroflo le 05/07/2004 02:03:38

Je vois que tu ne te reposes toujours pas, très beau résultat, bravo ! :)

Commentaire de xarier le 05/07/2004 16:27:03

he mec je tient a vous informer que coder-studio vient de re ouvrir leur (www.coder-studio.com).ces admin sont (kiruan,funto,weet,aqu..)
see you

Commentaire de Kirua le 05/07/2004 20:49:52

c'est Wett, pas Weet, vala... et puis c'est Kirua, pas Kiruan, et c'est Aquanum.

Commentaire de xarier le 05/07/2004 21:00:48

ne soit pas si dur c juste parce que j'ecrie vite.
moi je voulait te faire plaisir et la .... oki pas grave

Commentaire de _Thy_ le 24/08/2004 14:51:39

Un peu lent avec les miliers de particules par défaut sur une tnt2, sinon c'est très joli et je vais m'en servir comme un fou sur le jeu que j'écris (course de bagnoles) :
- voitures qui fument
- poussière
et ça c'est que les 2 1ères idées qui me viennent.

bon boulot, TRES UTILE, et sur devcpp, que demander de plus ?

Commentaire de Wett le 31/08/2004 18:12:46

Problème avec l'utilisation que tu veux en faire : si tu fais un jeu 3D, va falloir que tu mettes la main a la pate ;) parce que son moteur est 2D only... D'ailleurs si t'en fais une version 3D je suis interressé ^^

Commentaire de Kirua le 31/08/2004 19:35:22

tu pourras pas l'utiliser pr le concours wett :p

Commentaire de Zazour le 12/09/2004 10:07:00

Vraiment super,mais je comprends pas pourquoi tu génère une texture et a partir de quoi.
De plus j'ai toujours un problème avec l'include windows.h
chez moi il ne compile pas directement.

Commentaire de Kirua le 12/09/2004 10:56:01

pour le windows.h, je ne sais pas. de tte manière, la fenêtre Win32 est la seulement pr offrir un support direct à la classe, ça marchera tt aussi bien avec glut, sdl, ...

quant à la texture, il s'agit d'un disque dont les bords sont plus transparents que le centre. comme c'est une forme géométrique simple, il est plus facile (et plus efficace même) de générer la texture grâce à une formule que de stocker la dite formule dans un fichier qu'il faut trimbaler avec la classe! si tu préfères utiliser une étoile complexe, tu peux tt aussi bien attacher une texture bien à toi à la classe, aucun problème.

une texture, c'est simplement (comme une image d'ailleurs) un tableau de données. si tu simules une image en couleurs réelles avec couche alpha, ça te fait 4 octets par pixel. si tu veux générer une texture de 16*16 pixels, ça te fait un tableau de 16*16*4 pixels à allouer, et puis grâce à la formule tu donne la couleur et l'alpha désiré à chaque pixel correspondant à l'image finale dans le tableau. une fois que c'est fait, tu envoies le tableau à OpenGL qui t'en fait une texture.

Commentaire de Zazour le 13/09/2004 01:08:43

merçi pour ta réponse,
en effet dans ma petite tête,une texture était toujours associée a un fichier image,voir un fichier vidéo (qui n'est c'est vrai qu'une suite d'images) et non a une formule mathématique.
C'est plus clair maintenant.
J'ai mis aussi 10/10,même si pour l'instant je n'arrive pas a compiler.

Commentaire de Arnaud16022 le 20/10/2004 09:15:54

bizarre...Kirua se met encore en débutant?

PS:l'ordi du lycée rame un peu..genre...10FPS?!!pour un petit truc comme ca, doit y avoir un sacré nbre de particule.

Bon, maintenant tu nous fait la meme chose en 3D, comme dans painkiller  (^^)

Commentaire de Kirua le 20/10/2004 16:10:32

pour la 3D, j'y ai pensé mais je vois au moins un souci: si je ne veux pas faire des particules en 3D (donc: placées dans l'espace R3, mais les particules elles-même n'étant que des carrés texturés, plats, pour éviter trop de calculs), je dois à tout moment connaître le vecteur orientation de la caméra, pour bien positionner les rectangles faces à l'écran.

Si j'ai le vecteur, c'est juste un peu de géométrie analytique / vectorielle, je pense que ça ira aisément, mais il me faut ce vecteur ... et ça j'ai pas ^^

(bon, en même temps, je travaille le plus souvent en 2D, à cause de mon RPG, donc forcément je n'ai jamais réellement réfléchi à une classe Caméra. J'imagine que si j'en écrivais une bien fichue, elle permettrais de récupérer ce vecteur crucial)


Pour la lenteur, suis bien d'accord avec toi que c'est pas glorieux.... j'imagine qu'il serait bien senti de créer une display list pour les particules. (en fait, ça devrait accélérer monstrueusement, ^^)


Je vais profiter du message pour rajouter quelques petites choses (je mets au pluriel, on verra si je dis plusieurs choses ^^)

- J'avais initialement désiré coder l'Engine de sorte que l'origine du repère Ecran soti en bas à gauche, et que dès lors l'axe Y monte au lieu de descendre, ce que je pensais être habituel (car j'avais tjs vu ça, et j'utilise ça pr mon rpg justement). J'ai appris plus tard, lors d'un concours de Coder-Studio.com (puub ^^) que sous OpenGL, en 2D, bcp de gens demandent à OpenGL directement d'avoir un repère avec origine en bas à gauche... du coup mon système inversait ça aussi, et c'est profondément idiot, d'autant plus que si on code un jeu on connaît les coordonnées écran des sprites etc... et on ne devrait pas avoir besoin d'inverser les coordonnées verticales pour retomber sur la correspondance avec l'autre repère! Ce que je veux dire en définitive, c'est qu'il faudrait que je récrive une partie du code de sorte que le système d'axes pris en compte soit celui du programme hôte. De cette façon, des gens intéressés (et moi le premier ^^) pourront l'implémenter selon leur bonne volonté dans leur programme.

- autre chose: mais c'est bourré de fautes ma description! lol, je vais en corriger qq unes (= je vais en oublier, dc je ne prétend pas tt corriger :p)

Commentaire de Arnaud16022 le 20/10/2004 16:58:05

nan c'est bon, l'orthographe ca va... :D
Mais tu sais je disais ca en rigolant; de toute facon moi je vais en faire un (moteur de particules) incessamment pour Sniper.
Ya un bout de tps une source la-dessus avait été postée par..euh ben je sé plus en plus je l'ai jetée :( mais qques recherches et ca sera bon
Tu as PainKiller? réponds moi ca m'intéresse (si,si)
Et ,enfin,je te dirais que je me serais douté, sans que tu me le dises, que tu n'as pas de classe camera dans un jeu 2d :))

Suis en train de télécharger la src...les 140Ko, sur le T1 du lycée, je les avait pas vu passer ;) pourquoi le screenshot ne correspond pas aux progs?
En tout cas, ca rame meme sur mon PC (1.4GHz), c'est dire...
++

Commentaire de djl le 20/10/2004 18:29:46

kirua > a propos de la vitesse en opengl, d'abord ya le fait de minimiser le nombres de commandes opengl (ca je suppose que tu le fais), apres il faut penser carte graphique

donc si tu dessines à coup de glvertex, la ca casse tout
faudrais passer par des vertex buffer avec des tables d'index, je sais pas comment ca marche en opengl mais ca passe par les extensions

d'une manieres générale quand on veut faire du serieux en opengl, on doit passer par les extensions, et ca je trouve que c'est un gros defauts par rapport a dx, ou au moins tu es sur de n'avoir aucun probleme si la carte est compatible avec la version de dx que tu utilise

Commentaire de Kirua le 20/10/2004 19:26:10

Arnaud << non, c'est quoi PainKiller? Quant au zip, il y a plusieurs exe normallement, parce que j'avais voulu illustrer plusieurs effets possibles (en déplaçant par exemple le lieu géométrique, ou bien en le modifiant, etc...). Ça me faisait des boules de feu projetées, des trainées de feu etc... c'est ça que tu devras avoir. Par contre pr le ramage... (c'est ds le dico, sisi :p:p) beeeeeh, faudra que je lui joue un sort oui... pas mtnt quoi ^^

djl << si il y a bien un truc que je ne fais pas, c'est optimiser en OpenGL :p:p j'ai déjà franchement du mal à comprendre comment ça marche simplement, alors plus loin je me lance pas encore ;) Cependant, tout ce qui appartient à la liste des réflexes simples, si je les apprends, je les utiliserai parce que je me poserai plus la question, donc balance tt ce que tu peux ;)

j'utilise en effet les glvertex... c'est quoi des vertesx buffer? et est-ce que si j'utilise des display lists ça sera encore nécessaire?

les extensions, c'est même pas la peine ;) je suis contre parce que ça tue dans l'oeuf la portabilité (au sens distribuabilité plutôt).

Commentaire de pyroflo le 20/10/2004 19:32:10

Simplement pour signaler que chez moi ça ne râme pas du tout.

PIV 2.8Ghz
1,3 DDR

Commentaire de pyroflo le 20/10/2004 19:33:54

Désolé, il faut lire 1,3Go DDR pour la mémoire vive.

Bon courage pour la suite ;-)

Commentaire de Kirua le 20/10/2004 19:38:40

euh, c'est rassurant que mon prog ne rame pas sur les ordinateurs de la NSA, mdr :p merci pr la remarque, mais ça ne m'excuse malheureusement pas ^^

Commentaire de djl le 20/10/2004 20:20:12

les vertex buffers ce sont des tableaux de vertexs (de points 3d ), le fait de gerer les vertex par paquet permet pas mal d'optimisation, par exemple au niveau du transfer par le pont agp, mais surtout c'est comme ca que la carte graphique traite les points (acces sequentiel), ils peuvent etre compilés (non modifiable, ca permet sans doute de les laisser dans les caches du gpu?) mais ca reste tres souple (machine etat)

pour les index j'ai lu je sais plus ou que pour la cartes graphique, un tableau de points ca devais etre sous la forme d'un dico (d'abord les différents points, puis leur arrangement sequentiel)

comme seul article francais j'ai trouvé celui de prografix

http://prografix.games-creators.org/document/122

ca reste minimal, mais c'est deja un bon debut, surtout que ca te permettra d'adapter le design de ton code dans cette voie

pour voir ca en profondeur, doit y avoir de bon tutos sur les site gamedev (anglophone)


regarde les sources de q2/q3, je sais pas si j'avais bien chercher mais ils me semble pas avoir vu un seul glvertex !


je suis d'accord avec toi, y a rien de plus enervant que de tomber dans le pieges des extension et de se retrouver avec un programmes qui ne fonctionne qu'avec les dernieres cartes graphiques, mais c'est pas le cas de toutes les extensions, beaucoup sont aujourd'hui acquis pour la majorité des carte graphiques (comme le multi texturing et au moins 2 unités de rendu par gpu)

Commentaire de Kirua le 20/10/2004 20:35:51

merci pour le lien et les explications, je vais lire ça dès ce soir.

bye !

Commentaire de djl le 20/10/2004 21:25:48

pour les constructeurs de tes objets, pense à initialiser les membres sytematiquement à leur construction, pour eviter les copies inutiles

par exemple

struct SRVB
{
    float R,V,B;
    SRVB() : R(0), V(0), B(0) {}
    SRVB(float r, float v, float b): R(r), V(v), B(b) {}
};

fais toujours comme ca, c'est pareil et c'est plus rapide, surtout sur les objets autres que les types de bases (ou l'appel du  constructeur par copie est tres penalisant)

abuse aussi tant que possible de const, private & co,  de methodes static egalement quand c'est possible (mais ca j'ai vu que tu le faisais deja ;) )

prefere les tableaux statique aux zones allouée (d'une maniere generale)

pour les cast (transtypage), pour les types de bases, prefere l'operateur static_cast, qui en plus d'etre plus propre en c++ (que les c-style cast), sera resolu statiquement, c'est à dire à la compilation

p[0] = static_cast<char>(color);



pour les commandes opengl :

c'est une machine etat, donc si tu fais un glEnable( truc ); à l'initialisation, t'aura plus besoins de le faire au cour de l'execution, sauf si pendant le rendu tu dois desactiver ce truc, dans ce cas tu as pas le chois, mais travail le design de la partie rendu de facon  a ne desactiver/reactiver qu'une seul fois par rendu

pour le glBinTexture c'est pareil, et surtout la c'est couteux, ca permet juste de dire à opengl quel est l'id de la texture courante, donc si tu utilise qu'une seule texture (qu'un seul id), un seul glbindTexture suffit (au debut, apres le glGenTextures)

pour les glTexParameteri et autres appliqua de texture, c'est encore mieux, tant que tu changes pas, tu le fais une fois pour la textures selectionnée et c'est bon
utilise aussi les filtres (GL_LINEAR = bilinear filtering), ca engendre aucune pertes, la cg gere ca en pur hardware, et pour ma part, j'ai deja observer que GL_NEAREST est meme legerement moins performant


donc en gros, le maximum de commandes à l'initialisation pour un minimum de commandes au cours du rendu :)



Commentaire de Kirua le 20/10/2004 22:48:07

vouï, la méthode d'initialisation hors du corps des constructeurs, je les utilise aussi depuis un moment, mais plus parce que je trouve ça plutôt joli ... je savais pas que c'était plus rapide.

pour les const est, je les utilise à outrance depuis un certain temps. qd j'ai écrit ce code-ci, je n'avais pas encore tt à fait conscience de l'importance que ça avait: mtnt c'est chose faite ;)

les tableaux statiques c'est génial pour les concours d'algo (c'est super rapide), pour le reste, je préfère perdre un peu de temps et avoir une allocation vraiment propre. mais je suis bien conscient que c'est lent, aussi je m'arrange tt le tps pr minimiser le nombre d'appels à ces fonctions.

tu veux dire que les cast c-like ne sont pas effectués à la compilation? je ne vois pas qd il peut le faire sans ça ... enfin, va pour les static_cast, même si je trouve ça profondément ... moche et lourd :D

je comprends ce que tu veux dire pr les cas où il n'y a qu'une seule texture, mais un moteur c'est qd même sensé se plugger dans une carrosserie ;) mais je note que c'est couteux, je n'imaginais pas... je pensais que ça changeait juste un int dans la mémoire quoi... c'est pas le cas apparament ^^



merci bcp pr ces détails. tu auras remarqué que bcp de choses que tu as énoncées, je les ai acquises depuis lors; c'est rassurant: ça veut dire que j'ai un peu évolué ^^
pour le reste, j'essayerai de m'y attacher et de m'y contraindre (juste ton histoire de cast qui m'embête :p).

je continue mtnt ma lecture du tuto que tu linkais plus haut.

Commentaire de djl le 20/10/2004 22:58:09

pas de probleme, et t'inquitte pas j'avais remarqué ;)

pour les cast, oui la conversion se fais au cours de l'execution, pour certains types de bases le processeur possede meme l'instruction (int -> float par exemple)

et puis c'est connu, la faiblesse du c c'est l'absence de controles statiques

Commentaire de Kirua le 20/10/2004 23:02:43

hmm, c'est vrai qu'en fait l'écriture le suggérait pour les cast. je les écris souvent comme ça:

float f = ...;
int i = int(f);

parce que je trouve ça plus clair: ça fait référence à un constructeur du type d'objet int pour importer un float. si l'analogie est complète, alors on a bien qu'effectuer un cast demande une conversion au run-time, c'est logique.


qu'est-ce que tu appelles l'absence de contrôles statiques ?

Commentaire de djl le 20/10/2004 23:19:51

int i = int(f); // oui, appel du constructeur

tout les types sont des objets en c++

"alors on a bien qu'effectuer un cast demande une conversion au run-time, c'est logique."

non, tu demandes un transtypage, il ne pourra se faire qu'au cour de l'execution, vu qu'il ne connais pas la valeur de la variable

meme float n = 1; genere un cast en c (pas en c++)

l'absence de controle static, c'est tout ce pourquoi le c peu compiler un programme qui plante lamentablement à l'execution (declaration implicite, nombres d'arguments variables, indirections,... )

Commentaire de djl le 20/10/2004 23:26:11

d'ailleur en reflechissant je me suis trompé car ce n'est pas non plus possible pour le static_cast :)
En fait il ne fais que la verification statique (on appel ca le downcast)

Commentaire de djl le 20/10/2004 23:34:16

ouai j'ai bien fais de me renseigné sur le coup

pour repprendre :

oubli le static_cast, ca permet uniquement de de verifier la plausibilité pour deux types de la meme hierarchie de classe

dynamic_cast fais de meme mais dynamiquement lorsque la veridication statique n'est pas possible (pointeur) ==> controle retour necessaire

reinterpret_cast, equivalent au cast c

l'interet par exemple du reinterpret_cast, c'est (en plus de faire partie du langage) de pouvoir etre retrouvé facilement dans le source (contrairement aux cast c (Type) )


donc dans ton cas il est conseillé d'utiliser un reinterpret_cast

Commentaire de Kirua le 20/10/2004 23:41:40

okey

merci bcp pr la petite discu ;)
je vais me coucher

Commentaire de djl le 21/10/2004 16:41:00

finalement je reviens sur static_cast qui convient pour les types de base, mais pas de pointeur

Commentaire de Kirua le 01/09/2005 19:44:45

Mise à jour pour conformance avec le standard. Voir commentaire de la mise à jour.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,577 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales