; ------------------------------------------------------------
;
;   PureBasic - CreateDataMesh
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

#PB_Mesh_Normalize=8

InitEngine3D():InitSprite():InitKeyboard():InitMouse()

ExamineDesktops():dx=DesktopWidth(0)*0.8:dy=DesktopHeight(0)*0.8
OpenWindow(0, 0,0, DesktopUnscaledX(dx),DesktopUnscaledY(dy), " CreateDataMesh - [F12] Wireframe -  [Esc] quit",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, dx, dy, 0, 0, 0)

Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures",#PB_3DArchive_FileSystem)
Parse3DScripts()

;camera
CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0,0,0,20)
CameraLookAt(0,0,0,0)

;light
CreateLight(0,$ffffff, 10000, 10000, 0000)
AmbientColor($777777)

;material
LoadTexture(0, "Dirt.jpg")
CreateMaterial(0,TextureID(0))
MaterialFilteringMode(0,#PB_Material_Anisotropic)
MaterialShininess(0,32,$888888)
ScaleMaterial(0,0.1,0.025)

CopyMaterial(0,1)
SetMaterialColor(1,#PB_Material_DiffuseColor,$ff)
SetMaterialColor(1,#PB_Material_AmbientColor,$ff)
MaterialCullingMode(1,#PB_Material_AntiClockWiseCull) 

;mesh
Define.f u,v, a=3,b=4,c=-0.1,   nx.l=32,ny.l=256
Dim t.MeshVertex(nx,ny)
For j=0 To ny
  For i=0 To nx
    u=j/ny*2*#PI
    v=i/nx*2*#PI   
    
    With t(i,j)
      \u=i/nx
      \v=j/ny
      \color=$ffffff
      u*4
      \x=(a+b*Cos(v))*Exp(c*u)*Cos(u)
      \y=(a+b*Cos(v))*Exp(c*u)*Sin(u)
      \z=(3*a+b*Sin(v))*Exp(c*u)-5
    EndWith
  Next
Next
CreateDataMesh(mesh,t(),#PB_Mesh_DiagonalClosestNormal+#PB_Mesh_Normalize)

;entity
CreateEntity(0,MeshID(0),MaterialID(0))
CreateEntity(1,MeshID(0),MaterialID(1))
AttachEntityObject(0,"",EntityID(1))

Repeat     
  While WindowEvent():Wend
  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_F12):Wireframe=1-Wireframe:EndIf
  If Wireframe:MaterialShadingMode(0, #PB_Material_Wireframe):Else:MaterialShadingMode(0,#PB_Material_Solid):EndIf
  
  RotateEntity(0,0.5,0.3,0.4,#PB_Relative)
  
  RenderWorld()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)