Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tiled output for obj #122

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions build.xml
Expand Up @@ -5,8 +5,8 @@
<property name="releaseVersion" value="noversion" />

<!-- classpath used for javadoc and javac, don't forget to manually update the jar manifest classpath! -->
<property name="classpath" value="lib/configuration/commons-collections-3.2.1.jar:lib/configuration/commons-configuration-1.6.jar:lib/configuration/commons-lang-2.6.jar:lib/configuration/commons-logging-1.1.1.jar:lib/jogl/gluegen-rt.jar:lib/jogl/gluegen-rt-natives-linux-amd64.jar:lib/jogl/gluegen-rt-natives-linux-i586.jar:lib/jogl/gluegen-rt-natives-macosx-universal.jar:lib/jogl/gluegen-rt-natives-windows-amd64.jar:lib/jogl/gluegen-rt-natives-windows-i586.jar:lib/jogl/jogl-all.jar:lib/jogl/jogl-all-natives-linux-amd64.jar:lib/jogl/jogl-all-natives-linux-i586.jar:lib/jogl/jogl-all-natives-macosx-universal.jar:lib/jogl/jogl-all-natives-windows-amd64.jar:lib/jogl/jogl-all-natives-windows-i586.jar:lib/jewelcli/jewelcli-0.6.jar:lib/jts/jts-1.11.jar:lib/osmosis/commons-compress-1.2.jar:lib/osmosis/osmosis-core-0.41.jar:lib/osmosis/osmosis-pbf-0.41.jar:lib/osmosis/osmosis-xml-0.41.jar:lib/osmosis/osmpbf-1.1.1-754a33af.jar:lib/osmosis/protobuf-java-2.4.1.jar:lib/osmosis/xercesImpl-2.9.1.jar:lib/javaproj/javaproj-1.0.6.jar:lib/guava/guava-r08.jar:lib/trove/trove-111118193120.jar:lib/poly2tri/poly2tri-core-0.1.1-SNAPSHOT.jar:lib/slf4j/slf4j-api-1.7.5.jar:lib/slf4j/slf4j-simple-1.7.5.jar:lib/commons/commons-math3-3.0.jar:lib/javailp/javailp-1.2a.jar:lib/lp_solve/lpsolve55j.jar:lib/pngj/pngj-2.0.0.jar:resources/" />
<property name="manifest-cp" value=". lib/configuration/commons-collections-3.2.1.jar lib/configuration/commons-configuration-1.6.jar lib/configuration/commons-lang-2.6.jar lib/configuration/commons-logging-1.1.1.jar lib/jogl/gluegen-rt.jar lib/jogl/gluegen-rt-natives-linux-amd64.jar lib/jogl/gluegen-rt-natives-linux-i586.jar lib/jogl/gluegen-rt-natives-macosx-universal.jar lib/jogl/gluegen-rt-natives-windows-amd64.jar lib/jogl/gluegen-rt-natives-windows-i586.jar lib/jogl/jogl-all.jar lib/jogl/jogl-all-natives-linux-amd64.jar lib/jogl/jogl-all-natives-linux-i586.jar lib/jogl/jogl-all-natives-macosx-universal.jar lib/jogl/jogl-all-natives-windows-amd64.jar lib/jogl/jogl-all-natives-windows-i586.jar lib/jewelcli/jewelcli-0.6.jar lib/jts/jts-1.11.jar lib/osmosis/commons-compress-1.2.jar lib/osmosis/osmosis-core-0.41.jar lib/osmosis/osmosis-pbf-0.41.jar lib/osmosis/osmosis-xml-0.41.jar lib/osmosis/osmpbf-1.1.1-754a33af.jar lib/osmosis/protobuf-java-2.4.1.jar lib/osmosis/xercesImpl-2.9.1.jar lib/javaproj/javaproj-1.0.6.jar lib/guava/guava-r08.jar lib/trove/trove-111118193120.jar lib/poly2tri/poly2tri-core-0.1.1-SNAPSHOT.jar lib/slf4j/slf4j-api-1.7.5.jar lib/slf4j/slf4j-simple-1.7.5.jar lib/commons/commons-math3-3.0.jar lib/javailp/javailp-1.2a.jar lib/lp_solve/lpsolve55j.jar lib/pngj/pngj-2.0.0.jar resources/" />
<property name="classpath" value="lib/configuration/commons-collections-3.2.1.jar:lib/configuration/commons-configuration-1.6.jar:lib/configuration/commons-lang-2.6.jar:lib/configuration/commons-logging-1.1.1.jar:lib/jogl/gluegen-rt.jar:lib/jogl/gluegen-rt-natives-linux-amd64.jar:lib/jogl/gluegen-rt-natives-linux-i586.jar:lib/jogl/gluegen-rt-natives-macosx-universal.jar:lib/jogl/gluegen-rt-natives-windows-amd64.jar:lib/jogl/gluegen-rt-natives-windows-i586.jar:lib/jogl/jogl-all.jar:lib/jogl/jogl-all-natives-linux-amd64.jar:lib/jogl/jogl-all-natives-linux-i586.jar:lib/jogl/jogl-all-natives-macosx-universal.jar:lib/jogl/jogl-all-natives-windows-amd64.jar:lib/jogl/jogl-all-natives-windows-i586.jar:lib/jewelcli/jewelcli-0.6.jar:lib/jts/jts-1.11.jar:lib/osmosis/commons-compress-1.2.jar:lib/osmosis/osmosis-core-0.41.jar:lib/osmosis/osmosis-pbf-0.41.jar:lib/osmosis/osmosis-xml-0.41.jar:lib/osmosis/osmpbf-1.1.1-754a33af.jar:lib/osmosis/protobuf-java-2.4.1.jar:lib/osmosis/xercesImpl-2.9.1.jar:lib/javaproj/javaproj-1.0.6.jar:lib/guava/guava-r08.jar:lib/trove/trove-111118193120.jar:lib/poly2tri/poly2tri-core-0.1.1-SNAPSHOT.jar:lib/slf4j/slf4j-api-1.7.5.jar:lib/slf4j/slf4j-simple-1.7.5.jar:lib/commons/commons-math3-3.0.jar:lib/javailp/javailp-1.2a.jar:lib/lp_solve/lpsolve55j.jar:lib/pngj/pngj-2.0.0.jar:lib/gson/gson-2.8.0.jar:lib/fluent-json/fluent-json-2.0.3.jar:resources/" />
<property name="manifest-cp" value=". lib/configuration/commons-collections-3.2.1.jar lib/configuration/commons-configuration-1.6.jar lib/configuration/commons-lang-2.6.jar lib/configuration/commons-logging-1.1.1.jar lib/jogl/gluegen-rt.jar lib/jogl/gluegen-rt-natives-linux-amd64.jar lib/jogl/gluegen-rt-natives-linux-i586.jar lib/jogl/gluegen-rt-natives-macosx-universal.jar lib/jogl/gluegen-rt-natives-windows-amd64.jar lib/jogl/gluegen-rt-natives-windows-i586.jar lib/jogl/jogl-all.jar lib/jogl/jogl-all-natives-linux-amd64.jar lib/jogl/jogl-all-natives-linux-i586.jar lib/jogl/jogl-all-natives-macosx-universal.jar lib/jogl/jogl-all-natives-windows-amd64.jar lib/jogl/jogl-all-natives-windows-i586.jar lib/jewelcli/jewelcli-0.6.jar lib/jts/jts-1.11.jar lib/osmosis/commons-compress-1.2.jar lib/osmosis/osmosis-core-0.41.jar lib/osmosis/osmosis-pbf-0.41.jar lib/osmosis/osmosis-xml-0.41.jar lib/osmosis/osmpbf-1.1.1-754a33af.jar lib/osmosis/protobuf-java-2.4.1.jar lib/osmosis/xercesImpl-2.9.1.jar lib/javaproj/javaproj-1.0.6.jar lib/guava/guava-r08.jar lib/trove/trove-111118193120.jar lib/poly2tri/poly2tri-core-0.1.1-SNAPSHOT.jar lib/slf4j/slf4j-api-1.7.5.jar lib/slf4j/slf4j-simple-1.7.5.jar lib/commons/commons-math3-3.0.jar lib/javailp/javailp-1.2a.jar lib/lp_solve/lpsolve55j.jar lib/pngj/pngj-2.0.0.jar lib/gson/gson-2.8.0.jar lib/fluent-json/fluent-json-2.0.3.jar resources/" />

<target name="help">
<echo message=" TARGETS:"/>
Expand Down
Binary file added lib/fluent-json/fluent-json-2.0.3.jar
Binary file not shown.
Binary file added lib/gson/gson-2.8.0.jar
Binary file not shown.
12 changes: 11 additions & 1 deletion src/org/osm2world/console/Output.java
Expand Up @@ -195,7 +195,17 @@ public static void output(Configuration config,
case OBJ:
Integer primitiveThresholdOBJ =
config.getInteger("primitiveThresholdOBJ", null);
if (primitiveThresholdOBJ == null) {

Integer tilesZoomLevel = config.getInteger("tilesZoomOBJ", null);
String tilesetPath = config.getString("cesiumTileset", null);

if (tilesZoomLevel != null) {

ObjWriter.writeObjFileTiled(outputFile,
results.getMapData(), results.getMapProjection(),
camera, projection, tilesZoomLevel, tilesetPath);

} else if (primitiveThresholdOBJ == null) {
boolean underground = config.getBoolean("renderUnderground", true);

ObjWriter.writeObjFile(outputFile,
Expand Down
14 changes: 14 additions & 0 deletions src/org/osm2world/core/map_data/data/MapData.java
@@ -1,6 +1,8 @@
package org.osm2world.core.map_data.data;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.osm2world.core.math.AxisAlignedBoundingBoxXZ;
Expand Down Expand Up @@ -39,6 +41,18 @@ public MapData(List<MapNode> mapNodes, List<MapWaySegment> mapWaySegments,

}

public void sortMapNodes(Comparator<MapNode> comparator) {
Collections.sort(mapNodes, comparator);
}

public void sortMapWaySegments(Comparator<MapWaySegment> comparator) {
Collections.sort(mapWaySegments, comparator);
}

public void sortMapAreas(Comparator<MapArea> comparator) {
Collections.sort(mapAreas, comparator);
}

private void calculateDataBoundary() {

double minX = Double.POSITIVE_INFINITY;
Expand Down
75 changes: 75 additions & 0 deletions src/org/osm2world/core/math/WGS84Util.java
@@ -0,0 +1,75 @@
package org.osm2world.core.math;

import org.osm2world.core.map_data.creation.LatLon;

public class WGS84Util {

private static final double WGS84_A = 6378137.0;
private static final double WGS84_B = 6356752.3142451793;

private static final VectorXYZ oneOverRadiiSquared = new VectorXYZ(
1.0 / (WGS84_A * WGS84_A),
1.0 / (WGS84_A * WGS84_A),
1.0 / (WGS84_B * WGS84_B));

private static final VectorXYZ wgs84RadiiSquared =
new VectorXYZ(WGS84_A * WGS84_A, WGS84_A * WGS84_A, WGS84_B * WGS84_B);

public static VectorXYZ cartesianFromLatLon(LatLon origin, double height) {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was taken from Cesium

double latitude = Math.toRadians(origin.lat);
double longitude = Math.toRadians(origin.lon);
VectorXYZ radiiSquared = wgs84RadiiSquared;

double cosLatitude = Math.cos(latitude);
VectorXYZ scratchN = new VectorXYZ(
cosLatitude * Math.cos(longitude),
cosLatitude * Math.sin(longitude),
Math.sin(latitude));

scratchN = scratchN.normalize();

VectorXYZ scratchK = mulByComponents(radiiSquared, scratchN);
double gamma = Math.sqrt(scratchN.dot(scratchK));
scratchK = scratchK.mult(1.0 / gamma);
scratchN = scratchN.mult(height);

return scratchK.add(scratchN);
}

public static double[] eastNorthUpToFixedFrame(VectorXYZ cartesian) {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was taken from Cesium


VectorXYZ normal = geodeticSurfaceNormal(cartesian);
VectorXYZ tangent = new VectorXYZ(-cartesian.y, cartesian.x, 0.0).normalize();
VectorXYZ bitangent = normal.cross(tangent);

// Matrix 4x4 by columns
return new double[] {
tangent.x,
tangent.y,
tangent.z,
0.0,
bitangent.x,
bitangent.y,
bitangent.z,
0.0,
normal.x,
normal.y,
normal.z,
0.0,
cartesian.x,
cartesian.y,
cartesian.z,
1.0
};
}

public static VectorXYZ geodeticSurfaceNormal(VectorXYZ cartesian) {
VectorXYZ mulByComponents = mulByComponents(cartesian, oneOverRadiiSquared);
return mulByComponents.normalize();
}

public static VectorXYZ mulByComponents(VectorXYZ a, VectorXYZ b) {
return new VectorXYZ(a.x * b.x, a.y * b.y, a.z * b.z);
}

}
48 changes: 48 additions & 0 deletions src/org/osm2world/core/target/BuildingsByHeightComparator.java
@@ -0,0 +1,48 @@
package org.osm2world.core.target;

import java.util.Comparator;

import org.osm2world.core.map_data.data.MapArea;
import org.osm2world.core.world.data.WorldObject;
import org.osm2world.core.world.modules.BuildingModule.Building;
import org.osm2world.core.world.modules.BuildingModule.BuildingPart;
import org.osm2world.core.world.modules.BuildingModule.BuildingPart.Roof;

final class BuildingsByHeightComparator implements Comparator<MapArea> {

public double getMaxEle(Building b) {
double maxEle = 0.0;
if (b != null) {
for (BuildingPart part : b.getParts()) {
Roof roof = part.getRoof();
if (roof != null) {
maxEle = Math.max(maxEle, roof.getMaxRoofEle());
}
}
double areaAsEle = b.getArea().getOuterPolygon().getArea() / 200.0 * 4.0;
maxEle += areaAsEle;
}
return maxEle;
}

@Override
public int compare(MapArea o1, MapArea o2) {
Building b1 = null;
Building b2 = null;

for(WorldObject wo1 : o1.getRepresentations()) {
if (wo1 instanceof Building) {
b1 = (Building) wo1;
}
}

for(WorldObject wo2 : o2.getRepresentations()) {
if (wo2 instanceof Building) {
b2 = (Building) wo2;
}
}

// From max to min
return Double.compare(getMaxEle(b2), getMaxEle(b1));
}
}
12 changes: 12 additions & 0 deletions src/org/osm2world/core/target/TargetProvider.java
@@ -0,0 +1,12 @@
package org.osm2world.core.target;

import org.osm2world.core.map_data.data.MapElement;
import org.osm2world.core.target.common.RenderableToPrimitiveTarget;

public interface TargetProvider<R extends RenderableToPrimitiveTarget> {

public Target<R> getTarget(MapElement e);

public void close();

}
34 changes: 34 additions & 0 deletions src/org/osm2world/core/target/TargetUtil.java
Expand Up @@ -81,6 +81,40 @@ public static <R extends RenderableToPrimitiveTarget> void renderWorldObjects(

}

/**
* render all world objects to a target instances
* that are compatible with that target type.
* World objects are added to a target until the number of primitives
* reaches the primitive threshold, then the next target is retrieved
* from the iterator.
*/
public static <R extends RenderableToPrimitiveTarget> void renderWorldObjectsTiles(
final TargetProvider<R> targetProvider, final MapData mapData) {

final StatisticsTarget primitiveCounter = new StatisticsTarget();

mapData.sortMapAreas(new BuildingsByHeightComparator());

iterate(mapData.getMapElements(), new Operation<MapElement>() {

@Override public void perform(MapElement e) {

Target<R> currentTarget = targetProvider.getTarget(e);

for (WorldObject r : e.getRepresentations()) {

renderObject(primitiveCounter, r);

renderObject(currentTarget, r);

}
}

});

primitiveCounter.clear();
}

/**
* renders any object to a target instance
* if it is a renderable compatible with that target type.
Expand Down