   #  opts: (optional) a object containing properties for this parser
   #     background: (boolean) if true this parser will spawn a webworker and run outside the UI thread
   #  callback: the fn to run once the 3d geometry has been parsed
-  constructor: (@src, @opts) ->
+  constructor: (src, @opts) ->
     args = arguments
     @opts = {background: true} if args.length < 3 or !( @opts? )
     @callback = args[args.length-1]
 
+    if src.vertices? and src.indices? and src.normals?
+      # Import native P3D attributes directly
+      @_initWorker src
+      return @
+
     # Determining the file name and the file type
-    @filename = if typeof(@src) == "string" then @src.split("/").pop().replace("/", "") else @src.name
+    @filename = if typeof(src) == "string" then src.split("/").pop().replace("/", "") else src.name
     @fileType = capitalize fileExt(@filename).toLowerCase()
 
     if @_fileTypeWhitelist.indexOf(@fileType) == -1

    @[attr] = exp[attr] for attr in ['vertices', 'normals']
    @verts = @vertices

  #_parseTextAMF: (text) ->
  # TODO: inflate the zip file here
  # new Blob([arrayBuffer], "application/zip")

  _parseTextAmf: (text) ->
    xml = parseXml text
    root = xml.documentElement

    for i in [0..2]
      if f.normals[i][0] == 0 and f.normals[i][1] == 0 and f.normals[i][2] == 0
        f.normals[i][j] = vN[j] for j in [0..2]
