From b017beca2d8808cc1b61776b908ffd81c6774f54 Mon Sep 17 00:00:00 2001 From: "azykov@mail.ru" Date: Fri, 5 Jun 2026 17:29:26 +0300 Subject: [PATCH] added and fixed many blocks --- src/blockly/actions/physics/applyImpulse.ts | 6 ++-- src/blockly/generateCode.ts | 8 ++--- src/blockly/values/direction.ts | 29 +++++++++++++++++++ src/blockly/values/directionToPosition.ts | 22 ++++++++++++++ src/blockly/values/index.ts | 3 ++ src/blockly/values/objectById.ts | 21 ++++++++++++++ src/blockly/values/position.ts | 8 ++--- src/blockly/values/positionOfObject.ts | 9 +++--- src/components/CharacterView.tsx | 2 +- src/components/ObjectViewInternal.tsx | 3 +- .../scriptEditor/ScriptEditorView.tsx | 3 ++ 11 files changed, 97 insertions(+), 17 deletions(-) create mode 100644 src/blockly/values/direction.ts create mode 100644 src/blockly/values/directionToPosition.ts create mode 100644 src/blockly/values/objectById.ts diff --git a/src/blockly/actions/physics/applyImpulse.ts b/src/blockly/actions/physics/applyImpulse.ts index 1166fc5..d020a53 100644 --- a/src/blockly/actions/physics/applyImpulse.ts +++ b/src/blockly/actions/physics/applyImpulse.ts @@ -4,12 +4,12 @@ import { javascriptGenerator, Order } from "blockly/javascript"; Blockly.Blocks['physics_apply_impulse_action'] = { init(this: Blockly.Block) { this.appendDummyInput('') - .appendField('Push me to'); + .appendField('Push me in direction of'); this.appendValueInput('POSITION') - .setCheck('Pos'); + .setCheck('DPos'); this.appendDummyInput('') .appendField('with force') - .appendField(new Blockly.FieldNumber(1, -10, 10, 2), 'FORCE'); + .appendField(new Blockly.FieldNumber(1, -10, 10, 0.01), 'FORCE'); this.setInputsInline(true) diff --git a/src/blockly/generateCode.ts b/src/blockly/generateCode.ts index 0cb552e..9db0d34 100644 --- a/src/blockly/generateCode.ts +++ b/src/blockly/generateCode.ts @@ -14,10 +14,10 @@ export function generateCode(workspace: Blockly.WorkspaceSvg): string { } body = javascriptGenerator.prefixLines(body, javascriptGenerator.INDENT); - const args = Array.from(block.getFields()) - .filter(field => field.name !== undefined) - .map(field => `${field.name}: ${JSON.stringify(field.getValue())}`) - .join(', '); + // const args = Array.from(block.getFields()) + // .filter(field => field.name !== undefined) + // .map(field => `${field.name}: ${JSON.stringify(field.getValue())}`) + // .join(', '); //TODO use args diff --git a/src/blockly/values/direction.ts b/src/blockly/values/direction.ts new file mode 100644 index 0000000..2892f13 --- /dev/null +++ b/src/blockly/values/direction.ts @@ -0,0 +1,29 @@ +import * as Blockly from "blockly"; +import { javascriptGenerator, Order } from "blockly/javascript"; + +Blockly.Blocks['dpos_value'] = { + init(this: Blockly.Block) { + this.appendDummyInput() + .appendField('Direction [') + .appendField(new Blockly.FieldNumber(0, -Infinity, Infinity, 0.01), 'X') + .appendField(',') + .appendField(new Blockly.FieldNumber(0, -Infinity, Infinity, 0.01), 'Y') + .appendField(',') + .appendField(new Blockly.FieldNumber(0, -Infinity, Infinity, 0.01), 'Z'); + this.appendDummyInput() + .appendField(']'); + this.setInputsInline(true); + this.setOutput(true, 'DPos'); + this.setTooltip('Direction [dx,dy,dz]'); + this.setColour(315); + } +}; + +javascriptGenerator.forBlock['dpos_value'] = function (block, _generator) { + const xValue = block.getFieldValue('X'); + const yValue = block.getFieldValue('Y'); + const zValue = block.getFieldValue('Z'); + return [`[${xValue},${yValue},${zValue}]`, Order.ATOMIC]; +}; + +export { }; diff --git a/src/blockly/values/directionToPosition.ts b/src/blockly/values/directionToPosition.ts new file mode 100644 index 0000000..337e8dd --- /dev/null +++ b/src/blockly/values/directionToPosition.ts @@ -0,0 +1,22 @@ +import * as Blockly from "blockly"; +import { javascriptGenerator, Order } from "blockly/javascript"; + +Blockly.Blocks['direction_to_position_value'] = { + init(this: Blockly.Block) { + this.appendDummyInput() + .appendField('Direction to'); + this.appendValueInput('TARGET') + .setCheck('Pos'); + this.setInputsInline(true); + this.setOutput(true, 'DPos'); + this.setTooltip('Direction to a position'); + this.setColour(315); + } +}; + +javascriptGenerator.forBlock['direction_to_position_value'] = function (block, generator) { + const targetValue = generator.valueToCode(block, 'TARGET', Order.ATOMIC); + return [`((a,b)=>[a[0]-b[0],a[1]-b[1],a[2]-b[2]])(${targetValue},object.position)`, Order.NONE]; +}; + +export { }; diff --git a/src/blockly/values/index.ts b/src/blockly/values/index.ts index a243c2d..dd0a919 100644 --- a/src/blockly/values/index.ts +++ b/src/blockly/values/index.ts @@ -4,3 +4,6 @@ export * from './anyObjectOfType'; export * from './objectType'; export * from './positionOfObject'; export * from './position'; +export * from './direction'; +export * from './objectById'; +export * from './directionToPosition'; diff --git a/src/blockly/values/objectById.ts b/src/blockly/values/objectById.ts new file mode 100644 index 0000000..e58b34f --- /dev/null +++ b/src/blockly/values/objectById.ts @@ -0,0 +1,21 @@ +import * as Blockly from "blockly"; +import { javascriptGenerator, Order } from "blockly/javascript"; + +Blockly.Blocks['object_by_id_value'] = { + init(this: Blockly.Block) { + this.appendEndRowInput() + .appendField('Object with id') + .appendField(new Blockly.FieldTextInput(''), 'TARGET_ID'); + this.setInputsInline(false) + this.setOutput(true, 'Object'); + this.setTooltip('Returns object by id, if any'); + this.setColour(315); + } +}; + +javascriptGenerator.forBlock['object_by_id_value'] = function (block, _generator) { + const targetIdValue = block.getFieldValue('TARGET_ID'); + return [`context.scene.objects['${targetIdValue}']`, Order.ATOMIC]; +}; + +export { }; diff --git a/src/blockly/values/position.ts b/src/blockly/values/position.ts index 21eb151..fd5aced 100644 --- a/src/blockly/values/position.ts +++ b/src/blockly/values/position.ts @@ -4,12 +4,12 @@ import { javascriptGenerator, Order } from "blockly/javascript"; Blockly.Blocks['pos_value'] = { init(this: Blockly.Block) { this.appendDummyInput('POSITION') - .appendField('[') - .appendField(new Blockly.FieldNumber(0, -Infinity, Infinity, 2), 'X') + .appendField('Position [') + .appendField(new Blockly.FieldNumber(0, -Infinity, Infinity, 0.01), 'X') .appendField(',') - .appendField(new Blockly.FieldNumber(0, -Infinity, Infinity, 2), 'Y') + .appendField(new Blockly.FieldNumber(0, -Infinity, Infinity, 0.01), 'Y') .appendField(',') - .appendField(new Blockly.FieldNumber(0, -Infinity, Infinity, 2), 'Z'); + .appendField(new Blockly.FieldNumber(0, -Infinity, Infinity, 0.01), 'Z'); this.appendDummyInput() .appendField(']'); this.setInputsInline(true); diff --git a/src/blockly/values/positionOfObject.ts b/src/blockly/values/positionOfObject.ts index c3ad230..a19dfb2 100644 --- a/src/blockly/values/positionOfObject.ts +++ b/src/blockly/values/positionOfObject.ts @@ -3,9 +3,9 @@ import { javascriptGenerator, Order } from "blockly/javascript"; Blockly.Blocks['position_of_object_value'] = { init(this: Blockly.Block) { - this.appendDummyInput('NAME') + this.appendDummyInput() .appendField('Position of'); - this.appendValueInput('NAME') + this.appendValueInput('TARGET') .setCheck('Object'); this.setInputsInline(true); this.setOutput(true, 'Pos'); @@ -14,8 +14,9 @@ Blockly.Blocks['position_of_object_value'] = { } }; -javascriptGenerator.forBlock['position_of_object_value'] = function (_block, _generator) { - return ['123', Order.NONE]; +javascriptGenerator.forBlock['position_of_object_value'] = function (block, generator) { + const targetValue = generator.valueToCode(block, 'TARGET', Order.ATOMIC); + return [`${targetValue}.position`, Order.NONE]; }; export { }; diff --git a/src/components/CharacterView.tsx b/src/components/CharacterView.tsx index aa6ae4c..4fdb8ca 100644 --- a/src/components/CharacterView.tsx +++ b/src/components/CharacterView.tsx @@ -40,7 +40,7 @@ export const PlayerObjectView = observer(function ({ object, objectType }: Playe const W = bb.max[0] - bb.min[0]; const H = bb.max[1] - bb.min[1]; const D = bb.max[2] - bb.min[2]; - const radius = Math.sqrt(W * W + H * H + D * D) / 2; + const radius = Math.sqrt(W * W + H * H + D * D); const centerY = (bb.min[1] + bb.max[1]) / 2; return { shoulderOffset: new Vector3(W * 0.1, centerY + H * 0.3, bb.max[2] + radius), diff --git a/src/components/ObjectViewInternal.tsx b/src/components/ObjectViewInternal.tsx index 0e990e8..970186e 100644 --- a/src/components/ObjectViewInternal.tsx +++ b/src/components/ObjectViewInternal.tsx @@ -66,7 +66,8 @@ export const ObjectViewInternal = function ({ object, objectType, ref, ...props if (!impulse) return; if (!rbRef.current) { console.warn('applyImpulse: rbRef is null for', gameObj.id); return; } - const { direction, amplitude } = impulse; + let { direction, amplitude } = impulse; + amplitude *= 100; const v = { x: direction[0] * amplitude, y: direction[1] * amplitude, z: direction[2] * amplitude }; console.log('applyImpulse', gameObj.id, v, 'bodyType', rbRef.current.bodyType()); rbRef.current.applyImpulse(v, true); diff --git a/src/components/scriptEditor/ScriptEditorView.tsx b/src/components/scriptEditor/ScriptEditorView.tsx index 10f1d76..b7a5949 100644 --- a/src/components/scriptEditor/ScriptEditorView.tsx +++ b/src/components/scriptEditor/ScriptEditorView.tsx @@ -33,6 +33,9 @@ const TOOLBOX: Blockly.utils.toolbox.ToolboxDefinition = { { kind: 'block', type: 'any_object_of_type_value' }, { kind: 'block', type: 'position_of_object_value' }, { kind: 'block', type: 'pos_value' }, + { kind: 'block', type: 'dpos_value' }, + { kind: 'block', type: 'direction_to_position_value' }, + { kind: 'block', type: 'object_by_id_value' }, ], }, {