3
* This file is part of jReality. jReality is open source software, made
4
* available under a BSD license:
6
* Copyright (c) 2003-2006, jReality Group: Charles Gunn, Tim Hoffmann, Markus
7
* Schmies, Steffen Weissmann.
11
* Redistribution and use in source and binary forms, with or without
12
* modification, are permitted provided that the following conditions are met:
14
* - Redistributions of source code must retain the above copyright notice, this
15
* list of conditions and the following disclaimer.
17
* - Redistributions in binary form must reproduce the above copyright notice,
18
* this list of conditions and the following disclaimer in the documentation
19
* and/or other materials provided with the distribution.
21
* - Neither the name of jReality nor the names of its contributors nor the
22
* names of their associated organizations may be used to endorse or promote
23
* products derived from this software without specific prior written
26
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36
* POSSIBILITY OF SUCH DAMAGE.
41
package opencog.spacetime.reader;
43
import java.io.IOException;
44
import java.io.InputStream;
45
import java.io.InputStreamReader;
46
import java.io.LineNumberReader;
47
import java.util.HashMap;
48
import java.util.Vector;
50
import opencog.spacetime.geometry.IndexedFaceSetUtility;
51
import opencog.spacetime.scene.IndexedFaceSet;
52
import opencog.spacetime.scene.SceneGraphComponent;
53
import opencog.spacetime.scene.data.Attribute;
54
import opencog.spacetime.scene.data.StorageModel;
55
import opencog.spacetime.util.Input;
56
import opencog.spacetime.util.LoggingSystem;
62
* Simple parser for polymake files
67
public class ReaderPOLY extends AbstractReader {
69
public void setInput(Input input) throws IOException {
70
super.setInput(input);
71
root = parse(input.getInputStream());
74
static SceneGraphComponent parse(InputStream is) {
75
InputStreamReader r = new InputStreamReader(is);
76
LineNumberReader lr = new LineNumberReader(r);
77
SceneGraphComponent root = new SceneGraphComponent();
80
HashMap map = new HashMap();
84
while((line= lr.readLine()) !=null) {
86
if(line.equals("")) continue;
87
if(Character.isUpperCase(line.charAt(0))) {
88
LoggingSystem.getLogger(ReaderPOLY.class).finer(" make entry "+line);
91
} else if (v != null&& !line.equals("")) {
95
} catch (IOException e) {
96
// TODO Auto-generated catch block
99
// now we have all the data but still mostly unparsed
101
Vector vData = ((Vector)map.get("GEOMETRIC_REALIZATION"));
102
int n = vData.size();
103
double[] vertices = new double[3*n];
104
for(int i = 0; i<n;i++) {
105
String str = (String) vData.get(i);
106
String[] vals = str.split("[\\s\\{\\}/]");
107
LoggingSystem.getLogger(ReaderPOLY.class).finer("vals length "+vals.length);
108
vertices[3*i ] = Integer.parseInt(vals[0])/(double)Integer.parseInt(vals[1]);
109
vertices[3*i+1] = Integer.parseInt(vals[2])/(double)Integer.parseInt(vals[3]);
110
vertices[3*i+2] = Integer.parseInt(vals[4])/(double)Integer.parseInt(vals[5]);
113
vData = ((Vector)map.get("FACETS"));
115
int[][] faces = new int[n][3];
116
for(int i = 0; i<n;i++) {
117
String str = (String) vData.get(i);
118
String[] vals = str.split("[\\s\\{\\}/]");
119
LoggingSystem.getLogger(ReaderPOLY.class).finer("face vals length "+vals.length);
120
if(vals.length>3 ) o = 1;
122
faces[i][0] = Integer.parseInt(vals[o+0]);
123
faces[i][1] = Integer.parseInt(vals[o+1]);
124
faces[i][2] = Integer.parseInt(vals[o+2]);
127
IndexedFaceSet ifs = new IndexedFaceSet();
129
ifs.setVertexCountAndAttributes(Attribute.COORDINATES,StorageModel.DOUBLE_ARRAY.inlined(3).createReadOnly(vertices));
130
//ifs.setFaceCountAndAttributes(Attribute.INDICES,new IntArrayArray.Array(faces));
131
ifs.setFaceCountAndAttributes(Attribute.INDICES,StorageModel.INT_ARRAY_ARRAY.createReadOnly(faces));
132
IndexedFaceSetUtility.calculateAndSetFaceNormals(ifs);
133
IndexedFaceSetUtility.calculateAndSetVertexNormals(ifs);
134
IndexedFaceSetUtility.calculateAndSetEdgesFromFaces(ifs);
135
root.setGeometry(ifs);
136
// System.out.println("we return "+root+" with geometry "+root.getGeometry());