soiz1's picture
Upload 811 files
30c32c8 verified
raw
history blame
18.9 kB
const BlockType = require('../../extension-support/block-type');
const ArgumentType = require('../../extension-support/argument-type');
const Icons = {
Cube: require('./cube.png'),
Sphere: require('./sphere.png'),
Plane: require('./plane.png'),
Light: require('./light.png'),
OBJ: require('./obj.png'),
Camera: require('./camera.png'),
Touching: require('./touching.png'),
Wireframe: require('./wireframe.png'),
Raycast: require('./raycast.png'),
}
const blockIconURI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAT6SURBVHhe7ZtdqBVVFMfXnHuvXG9i9/ZhWYGVYWoggqGVFSV9ywUpohch+lARFXwRAu1BEB97kNAKheiphyAKEqKXICIyKuhFS0Qh+yKvZqLXj+sZ//+99syZU/ecMx975pzDzA/WzFpzzszstWatvfeZmSMV3WXArkvHOMSPyFJIKRiChI6PL2kKAsWDFEqRJ6SDhgGcdeoAFG4ZRCNeNpujFNauIk40AblBVZH6fpx0mrPW6wjMOmson0OeUTU/anadB9sgvMbG+fdfhYGrPp3zpIaW8PMDr9kNIk9DuP+LxsqJPDLgRsgpVUXunyfy3ZtQkpwJbt/9hsjx8CiG6yAXVHWH6wCEdT42InJ6D5QsZ8DRZm8SOXfJ2orTNrs62J+QW1QVmXxHZJj9vSPOToqMbraG8gfkNlWzkbUPWA/hVTfO/7gTBurYpfPk+pl63P2v2A0icyE87xPGykDGBFWW3ynyLeu8CHDWFbtEDp2wtpLaj6Q78vsYsJQhTGQvvwvFVSElZAjD5lTYGkPiliTZ4STkdlVxIT7A4orqXQUeeBhiIxyGLFa1M3H6gNUQprtxft9aGJzF9YLzBC1je7Zx1qAsgrC9DxurA+0yYAxyWlWRNfi58jF74i6leyzg9sLtIj//ZW1lFHJW1f/Tyh1uN9U1MkPk/F67pV9AIGZsQJJetXab1rf6gAk+OPUZ5ucc4fuUr4+hDnYb9RBkhdH+Q9s+YGA+FisRUFZUH1FnezFTWLlK7XbEmgh57E4ozUNO70HHMT+sJZgjxp8J8uCPQB4wVu/Bn2B0PGG2Jp8K8y4ey4J9aw9QH8aCE2N01mlIHgCLdx8WCIQ0etpCMf0SHK9xsM5A6gCEPGolYeqlJXDcc/Jb0EUACLMAnaT/kJp54c9x53iAmwBYzO0u9g/skBxSH8SCVz2HpwhOAxDgLcSCgch4dJ+ZxTq/We08yCUAAd6DWLCjTDp/YJ0j1b071MyTXAMQgvmDv8zqHTDlk2I8T0sxAQAex2uWRYtOrM5xnHWecjxPS2EBCPDuwoKBsPMHn+XBOnfcccal8AAEeJw74MeWF95j6g5dC0CvUAXArktLFQC7Li1VAOy6tFQBsOvSUgXArktLFQC7Li3tA8B7cf3MrM5PdFt9YzYkfKTs/4JFHo/F+ODV+YtvYACONd4XIC0j0SoD/oWE92a8BSL3PAmloNtUWVjwenznSbsS4CNy7mxuYh37FcYikYkLndOqG5ycQPueEzn6u92AAoB0bGwSbw5CnlUVycD0/Uf11LgoAVxCr/mN4rchW1TtTJrLeRli3gQcRpFM/kQtJRkDUFuNC9Fclon9STMMsm8wL0BfRCj4EOSlrbQKAg4v3YzzIt0jzs+EpKrNVDtF4NsC36gq8ulekfEYb2WEJM2A4Zp4q5qGo3shHKNSkzUAAXwva46quDK/YXFO9bbEDcAIGvqY1RUG3cmjWFcBCAiT8qYxkb/D3GhBjADMel7k/EVrKE7bnKYPaAcbN4/KqTMw0D+89yGt5GzZh/1R5xHn50JcXzD3B4zwAuQjVTGt/B7TS/7lIco0GfDFDyJP7bCGwkcoX6nqnjwDENA0UPnHsQj+ABENAPpx73GrK8ihxn+N+h2WGgNhZPF8jGBHIF9CDop/62jjMyuuS7NnQH/ecPSTPUNRpyml4S1I1PGNkIqKiqIRuQYHeAEU9sBGCQAAAABJRU5ErkJggg==";
const seperator = "---";
function infoMenu(array) {
return {
acceptReporters: true,
items: array.map(item => ({ text: item, value: item }))
}
}
function infoLabel(text) {
return {
blockType: BlockType.LABEL,
text: text
}
}
function infoArgument(value, extra, extra2) {
switch (typeof value) {
case "number":
return { type: ArgumentType.NUMBER, defaultValue: value };
case "boolean":
return { type: ArgumentType.BOOLEAN, defaultValue: value };
case "string":
switch (value) {
case "COLOR":
return { type: ArgumentType.COLOR };
case "ANGLE":
return { type: ArgumentType.ANGLE };
case "MATRIX":
return { type: ArgumentType.MATRIX };
case "NOTE":
return { type: ArgumentType.NOTE, defaultValue: 60 };
case "POLYGON":
return { type: ArgumentType.POLYGON, nodes: extra };
case "IMAGE":
return { type: ArgumentType.IMAGE, dataURI: extra, alt: extra2 };
default:
return { type: ArgumentType.STRING, defaultValue: value };
}
}
}
function infoArgumentMenu(type, menu) {
return {
type: type,
menu: menu
}
}
function createCommandBlock(opcode, text, args, icon, hidden) {
const obj = {
opcode: opcode,
text: text ? text : opcode,
blockType: BlockType.COMMAND
}
if (args) {
obj.arguments = args;
}
if (icon) {
obj.blockIconURI = icon;
}
if (hidden === true) {
obj.hideFromPalette = true;
}
return obj;
}
function createReporterBlock(opcode, text, args, icon, disablemonitor) {
const obj = {
opcode: opcode,
text: text ? text : opcode,
blockType: BlockType.REPORTER
}
if (typeof disablemonitor === 'boolean') {
obj.disableMonitor = disablemonitor;
}
if (args) {
obj.arguments = args;
}
if (icon) {
obj.blockIconURI = icon;
}
return obj;
}
function createBooleanBlock(opcode, text, args, icon) {
const obj = {
opcode: opcode,
text: text ? text : opcode,
blockType: BlockType.BOOLEAN,
disableMonitor: true
}
if (args) {
obj.arguments = args;
}
if (icon) {
obj.blockIconURI = icon;
}
return obj;
}
module.exports = {
id: 'jg3d',
name: '3D',
color1: '#B100FE',
color2: '#8600C3',
color3: '#5B0088',
blockIconURI: blockIconURI,
blocks: [
infoLabel("Initializing your scene"),
createCommandBlock('initialize', 'create 3D scene'),
createCommandBlock('dispose', 'remove 3D scene'),
seperator,
createCommandBlock(
'setCameraPerspective0',
'set scene camera to perspective camera with fov: [FOV]',
{
FOV: infoArgument(70)
},
Icons.Camera
),
createCommandBlock(
'setCameraPerspective1',
'set scene camera to perspective camera with fov: [FOV] aspect ratio: [AR]',
{
FOV: infoArgument(70),
AR: infoArgument(480 / 360)
},
Icons.Camera
),
createCommandBlock(
'setCameraPerspective2',
'set scene camera to perspective camera with fov: [FOV] aspect ratio: [AR] and only render objects within [NEAR] and [FAR] units of the camera',
{
FOV: infoArgument(70),
AR: infoArgument(480 / 360),
NEAR: infoArgument(0.1),
FAR: infoArgument(1000)
},
Icons.Camera
),
seperator,
createCommandBlock('setCameraOrthographic0', 'set scene camera to orthographic camera', null, Icons.Camera),
createCommandBlock(
'setCameraOrthographic1',
'set scene camera to orthographic camera with left plane: [LEFT] right plane: [RIGHT] top plane: [TOP] bottom plane: [BOTTOM]',
{
LEFT: infoArgument(-480 / 2),
RIGHT: infoArgument(480 / 2),
TOP: infoArgument(360 / 2),
BOTTOM: infoArgument(-360 / 2)
},
Icons.Camera
),
createCommandBlock(
'setCameraOrthographic2',
'set scene camera to orthographic camera with left plane: [LEFT] right plane: [RIGHT] top plane: [TOP] bottom plane: [BOTTOM] and only render objects within [NEAR] and [FAR] units of the camera',
{
LEFT: infoArgument(-480 / 2),
RIGHT: infoArgument(480 / 2),
TOP: infoArgument(360 / 2),
BOTTOM: infoArgument(-360 / 2),
NEAR: infoArgument(1),
FAR: infoArgument(1000)
},
Icons.Camera
),
seperator,
createCommandBlock('render'),
infoLabel("Scene customization"),
createCommandBlock('setSceneLayer', "move 3D scene layer to [SIDE]", {
SIDE: infoArgumentMenu(ArgumentType.STRING, "frontBack")
}),
createCommandBlock('setSceneBackgroundColor', "set background color to [COLOR]", {
COLOR: infoArgument("COLOR")
}),
createCommandBlock('setSceneBackgroundOpacity', "set background transparency to [OPACITY]%", {
OPACITY: infoArgument(100)
}),
createCommandBlock("show3d", "show 3D scene", {}),
createCommandBlock("hide3d", "hide 3D scene", {}),
createBooleanBlock("is3dVisible", "is 3D scene visible?", {}),
infoLabel("Camera controls"),
createCommandBlock(
'MoveCameraBy',
'move camera by [AMOUNT]',
{
AMOUNT: infoArgument(10)
},
Icons.Camera
),
createCommandBlock(
'setCameraPosition',
'set camera position to x: [X] y: [Y] z: [Z]',
{
X: infoArgument(0),
Y: infoArgument(0),
Z: infoArgument(0)
},
Icons.Camera
),
createCommandBlock(
'changeCameraPosition',
'change camera position by x: [X] y: [Y] z: [Z]',
{
X: infoArgument(0),
Y: infoArgument(0),
Z: infoArgument(0)
},
Icons.Camera
),
createCommandBlock(
'setCameraRotation',
'set camera rotation to x: [X] y: [Y] z: [Z]',
{
X: infoArgument('ANGLE'),
Y: infoArgument('ANGLE'),
Z: infoArgument('ANGLE')
},
Icons.Camera
),
createCommandBlock(
'changeCameraRotation',
'change camera rotation by x: [X] y: [Y] z: [Z]',
{
X: infoArgument('ANGLE'),
Y: infoArgument('ANGLE'),
Z: infoArgument('ANGLE')
},
Icons.Camera
),
createCommandBlock('setCameraZoom', 'set camera zoom to [ZOOM]%', {
ZOOM: infoArgument(100)
}, Icons.Camera),
createReporterBlock("getCameraClipPlane", "camera [CLIPPLANE]", {
CLIPPLANE: infoArgumentMenu(ArgumentType.STRING, "clippingPlanes")
}, Icons.Camera),
createReporterBlock("getCameraPosition", "camera [VECTOR3] position", {
VECTOR3: infoArgumentMenu(ArgumentType.STRING, "vector3")
}, Icons.Camera),
createReporterBlock("getCameraRotation", "camera [VECTOR3] rotation", {
VECTOR3: infoArgumentMenu(ArgumentType.STRING, "vector3")
}, Icons.Camera),
createReporterBlock("getCameraAspectRatio", "camera aspect ratio", null, Icons.Camera),
createReporterBlock("getCameraZoom", "camera zoom", null, Icons.Camera),
createReporterBlock("getCameraFov", "camera fov", null, Icons.Camera),
seperator,
createBooleanBlock("isCameraPerspective", "is scene camera a perspective camera?", null, Icons.Camera),
createBooleanBlock("isCameraOrthographic", "is scene camera an orthographic camera?", null, Icons.Camera),
infoLabel("Objects"),
createBooleanBlock("doesObjectExist", "object named [NAME] exists?", {
NAME: infoArgument("Object1")
}),
createReporterBlock("existingObjectsArray", "existing [OBJECTLIST]", {
OBJECTLIST: infoArgumentMenu(ArgumentType.STRING, "objectTypeList")
}),
seperator,
createCommandBlock('createCubeObject', 'create cube named [NAME] at x: [X] y: [Y] z: [Z]', {
NAME: infoArgument("Object1"),
X: infoArgument(0),
Y: infoArgument(0),
Z: infoArgument(0)
}, Icons.Cube),
createCommandBlock('createSphereObject', 'create sphere named [NAME] at x: [X] y: [Y] z: [Z]', {
NAME: infoArgument("Object1"),
X: infoArgument(0),
Y: infoArgument(0),
Z: infoArgument(0)
}, Icons.Sphere),
createCommandBlock('createPlaneObject', 'create plane named [NAME] at x: [X] y: [Y] z: [Z]', {
NAME: infoArgument("Object1"),
X: infoArgument(0),
Y: infoArgument(0),
Z: infoArgument(0)
}, Icons.Plane),
createCommandBlock('createMeshObject', 'create mesh named [NAME] with .obj data: [URL] at x: [X] y: [Y] z: [Z]', {
NAME: infoArgument("Object1"),
URL: infoArgument("data:text/plain;base64,"),
X: infoArgument(0),
Y: infoArgument(0),
Z: infoArgument(0)
}, Icons.OBJ, true),
createCommandBlock('createMeshObjectFileTyped', 'create mesh named [NAME] with [FILETYPE] data: [URL] at x: [X] y: [Y] z: [Z]', {
NAME: infoArgument("Object1"),
FILETYPE: infoArgumentMenu(ArgumentType.STRING, "meshFileTypes"),
URL: infoArgument("data:text/plain;base64,"),
X: infoArgument(0),
Y: infoArgument(0),
Z: infoArgument(0)
}, Icons.OBJ),
createCommandBlock('createLightObject', 'create [LIGHTTYPE] light named [NAME] at x: [X] y: [Y] z: [Z]', {
LIGHTTYPE: infoArgumentMenu(ArgumentType.STRING, "lightType"),
NAME: infoArgument("Light1"),
X: infoArgument(0),
Y: infoArgument(0),
Z: infoArgument(0)
}, Icons.Light),
seperator,
createCommandBlock('moveObjectUnits', 'move object named [NAME] by [AMOUNT]', {
NAME: infoArgument("Object1"),
AMOUNT: infoArgument(10)
}),
createCommandBlock("setObjectPosition", "move object named [NAME] to x: [X] y: [Y] z: [Z]", {
NAME: infoArgument("Object1"),
X: infoArgument(1),
Y: infoArgument(1),
Z: infoArgument(1)
}),
createCommandBlock("setObjectRotation", "set rotation of object named [NAME] to x: [X] y: [Y] z: [Z]", {
NAME: infoArgument("Object1"),
X: infoArgument('ANGLE'),
Y: infoArgument('ANGLE'),
Z: infoArgument('ANGLE')
}),
createCommandBlock("setObjectSize", "set size of object named [NAME] to x: [X]% y: [Y]% z: [Z]%", {
NAME: infoArgument("Object1"),
X: infoArgument(100),
Y: infoArgument(100),
Z: infoArgument(100)
}),
createCommandBlock('pointTowardsObject', 'point object named [NAME1] towards object named [NAME2]', {
NAME1: infoArgument("Object1"),
NAME2: infoArgument("Object2"),
}),
createCommandBlock('pointTowardsXYZ', 'point object named [NAME] towards x: [X] y: [Y] z: [Z]', {
NAME: infoArgument("Object1"),
X: infoArgument(31),
Y: infoArgument(26),
Z: infoArgument(47),
}),
createReporterBlock("getObjectPosition", "[VECTOR3] position of object named [NAME]", {
VECTOR3: infoArgumentMenu(ArgumentType.STRING, "vector3"),
NAME: infoArgument("Object1"),
}),
createReporterBlock("getObjectRotation", "[VECTOR3] rotation of object named [NAME]", {
VECTOR3: infoArgumentMenu(ArgumentType.STRING, "vector3"),
NAME: infoArgument("Object1"),
}),
createReporterBlock("getObjectSize", "[VECTOR3] size of object named [NAME]", {
VECTOR3: infoArgumentMenu(ArgumentType.STRING, "vector3"),
NAME: infoArgument("Object1"),
}),
createReporterBlock("getObjectColor", "hex color of object named [NAME]", {
NAME: infoArgument("Object1"),
}),
createReporterBlock("getObjectParent", "parent of object named [NAME]", {
NAME: infoArgument("Object1"),
}),
seperator,
createBooleanBlock("objectTouchingObject", "object [NAME1] touching object [NAME2]?", {
NAME1: infoArgument("Object1"),
NAME2: infoArgument("Object2"),
}, Icons.Touching),
seperator,
createCommandBlock("deleteObject", "remove object named [NAME]", {
NAME: infoArgument("Object1")
}),
createCommandBlock("setObjectColor", "recolor object named [NAME] to [COLOR]", {
NAME: infoArgument("Object1"),
COLOR: infoArgument("COLOR"),
}),
createCommandBlock("setObjectShading", "turn [ONOFF] shading on object named [NAME]", {
ONOFF: infoArgumentMenu(ArgumentType.STRING, "onoff"),
NAME: infoArgument("Object1"),
}),
createCommandBlock("setObjectWireframe", "turn [ONOFF] wireframe view on object named [NAME]", {
ONOFF: infoArgumentMenu(ArgumentType.STRING, "onoff"),
NAME: infoArgument("Object1"),
}, Icons.Wireframe),
seperator,
createReporterBlock("rayCollision", "first object in raycast from x: [X] y: [Y] z: [Z] with direction x: [DX] y: [DY] z: [DZ]", {
X: infoArgument(0),
Y: infoArgument(0),
Z: infoArgument(0),
DX: infoArgument(0),
DY: infoArgument(0),
DZ: infoArgument(0),
}, Icons.Raycast, true),
createReporterBlock("rayCollisionArray", "raycast result from x: [X] y: [Y] z: [Z] with direction x: [DX] y: [DY] z: [DZ]", {
X: infoArgument(0),
Y: infoArgument(0),
Z: infoArgument(0),
DX: infoArgument(0),
DY: infoArgument(0),
DZ: infoArgument(0),
}, Icons.Raycast, true),
createReporterBlock("rayCollisionDistance", "first object in raycast from x: [X] y: [Y] z: [Z] with direction x: [DX] y: [DY] z: [DZ] with a max distance of [DIS]", {
X: infoArgument(0),
Y: infoArgument(0),
Z: infoArgument(0),
DX: infoArgument(0),
DY: infoArgument(0),
DZ: infoArgument(0),
DIS: infoArgument(10)
}, Icons.Raycast, true),
createReporterBlock("rayCollisionArrayDistance", "raycast result from x: [X] y: [Y] z: [Z] with direction x: [DX] y: [DY] z: [DZ] with a max distance of [DIS]", {
X: infoArgument(0),
Y: infoArgument(0),
Z: infoArgument(0),
DX: infoArgument(0),
DY: infoArgument(0),
DZ: infoArgument(0),
DIS: infoArgument(10)
}, Icons.Raycast, true),
createReporterBlock("rayCollisionCamera", "first object from raycast in camera center", {
}, Icons.Raycast, true),
createReporterBlock("rayCollisionCameraArray", "raycast result starting from the camera center", {
}, Icons.Raycast, true)
],
menus: {
cameraType: infoMenu(["perspective", "orthographic"]),
lightType: infoMenu(["point"]),
clippingPlanes: infoMenu(["near", "far"]),
frontBack: infoMenu(["front", "back"]),
vector3: infoMenu(["x", "y", "z"]),
vector2: infoMenu(["x", "y"]),
onoff: infoMenu(["on", "off"]),
objectTypeList: infoMenu(["objects", "physical objects", "lights"]),
meshFileTypes: infoMenu([".obj", ".glb / .gltf", ".fbx"])
}
}