package org.sunflow.core; import org.sunflow.math.BoundingBox; import org.sunflow.math.Matrix4; /** * This class represents an object made up of many primitives. */ public interface PrimitiveList extends RenderObject { /** * Compute a bounding box of this object in world space, using the specified * object-to-world transformation matrix. The bounds should be as exact as * possible, if they are difficult or expensive to compute exactly, you may * use {@link Matrix4#transform(BoundingBox)}. If the matrix is * <code>null</code> no transformation is needed, and object space is * equivalent to world space. * * @param o2w object to world transformation matrix * @return object bounding box in world space */ public BoundingBox getWorldBounds(Matrix4 o2w); /** * Returns the number of individual primtives in this aggregate object. * * @return number of primitives */ public int getNumPrimitives(); /** * Retrieve the bounding box component of a particular primitive in object * space. Even indexes get minimum values, while odd indexes get the maximum * values for each axis. * * @param primID primitive index * @param i bounding box side index * @return value of the request bound */ public float getPrimitiveBound(int primID, int i); /** * Intersect the specified primitive in local space. * * @param r ray in the object's local space * @param primID primitive index to intersect * @param state intersection state * @see Ray#setMax(float) * @see IntersectionState#setIntersection(int, float, float) */ public void intersectPrimitive(Ray r, int primID, IntersectionState state); /** * Prepare the specified {@link ShadingState} by setting all of its internal * parameters. * * @param state shading state to fill in */ public void prepareShadingState(ShadingState state); /** * Create a new {@link PrimitiveList} object suitable for baking lightmaps. * This means a set of primitives laid out in the unit square UV space. This * method is optional, objects which do not support it should simply return * <code>null</code>. * * @return a list of baking primitives */ public PrimitiveList getBakingPrimitives(); }