Skip to content

Commit fd40a0f

Browse files
committed
update server side to ThreeJS JSON model 4
1 parent 90eac04 commit fd40a0f

File tree

2 files changed

+77
-33
lines changed

2 files changed

+77
-33
lines changed

ServerPlugin/src/org/bimserver/serializers/json/ThreeJsSerializer.java

Lines changed: 76 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
import java.io.PrintWriter;
55
import java.nio.ByteBuffer;
66
import java.nio.ByteOrder;
7-
import java.util.ArrayList;
8-
import java.util.List;
7+
import java.util.*;
98

109
import org.bimserver.emf.IdEObject;
1110
import org.bimserver.emf.IfcModelInterface;
@@ -46,10 +45,21 @@ public void reset() {
4645
protected boolean write(OutputStream outputStream, ProgressReporter progressReporter) {
4746
if (getMode() == Mode.BODY) {
4847
out = new PrintWriter(outputStream);
49-
out.println("[");
50-
writeGeometries();
51-
out.println();
52-
out.println("]");
48+
out.println("{");
49+
out.println(" \"metadata\" : { \"formatVersion\" : 4.3, \"type\" : \"object\", \"generator\" : \"BIMserver three.js serializer\" }, ");
50+
out.println(" \"geometries\" : [");
51+
Map<String, GeometryInfo> geometryData = collectGeometryData();
52+
writeGeometries(geometryData);
53+
out.println(" ]");
54+
out.println(" \"object\" : {");
55+
out.println(" \"uuid\" : \"root\",");
56+
out.println(" \"type\" : \"Scene\",");
57+
out.println(" \"matrix\" : [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],");
58+
out.println(" \"children\" : [");
59+
writeObjects(geometryData);
60+
out.println(" ]");
61+
out.println(" }");
62+
out.println("}");
5363
out.flush();
5464

5565
setMode(Mode.FINISHED);
@@ -59,13 +69,11 @@ protected boolean write(OutputStream outputStream, ProgressReporter progressRepo
5969
}
6070
}
6171

62-
private void writeGeometry(GeometryData geometryData, IfcRoot ifcRoot) {
63-
out.println(" \"id\" : \"" + ifcRoot.getGlobalId() + "\", ");
64-
out.println(" \"type\" : \"" + ifcRoot.eClass().getName().toUpperCase() + "\", ");
65-
out.println(" \"geometry\" : {");
66-
out.println(" \"metadata\" : { \"formatVersion\" : 3 }, ");
67-
out.println(" \"materials\": [],");
68-
out.print(" \"vertices\": [ ");
72+
private void writeGeometry(GeometryData geometryData) {
73+
out.println(" \"uuid\" : \"" + geometryData.getOid() + "\", ");
74+
out.println(" \"type\" : \"BufferGeometry\", ");
75+
out.println(" \"data\" : {");
76+
out.print(" \"vertices\": [ ");
6977

7078
List<Float> vertices = getFloatList(geometryData.getVertices());
7179
if (vertices != null && vertices.size() > 0) {
@@ -76,7 +84,7 @@ private void writeGeometry(GeometryData geometryData, IfcRoot ifcRoot) {
7684
}
7785
}
7886

79-
out.println(" ], ");
87+
out.println("], ");
8088
out.print(" \"normals\": [");
8189

8290
List<Float> normals = getFloatList(geometryData.getNormals());
@@ -88,10 +96,9 @@ private void writeGeometry(GeometryData geometryData, IfcRoot ifcRoot) {
8896
}
8997
}
9098

91-
out.println(" ],");
92-
out.println(" \"colors\": [ ],");
93-
out.println(" \"uvs\": [ ],");
94-
out.print(" \"faces\": [ ");
99+
out.println("],");
100+
out.println(" \"uvs\": [ ],");
101+
out.print(" \"faces\": [ ");
95102

96103
List<Integer> indices = getIntegerList(geometryData.getIndices());
97104
if (indices != null && indices.size() > 0) {
@@ -103,33 +110,70 @@ private void writeGeometry(GeometryData geometryData, IfcRoot ifcRoot) {
103110
}
104111
}
105112

106-
out.println(" ]");
107-
out.println(" }");
108-
out.println();
113+
out.println("]");
109114
}
110115

111116
@SuppressWarnings("unchecked")
112-
private void writeGeometries() {
117+
private Map<String, GeometryInfo> collectGeometryData() {
118+
Map<String, GeometryInfo> geometryData = new HashMap<String, GeometryInfo>();
113119
Class<IdEObject>[] eClasses = new Class[] {
114120
IfcWall.class, IfcWindow.class, IfcDoor.class, IfcSlab.class, IfcColumn.class,
115121
org.bimserver.models.ifc4.IfcWall.class,org.bimserver.models.ifc4.IfcWindow.class,
116122
org.bimserver.models.ifc4.IfcDoor.class, org.bimserver.models.ifc4.IfcSlab.class,
117123
org.bimserver.models.ifc4.IfcColumn.class
118124
};
119-
120-
boolean first = true;
121125
for (Class<? extends IdEObject> eClass : eClasses) {
122-
for (IdEObject object : model.getAllWithSubTypes(eClass)) {
126+
for (IdEObject object : model.getAllWithSubTypes(eClass)) {
123127
IfcProduct ifcRoot = (IfcProduct) object;
124-
GeometryInfo geometryInfo = ifcRoot.getGeometry();
125-
if (geometryInfo != null) {
126-
out.println(first ? " {" : " ,{");
127-
first = false;
128-
writeGeometry(geometryInfo.getData(), ifcRoot);
129-
out.print(" }");
130-
}
128+
GeometryInfo geometryInfo = ifcRoot.getGeometry();
129+
if (geometryInfo != null) {
130+
geometryData.put(ifcRoot.getGlobalId(), geometryInfo);
131+
}
132+
}
133+
}
134+
return geometryData;
135+
}
136+
137+
138+
private void writeGeometries(Map<String, GeometryInfo> geometryInfos) {
139+
boolean first = true;
140+
Set<Long> writtenGeometries = new HashSet<Long>();
141+
for(GeometryInfo geometryInfo: geometryInfos.values()){
142+
if(!writtenGeometries.contains(geometryInfo.getData().getOid())){
143+
out.println(first ? " {" : " ,{");
144+
first = false;
145+
writeGeometry(geometryInfo.getData());
146+
out.print(" }");
147+
writtenGeometries.add(geometryInfo.getData().getOid());
131148
}
132149
}
150+
out.println();
151+
}
152+
153+
private void writeObjects(Map<String, GeometryInfo> geometryInfos) {
154+
boolean first = true;
155+
for (Map.Entry<String, GeometryInfo> geometryEntry: geometryInfos.entrySet()) {
156+
String guid = geometryEntry.getKey();
157+
GeometryInfo geometryInfo = geometryEntry.getValue();
158+
out.println(first ? " {" : " , {");
159+
writeObject(guid, geometryInfo);
160+
out.print(" }");
161+
first = false;
162+
}
163+
out.println();
164+
}
165+
166+
private void writeObject(String guid, GeometryInfo geometryInfo) {
167+
out.println(" \"uuid\" : \"" + guid + "\", ");
168+
out.println(" \"type\" : \"Mesh\", ");
169+
out.println(" \"geometry\" : \"" + geometryInfo.getData().getOid() + "\", ");
170+
out.print( " \"matrix\" : ");
171+
boolean first = true;
172+
for(int i: getIntegerList(geometryInfo.getTransformation())){
173+
out.print(first ? "" : ",");
174+
out.print(i);
175+
first=false;
176+
}
133177
}
134178

135179
private List<Float> getFloatList(byte[] byteArray) {

ServerPlugin/src/org/bimserver/serializers/json/ThreeJsSerializerPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public String getDescription() {
3636

3737
@Override
3838
public String getVersion() {
39-
return "0.1";
39+
return "0.6";
4040
}
4141

4242
@Override

0 commit comments

Comments
 (0)