From 00b5c3e31a48147e7d5376a797292ff74df53be2 Mon Sep 17 00:00:00 2001 From: Dylancyclone Date: Mon, 29 Jun 2020 18:14:21 -0700 Subject: [PATCH 1/3] Fix models not being found if capitalized differently Can't believe I missed this one, honestly --- src/main/java/com/lathrum/VMF2OBJ/App.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/lathrum/VMF2OBJ/App.java b/src/main/java/com/lathrum/VMF2OBJ/App.java index 26b0093..f34d382 100644 --- a/src/main/java/com/lathrum/VMF2OBJ/App.java +++ b/src/main/java/com/lathrum/VMF2OBJ/App.java @@ -183,7 +183,7 @@ public static int getEntryIndexByPath(ArrayList object, String path) { public static ArrayList getEntryIndiciesByPattern(ArrayList object, String pattern) { ArrayList indicies = new ArrayList(); for (int i = 0; i < object.size(); i++) { - if (object != null && object.get(i).getFullPath().contains(pattern)) { + if (object != null && object.get(i).getFullPath().toLowerCase().contains(pattern.toLowerCase())) { indicies.add(i); } // else{System.out.println(object.get(i).getFullPath());} From 86ab7fa7e16a0bc4ec8e8a8e28da6b91441d6dd1 Mon Sep 17 00:00:00 2001 From: Dylancyclone Date: Mon, 29 Jun 2020 18:43:05 -0700 Subject: [PATCH 2/3] Fix Displacements!! It hurts that I got so close for so long and find the solution just days after making the project public, but I am so so happy this works now. This bug has plagued me for months. The `startposition` attribute isn't necessarily on a line with one of the sides of the brush, but it is placed nearest the point that is deemed the "bottom-left" corner of the displacement. Orienting all the other point around this makes everything line up beautifully. Resolves Issue #6 --- src/main/java/com/lathrum/VMF2OBJ/App.java | 22 +++++++++------ .../VMF2OBJ/dataStructure/Vector3.java | 28 +++++++++++++++++++ .../dataStructure/map/Displacement.java | 1 + .../VMF2OBJ/dataStructure/map/VMF.java | 1 + 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/lathrum/VMF2OBJ/App.java b/src/main/java/com/lathrum/VMF2OBJ/App.java index f34d382..eef634b 100644 --- a/src/main/java/com/lathrum/VMF2OBJ/App.java +++ b/src/main/java/com/lathrum/VMF2OBJ/App.java @@ -455,15 +455,17 @@ public static void main(String args[]) throws Exception { // -or- // A D // B C - Vector3 ad = side.points[3].subtract(side.points[0]); - Vector3 ab = side.points[1].subtract(side.points[0]); + int startIndex = side.dispinfo.startposition.closestIndex(side.points); + //Get adjacent points by going around counter-clockwise + Vector3 ad = side.points[(startIndex+1)%4].subtract(side.points[startIndex]); + Vector3 ab = side.points[(startIndex+3)%4].subtract(side.points[startIndex]); // System.out.println(ad); // System.out.println(ab); for (int i = 0; i < side.dispinfo.normals.length; i++) // rows { for (int j = 0; j < side.dispinfo.normals[0].length; j++) // columns { - Vector3 point = side.points[0] + Vector3 point = side.points[startIndex] .add(ad.normalize().multiply(ad.divide(side.dispinfo.normals[0].length - 1).abs().multiply(j))) .add(ab.normalize().multiply(ab.divide(side.dispinfo.normals.length - 1).abs().multiply(i))) .add(side.dispinfo.normals[i][j].multiply(side.dispinfo.distances[i][j])); @@ -728,14 +730,16 @@ public static void main(String args[]) throws Exception { // -or- // A D // B C - Vector3 ad = side.points[3].subtract(side.points[0]); - Vector3 ab = side.points[1].subtract(side.points[0]); + int startIndex = side.dispinfo.startposition.closestIndex(side.points); + //Get adjacent points by going around counter-clockwise + Vector3 ad = side.points[(startIndex+1)%4].subtract(side.points[startIndex]); + Vector3 ab = side.points[(startIndex+3)%4].subtract(side.points[startIndex]); for (int i = 0; i < side.dispinfo.normals.length - 1; i++) // all rows but last { for (int j = 0; j < side.dispinfo.normals[0].length - 1; j++) // all columns but last { buffer = ""; - Vector3 point = side.points[0] + Vector3 point = side.points[startIndex] .add(ad.normalize().multiply(ad.divide(side.dispinfo.normals[0].length - 1).abs().multiply(j))) .add(ab.normalize().multiply(ab.divide(side.dispinfo.normals.length - 1).abs().multiply(i))) .add(side.dispinfo.normals[i][j].multiply(side.dispinfo.distances[i][j])); @@ -749,7 +753,7 @@ public static void main(String args[]) throws Exception { buffer += (uniqueVerticiesList.indexOf(point) + vertexOffset) + "/" + ((((side.dispinfo.normals.length - 1) * i) + j) * 4 + vertexTextureOffset) + " "; - point = side.points[0] + point = side.points[startIndex] .add(ad.normalize().multiply(ad.divide(side.dispinfo.normals[0].length - 1).abs().multiply(j))) .add(ab.normalize().multiply(ab.divide(side.dispinfo.normals.length - 1).abs().multiply(i + 1))) .add(side.dispinfo.normals[i + 1][j].multiply(side.dispinfo.distances[i + 1][j])); @@ -763,7 +767,7 @@ public static void main(String args[]) throws Exception { buffer += (uniqueVerticiesList.indexOf(point) + vertexOffset) + "/" + ((((side.dispinfo.normals.length - 1) * i) + j) * 4 + vertexTextureOffset + 1) + " "; - point = side.points[0] + point = side.points[startIndex] .add(ad.normalize().multiply(ad.divide(side.dispinfo.normals[0].length - 1).abs().multiply(j + 1))) .add(ab.normalize().multiply(ab.divide(side.dispinfo.normals.length - 1).abs().multiply(i + 1))) .add(side.dispinfo.normals[i + 1][j + 1].multiply(side.dispinfo.distances[i + 1][j + 1])); @@ -777,7 +781,7 @@ public static void main(String args[]) throws Exception { buffer += (uniqueVerticiesList.indexOf(point) + vertexOffset) + "/" + ((((side.dispinfo.normals.length - 1) * i) + j) * 4 + vertexTextureOffset + 2) + " "; - point = side.points[0] + point = side.points[startIndex] .add(ad.normalize().multiply(ad.divide(side.dispinfo.normals[0].length - 1).abs().multiply(j + 1))) .add(ab.normalize().multiply(ab.divide(side.dispinfo.normals.length - 1).abs().multiply(i))) .add(side.dispinfo.normals[i][j + 1].multiply(side.dispinfo.distances[i][j + 1])); diff --git a/src/main/java/com/lathrum/VMF2OBJ/dataStructure/Vector3.java b/src/main/java/com/lathrum/VMF2OBJ/dataStructure/Vector3.java index 0f12d86..d55618f 100644 --- a/src/main/java/com/lathrum/VMF2OBJ/dataStructure/Vector3.java +++ b/src/main/java/com/lathrum/VMF2OBJ/dataStructure/Vector3.java @@ -210,6 +210,34 @@ public Vector3 normalize() { return this.divide(new Vector3(length,length,length)); } + public static double distance(Vector3 vectorA, Vector3 vectorB) { + return Math.sqrt( + Math.pow(vectorA.x - vectorB.x, 2) + Math.pow(vectorA.y - vectorB.y, 2) + Math.pow(vectorA.z - vectorB.z, 2)); + } + + public double distance(Vector3 vector) { + return Math.sqrt(Math.pow(this.x - vector.x, 2) + Math.pow(this.y - vector.y, 2) + Math.pow(this.z - vector.z, 2)); + } + + public int closestIndex(Vector3[] vectors) { + if (vectors.length == 0) { + return -1; + } else if (vectors.length == 1) { + return 0; + } else { + int index = 0; + double distance = this.distance(vectors[0]); + for (int i = 1; i < vectors.length; i++) { + double thisDistance = this.distance(vectors[i]); + if (thisDistance < distance) { + index = i; + distance = thisDistance; + } + } + return index; + } + } + public static Vector3 GetPlaneIntersectionPoint(Vector3[] side1, Vector3[] side2, Vector3[] side3) { Plane plane1 = new Plane(side1); Vector3 plane1Normal = plane1.normal().normalize(); diff --git a/src/main/java/com/lathrum/VMF2OBJ/dataStructure/map/Displacement.java b/src/main/java/com/lathrum/VMF2OBJ/dataStructure/map/Displacement.java index 07a2c4b..83ac8b5 100644 --- a/src/main/java/com/lathrum/VMF2OBJ/dataStructure/map/Displacement.java +++ b/src/main/java/com/lathrum/VMF2OBJ/dataStructure/map/Displacement.java @@ -4,6 +4,7 @@ public class Displacement { public int power; + public Vector3 startposition; public Vector3[][] normals; public double[][] distances; diff --git a/src/main/java/com/lathrum/VMF2OBJ/dataStructure/map/VMF.java b/src/main/java/com/lathrum/VMF2OBJ/dataStructure/map/VMF.java index 2d09bf2..d07165f 100644 --- a/src/main/java/com/lathrum/VMF2OBJ/dataStructure/map/VMF.java +++ b/src/main/java/com/lathrum/VMF2OBJ/dataStructure/map/VMF.java @@ -168,6 +168,7 @@ public static VMF parseVMF(String text) { disp = disp.replaceAll(objectRegex, ",\"$1\":$2"); disp = disp.replaceAll(keyValueRegex, "$1:$2,"); disp = disp.replaceAll(",,", ","); + disp = disp.replaceAll("\"startposition\":\"\\[(.+?) (.+?) (.+?)\\]\"", "\"startposition\":{\"x\":$1,\"y\":$2,\"z\":$3}"); // Format start position normals = ",\"normals\":[" + normals.substring(0, normals.length() - 1) + "]"; disp = splice(disp, normals, disp.length() - 1); distances = ",\"distances\":[" + distances.substring(0, distances.length() - 1) + "]"; From 5b973a545503a395d8d826f62f489004fef00405 Mon Sep 17 00:00:00 2001 From: Dylancyclone Date: Mon, 29 Jun 2020 18:47:27 -0700 Subject: [PATCH 3/3] Bump version to v1.1.1 and add changelog --- README.md | 2 +- changelog.txt | 10 ++++++++++ pom.xml | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 changelog.txt diff --git a/README.md b/README.md index 407bce0..9e7eeee 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Watch a demonstration video: From the root directory, run: -`mvn package;java -jar ./target/VMF2OBJ-1.1.0-jar-with-dependencies.jar [VMF_FILE] [OUTPUT_FILE] [VPK_PATHS]` +`mvn package;java -jar ./target/VMF2OBJ-1.1.1-jar-with-dependencies.jar [VMF_FILE] [OUTPUT_FILE] [VPK_PATHS]` ``` usage: vmf2obj [VMF_FILE] [OUTPUT_FILE] [VPK_PATHS] [args...] diff --git a/changelog.txt b/changelog.txt new file mode 100644 index 0000000..5911f8e --- /dev/null +++ b/changelog.txt @@ -0,0 +1,10 @@ +6/29/2020 1.1.1: +* Fix displacements +* Fix some models' QC being unfindable + +6/28/2020 1.1.0: ++ Add support for multiple external paths ++ Add support for CS:GO's unformscale prop keyvalue + +6/27/2020 1.0.0: ++ Initial Release diff --git a/pom.xml b/pom.xml index ca12f4b..30c0cfb 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.lathrum.VMF2OBJ VMF2OBJ - 1.1.0 + 1.1.1 jar VMF2OBJ