Page 1 of 1

Shell 3D

Posted: Tue May 02, 2006 7:18 pm
by Comtois
I used an example for povRay

http://aesculier.chez-alice.fr/fichiers ... lages.html

Code: Select all

;Comtois 02/05/06
;PB4.0 Beta 11


Resultat = MessageRequester("Coquillage 3D","Full Screen ?",#PB_MessageRequester_YesNo)
If Resultat = 6     
  FullScreen=1
Else           
  FullScreen=0
EndIf

;- Initialisation
If InitEngine3D() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
   End
EndIf
   
If InitSprite() = 0 Or InitKeyboard() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
EndIf


If Fullscreen 
  OpenScreen(800,600,32,"Coquillage 3D")
Else
  OpenWindow(0,0, 0, 800 , 600 ,"Coquillage 3D",#PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0),0,0, 800 , 600,0,0,0)
EndIf

#E = 2.71828182

Global Angle.f,Pas.f, CameraMode.l
Global *VBuffer,*IBuffer

Structure s_Vecteur
   x.f
   y.f
   z.f
EndStructure

Structure Vertex
   px.f
   py.f
   pz.f
   nx.f
   ny.f
   nz.f
   co.l
   U.f
   V.f
EndStructure

Structure FTriangle
   f1.w
   f2.w
   f3.w
EndStructure


Procedure.f Exp(value.f)
  ProcedureReturn Pow(#E, value)
EndProcedure

Macro CX(p1,p2)
 exp(p1/k)*Cos(p1)*(1+b*Cos(p2)) 
EndMacro  
Macro   CY(p1,p2)
exp(p1/k)*Sin(p1)*(1+b*Cos(p2)) 
EndMacro 
Macro CZ(p1,p2)
exp(p1/k)*(k+b*Sin(p2)) 
;exp(p1/k)*(1+b*Sin(p2))  
EndMacro 

Macro SOUSTRACTION_VECTEUR(V, V1, V2)
   V\x = V1\x - V2\x
  	V\y = V1\y - V2\y
  	V\z = V1\z - V2\z
EndMacro 


Macro vcross(N, x1, y1, z1, x2, y2, z2)
	N\x = (((y1) * (z2)) - ((z1) * (y2)))
   N\y = (((z1) * (x2)) - ((x1) * (z2)))
   N\z = (((x1) * (y2)) - ((y1) * (x2)))
EndMacro
Procedure CreateMeshCoquillage()
;http://aesculier.chez-alice.fr/fichiersPovray/coquillages/coquillages.html

;A arranger , j'ai juste recopié pour tester.


; equation - Coquillage 

;x=exp(p1/k)*Cos(p1)*(1+b*Cos(p2))
;y=exp(p1/k)*Sin(p1)*(1+b*Cos(p2))
;z=exp(p1/k)*(1+b*Sin(p2)) 

;Peut s'appliquer à toute surface paramétrique en mettant les 
;bonnes formules dans CX, CY, CZ
 
   ;Coq 1
   k       = 25       ;  coq1 : 25    ; coq2 : 10;
   b.f     = 5        ;  coq1 : 5     ; coq2 : 0.49268 
   umin.f  = -90      ;  coq1 : -90   ; coq2 : -34           
   umax.f  = -26.7    ;  coq1 : -26.7 ; coq2 : 4       
   NbSommet = 26000   ; A recalculer avec plus de précision !
   NbTriangle = NbSommet ; Idem 
  
   ; Coq 2
;    k       = 10       ;  coq1 : 25    ; coq2 : 10;
;    b.f     = 0.49268  ;  coq1 : 5     ; coq2 : 0.49268 
;    umin.f  = -34      ;  coq1 : -90   ; coq2 : -34           
;    umax.f  = -4       ;  coq1 : -26.7 ; coq2 : 4 
;    NbSommet = 25000   ; A recalculer avec plus de précision !
;    NbTriangle = 12500 ; Idem
    
    
    
    ;Commun aux deux        
    vmin.f  = 0        ; 
    vmax.f  =  6.3     ;
    uiter.f = 150      ;  nombre de pas en u
    viter.f = 40       ;  nombre de pas en v
 

   iu.f    = (umax-umin)/uiter ;   //increment par pas
   iv.f    = (vmax-vmin)/viter ;

   Define.f uu, vv
   
   Define.f x1, y1, z1
   Define.f x2, y2, z2
   Define.f x3, y3, z3
   Define.f x4, y4, z4
   
   Define.f nx1, ny1, nz1
   Define.f nx2, ny2, nz2
   Define.f nx3, ny3, nz3
   Define.f nx4, ny4, nz4

   Define.s_Vecteur n1, n2, n3, n4, n5, n6, n7, n8, n9   
   Define.s_Vecteur vn1, vn2, vn3, vn4
   

   
   *VBuffer = AllocateMemory(SizeOf(Vertex) * NbSommet)
   *IBuffer = AllocateMemory(SizeOf(FTriangle) * NbTriangle)
   *PtrV.Vertex = *Vbuffer
   *PtrF.FTriangle = *IBuffer
   uu = umin   
   p = 0 
   Coul = Random($00FFFF) + $FF0000
   While (uu<=umax)                     
      vv = vmin
      While (vv<=vmax)                     
         ;POINTS      
         x1=CX(uu,vv)
         y1=CY(uu,vv) 
         z1=CZ(uu,vv) 
         uu=uu+iu    
         x2=CX(uu,vv)
         y2=CY(uu,vv)
         z2=CZ(uu,vv)            
         vv=vv+iv 
         x3=CX(uu,vv)
         y3=CY(uu,vv)
         z3=CZ(uu,vv)
         uu=uu-iu 
         x4=CX(uu,vv)
         y4=CY(uu,vv)
         z4=CZ(uu,vv) 
         vv=vv-iv
         ;NORMALS                  
         uu=uu+2*iu 
         nx1=CX(uu,vv)
         ny1=CY(uu,vv)
         nz1=CZ(uu,vv)
         uu=uu-2*iu 
         vv=vv+2*iv
         nx2=CX(uu,vv) 
         ny2=CY(uu,vv) 
         nz2=CZ(uu,vv) 
         vv=vv-2*iv 
         uu=uu-iu 
         nx3=CX(uu,vv)
         ny3=CY(uu,vv)
         nz3=CZ(uu,vv)
         uu=uu+iu 
         vv=vv-iv 
         nx4=CX(uu,vv)
         ny4=CY(uu,vv)
         nz4=CZ(uu,vv)
         vv=vv+iv
         vcross(n1, nx2-x4, ny2-y4, nz2-z4, nx1-x2, ny1-y2, nz1-z2)
         vcross(n2,  x4-x3,  y4-y3,  z4-z3, nx2-x4, ny2-y4, nz2-z4) 
         vcross(n3, nx3-x1, ny3-y1, nz3-z1, nx2-x4, ny2-y4, nz2-z4)
         vcross(n4,  x3-x2,  y3-y2,  z3-z2, nx1-x2, ny1-y2, nz1-z2) 
         vcross(n5,  x1-x2,  y1-y2,  z1-z2,  x3-x2,  y3-y2,  z3-z2)
         vcross(n6, nx3-x1, ny3-y1, nz3-z1,  x4-x1,  y4-y1,  z4-z1)
         vcross(n7, nx1-x2, ny1-y2, nz1-z2, nx4-x1, ny4-y1, nz4-z1)
         vcross(n8, nx4-x1, ny4-y1, nz4-z1,  x1-x2,  y1-y2,  z1-z2) 
         vcross(n9, nx4-x1, ny4-y1, nz4-z1, nx3-x1, ny3-y1, nz3-z1)  
         
         
         vn1\x = n5\x+n6\x+n8\x+n9\x    
         vn1\y = n5\y+n6\y+n8\y+n9\y
         vn1\z = n5\z+n6\z+n8\z+n9\z
         
         vn2\x = n4\x+n5\x+n7\x+n8\x    
         vn2\y = n4\y+n5\y+n7\y+n8\y
         vn2\z = n4\z+n5\z+n7\z+n8\z
            
         vn3\x = n1\x+n2\x+n4\x+n5\x    
         vn3\y = n1\y+n2\y+n4\y+n5\y
         vn3\z = n1\z+n2\z+n4\z+n5\z
         
         vn4\x = n2\x+n3\x+n5\x+n6\x    
         vn4\y = n2\y+n3\y+n5\y+n6\y
         vn4\z = n2\z+n3\z+n5\z+n6\z
         
         
         *PtrV\px = x1
         *PtrV\py = y1
         *PtrV\pz = z1
         *PtrV\nx = vn1\x
         *PtrV\ny = vn1\y
         *PtrV\nz = vn1\z
         *PtrV\co = Coul
         *PtrV\u = 0
         *PtrV\v = 0
         *PtrV + SizeOf(Vertex)
         
            
         *PtrV\px = x2
         *PtrV\py = y2
         *PtrV\pz = z2
         *PtrV\nx = vn2\x
         *PtrV\ny = vn2\y
         *PtrV\nz = vn2\z
         *PtrV\co = Coul
         *PtrV\u = 1
         *PtrV\v = 0
         *PtrV + SizeOf(Vertex)
  
         
         *PtrV\px = x3
         *PtrV\py = y3
         *PtrV\pz = z3
         *PtrV\nx = vn3\x
         *PtrV\ny = vn3\y
         *PtrV\nz = vn3\z
         *PtrV\co = Coul
         *PtrV\u = 1
         *PtrV\v = 1
         *PtrV + SizeOf(Vertex)
 
                    
         *PtrV\px = x4
         *PtrV\py = y4
         *PtrV\pz = z4
         *PtrV\nx = vn4\x
         *PtrV\ny = vn4\y
         *PtrV\nz = vn4\z
         *PtrV\co = Coul
         *PtrV\u = 0
         *PtrV\v = 1
         *PtrV + SizeOf(Vertex)    
      
   
         ;TRIANGLES      
         *PtrF\f1 = p          ; p1
         *PtrF\f2 = p + 1      ; p2
         *PtrF\f3 = p + 2      ; p3
         *PtrF + SizeOf(FTriangle)
         *PtrF\f1 = p          ; p1
         *PtrF\f2 = p + 2      ; p3
         *PtrF\f3 = p + 3      ; p4
         *PtrF + SizeOf(FTriangle)
         
         *PtrF\f3 = p          ; p1
         *PtrF\f2 = p + 1      ; p2
         *PtrF\f1 = p + 2      ; p3
         *PtrF + SizeOf(FTriangle)
         *PtrF\f3 = p          ; p1
         *PtrF\f2 = p + 2      ; p3
         *PtrF\f1 = p + 3      ; p4
         *PtrF + SizeOf(FTriangle)
         p + 4

         vv = vv+iv
      Wend                 
      uu = uu+iu 
   Wend    
   
      
   If CreateMesh(0,100)
      Flag = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color 
      SetMeshData(0,Flag         ,*VBuffer,NbSommet)
      SetMeshData(0,#PB_Mesh_Face,*IBuffer,NbTriangle)
      ProcedureReturn 1
   Else
      ProcedureReturn 0   
   EndIf
   
EndProcedure   


;-Mesh
;CreateMeshCone(meridien,2,2,0)
CreateMeshCoquillage()

;-Texture
CreateTexture(0,128, 128)
StartDrawing(TextureOutput(0))
  Box(0, 0, 128, 128, $FFFFFF)
StopDrawing() 

;-Material
CreateMaterial(0,TextureID(0))
MaterialAmbientColor(0,-1) 

;-Entity
CreateEntity(0,MeshID(0),MaterialID(0))
ScaleEntity(0,15,15,15)

;-Camera
CreateCamera(0, 0, 0 , 100 , 100)
MoveCamera(0,0,0,-400)
CameraLookAt(0,EntityX(0),EntityY(0),EntityZ(0))


;-Light
AmbientColor(RGB(205,205,205))
CreateLight(0,RGB(155,155,55),EntityX(0)+150,EntityY(0),EntityZ(0))
;CreateLight(1,RGB(55,255,255),EntityX(0)-150,EntityY(0),EntityZ(0))
;CreateLight(2,RGB(255,55,255),EntityX(0),EntityY(0)+150,EntityZ(0))
;CreateLight(3,RGB(255,255,55),EntityX(0),EntityY(0)-150,EntityZ(0))
pas = 0.8
Repeat
   ;ClearScreen(0)
   If fullscreen = 0
      While WindowEvent() : Wend
   EndIf 
   Angle + Pas
   RotateEntity(0,angle,angle/2,-Angle)

   If ExamineKeyboard()
     If KeyboardReleased(#PB_Key_F1)
       CameraMode=1-CameraMode
       CameraRenderMode(0,CameraMode)
     EndIf
   EndIf
  RenderWorld()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) 
 

Posted: Tue May 02, 2006 7:31 pm
by Comtois
or like this

Code: Select all

;Comtois 02/05/06
;PB4.0 Beta 11


Resultat = MessageRequester("Coquillage 3D","Full Screen ?",#PB_MessageRequester_YesNo)
If Resultat = 6     
  FullScreen=1
Else           
  FullScreen=0
EndIf

;- Initialisation
If InitEngine3D() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
   End
EndIf
   
If InitSprite() = 0 Or InitKeyboard() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
EndIf


If Fullscreen
  OpenScreen(800,600,32,"Coquillage 3D")
Else
  OpenWindow(0,0, 0, 800 , 600 ,"Coquillage 3D",#PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0),0,0, 800 , 600,0,0,0)
EndIf

#E = 2.71828182

Global Angle.f,Pas.f, CameraMode.l
Global *VBuffer,*IBuffer
Global meridien.l

meridien=30
Structure s_Vecteur
   x.f
   y.f
   z.f
EndStructure

Structure Vertex
   px.f
   py.f
   pz.f
   nx.f
   ny.f
   nz.f
   co.l
   U.f
   V.f
EndStructure

Structure FTriangle
   f1.w
   f2.w
   f3.w
EndStructure


Procedure.f Exp(value.f)
  ProcedureReturn Pow(#E, value)
EndProcedure

Macro CX(p1,p2)
 exp(p1/k)*Cos(p1)*(1+b*Cos(p2))
EndMacro 
Macro   CY(p1,p2)
exp(p1/k)*Sin(p1)*(1+b*Cos(p2))
EndMacro
Macro CZ(p1,p2)
;exp(p1/k)*(k+b*Sin(p2))
exp(p1/k)*(1+b*Sin(p2)) 
EndMacro

Macro SOUSTRACTION_VECTEUR(V, V1, V2)
   V\x = V1\x - V2\x
     V\y = V1\y - V2\y
     V\z = V1\z - V2\z
EndMacro


Macro vcross(N, x1, y1, z1, x2, y2, z2)
   N\x = (((y1) * (z2)) - ((z1) * (y2)))
   N\y = (((z1) * (x2)) - ((x1) * (z2)))
   N\z = (((x1) * (y2)) - ((y1) * (x2)))
EndMacro
Procedure CreateMeshCoquillage()
;http://aesculier.chez-alice.fr/fichiersPovray/coquillages/coquillages.html

;A arranger , j'ai juste recopié pour tester.


; equation - Coquillage

;x=exp(p1/k)*Cos(p1)*(1+b*Cos(p2))
;y=exp(p1/k)*Sin(p1)*(1+b*Cos(p2))
;z=exp(p1/k)*(1+b*Sin(p2))
;Peut s'appliquer à toute surface paramétrique en mettant les
;bonnes formules dans CX, CY, CZ
 
   ;Coq 1
  ; k       = 25       ;  coq1 : 25    ; coq2 : 10;
  ; b.f     = 5        ;  coq1 : 5     ; coq2 : 0.49268
  ; umin.f  = -90      ;  coq1 : -90   ; coq2 : -34           
  ; umax.f  = -26.7    ;  coq1 : -26.7 ; coq2 : 4       
  ; NbSommet = 23000   ; A recalculer avec plus de précision !
  ; NbTriangle = 11600 * 2; Idem
   ; Coq 2
   k       = 10       ;  coq1 : 25    ; coq2 : 10;
   b.f     = 0.49268  ;  coq1 : 5     ; coq2 : 0.49268
   umin.f  = -34      ;  coq1 : -90   ; coq2 : -34           
   umax.f  = -4       ;  coq1 : -26.7 ; coq2 : 4
   NbSommet = 25000   ; A recalculer avec plus de précision !
   NbTriangle = 12500 * 2 ; Idem
      
     
   vmin.f  = 0        ;
   vmax.f  =  6.3     ;
   uiter.f = 140      ;  nombre de pas en u
   viter.f = 40       ;  nombre de pas en v


   iu.f    = (umax-umin)/uiter ;   //increment par pas
   iv.f    = (vmax-vmin)/viter ;

   Define.f uu, vv
   
   Define.f x1, y1, z1
   Define.f x2, y2, z2
   Define.f x3, y3, z3
   Define.f x4, y4, z4
   
   Define.f nx1, ny1, nz1
   Define.f nx2, ny2, nz2
   Define.f nx3, ny3, nz3
   Define.f nx4, ny4, nz4

   Define.s_Vecteur n1, n2, n3, n4, n5, n6, n7, n8, n9   
   Define.s_Vecteur vn1, vn2, vn3, vn4
   

   
   *VBuffer = AllocateMemory(SizeOf(Vertex) * NbSommet)
   *IBuffer = AllocateMemory(SizeOf(FTriangle) * NbTriangle)
   *PtrV.Vertex = *Vbuffer
   *PtrF.FTriangle = *IBuffer
   uu = umin   
   p = 0
   ;Coul = Random($00FFFF) + $FF0000
   Coul = $12143F   
   
   While (uu<=umax)                     
      vv = vmin
      While (vv<=vmax)                     
         ;POINTS     
         x1=CX(uu,vv)
         y1=CY(uu,vv)
         z1=CZ(uu,vv)
         uu=uu+iu   
         x2=CX(uu,vv)
         y2=CY(uu,vv)
         z2=CZ(uu,vv)           
         vv=vv+iv
         x3=CX(uu,vv)
         y3=CY(uu,vv)
         z3=CZ(uu,vv)
         uu=uu-iu
         x4=CX(uu,vv)
         y4=CY(uu,vv)
         z4=CZ(uu,vv)
         vv=vv-iv
         ;NORMALS                 
         uu=uu+2*iu
         nx1=CX(uu,vv)
         ny1=CY(uu,vv)
         nz1=CZ(uu,vv)
         uu=uu-2*iu
         vv=vv+2*iv
         nx2=CX(uu,vv)
         ny2=CY(uu,vv)
         nz2=CZ(uu,vv)
         vv=vv-2*iv
         uu=uu-iu
         nx3=CX(uu,vv)
         ny3=CY(uu,vv)
         nz3=CZ(uu,vv)
         uu=uu+iu
         vv=vv-iv
         nx4=CX(uu,vv)
         ny4=CY(uu,vv)
         nz4=CZ(uu,vv)
         vv=vv+iv
         vcross(n1, nx2-x4, ny2-y4, nz2-z4, nx1-x2, ny1-y2, nz1-z2)
         vcross(n2,  x4-x3,  y4-y3,  z4-z3, nx2-x4, ny2-y4, nz2-z4)
         vcross(n3, nx3-x1, ny3-y1, nz3-z1, nx2-x4, ny2-y4, nz2-z4)
         vcross(n4,  x3-x2,  y3-y2,  z3-z2, nx1-x2, ny1-y2, nz1-z2)
         vcross(n5,  x1-x2,  y1-y2,  z1-z2,  x3-x2,  y3-y2,  z3-z2)
         vcross(n6, nx3-x1, ny3-y1, nz3-z1,  x4-x1,  y4-y1,  z4-z1)
         vcross(n7, nx1-x2, ny1-y2, nz1-z2, nx4-x1, ny4-y1, nz4-z1)
         vcross(n8, nx4-x1, ny4-y1, nz4-z1,  x1-x2,  y1-y2,  z1-z2)
         vcross(n9, nx4-x1, ny4-y1, nz4-z1, nx3-x1, ny3-y1, nz3-z1) 
         
         
         vn1\x = n5\x+n6\x+n8\x+n9\x   
         vn1\y = n5\y+n6\y+n8\y+n9\y
         vn1\z = n5\z+n6\z+n8\z+n9\z
         
         vn2\x = n4\x+n5\x+n7\x+n8\x   
         vn2\y = n4\y+n5\y+n7\y+n8\y
         vn2\z = n4\z+n5\z+n7\z+n8\z
           
         vn3\x = n1\x+n2\x+n4\x+n5\x   
         vn3\y = n1\y+n2\y+n4\y+n5\y
         vn3\z = n1\z+n2\z+n4\z+n5\z
         
         vn4\x = n2\x+n3\x+n5\x+n6\x   
         vn4\y = n2\y+n3\y+n5\y+n6\y
         vn4\z = n2\z+n3\z+n5\z+n6\z
         
         
         *PtrV\px = x1
         *PtrV\py = y1
         *PtrV\pz = z1
         *PtrV\nx = vn1\x
         *PtrV\ny = vn1\y
         *PtrV\nz = vn1\z
         *PtrV\co = Coul
         *PtrV\u = 0
         *PtrV\v = 0
         *PtrV + SizeOf(Vertex)
         
           
         *PtrV\px = x2
         *PtrV\py = y2
         *PtrV\pz = z2
         *PtrV\nx = vn2\x
         *PtrV\ny = vn2\y
         *PtrV\nz = vn2\z
         *PtrV\co = Coul
         *PtrV\u = 1
         *PtrV\v = 0
         *PtrV + SizeOf(Vertex)
 
         
         *PtrV\px = x3
         *PtrV\py = y3
         *PtrV\pz = z3
         *PtrV\nx = vn3\x
         *PtrV\ny = vn3\y
         *PtrV\nz = vn3\z
         *PtrV\co = Coul
         *PtrV\u = 1
         *PtrV\v = 1
         *PtrV + SizeOf(Vertex)
 
                   
         *PtrV\px = x4
         *PtrV\py = y4
         *PtrV\pz = z4
         *PtrV\nx = vn4\x
         *PtrV\ny = vn4\y
         *PtrV\nz = vn4\z
         *PtrV\co = Coul
         *PtrV\u = 0
         *PtrV\v = 1
         *PtrV + SizeOf(Vertex)   
        
         ;TRIANGLES     
         *PtrF\f1 = p          ; p1
         *PtrF\f2 = p + 1      ; p2
         *PtrF\f3 = p + 2      ; p3
         *PtrF + SizeOf(FTriangle)
         *PtrF\f1 = p          ; p1
         *PtrF\f2 = p + 2      ; p3
         *PtrF\f3 = p + 3      ; p4
         *PtrF + SizeOf(FTriangle)

         *PtrF\f3 = p          ; p1
         *PtrF\f2 = p + 1      ; p2
         *PtrF\f1 = p + 2      ; p3
         *PtrF + SizeOf(FTriangle)
         *PtrF\f3 = p          ; p1
         *PtrF\f2 = p + 2      ; p3
         *PtrF\f1 = p + 3      ; p4
         *PtrF + SizeOf(FTriangle)
         
         p + 4

         vv = vv+iv
      Wend                 
      uu = uu+iu
   Wend   
   
     
   If CreateMesh(0,100)
      Flag = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color
      SetMeshData(0,Flag         ,*VBuffer,NbSommet)
      SetMeshData(0,#PB_Mesh_Face,*IBuffer,NbTriangle)
      ProcedureReturn 1
   Else
      ProcedureReturn 0   
   EndIf
   
EndProcedure   


;-Mesh
;CreateMeshCone(meridien,2,2,0)
CreateMeshCoquillage()

;-Texture
CreateTexture(0,128, 128)
StartDrawing(TextureOutput(0))
  Box(0, 0, 128, 128, $FFFFFF)
StopDrawing()

;-Material
CreateMaterial(0,TextureID(0))
MaterialAmbientColor(0,-1)

;-Entity
CreateEntity(0,MeshID(0),MaterialID(0))
ScaleEntity(0,120,120,120)

;-Camera
CreateCamera(0, 0, 0 , 100 , 100)
MoveCamera(0,0,0,-400)
CameraLookAt(0,EntityX(0),EntityY(0),EntityZ(0))


;-Light
AmbientColor(RGB(205,205,205))
CreateLight(0,RGB(155,155,55),EntityX(0)+150,EntityY(0),EntityZ(0))
;CreateLight(1,RGB(55,255,255),EntityX(0)-150,EntityY(0),EntityZ(0))
;CreateLight(2,RGB(255,55,255),EntityX(0),EntityY(0)+150,EntityZ(0))
;CreateLight(3,RGB(255,255,55),EntityX(0),EntityY(0)-150,EntityZ(0))
pas = 0.8
Repeat
   ;ClearScreen(0)
   If fullscreen = 0
      While WindowEvent() : Wend
   EndIf
   Angle + Pas
   RotateEntity(0,angle,angle/2,-Angle)

   If ExamineKeyboard()
     If KeyboardReleased(#PB_Key_F1)
       CameraMode=1-CameraMode
       CameraRenderMode(0,CameraMode)
     EndIf
   EndIf
  RenderWorld()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

Posted: Tue May 02, 2006 8:16 pm
by rsts
seems to require some dll.

cheers

Posted: Tue May 02, 2006 8:24 pm
by Comtois
Only stlport_vc646.dll and Engine3D.dll.

Posted: Tue May 02, 2006 9:27 pm
by Fred
Excellent !

Astroide 3D

Posted: Tue May 02, 2006 10:32 pm
by Comtois
astroide 3D

just changed this

Code: Select all

Macro CX(u,v)
 2 * Cos(u) * Cos(u) * Cos(u) * Cos(v) * Cos(v) * Cos(v) 
EndMacro
Macro   CY(u,v)
2 * Sin(u) * Sin(u) * Sin(u) * Cos(v) * Cos(v) * Cos(v)
EndMacro
Macro CZ(u,v)
2 * Sin(v) * Sin(v) * Sin(v) 
EndMacro

Code: Select all

;Comtois 04/05/06
;PB4.0 Beta 11

;Site intéressant pour choisir une couleur
;http://pourpre.com/chroma/dico.php?typ=alpha

;Pour obtenir d'autres formes
;http://www.mathcurve.com/surfaces/surfaces.shtml

Texte$ = "Astroide 3D"

Resultat = MessageRequester(Texte$,"Full Screen ?",#PB_MessageRequester_YesNo)
If Resultat = 6     
  FullScreen=1
Else           
  FullScreen=0
EndIf

;- Initialisation
If InitEngine3D() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
   End
EndIf
   
If InitSprite() = 0 Or InitKeyboard() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
EndIf


If Fullscreen
   ExamineDesktops()
   Sx = DesktopWidth(0)
   Sy = DesktopHeight(0)
   Sd = DesktopDepth(0)
  OpenScreen(Sx, Sy,Sd, Texte$)
Else
  OpenWindow(0,0, 0, 800 , 600 ,Texte$,#PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0),0,0, 800 , 600,0,0,0)
EndIf

#E = 2.71828182

Global Angle.f,Pas.f, CameraMode.l
Global *VBuffer,*IBuffer
Global meridien.l

Structure s_Vecteur
   x.f
   y.f
   z.f
EndStructure

Structure Vertex
   px.f
   py.f
   pz.f
   nx.f
   ny.f
   nz.f
   co.l
   U.f
   V.f
EndStructure

Structure FTriangle
   f1.w
   f2.w
   f3.w
EndStructure

Macro CX(u,v)
 2 * Cos(u) * Cos(u) * Cos(u) * Cos(v) * Cos(v) * Cos(v)
EndMacro
Macro   CY(u,v)
2 * Sin(u) * Sin(u) * Sin(u) * Cos(v) * Cos(v) * Cos(v)
EndMacro
Macro CZ(u,v)
2 * Sin(v) * Sin(v) * Sin(v)
EndMacro

Macro vcross(N, x1, y1, z1, x2, y2, z2)
   N\x = (((y1) * (z2)) - ((z1) * (y2)))
   N\y = (((z1) * (x2)) - ((x1) * (z2)))
   N\z = (((x1) * (y2)) - ((y1) * (x2)))
EndMacro

Procedure CreateMeshAstroide()
   Define.l k, p, NbSommet, NbTriangle
   Define.f b, umin, umax, vmin, vmax, uiter, viter, uu, vv
   Define.f x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4
   Define.f nx1, ny1, nz1, nx2, ny2, nz2, nx3, ny3, nz3, nx4, ny4, nz4
   Define.s_Vecteur n1, n2, n3, n4, n5, n6, n7, n8, n9   
   Define.s_Vecteur vn1, vn2, vn3, vn4
   
   k       = 10       
   b.f     = 0.49268 
   umin.f  = -#PI                
   umax.f  = #PI      
   vmin.f  = -#PI     
   vmax.f  =  #PI     
   uiter.f = 150               ;  nombre de pas en u
   viter.f = 40                ;  nombre de pas en v
   iu.f    = (umax-umin)/uiter ;   increment par pas
   iv.f    = (vmax-vmin)/viter ;

   NbSommet   = 24000   
   NbTriangle = 12000 
   *VBuffer = AllocateMemory(SizeOf(Vertex)    * NbSommet)
   *IBuffer = AllocateMemory(SizeOf(FTriangle) * NbTriangle)
   *PtrV.Vertex    = *Vbuffer
   *PtrF.FTriangle = *IBuffer
   uu = umin   
   p = 0
   ;Coul = Random($00FFFF) + $FF0000
   ;Coul = $12143F   
   ;Coul = $DB1702
   Coul = $318CE7
   While (uu<=umax)                     
      vv = vmin
      While (vv<=vmax)                     
         ;POINTS     
         x1=CX(uu,vv)
         y1=CY(uu,vv)
         z1=CZ(uu,vv)
         uu=uu+iu   
         x2=CX(uu,vv)
         y2=CY(uu,vv)
         z2=CZ(uu,vv)           
         vv=vv+iv
         x3=CX(uu,vv)
         y3=CY(uu,vv)
         z3=CZ(uu,vv)
         uu=uu-iu
         x4=CX(uu,vv)
         y4=CY(uu,vv)
         z4=CZ(uu,vv)
         vv=vv-iv
         ;NORMALS                 
         uu=uu+2*iu
         nx1=CX(uu,vv)
         ny1=CY(uu,vv)
         nz1=CZ(uu,vv)
         uu=uu-2*iu
         vv=vv+2*iv
         nx2=CX(uu,vv)
         ny2=CY(uu,vv)
         nz2=CZ(uu,vv)
         vv=vv-2*iv
         uu=uu-iu
         nx3=CX(uu,vv)
         ny3=CY(uu,vv)
         nz3=CZ(uu,vv)
         uu=uu+iu
         vv=vv-iv
         nx4=CX(uu,vv)
         ny4=CY(uu,vv)
         nz4=CZ(uu,vv)
         vv=vv+iv
         vcross(n1, nx2-x4, ny2-y4, nz2-z4, nx1-x2, ny1-y2, nz1-z2)
         vcross(n2,  x4-x3,  y4-y3,  z4-z3, nx2-x4, ny2-y4, nz2-z4)
         vcross(n3, nx3-x1, ny3-y1, nz3-z1, nx2-x4, ny2-y4, nz2-z4)
         vcross(n4,  x3-x2,  y3-y2,  z3-z2, nx1-x2, ny1-y2, nz1-z2)
         vcross(n5,  x1-x2,  y1-y2,  z1-z2,  x3-x2,  y3-y2,  z3-z2)
         vcross(n6, nx3-x1, ny3-y1, nz3-z1,  x4-x1,  y4-y1,  z4-z1)
         vcross(n7, nx1-x2, ny1-y2, nz1-z2, nx4-x1, ny4-y1, nz4-z1)
         vcross(n8, nx4-x1, ny4-y1, nz4-z1,  x1-x2,  y1-y2,  z1-z2)
         vcross(n9, nx4-x1, ny4-y1, nz4-z1, nx3-x1, ny3-y1, nz3-z1)
         
         
         vn1\x = n5\x+n6\x+n8\x+n9\x   
         vn1\y = n5\y+n6\y+n8\y+n9\y
         vn1\z = n5\z+n6\z+n8\z+n9\z
         
         vn2\x = n4\x+n5\x+n7\x+n8\x   
         vn2\y = n4\y+n5\y+n7\y+n8\y
         vn2\z = n4\z+n5\z+n7\z+n8\z
           
         vn3\x = n1\x+n2\x+n4\x+n5\x   
         vn3\y = n1\y+n2\y+n4\y+n5\y
         vn3\z = n1\z+n2\z+n4\z+n5\z
         
         vn4\x = n2\x+n3\x+n5\x+n6\x   
         vn4\y = n2\y+n3\y+n5\y+n6\y
         vn4\z = n2\z+n3\z+n5\z+n6\z
 
         *PtrV\px = x1
         *PtrV\py = y1
         *PtrV\pz = z1
         *PtrV\nx = vn1\x
         *PtrV\ny = vn1\y
         *PtrV\nz = vn1\z
         *PtrV\co = Coul
         *PtrV\u = 0
         *PtrV\v = 0
         *PtrV + SizeOf(Vertex)
  
         *PtrV\px = x2
         *PtrV\py = y2
         *PtrV\pz = z2
         *PtrV\nx = vn2\x
         *PtrV\ny = vn2\y
         *PtrV\nz = vn2\z
         *PtrV\co = Coul
         *PtrV\u = 1
         *PtrV\v = 0
         *PtrV + SizeOf(Vertex)
         
         *PtrV\px = x3
         *PtrV\py = y3
         *PtrV\pz = z3
         *PtrV\nx = vn3\x
         *PtrV\ny = vn3\y
         *PtrV\nz = vn3\z
         *PtrV\co = Coul
         *PtrV\u = 1
         *PtrV\v = 1
         *PtrV + SizeOf(Vertex)
                   
         *PtrV\px = x4
         *PtrV\py = y4
         *PtrV\pz = z4
         *PtrV\nx = vn4\x
         *PtrV\ny = vn4\y
         *PtrV\nz = vn4\z
         *PtrV\co = Coul
         *PtrV\u = 0
         *PtrV\v = 1
         *PtrV + SizeOf(Vertex)   
       
         ;TRIANGLES     
         *PtrF\f1 = p          ; p1
         *PtrF\f2 = p + 1      ; p2
         *PtrF\f3 = p + 2      ; p3
         *PtrF + SizeOf(FTriangle)
         *PtrF\f1 = p          ; p1
         *PtrF\f2 = p + 2      ; p3
         *PtrF\f3 = p + 3      ; p4
         *PtrF + SizeOf(FTriangle)
         
          p + 4

         vv = vv+iv
      Wend                 
      uu = uu+iu
   Wend   
   
     
   If CreateMesh(0,100)
      Flag = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color
      SetMeshData(0,Flag         ,*VBuffer,NbSommet)
      SetMeshData(0,#PB_Mesh_Face,*IBuffer,NbTriangle)
      ProcedureReturn 1
   Else
      ProcedureReturn 0   
   EndIf
   
EndProcedure   


;-Mesh

CreateMeshAstroide()

;-Texture
CreateTexture(0,128, 128)
StartDrawing(TextureOutput(0))
  Box(0, 0, 128, 128, $FFFFFF)
StopDrawing()

;-Material
CreateMaterial(0,TextureID(0))
MaterialAmbientColor(0,-1)

;-Entity
CreateEntity(0,MeshID(0),MaterialID(0))
ScaleEntity(0,80,80,80)

;-Camera
CreateCamera(0, 0, 0 , 100 , 100)
MoveCamera(0,0,0,-400)
CameraLookAt(0,EntityX(0),EntityY(0),EntityZ(0))


;-Light
AmbientColor(RGB(75,75,75))
CreateLight(0,RGB(155,155,155),EntityX(0)+150,EntityY(0),EntityZ(0))

pas = 0.8
Repeat
   If fullscreen = 0
      While WindowEvent() : Wend
   EndIf
   Angle + Pas
   RotateEntity(0,angle,angle/2,-Angle)

   If ExamineKeyboard()
     If KeyboardReleased(#PB_Key_F1)
       CameraMode=1-CameraMode
       CameraRenderMode(0,CameraMode)
     EndIf
   EndIf
  RenderWorld()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

Shell 3D

Posted: Sat May 06, 2006 4:04 pm
by Hkb
Nice, but if i have the camera moved more then -50 (z), the shell disapear.

Posted: Sat May 06, 2006 4:11 pm
by Dare2
Magic!

Posted: Sun May 07, 2006 6:58 am
by mskuma
Wonderful! I liked the 2nd shell the best - nice lighting effect.

Re: Shell 3D

Posted: Sun May 15, 2011 11:08 am
by Comtois
updated for 4.60

Code: Select all

InitEngine3D()
InitSprite()
InitKeyboard() 
ExamineDesktops()
OpenScreen(DesktopWidth(0), DesktopHeight(0), DesktopDepth(0), "char")

Global Angle.f, Pas.f=1.0

Structure s_Vecteur
  x.f
  y.f
  z.f
EndStructure

Macro CX(p1,p2)
  Exp(p1/k)*Cos(p1)*(1+b*Cos(p2))
EndMacro 
Macro   CY(p1,p2)
  Exp(p1/k)*Sin(p1)*(1+b*Cos(p2))
EndMacro
Macro CZ(p1,p2)
  ;Exp(p1/k)*(k+b*Sin(p2))
  Exp(p1/k)*(1+b*Sin(p2)) 
EndMacro

Macro SOUSTRACTION_VECTEUR(V, V1, V2)
  V\x = V1\x - V2\x
  V\y = V1\y - V2\y
  V\z = V1\z - V2\z
EndMacro

Macro vcross(N, x1, y1, z1, x2, y2, z2)
  N\x = (((y1) * (z2)) - ((z1) * (y2)))
  N\y = (((z1) * (x2)) - ((x1) * (z2)))
  N\z = (((x1) * (y2)) - ((y1) * (x2)))
EndMacro

Procedure CreateMeshCoquillage()
  k       = 10       ;  coq1 : 25    ; coq2 : 10;
  b.f     = 0.49268  ;  coq1 : 5     ; coq2 : 0.49268
  umin.f  = -34      ;  coq1 : -90   ; coq2 : -34           
  umax.f  = -4       ;  coq1 : -26.7 ; coq2 : 4
  NbSommet = 25000   ; A recalculer avec plus de précision !
  NbTriangle = 12500 ; Idem
    
  ;Commun aux deux       
  vmin.f  = 0        ;
  vmax.f  =  6.3     ;
  uiter.f = 150      ;  nombre de pas en u
  viter.f = 40       ;  nombre de pas en v
    
  iu.f    = (umax-umin)/uiter ;   //increment par pas
  iv.f    = (vmax-vmin)/viter ;
  
  Define.f uu, vv
  
  Define.f x1, y1, z1
  Define.f x2, y2, z2
  Define.f x3, y3, z3
  Define.f x4, y4, z4
  
  Define.f nx1, ny1, nz1
  Define.f nx2, ny2, nz2
  Define.f nx3, ny3, nz3
  Define.f nx4, ny4, nz4
  
  Define.s_Vecteur n1, n2, n3, n4, n5, n6, n7, n8, n9   
  Define.s_Vecteur vn1, vn2, vn3, vn4
  
  CreateMesh(0)
  
  uu = umin   
  p = 0
  Coul = Random($00FFFF) + $FF0000
  While (uu<=umax)                     
    vv = vmin
    While (vv<=vmax)                     
      ;POINTS     
      x1=CX(uu,vv)
      y1=CY(uu,vv)
      z1=CZ(uu,vv)
      uu=uu+iu   
      x2=CX(uu,vv)
      y2=CY(uu,vv)
      z2=CZ(uu,vv)           
      vv=vv+iv
      x3=CX(uu,vv)
      y3=CY(uu,vv)
      z3=CZ(uu,vv)
      uu=uu-iu
      x4=CX(uu,vv)
      y4=CY(uu,vv)
      z4=CZ(uu,vv)
      vv=vv-iv
      ;NORMALS                 
      uu=uu+2*iu
      nx1=CX(uu,vv)
      ny1=CY(uu,vv)
      nz1=CZ(uu,vv)
      uu=uu-2*iu
      vv=vv+2*iv
      nx2=CX(uu,vv)
      ny2=CY(uu,vv)
      nz2=CZ(uu,vv)
      vv=vv-2*iv
      uu=uu-iu
      nx3=CX(uu,vv)
      ny3=CY(uu,vv)
      nz3=CZ(uu,vv)
      uu=uu+iu
      vv=vv-iv
      nx4=CX(uu,vv)
      ny4=CY(uu,vv)
      nz4=CZ(uu,vv)
      vv=vv+iv
      vcross(n1, nx2-x4, ny2-y4, nz2-z4, nx1-x2, ny1-y2, nz1-z2)
      vcross(n2,  x4-x3,  y4-y3,  z4-z3, nx2-x4, ny2-y4, nz2-z4)
      vcross(n3, nx3-x1, ny3-y1, nz3-z1, nx2-x4, ny2-y4, nz2-z4)
      vcross(n4,  x3-x2,  y3-y2,  z3-z2, nx1-x2, ny1-y2, nz1-z2)
      vcross(n5,  x1-x2,  y1-y2,  z1-z2,  x3-x2,  y3-y2,  z3-z2)
      vcross(n6, nx3-x1, ny3-y1, nz3-z1,  x4-x1,  y4-y1,  z4-z1)
      vcross(n7, nx1-x2, ny1-y2, nz1-z2, nx4-x1, ny4-y1, nz4-z1)
      vcross(n8, nx4-x1, ny4-y1, nz4-z1,  x1-x2,  y1-y2,  z1-z2)
      vcross(n9, nx4-x1, ny4-y1, nz4-z1, nx3-x1, ny3-y1, nz3-z1) 
      
      
      vn1\x = n5\x+n6\x+n8\x+n9\x   
      vn1\y = n5\y+n6\y+n8\y+n9\y
      vn1\z = n5\z+n6\z+n8\z+n9\z
      
      vn2\x = n4\x+n5\x+n7\x+n8\x   
      vn2\y = n4\y+n5\y+n7\y+n8\y
      vn2\z = n4\z+n5\z+n7\z+n8\z
      
      vn3\x = n1\x+n2\x+n4\x+n5\x   
      vn3\y = n1\y+n2\y+n4\y+n5\y
      vn3\z = n1\z+n2\z+n4\z+n5\z
      
      vn4\x = n2\x+n3\x+n5\x+n6\x   
      vn4\y = n2\y+n3\y+n5\y+n6\y
      vn4\z = n2\z+n3\z+n5\z+n6\z
      
      AddMeshVertex(x1,y1,z1)
      MeshVertexNormal(vn1\x, vn1\y, vn1\z)
      MeshVertexColor(Coul)
      AddMeshVertex(x2,y2,z2)
      MeshVertexNormal(vn2\x, vn2\y, vn2\z)
      MeshVertexColor(Coul)
      AddMeshVertex(x3,y3,z3)
      MeshVertexNormal(vn3\x, vn3\y, vn3\z)
      MeshVertexColor(Coul)
      AddMeshVertex(x4,y4,z4)
      MeshVertexNormal(vn4\x, vn4\y, vn4\z)  
      MeshVertexColor(Coul)
      ;TRIANGLES     
      AddMeshFace(p, p+2,p+3)
      AddMeshFace(p, p+1,p+2)
      AddMeshFace(p, p+2,p+3)
      
      AddMeshFace(p+3, p+2,p)
      AddMeshFace(p+2, p+1,p)
      AddMeshFace(p+3, p+2,p)
      p + 4
      
      vv = vv+iv
    Wend                 
    uu = uu+iu
  Wend   
  FinishMesh()   
EndProcedure   

;-Mesh
CreateMeshCoquillage()

;-Texture
Add3DArchive(".",#PB_3DArchive_FileSystem)
CreateImage(0,128, 128)
StartDrawing(ImageOutput(0))
Box(0, 0, 128, 128, $FFFFFF)
StopDrawing()
SaveImage(0,"temp.bmp")
FreeImage(0)
LoadTexture(0,"temp.bmp")
DeleteFile("temp.bmp")
;-Material
CreateMaterial(0, TextureID(0))
MaterialAmbientColor(0,#PB_Material_AmbientColors)

;-Entity
CreateEntity(0,MeshID(0),MaterialID(0))
ScaleEntity(0,150,150,150)

;-Camera
CreateCamera(0, 0, 0 , 100 , 100)
MoveCamera(0,0,0,-500)
CameraLookAt(0,EntityX(0),EntityY(0),EntityZ(0))

;-Light
AmbientColor(RGB(80,80,80))
CreateLight(0,RGB(255,255,255),EntityX(0)+150,EntityY(0),EntityZ(0))

Repeat
  Angle + Pas
  RotateEntity(0,angle,angle/2,-Angle/2)
  
  ExamineKeyboard()
  RenderWorld()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) 
Asteroide 4.60

Code: Select all

InitEngine3D()
InitSprite()
InitKeyboard()
ExamineDesktops()
OpenScreen(DesktopWidth(0), DesktopHeight(0), DesktopDepth(0), "char")

Global Angle.f, Pas.f=1.0

Structure s_Vecteur
  x.f
  y.f
  z.f
EndStructure

Macro CX(u,v)
  2 * Cos(u) * Cos(u) * Cos(u) * Cos(v) * Cos(v) * Cos(v)
EndMacro
Macro   CY(u,v)
  2 * Sin(u) * Sin(u) * Sin(u) * Cos(v) * Cos(v) * Cos(v)
EndMacro
Macro CZ(u,v)
  2 * Sin(v) * Sin(v) * Sin(v)
EndMacro

Macro vcross(N, x1, y1, z1, x2, y2, z2)
  N\x = (((y1) * (z2)) - ((z1) * (y2)))
  N\y = (((z1) * (x2)) - ((x1) * (z2)))
  N\z = (((x1) * (y2)) - ((y1) * (x2)))
EndMacro

Procedure CreateMeshCoquillage()
  k       = 10       
  b.f     = 0.49268
  umin.f  = -#PI               
  umax.f  = #PI     
  vmin.f  = -#PI     
  vmax.f  =  #PI     
  uiter.f = 250               ;  nombre de pas en u
  viter.f = 140                ;  nombre de pas en v
  iu.f    = (umax-umin)/uiter ;   increment par pas
  iv.f    = (vmax-vmin)/viter ;
  
  Define.f uu, vv
  
  Define.f x1, y1, z1
  Define.f x2, y2, z2
  Define.f x3, y3, z3
  Define.f x4, y4, z4
  
  Define.f nx1, ny1, nz1
  Define.f nx2, ny2, nz2
  Define.f nx3, ny3, nz3
  Define.f nx4, ny4, nz4
  
  Define.s_Vecteur n1, n2, n3, n4, n5, n6, n7, n8, n9   
  Define.s_Vecteur vn1, vn2, vn3, vn4
  
  CreateMesh(0)
  
  uu = umin   
  p = 0
  Coul = Random($00FFFF) + $FF0000
  While (uu<=umax)                     
    vv = vmin
    While (vv<=vmax)                     
      ;POINTS     
      x1=CX(uu,vv)
      y1=CY(uu,vv)
      z1=CZ(uu,vv)
      uu=uu+iu   
      x2=CX(uu,vv)
      y2=CY(uu,vv)
      z2=CZ(uu,vv)           
      vv=vv+iv
      x3=CX(uu,vv)
      y3=CY(uu,vv)
      z3=CZ(uu,vv)
      uu=uu-iu
      x4=CX(uu,vv)
      y4=CY(uu,vv)
      z4=CZ(uu,vv)
      vv=vv-iv
      ;NORMALS                 
      uu=uu+2*iu
      nx1=CX(uu,vv)
      ny1=CY(uu,vv)
      nz1=CZ(uu,vv)
      uu=uu-2*iu
      vv=vv+2*iv
      nx2=CX(uu,vv)
      ny2=CY(uu,vv)
      nz2=CZ(uu,vv)
      vv=vv-2*iv
      uu=uu-iu
      nx3=CX(uu,vv)
      ny3=CY(uu,vv)
      nz3=CZ(uu,vv)
      uu=uu+iu
      vv=vv-iv
      nx4=CX(uu,vv)
      ny4=CY(uu,vv)
      nz4=CZ(uu,vv)
      vv=vv+iv
      vcross(n1, nx2-x4, ny2-y4, nz2-z4, nx1-x2, ny1-y2, nz1-z2)
      vcross(n2,  x4-x3,  y4-y3,  z4-z3, nx2-x4, ny2-y4, nz2-z4)
      vcross(n3, nx3-x1, ny3-y1, nz3-z1, nx2-x4, ny2-y4, nz2-z4)
      vcross(n4,  x3-x2,  y3-y2,  z3-z2, nx1-x2, ny1-y2, nz1-z2)
      vcross(n5,  x1-x2,  y1-y2,  z1-z2,  x3-x2,  y3-y2,  z3-z2)
      vcross(n6, nx3-x1, ny3-y1, nz3-z1,  x4-x1,  y4-y1,  z4-z1)
      vcross(n7, nx1-x2, ny1-y2, nz1-z2, nx4-x1, ny4-y1, nz4-z1)
      vcross(n8, nx4-x1, ny4-y1, nz4-z1,  x1-x2,  y1-y2,  z1-z2)
      vcross(n9, nx4-x1, ny4-y1, nz4-z1, nx3-x1, ny3-y1, nz3-z1)
      
      
      vn1\x = n5\x+n6\x+n8\x+n9\x   
      vn1\y = n5\y+n6\y+n8\y+n9\y
      vn1\z = n5\z+n6\z+n8\z+n9\z
      
      vn2\x = n4\x+n5\x+n7\x+n8\x   
      vn2\y = n4\y+n5\y+n7\y+n8\y
      vn2\z = n4\z+n5\z+n7\z+n8\z
      
      vn3\x = n1\x+n2\x+n4\x+n5\x   
      vn3\y = n1\y+n2\y+n4\y+n5\y
      vn3\z = n1\z+n2\z+n4\z+n5\z
      
      vn4\x = n2\x+n3\x+n5\x+n6\x   
      vn4\y = n2\y+n3\y+n5\y+n6\y
      vn4\z = n2\z+n3\z+n5\z+n6\z
      
      AddMeshVertex(x1,y1,z1)
      MeshVertexNormal(vn1\x, vn1\y, vn1\z)
      MeshVertexColor(Coul)
      AddMeshVertex(x2,y2,z2)
      MeshVertexNormal(vn2\x, vn2\y, vn2\z)
      MeshVertexColor(Coul)
      AddMeshVertex(x3,y3,z3)
      MeshVertexNormal(vn3\x, vn3\y, vn3\z)
      MeshVertexColor(Coul)
      AddMeshVertex(x4,y4,z4)
      MeshVertexNormal(vn4\x, vn4\y, vn4\z) 
      MeshVertexColor(Coul)
      ;TRIANGLES     
      AddMeshFace(p, p+2,p+3)
      AddMeshFace(p, p+1,p+2)
      AddMeshFace(p, p+2,p+3)
            
      p + 4
      
      vv = vv+iv
    Wend                 
    uu = uu+iu
  Wend   
  FinishMesh()   
EndProcedure   

;-Mesh
CreateMeshCoquillage()

;-Texture
Add3DArchive(".",#PB_3DArchive_FileSystem)
CreateImage(0,128, 128)
StartDrawing(ImageOutput(0))
Box(0, 0, 128, 128, $FFFFFF)
StopDrawing()
SaveImage(0,"temp.bmp")
FreeImage(0)
LoadTexture(0,"temp.bmp")
DeleteFile("temp.bmp")
;-Material
CreateMaterial(0, TextureID(0))
MaterialAmbientColor(0,#PB_Material_AmbientColors)

;-Entity
CreateEntity(0,MeshID(0),MaterialID(0))
ScaleEntity(0,100,100,100)

;-Camera
CreateCamera(0, 0, 0 , 100 , 100)
MoveCamera(0,0,0,-500)
CameraLookAt(0,EntityX(0),EntityY(0),EntityZ(0))

;-Light
AmbientColor(RGB(80,80,80))
CreateLight(0,RGB(255,255,255),EntityX(0)+150,EntityY(0),EntityZ(0))

Repeat
  Angle + Pas
  RotateEntity(0,-angle/4,angle/4,-Angle/2)
  
  ExamineKeyboard()
  RenderWorld()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)