package org.sunflow.core; /** * This class is used to store ray/object intersections. It also provides * additional data to assist {@link AccelerationStructure} objects with * traversal. */ public final class IntersectionState { private static final int MAX_STACK_SIZE = 64; float time; float u, v, w; Instance instance; int id; private final StackNode[][] stacks = new StackNode[2][MAX_STACK_SIZE]; Instance current; long numEyeRays; long numShadowRays; long numReflectionRays; long numGlossyRays; long numRefractionRays; long numRays; /** * Traversal stack node, helps with tree-based {@link AccelerationStructure} * traversal. */ public static final class StackNode { public int node; public float near; public float far; } /** * Initializes all traversal stacks. */ public IntersectionState() { for (StackNode[] stack : stacks) { for (int j = 0; j < stack.length; j++) { stack[j] = new StackNode(); } } } /** * Returns the time at which the intersection should be calculated. This * will be constant for a given ray-tree. This value is guarenteed to be * between the camera's shutter open and shutter close time. * * @return time value */ public float getTime() { return time; } /** * Get stack object for tree based {@link AccelerationStructure}s. * * @return array of stack nodes */ public final StackNode[] getStack() { return current == null ? stacks[0] : stacks[1]; } /** * Checks to see if a hit has been recorded. * * @return true if a hit has been recorded, false * otherwise */ public final boolean hit() { return instance != null; } /** * Record an intersection with the specified primitive id. The parent object * is assumed to be the current instance. The u and v parameters are used to * pinpoint the location on the surface if needed. * * @param id primitive id of the intersected object */ public final void setIntersection(int id) { instance = current; this.id = id; } /** * Record an intersection with the specified primitive id. The parent object * is assumed to be the current instance. The u and v parameters are used to * pinpoint the location on the surface if needed. * * @param id primitive id of the intersected object * @param u u surface paramater of the intersection point * @param v v surface parameter of the intersection point */ public final void setIntersection(int id, float u, float v) { instance = current; this.id = id; this.u = u; this.v = v; } /** * Record an intersection with the specified primitive id.The parent object is assumed to be the current instance. The u and v parameters are used to pinpoint the location on the surface if needed. * * @param id primitive id of the intersected object * @param u u surface paramater of the intersection point * @param v v surface parameter of the intersection point * @param w */ public final void setIntersection(int id, float u, float v, float w) { instance = current; this.id = id; this.u = u; this.v = v; this.w = w; } }