[4.60 beta] Ribbon Effect

Généralités sur la programmation 3D
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

[4.60 beta] Ribbon Effect

Message par kelebrindae »

Salut à tous!

Je me suis amusé avec les "Ribbon Effects", et c'est assez classe. (elle est bien, cette 4.60 :D )

Par contre, je ne comprends pas tout:
- Le 4ème paramètre "NbChains", il sert à quoi ?
- De même qu'il y a un paramètres "initialWidth", ne devrait-il pas y avoir un paramètre "finalWidth", afin que le ruban paraisse de plus en plus petit vers la fin ?
- Je n'ai pas réussi à le rendre "correctement" transparent; au lieu d'être de plus en plus transparent en allant vers la fin, il est de plus en plus noir... :?

Tenez, jetez un oeil, vous comprendrez mieux:

Code : Tout sélectionner

; Window size
#SCREENWIDTH = 800
#SCREENHEIGHT = 500

Structure ball_struct
  numEntity.i
  numNode.i
  numRibbon.i
   
  timer.f
EndStructure
Global NewList ball.ball_struct()

;- initialization
InitSprite()
InitEngine3D()
InitKeyboard()

;- Window
OpenWindow(0, 0, 0, #SCREENWIDTH, #SCREENHEIGHT, "Ribbon FX test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(0), 0, 0, #SCREENWIDTH,#SCREENHEIGHT, 0, 0, 0,#PB_Screen_SmartSynchronization)

;-Texture
Add3DArchive(".",#PB_3DArchive_FileSystem)
CreateImage(0,128, 128) 
StartDrawing(ImageOutput(0)) 
  Box(0, 0, 128, 128, $FFFFFF)
StopDrawing()
SaveImage(0,"temp.bmp")
FreeImage(0)
LoadTexture(0,"temp.bmp")
DeleteFile("temp.bmp")

; Colors
Global Dim color.i(7)
color(0) = $FF0000
color(1) = $00FF00
color(2) = $0000FF
color(3) = $FFFF00
color(4) = $FF00FF
color(5) = $00FFFF
color(6) = $0077FF

;-Materials
CreateMaterial(999,TextureID(0)) ; walls
CreateMaterial(998,TextureID(0)) ; ribbons
MaterialDepthWrite(998, #False)
MaterialFilteringMode(998,#PB_Material_None)
For i=0 To 6
  CreateMaterial(i,TextureID(0))  ; balls
  MaterialAmbientColor(i,color(i))
Next i

;- Entities
; walls
planeMesh = CreatePlane(#PB_Any,2,2,10,10,1,1)
ground  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(999))
EntityPhysicBody(ground, #PB_Entity_StaticBody,1,1,0)    
ceiling  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(999))
RotateEntity(ceiling,180,0,0)
EntityLocate(ceiling,0,20,0)
EntityPhysicBody(ceiling, #PB_Entity_StaticBody)    
backWall  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(999))
RotateEntity(backwall,90,0,0)
EntityLocate(backwall,0,10,-10)
EntityPhysicBody(backwall, #PB_Entity_StaticBody,1,1,0)    
frontWall  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(999))
RotateEntity(frontWall,270,0,0)
EntityLocate(frontWall,0,10,10)
EntityPhysicBody(frontWall, #PB_Entity_StaticBody,1,1,0)    
HideEntity(frontWall,#True)
leftWall  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(999))
RotateEntity(leftWall,0,0,270)
EntityLocate(leftWall,-10,10,0)
EntityPhysicBody(leftWall, #PB_Entity_StaticBody,1,1,0)    
rightWall  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(999))
RotateEntity(rightWall,0,0,90)
EntityLocate(rightWall,10,10,0)
EntityPhysicBody(rightWall, #PB_Entity_StaticBody,1,1,0)    

; balls
sphereMesh = CreateSphere(#PB_Any, 0.5)
For i=1 To 20
  ballcolor = Random(6)
  
  AddElement(ball())
  ball()\numEntity = CreateEntity(#PB_Any, MeshID(sphereMesh), MaterialID(ballcolor))
  EntityLocate(ball()\numEntity, 8 - Random(16),10 + 8 - Random(16),8 - Random(16))
  EntityPhysicBody(ball()\numEntity, #PB_Entity_SphereBody, 1,0.7,1)
  ApplyEntityImpulse(ball()\numEntity,20-Random(40),20-Random(40),20-Random(40) )
  
  ;- Ribbons
  ball()\numNode = CreateNode(#PB_Any)
  ball()\numRibbon = CreateRibbonEffect(#PB_Any,MaterialID(998),NodeID(ball()\numNode),1,20,0.8,10)
  RibbonEffectColor(ball()\numRibbon,color(ballcolor),$FFFFFF)  

Next i


;- Camera
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0,0,10,35)
CameraLookAt(0,0,10,0)
  
;- Light 
AmbientColor(RGB(92,92,92)) 
CreateLight(0,RGB(160,160,255),-200,300,0) 
WorldShadows(#PB_Shadow_Additive)

;- Main loop
Repeat
  Delay(1)
  While WindowEvent() : Wend
  
  If ExamineKeyboard()
    ;- Return : Display FPS
    If KeyboardReleased(#PB_Key_Return)
      MessageRequester("Infos","FPS = " + Str(Engine3DFrameRate(#PB_Engine3D_Average)))
    EndIf

  EndIf
  
  ; Move the balls
  ForEach ball()
    ; If the ball is on the ground for too long, give it a little impulse
    If EntityY(ball()\numEntity) < 0.7   
      ball()\timer + 1
    Else
      ball()\timer = 0
    EndIf
    If ball()\timer > 50
      ApplyEntityImpulse(ball()\numEntity,20-Random(40),15+Random(15),20-Random(40) )
    EndIf
    
    ; The ribbon is attached to the node, so the node must follow the ball
    NodeLocate(ball()\numNode,EntityX(ball()\numEntity),EntityY(ball()\numEntity),EntityZ(ball()\numEntity))
  Next ball()
    
  ; Render
  RenderWorld()
  FlipBuffers()
 
Until KeyboardPushed(#PB_Key_Escape)

End
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [4.60 beta] Ribbon Effect

Message par blendman »

heu, j'ai voulu tester mais ça me dit que CreateRibbonEffect() n'est pas une fonction, macro, etc..

Il faut installer quelque chose pour que ça marche ?
C'est bien avec pb 4.60beta1 qu'il faut le tester ? :)

EDIT : youhou ! mais y'a une version beta2 et j'étais même au compris, c'est quoi ce biiin's ! :D

En tout cas, ça marche nickel les ribbon effect :)
c'est classe pour les effets de vitesse : arme d'un rpg, trainée d'avion, de vaisseau, de voiture, etc..
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: [4.60 beta] Ribbon Effect

Message par kelebrindae »

kelebrindae a écrit :youhou ! mais y'a une version beta2
Eh oui! Dès que j'ai vu ça, je me suis jeté dessus pour tester les nouveautés absente de la beta1... :mrgreen:

C'est vrai que les ribbons, c'est assez génial pour tout un tas de trucs, mais je ne suis pas certain qu'ils marchent nickel, en fait... :?
La géométrie est bonne, apparemment, mais j'ai un souci avec la transparence:
A gauche, ce que j'obtiens => Image <= "photoshoppé" pour montrer ce que je pensais obtenir.

Vous en pensez quoi, vous ?
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: [4.60 beta] Ribbon Effect

Message par Cool Dji »

Salut kelebrindae,

Merci pour tes exemples.

J'ai testé avec une autre texture (du style flare) mais ça donne pas grand chose...
Finalement, il vaudrait juste ajouter une option comme les particles qui s'estompent peu à peu...
Only PureBasic makes it possible
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: [4.60 beta] Ribbon Effect

Message par G-Rom »

@kelebrindae

Je vais regardé , car quand j'ai testé ( car je teste mes codes :D ) ca fonctionnait très bien.
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: [4.60 beta] Ribbon Effect

Message par G-Rom »

Ca marche très bien , juste un problème de compréhension.
RibbonEffectColor(Ribbon, RGBA(255, 0, 0, 255), RGBA(255,255,255,255))
La couleur FadeOut n'est pas la couleur "d'arrivé" , mais la couleur que l'on soustrait à la couleur de départ toute les secondes.
Dans ce cas , en 1 seconde la couleur de départ devient complétement transparente.
Il faut perdre l'habitude de créer les matérial en dur dans le code, mieux vaut utilisé les .material qui sont là pour ca , de plus , j'ai rajouté une commande qui permet de créer un materialID à partir du nom du matérial ex:

le .material :
material LightRibbonTrail
{
technique
{
pass
{
lighting off
scene_blend add
depth_write off
cull_hardware none
cull_software none
texture_unit
{
texture ribbonband.png 1d
tex_address_mode clamp
filtering none
}
}
}
}
Le code PB :
MonMaterialID = GetScriptMaterial(#PB_Any, "LightRibbonTrail")

Le .material du haut ne fonctionne qu'avec des scene sombre ( il est en mode ADD )
dans ton cas ce .material devrais faire l'affaire :
material LightRibbonTrail2

{

technique

{

pass

{

lighting off

scene_blend alpha_blend
texture_unit

{

texture ribbonband.png 1d

tex_address_mode clamp

filtering none

}

}

}

}
et l'image utilisé : http://img42.imageshack.us/img42/3231/ribbonband.png

Image

ps: pour l'image , dans ton cas , remplace le noir par de l'alpha , plus c'est noir plus c'est transparent , ca marche en mode ADD , mais pas en alpha_blend ;)


ps2: le nombre de chaine ne sert à rien , je vais viré ce paramètre et le fixé à 1.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [4.60 beta] Ribbon Effect

Message par blendman »

kelebrindae a écrit :A gauche, ce que j'obtiens => Image <= "photoshoppé" pour montrer ce que je pensais obtenir.

Vous en pensez quoi, vous ?
j'en pense que si c'est transparent, ça va être carrément classe :D

Si sur le ruban, tu mets un shader refraction, tu peux avoir un chouette effet (j'ai vu sur un jeu fait avec ogre ;)).
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: [4.60 beta] Ribbon Effect

Message par G-Rom »

Un exemple avec les ribbons trail :

http://code.google.com/p/purebasic-ogre ... akechanges
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: [4.60 beta] Ribbon Effect

Message par djes »

Génial G-Rom :mrgreen:
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [4.60 beta] Ribbon Effect

Message par blendman »

ah ouais, c'est classe
Et c'est cool aussi pour le ground pour le material multi-couche :D
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: [4.60 beta] Ribbon Effect

Message par kelebrindae »

Magnifique !
Bon, je comprends un peu mieux comment ça marche, merci beaucoup!

Et quand même, parce que quelquefois c'est pratique de créer un material en dans le code (et aussi parce que je suis un peu pénible :mrgreen: ), j'ai modifié mon code pour que les ribbons soient transparents sans utiliser de ".material":

Code : Tout sélectionner

; Window size
#SCREENWIDTH = 800
#SCREENHEIGHT = 500

Structure ball_struct
  numEntity.i
  numNode.i
  numRibbon.i
   
  timer.f
EndStructure
Global NewList ball.ball_struct()

;- initialization
InitSprite()
InitEngine3D()
InitKeyboard()

;- Window
OpenWindow(0, 0, 0, #SCREENWIDTH, #SCREENHEIGHT, "Ribbon FX test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(0), 0, 0, #SCREENWIDTH,#SCREENHEIGHT, 0, 0, 0,#PB_Screen_SmartSynchronization)

;-Texture
Add3DArchive(".",#PB_3DArchive_FileSystem)
CreateImage(0,128, 128) 
StartDrawing(ImageOutput(0)) 
  Box(0, 0, 128, 128, $FFFFFF)
StopDrawing()
SaveImage(0,"temp.bmp")
FreeImage(0)
LoadTexture(0,"temp.bmp")
DeleteFile("temp.bmp")

; Ribbon texture
CreateImage(0,128, 1) 
StartDrawing(ImageOutput(0)) 
  DrawingMode(#PB_2DDrawing_Gradient)      
  BackColor($000000)
  GradientColor(0.5, $FFFFFF)
  FrontColor($0000)
  LinearGradient(0, 0, 128, 0)
  Box(0, 0, 128, 1)
StopDrawing()
SaveImage(0,"temp2.bmp")
FreeImage(0)
LoadTexture(1,"temp2.bmp")
DeleteFile("temp2.bmp")

; Colors
Global Dim color.i(7)
Global Dim ribbonColor.i(7)
color(0) = $FF0000:ribbonColor(0) = $770000
color(1) = $00FF00:ribbonColor(1) = $007700
color(2) = $0000FF:ribbonColor(2) = $000077
color(3) = $FFFF00:ribbonColor(3) = $777700
color(4) = $FF00FF:ribbonColor(4) = $770077
color(5) = $00FFFF:ribbonColor(5) = $007777
color(6) = $0077FF:ribbonColor(6) = $003377

;-Materials
CreateMaterial(999,TextureID(0)) ; walls

CreateMaterial(998,TextureID(1)) ; ribbons
MaterialDepthWrite(998, #False)
DisableMaterialLighting(998,#True)
MaterialBlendingMode(998,#PB_Material_Add)
MaterialFilteringMode(998,#PB_Material_None)

For i=0 To 6
  CreateMaterial(i,TextureID(0))  ; balls
  MaterialAmbientColor(i,color(i))
Next i

;- Entities
; walls
planeMesh = CreatePlane(#PB_Any,2,2,10,10,1,1)
ground  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(999))
EntityPhysicBody(ground, #PB_Entity_StaticBody,1,1,0)    
ceiling  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(999))
RotateEntity(ceiling,180,0,0)
EntityLocate(ceiling,0,20,0)
EntityPhysicBody(ceiling, #PB_Entity_StaticBody)    
backWall  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(999))
RotateEntity(backwall,90,0,0)
EntityLocate(backwall,0,10,-10)
EntityPhysicBody(backwall, #PB_Entity_StaticBody,1,1,0)    
frontWall  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(999))
RotateEntity(frontWall,270,0,0)
EntityLocate(frontWall,0,10,10)
EntityPhysicBody(frontWall, #PB_Entity_StaticBody,1,1,0)    
HideEntity(frontWall,#True)
leftWall  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(999))
RotateEntity(leftWall,0,0,270)
EntityLocate(leftWall,-10,10,0)
EntityPhysicBody(leftWall, #PB_Entity_StaticBody,1,1,0)    
rightWall  = CreateEntity(#PB_Any, MeshID(planeMesh), MaterialID(999))
RotateEntity(rightWall,0,0,90)
EntityLocate(rightWall,10,10,0)
EntityPhysicBody(rightWall, #PB_Entity_StaticBody,1,1,0)    

; balls
sphereMesh = CreateSphere(#PB_Any, 0.5)
For i=1 To 20
  ballcolor = Random(6)
  
  AddElement(ball())
  ball()\numEntity = CreateEntity(#PB_Any, MeshID(sphereMesh), MaterialID(ballcolor))
  EntityLocate(ball()\numEntity, 8 - Random(16),10 + 8 - Random(16),8 - Random(16))
  EntityPhysicBody(ball()\numEntity, #PB_Entity_SphereBody, 1,0.7,0)
  ApplyEntityImpulse(ball()\numEntity,20-Random(40),20-Random(40),20-Random(40) )
  
  ;- Ribbons
  ball()\numNode = CreateNode(#PB_Any)
  ball()\numRibbon = CreateRibbonEffect(#PB_Any,MaterialID(998),NodeID(ball()\numNode),1,50,0.8,20)
  RibbonEffectColor(ball()\numRibbon,ribbonColor(ballcolor),$FFFFFF)  
  
Next i

;- Camera
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0,0,10,35)
CameraLookAt(0,0,10,0)
  
;- Light 
AmbientColor(RGB(92,92,92)) 
CreateLight(0,RGB(160,160,255),-200,300,0) 
WorldShadows(#PB_Shadow_Additive)

;- Main loop
Repeat
  Delay(1)
  While WindowEvent() : Wend
  
  If ExamineKeyboard()
    ;- Return : Display FPS
    If KeyboardReleased(#PB_Key_Return)
      MessageRequester("Infos","FPS = " + Str(Engine3DFrameRate(#PB_Engine3D_Average)))
    EndIf

  EndIf
  
  ; Move the balls
  ForEach ball()
    ; If the ball is on the ground for too long, give it a little impulse
    If EntityY(ball()\numEntity) < 0.7   
      ball()\timer + 1
    Else
      ball()\timer = 0
    EndIf
    If ball()\timer > 50
      ApplyEntityImpulse(ball()\numEntity,20-Random(40),15+Random(15),20-Random(40) )
    EndIf
    
    ; The ribbon is attached to the node, so the node must follow the ball
    NodeLocate(ball()\numNode,EntityX(ball()\numEntity),EntityY(ball()\numEntity),EntityZ(ball()\numEntity))
  Next ball()
    
  ; Render
  RenderWorld()
  FlipBuffers()
 
Until KeyboardPushed(#PB_Key_Escape)

End
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [4.60 beta] Ribbon Effect

Message par blendman »

c'est classe tous ces exemples.

pour un lancé de boules de feu, ça va le faire :D
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: [4.60 beta] Ribbon Effect

Message par G-Rom »

Voici un autre exemple ( qui utilise l'archive : http://code.google.com/p/purebasic-ogre ... akechanges )

Code : Tout sélectionner

Structure vector3
  x.f
  y.f
  z.f
EndStructure

Structure Katioucha
  position.vector3
  pitch.f
  yaw.f
  nodeID.i
  ribbonID.i
  billBoardGRP.i
  billboardID.i
  rotationTimer.i
EndStructure

Global NewList Katioucha.Katioucha()

Procedure new_Katioucha(x,y,z,pitch,yaw,RibbonMaterial,HeadMaterial)
  AddElement(Katioucha())
  
  Katioucha()\position\x   = x
  Katioucha()\position\y   = y 
  Katioucha()\position\z   = z
  
  Katioucha()\pitch        = pitch
  Katioucha()\yaw          = yaw
  
  Katioucha()\nodeID       = CreateNode(#PB_Any,X,Y,Z)
  Katioucha()\ribbonID     = CreateRibbonEffect(#PB_Any, MaterialID(RibbonMaterial), NodeID(Katioucha()\nodeID), 1, 20, 100, 8500)
  Katioucha()\billBoardGRP = CreateBillboardGroup(#PB_Any,MaterialID(HeadMaterial),512,512)
  Katioucha()\billboardID  = AddBillboard(#PB_Any,Katioucha()\billBoardGRP ,0,0,0)
  
  RibbonEffectColor(Katioucha()\ribbonID, RGBA(255, 255, 255, 255), RGBA(0,0,0,255))
  
  
  AttachNodeObject( Katioucha()\nodeID ,BillboardGroupID(Katioucha()\billBoardGRP),#PB_Node_BillboardGroup)


  
  
EndProcedure

Procedure Katioucha_runtime()
  ForEach Katioucha()
    With Katioucha()
      
      If \rotationTimer < ElapsedMilliseconds()
        \rotationTimer = ElapsedMilliseconds() + 5
        \pitch - 0.7
      EndIf 
      
      If \pitch < -90
        \pitch = -90
      EndIf 
      
      RotateNode(\nodeID,-\pitch,\yaw,0)
      MoveNode(\nodeID,0,0,100)
      
      
      If NodeX(\nodeID)<-20000 Or NodeX(\nodeID)>20000 Or NodeZ(\nodeID)<-20000 Or NodeZ(\nodeID)>20000 
        FreeNode(\nodeID)
        DeleteElement(Katioucha())
        Continue
      EndIf 
      
      If NodeY(\nodeID)<0
       \pitch = 45 + (Random(10)-Random(10))
      EndIf 
      
    EndWith
  Next
EndProcedure



InitSprite()
InitEngine3D()
InitKeyboard()
InitMouse()


OpenWindow(0,0,0,1280,800,"")
OpenWindowedScreen(WindowID(0),0,0,1280,800,1,0,0)


cameranode = CreateNode(#PB_Any,500,0,500)

camera = CreateCamera(#PB_Any,0,0,800,500)
CameraLocate(camera,3000,100,3000)
CameraLookAt(camera,0,1000,0)
CameraFOV(camera,90)
AttachNodeObject(cameranode,CameraID(camera),#PB_Node_Camera)


Add3DArchive("./Medias",#PB_3DArchive_FileSystem)
Parse3DScripts()

SkyBox("desert07.jpg")

material  = GetScriptMaterial(#PB_Any,"GroundBlend")
mesh      = CreatePlane(#PB_Any,100,100,500,500,50,50)
ground    = CreateEntity(#PB_Any,MeshID(mesh),MaterialID(material))


RibbonMaterial  = GetScriptMaterial(#PB_Any, "RibbonTrail")
Headmaterial    = GetScriptMaterial(#PB_Any,"burst")



ReleaseMouse(1)
Repeat
  event = WindowEvent()
    ClearScreen(0)
    
     
    If Timer < ElapsedMilliseconds()
      Timer = ElapsedMilliseconds() + 5
      yaw.f + 0.1
    EndIf 
    
    If Timer2 < ElapsedMilliseconds()
      Timer2 = ElapsedMilliseconds() + 200
      new_Katioucha(-5000,100,-5000,45 + (Random(5)-Random(5))  ,45+(Random(5)-Random(5)),RibbonMaterial, Headmaterial) 
      
      new_Katioucha(5000,100,5000,45 + (Random(5)-Random(5))  ,(45+180) +(Random(5)-Random(5)),RibbonMaterial, Headmaterial) 
    EndIf 
    
    
    
    RotateNode(cameranode,0,yaw,0)
    
    Katioucha_runtime()
    

        
    RenderWorld()
   FlipBuffers()

Until event = #PB_Event_CloseWindow
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: [4.60 beta] Ribbon Effect

Message par venom »

Sympa tous ces rebonds 8)






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [4.60 beta] Ribbon Effect

Message par blendman »

c'est classe :D
Répondre