/* Copyright (c) 2015 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.primitive;
import java.util.Collection;
import se.llbit.chunky.resources.Texture;
import se.llbit.chunky.world.Material;
import se.llbit.chunky.world.material.TextureMaterial;
import se.llbit.math.AABB;
import se.llbit.math.Ray;
import se.llbit.math.Transform;
import se.llbit.math.Vector2;
import se.llbit.math.Vector3;
import se.llbit.math.Vector4;
/**
* Box primitive.
*
* @author Jesper Öqvist <jesper@llbit.se>
*/
public class Box implements Primitive {
private final double x0;
private final double x1;
private final double y0;
private final double y1;
private final double z0;
private final double z1;
private final Vector3 c000;
private final Vector3 c001;
private final Vector3 c010;
private final Vector3 c011;
private final Vector3 c100;
private final Vector3 c101;
private final Vector3 c110;
private final Vector3 c111;
/**
* Construct a new axis-aligned Box with given bounds
*/
public Box(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax) {
x0 = xmin;
x1 = xmax;
y0 = ymin;
y1 = ymax;
z0 = zmin;
z1 = zmax;
c000 = new Vector3(x0, y0, z0);
c001 = new Vector3(x0, y0, z1);
c010 = new Vector3(x0, y1, z0);
c011 = new Vector3(x0, y1, z1);
c100 = new Vector3(x1, y0, z0);
c101 = new Vector3(x1, y0, z1);
c110 = new Vector3(x1, y1, z0);
c111 = new Vector3(x1, y1, z1);
}
@Override public AABB bounds() {
return new AABB(x0, x1, y0, y1, z0, z1);
}
public void transform(Transform t) {
t.apply(c000);
t.apply(c001);
t.apply(c010);
t.apply(c011);
t.apply(c100);
t.apply(c101);
t.apply(c110);
t.apply(c111);
}
public void addFrontFaces(Collection<Primitive> primitives, Texture texture, Vector4 uv) {
Material material = new TextureMaterial(texture);
primitives.add(
new TexturedTriangle(c000, c100, c010, new Vector2(uv.y, uv.z), new Vector2(uv.x, uv.z),
new Vector2(uv.y, uv.w), material));
primitives.add(
new TexturedTriangle(c100, c110, c010, new Vector2(uv.x, uv.z), new Vector2(uv.x, uv.w),
new Vector2(uv.y, uv.w), material));
}
public void addBackFaces(Collection<Primitive> primitives, Texture texture, Vector4 uv) {
Material material = new TextureMaterial(texture);
primitives.add(
new TexturedTriangle(c101, c001, c111, new Vector2(uv.x, uv.z), new Vector2(uv.y, uv.z),
new Vector2(uv.x, uv.w), material));
primitives.add(
new TexturedTriangle(c001, c011, c111, new Vector2(uv.y, uv.z), new Vector2(uv.y, uv.w),
new Vector2(uv.x, uv.w), material));
}
public void addLeftFaces(Collection<Primitive> primitives, Texture texture, Vector4 uv) {
Material material = new TextureMaterial(texture);
primitives.add(
new TexturedTriangle(c001, c000, c011, new Vector2(uv.y, uv.z), new Vector2(uv.x, uv.z),
new Vector2(uv.y, uv.w), material));
primitives.add(
new TexturedTriangle(c000, c010, c011, new Vector2(uv.x, uv.z), new Vector2(uv.x, uv.w),
new Vector2(uv.y, uv.w), material));
}
public void addRightFaces(Collection<Primitive> primitives, Texture texture, Vector4 uv) {
Material material = new TextureMaterial(texture);
primitives.add(
new TexturedTriangle(c100, c101, c110, new Vector2(uv.y, uv.z), new Vector2(uv.x, uv.z),
new Vector2(uv.y, uv.w), material));
primitives.add(
new TexturedTriangle(c101, c111, c110, new Vector2(uv.x, uv.z), new Vector2(uv.x, uv.w),
new Vector2(uv.y, uv.w), material));
}
public void addTopFaces(Collection<Primitive> primitives, Texture texture, Vector4 uv) {
Material material = new TextureMaterial(texture);
primitives.add(
new TexturedTriangle(c011, c110, c111, new Vector2(uv.y, uv.w), new Vector2(uv.x, uv.z),
new Vector2(uv.x, uv.w), material));
primitives.add(
new TexturedTriangle(c011, c010, c110, new Vector2(uv.y, uv.w), new Vector2(uv.y, uv.z),
new Vector2(uv.x, uv.z), material));
}
public void addBottomFaces(Collection<Primitive> primitives, Texture texture, Vector4 uv) {
Material material = new TextureMaterial(texture);
primitives.add(
new TexturedTriangle(c000, c001, c100, new Vector2(uv.x, uv.z), new Vector2(uv.x, uv.w),
new Vector2(uv.y, uv.z), material));
primitives.add(
new TexturedTriangle(c001, c101, c100, new Vector2(uv.x, uv.w), new Vector2(uv.y, uv.w),
new Vector2(uv.y, uv.z), material));
}
@Override public boolean intersect(Ray ray) {
// TODO Auto-generated method stub
return false;
}
}