Code: Select all
;Comtois le 29 mai 2004
;Merci à François Weil pour l'optimisation du code :)
;>> #PB_Material_Phong et #PB_Material_Flat sont inversés ? (Bug)
;PB : 3.90
;-Constantes
#ScreenWidth = 1024
#ScreenHeight = 768
#ScreenDepth = 32
#Img_SnapShot = 0
;/SnapShot
hBitmap = CreateImage(#Img_SnapShot, #ScreenWidth, #ScreenHeight)
hdc = StartDrawing(ImageOutput())
SelectObject_(hdc, hBitmap)
BitBlt_(hdc, 0, 0, #ScreenWidth, #ScreenHeight, GetDC_(GetDesktopWindow_()), 0, 0, #SRCCOPY)
StopDrawing()
DeleteDC_(hdc)
;-Structures
Structure Vecteur
x.f
y.f
Z.f
EndStructure
Structure Lumiere
Couleur.l
x.f
y.f
Z.f
EndStructure
Structure Matrice
Largeur.f
Profondeur.f
NbFacetteX.l
NbFacetteZ.l
FaceVisible.l ; si = #True on double les triangles pour voir l'entité des deux côtés
NbPointX.l
NbPointZ.l
Nbtriangle.l
TailleFacetteX.f ; Je ne sais pas si je vais garder cette méthode
TailleFacetteZ.f ; Je ne sais pas si je vais garder cette méthode
PointIDMemory.l
TriangleIDMemory.l
TextureIDMemory.l
NormaleIDMemory.l
EndStructure
Structure Vague
decaleX.l
decaleZ.l
Hauteur.l
Angle.l
Vitesse.l
EndStructure
;-Variables
Global Matrice.Matrice
Global Lumiere.Lumiere
Global Vague.Vague
Global Mode.b ,ShadingMode.b,Animation.l,AfficheAide.l
;-Declare
Declare Matrice()
Declare NormalesMatrice()
Declare vagues()
Declare GestionTouches()
Declare GestionSouris()
Declare AfficheAide()
;
;- Main starts here
;
If InitEngine3D() And InitSprite() And InitKeyboard() And InitMouse() And OpenScreen(#ScreenWidth, #ScreenHeight, #ScreenDepth, "FRW Matrice")
;/Divers
Vague\Vitesse=3
Vague\Hauteur=20
Vague\decaleX=6
Vague\decaleZ=6
Animation = 1
AfficheAide = 1
;/Paramètres de la matrice (à renseigner)
Matrice\Largeur = 1000
Matrice\Profondeur = 1000
Matrice\NbFacetteX = 60
Matrice\NbFacetteZ = 60
Matrice\FaceVisible = #False ; #True double les triangles pour rendre visible l'autre face de la matrice
;/Quelques informations complémentaires sur la matrice ( Calculées )
If Matrice\FaceVisible
Matrice\Nbtriangle = 4
Else
Matrice\Nbtriangle = 2
EndIf
Matrice\NbPointX = Matrice\NbFacetteX + 1
Matrice\NbPointZ = Matrice\NbFacetteZ + 1
Matrice\TailleFacetteX = Matrice\Largeur / Matrice\NbFacetteX
Matrice\TailleFacetteZ = Matrice\Profondeur / Matrice\NbFacetteZ
Matrice\PointIDMemory = AllocateMemory(12 * Matrice\NbPointX * Matrice\NbPointZ)
Matrice\TriangleIDMemory = AllocateMemory(12 * Matrice\NbFacetteX * Matrice\NbFacetteZ * Matrice\Nbtriangle)
Matrice\TextureIDMemory = AllocateMemory(12 * Matrice\NbPointX * Matrice\NbPointZ)
Matrice\NormaleIDMemory = AllocateMemory(12 * Matrice\NbPointX * Matrice\NbPointZ)
Dim Points.Vecteur(Matrice\NbPointX * Matrice\NbPointZ)
Matrice()
;/Mesh
CreateMesh(0)
SetMeshData(0, 0, Matrice\PointIDMemory , Matrice\NbPointX * Matrice\NbPointZ)
SetMeshData(0, 1, Matrice\TriangleIDMemory, Matrice\NbFacetteX * Matrice\NbFacetteZ * Matrice\Nbtriangle)
SetMeshData(0, 2, Matrice\TextureIDMemory , Matrice\NbPointX * Matrice\NbPointZ)
SetMeshData(0, 3, Matrice\NormaleIDMemory , Matrice\NbPointX * Matrice\NbPointZ)
;/Texture
;>>>>>>>>>>> LoadTexture Here !! <<<<<<
TextureXSize = 256
TextureYSize = 256
;ResizeImage(#Img_SnapShot,TextureXSize,TextureYSize)
CreateTexture(0, TextureXSize, TextureYSize)
StartDrawing(TextureOutput(0))
DrawImage(UseImage(#Img_SnapShot),0,0)
StopDrawing()
;/Material
CreateMaterial(0, TextureID(0)) ; Material
MaterialShadingMode(0, #PB_Material_Gouraud)
MaterialBlendingMode(0, #PB_Material_AlphaBlend)
MaterialAmbientColor(0, RGB(255,55,55))
MaterialDiffuseColor(0, RGB(255,255,128))
MaterialSpecularColor(0,RGB(255,0,0))
;/Entity
CreateEntity(0, MeshID(0), MaterialID(0))
;/Caméra
CreateCamera(0, 0, 0, 100, 100)
CameraLocate(0, 0, 845, 915)
CameraLookAt(0, EntityX(0), EntityY(0) , EntityZ(0))
;/Lumière
AmbientColor(RGB(160,160,160))
Lumiere\Couleur = RGB(255,255,128)
Lumiere\x = EntityX(0)/2
Lumiere\y = 930
Lumiere\Z = EntityZ(0)/2
CreateLight(0,Lumiere\Couleur)
LightLocate(0,Lumiere\x, Lumiere\y, Lumiere\Z)
Repeat
;ClearScreen(0, 0, 0)
GestionSouris()
vagues()
NormalesMatrice()
RenderWorld()
GestionTouches() ; Placé après RenderWorld sinon le snapshot ne fonctionne pas !
If AfficheAide : AfficheAide() : EndIf
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Else
MessageRequester("Error", "Something fails to initialize 3D engine", 0)
EndIf
End
;/
;-Procedures
;/
Procedure calculVecteurNorme(*v1.Vecteur,*v2.Vecteur,*n.Vecteur)
x.f = *v2\x - *v1\x
y.f = *v2\y - *v1\y
Z.f = *v2\Z - *v1\Z
d.f = Sqr(x * x + y * y + Z * Z)
*n\x =x / d
*n\y =y / d
*n\Z =Z / d
EndProcedure
Procedure produitVectoriel(*v1.Vecteur,*v2.Vecteur,*n.Vecteur)
*n\x = *v1\y * *v2\Z - *v1\Z * *v2\y
*n\y = *v1\Z * *v2\x - *v1\x * *v2\Z
*n\Z = *v1\x * *v2\y - *v1\y * *v2\x
EndProcedure
Procedure Matrice()
Adresse1 = Matrice\PointIDMemory ; Adresse Points
Adresse2 = Matrice\TextureIDMemory ; Adresse Texture
adresse3 = Matrice\TriangleIDMemory ; Adresse triangles
Index = 6 * Matrice\Nbtriangle
For b = 0 To Matrice\NbFacetteZ
bx = b * Matrice\NbPointX
bx1 = bx + Matrice\NbPointX
For a = 0 To Matrice\NbFacetteX
;/Points
PokeF(Adresse1, (a - Matrice\NbFacetteX / 2) * Matrice\TailleFacetteX)
PokeF(Adresse1 + 4, 0)
PokeF(Adresse1 + 8, (b - Matrice\NbFacetteZ / 2) * Matrice\TailleFacetteZ)
Adresse1 + 12
;/Texture
PokeF(Adresse2, a / Matrice\NbFacetteX)
PokeF(Adresse2 + 4, b / Matrice\NbFacetteZ)
Adresse2 + 8
;/Triangles
If b < Matrice\NbFacetteZ And a < Matrice\NbFacetteX
P1 = a + bx
P2 = P1 + 1
P3 = a + bx1
P4 = P3 + 1
PokeL(adresse3, P4 << 16 + P1)
PokeL(adresse3 + 4, P1 << 16 + P2)
PokeL(adresse3 + 8, P4 << 16 + P3)
If Matrice\FaceVisible
PokeL(adresse3 + 12, P2 << 16 + P1)
PokeL(adresse3 + 16, P4 << 16 + P3)
PokeL(adresse3 + 20, P2 << 16 + P3)
EndIf
adresse3 + Index
EndIf
Next
Next
EndProcedure
Procedure NormalesMatrice()
Vecteur1.Vecteur
Vecteur2.Vecteur
P1.Vecteur ; Point 1 de la Facette
P2.Vecteur ; Point 2 de la Facette
P3.Vecteur ; Point 3 de la Facette
P4.Vecteur ; Point 4 de la Facette
Normale1.Vecteur ; Normale Triangle 1 de la Facette Points 1,2,3
Normale2.Vecteur ; Normale Triangle 2 de la Facette Points 2,4,3
adresse = Matrice\PointIDMemory + 4
AdrNormale = Matrice\NormaleIDMemory
For Z = 0 To Matrice\NbFacetteZ - 1
zx = Z * Matrice\NbPointX
zx1 = zx + Matrice\NbPointX
For x = 0 To Matrice\NbFacetteX - 1
NoPoint1 = x + zx
P1\x = x
P1\y = PeekF(adresse + NoPoint1 * 12)
P1\Z = Z
NoPoint2 = NoPoint1 + 1
P2\x = x + 1
P2\y = PeekF(adresse + NoPoint2 * 12)
P2\Z = Z
NoPoint3 = x + zx1
P3\x = x
P3\y = PeekF(adresse + NoPoint3 * 12)
P3\Z = Z + 1
NoPoint4 = NoPoint3 + 1
P4\x = x + 1
P4\y = PeekF(adresse + NoPoint4 * 12)
P4\Z = Z + 1
calculVecteurNorme(@P1,@P2,@Vecteur1)
calculVecteurNorme(@P1,@P3,@Vecteur2)
produitVectoriel(@Vecteur2,@Vecteur1,@Normale1)
calculVecteurNorme(@P2,@P4,@Vecteur1)
calculVecteurNorme(@P2,@P3,@Vecteur2)
produitVectoriel(@Vecteur2,@Vecteur1,@Normale2)
Points(NoPoint1)\x + Normale1\x
Points(NoPoint1)\y + Normale1\y
Points(NoPoint1)\Z + Normale1\Z
Points(NoPoint2)\x + Normale1\x + Normale2\x
Points(NoPoint2)\y + Normale1\y + Normale2\y
Points(NoPoint2)\Z + Normale1\Z + Normale2\Z
Points(NoPoint3)\x + Normale1\x + Normale2\x
Points(NoPoint3)\y + Normale1\y + Normale2\y
Points(NoPoint3)\Z + Normale1\Z + Normale2\Z
Points(NoPoint4)\x + Normale2\x
Points(NoPoint4)\y + Normale2\y
Points(NoPoint4)\Z + Normale2\Z
Next x
Next Z
For Z = 0 To Matrice\NbFacetteZ
For x = 0 To Matrice\NbFacetteX
Distance.f = Sqr(Points(No)\x * Points(No)\x + Points(No)\y * Points(No)\y + Points(No)\Z * Points(No)\Z)
Points(No)\x / Distance
Points(No)\y / Distance
Points(No)\Z / Distance
PokeF(AdrNormale , Points(No)\x)
PokeF(AdrNormale + 4, Points(No)\y)
PokeF(AdrNormale + 8, Points(No)\Z)
No + 1
AdrNormale + 12
Next x
Next Z
SetMeshData(0, 3, Matrice\NormaleIDMemory , Matrice\NbPointX * Matrice\NbPointZ)
EndProcedure
Procedure vagues()
If Animation
Vague\Angle = (Vague\Angle + Vague\Vitesse) % 360
EndIf
adresse = Matrice\PointIDMemory + 4
For Z = 0 To Matrice\NbFacetteZ
For x = 0 To Matrice\NbFacetteX
Sommet.f = Sin(0.0174533 * (Vague\Angle + (x * Vague\decaleX) + (Z * Vague\decaleZ))) * Vague\Hauteur
PokeF(adresse, Sommet)
adresse + 12
Next x
Next Z
SetMeshData(0, 0, Matrice\PointIDMemory, Matrice\NbPointX * Matrice\NbPointZ)
EndProcedure
Procedure GestionTouches()
ExamineKeyboard()
If KeyboardReleased(#PB_Key_F1)
Mode = #PB_Camera_Wireframe - Mode
CameraRenderMode(0, Mode)
EndIf
If KeyboardReleased(#PB_Key_F2)
MaterialShadingMode(0, #PB_Material_Flat)
EndIf
If KeyboardReleased(#PB_Key_F3)
MaterialShadingMode(0, #PB_Material_Gouraud)
EndIf
If KeyboardReleased(#PB_Key_F4)
MaterialShadingMode(0, #PB_Material_Phong)
EndIf
If KeyboardReleased(#PB_Key_F5)
Animation = 1 - Animation
EndIf
If KeyboardReleased(#PB_Key_F10)
AfficheAide = 1 - AfficheAide
EndIf
Vague\decaleX - 1 * KeyboardPushed(#PB_Key_Left) / 128
Vague\decaleX + 1 * KeyboardPushed(#PB_Key_Right) / 128
Vague\Hauteur + 1 * KeyboardPushed(#PB_Key_PageUp) / 128
Vague\Hauteur - 1 * KeyboardPushed(#PB_Key_PageDown) / 128
Vague\decaleZ + 1 * KeyboardPushed(#PB_Key_Up) / 128
Vague\decaleZ - 1 * KeyboardPushed(#PB_Key_Down) / 128
;SnapShot
If KeyboardReleased(#PB_Key_F12)
hBitmap = CreateImage(#Img_SnapShot, #ScreenWidth, #ScreenHeight)
hdc = StartDrawing(ImageOutput())
SelectObject_(hdc, hBitmap)
BitBlt_(hdc, 0, 0, #ScreenWidth, #ScreenHeight, GetDC_(GetDesktopWindow_()), 0, 0, #SRCCOPY)
StopDrawing()
DeleteDC_(hdc)
SetClipboardData(#PB_ClipboardImage, ImageID())
EndIf
EndProcedure
Procedure GestionSouris()
ExamineMouse()
If MouseButton(1)
Lumiere\y + 2
EndIf
If MouseButton(2)
Lumiere\y - 2
EndIf
Lumiere\x + MouseDeltaX()
Lumiere\Z + MouseDeltaY()
LightLocate(0,Lumiere\x,Lumiere\y,Lumiere\Z)
EndProcedure
Procedure AfficheAide()
StartDrawing(ScreenOutput())
DrawingMode(1)
FrontColor(255, 255, 255)
Locate(10, 10)
DrawText("DecaleX = " + StrF(Vague\decaleX))
Locate(10, 30)
DrawText("DecaleZ = " + StrF(Vague\decaleZ))
Locate(10, 50)
DrawText("HauteurVague = " + StrF(Vague\Hauteur))
Locate(10, 70)
DrawText("[F1] => Change Mode Caméra")
Locate(10, 90)
DrawText("[F2] => MaterialSharingMode=> Flat")
Locate(10, 110)
DrawText("[F3] => MaterialSharingMode=> Gouraud")
Locate(10, 130)
DrawText("[F4] => MaterialSharingMode=> Phong")
Locate(10, 150)
DrawText("[F5] => Marche/Arrêt Animation des vagues")
Locate(10, 170)
DrawText("Lumiere X => " + Str(Lumiere\x))
Locate(10, 190)
DrawText("Lumiere Y (MouseClick) => " + Str(Lumiere\y))
Locate(10, 210)
DrawText("Lumiere Z => " + Str(Lumiere\Z))
Locate(10, 230)
DrawText("Image par seconde (Actuel) = " + Str(Engine3DFrameRate(#PB_Engine3D_Current)))
Locate(10, 250)
DrawText("Image par seconde (Moyenne) = " + Str(Engine3DFrameRate(#PB_Engine3D_Average)))
Locate(10, 270)
DrawText("Nombre de polygones (Triangles) = " + Str(CountRenderedTriangles()))
Locate(10, 290)
DrawText("Mémoire vidéo disponible = " + Str(AvailableScreenMemory()))
Locate(10, 310)
DrawText("[F10] Cache/Montre l'aide")
Locate(10, 330)
DrawText("[F12] SnapShot")
StopDrawing()
EndProcedure