[Bprocessor-commit] facade/src/net/sourceforge/bprocessor/facade/modellor FacadeModellor.java, 1.1
Status: Pre-Alpha
Brought to you by:
henryml
From: Nordholt <nor...@us...> - 2006-09-25 13:44:08
|
Update of /cvsroot/bprocessor/facade/src/net/sourceforge/bprocessor/facade/modellor In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv8232/src/net/sourceforge/bprocessor/facade/modellor Modified Files: FacadeModellor.java Log Message: Made segment-constructors for each segment of a post. Now each segment can be moved individually Index: FacadeModellor.java =================================================================== RCS file: /cvsroot/bprocessor/facade/src/net/sourceforge/bprocessor/facade/modellor/FacadeModellor.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** FacadeModellor.java 8 Sep 2006 14:08:40 -0000 1.13 --- FacadeModellor.java 25 Sep 2006 13:43:58 -0000 1.14 *************** *** 7,12 **** --- 7,14 ---- package net.sourceforge.bprocessor.facade.modellor; + import java.util.HashMap; import java.util.List; import java.util.LinkedList; + import java.util.Map; import java.util.Set; import java.util.HashSet; *************** *** 25,28 **** --- 27,32 ---- import org.apache.log4j.Logger; + + import sun.net.www.http.PosterOutputStream; /** * The facade modellor models the elements for a facade space. *************** *** 31,110 **** /** Default */ private static final long serialVersionUID = 1L; ! /** Dobbelt bar-type facade */ private static final int DOUBLE_BAR = 1; ! /** Dobbelt bar-type facade */ private static final int SINGLE_BAR = 2; ! /** The logger */ private static Logger log = Logger.getLogger(FacadeModellor.class); ! /** Name of the modellor */ private String name; ! /** Number of vertical posts */ private int vertPosts = 0; ! /** Number of horizontal posts */ private int horPosts = 0; ! /** Default vertical post width */ private double vertPostWidth = 0; ! /** Default horizontal post width */ private double horPostWidth = 0; ! /** The space this modellor is connected to */ private Space space; ! /** The front surface of the facade */ private Surface front = null; ! ! /** A copy of the front surface but on element-level */ ! private Surface eFront = null; ! /** The set of vertical constructor lines */ private List vertCons = new LinkedList(); ! /** The set of horizontal constructor lines */ private List horCons = new LinkedList(); ! /** Thickness of the frame */ private double frameThickness = 0; ! /** Facade depth */ private double depth = 0; ! /** The frame space */ private Space frame; ! /** Set of surfaces that forms the holes for windows*/ private Set windows = new HashSet(); ! /** The surfaces of the frame */ private Set frameSurfaces = new HashSet(); ! /** edge marking leftmost boundry of the facade */ private Line leftBound; ! /** edge marking rightmost boundry of the facade */ private Line rightBound; ! /** edge marking top boundry of the facade */ private Line topBound; ! /** edge marking leftmost boundry of the facade */ private Line bottomBound; ! /** Set of window elements */ private Set windowElements = new HashSet(); ! /** Set of window modellors */ private Set windowModellors = new HashSet(); ! ! /** Type facade */ private int type; /** The constructor */ public FacadeModellor() { --- 35,121 ---- /** Default */ private static final long serialVersionUID = 1L; ! /** Dobbelt bar-type facade */ private static final int DOUBLE_BAR = 1; ! /** Dobbelt bar-type facade */ private static final int SINGLE_BAR = 2; ! /** The logger */ private static Logger log = Logger.getLogger(FacadeModellor.class); ! /** Name of the modellor */ private String name; ! /** Number of vertical posts */ private int vertPosts = 0; ! /** Number of horizontal posts */ private int horPosts = 0; ! /** Default vertical post width */ private double vertPostWidth = 0; ! /** Default horizontal post width */ private double horPostWidth = 0; ! /** The space this modellor is connected to */ private Space space; ! /** The front surface of the facade */ private Surface front = null; ! /** The set of vertical constructor lines */ private List vertCons = new LinkedList(); ! /** The set of horizontal constructor lines */ private List horCons = new LinkedList(); ! /** Thickness of the frame */ private double frameThickness = 0; ! /** Facade depth */ private double depth = 0; ! /** The frame space */ private Space frame; ! /** Set of surfaces that forms the holes for windows*/ private Set windows = new HashSet(); ! /** The surfaces of the frame */ private Set frameSurfaces = new HashSet(); ! /** edge marking leftmost boundry of the facade */ private Line leftBound; ! /** edge marking rightmost boundry of the facade */ private Line rightBound; ! /** edge marking top boundry of the facade */ private Line topBound; ! /** edge marking leftmost boundry of the facade */ private Line bottomBound; ! /** Set of window elements */ private Set windowElements = new HashSet(); ! /** Set of window modellors */ private Set windowModellors = new HashSet(); ! ! /** Type of facade */ private int type; + /** The horizontal post-segments */ + private Line[][] horSegs; + + /** The vertical post-segments */ + private Line[][] vertSegs; + + /** Mapping from a segment to a boolean + * indicating which if the segment is to be drawn*/ + private Map drawSeg = new HashMap(); + /** The constructor */ public FacadeModellor() { *************** *** 112,116 **** this.name = "Facade Modellor"; } ! /** The constructor for the modellor * @param s the space this modellor models for. --- 123,127 ---- this.name = "Facade Modellor"; } ! /** The constructor for the modellor * @param s the space this modellor models for. *************** *** 126,130 **** } } ! /** * Create a new instance of the modellor, based on a space --- 137,141 ---- } } ! /** * Create a new instance of the modellor, based on a space *************** *** 135,139 **** return new FacadeModellor(s); } ! /** * The update method --- 146,150 ---- return new FacadeModellor(s); } ! /** * The update method *************** *** 148,152 **** } } ! /** * Creates the facade based on its type. --- 159,163 ---- } } ! /** * Creates the facade based on its type. *************** *** 160,164 **** createWindows(); } ! /** --- 171,175 ---- createWindows(); } ! /** *************** *** 181,185 **** } } ! /** * Set the attributes of the object to the values in the list --- 192,196 ---- } } ! /** * Set the attributes of the object to the values in the list *************** *** 260,264 **** Project.getInstance().changed(space); } ! /** * Retrn a list of the attributes in the object --- 271,275 ---- Project.getInstance().changed(space); } ! /** * Retrn a list of the attributes in the object *************** *** 285,289 **** return attributes; } ! /** * Get the name --- 296,300 ---- return attributes; } ! /** * Get the name *************** *** 293,297 **** return name; } ! /** * @see net.sourceforge.bprocessor.model.Parametric#getGeneralName() --- 304,308 ---- return name; } ! /** * @see net.sourceforge.bprocessor.model.Parametric#getGeneralName() *************** *** 300,309 **** return "Facade Modellor"; } ! /** Delete */ public void delete() { space.setModellor(null); } ! /** * Creates the frame for this facade based on frame thickness and depth. --- 311,320 ---- return "Facade Modellor"; } ! /** Delete */ public void delete() { space.setModellor(null); } ! /** * Creates the frame for this facade based on frame thickness and depth. *************** *** 315,319 **** frame = new Space("Frame", Space.CONSTRUCTION, true); space.add(frame); ! eFront = front.copy(space); frameSurfaces.add(eFront); if (front.getBackDomain() == space) { --- 326,330 ---- frame = new Space("Frame", Space.CONSTRUCTION, true); space.add(frame); ! Surface eFront = front.copy(space); frameSurfaces.add(eFront); if (front.getBackDomain() == space) { *************** *** 342,345 **** --- 353,357 ---- frameSurfaces = new HashSet(); if (frame != null) { + frame.clear(); frame.delete(); } *************** *** 347,430 **** removeWindows(); removeConstructors(); } ! ! /** * Creates the post constructors for this facade based on the number of posts. */ private void createPostConstructors() { ! log.info("created new posts"); ! if (front != null && depth > 0) { List edges = front.getEdges(); removeConstructors(); vertCons = new LinkedList(); horCons = new LinkedList(); ! if (edges.size() == 4) { ! Iterator it = edges.iterator(); ! Edge vertEdge = null; ! Edge horEdge = null; ! while (it.hasNext() && ! (vertEdge == null || ! horEdge == null)) { ! Edge e = (Edge)it.next(); ! if (Math.abs(e.getDirection().dot(new Vertex(0, 0, 1))) < 0.0001) { ! horEdge = e; ! } else if (Math.abs(e.getDirection().dot(new Vertex(1, 0, 0))) < 0.0001 && ! Math.abs(e.getDirection().dot(new Vertex(0, 1, 0))) < 0.0001) { ! vertEdge = e; ! } } ! if (horEdge != null && vertEdge != null) { ! Vertex cross; ! if (horEdge.contains(vertEdge.getFrom())) { ! cross = vertEdge.getFrom(); ! } else { ! cross = vertEdge.getTo(); ! } ! Vertex horDir = horEdge.otherVertex(cross).minus(cross); ! Vertex vertDir = vertEdge.otherVertex(cross).minus(cross); ! Vertex offset = horDir.copy(); ! double intervalV = ((horEdge.getLength() - frameThickness * 2) - ! vertPostWidth * vertPosts) / (vertPosts + 1); ! double lengthV = intervalV + frameThickness; for (int i = 0; i < vertPosts; i++) { - lengthV += (vertPostWidth / 2); offset.scale(lengthV / offset.length()); Constructor l = new Line(cross.add(offset), vertDir.copy(), horEdge, true, true); ! lengthV += (intervalV + (vertPostWidth / 2)); ! vertCons.add(l); space.add(l); } offset = vertDir.copy(); ! double intervalH = ((vertEdge.getLength() - frameThickness * 2) - ! horPostWidth * horPosts) / (horPosts + 1); ! double lengthH = intervalH + frameThickness; for (int i = 0; i < horPosts; i++) { - lengthH += (horPostWidth / 2); offset.scale(lengthH / offset.length()); ! Constructor l = new Line(cross.add(offset), horDir.copy(), vertEdge, true, true); ! lengthH += (intervalH + (horPostWidth / 2)); horCons.add(l); space.add(l); } ! { ! Vertex topOffset = vertDir.copy(); ! topOffset.scale(frameThickness / topOffset.length()); ! topBound = new Line(cross.add(topOffset), horDir); ! Vertex bottomOffset = vertDir.copy(); ! bottomOffset.scale((vertEdge.getLength() - frameThickness) / bottomOffset.length()); ! bottomBound = new Line(cross.add(bottomOffset), horDir); ! Vertex leftOffset = horDir.copy(); ! leftOffset.scale(frameThickness / leftOffset.length()); ! leftBound = new Line(cross.add(leftOffset), vertDir); ! Vertex rightOffset = horDir.copy(); ! rightOffset.scale((horEdge.getLength() - frameThickness) / rightOffset.length()); ! rightBound = new Line(cross.add(rightOffset), vertDir); } } } } } /** * Creates the holes for windows in the facade based on the post constructors, --- 359,511 ---- removeWindows(); removeConstructors(); + space.clear(); } ! ! /** * Creates the post constructors for this facade based on the number of posts. */ private void createPostConstructors() { ! if (front != null && front.getEdges().size() == 4 && depth > 0) { ! //Finding horizontal and vertical edge List edges = front.getEdges(); removeConstructors(); vertCons = new LinkedList(); horCons = new LinkedList(); ! Iterator it = edges.iterator(); ! Edge vertEdge = null; ! Edge horEdge = null; ! while (it.hasNext() && ! (vertEdge == null || ! horEdge == null)) { ! Edge e = (Edge)it.next(); ! if (Math.abs(e.getDirection().dot(new Vertex(0, 0, 1))) < 0.0001) { ! horEdge = e; ! } else if (Math.abs(e.getDirection().dot(new Vertex(1, 0, 0))) < 0.0001 && ! Math.abs(e.getDirection().dot(new Vertex(0, 1, 0))) < 0.0001) { ! vertEdge = e; } ! } ! Vertex cross = null; ! if (horEdge != null && vertEdge != null) { ! ! if (horEdge.contains(vertEdge.getFrom())) { ! cross = vertEdge.getFrom(); ! } else { ! cross = vertEdge.getTo(); ! } ! } ! if (cross != null) { ! horSegs = new Line[vertPosts][horPosts]; ! vertSegs = new Line[vertPosts][horPosts]; ! Vertex horDir = horEdge.otherVertex(cross).minus(cross); ! Vertex vertDir = vertEdge.otherVertex(cross).minus(cross); ! double intervalV = ((horEdge.getLength() - frameThickness * 2) - ! vertPostWidth * vertPosts) / (vertPosts + 1); ! double intervalH = ((vertEdge.getLength() - frameThickness * 2) - ! horPostWidth * horPosts) / (horPosts + 1); ! Vertex offset; ! //vertical constructors ! { ! offset = horDir.copy(); ! double lengthV = intervalV + frameThickness + (vertPostWidth / 2); for (int i = 0; i < vertPosts; i++) { offset.scale(lengthV / offset.length()); Constructor l = new Line(cross.add(offset), vertDir.copy(), horEdge, true, true); ! lengthV += (intervalV + vertPostWidth); space.add(l); + vertCons.add(l); } + } + //horizontal constructors + { offset = vertDir.copy(); ! double lengthH = intervalH + frameThickness + (horPostWidth / 2); for (int i = 0; i < horPosts; i++) { offset.scale(lengthH / offset.length()); ! Line l = new Line(cross.add(offset), horDir.copy(), vertEdge, true, true); ! lengthH += (intervalH + horPostWidth); horCons.add(l); space.add(l); } ! } ! //boundries ! { ! Vertex topOffset = vertDir.copy(); ! topOffset.scale(frameThickness / topOffset.length()); ! topBound = new Line(cross.add(topOffset), horDir); ! Vertex bottomOffset = vertDir.copy(); ! bottomOffset.scale((vertEdge.getLength() - frameThickness) / bottomOffset.length()); ! bottomBound = new Line(cross.add(bottomOffset), horDir); ! Vertex leftOffset = horDir.copy(); ! leftOffset.scale(frameThickness / leftOffset.length()); ! leftBound = new Line(cross.add(leftOffset), vertDir); ! Vertex rightOffset = horDir.copy(); ! rightOffset.scale((horEdge.getLength() - frameThickness) / rightOffset.length()); ! rightBound = new Line(cross.add(rightOffset), vertDir); ! } ! createSegmentLines(); ! } ! } ! } ! ! private void createSegmentLines() { ! removeSegmentLines(); ! int i = 0; ! int j = 0; ! List vert = new LinkedList(); ! List hor = new LinkedList(); ! vert.add(leftBound); ! vert.addAll(vertCons); ! vert.add(rightBound); ! hor.add(topBound); ! hor.addAll(horCons); ! hor.add(bottomBound); ! Iterator vIt = vert.iterator(); ! while (vIt.hasNext()) { ! Line v = (Line)vIt.next(); ! Iterator hIt = hor.iterator(); ! j = 0; ! while (hIt.hasNext()) { ! Line h = (Line)hIt.next(); ! Vertex origin = h.intersection(v); ! Vertex hDir = h.getDirection().copy(); ! Vertex vDir = v.getDirection().copy(); ! Line hSeg = new Line(origin.copy(), hDir, false, true); ! Line vSeg = new Line(origin.copy(), vDir, false, true); ! horSegs[i][j] = hSeg; ! vertSegs[i][j] = vSeg; ! drawSeg.put(hSeg, Boolean.TRUE); ! drawSeg.put(vSeg, Boolean.TRUE); ! h.connect(hSeg); ! v.connect(vSeg); ! if ((j < horPosts + 1 && i < vertPosts + 1)) { ! if (j > 0) { ! space.add(hSeg); ! } ! if (i > 0) { ! space.add(vSeg); } } + j++; } + i++; } } + private void removeSegmentLines() { + for (int i = 0; i < vertPosts; i++) { + for (int j = 0; j < horPosts; j++) { + if (vertSegs[i][j] != null && horSegs[i][j] != null) { + vertSegs[i][j].delete(); + horSegs[i][j].delete(); + } + } + } + horSegs = new Line[vertPosts + 2][horPosts + 2]; + vertSegs = new Line[vertPosts + 2][horPosts + 2]; + drawSeg = new HashMap(); + } + /** * Creates the holes for windows in the facade based on the post constructors, *************** *** 439,451 **** Line currentV = null; Iterator vIt = vertCons.iterator(); while (vIt.hasNext()) { Line vL = (Line)vIt.next(); currentV = new Line(vL.getOrigin().minus(horDir), vL.getDirection()); ! horizontalRun(oldV, currentV); oldV = new Line(vL.getOrigin().add(horDir), vL.getDirection()); ! vL.connect(currentV); ! vL.connect(oldV); } ! horizontalRun(oldV, rightBound); } } --- 520,534 ---- Line currentV = null; Iterator vIt = vertCons.iterator(); + int i = 0; while (vIt.hasNext()) { Line vL = (Line)vIt.next(); currentV = new Line(vL.getOrigin().minus(horDir), vL.getDirection()); ! horizontalRun(oldV, currentV, i); oldV = new Line(vL.getOrigin().add(horDir), vL.getDirection()); ! //vL.connect(currentV); ! //vL.connect(oldV); ! i++; } ! horizontalRun(oldV, rightBound, i); } } *************** *** 455,474 **** * @param oldV left boundry * @param currentV right boundry */ ! private void horizontalRun(Line oldV, Line currentV) { Line currentH; Vertex vertDir = leftBound.getDirection().copy(); vertDir.scale(horPostWidth / 2); Line oldH = topBound; Iterator hIt = horCons.iterator(); while (hIt.hasNext()) { Line hL = (Line)hIt.next(); currentH = new Line(hL.getOrigin().minus(vertDir), hL.getDirection()); ! createHole(oldV, currentV, oldH, currentH); oldH = new Line(hL.getOrigin().add(vertDir), hL.getDirection()); ! hL.connect(currentH); ! hL.connect(oldH); } ! createHole(oldV, currentV, oldH, bottomBound); } --- 538,571 ---- * @param oldV left boundry * @param currentV right boundry + * @param i index of oldv */ ! private void horizontalRun(Line oldV, Line currentV, int i) { Line currentH; Vertex vertDir = leftBound.getDirection().copy(); vertDir.scale(horPostWidth / 2); Line oldH = topBound; + int j = 0; Iterator hIt = horCons.iterator(); while (hIt.hasNext()) { Line hL = (Line)hIt.next(); + Line copyOldV = new Line(oldV.getOrigin().copy(), oldV.getDirection().copy()); + Line copyCurrentV = new Line(currentV.getOrigin().copy(), currentV.getDirection().copy()); currentH = new Line(hL.getOrigin().minus(vertDir), hL.getDirection()); ! createHole(copyOldV, copyCurrentV, oldH, currentH); ! horSegs[i][j].connect(oldH); ! horSegs[i][j + 1].connect(currentH); ! vertSegs[i][j].connect(copyOldV); ! vertSegs[i + 1][j].connect(copyCurrentV); oldH = new Line(hL.getOrigin().add(vertDir), hL.getDirection()); ! //hL.connect(currentH); ! //hL.connect(oldH); ! j++; } ! Line copyOldV = new Line(oldV.getOrigin().copy(), oldV.getDirection().copy()); ! Line copyCurrentV = new Line(currentV.getOrigin().copy(), currentV.getDirection().copy()); ! createHole(copyOldV, copyCurrentV, oldH, bottomBound); ! horSegs[i][j].connect(oldH); ! vertSegs[i][j].connect(copyOldV); ! vertSegs[i + 1][j].connect(copyCurrentV); } *************** *** 482,559 **** private void createHole(Line left, Line right, Line top, Line bottom) { Vertex c1 = top.intersection(left); Vertex c2 = top.intersection(right); Vertex c3 = bottom.intersection(right); Vertex c4 = bottom.intersection(left); ! // log.info("c1: " + c1); ! // log.info("c2: " + c2); ! // log.info("c3: " + c3); ! // log.info("c4: " + c4); ! List edges = new LinkedList(); ! Edge e1 = new Edge(c1, c2); ! space.add(e1); ! edges.add(e1); ! Edge e2 = new Edge(c2, c3); ! space.add(e2); ! edges.add(e2); ! Edge e3 = new Edge(c3, c4); ! space.add(e3); ! edges.add(e3); ! Edge e4 = new Edge(c4, c1); ! space.add(e4); ! edges.add(e4); ! Surface s = new Surface(edges); ! windows.add(s); ! space.add(s); ! // log.info("left: " + left); ! // log.info("right: " + right); ! // log.info("top: " + top); ! // log.info("bottom: " + bottom); ! Geometry.holeAnalysis(s); ! if (type == DOUBLE_BAR) { ! Vertex sn = s.normal(); ! Vertex fn = front.normal(); ! Space wf = new Space("Window", Space.CONSTRUCTION, true); ! space.add(wf); ! windowElements.add(wf); ! if (sn.dot(fn) > 0) { ! if (front.getFrontDomain() == space) { ! s.setFrontDomain(wf); } else { ! s.setBackDomain(wf); } } else { ! if (front.getBackDomain() == space) { ! s.setFrontDomain(wf); ! } else { ! s.setBackDomain(wf); } ! } ! Modellor wm = new WindowModellor(wf, s); ! wf.setModellor(wm); ! windowModellors.add(wm); ! } ! Set sides = new HashSet(); ! Surface t = extrudeIntoSpace(s, depth, sides); ! windows.add(t); ! windows.addAll(sides); ! Iterator it = sides.iterator(); ! while (it.hasNext()) { ! Surface side = (Surface)it.next(); ! if (side.contains(e1)) { ! top.connect(side); ! } else if (side.contains(e2)) { ! right.connect(side); ! } else if (side.contains(e3)) { ! bottom.connect(side); ! } else if (side.contains(e4)) { ! left.connect(side); ! } ! space.add(side); } - Geometry.holeAnalysis(t); } - - /** * Removes the windows of the facade. --- 579,659 ---- private void createHole(Line left, Line right, Line top, Line bottom) { Vertex c1 = top.intersection(left); + space.add(c1); Vertex c2 = top.intersection(right); + space.add(c2); Vertex c3 = bottom.intersection(right); + space.add(c3); Vertex c4 = bottom.intersection(left); ! space.add(c4); ! if (c1 != null && c2 != null && c3 != null && c4 != null) { ! List edges = new LinkedList(); ! Edge e1 = new Edge(c1, c2); ! space.add(e1); ! edges.add(e1); ! Edge e2 = new Edge(c2, c3); ! space.add(e2); ! edges.add(e2); ! Edge e3 = new Edge(c3, c4); ! space.add(e3); ! edges.add(e3); ! Edge e4 = new Edge(c4, c1); ! space.add(e4); ! edges.add(e4); ! Surface s = new Surface(edges); ! windows.add(s); ! space.add(s); ! Geometry.holeAnalysis(s); ! if (type == DOUBLE_BAR) { ! Vertex sn = s.normal(); ! Vertex fn = front.normal(); ! Space wf = new Space("Window", Space.CONSTRUCTION, true); ! space.add(wf); ! windowElements.add(wf); ! if (sn.dot(fn) > 0) { ! if (front.getFrontDomain() == space) { ! s.setFrontDomain(wf); ! } else { ! s.setBackDomain(wf); ! } } else { ! if (front.getBackDomain() == space) { ! s.setFrontDomain(wf); ! } else { ! s.setBackDomain(wf); ! } } + Modellor wm = new WindowModellor(wf, s); + wf.setModellor(wm); + windowModellors.add(wm); + top.connect(e1); + right.connect(e2); + bottom.connect(e3); + left.connect(e4); } else { ! Set sides = new HashSet(); ! Surface t = extrudeIntoSpace(s, depth, sides); ! windows.add(t); ! windows.addAll(sides); ! Iterator it = sides.iterator(); ! while (it.hasNext()) { ! Surface side = (Surface)it.next(); ! if (side.contains(e1)) { ! top.connect(side); ! } else if (side.contains(e2)) { ! right.connect(side); ! } else if (side.contains(e3)) { ! bottom.connect(side); ! } else if (side.contains(e4)) { ! left.connect(side); ! } ! space.add(side); } ! Geometry.holeAnalysis(t); ! } ! } else { ! log.warn("Unable to create windows, some intersections were NULL"); } } /** * Removes the windows of the facade. *************** *** 570,574 **** it = windowElements.iterator(); while (it.hasNext()) { ! ((Space)it.next()).delete(); } windowModellors = new HashSet(); --- 670,676 ---- it = windowElements.iterator(); while (it.hasNext()) { ! Space sp = (Space)it.next(); ! sp.clear(); ! sp.delete(); } windowModellors = new HashSet(); *************** *** 576,580 **** windows = new HashSet(); } ! /** * Makes sure to extrude the a surface to the right side --- 678,682 ---- windows = new HashSet(); } ! /** * Makes sure to extrude the a surface to the right side *************** *** 630,633 **** createWindows(); } ! } } --- 732,735 ---- createWindows(); } ! } } |