1 package org.textensor.vis;
2
3 import java.awt.BorderLayout;
4 import java.awt.Color;
5 import java.awt.Container;
6 import java.awt.Dimension;
7 import java.util.ArrayList;
8 import java.util.HashSet;
9
10 import javax.swing.JFrame;
11 import javax.swing.JPanel;
12
13 import org.textensor.report.E;
14
15
16
17 public class Icing3DViewer implements Visualizer {
18
19 double scaleFactor = 1.;
20
21 JFrame frame;
22
23 SceneGraphViewer sceneGraphViewer;
24
25
26 int resolution = Visualizer.MEDIUM;
27
28 IcingPoint[] cachedPoints;
29
30
31 public Icing3DViewer() {
32 sceneGraphViewer = new SceneGraphViewer();
33
34
35 frame = new JFrame();
36 frame.setPreferredSize(new Dimension(400, 400));
37 Container ctr = frame.getContentPane();
38
39
40 ctr.setLayout(new BorderLayout());
41 ctr.add(sceneGraphViewer.getPanel(), BorderLayout.CENTER);
42
43 frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
44
45 buildViewable(makeDummyTree());
46 setLightsPercent(80);
47 }
48
49
50
51 public void show() {
52 frame.pack();
53 frame.setVisible(true);
54 }
55
56
57
58 public static void main(String[] argv) {
59 Icing3DViewer sv = new Icing3DViewer();
60 sv.show();
61 }
62
63
64
65
66 public IcingPoint[] makeDummyTree() {
67 ArrayList<IcingPoint> aip = new ArrayList<IcingPoint>();
68 IcingPoint p0 = new IcingPoint(0, 0, 0, 6);
69 IcingPoint p1 = new IcingPoint(50, 0, 0, 4, p0);
70 IcingPoint p2 = new IcingPoint(80, 0, 40, 2, p1);
71 IcingPoint p3 = new IcingPoint(70, 10, -30, 2, p1);
72 aip.add(p0);
73 aip.add(p1);
74 aip.add(p2);
75 aip.add(p3);
76
77 IcingPoint[] ret = aip.toArray(new IcingPoint[aip.size()]);
78 return ret;
79 }
80
81
82 public JPanel getPanel() {
83 return sceneGraphViewer.getPanel();
84 }
85
86 public void setScaleFactor(double d) {
87 scaleFactor = d;
88 }
89
90
91 public void buildViewable(Object obj) {
92 RunBuilder rb = new RunBuilder(this, obj);
93 Thread thread = new Thread(rb);
94 thread.start();
95 }
96
97 public void reallyBuildVewable(Object obj) {
98 if (obj instanceof IcingPoint[]) {
99 IcingPoint[] points = (IcingPoint[])obj;
100 cachedPoints = points;
101 SceneGraphBuilder sgb = new SceneGraphBuilder();
102 sgb.buildTree(points, resolution, scaleFactor);
103 sceneGraphViewer.removeAllDecoration();
104 sceneGraphViewer.setSceneGraph(sgb.getSceneGraph(), null);
105
106 } else {
107 E.error("cant build viewable from " + obj);
108 }
109 }
110
111 public void refreshDecoration(Object obj) {
112 RunDecorator rb = new RunDecorator(this, obj);
113 Thread thread = new Thread(rb);
114 thread.start();
115 }
116
117
118 public void reallyRefreshDecoration(Object obj) {
119
120 }
121
122
123
124 public void deltaLights(double d) {
125 sceneGraphViewer.deltaLights(d);
126
127 }
128
129
130
131 public void setAA(boolean b) {
132 sceneGraphViewer.setAA(b);
133
134 }
135
136
137
138 public void setResolution(int res) {
139 if (res != resolution) {
140 resolution = res;
141 if (cachedPoints != null) {
142 SceneGraphBuilder sgb = new SceneGraphBuilder();
143 sgb.buildTree(cachedPoints, resolution, scaleFactor);
144 sceneGraphViewer.setSceneGraph(sgb.getSceneGraph(), null);
145 }
146
147
148 }
149 }
150
151 public Color makeColor(Object obj) {
152 Color ret = null;
153 if (obj instanceof Color) {
154 ret = (Color)obj;
155 } else if (obj instanceof String) {
156 String s = (String)obj;
157 if (s == null) {
158 s = "0xff0000";
159 }
160 if (!s.toLowerCase().startsWith("0x")) {
161 s = "0x" + s;
162 }
163 try {
164 ret = new Color(Integer.decode(s).intValue());
165 } catch (Exception ex) {
166 E.warning("dodgy color " + s);
167 ret = Color.red;
168 }
169 } else {
170 ret = Color.cyan;
171 }
172 return ret;
173 }
174
175
176
177 public void setLightsPercent(int p) {
178 sceneGraphViewer.setLightsPercent(p);
179 }
180
181
182
183 public void setFourMatrix(double[] fmo) {
184 sceneGraphViewer.setFourMatrix(fmo);
185 }
186
187
188
189 public double[] getFourMatrix() {
190 return sceneGraphViewer.getFourMatrix();
191 }
192
193 }