fromJson static method
Decodes one tagged primitive, or null for malformed entries and kinds this build does not know (newer manifests degrade to fewer primitives).
Implementation
static GizmoPrimitive? fromJson(Object? json) {
if (json is! Map) return null;
final visibility =
GizmoVisibility.values.asNameMap()[json['visibility']] ??
GizmoVisibility.always;
final color = GizmoColor.fromJson(json['color']);
final xray = json['xray'] != false;
final when = GizmoCondition.fromJson(json['when']);
GizmoScalar scalar(String key, double fallback) =>
GizmoScalar.fromJson(json[key]) ?? GizmoScalar(fallback);
List<double>? vector(String key) {
final raw = json[key];
if (raw is! List || !raw.every((c) => c is num)) return null;
return [for (final component in raw) (component as num).toDouble()];
}
switch (json['kind']) {
case 'icon':
return GizmoIcon(
glyph: json['glyph'] is String ? json['glyph'] as String : null,
size: (json['size'] as num?)?.toDouble() ?? 28,
color: color,
when: when,
);
case 'arrow':
return GizmoArrow(
axis: vector('axis') ?? const [0, 0, 1],
axisBind: json['axisBind'] is String
? json['axisBind'] as String
: null,
length: scalar('length', 1),
visibility: visibility,
color: color,
xray: xray,
when: when,
);
case 'lines':
final points = vector('points');
if (points == null) return null;
return GizmoLines(
points,
visibility: visibility,
color: color,
xray: xray,
when: when,
);
case 'wireSphere':
return GizmoWireSphere(
radius: scalar('radius', 1),
center: vector('center') ?? const [0, 0, 0],
inflate: scalar('inflate', 0),
visibility: visibility,
color: color,
xray: xray,
when: when,
);
case 'wireBox':
return GizmoWireBox(
halfExtents: vector('halfExtents'),
halfExtentsBind: json['halfExtentsBind'] is String
? json['halfExtentsBind'] as String
: null,
center: vector('center') ?? const [0, 0, 0],
inflate: scalar('inflate', 0),
visibility: visibility,
color: color,
xray: xray,
when: when,
);
case 'wireRect':
return GizmoWireRect(
width: scalar('width', 1),
height: scalar('height', 1),
axis: vector('axis') ?? const [0, 0, 1],
visibility: visibility,
color: color,
xray: xray,
when: when,
);
case 'wireCircle':
return GizmoWireCircle(
radius: scalar('radius', 1),
axis: vector('axis') ?? const [0, 0, 1],
visibility: visibility,
color: color,
xray: xray,
when: when,
);
case 'wireCone':
return GizmoWireCone(
angle: scalar('angle', 0.5),
range: scalar('range', 1),
axis: vector('axis') ?? const [0, 0, 1],
axisBind: json['axisBind'] is String
? json['axisBind'] as String
: null,
visibility: visibility,
color: color,
xray: xray,
when: when,
);
case 'wireCapsule':
return GizmoWireCapsule(
radius: scalar('radius', 0.5),
halfHeight: scalar('halfHeight', 0.5),
axis: vector('axis') ?? const [0, 1, 0],
visibility: visibility,
color: color,
xray: xray,
when: when,
);
case 'wireCylinder':
return GizmoWireCylinder(
radius: scalar('radius', 0.5),
halfHeight: scalar('halfHeight', 0.5),
axis: vector('axis') ?? const [0, 1, 0],
visibility: visibility,
color: color,
xray: xray,
when: when,
);
case 'frustum':
return GizmoFrustum(
fovY: scalar('fovY', 0.8),
near: scalar('near', 0.1),
far: scalar('far', 1000),
aspect: GizmoScalar.fromJson(json['aspect']),
visibility: visibility,
color: color,
xray: xray,
when: when,
);
}
return null;
}