DecodeFileFS decodes the given file from the given filesystem using a decoder based on the file extension. Returns decoder instance with full decoded state. Supported formats include: .obj = Wavefront OBJ format, including associated materials (.mtl) which must have same name as .obj, or a defaul
(fsys fs.FS, fname string)
| 76 | // |
| 77 | // must have same name as .obj, or a default material is used. |
| 78 | func DecodeFileFS(fsys fs.FS, fname string) (Decoder, error) { |
| 79 | ext := filepath.Ext(fname) |
| 80 | dt, has := Decoders[ext] |
| 81 | if !has { |
| 82 | return nil, fmt.Errorf("xyz.DecodeFile: file extension: %v not found in Decoders list for file %v", ext, fname) |
| 83 | } |
| 84 | dec := dt.New() |
| 85 | fn := fname |
| 86 | subdir, fn := filepath.Split(fn) |
| 87 | var err error |
| 88 | if subdir != "" { |
| 89 | fsys, err = fs.Sub(fsys, subdir) |
| 90 | if err != nil { |
| 91 | return nil, fmt.Errorf("xyz.DecodeFile: file directory not found error: %v for file: %v", err, fname) |
| 92 | } |
| 93 | } |
| 94 | files, err := dec.SetFileFS(fsys, fn) |
| 95 | if err != nil { |
| 96 | return nil, fmt.Errorf("xyz.DecodeFile: file not found error: %v for file: %v", err, fname) |
| 97 | } |
| 98 | nf := len(files) |
| 99 | |
| 100 | fs := make([]fs.File, nf) |
| 101 | rs := make([]io.Reader, nf) |
| 102 | defer func() { |
| 103 | for _, fi := range fs { |
| 104 | if fi != nil { |
| 105 | fi.Close() |
| 106 | } |
| 107 | } |
| 108 | }() |
| 109 | |
| 110 | for i, f := range files { |
| 111 | fs[i], err = fsys.Open(f) |
| 112 | if err != nil { |
| 113 | return nil, err |
| 114 | } |
| 115 | rs[i] = fs[i] |
| 116 | } |
| 117 | err = dec.Decode(rs) |
| 118 | if err != nil { |
| 119 | return nil, err |
| 120 | } |
| 121 | return dec, nil |
| 122 | } |
| 123 | |
| 124 | // OpenObj opens object(s) from given file into given group in scene, |
| 125 | // using a decoder based on the file extension. |
no test coverage detected