Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package lighting;
- import java.awt.Color;
- import java.awt.Graphics;
- import java.awt.Polygon;
- import java.awt.geom.Line2D;
- import java.awt.geom.Point2D;
- import java.awt.geom.Rectangle2D;
- import java.util.ArrayList;
- import java.util.Collections;
- import javax.swing.JPanel;
- public class Screen extends JPanel {
- private Graphics g;
- private int w;
- private int h;
- private int count = 0;
- private ArrayList<Ray> rays;
- public Screen(int w, int h) {
- this.w = w;
- this.h = h;
- this.rays = new ArrayList<Ray>();
- repaint();
- }
- public void paint(Graphics g) {
- this.g = g;
- paint();
- }
- public void paint() {
- count++;
- g.setColor(Color.getHSBColor(1f, 0f, 1f));
- g.fillRect(0, 0, w, h);
- rays.clear();
- renderObsc();
- renderLines();
- }
- private void renderObsc() {
- for(Obscurer o : Main.obscList) {
- g.setColor(Color.DARK_GRAY);
- Polygon profile = o.getProfile();
- g.fillPolygon(profile);
- }
- }
- private void renderLines() {
- for(Obscurer o : Main.obscList) {
- Line2D.Double[] segments = o.lineSegments();
- for(Line2D.Double segment : segments) {
- g.setColor(Color.MAGENTA);
- g.drawLine((int)segment.getX1(), (int)segment.getY1(), (int)segment.getX2(), (int)segment.getY2());
- calculateLines(segment);
- }
- }
- double[][] screenEdgePoints = new double[][]
- {{0,0},{Main.screenWidth,0},{Main.screenWidth,Main.screenHeight},{0,Main.screenHeight}};
- for(double[] point : screenEdgePoints) {
- double dx = point[0]-Main.light.position.getX();
- double dy = point[1]-Main.light.position.getY();
- double angle = Math.atan2(dy, dx);
- angle = (angle+Math.PI*6)%(Math.PI*2);
- calculateLine(angle);
- }
- Collections.sort(rays, new CustomComparator());
- Polygon p = new Polygon();
- for(int i = 0; i < rays.size(); i++) {
- Ray ray0 = rays.get(i);
- double[] endpoint0 = new double[] {Main.light.position.getX()+(Math.cos(ray0.getRad())*ray0.getT2()),Main.light.position.getY()+(Math.sin(ray0.getRad())*ray0.getT2())};
- p.addPoint((int)endpoint0[0], (int)endpoint0[1]);
- }
- g.setColor(Color.getHSBColor(1, .5f, 0.85f));
- g.fillPolygon(p);
- }
- private void calculateLines(Line2D.Double segment) {
- double ldx = segment.getX1()-Main.light.position.getX();
- double ldy = segment.getY1()-Main.light.position.getY();
- double lightAngle = Math.atan2(ldy, ldx);
- calculateLine(lightAngle-0.00001);
- calculateLine(lightAngle);
- calculateLine(lightAngle+0.00001);
- }
- private void calculateLine(double rad) {
- rad = (rad+=6*Math.PI)%(2*Math.PI);
- double cos = Math.cos(rad);
- double sin = Math.sin(rad);
- double[] p = new double[] {Main.light.position.getX(),Main.light.position.getY()};
- double[] r = new double[] {cos,sin};
- double lowest_t2 = Main.light.radius;
- for(Obscurer o : Main.obscList) {
- Line2D.Double[] segments = o.lineSegments();
- for(Line2D.Double seg : segments) {
- double dy = seg.getY2()-seg.getY1();
- double dx = seg.getX2()-seg.getX1();
- double[] q = new double[] {seg.getX1(),seg.getY1()};
- double[] s = new double[] {dx,dy};
- double r_cross_s = cross(r,s);
- double[] q_minus_p = {q[0]-p[0],q[1]-p[1]};
- double q_minus_p__cross_s = cross(q_minus_p,s);
- double q_minus_p__cross_r = cross(q_minus_p,r);
- double u2 = q_minus_p__cross_r/r_cross_s;
- double t2 = q_minus_p__cross_s/r_cross_s;
- if(u2 >= 0 && u2 <= 1 && t2 >= 0 && t2 <= Main.light.radius) {
- if(t2<lowest_t2) {
- lowest_t2 = t2;
- }
- }
- }
- }
- rays.add(new Ray(rad,lowest_t2));
- }
- private double cross(double[] first, double[] second) {
- return first[0]*second[1] - first[1]*second[0];
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement