package edu.stanford.rsl.conrad.rendering; import java.util.ArrayList; import java.util.Stack; import edu.stanford.rsl.conrad.geometry.shapes.simple.Edge; import edu.stanford.rsl.conrad.geometry.shapes.simple.ProjectPointToLineComparator; import edu.stanford.rsl.conrad.physics.PhysicalObject; import edu.stanford.rsl.conrad.physics.PhysicalPoint; public class SimpleRayTracer extends AbstractRayTracer { public SimpleRayTracer () { comparator = new ProjectPointToLineComparator(); } @Override protected ArrayList<PhysicalObject> computeMaterialIntersectionSegments(PhysicalPoint [] rayList){ ArrayList<PhysicalObject> segments = new ArrayList<PhysicalObject>(); // determine ray segments Stack<PhysicalObject> materialStack = new Stack<PhysicalObject>(); materialStack.push(rayList[0].getObject()); for (int k=1; k < rayList.length;k++){ PhysicalObject obj = new PhysicalObject(); Edge edge = new Edge(rayList[k-1], rayList[k]); obj.setShape(edge); if(materialStack.isEmpty()) { obj.setMaterial(scene.getBackgroundMaterial()); obj.setNameString("Background"); } else { PhysicalObject current = materialStack.peek(); obj.setMaterial(current.getMaterial()); obj.setNameString(current.getNameString()); } segments.add(obj); PhysicalObject nextObject = rayList[k].getObject(); if (materialStack.contains(nextObject)){ materialStack.remove(nextObject); } else { materialStack.push(nextObject); } } return segments; } } /* * Copyright (C) 2010-2014 Andreas Maier * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */