/* Copyright (c) 2012 Jesper Öqvist <jesper@llbit.se> * * This file is part of Chunky. * * Chunky is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Chunky is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with Chunky. If not, see <http://www.gnu.org/licenses/>. */ package se.llbit.math; /** * A double-sided quad * * @author Jesper Öqvist <jesper@llbit.se> */ public class DoubleSidedQuad extends Quad { private DoubleSidedQuad(Quad other, Transform t) { super(other, t); } public DoubleSidedQuad(Vector3 p1, Vector3 p2, Vector3 p3, Vector4 uv) { super(p1, p2, p3, uv); } @Override public boolean intersect(Ray ray) { double ix = ray.o.x - QuickMath.floor(ray.o.x + ray.d.x * Ray.OFFSET); double iy = ray.o.y - QuickMath.floor(ray.o.y + ray.d.y * Ray.OFFSET); double iz = ray.o.z - QuickMath.floor(ray.o.z + ray.d.z * Ray.OFFSET); double denom = ray.d.dot(n); double u, v; if (QuickMath.abs(denom) > Ray.EPSILON) { double t = -(ix * n.x + iy * n.y + iz * n.z + d) / denom; if (t > -Ray.EPSILON && t < ray.t) { ix = ix + ray.d.x * t - o.x; iy = iy + ray.d.y * t - o.y; iz = iz + ray.d.z * t - o.z; u = ix * xv.x + iy * xv.y + iz * xv.z; u *= xvl; v = ix * yv.x + iy * yv.y + iz * yv.z; v *= yvl; if (u >= 0 && u <= 1 && v >= 0 && v <= 1) { ray.u = uv.x + u * uv.y; ray.v = uv.z + v * uv.w; ray.tNext = t; return true; } } } return false; } /** * Build a transformed copy of this quad. */ @Override public DoubleSidedQuad transform(Transform transform) { return new DoubleSidedQuad(this, transform); } }