Basic Univers
; Auteur : SPH (francais (51100 reims))
; Routine de tracé de triangles pleins avec ou sans dégradé et bordure


Procedure SPH_Triangle(x1, y1, x2, y2, x3, y3, couleur1, couleur2, couleur3, alpha.f, mode, lum, trou, deplacement)
rec = 0
If y1 = y2 : y1 + 1 : rec = 1: EndIf
If y1 = y3 : y1 + 1 : rec = 1: EndIf
If y2 = y3 : y2 + 1 : rec = 2: EndIf

haut = y1
xx.f = x1
xy.f = y1
xdeb.f = x2
ydeb.f = y2
xfin.f = x3
yfin.f = y3
plat = 0

If x1 = x2 And y1 = y2
plat = 1
EndIf
If x1 = x3 And y1 = y3
plat = 1
EndIf
If x2 = x3 And y2 = y3
plat = 1
EndIf
If x1 = x2 And x2 = x3
plat = 1
EndIf
If y1 = y2 And y2 = y3
plat = 1
EndIf
If plat = 1 : ProcedureReturn 0 : EndIf

If y2EndIf
If y3EndIf


If xdeb>xfin
u = xdeb : xdeb = xfin : xfin = u
u = ydeb : ydeb = yfin : yfin = u
EndIf

bas = y1
If y2>bas : bas = y2 : EndIf
If y3>bas : bas = y3 : EndIf

deca.f = 0
decb.f = 0
decc.f = 0

u = ydeb - haut : If u = 0 : u = 1 : EndIf
dec1.f =(xx - xdeb)/u
u = yfin - haut : If u = 0 : u = 1 : EndIf
dec2.f =(xfin - xx)/u
u = yfin - ydeb : If u = 0 : dec3.f = 0 : milieuy = bas + 1
Else : dec3.f =(xfin - xdeb)/u
milieuy = ydeb : xx01 = 1
If milieuy > yfin : milieuy = yfin : xx01 = 2 : EndIf
EndIf

Dim rvb(8)
rvb(0)= Red(couleur1)
rvb(1)= Red(couleur2)
rvb(2)= Red(couleur3)
rvb(3)= Green(couleur1)
rvb(4)= Green(couleur2)
rvb(5)= Green(couleur3)
rvb(6)= Blue(couleur1)
rvb(7)= Blue(couleur2)
rvb(8)= Blue(couleur3)

If rec = 1 : y1 - 1 : EndIf
If rec = 2 : y2 - 1 : EndIf

dist12.f = Sqr((x2 - x1)*(x2 - x1)+(y2 - y1)*(y2 - y1))
dist23.f = Sqr((x3 - x2)*(x3 - x2)+(y3 - y2)*(y3 - y2))
dist13.f = Sqr((x3 - x1)*(x3 - x1)+(y3 - y1)*(y3 - y1))


; ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo


For u = haut To bas

If decb + deca>0


 
For n = xx - deca To xx + decb

dist1.f = Sqr((n - x1)*(n - x1)+(u - y1)*(u - y1))
dist2.f = Sqr((n - x2)*(n - x2)+(u - y2)*(u - y2))
dist3.f = Sqr((n - x3)*(n - x3)+(u - y3)*(u - y3))

If mode = 0
distM1.f = dist12.f/1.3
If distM1.f>dist13.f/1.3 : distM1.f = dist13.f/1.3 : EndIf
distM2.f = dist12.f/1.3
If distM2.f>dist23.f/1.3 : distM2.f = dist23.f/1.3 : EndIf
distM3.f = dist13.f/1.3
If distM3.f>dist23.f/1.3 : distM3.f = dist23.f/1.3 : EndIf
EndIf

If mode = 1
distM1.f = dist12.f
If distM1.f>dist13.f : distM1.f = dist13.f : EndIf
distM2.f = dist12.f
If distM2.f>dist23.f : distM2.f = dist23.f : EndIf
distM3.f = dist13.f
If distM3.f>dist23.f : distM3.f = dist23.f : EndIf
EndIf

If mode = 2
distM1.f =(dist12.f + dist13.f)/2
distM2.f =(dist12.f + dist23.f)/2
distM3.f =(dist13.f + dist23.f)/2
EndIf

If mode = 3
distM1.f = dist12.f
If distM1.fEndIf
distM2.f = dist12.f
If distM2.fEndIf
distM3.f = dist13.f
If distM3.fEndIf
EndIf

If mode = 4
distM1.f = dist12.f*1.3
If distM1.fEndIf
distM2.f = dist12.f*1.3
If distM2.fEndIf
distM3.f = dist13.f*1.3
If distM3.fEndIf
EndIf


r1.f = lum -((dist1/(distM1))*100)
r2.f = lum -((dist2/(distM2))*100)
r3.f = lum -((dist3/(distM3))*100)
v1.f = lum -((dist1/(distM1))*100)
v2.f = lum -((dist2/(distM2))*100)
v3.f = lum -((dist3/(distM3))*100)
b1.f = lum -((dist1/(distM1))*100)
b2.f = lum -((dist2/(distM2))*100)
b3.f = lum -((dist3/(distM3))*100)


rr4.f =(rvb(0)*r1/100)+(rvb(1)*r2/100)+(rvb(2)*r3/100)
vv4.f =(rvb(3)*v1/100)+(rvb(4)*v2/100)+(rvb(5)*v3/100)
bb4.f =(rvb(6)*b1/100)+(rvb(7)*b2/100)+(rvb(8)*b3/100)

If alpha<100
c = Point(n, u)
If c<0
Else
rr4 = rr4*alpha/100
vv4 = vv4*alpha/100
bb4 = bb4*alpha/100
rr5.f = Red(c)
vv5.f = Green(c)
bb5.f = Blue(c)
rr4 + rr5
vv4 + vv5
bb4 + bb5
EndIf
EndIf


If rr4>255 : rr4 = 255 : EndIf
If vv4>255 : vv4 = 255 : EndIf
If bb4>255 : bb4 = 255 : EndIf
If rr4<0 : rr4 = 0 : EndIf
If vv4<0 : vv4 = 0 : EndIf
If bb4<0 : bb4 = 0 : EndIf


If trou = 0 And deplacement = 0
Plot(n, u, RGB(rr4, vv4, bb4))
Else
If Random(trou) = 0
If deplacement = 0
Plot(n, u, RGB(rr4, vv4, bb4))
Else
Plot(n + Random(deplacement*2)- deplacement, u + Random(deplacement*2)- deplacement, RGB(rr4, vv4, bb4))
EndIf
EndIf
EndIf


Next
Else
For n = xx - deca To xx + decb Step - 1
;;;

dist1.f = Sqr((n - x1)*(n - x1)+(u - y1)*(u - y1))
dist2.f = Sqr((n - x2)*(n - x2)+(u - y2)*(u - y2))
dist3.f = Sqr((n - x3)*(n - x3)+(u - y3)*(u - y3))

If mode = 0
distM1.f = dist12.f/1.3
If distM1.f>dist13.f/1.3 : distM1.f = dist13.f/1.3 : EndIf
distM2.f = dist12.f/1.3
If distM2.f>dist23.f/1.3 : distM2.f = dist23.f/1.3 : EndIf
distM3.f = dist13.f/1.3
If distM3.f>dist23.f/1.3 : distM3.f = dist23.f/1.3 : EndIf
EndIf

If mode = 1
distM1.f = dist12.f
If distM1.f>dist13.f : distM1.f = dist13.f : EndIf
distM2.f = dist12.f
If distM2.f>dist23.f : distM2.f = dist23.f : EndIf
distM3.f = dist13.f
If distM3.f>dist23.f : distM3.f = dist23.f : EndIf
EndIf

If mode = 2
distM1.f =(dist12.f + dist13.f)/2
distM2.f =(dist12.f + dist23.f)/2
distM3.f =(dist13.f + dist23.f)/2
EndIf

If mode = 3
distM1.f = dist12.f
If distM1.fEndIf
distM2.f = dist12.f
If distM2.fEndIf
distM3.f = dist13.f
If distM3.fEndIf
EndIf

If mode = 4
distM1.f = dist12.f*1.3
If distM1.fEndIf
distM2.f = dist12.f*1.3
If distM2.fEndIf
distM3.f = dist13.f*1.3
If distM3.fEndIf
EndIf


r1.f = lum -((dist1/(distM1))*100)
r2.f = lum -((dist2/(distM2))*100)
r3.f = lum -((dist3/(distM3))*100)
v1.f = lum -((dist1/(distM1))*100)
v2.f = lum -((dist2/(distM2))*100)
v3.f = lum -((dist3/(distM3))*100)
b1.f = lum -((dist1/(distM1))*100)
b2.f = lum -((dist2/(distM2))*100)
b3.f = lum -((dist3/(distM3))*100)


rr4.f =(rvb(0)*r1/100)+(rvb(1)*r2/100)+(rvb(2)*r3/100)
vv4.f =(rvb(3)*v1/100)+(rvb(4)*v2/100)+(rvb(5)*v3/100)
bb4.f =(rvb(6)*b1/100)+(rvb(7)*b2/100)+(rvb(8)*b3/100)

If alpha<100
c = Point(n, u)
If c<0
Else
rr4 = rr4*alpha/100
vv4 = vv4*alpha/100
bb4 = bb4*alpha/100
rr5.f = Red(c)
vv5.f = Green(c)
bb5.f = Blue(c)
rr4 + rr5
vv4 + vv5
bb4 + bb5
EndIf
EndIf


If rr4>255 : rr4 = 255 : EndIf
If vv4>255 : vv4 = 255 : EndIf
If bb4>255 : bb4 = 255 : EndIf
If rr4<0 : rr4 = 0 : EndIf
If vv4<0 : vv4 = 0 : EndIf
If bb4<0 : bb4 = 0 : EndIf

If trou = 0 And deplacement = 0
Plot(n, u, RGB(rr4, vv4, bb4))
Else
If Random(trou) = 0
If deplacement = 0
Plot(n, u, RGB(rr4, vv4, bb4))
Else
Plot(n + Random(deplacement*2)- deplacement, u + Random(deplacement*2)- deplacement, RGB(rr4, vv4, bb4))
EndIf
EndIf
EndIf

Next

;;;


EndIf


; pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp

If u < milieuy
deca + dec1
decb + dec2
EndIf

If u > milieuy
  If xx01 = 1
  deca - dec3
  decb + dec2
  Else
  deca + dec1
  decb + dec3
  EndIf
EndIf

Next

;  LineXY(x1,y1,x2,y2,1500000)
;  LineXY(x1,y1,x3,y3,1500000)
;  LineXY(x2,y2,x3,y3,1500000)


EndProcedure

; WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
;- Debut du programme
OpenWindow(1, 0, 0, 1024, 768, "", #PB_Window_MinimizeGadget)



If StartDrawing(WindowOutput(1))
; un fond pour tester l'alpha (mettre un alpha different de 100) :
; For i = 1 To 15 :  Box(Random (639),Random (499),Random (639),Random (499), RGB(Random (255),Random (255),Random (255))) : Next
StopDrawing()
EndIf

For plusieur = 1 To 10

; Toutes les lignes du dessous jusqu'a la ligne de commentaire avec plein de Z peuvent
; etre effacé pour que l'utilisation mette ses propres valeurs !


lumiere = 100
alpha = 100  ;(mettez 1 ou 2, c'est rigolo...)
mode = 2
trou = 0 ; (de 0 a 10 (+ en fait mais aucun interet))
deplacement = 0 ; un espece de BLUR  (ATTENTION, certains points risquent de sortir (= bug))) ps: ici, la marge est de 29 ou 30
; is deplacement <> 0 alors ca rame un peu

 x1 = Random(992) + 30
 y1 = Random(733) + 30
 x2 = Random(992) + 30
 y2 = Random(733) + 30
 x3 = Random(992) + 30
 y3 = Random(733) + 30


c1 = RGB(Random(255), Random(255), Random(255))
c2 = RGB(Random(255), Random(255), Random(255))
c3 = RGB(Random(255), Random(255), Random(255))

; ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

    If StartDrawing(WindowOutput(1))

      SPH_Triangle(x1, y1, x2, y2, x3, y3, c1, c2, c3, alpha, mode, lumiere, trou, deplacement)



;---------------  A  ---     ---  L  ---  I  ---  R  ---  E  ------------------

; alpha, c'est l'alpha (de 0 (transparent total) a 100(pas transparent))
; mode va de 0 a 4 (0 = dark et 4 = pastel)
; lumiere va de 50 a 150 (lumiere neutre = 100)
; pour que tu puisse voir chaque triangle :
; Delay (1500)
;------------------------------------------------------------------------------



       StopDrawing()
    EndIf
Next

Repeat :  event = WindowEvent() : Until event =#PB_Event_CloseWindow