Effet d'eau avec scanline

Soyez le premier à donner votre avis sur cette source.

Vue 8 507 fois - Téléchargée 1 283 fois

Description

et oui, après effet d'eau avec getdibits, voilà effet d'eau avec scanline.
aussi rapide mais plus simple.
J'ai par ailleurs modifié quelques petites choses dans le code comme la gestion du déplacement des cailloux qui créent des vagues plus grosses.
et pour faire des ronds dans l'eau il faut cliquer sur l'image, sinon, il y a rien.
Pour rappeler l'effet, on a deux tableau qui contiennent la hauteur de l'eau à un endroit donné.
Le premier à l'instant T et le deuxième à l'instant T-1.
Puis un applique le filtre suivant :
pour chaque (X,Y)
on addition la hauteur des huit cases voisines au temps T. On divise par 4 et on retranche la hauteur au temps T-1 de (X,Y)
Et on applique un coefficient <1 pour que les vagues s'arretent peu à peu.

Puis pour chaque pixel de l'image, on regarde après réfraction de l'eau vers quelle endroit du fond on regarde.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

John Dogget
Messages postés
390
Date d'inscription
vendredi 18 juin 2004
Statut
Membre
Dernière intervention
7 mai 2009
-
J'ai l'impression que ça rame moins que la première version.
En tout cas, l'effet est bien reproduit, sans surcharge de codes :)

10/10
ça rame moins en effet !
Nais pour que ça aille encore plus vite, il faudrait penser à optimiser tes tableaux [0..0] car Delphi ralentit terriblement à calculer les index.

Exemple: cette ligne "im[i+(2*he-j-1)*wi]:=getpix(dx,dy);" prend un temps fou à elle seule !!!

C'est de ce côté là que tu peux gagner un max de vitesse...
Albedo039
Messages postés
31
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
31 janvier 2008
-
je n'ai pas vérifié en détail... mais il y a bcp de calculs répetitifs qui doivent pouvoir se rationaliser.

ex. 1:
# nw:=((vagues[cp+wn-wi-1]+
# vagues[cp+wn-wi ]+
# vagues[cp+wn-wi+1]+
# vagues[cp+wn -1]+
# vagues[cp+wn +1]+
# vagues[cp+wn+wi-1]+
# vagues[cp+wn+wi ]+
# vagues[cp+wn+wi+1]) div 4)-vagues[sp+wn];
=> il y a 8 fois le calcul cp+wn ou encore il y a 3 fois les calculs "cp+wn+wi" et "cp+wn-wi"
En utilisant des vars supplementaires, on devrait gagner un peu, non?

ex. 2:
les indexages à "img" sont assez fréquents.
Il est peut-être possible d'améliorer la vitesse.
Considérant "result:=im[x+(he-y)*wi];" (ligne 105):
=> créer un tableau suppl. dans lequel on a précalculé les combinaisons possibles c.a.d.
for x:=0 to wi do for y:=0 to he do TabSuppl[x,y]:=x+(he-y)*wi;
et après on obtient
result:=im[TabSuppl[x,y]];
ce qui économise 2 additions et une multipl.

et

"im[i+(2*he-j-1)*wi]:=getpix(dx,dy);"
peut être traité de la même manière :)


ex.3:
je n'ai tjs pas vérifié ;) le code assembleur produit, mais je propose que toooouuus les "*2" et les "div 4" etc... soit remplacés par
"*2" => shl 1
"div 4" => shr 2


Sinon: moi j'aime bien les vagues :))
cs_barbichette
Messages postés
243
Date d'inscription
lundi 30 octobre 2000
Statut
Membre
Dernière intervention
15 juillet 2013
-
ben voilà, j'ai pris un peu de temps pour optimiser le tout.
Juste un truc, pour les "shr 2" à la place des "div 4", c'était pas toujours possible puisqu'on travail avec des nombres signés. En assembleur pas de souci puisqu'on peut faire des "sar 2". Mais en pascal, on n'est obligé de passer par des div.
De même pour les tableaux, j'ai rendu les calculs soit en dehors des crochets, soit en chageant le code et en faisant des additions.

Merci a tous
Albedo039
Messages postés
31
Date d'inscription
mercredi 8 novembre 2006
Statut
Membre
Dernière intervention
31 janvier 2008
-
Naalsoo :)) Sieht schon viel besser aus.

Habe noch "eine" Bitte (um Zeilen 427-432):
5 Mal "rect(1,1,wi-2,he-2)"
kann man doch irgendwie aufmotzen, oder?

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.