fromJson static method

GizmoPrimitive? fromJson(
  1. Object? json
)

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;
}