toJSON method
dynamic
toJSON()
Implementation
toJSON() {
Map<String, dynamic> data = {
"metadata": {"version": 4.5, "type": 'Geometry', "generator": 'Geometry.toJSON'}
};
// standard Geometry serialization
data["uuid"] = uuid;
data["type"] = type;
if (name != '') data["name"] = name;
print(" Geometry tojson todo ");
// if ( this.parameters != null ) {
// var parameters = this.parameters;
// for ( var key in parameters ) {
// if ( parameters[ key ] != null ) data[ key ] = parameters[ key ];
// }
// return data;
// }
var vertices = [];
for (var i = 0; i < this.vertices.length; i++) {
var vertex = this.vertices[i];
vertices.addAll([vertex.x, vertex.y, vertex.z]);
}
var faces = [];
var normals = [];
var normalsHash = {};
var colors = [];
var colorsHash = {};
var uvs = [];
var uvsHash = {};
setBit(value, position, enabled) {
return enabled ? value | (1 << position) : value & (~(1 << position));
}
getNormalIndex(normal) {
var hash = normal.x.toString() + normal.y.toString() + normal.z.toString();
if (normalsHash[hash] != null) {
return normalsHash[hash];
}
normalsHash[hash] = normals.length / 3;
normals.addAll([normal.x, normal.y, normal.z]);
return normalsHash[hash];
}
getColorIndex(color) {
var hash = color.r.toString() + color.g.toString() + color.b.toString();
if (colorsHash[hash] != null) {
return colorsHash[hash];
}
colorsHash[hash] = colors.length;
colors.add(color.getHex());
return colorsHash[hash];
}
getUvIndex(uv) {
var hash = uv.x.toString() + uv.y.toString();
if (uvsHash[hash] != null) {
return uvsHash[hash];
}
uvsHash[hash] = uvs.length / 2;
uvs.addAll([uv.x, uv.y]);
return uvsHash[hash];
}
for (var i = 0; i < this.faces.length; i++) {
var face = this.faces[i];
var hasMaterial = true;
var hasFaceUv = false; // deprecated
var hasFaceVertexUv = faceVertexUvs[0]?[i] != null;
var hasFaceNormal = face.normal.length() > 0;
var hasFaceVertexNormal = face.vertexNormals.isNotEmpty;
var hasFaceColor = face.color.r != 1 || face.color.g != 1 || face.color.b != 1;
var hasFaceVertexColor = face.vertexColors.isNotEmpty;
var faceType = 0;
faceType = setBit(faceType, 0, 0); // isQuad
faceType = setBit(faceType, 1, hasMaterial);
faceType = setBit(faceType, 2, hasFaceUv);
faceType = setBit(faceType, 3, hasFaceVertexUv);
faceType = setBit(faceType, 4, hasFaceNormal);
faceType = setBit(faceType, 5, hasFaceVertexNormal);
faceType = setBit(faceType, 6, hasFaceColor);
faceType = setBit(faceType, 7, hasFaceVertexColor);
faces.add(faceType);
faces.addAll([face.a, face.b, face.c]);
faces.add(face.materialIndex);
if (hasFaceVertexUv) {
var faceVertexUvs = this.faceVertexUvs[0]![i];
faces.addAll([getUvIndex(faceVertexUvs[0]), getUvIndex(faceVertexUvs[1]), getUvIndex(faceVertexUvs[2])]);
}
if (hasFaceNormal) {
faces.add(getNormalIndex(face.normal));
}
if (hasFaceVertexNormal) {
var vertexNormals = face.vertexNormals;
faces.addAll(
[getNormalIndex(vertexNormals[0]), getNormalIndex(vertexNormals[1]), getNormalIndex(vertexNormals[2])]);
}
if (hasFaceColor) {
faces.add(getColorIndex(face.color));
}
if (hasFaceVertexColor) {
var vertexColors = face.vertexColors;
faces.addAll([getColorIndex(vertexColors[0]), getColorIndex(vertexColors[1]), getColorIndex(vertexColors[2])]);
}
}
data["data"] = {};
data["data"].vertices = vertices;
data["data"].normals = normals;
if (colors.isNotEmpty) data["data"].colors = colors;
if (uvs.isNotEmpty) data["data"].uvs = [uvs]; // temporal backward compatibility
data["data"].faces = faces;
return data;
}