package org.osm2world.core.target.common.material;
import static java.util.Collections.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.osm2world.core.math.TriangleXYZ;
import org.osm2world.core.math.VectorXYZ;
import org.osm2world.core.math.VectorXZ;
import org.osm2world.core.target.common.TextureData;
/**
* utility class for texture coordinate calculation
*/
public final class TexCoordUtil {
/** prevents instantiation */
private TexCoordUtil() {}
/**
* calculates the texture coordinate lists based on the
* {@link TexCoordFunction} associated with each {@link TextureData} layer
*/
public static final List<List<VectorXZ>> texCoordLists(
List<VectorXYZ> vs, Material material,
TexCoordFunction defaultCoordFunction) {
List<TextureData> textureDataList = material.getTextureDataList();
if (textureDataList.size() == 0) {
return emptyList();
} else if (textureDataList.size() == 1) {
TextureData textureData = textureDataList.get(0);
TexCoordFunction coordFunction = textureData.coordFunction;
if (coordFunction == null) { coordFunction = defaultCoordFunction; }
return singletonList(coordFunction.apply(vs, textureData));
} else {
List<List<VectorXZ>> result = new ArrayList<List<VectorXZ>>();
for (TextureData textureData : textureDataList) {
TexCoordFunction coordFunction = textureData.coordFunction;
if (coordFunction == null) { coordFunction = defaultCoordFunction; }
result.add(coordFunction.apply(vs, textureData));
}
return result;
}
}
/**
* equivalent of {@link #texCoordLists(List, Material, TexCoordFunction)}
* for a collection of triangle objects.
*/
public static final List<List<VectorXZ>> triangleTexCoordLists(
Collection<TriangleXYZ> triangles, Material material,
TexCoordFunction defaultCoordFunction) {
List<VectorXYZ> vs = new ArrayList<VectorXYZ>(triangles.size() * 3);
for (TriangleXYZ triangle : triangles) {
vs.add(triangle.v1);
vs.add(triangle.v2);
vs.add(triangle.v3);
}
return texCoordLists(vs, material, defaultCoordFunction);
}
}