OSDN Git Service

[fixed] Issue 1058, MD5Loader handling of quoted strings.
authorJustin Shapcott <justin@mobidevelop.com>
Tue, 25 Sep 2012 13:12:48 +0000 (06:12 -0700)
committerJustin Shapcott <justin@mobidevelop.com>
Tue, 25 Sep 2012 13:13:42 +0000 (06:13 -0700)
backends/gdx-backends-gwt/src/com/badlogic/gdx/backends/gwt/emu/com/badlogic/gdx/graphics/g3d/loaders/md5/MD5Tokenizer.java [new file with mode: 0644]
gdx/src/com/badlogic/gdx/graphics/g3d/loaders/md5/MD5Loader.java
gdx/src/com/badlogic/gdx/graphics/g3d/loaders/md5/MD5Tokenizer.java [new file with mode: 0644]

diff --git a/backends/gdx-backends-gwt/src/com/badlogic/gdx/backends/gwt/emu/com/badlogic/gdx/graphics/g3d/loaders/md5/MD5Tokenizer.java b/backends/gdx-backends-gwt/src/com/badlogic/gdx/backends/gwt/emu/com/badlogic/gdx/graphics/g3d/loaders/md5/MD5Tokenizer.java
new file mode 100644 (file)
index 0000000..be31e6d
--- /dev/null
@@ -0,0 +1,30 @@
+package com.badlogic.gdx.graphics.g3d.loaders.md5;
+
+import java.util.List;
+
+import com.google.gwt.core.client.JsArrayString;
+
+public class MD5Tokenizer {
+
+       public static void tokenize (String line, List<String> tokens) {
+               tokens.clear();
+               JsArrayString nativeTokens = nativeTokenize(line);
+               for (int i = 0, j = nativeTokens.length(); i < j; i++) {
+                       String string = nativeTokens.get(i);
+                       tokens.add(string);
+               }
+       }
+       
+       public static native JsArrayString nativeTokenize(String line) /*-{
+               var tokens = [];
+               var m = new RegExp(/\"([^\"]*)\"|(\S+)/g);
+               while ((match = m.exec(line)) != null) {
+                       if (match[1] != null) {            
+                               tokens.push(match[1]);
+                       } else {
+                               tokens.push(match[2]);
+                       }
+               }
+               return tokens;
+       }-*/;           
+}
index 9daa255..1ea8e04 100644 (file)
@@ -21,7 +21,8 @@ import java.io.InputStream;
 import java.io.InputStreamReader;\r
 import java.util.ArrayList;\r
 import java.util.List;\r
-import java.util.StringTokenizer;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
 \r
 import com.badlogic.gdx.math.Vector3;\r
 import com.badlogic.gdx.math.collision.BoundingBox;\r
@@ -48,7 +49,7 @@ public class MD5Loader {
                        int currMesh = 0;\r
 \r
                        while ((line = reader.readLine()) != null) {\r
-                               tokenize(line, tokens);\r
+                               MD5Tokenizer.tokenize(line, tokens);\r
                                if (tokens.size() == 0) continue;\r
 \r
                                //\r
@@ -85,7 +86,7 @@ public class MD5Loader {
                                if (tokens.get(0).equals("joints")) {\r
                                        for (int i = 0; i < model.baseSkeleton.numJoints; i++) {\r
                                                line = reader.readLine();\r
-                                               tokenize(line, tokens);\r
+                                               MD5Tokenizer.tokenize(line, tokens);\r
                                                if (tokens.size() == 0) {\r
                                                        i--;\r
                                                        continue;\r
@@ -128,7 +129,7 @@ public class MD5Loader {
 \r
                                        while (!line.contains("}")) {\r
                                                line = reader.readLine();\r
-                                               tokenize(line, tokens);\r
+                                               MD5Tokenizer.tokenize(line, tokens);\r
                                                if (tokens.size() == 0) continue;\r
 \r
                                                if (tokens.get(0).equals("shader")) {\r
@@ -203,15 +204,13 @@ public class MD5Loader {
                        float[] animFrameData = null;\r
 \r
                        while ((line = reader.readLine()) != null) {\r
-                               tokenize(line, tokens);\r
+                               MD5Tokenizer.tokenize(line, tokens);\r
                                if (tokens.size() == 0) continue;\r
-\r
                                if (tokens.get(0).equals("MD5Version")) {\r
                                        if (!tokens.get(1).equals("10"))\r
                                                throw new IllegalArgumentException("Not a valid MD5 animation file, version is " + tokens.get(1)\r
                                                        + ", expected 10");\r
-                               }\r
-\r
+                               }                               \r
                                if (tokens.get(0).equals("numFrames")) {\r
                                        int numFrames = parseInt(tokens.get(1));\r
                                        animation.frames = new MD5Joints[numFrames];\r
@@ -245,7 +244,7 @@ public class MD5Loader {
                                if (tokens.get(0).equals("hierarchy")) {\r
                                        for (int i = 0; i < jointInfos.length; i++) {\r
                                                line = reader.readLine();\r
-                                               tokenize(line, tokens);\r
+                                               MD5Tokenizer.tokenize(line, tokens);\r
                                                if (tokens.size() == 0 || tokens.get(0).equals("//")) {\r
                                                        i--;\r
                                                        continue;\r
@@ -264,7 +263,7 @@ public class MD5Loader {
                                if (tokens.get(0).equals("bounds")) {\r
                                        for (int i = 0; i < animation.bounds.length; i++) {\r
                                                line = reader.readLine();\r
-                                               tokenize(line, tokens);\r
+                                               MD5Tokenizer.tokenize(line, tokens);\r
                                                if (tokens.size() == 0) {\r
                                                        i--;\r
                                                        continue;\r
@@ -286,7 +285,7 @@ public class MD5Loader {
                                if (tokens.get(0).equals("baseframe")) {\r
                                        for (int i = 0; i < baseFrame.length; i++) {\r
                                                line = reader.readLine();\r
-                                               tokenize(line, tokens);\r
+                                               MD5Tokenizer.tokenize(line, tokens);\r
                                                if (tokens.size() == 0) {\r
                                                        i--;\r
                                                        continue;\r
@@ -311,19 +310,18 @@ public class MD5Loader {
 \r
                                        int i = 0;\r
                                        line = reader.readLine();\r
-                                       tokenize(line, tokens);\r
+                                       MD5Tokenizer.tokenize(line, tokens);\r
                                        while (tokens.get(0).equals("}") == false) {\r
                                                for (int j = 0; j < tokens.size(); j++)\r
                                                        animFrameData[i++] = parseFloat(tokens.get(j));\r
 \r
                                                line = reader.readLine();\r
-                                               tokenize(line, tokens);\r
+                                               MD5Tokenizer.tokenize(line, tokens);\r
                                        }\r
 \r
                                        buildFrameSkeleton(jointInfos, baseFrame, animFrameData, animation, frameIndex);\r
                                }\r
                        }\r
-\r
                        return animation;\r
                } catch (Exception ex) {\r
                        ex.printStackTrace();\r
@@ -470,14 +468,7 @@ public class MD5Loader {
                        }\r
                }\r
        }\r
-\r
-       private static void tokenize (String line, List<String> tokens) {\r
-               tokens.clear();\r
-               StringTokenizer tokenizer = new StringTokenizer(line);\r
-               while (tokenizer.hasMoreTokens())\r
-                       tokens.add(tokenizer.nextToken());\r
-       }\r
-\r
+       \r
        static class JointInfo {\r
                public String name;\r
                public int parent;\r
diff --git a/gdx/src/com/badlogic/gdx/graphics/g3d/loaders/md5/MD5Tokenizer.java b/gdx/src/com/badlogic/gdx/graphics/g3d/loaders/md5/MD5Tokenizer.java
new file mode 100644 (file)
index 0000000..7e87c9a
--- /dev/null
@@ -0,0 +1,20 @@
+package com.badlogic.gdx.graphics.g3d.loaders.md5;
+
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class MD5Tokenizer {
+       public static void tokenize(String line, List<String> tokens) {
+               tokens.clear();
+               String regex = "\"([^\"]*)\"|(\\S+)";
+               Matcher m = Pattern.compile(regex).matcher(line);
+               while (m.find()) {
+                       if (m.group(1) != null) {
+                               tokens.add(m.group(1));
+                       } else {
+                               tokens.add(m.group(2));
+                       }
+               }               
+       }
+}
\ No newline at end of file