From cb37a129d1adb403019c96e798e86e2da9667f15 Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Sun, 17 Nov 2019 17:56:04 -0500
Subject: [PATCH] Maze

---
 GroupEditor.java |  134 ++++++++++++++++++++++++++++++++++++++------
 1 files changed, 115 insertions(+), 19 deletions(-)

diff --git a/GroupEditor.java b/GroupEditor.java
index d6b309a..f47872a 100644
--- a/GroupEditor.java
+++ b/GroupEditor.java
@@ -2052,6 +2052,8 @@
         }
                 
 		menu.add("-");
+		mazeItem = menu.add(new MenuItem("Maze"));
+		mazeItem.addActionListener(this);
 		parseverticesItem = menu.add(new MenuItem("Multiplicity"));
 		parseverticesItem.addActionListener(this);
 		textureFieldItem = menu.add(new MenuItem("Texture Field"));
@@ -2247,6 +2249,111 @@
             elem.openEditWindow(this, newWindow); //, false);
             System.out.println("edit : " + elem);
             elem.editWindow.refreshContents(true); // ? new
+    }
+
+    private void GenerateMaze()
+    {
+        if (group.selection.size() == 4)
+        {
+               final double scaleX = SelectionSizeX();
+               final double scaleZ = SelectionSizeZ();
+               
+               final cGroup mazeGroup = new cGroup("Maze");
+               
+               final int dim = 15;
+                
+               Maze maze = new Maze(dim, dim);
+               
+               maze.display(); // console
+               
+               maze.Display(new Maze.Parse()
+               {
+                   public void Tile(int i, int j, boolean north, boolean east, boolean south, boolean west)
+                   {
+                       if ((i == 0 || i == dim-1) && j == dim/2)
+                       {
+                           return;
+                       }
+                       
+                       int v = 0;
+                       if (north)
+                       {
+                            cGroup n = new cGroup("" + i + "," + j);
+                            n.Translate(-j * scaleX, 0, i * scaleZ);
+                            n.add(group.selection.get(0));
+                            mazeGroup.add(n);
+                       }
+                       if (east)
+                       {
+                            cGroup n = new cGroup("" + i + "," + j);
+                            n.Translate(-j * scaleX, 0, i * scaleZ);
+                            n.add(group.selection.get(1));
+                            mazeGroup.add(n);
+                       }
+                       if (south)
+                       {
+                            cGroup n = new cGroup("" + i + "," + j);
+                            n.Translate(-j * scaleX, 0, i * scaleZ);
+                            n.add(group.selection.get(2));
+                            mazeGroup.add(n);
+                       }
+                       if (west)
+                       {
+                            cGroup n = new cGroup("" + i + "," + j);
+                            n.Translate(-j * scaleX, 0, i * scaleZ);
+                            n.add(group.selection.get(3));
+                            mazeGroup.add(n);
+                       }
+                   }
+               }
+               );
+               
+               makeSomething(mazeGroup);
+        }
+    }
+
+    private double SelectionSize()
+    {
+        cVector bbmin = new cVector();
+        cVector bbmax = new cVector();
+        
+        group.selection.getBounds(bbmin, bbmax, true);
+        
+        double dx = bbmax.x - bbmin.x;
+        //double dy = bbmax.y - bbmin.y;
+        double dz = bbmax.z - bbmin.z;
+        
+        return Math.sqrt(dx*dx /*+ dy*dy*/ + dz*dz);
+    }
+        
+    private double SelectionSizeX()
+    {
+        cVector bbmin = new cVector();
+        cVector bbmax = new cVector();
+        
+        group.selection.getBounds(bbmin, bbmax, true);
+        
+        return bbmax.x - bbmin.x;
+    }
+        
+    private double SelectionSizeY()
+    {
+        cVector bbmin = new cVector();
+        cVector bbmax = new cVector();
+        
+        group.selection.getBounds(bbmin, bbmax, true);
+        
+        return bbmax.y - bbmin.y;
+    }
+        
+    private double SelectionSizeZ()
+    {
+        cVector bbmin = new cVector();
+        cVector bbmax = new cVector();
+        
+        group.selection.getBounds(bbmin, bbmax, true);
+        
+        return bbmax.z - bbmin.z;
     }
         
     /**
@@ -3590,6 +3697,10 @@
                 {
 			ReverseNormals();
 		} else
+		if (source == mazeItem)
+                {
+                        GenerateMaze();
+		} else
 		if (source == parseverticesItem)
                 {
 			ParseVertices();
@@ -4874,29 +4985,13 @@
             if (group.selection.size() == 0)
                 return;
             
-            cVector bbmin = new cVector();
-            cVector bbmax = new cVector();
-            
-            group.selection.get(0).getBounds(bbmin, bbmax, true);
-            
-            double dx = bbmax.x - bbmin.x;
-            double dy = bbmax.y - bbmin.y;
-            double dz = bbmax.z - bbmin.z;
-            
-            double scale = Math.sqrt(dx*dx + dy*dy + dz*dz);
+            double scale = SelectionSize();
             
             for (int i=0; i<group.selection.size(); i++)
             {
 		Object3D obj = group.selection.get(i);
                 
-                if (obj.toParent == null)
-                {
-                    obj.toParent = LA.newMatrix();
-                    obj.fromParent = LA.newMatrix();
-                }
-                
-                LA.matTranslate(obj.toParent, i * scale, 0, 0);
-                LA.matTranslateInv(obj.fromParent, -i * scale, 0, 0);
+                obj.Translate(i * scale, 0, 0);
             }
             
             Globals.lighttouched = true;
@@ -6429,8 +6524,9 @@
 	private MenuItem unstripifyItem;
 	private MenuItem trimItem;
 	private MenuItem untrimItem;
-
         private MenuItem clearColorsItem;
+        
+	private MenuItem mazeItem;
 	private MenuItem parseverticesItem;
 	private MenuItem alignItem;
 	private MenuItem mirrorItem;

--
Gitblit v1.6.2