-- ColMesh Importer
--  Copyright © Martijn Buijs, 2008
--  http://www.bytehazard.com


-- clean up
clearlistener()
global cmImp
if cmImp != undefined do
(
 closeRolloutFloater cmImp
)


-- globals
global impscale


-- read geom col from file
fn ReadGeomCol fp fileversion =
(
 
 if fileversion >= 9 do
 (
  -- coltype (4 bytes)
  local coltype = ReadLong fp
 )
 
 -- facenum (4 bytes)
 local facenum = ReadLong fp
 
 -- faces (8 bytes * facenum)
 local facelist = #()
 local fmatlist = #()
 for i=1 to facenum do
 (
  v1 = (ReadShort fp #unsigned)+1
  v2 = (ReadShort fp #unsigned)+1
  v3 = (ReadShort fp #unsigned)+1
  m  = (ReadShort fp #unsigned)+1
  
  append facelist [v1,v2,v3]
  append fmatlist m
 ) 
 
 -- vertnum (4 bytes)
 local vertnum = ReadLong fp
 
 -- vertices (vertnum * 12 bytes)
 local vertlist = #()
 for i=1 to vertnum do
 (
  vx = (ReadFloat fp) * impscale
  vy = (ReadFloat fp) * impscale
  vz = (ReadFloat fp) * impscale
  append vertlist [vx,vz,vy]
 )
 
 -- build mesh
 local obj = mesh vertices:vertlist faces:facelist materialIDS:fmatlist
 
 -- clear smoothgroups
 for i=1 to facenum do
 (
  --setFaceMatId obj i fmatlist[i]
  setFaceSmoothGroup obj i 1
 )
 
 -- set mesh name
 if fileversion >= 9 do (
  obj.name = "col" + (coltype as string)
 )
 
 -- unknown (vertnum * 2 bytes)
 fseek fp (vertnum*2) #seek_cur
 
 -- bounds (24 bytes)
 fseek fp 24 #seek_cur
 
 -- unknown (1 byte)
 ReadByte fp
 
 -- bounds (24 bytes)
 fseek fp 24 #seek_cur
 
 -- ynum (4 bytes)
 znum = ReadLong fp
 
 -- ydata (ynum * 16 bytes)
 fseek fp (znum*16) #seek_cur
 
 -- znum (4 bytes)
 local znum = ReadLong fp
 
 -- zdata (znum * 2 bytes)
 fseek fp (znum*2) #seek_cur
 
 if fileversion >= 10 do
 (
  -- anum (4 bytes)
  local anum = ReadLong fp
  
  -- adata (anum * 4 bytes)
  fseek fp (anum*4) #seek_cur
 )
 
 -- return mesh
 return obj
)


-- reads geom subs
fn ReadGeomSub fp fileversion geomnode =
(
 -- number of geom cols (4 bytes)
 local colnum = ReadLong fp
 
 -- col data
 if colnum > 0 do
 (
  -- create dummy
  local nonvisroot = Dummy()
  nonvisroot.name = "nonvis_"
  nonvisroot.parent = geomnode
  
  -- col data
  for j=1 to colnum do
  (
   -- read col
   obj = ReadGeomCol fp fileversion
   
   -- set mesh name
   if fileversion < 9 do (
    obj.name = "col" + ((j-1) as string)
   )
   
   -- attach to dummy
   obj.parent = nonvisroot
   
   -- refresh
   update obj
  )
 )
 
)


-- imports mesh file
fn ImportColMesh filename =
( 
 -- open file
 local fp = fopen filename "rb"
 if fp == undefined do
 (
  messagebox "Could not open file \"" + filename + "\"."
  return false
 )
 
 -- get mesh name
 local meshname = getFilenameFile filename
 
 -- create root node
 local rootnode = Dummy()
 rootnode.name = "root_" + meshname
 
 -- file info (8 bytes)
 local head = ReadLong fp
 local fileversion = ReadLong fp
 
 -- chunknum (4 bytes)
 local geomnum = ReadLong fp
  
 -- geoms (? bytest)
 for i=1 to geomnum do
 (
  local geomnode = Dummy()
  geomnode.name = "geom" + ((i-1) as string)
  geomnode.parent = rootnode
  
  -- subgeomnum (4 bytes)
  local subgeomnum = ReadLong fp
  
  -- subgeoms (? bytes)
  for j=1 to subgeomnum do
  (
   ReadGeomSub fp fileversion geomnode
  )
 )
 
 -- close file
 fclose fp
 
 return true
)


-- GUI
rollout rImport "ColMesh Importer"
(
 group "Import"
 (
  spinner spnImpScale "Scale " range:[0.001,1000.0,10.0]
  button cmdImport "Import..." width: 140
 )
 on cmdImport pressed do
 (
  
  -- open file dialog
  filename = getOpenFileName caption:"Import File" types:"Collision Mesh (*.collisionmesh)|*.collisionmesh|All Files (*.*)|*.*"
  if filename == undefined then
  (
   return false
  )
  
  -- copy values
  impscale = spnImpScale.value
  
  -- import
  try (
   ImportColMesh filename
  ) catch (
   messagebox "Failed, please let [FH]Remdul know!\nMail to: martijn@bytehazard.com"
  )
  
 )
)

rollout rAbout "About"
(
 label lab1 "BF2 ColMesh Importer"
 label lab2 "Version 1.2.0"
 label lab3 "Copyright © Martijn Buijs, 2008"
)

-- floater
cmImp = newRolloutFloater "ColMesh Importer" 180 130
addRollout rImport cmImp
addRollout rAbout cmImp rolledup:true

-- END OF FILE
