package framework.view3D; import java.util.ArrayList; import java3d.Box; import java3d.Cone; import java3d.Cylinder; import java3d.GraphicsContext3D; import java3d.Light; import java3d.Node; import java3d.Shape3D; import java3d.Sphere; import java3d.Transform3D; import java3d.Vector3d; import framework.model3D.BackgroundBox; import framework.model3D.IViewer3D; import framework.model3D.Position3D; public class Viewer3D implements IViewer3D { private GraphicsContext3D gc3D = null; private ArrayList<Light> lights = null; private BackgroundBox skyBox = null; private Camera3D camera = null; public Viewer3D(Camera3D camera) { this.camera = camera; } @Override public void setGraphicsContext3D(GraphicsContext3D gc3D) { if (this.gc3D != gc3D) { this.gc3D = gc3D; } } @Override public void surfaceChanged(int width, int height) { gc3D.update(width, height, (float)camera.getFieldOfView(), (float)camera.getFrontClipDistance(), (float)camera.getBackClipDistance(), camera.isParallel()); } @Override public void onDrawFrame() { Position3D eye = camera.getViewPoint(); Position3D center = eye.clone().add(camera.getViewLine()); Vector3d up = camera.getViewUp(); gc3D.update((float)camera.getFieldOfView(), (float)camera.getFrontClipDistance(), (float)camera.getBackClipDistance(), eye, center, up, camera.isParallel()); } @Override public void update(ArrayList<Light> lights, BackgroundBox skyBox) { // 光源の更新 if (this.lights != lights) { this.lights = lights; } // スカイボックスの更新 if (this.skyBox != skyBox) { this.skyBox = skyBox; } } @Override public void draw(Node node) { if (node instanceof Box) { gc3D.draw(((Box)node).getShape(Box.FRONT)); gc3D.draw(((Box)node).getShape(Box.BACK)); gc3D.draw(((Box)node).getShape(Box.LEFT)); gc3D.draw(((Box)node).getShape(Box.RIGHT)); gc3D.draw(((Box)node).getShape(Box.TOP)); gc3D.draw(((Box)node).getShape(Box.BOTTOM)); } else if (node instanceof Cone) { gc3D.draw(((Cone)node).getShape(Cone.BODY)); gc3D.draw(((Cone)node).getShape(Cone.CAP)); } else if (node instanceof Cylinder) { gc3D.draw(((Cylinder)node).getShape(Cylinder.BODY)); gc3D.draw(((Cylinder)node).getShape(Cylinder.TOP)); gc3D.draw(((Cylinder)node).getShape(Cylinder.BOTTOM)); } else if (node instanceof Sphere) { gc3D.draw(((Sphere)node).getShape(Sphere.BODY)); } else if (node instanceof Shape3D) { gc3D.draw((Shape3D)node); } else if (node instanceof Light){ gc3D.updateLightState((Light)node); } } @Override public void pushTransform(Transform3D transform) { gc3D.pushMatrix(); gc3D.multMatrix(transform); } @Override public void popTransform() { gc3D.popMatrix(); } }