Skip to content

Conversation

@mrqsdf
Copy link
Contributor

@mrqsdf mrqsdf commented Dec 6, 2025

I add class for future implementation of create atlas with recreate obj file

exemple code for refactor :

public class ObjAtlasExample {

    public static void main(String[] args) throws Exception {
        long startTotal = System.currentTimeMillis();

        // Dossier d'entrée (où se trouvent les .obj, .mtl, textures)
        Path inputDir = Path.of("models_in");
        // Dossier de sortie (où seront écrits les nouveaux .obj/.mtl/atlas)
        Path outputDir = Path.of("models_out");

        if (!Files.exists(inputDir) || !Files.isDirectory(inputDir)) {
            System.err.println("[ERROR] Input directory does not exist or is not a directory: " + inputDir);
            return;
        }

        // Prépare les outils une seule fois
        ObjParser objParser = new ObjParser();
        TextureAtlasBuilder atlasBuilder = new TextureAtlasBuilder();
        ObjAtlasRewriter rewriter = new ObjAtlasRewriter();
        ObjWriter objWriter = new ObjWriter();
        MtlWriter mtlWriter = new MtlWriter();

        // Liste tous les .obj dans le dossier d'entrée (récursif)
        List<Path> objFiles;
        try (Stream<Path> stream = Files.walk(inputDir)) {
            objFiles = stream
                    .filter(Files::isRegularFile)
                    .filter(p -> p.toString().toLowerCase(Locale.ROOT).endsWith(".obj"))
                    .toList();
        }

        if (objFiles.isEmpty()) {
            System.out.println("[INFO] No OBJ files found in: " + inputDir);
        } else {
            System.out.println("[INFO] Found " + objFiles.size() + " OBJ file(s) to process.");
        }

        for (Path objPath : objFiles) {
            long startFile = System.currentTimeMillis();
            System.out.println("--------------------------------------------------");
            System.out.println("[INFO] Processing OBJ: " + objPath);

            try {
                // 1) Parse original OBJ + MTL
                ObjModel originalModel = objParser.parse(objPath);

                // Dossier où se trouvent le .obj et les textures d'origine
                Path objParent = objPath.getParent();
                if (objParent == null) {
                    objParent = inputDir;
                }

                // 2) Déterminer les chemins de sortie en conservant la structure relative
                Path relative = inputDir.relativize(objPath); // e.g. "subdir/model.obj"
                String baseName = stripExtension(relative.getFileName().toString());

                Path outputObjDir = outputDir.resolve(relative).getParent();
                if (outputObjDir == null) {
                    outputObjDir = outputDir;
                }
                Files.createDirectories(outputObjDir);

                Path outputObjPath = outputObjDir.resolve(baseName + "_atlas.obj");
                Path outputMtlPath = outputObjDir.resolve(baseName + "_atlas.mtl");
                Path outputAtlasPath = outputObjDir.resolve(baseName + "_atlas_diffuse.png");

                // 3) Build atlas from all map_Kd textures
                TextureAtlas atlas = atlasBuilder.buildAtlas(originalModel, objParent, outputAtlasPath);

                // 4) Rewrite UVs & materials for atlas
                ObjModel atlasModel = rewriter.rewriteModelForAtlas(originalModel, atlas);

                // 5) Write new OBJ/MTL
                objWriter.write(atlasModel, outputObjPath, outputMtlPath.getFileName().toString());
                mtlWriter.write(atlasModel.materials(), outputMtlPath);

                long endFile = System.currentTimeMillis();
                System.out.println("[OK]  Output OBJ : " + outputObjPath);
                System.out.println("[OK]  Output MTL : " + outputMtlPath);
                System.out.println("[OK]  Output PNG : " + outputAtlasPath);
                System.out.println("[OK]  Time taken : " + (endFile - startFile) + " ms");
            } catch (Exception e) {
                long endFile = System.currentTimeMillis();
                System.err.println("[ERROR] Failed to process " + objPath + " (" + (endFile - startFile) + " ms)");
                e.printStackTrace(System.err);
            }
        }

        long endTotal = System.currentTimeMillis();
        System.out.println("==================================================");
        System.out.println("[DONE] Batch finished in " + (endTotal - startTotal) + " ms");
    }

    private static String stripExtension(String name) {
        int dot = name.lastIndexOf('.');
        return (dot >= 0) ? name.substring(0, dot) : name;
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant