Cone 3D

Share your advanced PureBasic knowledge/code with the community.
User avatar
Comtois
Addict
Addict
Posts: 1431
Joined: Tue Aug 19, 2003 11:36 am
Location: Doubs - France

Cone 3D

Post by Comtois »

If you want a cone without troncature
;CreateMeshCone(meridien,2,2,0)

Code: Select all

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


Resultat = MessageRequester("Cone 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
ElseIf InitSprite() = 0 Or InitKeyboard() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
EndIf

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

Macro MaCouleur(Rouge,Vert,Bleu)
  Rouge << 16 + Vert << 8 + Bleu
EndMacro


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

meridien=90

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

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

Procedure CreateMeshCone(m, rb.f, h.f, rt.f)
   ;m = méridien
   ;h = hauteur
   ;rb = Rayon de la base
   ;rt = rayon troncature (haut du cône)
   
   ;Les normales sont calculées pour un cône :
   ;rb = 2
   ;h  = 2   
   ;rt = 1

   ;Pour un cône plus général , il faut éventuellement utiliser la pondération par les angles
   
   If m<3 Or h < 0 Or rb < 0 Or rt < 0
      ProcedureReturn 0
   EndIf


   NbSommet = 4*(m+1)+2
   *VBuffer = AllocateMemory(SizeOf(Vertex)*Nbsommet)
   *PtrV.Vertex = *VBuffer
   
   ;Sommet en bas du cone
   Coul = $FF ; Pas utilisé dans cette démo
   For i = 0 To m
      theta.f =2*#PI*i/m
       
      *PtrV\px = rb * Cos(theta)
      *PtrV\py = 0
      *PtrV\pz = rb * Sin(theta)
      *PtrV\nx = *PtrV\px * 4
      *PtrV\ny = 4 - *PtrV\py
      *PtrV\nz = *PtrV\pz * 4
      *PtrV\couleur = Coul
      *PtrV\u = Theta / (2.0*#PI)
      *PtrV\v = 0
      *PtrV + SizeOf(Vertex)
   Next i   
   
   ;Sommet en haut du cone
   For i = 0 To m
      theta.f =2*#PI*i/m
       
      *PtrV\px = rt * Cos(theta)
      *PtrV\py = h
      *PtrV\pz = rt * Sin(theta)
      *PtrV\nx = *PtrV\px * 4
      *PtrV\ny = 4 - *PtrV\py
      *PtrV\nz = *PtrV\pz * 4
      *PtrV\couleur = Coul
      *PtrV\u = Theta / (2.0*#PI)
      *PtrV\v = 1
      *PtrV + SizeOf(Vertex)
   Next i
     
   ;Sommet face bas du cone
   For i = 0 To m
      theta.f =2*#PI*i/m
       
      *PtrV\px = rb * Cos(theta)
      *PtrV\py = 0
      *PtrV\pz = rb * Sin(theta)
      *PtrV\nx = 0
      *PtrV\ny = -1
      *PtrV\nz = 0
      *PtrV\couleur = Coul
      *PtrV\u = Theta / (2.0*#PI)
      *PtrV\v = 1
      *PtrV + SizeOf(Vertex)
   Next i
             
   ;Sommet face haut du cone
   For i = 0 To m
      theta.f =2*#PI*i/m
       
      *PtrV\px = rt * Cos(theta)
      *PtrV\py = h
      *PtrV\pz = rt * Sin(theta)
      *PtrV\nx = 0
      *PtrV\ny = 1
      *PtrV\nz = 0
      *PtrV\couleur = Coul
      *PtrV\u = Theta / (2.0*#PI)
      *PtrV\v = 1
      *PtrV + SizeOf(Vertex)
   Next i
   
   ;Centre bas
   *PtrV\px = 0
   *PtrV\py = 0
   *PtrV\pz = 0
   *PtrV\nx = 0
   *PtrV\ny = -1
   *PtrV\nz = 0
   *PtrV\couleur = Coul
   *PtrV\u = 0.5
   *PtrV\v = 0.5
   *PtrV + SizeOf(Vertex)

   ;Centre haut
    *PtrV\px = 0
   *PtrV\py = h
   *PtrV\pz = 0
   *PtrV\nx = 0
   *PtrV\ny = 1
   *PtrV\nz = 0
   *PtrV\couleur = Coul
   *PtrV\u = 0.5
   *PtrV\v = 0.5
   
   
   ;Les facettes
   NbTriangle = 4*m
   *IBuffer=AllocateMemory(SizeOf(FTriangle)*NbTriangle)
   *PtrF.FTriangle=*IBuffer
   
   For i=0 To m-1
     
      *PtrF\f3=i
      *PtrF\f2=i + 1
      *PtrF\f1=m + i + 2
      *PtrF + SizeOf(FTriangle)
      *PtrF\f1=i
      *PtrF\f3=m + i + 2
      *PtrF\f2=m + i + 1
      *PtrF + SizeOf(FTriangle)
   Next i
   
   ;Face bas
   For i=0 To m-1
      *PtrF\f1= 4 * m + 4
      *PtrF\f2= 2 * m + 2 + i
      *PtrF\f3= 2 * m + 3 + i
      *PtrF + SizeOf(FTriangle)
   Next i     
   
   ;Face Haut   
   For i=0 To m-1
      *PtrF\f1= 4 * m + 5
      *PtrF\f3= 3 * m + 3 + i
      *PtrF\f2= 3 * m + 4 + i
      *PtrF + SizeOf(FTriangle)
   Next i     

 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)
CreateMeshCone(meridien,2,2,1)

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

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


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

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


;-Light
AmbientColor(RGB(105,105,105))
CreateLight(0,RGB(255,255,55),EntityX(0)+150,EntityY(0),EntityZ(0))
CreateLight(1,RGB(55,255,255),EntityX(0)-150,EntityY(0),EntityZ(0))
CreateLight(2,RGB(55,55,255),EntityX(0),EntityY(0)+150,EntityZ(0))
CreateLight(3,RGB(255,55,255),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) 
Please correct my english
http://purebasic.developpez.com/
User avatar
Comtois
Addict
Addict
Posts: 1431
Joined: Tue Aug 19, 2003 11:36 am
Location: Doubs - France

Re: Cone 3D

Post by Comtois »

Updated PB 4.60

Code: Select all

;Comtois 
;PB4.60 

Resultat = MessageRequester("Cone 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
ElseIf InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
  End
EndIf

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

Macro MaCouleur(Rouge,Vert,Bleu)
  Rouge << 16 + Vert << 8 + Bleu
EndMacro


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

meridien=90

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

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

Procedure AddVertex(*PtrV.Vertex)
  AddMeshVertex(*PtrV\px, *PtrV\py, *PtrV\pz)
  MeshVertexNormal(*PtrV\nx, *PtrV\ny, *PtrV\nz)
  MeshVertexColor(*Ptrv\Couleur)
  MeshVertexTextureCoordinate(*PtrV\u, *PtrV\v)
EndProcedure

Procedure CreateMeshCone(mesh, m, rb.f, h.f, rt.f)
  ;m = méridien
  ;h = hauteur
  ;rb = Rayon de la base
  ;rt = rayon troncature (haut du cône)
  
  ;Les normales sont calculées pour un cône :
  ;rb = 2
  ;h  = 2   
  ;rt = 1
  
  ;Pour un cône plus général , il faut éventuellement utiliser la pondération par les angles
  
  Protected PtrV.Vertex, PtrF.FTriangle
  
  If m<3 Or h < 0 Or rb < 0 Or rt < 0
    ProcedureReturn 0
  EndIf
  
  CreateMesh(mesh)
  
  NbSommet = 4*(m+1)+2
  
  ;Sommet en bas du cone
  Coul = $FF ; Pas utilisé dans cette démo
  For i = 0 To m
    theta.f =2*#PI*i/m
    PtrV\px = rb * Cos(theta)
    PtrV\py = 0
    PtrV\pz = rb * Sin(theta)
    PtrV\nx = PtrV\px * 4
    PtrV\ny = 4 - PtrV\py
    PtrV\nz = PtrV\pz * 4
    PtrV\couleur = Coul
    PtrV\u = Theta / (2.0*#PI)
    PtrV\v = 0
    AddVertex(@PtrV)
    
  Next i   
  
  ;Sommet en haut du cone
  For i = 0 To m
    theta.f =2*#PI*i/m
    
    PtrV\px = rt * Cos(theta)
    PtrV\py = h
    PtrV\pz = rt * Sin(theta)
    PtrV\nx = PtrV\px * 4
    PtrV\ny = 4 - PtrV\py
    PtrV\nz = PtrV\pz * 4
    PtrV\couleur = Coul
    PtrV\u = Theta / (2.0*#PI)
    PtrV\v = 1
    AddVertex(@PtrV)
    
  Next i
  
  ;Sommet face bas du cone
  For i = 0 To m
    theta.f =2*#PI*i/m
    
    PtrV\px = rb * Cos(theta)
    PtrV\py = 0
    PtrV\pz = rb * Sin(theta)
    PtrV\nx = 0
    PtrV\ny = -1
    PtrV\nz = 0
    PtrV\couleur = Coul
    PtrV\u = Theta / (2.0*#PI)
    PtrV\v = 1
    AddVertex(@PtrV)
    
  Next i
  
  ;Sommet face haut du cone
  For i = 0 To m
    theta.f =2*#PI*i/m
    
    PtrV\px = rt * Cos(theta)
    PtrV\py = h
    PtrV\pz = rt * Sin(theta)
    PtrV\nx = 0
    PtrV\ny = 1
    PtrV\nz = 0
    PtrV\couleur = Coul
    PtrV\u = Theta / (2.0*#PI)
    PtrV\v = 1
    AddVertex(@PtrV)
    
  Next i
  
  ;Centre bas
  PtrV\px = 0
  PtrV\py = 0
  PtrV\pz = 0
  PtrV\nx = 0
  PtrV\ny = -1
  PtrV\nz = 0
  PtrV\couleur = Coul
  PtrV\u = 0.5
  PtrV\v = 0.5
  AddVertex(@PtrV)
  
  
  ;Centre haut
  PtrV\px = 0
  PtrV\py = h
  PtrV\pz = 0
  PtrV\nx = 0
  PtrV\ny = 1
  PtrV\nz = 0
  PtrV\couleur = Coul
  PtrV\u = 0.5
  PtrV\v = 0.5
  AddVertex(@PtrV)
  
  
  ;Les facettes
  NbTriangle = 4*m
  
  For i=0 To m-1
    
    PtrF\f3=i
    PtrF\f2=i + 1
    PtrF\f1=m + i + 2
    AddMeshFace(PtrF\f1, PtrF\f2, PtrF\f3)
    PtrF\f1=i
    PtrF\f3=m + i + 2
    PtrF\f2=m + i + 1
    AddMeshFace(PtrF\f1, PtrF\f2, PtrF\f3)
  Next i
  
  ;Face bas
  For i=0 To m-1
    PtrF\f1= 4 * m + 4
    PtrF\f2= 2 * m + 2 + i
    PtrF\f3= 2 * m + 3 + i
    AddMeshFace(PtrF\f1, PtrF\f2, PtrF\f3)
  Next i     
  
  ;Face Haut   
  For i=0 To m-1
    PtrF\f1= 4 * m + 5
    PtrF\f3= 3 * m + 3 + i
    PtrF\f2= 3 * m + 4 + i
    AddMeshFace(PtrF\f1, PtrF\f2, PtrF\f3)
  Next i   
  
  FinishMesh()

  ;Pour centrer le repere du mesh si besoin
  ;TransformMesh(0, 0, -h/2.0, 0, 1, 1, 1, 0, 0, 0)
EndProcedure   

;-Mesh
;CreateMeshCone(0, 5,2,2,0)
;CreateMeshCone(0,4,2,2*Sqr(2),2) ; Cube
;CreateMeshCone(0,4,2,2*Sqr(2),0) ; Pyramide
;CreateMeshCone(0,32,2,5,2) ; Cylindre
CreateMeshCone(0,90,2,2,1) ; Cone 

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

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

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

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

;-Light
AmbientColor(RGB(105,105,105))
CreateLight(0,RGB(255,255,55),EntityX(0)+150,EntityY(0),EntityZ(0))
CreateLight(1,RGB(55,255,255),EntityX(0)-150,EntityY(0),EntityZ(0))
CreateLight(2,RGB(55,55,255),EntityX(0),EntityY(0)+150,EntityZ(0))
CreateLight(3,RGB(255,55,255),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)
Last edited by Comtois on Mon Jan 23, 2012 3:54 pm, edited 1 time in total.
Please correct my english
http://purebasic.developpez.com/
User avatar
Psychophanta
Always Here
Always Here
Posts: 5153
Joined: Wed Jun 11, 2003 9:33 pm
Location: Anare
Contact:

Re: Cone 3D

Post by Psychophanta »

Thanks!
I get just a blank screen here, as most of the times i deal with native PB 3D stuff since 3.40 version or so...
Anyhow, what about to update this one:
http://www.purebasic.fr/english/viewtop ... =12&t=8367
:twisted:
http://www.zeitgeistmovie.com

while (world==business) world+=mafia;
User avatar
ts-soft
Always Here
Always Here
Posts: 5756
Joined: Thu Jun 24, 2004 2:44 pm
Location: Berlin - Germany

Re: Cone 3D

Post by ts-soft »

Works fine here on Windows 7 with directx and opengl :D
On linux come a invalide memory after press escape. I think
this is a bug in linux.

Greetings - Thomas
PureBasic 5.73 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Image
User avatar
idle
Always Here
Always Here
Posts: 5915
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: Cone 3D

Post by idle »

There is some very strange bug from using manual meshes on linux but I can't make sense of it.

I ran the example 10 times and got mixed results
It drew cone, 1 time
It drew a huge triangle, 4 times
It drew nothing, 5 times
[Debugger] OpenWindowScreen
[Debugger] Created Cone
[Debugger] Created texture
[Debugger] Created Material 152033876 MaterialID -1281709144
Can't assign material none to SubEntity of E0 because this Material does not exist. Have you forgotten to define it in a .material script?
Last edited by idle on Tue Jan 24, 2012 2:55 am, edited 1 time in total.
Windows 11, Manjaro, Raspberry Pi OS
Image
User avatar
BasicallyPure
Enthusiast
Enthusiast
Posts: 539
Joined: Thu Mar 24, 2011 12:40 am
Location: Iowa, USA

Re: Cone 3D

Post by BasicallyPure »

I'm getting reliable (good) results using Ubuntu 10.04 + PB 4.60(x86).
Compiler options must be set to use opengl subsystem.

@ Comtois
This is a very fine example BTW.
I can learn from it.

B.P.
BasicallyPure
Until you know everything you know nothing, all you have is what you believe.
Post Reply