package org.sunflow.core; import org.sunflow.image.Color; import org.sunflow.math.BoundingBox; import org.sunflow.math.Vector3; /** * Describes an object which can store photons. */ public interface PhotonStore { /** * Number of photons to emit from this surface. * * @return number of photons */ int numEmit(); /** * Initialize this object for the specified scene size. * * @param options * @param sceneBounds scene bounding box */ void prepare(Options options, BoundingBox sceneBounds); /** * Store the specified photon. * * @param state shading state * @param dir photon direction * @param power photon power * @param diffuse diffuse color at the hit point */ void store(ShadingState state, Vector3 dir, Color power, Color diffuse); /** * Initialize the map after all photons have been stored. This can be used * to balance a kd-tree based photon map for example. */ void init(); /** * Allow photons reflected diffusely? * * @return true if diffuse bounces should be traced */ boolean allowDiffuseBounced(); /** * Allow specularly reflected photons? * * @return true if specular reflection bounces should be traced */ boolean allowReflectionBounced(); /** * Allow refracted photons? * * @return true if refracted bounces should be traced */ boolean allowRefractionBounced(); }