package org.osm2world.core.target.jogl;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.osm2world.core.math.VectorXYZ;
import org.osm2world.core.math.VectorXZ;
import org.osm2world.core.target.common.Primitive;
import org.osm2world.core.target.common.Primitive.Type;
import org.osm2world.core.target.common.PrimitiveTarget;
import org.osm2world.core.target.common.RenderableToPrimitiveTarget;
import org.osm2world.core.target.common.material.Material;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
/**
* Storage for low-level rendering information (vertex and primitive data)
* that can be displayed using graphics APIs, e.g. OpenGL.
* Higher-level information, such as object coherence, OSM attributes
* or representations, isn't present in a PrimitiveBuffer.
*/
public class PrimitiveBuffer extends
PrimitiveTarget<RenderableToPrimitiveTarget> {
@Override
public Class<RenderableToPrimitiveTarget> getRenderableType() {
return RenderableToPrimitiveTarget.class;
}
@Override
public void render(RenderableToPrimitiveTarget renderable) {
renderable.renderTo(this);
}
private Multimap<Material, Primitive> primitiveMap = HashMultimap.create();
@Override
protected void drawPrimitive(Type type, Material material,
List<VectorXYZ> vertices, List<VectorXYZ> normals,
List<List<VectorXZ>> texCoordLists) {
primitiveMap.put(material,
new Primitive(type, vertices, normals, texCoordLists));
}
/**
* returns all materials used in the buffer
*/
public Set<Material> getMaterials() {
return primitiveMap.keySet();
}
/**
* returns all primitives that use a given material
*/
public Collection<Primitive> getPrimitives(Material material) {
return primitiveMap.get(material);
}
}