Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
0931197
3D Model Mesh Parts Control - ( Action/Condition/Expression ) (#1)
NBForgeLab Feb 7, 2026
4639b98
Merge branch '4ian:master' into master
NBForgeLab Feb 8, 2026
6cb2c6b
Merge branch '4ian:master' into master
NBForgeLab Feb 8, 2026
3a54e01
Merge branch '4ian:master' into master
NBForgeLab Feb 9, 2026
c2fa908
Merge branch '4ian:master' into master
NBForgeLab Feb 9, 2026
89ee1e1
Feature/mesh parts control dev (#2)
NBForgeLab Feb 9, 2026
9e40cff
Feature/mesh parts control dev (#3)
NBForgeLab Feb 9, 2026
9a43086
Feature/mesh parts control dev (#4)
NBForgeLab Feb 9, 2026
c3f9cc8
Feature/mesh parts control dev (#5)
NBForgeLab Feb 10, 2026
6105160
Merge branch '4ian:master' into master
NBForgeLab Feb 10, 2026
022f17e
Merge branch 'master' into master
NBForgeLab Feb 12, 2026
5619e1a
Merge branch '4ian:master' into master
NBForgeLab Feb 13, 2026
9365f97
Merge branch '4ian:master' into master
NBForgeLab Feb 14, 2026
b0d65c8
Merge branch '4ian:master' into master
NBForgeLab Feb 15, 2026
fa8f464
Merge branch '4ian:master' into master
NBForgeLab Feb 15, 2026
1481e9a
Merge branch '4ian:master' into master
NBForgeLab Feb 16, 2026
f0617a2
Merge branch '4ian:master' into master
NBForgeLab Feb 17, 2026
d33b685
Merge branch '4ian:master' into master
NBForgeLab Feb 18, 2026
cbcbbea
Merge branch '4ian:master' into master
NBForgeLab Feb 19, 2026
1ebc856
Merge branch '4ian:master' into master
NBForgeLab Feb 20, 2026
3b1bbee
Merge branch '4ian:master' into master
NBForgeLab Feb 20, 2026
64f9f68
Merge branch '4ian:master' into master
NBForgeLab Feb 21, 2026
9fab414
Merge branch '4ian:master' into master
NBForgeLab Feb 22, 2026
4a62fbe
Merge branch '4ian:master' into master
NBForgeLab Feb 23, 2026
25faa8d
Merge branch '4ian:master' into master
NBForgeLab Feb 24, 2026
cb43903
Merge branch '4ian:master' into master
NBForgeLab Feb 25, 2026
f2dea7e
Merge branch '4ian:master' into master
NBForgeLab Feb 26, 2026
6f859af
Merge branch '4ian:master' into master
NBForgeLab Feb 28, 2026
61ae179
Merge branch '4ian:master' into master
NBForgeLab Mar 2, 2026
b586f26
Merge branch '4ian:master' into master
NBForgeLab Mar 2, 2026
a24cbc4
Merge branch '4ian:master' into master
NBForgeLab Mar 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
251 changes: 250 additions & 1 deletion Extensions/3D/JsExtension.js
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,8 @@ module.exports = {
.setIncludeFile('Extensions/3D/A_RuntimeObject3D.js')
.addIncludeFile('Extensions/3D/A_RuntimeObject3DRenderer.js')
.addIncludeFile('Extensions/3D/Model3DRuntimeObject.js')
.addIncludeFile('Extensions/3D/Model3DRuntimeObject3DRenderer.js');
.addIncludeFile('Extensions/3D/Model3DRuntimeObject3DRenderer.js')
.addIncludeFile('Extensions/3D/Model3DRuntimeObjectMeshParts.js');

// Properties expressions/conditions/actions:

Expand Down Expand Up @@ -842,6 +843,254 @@ module.exports = {
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('number', _('Crossfade duration (in seconds)'), '', false)
.setFunctionName('setCrossfadeDuration');

// Mesh Parts Actions and Conditions

object
.addScopedAction(
'SetMeshVisible',
_('Show/hide a mesh part'),
_('Show or hide a specific mesh part of the 3D model.'),
_('Set mesh _PARAM1_ visibility of _PARAM0_ to _PARAM2_'),
_('Mesh parts'),
'res/conditions/3d_box.svg',
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.addParameter('yesorno', _('Visible'), '', false)
.markAsAdvanced()
.setFunctionName('setMeshVisible');

object
.addScopedCondition(
'IsMeshVisible',
_('Mesh part is visible'),
_('Check if a mesh part is visible.'),
_('Mesh _PARAM1_ of _PARAM0_ is visible'),
_('Mesh parts'),
'res/conditions/3d_box.svg',
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.markAsAdvanced()
.setFunctionName('isMeshVisible');

object
.addScopedCondition(
'HasMesh',
_('Has mesh part'),
_('Check if the model has a mesh part with the given name.'),
_('_PARAM0_ has mesh _PARAM1_'),
_('Mesh parts'),
'res/conditions/3d_box.svg',
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.markAsAdvanced()
.setFunctionName('hasMesh');

object
.addScopedAction(
'SetMeshPosition',
_('Change mesh part position'),
_('Change the position of a mesh part (relative to the model).'),
_('Set mesh _PARAM1_ position of _PARAM0_ to X: _PARAM2_, Y: _PARAM3_, Z: _PARAM4_'),
_('Mesh parts'),
'res/conditions/3d_box.svg',
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.addParameter('number', _('X position'), '', false)
.addParameter('number', _('Y position'), '', false)
.addParameter('number', _('Z position'), '', false)
.markAsAdvanced()
.setFunctionName('setMeshPosition');

object
.addExpression(
'MeshPartPositionX',
_('Mesh part X position'),
_('Return the X position of a mesh part.'),
_('Mesh parts'),
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.setFunctionName('getMeshPositionX');

object
.addExpression(
'MeshPartPositionY',
_('Mesh part Y position'),
_('Return the Y position of a mesh part.'),
_('Mesh parts'),
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.setFunctionName('getMeshPositionY');

object
.addExpression(
'MeshPartPositionZ',
_('Mesh part Z position'),
_('Return the Z position of a mesh part.'),
_('Mesh parts'),
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.setFunctionName('getMeshPositionZ');

object
.addScopedAction(
'SetMeshRotation',
_('Change mesh part rotation'),
_('Change the rotation of a mesh part (relative to the model).'),
_('Set mesh _PARAM1_ rotation of _PARAM0_ to X: _PARAM2_°, Y: _PARAM3_°, Z: _PARAM4_°'),
_('Mesh parts'),
'res/conditions/3d_box.svg',
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.addParameter('number', _('Rotation X (degrees)'), '', false)
.addParameter('number', _('Rotation Y (degrees)'), '', false)
.addParameter('number', _('Rotation Z (degrees)'), '', false)
.markAsAdvanced()
.setFunctionName('setMeshRotation');

object
.addExpression(
'MeshPartRotationX',
_('Mesh part X rotation'),
_('Return the X rotation of a mesh part (in degrees).'),
_('Mesh parts'),
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.setFunctionName('getMeshRotationX');

object
.addExpression(
'MeshPartRotationY',
_('Mesh part Y rotation'),
_('Return the Y rotation of a mesh part (in degrees).'),
_('Mesh parts'),
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.setFunctionName('getMeshRotationY');

object
.addExpression(
'MeshPartRotationZ',
_('Mesh part Z rotation'),
_('Return the Z rotation of a mesh part (in degrees).'),
_('Mesh parts'),
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.setFunctionName('getMeshRotationZ');

object
.addScopedAction(
'SetMeshScale',
_('Change mesh part scale'),
_('Change the scale of a mesh part.'),
_('Set mesh _PARAM1_ scale of _PARAM0_ to X: _PARAM2_, Y: _PARAM3_, Z: _PARAM4_'),
_('Mesh parts'),
'res/conditions/3d_box.svg',
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.addParameter('number', _('Scale X'), '', false)
.addParameter('number', _('Scale Y'), '', false)
.addParameter('number', _('Scale Z'), '', false)
.markAsAdvanced()
.setFunctionName('setMeshScale');

object
.addExpression(
'MeshPartScaleX',
_('Mesh part X scale'),
_('Return the X scale of a mesh part.'),
_('Mesh parts'),
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.setFunctionName('getMeshScaleX');

object
.addExpression(
'MeshPartScaleY',
_('Mesh part Y scale'),
_('Return the Y scale of a mesh part.'),
_('Mesh parts'),
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.setFunctionName('getMeshScaleY');

object
.addExpression(
'MeshPartScaleZ',
_('Mesh part Z scale'),
_('Return the Z scale of a mesh part.'),
_('Mesh parts'),
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.setFunctionName('getMeshScaleZ');

object
.addScopedAction(
'RemoveMesh',
_('Remove mesh part'),
_('Remove a mesh part from the 3D model.'),
_('Remove mesh _PARAM1_ from _PARAM0_'),
_('Mesh parts'),
'res/conditions/3d_box.svg',
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('string', _('Mesh name'), '', false)
.markAsAdvanced()
.setFunctionName('removeMesh');

object
.addExpression(
'MeshesCount',
_('Mesh parts count'),
_('Return the number of mesh parts in the model.'),
_('Mesh parts'),
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.setFunctionName('getMeshesCount');

object
.addStrExpression(
'MeshNameAt',
_('Mesh part name at index'),
_('Return the name of the mesh part at the given index.'),
_('Mesh parts'),
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D model'), 'Model3DObject', false)
.addParameter('number', _('Index'), '', false)
.setFunctionName('getMeshNameAt');
}

const Cube3DObject = new gd.ObjectJsImplementation();
Expand Down
Loading