Page 1 sur 1

Lumière !!! Éclairage !!!

Publié : mer. 01/août/2007 0:35
par Mytic
Voilà un petit code d’éclairage à améliorer bien sur.
Je l’ai crée en quelques minutes que pour le fun.
Utilisez la souri pour faire bouger la lumière et vous pouvez modifier les paramètres de la lumière dans la procédure pour avoir une lumière plus lumière que Onde (vous allez comprendre quand vous exécuterez le code)
Et si vous avez des améliorations, elles seront les bienvenus.
:wink:

Code : Tout sélectionner

InitSprite()
InitMouse()
InitKeyboard()
Procedure eclairage(px.l,py.l,couleur.l)
Static x.d
Static y.d
StartDrawing(ScreenOutput())
r = 4
distance = 50
champ = 200
div = 300
For i = 0 To champ Step 2
;Debug i
x = px
y = py
For t = 0 To distance
x = x + (Cos(i/div)*r)
y = y + (Sin(i/div)*r)
c = Point(x,y)
If (x<0) Or (y<0) Or (x=>639) Or (y=>479) Or (c = 26345)   :Goto nn:EndIf
Plot(x,y,couleur)
;LineXY(x,y,bx,by,couleur)
;bx = x
;by = y
Next t
nn:
Next i
StopDrawing()
EndProcedure

OpenWindow(0,0,0,640,480,"eclairage")
OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
ClearScreen(0)
FlipBuffers()
Repeat
ClearScreen(0)
StartDrawing(ScreenOutput())
Box(300,300,40,55,26345)
StopDrawing()
  ExamineMouse()
eclairage(MouseX(),MouseY(),255)
FlipBuffers()
ExamineKeyboard()
Event = KeyboardPushed(#PB_Key_Escape)
Until  Event
Delay(1500)
End

Publié : mer. 01/août/2007 0:56
par Mytic
voilà j'ai amélioré mon code : ça donne ça =>

Code : Tout sélectionner

InitSprite()
InitMouse()
InitKeyboard()
Procedure eclairage(px.l,py.l,couleur.l)
Static x.d
Static y.d
StartDrawing(ScreenOutput())
r = 6
distance = 50
champ = 200
div = 300
For i = 0 To champ Step 2
x = px
y = py
For t = 0 To distance
x = x + (Cos(i/div)*r)
y = y + (Sin(i/div)*r)
c = Point(x,y)
If (x<0) Or (y<0) Or (x=>639) Or (y=>479) Or (c = 26345)   :Goto nn:EndIf
Next t
nn:
LineXY(px,py,x,y,couleur)
Next i
StopDrawing()
EndProcedure

Procedure.l fps()
Static bactime.l
Static newtime.l
Static fps
Static fpsf
newtime = ElapsedMilliseconds()
If newtime - bactime => 1000
fpsf = fps
fps = 0
bactime = ElapsedMilliseconds()
Else
fps = fps + 1
EndIf

ProcedureReturn fpsf
EndProcedure

OpenWindow(0,0,0,640,480,"eclairage")
OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
ClearScreen(0)
FlipBuffers()
Repeat
ClearScreen(0)
StartDrawing(ScreenOutput())
Box(300,300,40,55,26345)
DrawText(10,10,Str(fps()))
StopDrawing()
  ExamineMouse()
eclairage(MouseX(),MouseY(),255)

FlipBuffers()
ExamineKeyboard()
Event = KeyboardPushed(#PB_Key_Escape)
Until  Event
End

Publié : mer. 01/août/2007 8:34
par Polux
très sympa!
par contre tout ce qui est instruction de traçage ( point/ligne ) c'est très lent. De plus quand tu trace ou que tu affiche sur un buffer différent de l'ecran principal ( quand tu utilise usebuffer en somme ), le passage a vista va poser souci ( vitesse encore divisée par 2 ou 3 -coz l'émulation de la couche directx 9 ).
Il faudrait adapter avec des sprites 3d ( ou direct en poly )
en tout cas c cool :wink:

Publié : mer. 01/août/2007 9:13
par Crystal Noir
sympatique comme tout !

Publié : mer. 01/août/2007 14:04
par Mytic
Merci….
Alors là, Microsoft ne rend la vie dure avec chaque version Windows qui change nos repères.
Ils devraient au moins changer de Windows tous les 10 ans au minimum, et non pas tout les 2 à 3 ans.

@Polux
très sympa!
par contre tout ce qui est instruction de traçage ( point/ligne ) c'est très lent. De plus quand tu trace ou que tu affiche sur un buffer différent de l'ecran principal ( quand tu utilise usebuffer en somme ), le passage a vista va poser souci ( vitesse encore divisée par 2 ou 3 -coz l'émulation de la couche directx 9 ).
Il faudrait adapter avec des sprites 3d ( ou direct en poly )
en tout cas c cool Wink
Tu pourrais m’éclairé un peur sur cette émulation directX sur VISTA ? (si c’est pas trop demander)
:wink:

Publié : mer. 01/août/2007 18:48
par Backup
pas mal :D

j'avais deja fait un trux comme ça :D
http://www.purebasic.fr/french/viewtopi ... light=plot

4eme post !! terre-lune avec Ray-tracing
(façon pompeuse de dire que je fait du lancé de rayon pour simuler l'eclairage des face de la lune) :D

Publié : mer. 01/août/2007 19:34
par Mytic
encor quelques modif :D :

Code : Tout sélectionner

; ----------------------------------------
;|                                        |
;|              By  >Mytic<               |
;|                                        |
;|      ...........................       |
; ---------------------------------------- 
InitSprite()
InitMouse()
InitKeyboard()
Procedure eclairage(px.l,py.l,angleA.L,angleB.l,couleur.l)
Static x.d
Static y.d
StartDrawing(ScreenOutput())
r = 10
distance = 50
champ = 200
div = 300 
angleB = angleB + angleA
For i = angleA To angleB Step 2
x = px
y = py
For t = 0 To distance
x = x + (Cos(i/div)*r)
y = y + (Sin(i/div)*r)
;x =  x +(Cos(i/div)*t)
;y = y + (Sin(i/div)*t)
c = Point(x,y)
If (x<0) Or (y<0) Or (x=>639) Or (y=>479) Or (c = RGB(0,0,255))   :Goto nn:EndIf
Next t
nn:
LineXY(px,py,x,y,couleur)
Next i
StopDrawing()
EndProcedure

Procedure.l fps()
Static bactime.l
Static newtime.l
Static fps
Static fpsf
newtime = ElapsedMilliseconds()
If newtime - bactime => 1000
fpsf = fps
fps = 0
bactime = ElapsedMilliseconds()
Else
fps = fps + 1
EndIf

ProcedureReturn fpsf
EndProcedure

OpenWindow(0,0,0,640,480,"eclairage")
OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
;OpenScreen(640,480,32,"")
ClearScreen(0)
FlipBuffers()
Repeat
ClearScreen(0)
StartDrawing(ScreenOutput())
Box(300,300,40,55,RGB(0,0,255))
c.l = c.l + 1
cx.l = Cos(c / 10)*60 + 100
cy.L = Sin(c / 10)*60 + 100
Circle(cx,cy,20,RGB(0,0,255))
DrawText(10,10,Str(fps()))
StopDrawing()
  ExamineMouse()
eclairage(MouseX(),MouseY(),0,200,RGB(Sin(h)*255,Cos(h)*255,Sin(h2)*255))
h = h + 10
h2 = h2 + 20
eclairage(400,400,h,200,255)
eclairage(100,400,h2,300,32452)
eclairage(300,150,h2,300,45528)
FlipBuffers()
ExamineKeyboard()
Event = KeyboardPushed(#PB_Key_Escape)
Until  Event
End
:wink:

Publié : mer. 01/août/2007 19:34
par Polux
Mytic a écrit : Tu pourrais m’éclairé un peur sur cette émulation directX sur VISTA ? (si c’est pas trop demander)
:wink:
et bien en fait, Vista embarque la version 10 de directX qui n'est plus entièrement rétrocompatible avec les plus anciennes ( ce qui permet à crosoft d'avoir un code repris de zéro, beaucoup plus propre ).
En fait, elle reste bien sur compatible avec DirectX9.0c mais comme tu peux le voir, Purebasic utilise la couche Directdraw de directx7 pour les sprites et les buffers. Cette couche n'existe plus avec la couche directx9 de vista ( Plus de directdraw, tout passe par Direct3D ).
Donc les commandes sont "émulées" pour être comprises par DX10 et s'ensuit une lenteur implaccable ( mon moteur tournant à 60fps sur un pc XP, peut tourner à 10-25 sur le même sous Vista.. et pourtant j'ai optimisé le truc )...

Il y aurait bien une solution, une couche DX9 à la place de DX7 dans purebasic... J'ai testé certains codes de substitution qui fonctionnaient plus ou moins bien ( Dreammotion semble s'en tirer le mieux ) mais mes developpement sont tellement avancés ( j'ai fini two ce soir ) que je ne pouvais pas me permettre de re-modeler le tout...

De plus, mon petit doigt me dit que Fred est en train d'inclure cette fameuse couche à une prochaine version de purebasic... chut... je n'ai rien dit.... :wink:

Publié : mer. 01/août/2007 19:42
par Mytic
Merci… <Plux> de m’avoir éclairé :D , alors je garde mon XP , et dire que j'allai formater mon DD pour installer vista 8O

Publié : mer. 01/août/2007 19:47
par Polux
j'ai fait pareil. pour l'instant je reste sous xp ;)