From 2e636f52059c291035372d6edad358a3480f6782 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Fri, 18 Aug 2023 04:01:39 +0200 Subject: [PATCH] Rename MtlExporter --- ...tlExpoter.java => AppearanceExporter.java} | 55 ++++++++++++++++--- .../export/OBJExporterFactory.java | 6 +- 2 files changed, 51 insertions(+), 10 deletions(-) rename core/src/net/sf/openrocket/file/wavefrontobj/export/{MtlExpoter.java => AppearanceExporter.java} (60%) diff --git a/core/src/net/sf/openrocket/file/wavefrontobj/export/MtlExpoter.java b/core/src/net/sf/openrocket/file/wavefrontobj/export/AppearanceExporter.java similarity index 60% rename from core/src/net/sf/openrocket/file/wavefrontobj/export/MtlExpoter.java rename to core/src/net/sf/openrocket/file/wavefrontobj/export/AppearanceExporter.java index 01c839ed4..4a2e0eb05 100644 --- a/core/src/net/sf/openrocket/file/wavefrontobj/export/MtlExpoter.java +++ b/core/src/net/sf/openrocket/file/wavefrontobj/export/AppearanceExporter.java @@ -1,11 +1,16 @@ package net.sf.openrocket.file.wavefrontobj.export; +import de.javagl.obj.FloatTuple; import net.sf.openrocket.appearance.Appearance; +import net.sf.openrocket.appearance.Decal; import net.sf.openrocket.appearance.defaults.DefaultAppearance; +import net.sf.openrocket.file.wavefrontobj.DefaultFloatTuple; import net.sf.openrocket.file.wavefrontobj.DefaultMtl; import net.sf.openrocket.file.wavefrontobj.DefaultObj; +import net.sf.openrocket.file.wavefrontobj.DefaultTextureOptions; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.util.Color; +import net.sf.openrocket.util.Coordinate; import java.util.List; @@ -14,11 +19,11 @@ import java.util.List; * * @author Sibo Van Gool */ -public class MtlExpoter { +public class AppearanceExporter { private final DefaultObj obj; private final RocketComponent component; private final String materialName; - private List materials; + private final List materials; /** * Export the appearance of a rocket component @@ -28,7 +33,7 @@ public class MtlExpoter { * @param materialName The name of the material to generate * @param materials The list of materials to add the new material(s) to */ - public MtlExpoter(DefaultObj obj, RocketComponent component, String materialName, List materials) { + public AppearanceExporter(DefaultObj obj, RocketComponent component, String materialName, List materials) { this.obj = obj; this.component = component; this.materialName = materialName; @@ -50,6 +55,46 @@ public class MtlExpoter { } // Apply coloring + applyColoring(appearance, material); + + // Apply texture + applyTexture(appearance, material); + + materials.add(material); + } + + private static void applyTexture(Appearance appearance, DefaultMtl material) { + Decal texture = appearance.getTexture(); + if (texture == null) { + return; + } + + final DefaultTextureOptions textureOptions = new DefaultTextureOptions(); + + // TODO: file name (save externally if saved inside .ork) + //String filePath = texture.getImage().getDecalFile().getAbsolutePath(); + String filePath = "/Users/SiboVanGool/Downloads/hello.jpeg"; + textureOptions.setFileName(filePath); + + // Texture offset + final Coordinate origin = texture.getOffset(); + Float origX = (float) origin.x; + Float origY = (float) origin.y; + textureOptions.setO(origX, origY, 0f); + + // Texture scale + final Coordinate scale = texture.getScale(); + Float scaleX = (float) scale.x; + Float scaleY = (float) scale.y; + textureOptions.setS(scaleX, scaleY, 1f); + + // TODO: rotation + + // Apply the texture + material.setMapKdOptions(textureOptions); + } + + private static void applyColoring(Appearance appearance, DefaultMtl material) { Color color = appearance.getPaint(); final float r = color.getRed()/255f; final float g = color.getGreen()/255f; @@ -60,9 +105,5 @@ public class MtlExpoter { material.setD(color.getAlpha()/255f); // Opacity material.setNs((float) appearance.getShine() * 750); // Shine (max is 1000, but this too strong compared to OpenRocket's max) material.setIllum(2); // Use Phong reflection (specular highlights etc.) - - // TODO: Apply texture - - materials.add(material); } } diff --git a/core/src/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactory.java b/core/src/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactory.java index 0080fa11c..cd05b8e71 100644 --- a/core/src/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactory.java +++ b/core/src/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactory.java @@ -197,7 +197,7 @@ public class OBJExporterFactory { } private static void writeObj(DefaultObj obj, String filePath) { - try (OutputStream objOutputStream = new FileOutputStream(filePath)) { + try (OutputStream objOutputStream = new FileOutputStream(filePath, false)) { ObjWriter.write(obj, objOutputStream); } catch (IOException e) { throw new RuntimeException(e); @@ -223,8 +223,8 @@ public class OBJExporterFactory { // Export material if (options.isExportAppearance()) { - MtlExpoter mtlExpoter = new MtlExpoter(obj, component, "mat_" + groupName, materials); - mtlExpoter.doExport(); + AppearanceExporter appearanceExporter = new AppearanceExporter(obj, component, "mat_" + groupName, materials); + appearanceExporter.doExport(); } // Export component