r2174 - tools/ObjToMap/objtomap

savagex at icculus.org savagex at icculus.org
Thu Feb 8 07:46:43 EST 2007


Author: savagex
Date: 2007-02-08 07:46:43 -0500 (Thu, 08 Feb 2007)
New Revision: 2174

Modified:
   tools/ObjToMap/objtomap/Configuration.java
   tools/ObjToMap/objtomap/ObjToMap.java
Log:
generate nicer maps for simple terrain (no caves etc. - tested by 
looking for faces with a >= 90.0 angle against the XY plane)


Modified: tools/ObjToMap/objtomap/Configuration.java
===================================================================
--- tools/ObjToMap/objtomap/Configuration.java	2007-02-07 18:20:36 UTC (rev 2173)
+++ tools/ObjToMap/objtomap/Configuration.java	2007-02-08 12:46:43 UTC (rev 2174)
@@ -5,11 +5,12 @@
 
 public class Configuration {
     
-    public double brush_thickness, scale, texture_scale;
-    public boolean detail, autotexture;
+    public double brush_thickness, scale, texture_scale, minz;
+    public boolean detail, autotexture, simpleterrain;
     public String objfile, mapfile;
     public Vector autotexturing;
     
+    
     /** Creates a new instance of Configuration */
     public Configuration() {
         brush_thickness = 4.0;

Modified: tools/ObjToMap/objtomap/ObjToMap.java
===================================================================
--- tools/ObjToMap/objtomap/ObjToMap.java	2007-02-07 18:20:36 UTC (rev 2173)
+++ tools/ObjToMap/objtomap/ObjToMap.java	2007-02-08 12:46:43 UTC (rev 2174)
@@ -29,7 +29,10 @@
         points = new Vector();
         faces = new Vector();
         double scale = config.scale;
+        config.simpleterrain = true;
+        config.minz = Double.MAX_VALUE;
         
+        
         BufferedReader in = null;
         try {
             in = new BufferedReader(new FileReader(config.objfile));
@@ -54,6 +57,8 @@
                     p.z = Double.parseDouble(tokens[2]) * scale;
                     points.add(p);
                     
+                    if(p.z < config.minz)
+                        config.minz = p.z;
                     
                 } else if(tokens[0].equals("f")) {
                     // faces
@@ -67,10 +72,15 @@
                         
                         Face f = new Face();
                         f.material = currentmat;
-                        f.p1 = (Vector3D)points.get(Integer.parseInt(facetokens1[0]) - 1);
-                        f.p2 = (Vector3D)points.get(Integer.parseInt(facetokens2[0]) - 1);
-                        f.p3 = (Vector3D)points.get(Integer.parseInt(facetokens3[0]) - 1);
+                        Vector3D p1, p2, p3;
+                        p1 = (Vector3D)points.get(Integer.parseInt(facetokens1[0]) - 1);
+                        p2 = (Vector3D)points.get(Integer.parseInt(facetokens2[0]) - 1);
+                        p3 = (Vector3D)points.get(Integer.parseInt(facetokens3[0]) - 1);
                         
+                        f.setPoints(p1, p2, p3);
+                        if(f.getXYangle() >= 90.0)
+                            config.simpleterrain = false;
+                        
                         faces.add(f);
                         
                     } else if(tokens.length == 5) {
@@ -80,19 +90,30 @@
                         String[] facetokens3 = tokens[3].split("/");
                         String[] facetokens4 = tokens[4].split("/");
                         
+                        Vector3D p1, p2, p3;
                         
                         Face f1 = new Face();
                         f1.material = currentmat;
-                        f1.p1 = (Vector3D)points.get(Integer.parseInt(facetokens1[0]) - 1);
-                        f1.p2 = (Vector3D)points.get(Integer.parseInt(facetokens2[0]) - 1);
-                        f1.p3 = (Vector3D)points.get(Integer.parseInt(facetokens3[0]) - 1);
+                        p1 = (Vector3D)points.get(Integer.parseInt(facetokens1[0]) - 1);
+                        p2 = (Vector3D)points.get(Integer.parseInt(facetokens2[0]) - 1);
+                        p3 = (Vector3D)points.get(Integer.parseInt(facetokens3[0]) - 1);
+                        f1.setPoints(p1, p2, p3);
+                        
+                        if(f1.getXYangle() >= 90.0)
+                            config.simpleterrain = false;
+                        
                         faces.add(f1);
                         
                         Face f2 = new Face();
                         f2.material = currentmat;
-                        f2.p1 = (Vector3D)points.get(Integer.parseInt(facetokens1[0]) - 1);
-                        f2.p2 = (Vector3D)points.get(Integer.parseInt(facetokens3[0]) - 1);
-                        f2.p3 = (Vector3D)points.get(Integer.parseInt(facetokens4[0]) - 1);
+                        p1 = (Vector3D)points.get(Integer.parseInt(facetokens1[0]) - 1);
+                        p2 = (Vector3D)points.get(Integer.parseInt(facetokens3[0]) - 1);
+                        p3 = (Vector3D)points.get(Integer.parseInt(facetokens4[0]) - 1);
+                        f2.setPoints(p1, p2, p3);
+                        
+                        if(f2.getXYangle() >= 90.0)
+                            config.simpleterrain = false;
+                        
                         faces.add(f2);
                     }
                 } else if(tokens[0].equals("usemtl")) {
@@ -191,20 +212,38 @@
     
     
     private class Face {
-        public Vector3D p1, p2, p3;
+        private Vector3D p1, p2, p3, normal;
+        private double angle_xy = 0.0;
         public String material;
         
-        public String generateBrush() {
-            String result = "{\n";
+        public void setPoints(Vector3D p1, Vector3D p2, Vector3D p3) {
+            this.p1 = p1;
+            this.p2 = p2;
+            this.p3 = p3;
             
+            computeNormal();
+            computeXYangle();
+        }
+        
+        public double getXYangle() {
+            return angle_xy;
+        }
+        
+        private void computeNormal() {
             Vector3D vector1 = p1.substract(p2);
             Vector3D vector2 = p1.substract(p3);
             
-            Vector3D normal = vector1.crossproduct(vector2);
+            normal = vector1.crossproduct(vector2);
             normal.normalize();
-            
+        }
+        
+        private void computeXYangle() {
             Vector3D normal_xy = new Vector3D(0.0, 0.0, 1.0);
-            double angle_xy = Math.acos(normal.dotproduct(normal_xy)) / (2 * Math.PI) * 360.0;
+            angle_xy = Math.acos(normal.dotproduct(normal_xy)) / (2 * Math.PI) * 360.0;
+        }
+        
+        public String generateBrush() {
+            String result = "{\n";
             
             // this looks like a floor, extrude along the z-axis
             if(angle_xy < 70.0) {
@@ -217,9 +256,17 @@
             
             Vector3D p1_, p2_, p3_;
             
-            p1_ = p1.substract(normal);
-            p2_ = p2.substract(normal);
-            p3_ = p3.substract(normal);
+            if(!config.simpleterrain) {
+                p1_ = p1.substract(normal);
+                p2_ = p2.substract(normal);
+                p3_ = p3.substract(normal);
+            } else {
+                double min = config.minz;
+                min -= 16.0;
+                p1_ = new Vector3D(p1.x, p1.y, min);
+                p2_ = new Vector3D(p2.x, p2.y, min);
+                p3_ = new Vector3D(p3.x, p3.y, min);
+            }
             
             String mat = material;
             




More information about the nexuiz-commits mailing list