gizmoInfo static method

Map<String, dynamic>? gizmoInfo(
  1. GizmoType type,
  2. ContorlsMode mode
)

Implementation

static Map<String,dynamic>? gizmoInfo(GizmoType type, ContorlsMode mode){
  final gizmoMaterial = MeshBasicMaterial.fromMap({
    "depthTest": false,
    "depthWrite": false,
    "fog": false,
    "toneMapped": false,
    "transparent": true
  });

  final gizmoLineMaterial = LineBasicMaterial.fromMap({
    "depthTest": false,
    "depthWrite": false,
    "fog": false,
    "toneMapped": false,
    "transparent": true
  });

  // Make unique material for each axis/color
  final matInvisible = gizmoMaterial.clone();
  matInvisible.opacity = 0.15;

  final matHelper = gizmoLineMaterial.clone();
  matHelper.opacity = 0.5;

  final matRed = gizmoMaterial.clone();
  matRed.color.setFromHex32(0xff0000);

  final matGreen = gizmoMaterial.clone();
  matGreen.color.setFromHex32(0x00ff00);

  final matBlue = gizmoMaterial.clone();
  matBlue.color.setFromHex32(0x0000ff);

  final matRedTransparent = gizmoMaterial.clone();
  matRedTransparent.color.setFromHex32(0xff0000);
  matRedTransparent.opacity = 0.5;

  final matGreenTransparent = gizmoMaterial.clone();
  matGreenTransparent.color.setFromHex32(0x00ff00);
  matGreenTransparent.opacity = 0.5;

  final matBlueTransparent = gizmoMaterial.clone();
  matBlueTransparent.color.setFromHex32(0x0000ff);
  matBlueTransparent.opacity = 0.5;

  final matWhiteTransparent = gizmoMaterial.clone();
  matWhiteTransparent.opacity = 0.25;

  final matYellowTransparent = gizmoMaterial.clone();
  matYellowTransparent.color.setFromHex32(0xffff00);
  matYellowTransparent.opacity = 0.25;

  final matYellow = gizmoMaterial.clone();
  matYellow.color.setFromHex32(0xffff00);

  final matGray = gizmoMaterial.clone();
  matGray.color.setFromHex32(0x787878);

  // reusable geometry
  geo.TorusGeometry circleGeometry(radius, arc) {
    final geometry = geo.TorusGeometry(radius, 0.0075, 3, 64, arc * math.pi * 2);
    geometry.rotateY(math.pi / 2);
    geometry.rotateX(math.pi / 2);
    return geometry;
  };

  final arrowGeometry = geo.CylinderGeometry(0, 0.04, 0.1, 12);
  arrowGeometry.translate(0, 0.05, 0);

  final scaleHandleGeometry = BoxGeometry(0.08, 0.08, 0.08);
  scaleHandleGeometry.translate(0, 0.04, 0);

  final viewHandleGeometry = SphereGeometry(0.04);
  scaleHandleGeometry.translate(0, 0.04, 0);

  final lineGeometry = BufferGeometry();
  lineGeometry.setAttribute(Attribute.position, Float32BufferAttribute.fromList(Float32List.fromList([0.0, 0.0, 0.0, 1.0, 0.0, 0.0]), 3));

  final lineGeometry2 = geo.CylinderGeometry(0.0075, 0.0075, 0.5, 3);
  lineGeometry2.translate(0, 0.25, 0);

  // Special geometry for transform helper. If scaled with position vector it spans from [0,0,0] to position

  BufferGeometry translateHelperGeometry() {
    final geometry = BufferGeometry();
    geometry.setAttribute(Attribute.position, Float32BufferAttribute.fromList(Float32List.fromList([0.0, 0.0, 0.0, 1.0, 1.0, 1.0]), 3));
    return geometry;
  }

  if(type == GizmoType.translate && mode == ContorlsMode.gizmo)
  return {
    "X": [
      [
        Mesh(arrowGeometry, matRed),
        [0.5, 0.0, 0.0],
        [0.0, 0.0, -math.pi / 2]
      ],
      [
        Mesh(arrowGeometry, matRed),
        [-0.5, 0.0, 0.0],
        [0.0, 0.0, math.pi / 2]
      ],
      [
        Mesh(lineGeometry2, matRed),
        [0.0, 0.0, 0.0],
        [0.0, 0.0, -math.pi / 2]
      ]
    ],
    "Y": [
      [
        Mesh(arrowGeometry, matGreen),
        [0, 0.5, 0]
      ],
      [
        Mesh(arrowGeometry, matGreen),
        [0, -0.5, 0],
        [math.pi, 0, 0]
      ],
      [Mesh(lineGeometry2, matGreen)]
    ],
    "Z": [
      [
        Mesh(arrowGeometry, matBlue),
        [0, 0, 0.5],
        [math.pi / 2, 0, 0]
      ],
      [
        Mesh(arrowGeometry, matBlue),
        [0, 0, -0.5],
        [-math.pi / 2, 0, 0]
      ],
      [
        Mesh(lineGeometry2, matBlue),
        null,
        [math.pi / 2, 0, 0]
      ]
    ],
    "XYZ": [
      [
        Mesh(geo.OctahedronGeometry(0.1, 0), matWhiteTransparent.clone()),
        [0, 0, 0]
      ]
    ],
    "XY": [
      [
        Mesh(
            BoxGeometry(0.15, 0.15, 0.01), matBlueTransparent.clone()),
        [0.15, 0.15, 0]
      ]
    ],
    "YZ": [
      [
        Mesh(
            BoxGeometry(0.15, 0.15, 0.01), matRedTransparent.clone()),
        [0, 0.15, 0.15],
        [0, math.pi / 2, 0]
      ]
    ],
    "XZ": [
      [
        Mesh(
            BoxGeometry(0.15, 0.15, 0.01), matGreenTransparent.clone()),
        [0.15, 0, 0.15],
        [-math.pi / 2, 0, 0]
      ]
    ]
  };

  if(type == GizmoType.translate && mode == ContorlsMode.picker)
  return {
    "X": [
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0.3, 0, 0],
        [0, 0, -math.pi / 2]
      ],
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [-0.3, 0, 0],
        [0, 0, math.pi / 2]
      ]
    ],
    "Y": [
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0, 0.3, 0]
      ],
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0, -0.3, 0],
        [0, 0, math.pi]
      ]
    ],
    "Z": [
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0, 0, 0.3],
        [math.pi / 2, 0, 0]
      ],
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0, 0, -0.3],
        [-math.pi / 2, 0, 0]
      ]
    ],
    "XYZ": [
      [Mesh(geo.OctahedronGeometry(0.2, 0), matInvisible)]
    ],
    "XY": [
      [
        Mesh(BoxGeometry(0.2, 0.2, 0.01), matInvisible),
        [0.15, 0.15, 0]
      ]
    ],
    "YZ": [
      [
        Mesh(BoxGeometry(0.2, 0.2, 0.01), matInvisible),
        [0, 0.15, 0.15],
        [0, math.pi / 2, 0]
      ]
    ],
    "XZ": [
      [
        Mesh(BoxGeometry(0.2, 0.2, 0.01), matInvisible),
        [0.15, 0, 0.15],
        [-math.pi / 2, 0, 0]
      ]
    ]
  };

  if(type == GizmoType.translate && mode == ContorlsMode.helper)
  return {
    "START": [
      [
        Mesh(geo.OctahedronGeometry(0.01, 2), matHelper),
        null,
        null,
        null,
        'helper'
      ]
    ],
    "END": [
      [
        Mesh(geo.OctahedronGeometry(0.01, 2), matHelper),
        null,
        null,
        null,
        'helper'
      ]
    ],
    "DELTA": [
      [
        Line(translateHelperGeometry(), matHelper),
        null,
        null,
        null,
        'helper'
      ]
    ],
    "X": [
      [
        Line(lineGeometry, matHelper.clone()),
        [-1e3, 0, 0],
        null,
        [1e6, 1, 1],
        'helper'
      ]
    ],
    "Y": [
      [
        Line(lineGeometry, matHelper.clone()),
        [0, -1e3, 0],
        [0, 0, math.pi / 2],
        [1e6, 1, 1],
        'helper'
      ]
    ],
    "Z": [
      [
        Line(lineGeometry, matHelper.clone()),
        [0, 0, -1e3],
        [0, -math.pi / 2, 0],
        [1e6, 1, 1],
        'helper'
      ]
    ]
  };

  if(type == GizmoType.rotate && mode == ContorlsMode.gizmo)
  return {
    "XYZE": [
      [
        Mesh(circleGeometry(0.5,1), matGray),//geo.CircleGeometry(radius: 0.5, thetaLength:1)
        null,
        [0, math.pi / 2, 0]
      ]
    ],
    "X": [
      [Mesh(circleGeometry(0.5,0.5),matRed)],//geo.CircleGeometry(radius: 0.5, thetaLength:0.5), matRed)]
    ],
    "Y": [
      [
        Mesh(circleGeometry(0.5,0.5),matGreen),//Mesh(geo.CircleGeometry(radius: 0.5, thetaLength:0.5), matGreen),
        null,
        [0, 0, -math.pi / 2]
      ]
    ],
    "Z": [
      [
        Mesh(circleGeometry(0.5,0.5),matBlue),//Mesh(geo.CircleGeometry(radius: 0.5, thetaLength:0.5), matBlue),
        null,
        [0, math.pi / 2, 0]
      ]
    ],
    "E": [
      [
        Mesh(circleGeometry(0.75,1),matYellowTransparent),//Mesh(geo.CircleGeometry(radius: 0.75, thetaLength:1), matYellowTransparent),
        null,
        [0, math.pi / 2, 0]
      ]
    ]
  };

  if(type == GizmoType.rotate && mode == ContorlsMode.helper)
  return {
    "AXIS": [
      [
        Line(lineGeometry, matHelper.clone()),
        [-1e3, 0, 0],
        null,
        [1e6, 1, 1],
        'helper'
      ]
    ]
  };

  if(type == GizmoType.rotate && mode == ContorlsMode.picker)
  return {
    "XYZE": [
      [Mesh(SphereGeometry(0.25, 10, 8), matInvisible)]
    ],
    "X": [
      [
        Mesh(geo.TorusGeometry(0.5, 0.1, 4, 24), matInvisible),
        [0, 0, 0],
        [0, -math.pi / 2, -math.pi / 2]
      ],
    ],
    "Y": [
      [
        Mesh(geo.TorusGeometry(0.5, 0.1, 4, 24), matInvisible),
        [0, 0, 0],
        [math.pi / 2, 0, 0]
      ],
    ],
    "Z": [
      [
        Mesh(geo.TorusGeometry(0.5, 0.1, 4, 24), matInvisible),
        [0, 0, 0],
        [0, 0, -math.pi / 2]
      ],
    ],
    "E": [
      [Mesh(geo.TorusGeometry(0.75, 0.1, 2, 24), matInvisible)]
    ]
  };

  if(type == GizmoType.scale && mode == ContorlsMode.gizmo)
  return {
    "X": [
      [
        Mesh(scaleHandleGeometry, matRed),
        [0.5, 0, 0],
        [0, 0, -math.pi / 2]
      ],
      [
        Mesh(lineGeometry2, matRed),
        [0, 0, 0],
        [0, 0, -math.pi / 2]
      ],
      [
        Mesh(scaleHandleGeometry, matRed),
        [-0.5, 0, 0],
        [0, 0, math.pi / 2]
      ],
    ],
    "Y": [
      [
        Mesh(scaleHandleGeometry, matGreen),
        [0, 0.5, 0]
      ],
      [Mesh(lineGeometry2, matGreen)],
      [
        Mesh(scaleHandleGeometry, matGreen),
        [0, -0.5, 0],
        [0, 0, math.pi]
      ],
    ],
    "Z": [
      [
        Mesh(scaleHandleGeometry, matBlue),
        [0, 0, 0.5],
        [math.pi / 2, 0, 0]
      ],
      [
        Mesh(lineGeometry2, matBlue),
        [0, 0, 0],
        [math.pi / 2, 0, 0]
      ],
      [
        Mesh(scaleHandleGeometry, matBlue),
        [0, 0, -0.5],
        [-math.pi / 2, 0, 0]
      ]
    ],
    "XY": [
      [
        Mesh(BoxGeometry(0.15, 0.15, 0.01), matBlueTransparent),
        [0.15, 0.15, 0]
      ]
    ],
    "YZ": [
      [
        Mesh(BoxGeometry(0.15, 0.15, 0.01), matRedTransparent),
        [0, 0.15, 0.15],
        [0, math.pi / 2, 0]
      ]
    ],
    "XZ": [
      [
        Mesh(BoxGeometry(0.15, 0.15, 0.01), matGreenTransparent),
        [0.15, 0, 0.15],
        [-math.pi / 2, 0, 0]
      ]
    ],
    "XYZ": [
      [Mesh(BoxGeometry(0.1, 0.1, 0.1), matWhiteTransparent.clone())],
    ]
  };

  if(type == GizmoType.scale && mode == ContorlsMode.picker)
  return {
    "X": [
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0.3, 0, 0],
        [0, 0, -math.pi / 2]
      ],
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [-0.3, 0, 0],
        [0, 0, math.pi / 2]
      ]
    ],
    "Y": [
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0, 0.3, 0]
      ],
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0, -0.3, 0],
        [0, 0, math.pi]
      ]
    ],
    "Z": [
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0, 0, 0.3],
        [math.pi / 2, 0, 0]
      ],
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0, 0, -0.3],
        [-math.pi / 2, 0, 0]
      ]
    ],
    "XY": [
      [
        Mesh(BoxGeometry(0.2, 0.2, 0.01), matInvisible),
        [0.15, 0.15, 0]
      ],
    ],
    "YZ": [
      [
        Mesh(BoxGeometry(0.2, 0.2, 0.01), matInvisible),
        [0, 0.15, 0.15],
        [0, math.pi / 2, 0]
      ],
    ],
    "XZ": [
      [
        Mesh(BoxGeometry(0.2, 0.2, 0.01), matInvisible),
        [0.15, 0, 0.15],
        [-math.pi / 2, 0, 0]
      ],
    ],
    "XYZ": [
      [
        Mesh(BoxGeometry(0.2, 0.2, 0.2), matInvisible),
        [0, 0, 0]
      ],
    ]
  };

  if(type == GizmoType.scale && mode == ContorlsMode.helper)
  return {
    "X": [
      [
        Line(lineGeometry, matHelper.clone()),
        [-1e3, 0, 0],
        null,
        [1e6, 1, 1],
        'helper'
      ]
    ],
    "Y": [
      [
        Line(lineGeometry, matHelper.clone()),
        [0, -1e3, 0],
        [0, 0, math.pi / 2],
        [1e6, 1, 1],
        'helper'
      ]
    ],
    "Z": [
      [
        Line(lineGeometry, matHelper.clone()),
        [0, 0, -1e3],
        [0, -math.pi / 2, 0],
        [1e6, 1, 1],
        'helper'
      ]
    ]
  };

  if(type == GizmoType.view && mode == ContorlsMode.gizmo)
  return {
    "X": [
      [
        Mesh(viewHandleGeometry, matRed),
        [0.5, 0, 0],
        [0, 0, -math.pi / 2]
      ],
      [
        Mesh(lineGeometry2, matRed),
        [0, 0, 0],
        [0, 0, -math.pi / 2]
      ],
      [
        Mesh(viewHandleGeometry, matRed),
        [-0.5, 0, 0],
        [0, 0, math.pi / 2]
      ],
    ],
    "Y": [
      [
        Mesh(viewHandleGeometry, matGreen),
        [0, 0.5, 0]
      ],
      [Mesh(lineGeometry2, matGreen)],
      [
        Mesh(viewHandleGeometry, matGreen),
        [0, -0.5, 0],
        [0, 0, math.pi]
      ],
    ],
    "Z": [
      [
        Mesh(viewHandleGeometry, matBlue),
        [0, 0, 0.5],
        [math.pi / 2, 0, 0]
      ],
      [
        Mesh(lineGeometry2, matBlue),
        [0, 0, 0],
        [math.pi / 2, 0, 0]
      ],
      [
        Mesh(viewHandleGeometry, matBlue),
        [0, 0, -0.5],
        [-math.pi / 2, 0, 0]
      ]
    ],
    "XY": [
      [
        Mesh(BoxGeometry(0.15, 0.15, 0.01), matBlueTransparent),
        [0.15, 0.15, 0]
      ]
    ],
    "YZ": [
      [
        Mesh(BoxGeometry(0.15, 0.15, 0.01), matRedTransparent),
        [0, 0.15, 0.15],
        [0, math.pi / 2, 0]
      ]
    ],
    "XZ": [
      [
        Mesh(BoxGeometry(0.15, 0.15, 0.01), matGreenTransparent),
        [0.15, 0, 0.15],
        [-math.pi / 2, 0, 0]
      ]
    ],
    "XYZ": [
      [Mesh(BoxGeometry(0.1, 0.1, 0.1), matWhiteTransparent.clone())],
    ]
  };

  if(type == GizmoType.view && mode == ContorlsMode.picker)
  return {
    "X": [
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0.3, 0, 0],
        [0, 0, -math.pi / 2]
      ],
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [-0.3, 0, 0],
        [0, 0, math.pi / 2]
      ]
    ],
    "Y": [
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0, 0.3, 0]
      ],
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0, -0.3, 0],
        [0, 0, math.pi]
      ]
    ],
    "Z": [
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0, 0, 0.3],
        [math.pi / 2, 0, 0]
      ],
      [
        Mesh(geo.CylinderGeometry(0.2, 0, 0.6, 4), matInvisible),
        [0, 0, -0.3],
        [-math.pi / 2, 0, 0]
      ]
    ],
    "XY": [
      [
        Mesh(BoxGeometry(0.2, 0.2, 0.01), matInvisible),
        [0.15, 0.15, 0]
      ],
    ],
    "YZ": [
      [
        Mesh(BoxGeometry(0.2, 0.2, 0.01), matInvisible),
        [0, 0.15, 0.15],
        [0, math.pi / 2, 0]
      ],
    ],
    "XZ": [
      [
        Mesh(BoxGeometry(0.2, 0.2, 0.01), matInvisible),
        [0.15, 0, 0.15],
        [-math.pi / 2, 0, 0]
      ],
    ],
    "XYZ": [
      [
        Mesh(BoxGeometry(0.2, 0.2, 0.2), matInvisible),
        [0, 0, 0]
      ],
    ]
  };

  if(type == GizmoType.view && mode == ContorlsMode.helper)
  return {
    "X": [
      [
        Line(lineGeometry, matHelper.clone()),
        [-1e3, 0, 0],
        null,
        [1e6, 1, 1],
        'helper'
      ]
    ],
    "Y": [
      [
        Line(lineGeometry, matHelper.clone()),
        [0, -1e3, 0],
        [0, 0, math.pi / 2],
        [1e6, 1, 1],
        'helper'
      ]
    ],
    "Z": [
      [
        Line(lineGeometry, matHelper.clone()),
        [0, 0, -1e3],
        [0, -math.pi / 2, 0],
        [1e6, 1, 1],
        'helper'
      ]
    ]
  };

  return null;
}