SUB ExportSmoothINC
 DIM ricorre AS LONG, normalX AS SINGLE, normalY AS SINGLE, normalZ AS SINGLE
 DIM nodeX AS SINGLE, nodeY AS SINGLE, nodeZ AS SINGLE
 DIM memX as single, memY as single, memZ as single
 'STOP.Visible=1:
 SaveLab.Caption="":DisableMenu:FixLab.Caption=""
 GRIDf.Close:GRIDf.Position=0:GRIDf.Size=0
 STLf.Close:STLf.Open(LinkCopy.Text,0)
 STLface.header=STLf.ReadBinStr(80)
 STLface.numfacets=STLf.ReadNum(4)
 FixLab.Caption="________ Lettura STL binario con "+str$(STLface.numfacets)+" facce":FaceLab.Caption="Facce memorizzate :"
 GRIDf.Size=0 : NETf.Size=0
 GRIDf.Position=0 : NETf.Position=0

 FOR idx=0 TO STLface.numfacets-1
  STLface.nx=STLf.ReadNum(6):STLface.ny=STLf.ReadNum(6):STLface.nz=STLf.ReadNum(6)
  STLface.nx=STLface.nx/10:STLface.ny=STLface.ny/10:STLface.nz=STLface.nz/10
  STLface.x0=STLf.ReadNum(6):STLface.y0=STLf.ReadNum(6):STLface.z0=STLf.ReadNum(6)
  STLface.x1=STLf.ReadNum(6):STLface.y1=STLf.ReadNum(6):STLface.z1=STLf.ReadNum(6)
  STLface.x2=STLf.ReadNum(6):STLface.y2=STLf.ReadNum(6):STLface.z2=STLf.ReadNum(6)
  STLface.descriptor=STLf.ReadNum(2)
  GRIDf.Write(STLface.nx):GRIDf.Write(STLface.ny):GRIDf.Write(STLface.nz)
  GRIDf.Write(STLface.nx):GRIDf.Write(STLface.ny):GRIDf.Write(STLface.nz)
  GRIDf.Write(STLface.nx):GRIDf.Write(STLface.ny):GRIDf.Write(STLface.nz)
  NETf.Write(STLface.x0):NETf.Write(STLface.y0):NETf.Write(STLface.z0)
  NETf.Write(STLface.x1):NETf.Write(STLface.y1):NETf.Write(STLface.z1)
  NETf.Write(STLface.x2):NETf.Write(STLface.y2):NETf.Write(STLface.z2)
 NEXT
 INCf.Open("smoothed.inc",65535)
 FOR idx=0 TO STLface.numfacets-1
  NETf.Position=idx*36
  nodeX=NETf.ReadNum(6)
  nodeY=NETf.ReadNum(6)
  nodeZ=NETf.ReadNum(6)
  ricorre=0:normalX=0:normalY=0:normalZ=0:NETf.Position=0
  FOR n=0 TO ((STLface.numfacets*3)-1)
   memX=NETf.ReadNum(6)
   memY=NETf.ReadNum(6)
   memZ=NETf.ReadNum(6)
   IF nodeX=memX AND nodeY=memY AND nodeZ=memZ THEN
    GRIDf.Position=n*12
    xNS=GRIDf.ReadNum(6)
    yNS=GRIDf.ReadNum(6)
    zNS=GRIDf.ReadNum(6)
'showmessage (str$(idx)+"=" +str$(nodeX)+" "+str$(nodey)+" "+str$(nodez))+" --- "+ (str$(STLface.x0)+" "+str$(STLface.y0)+" "+str$(STLface.z0))
    ricorre=ricorre+1
    normalX=normalX+xNS
    normalY=normalY+yNS
    normalZ=normalZ+zNS
   END IF
  NEXT
  normalX=normalX/ricorre : normalY=normalY/ricorre : normalZ=normalZ/ricorre
  INCf.WriteLine("smooth_triangle{<"+STRF$(nodeX,2,10,4)+","+STRF$(nodeZ,2,10,4)+","+STRF$(nodeY,2,10,4)+">,")
  INCf.WriteLine(" <"+STRF$(normalX,2,10,4)+","+STRF$(normalZ,2,10,4)+","+STRF$(normalY,2,10,4)+">,")

'------------------------ vtx 2
  NETf.Position=(idx*36)+12
  nodeX=NETf.ReadNum(6)
  nodeY=NETf.ReadNum(6)
  nodeZ=NETf.ReadNum(6)
  ricorre=0:normalX=0:normalY=0:normalZ=0:NETf.Position=0
  FOR n=0 TO ((STLface.numfacets*3)-1)
   memX=NETf.ReadNum(6)
   memY=NETf.ReadNum(6)
   memZ=NETf.ReadNum(6)
   IF nodeX=memX AND nodeY=memY AND nodeZ=memZ THEN
    GRIDf.Position=n*12
    xNS=GRIDf.ReadNum(6)
    yNS=GRIDf.ReadNum(6)
    zNS=GRIDf.ReadNum(6)
'showmessage (str$(idx)+" = " +str$(nodeX)+" "+str$(nodey)+" "+str$(nodez))+" --- "+ (str$(STLface.x0)+" "+str$(STLface.y0)+" "+str$(STLface.z0))
    ricorre=ricorre+1
    normalX=normalX+xNS
    normalY=normalY+yNS
    normalZ=normalZ+zNS
   END IF
  NEXT
  normalX=normalX/ricorre : normalY=normalY/ricorre : normalZ=normalZ/ricorre
  INCf.WriteLine(" <"+STRF$(nodeX,2,10,4)+","+STRF$(nodeZ,2,10,4)+","+STRF$(nodeY,2,10,4)+">,")
  INCf.WriteLine(" <"+STRF$(normalX,2,10,4)+","+STRF$(normalZ,2,10,4)+","+STRF$(normalY,2,10,4)+">,")


'------------------------ vtx 3
  NETf.Position=(idx*36)+24
  nodeX=NETf.ReadNum(6)
  nodeY=NETf.ReadNum(6)
  nodeZ=NETf.ReadNum(6)
  ricorre=0:normalX=0:normalY=0:normalZ=0:NETf.Position=0
  FOR n=0 TO ((STLface.numfacets*3)-1)
   memX=NETf.ReadNum(6)
   memY=NETf.ReadNum(6)
   memZ=NETf.ReadNum(6)
   IF nodeX=memX AND nodeY=memY AND nodeZ=memZ THEN
    GRIDf.Position=n*12
    xNS=GRIDf.ReadNum(6)
    yNS=GRIDf.ReadNum(6)
    zNS=GRIDf.ReadNum(6)
'showmessage (str$(idx)+" = " +str$(nodeX)+" "+str$(nodey)+" "+str$(nodez))+" --- "+ (str$(STLface.x0)+" "+str$(STLface.y0)+" "+str$(STLface.z0))
    ricorre=ricorre+1
    normalX=normalX+xNS
    normalY=normalY+yNS
    normalZ=normalZ+zNS
   END IF
  NEXT
  normalX=normalX/ricorre : normalY=normalY/ricorre : normalZ=normalZ/ricorre
  INCf.WriteLine(" <"+STRF$(nodeX,2,10,4)+","+STRF$(nodeZ,2,10,4)+","+STRF$(nodeY,2,10,4)+">,")
  INCf.WriteLine(" <"+STRF$(normalX,2,10,4)+","+STRF$(normalZ,2,10,4)+","+STRF$(normalY,2,10,4)+">}")
 NEXT

 INCf.Close:STLf.Close:GRIDf.Close:NETf.Close
 showmessage "done "+str$(idx)
