Metaballs 2d (effet graphique de fusion, backbuffer)

Soyez le premier à donner votre avis sur cette source.

Vue 4 506 fois - Téléchargée 444 fois

Description

Voici un petit code qui fait des metaballs!
Mais qu'est-ce qu'une metaballe? Pour résumer, c'est des balles qui fusionnent entre elles lorsque elles sont proche l'une de l'autre (un peu comme une Lava-lamp)

A l'origine, c'est une classe pour dessiner des points, ligne et cercles en VB, dans un backbuffer (4 fois plus rapide que les méthode standard picture.line etc...)
Puis j'ai codé la "démo" MetaBalls, histoire de faire un benchmark :)

ATTENTION ! Dans le zip, vous trouverez 2 versions compilé. D'une part ce programme est 5 fois plus rapide lorsque il est compilé en natif, d'autre part en optimisant l'exe j'arrive a le rendre 7 fois plus rapide :)

Source / Exemple :


'Plutôt que de mettre l'ensemble du code de la source, voici juste le Kernel :

'==== Dessine une meta dans un DC donné ====
'MyMetas() est de type Long, (nummeta,xymeta)
'M_StartRender et M_StopRender sont des fonctions matrixbuffer
Public Function DrawMetaballsHere(MyDC As Long, xLeft As Long, yTop As Long, xWidth As Long, yHeight As Long, Diam As Long, Radius As Double, Couleur As Long, MyMetas() As Long)
M_StartRender xWidth, yHeight
Dim TotMeta As Long
Dim i As Long, j As Long, k As Long
Dim Distance As Long, Intensite As Long
Dim Prc1 As Single, Prc2 As Single
TotMeta = UBound(MyMetas(), 1) - LBound(MyMetas(), 1)

For i = 0 To xWidth
    For j = 0 To yHeight
        For k = 1 To TotMeta
            Distance = Pytagore(Abs(MyMetas(k, 1) - i), Abs(MyMetas(k, 2) - j)) + 1
            Intensite = Intensite + CLng(Radius / (Distance / Diam))
        Next k
        If Intensite < 255 Then
            Prc1 = Intensite / 255
            Prc2 = 1 - Prc1
            MxBuf(i, j) = Cumul2Color(Couleur, Prc1, 0&, Prc2)
        Else
            MxBuf(i, j) = vbWhite
        End If
        Intensite = 0
    Next j
Next i

M_StopRender MyDC, 32, xLeft, yTop
End Function

'==== Sub Cumul2Color ====
Public Function Cumul2Color(Cl1 As Long, Prc1 As Single, Cl2 As Long, Prc2 As Single) As Long
'crée la couleur comprise entre Cl1 et Cl2 en fonction de Prc1
Static LTB1(1 To 4) As Byte
Static LTB2(1 To 4) As Byte
'1/ copie de la valeur des couleurs dans un tableau
RtlMoveMemory LTB1(1), Cl1, 4&
RtlMoveMemory LTB2(1), Cl2, 4&
'2/ calcul de la couleur résultante et renvoi
Cumul2Color = RGB(LTB1(3) * Prc1 + LTB2(3) * Prc2, LTB1(2) * Prc1 + LTB2(2) * Prc2, LTB1(1) * Prc1 + LTB2(1) * Prc2)
End Function

Conclusion :


les MàJ
- J'ai intégré des fonctions pour faire un benchmark du graphisme 2D GDI avec différentes méthodes.
- Le code dessinant les metaballes est séparé de la fonction calculant la position des metaballes (pour ceux qui voudraient codé un autre déplacement) (la source est celle ci-dessus)
- Le code dessinant les metaballes est amélioré
- Le form de démo dispose de scrollbar pour changer les paramètres des metaballes.
- Vous pouvez choisir la couleur des metaballs :)
- exes compilés en fast-code et en fast-code avec "advanced optimisation"

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

BozzoDodo
Messages postés
185
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
10 janvier 2008

Bin pour un jeu je pense que cela pourrait être utile. Très bon code! (que je ne comprends pas mais faut que je regarde plus attentivement lol)
Tilois
Messages postés
721
Date d'inscription
dimanche 10 juin 2001
Statut
Membre
Dernière intervention
27 mars 2011
4
C tres bô cependant je vois pas du tout l'interet
Mais bon ca
jia2812
Messages postés
57
Date d'inscription
mardi 17 avril 2001
Statut
Membre
Dernière intervention
10 janvier 2003

Cool zoli! Cé 1 tutorial à lui seul!... ;-)

Allez paf, 1 bon p'tit 20! Ah non, y a pô de 20?! Ben tant pis, max' 10 walla!

Bone prog'!!

Gogogogogogogogooooooooooooooo!!!!!!!!!!!
jia2812
Messages postés
57
Date d'inscription
mardi 17 avril 2001
Statut
Membre
Dernière intervention
10 janvier 2003

Cool zoli! Cé 1 tutorial à lui seul!... ;-)

Allez paf, 1 bon p'tit 20! Ah non, y a pô de 20?! Ben tant pis, max' 10 walla!

Bone prog'!!

Gogogogogogogogooooooooooooooo!!!!!!!!!!!
RJLFRANCE
Messages postés
71
Date d'inscription
samedi 17 août 2002
Statut
Membre
Dernière intervention
5 août 2012
1
Excuse, j'avais pas le zip!, faut que j'achete des lunettes ...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.