func convert(p pak.MultiPak, args ...string) { fs := flag.NewFlagSet("convert", flag.ExitOnError) fs.Usage = func() { fmt.Fprintf(os.Stderr, "Usage: %s -pak <pak0,pak1,...> convert [options]\n", os.Args[0]) fs.PrintDefaults() } outDir := fs.String("out", ".", "Output directory.") skins := fs.Bool("skins", true, "Use skins.") fs.Parse(args) errors := []string{} os.Mkdir(*outDir, 0755) for _, mf := range p.List() { if path.Ext(mf) != ".mdl" { continue } func() { o, err := p.Get(mf) if err != nil { log.Fatalf("Getting %q: %v", mf, err) } m, err := mdl.Load(o) if err != nil { log.Printf("Loading %q: %v", mf, err) errors = append(errors, mf) return } var cparts []string for _, part := range strings.Split(mf, "/") { cparts = append(cparts, part) if err := os.Mkdir(path.Join(*outDir, strings.Join(cparts, "/")), 0755); err != nil { //log.Printf("Creating model subdir: %v, continuing...", err) } } fn := fmt.Sprintf(path.Join(mf, "model.inc")) of, err := os.Create(path.Join(*outDir, fn)) if err != nil { log.Fatalf("Model create of %q fail: %v", fn, err) } defer of.Close() for n := range m.Frames { if *skins { fmt.Fprintf(of, "#macro %s(pos, rot, skin)\n%s\n#end\n", frameName(mf, n), m.POVFrameID(n, "skin")) } else { fmt.Fprintf(of, "#macro %s(pos, rot)\n%s\n#end\n", frameName(mf, n), m.POVFrameID(n, "")) } } for n, skin := range m.Skins { of, err := os.Create(path.Join(*outDir, mf, fmt.Sprintf("skin_%d.png", n))) if err != nil { log.Fatalf("Skin create of %q fail: %v", fn, err) } defer of.Close() if err := (&png.Encoder{CompressionLevel: pngCompressionLevel}).Encode(of, skin); err != nil { log.Fatalf("Encoding skin to png: %v", err) } } }() } if len(errors) > 0 { fmt.Printf("Failed to convert %d models:\n %s\n", len(errors), strings.Join(errors, "\n ")) } }
func convert(p pak.MultiPak, args ...string) { fs := flag.NewFlagSet("convert", flag.ExitOnError) fs.Usage = func() { fmt.Fprintf(os.Stderr, "Usage: %s -pak pak0,pak1,... convert [options]\n", os.Args[0]) fs.PrintDefaults() } outDir := fs.String("out", ".", "Output directory.") retexturePack := fs.String("retexture", "", "Path to retexture pack.") flatColor := fs.String("flat_color", "<0.25,0.25,0.25>", "") textures := fs.Bool("textures", true, "Use textures.") lights := fs.Bool("lights", false, "Export lights.") maps := fs.String("maps", ".*", "Maps regex.") fs.Parse(args) re, err := regexp.Compile(*maps) if err != nil { log.Fatalf("Maps regex %q invalid: %v", *maps, err) } //errors := []string{} os.Mkdir(*outDir, 0755) for _, mf := range p.List() { if path.Ext(mf) != ".bsp" { continue } if !re.MatchString(mf) { continue } func() { o, err := p.Get(mf) if err != nil { log.Fatalf("Getting %q: %v", mf, err) } b, err := bsp.Load(o) if err != nil { log.Fatalf("Loading %q: %v", mf, err) } mkdirP(*outDir, mf) fn := fmt.Sprintf(path.Join(mf, "level.inc")) of, err := os.Create(path.Join(*outDir, fn)) if err != nil { log.Fatalf("Model create of %q fail: %v", fn, err) } defer of.Close() m, err := b.POVTriangleMesh(bsp.ModelMacroPrefix(mf), *textures, *flatColor) if err != nil { log.Fatalf("Making mesh of %q: %v", mf, err) } fmt.Fprintln(of, m) if *lights { fmt.Fprintln(of, b.POVLights()) } if *textures { for n, texture := range b.Raw.MipTexData { fn := path.Join(*outDir, mf, fmt.Sprintf("texture_%d.png", n)) retexFn, retex := retexture(*retexturePack, mf, b.Raw.MipTex[n], texture) if retex { if err := os.Symlink(retexFn, fn); err != nil { log.Fatalf("Failed to symlink %q to %q for texture pack: %v", fn, retexFn, err) } continue } func() { of, err := os.Create(fn) if err != nil { log.Fatalf("Texture create of %q fail: %v", fn, err) } defer of.Close() if err := (&png.Encoder{CompressionLevel: pngCompressionLevel}).Encode(of, texture); err != nil { log.Fatalf("Encoding texture to png: %v", err) } }() } } }() } }