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