Code: Select all
;*******************************************
;** Comtois ** 15/11/03 ** Matrice / Vagues **
;*******************************************
;-Initialisation
#ScreenWidth = 800 : #ScreenHeight = 600 : #ScreenDepth = 32
If InitEngine3D()=0
MessageRequester("Erreur", "Impossible d'initialiser la 3D , Vérifiez la présence de la DLL Engine3D.dll", 0)
End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Erreur", "Impossible d'initialiser DirectX 7 Ou plus", 0)
End
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "DemoMatrice" ) = 0
MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
End
EndIf
;-Variables Globales
Global AngleVague.f ,vitesse.f ,decaleX.f ,decaleZ.f ,hauteur.f
AngleVague = Random(360)
vitesse = 3.0
decaleX = 23
decaleZ = 0
hauteur = 4
;- Declaration des procédures
Declare Matrice(NbpointsX.l,NbpointsZ.l)
;-Constantes
Enumeration
#PointID
#TriangleID
#TextureID
EndEnumeration
#NbX= 30 ; nombre de facettes
#NbZ= 30 ; nombre de facettes
;-Mémoires Mesh
AllocateMemory(#PointID , 12 * (#NbX + 1 )* (#NbZ + 1 ) , 0)
AllocateMemory(#TriangleID , 12 * #NbX * #NbZ * 4 , 0)
AllocateMemory(#TextureID , 12 * (#NbX + 1 )* (#NbZ + 1 ) , 0)
Matrice(#NbX , #NbZ)
;-Mesh
CreateMesh(0)
SetMeshData(0, 0, UseMemory(#PointID) , (#NbX + 1 )* (#NbZ + 1 ))
SetMeshData(0, 1, UseMemory(#TriangleID) , (#NbX ) * (#NbZ ) * 4)
SetMeshData(0, 2, UseMemory(#TextureID) , (#NbX + 1 )* (#NbZ + 1 ))
;-Texture
UsePNGImageDecoder()
;LoadTexture(0,"purebasiclogoNew.png") ; <<< pourquoi ça plante quand je mets juste ça ?
LoadImage(0,"purebasiclogoNew.png") ; alors que l'image se charge ? Je verrai ça plus tard
CreateTexture(0,256,256)
StartDrawing(TextureOutput(0))
DrawImage(UseImage(0),0,0)
DrawingMode(4)
Box(1,1,254,254,RGB(255,255,255))
StopDrawing()
;- MAterial
CreateMaterial(0,TextureID(0))
MaterialFilteringMode(0 , #PB_Material_Trilinear )
;-Entity
CreateEntity(0, MeshID(0), MaterialID(0))
RotateEntity(0,0,45,0)
ScaleEntity(0, 10, 10, 10)
;-Camera
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0,0,350,350)
CameraLookAt(0,0,0,0)
;-Procédures
Procedure Matrice(FX.l,FZ.l)
adresse=UseMemory(#PointID)
For b=0 To FZ
For a=0 To FX
PokeF(adresse, a - FX/2) : PokeF(adresse + 4, 0 ) : PokeF(adresse + 8, b - FZ/2)
;PokeF(adresse, a ) : PokeF(adresse + 4, 0 ) : PokeF(adresse + 8, b )
adresse + 12
Next a
Next b
adresse=UseMemory(#TriangleID)
Nb = FX + 1
For b=0 To FZ - 1
For a=0 To FX - 1
P1 = a + (b * Nb)
P2 = a + 1 + (b * Nb)
P3 = a + ((b + 1) * Nb)
P4 = a + 1 + ((b + 1) * Nb)
PokeW(adresse , P3) : PokeW(adresse + 2, P2) : PokeW(adresse + 4, P1)
PokeW(adresse + 6, P2) : PokeW(adresse + 8, P3) : PokeW(adresse + 10, P4)
PokeW(adresse + 12, P1) : PokeW(adresse + 14, P2) : PokeW(adresse + 16, P3)
PokeW(adresse + 18, P4) : PokeW(adresse + 20, P3) : PokeW(adresse + 22, P2)
adresse + 24
Next a
Next b
adresse=UseMemory(#TextureID)
For b=0 To FZ
For a=0 To FX
Px.f = a/FX
Pz.f = b/FZ
PokeF(adresse, Px) : PokeF(adresse + 4, Pz)
adresse + 8
Next a
Next b
EndProcedure
Procedure.f wrapvalue( angle.f )
;Permet de toujours avoir un angle compris entre 0° et 360°
While angle < 0
angle + 360
Wend
While angle - 360 >= 0
angle - 360
Wend
ProcedureReturn angle
EndProcedure
Procedure.f Cosd( angle.f )
;calcule le cos d'un angle en degré
a.f = angle * 0.0174533
ProcedureReturn Cos( a )
EndProcedure
Procedure.f Sind( angle.f )
;calcule le sin d'un angle en degré
a.f = angle * 0.0174533
ProcedureReturn Sin( a )
EndProcedure
Procedure vagues()
; Modification sur l'axe des Y
adresse = UseMemory(#PointID) + 4
For z = 0 To #NbZ
For x = 0 To #NbX
Sommet.f = Sind(AngleVague + (x * decaleX) + (z * decaleZ)) * hauteur
PokeF(adresse, Sommet)
adresse + 12
Next x
Next z
SetMeshData(0, 0, UseMemory(#PointID) , (#NbX + 1 )* (#NbZ + 1 ))
EndProcedure
Procedure AffAide()
StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor(255,255,255)
Locate(0,0)
DrawText("[F1] / [F2] => Change Mode affichage")
Locate(0,20)
DrawText("[PageUp] / [PageDown] => Hauteur : " + StrF(hauteur))
Locate(0,40)
DrawText("[Flèche Haut] / [Flèche bas] => DecaleZ : " + Str(decaleZ))
Locate(0,60)
DrawText("[Flèche Gauche] / [Flèche droite] => DecaleX : " + Str(decaleX))
StopDrawing()
EndProcedure
;-Boucle principale
Repeat
ClearScreen(0, 0, 0)
ExamineKeyboard()
AffAide()
If KeyboardReleased(#PB_Key_F1) :ClearScreen(0, 0, 0): CameraRenderMode(0, #PB_Camera_Wireframe) : EndIf
If KeyboardReleased(#PB_Key_F2) :ClearScreen(0, 0, 0): CameraRenderMode(0, #PB_Camera_Textured) : EndIf
If KeyboardReleased(#PB_Key_PageUp) : hauteur + 0.5 : EndIf
If KeyboardReleased(#PB_Key_PageDown) : hauteur - 0.5 : EndIf
If KeyboardReleased(#PB_Key_Up) : decaleZ + 1 : EndIf
If KeyboardReleased(#PB_Key_Down) : decaleZ - 1 : EndIf
If KeyboardReleased(#PB_Key_Left) : decaleX - 1 : EndIf
If KeyboardReleased(#PB_Key_Right) : decaleX + 1 : EndIf
AngleVague = wrapvalue(AngleVague + vitesse)
vagues()
RotateEntity(0,0,0,0.1)
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)