;Comtois
;Escalier 3D en colimaçon
;PB 3.93 le 13/03/05
;- Déclaration des procédures
Declare Erreur(Message$)
Declare.f Sind(Angle.f)
Declare.f Cosd(Angle.f)
Declare.f WrapValue(Angle.f)
; -Initialisation
#ScreenWidth = 1024 : #ScreenHeight = 768 : #ScreenDepth = 32
If InitEngine3D() = 0
Erreur("Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll")
ElseIf InitSprite() = 0 Or InitKeyboard() = 0
Erreur("Impossible d'initialiser DirectX 7 Ou plus")
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "Démo" ) = 0
Erreur("Impossible d'ouvrir l'écran ")
EndIf
;-Mesh
CreateMesh(0) ;Cube
SetMeshData(0, #PB_Mesh_Vertices , ?CubePoints , 16)
SetMeshData(0, #PB_Mesh_Triangles , ?CubeTriangles, 12)
SetMeshData(0, #PB_Mesh_UVCoordinates , ?CubeTextures , 16)
SetMeshData(0, #PB_Mesh_Normals , ?CubeNormales , 16)
;-light
CreateLight(0,RGB(255,255,255) )
;- Material
CreateMaterial(0 ,LoadTexture(0,"Bois1.png"))
MaterialShadingMode(0, #PB_Material_Phong)
;-Entity
;Fabrique l'escalier
Angle.f = 0
NombreMarche = 35
Distance = 70
HauteurMarche = 15
LargeurMarche = 100
ProfondeurMarche = 66
;Les marches
For Marche = 0 To NombreMarche - 1
CreateEntity(Marche, MeshID(0), MaterialID(0))
ResizeEntity (Marche, LargeurMarche, HauteurMarche, ProfondeurMarche)
EntityLocate(Marche, Cosd(Angle) * Distance, HauteurMarche / 2 + HauteurMarche * Marche, -Sind(Angle) * Distance)
RotateEntity(Marche, Angle, 0, 0)
Angle = WrapValue(Angle + 30)
Next Marche
;La colonne centrale
HauteurColonne.f = NombreMarche * HauteurMarche
Colonne = Marche + 1
CreateEntity(Colonne, MeshID(0) , MaterialID(0) )
ResizeEntity(Colonne, 4 + Distance / 2 , HauteurColonne, 4 + Distance / 2 )
EntityLocate(Colonne, 0, HauteurColonne / 2, 0 )
;- Camera
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0,0,0,20)
AmbientColor(RGB(85,85,85))
;- Boucle principale
HauteurCamera = NombreMarche * 5
DistanceCamera = 450
Pas.f = 0.6
Repeat
ClearScreen(0, 0, 0)
CameraLocate(0, Cosd(Angle) * DistanceCamera , HauteurCamera, -Sind(Angle) * DistanceCamera)
LightLocate (0, Cosd(Angle) * DistanceCamera / 2, HauteurCamera, -Sind(Angle) * DistanceCamera / 2)
CameraLookAt(0, 0, HauteurCamera, 0)
Angle = WrapValue(Angle + Pas / 2)
If HauteurCamera < 0 Or HauteurCamera > NombreMarche * HauteurMarche : Pas * -1 : EndIf
HauteurCamera + Pas
RenderWorld()
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
End
;- Procédures
Procedure Erreur(Message$)
MessageRequester("Erreur", Message$, 0)
End
EndProcedure
Procedure.f WrapValue(Angle.f)
Angle/360
Angle-Int(Angle)
If Angle<0
ProcedureReturn (Angle+1)*360
Else
ProcedureReturn Angle*360
EndIf
EndProcedure
Procedure.f Cosd( Angle.f )
;calcule le cos d'un angle en degré
ProcedureReturn Cos( Angle * 0.0174533 )
EndProcedure
Procedure.f Sind( Angle.f )
;calcule le sin d'un angle en degré
ProcedureReturn Sin( Angle * 0.0174533 )
EndProcedure
;-Datas du Cube
DataSection
CubePoints:
Data.f -0.5,-0.5,-0.5
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5
Data.f -0.5,0.5,-0.5
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5
Data.f -0.5,-0.5,-0.5
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5
Data.f -0.5,0.5,-0.5
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5
CubeNormales:
Data.f -5,0,-5
Data.f -5,0,5
Data.f 5,0,5
Data.f 5,0,-5
Data.f -5,0,-5
Data.f -5,0,5
Data.f 5,0,5
Data.f 5,0,-5
Data.f 0,-10,0
Data.f 0,-10,0
Data.f 0,-10,0
Data.f 0,-10,0
Data.f 0,10,0
Data.f 0,10,0
Data.f 0,10,0
Data.f 0,10,0
CubeTriangles:
Data.w 0,4,7
Data.w 0,7,3
Data.w 1,5,4
Data.w 1,4,0
Data.w 2,6,5
Data.w 2,5,1
Data.w 3,7,6
Data.w 3,6,2
Data.w 9,8,11
Data.w 9,11,10
Data.w 12,13,14
Data.w 12,14,15
CubeTextures:
Data.f 0,1
Data.f 1,1
Data.f 0,1
Data.f 1,1
Data.f 0,0
Data.f 1,0
Data.f 0,0
Data.f 1,0
Data.f 0,0
Data.f 1,0
Data.f 1,1
Data.f 0,1
Data.f 0,0
Data.f 1,0
Data.f 1,1
Data.f 0,1
EndDataSection