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