fix(import): заливка теней работает + Anchored=True для всех импорт. Part

1. PrimitiveManager: mat.ambientColor=(1,1,1). Теперь scene.ambientColor
   ("Заливка теней" слайдер) реально влияет на тени. Юзер крутит
   значение и видит изменение.

2. converter.py: Roblox-Part импортируется всегда с Anchored=True
   (force-anchored). Welds у нас заглушки, без них unanchored Part'ы
   рассыпаются физикой. Если юзеру нужно падающее — снимет в
   инспекторе вручную.

Деплой converter.py на VM 130 + systemctl restart.
This commit is contained in:
min 2026-06-08 18:59:23 +03:00
parent 19f47b2d75
commit 5b44a286a9
3 changed files with 26 additions and 9 deletions

View File

@ -397,7 +397,9 @@ class Converter:
'canCollide': bool(props.get('CanCollide', True)), 'canCollide': bool(props.get('CanCollide', True)),
'visible': props.get('Transparency', 0) < 1.0 if isinstance(props.get('Transparency'), (int, float)) else True, 'visible': props.get('Transparency', 0) < 1.0 if isinstance(props.get('Transparency'), (int, float)) else True,
'opacity': max(0.0, 1.0 - (props.get('Transparency', 0) or 0)), 'opacity': max(0.0, 1.0 - (props.get('Transparency', 0) or 0)),
'anchored': bool(props.get('Anchored', False)), # FORCE-ANCHORED — Welds импортируем как заглушки, без них
# физика 700+ unanchored Part'ов = карта рассыпается.
'anchored': True,
'mass': 1.0, 'mass': 1.0,
'rotationX': rot['rx'], 'rotationY': rot['ry'], 'rotationZ': rot['rz'], 'rotationX': rot['rx'], 'rotationY': rot['ry'], 'rotationZ': rot['rz'],
} }
@ -428,7 +430,9 @@ class Converter:
'material': material_to_string(props.get('Material')), 'material': material_to_string(props.get('Material')),
'canCollide': bool(props.get('CanCollide', True)), 'canCollide': bool(props.get('CanCollide', True)),
'visible': True, 'visible': True,
'anchored': bool(props.get('Anchored', False)), # FORCE-ANCHORED — Welds импортируем как заглушки, без них
# физика 700+ unanchored Part'ов = карта рассыпается.
'anchored': True,
'mass': 1.0, 'mass': 1.0,
'rotationX': rot['rx'], 'rotationY': rot['ry'], 'rotationZ': rot['rz'], 'rotationX': rot['rx'], 'rotationY': rot['ry'], 'rotationZ': rot['rz'],
}) })
@ -457,7 +461,9 @@ class Converter:
'material': material_to_string(props.get('Material')), 'material': material_to_string(props.get('Material')),
'canCollide': bool(props.get('CanCollide', True)), 'canCollide': bool(props.get('CanCollide', True)),
'visible': True, 'visible': True,
'anchored': bool(props.get('Anchored', False)), # FORCE-ANCHORED — Welds импортируем как заглушки, без них
# физика 700+ unanchored Part'ов = карта рассыпается.
'anchored': True,
'mass': 1.0, 'mass': 1.0,
'rotationX': rot['rx'], 'rotationY': rot['ry'], 'rotationZ': rot['rz'], 'rotationX': rot['rx'], 'rotationY': rot['ry'], 'rotationZ': rot['rz'],
}) })
@ -529,7 +535,9 @@ class Converter:
'material': material_to_string(props.get('Material')), 'material': material_to_string(props.get('Material')),
'canCollide': bool(props.get('CanCollide', True)), 'canCollide': bool(props.get('CanCollide', True)),
'visible': True, 'visible': True,
'anchored': bool(props.get('Anchored', False)), # FORCE-ANCHORED — Welds импортируем как заглушки, без них
# физика 700+ unanchored Part'ов = карта рассыпается.
'anchored': True,
'mass': 1.0, 'mass': 1.0,
'rotationX': rot['rx'], 'rotationY': rot['ry'], 'rotationZ': rot['rz'], 'rotationX': rot['rx'], 'rotationY': rot['ry'], 'rotationZ': rot['rz'],
'note': f'MeshPart (no GLB) rbxid={rbx_id}', 'note': f'MeshPart (no GLB) rbxid={rbx_id}',
@ -550,7 +558,9 @@ class Converter:
'rotationX': rot['rx'], 'rotationY': rot['ry'], 'rotationZ': rot['rz'], 'rotationX': rot['rx'], 'rotationY': rot['ry'], 'rotationZ': rot['rz'],
'color': get_part_color(props), 'color': get_part_color(props),
'canCollide': bool(props.get('CanCollide', True)), 'canCollide': bool(props.get('CanCollide', True)),
'anchored': bool(props.get('Anchored', False)), # FORCE-ANCHORED — Welds импортируем как заглушки, без них
# физика 700+ unanchored Part'ов = карта рассыпается.
'anchored': True,
'origin': 'roblox-meshpart', 'origin': 'roblox-meshpart',
'rbxAssetId': rbx_id, 'rbxAssetId': rbx_id,
}) })
@ -590,7 +600,9 @@ class Converter:
'material': material_to_string(props.get('Material')), 'material': material_to_string(props.get('Material')),
'canCollide': bool(props.get('CanCollide', True)), 'canCollide': bool(props.get('CanCollide', True)),
'visible': True, 'visible': True,
'anchored': bool(props.get('Anchored', False)), # FORCE-ANCHORED — Welds импортируем как заглушки, без них
# физика 700+ unanchored Part'ов = карта рассыпается.
'anchored': True,
'mass': 1.0, 'mass': 1.0,
'rotationX': rot['rx'], 'rotationY': rot['ry'], 'rotationZ': rot['rz'], 'rotationX': rot['rx'], 'rotationY': rot['ry'], 'rotationZ': rot['rz'],
'note': f'Union (no CSG GLB) rbxid={rbx_id}', 'note': f'Union (no CSG GLB) rbxid={rbx_id}',
@ -609,7 +621,9 @@ class Converter:
'rotationX': rot['rx'], 'rotationY': rot['ry'], 'rotationZ': rot['rz'], 'rotationX': rot['rx'], 'rotationY': rot['ry'], 'rotationZ': rot['rz'],
'color': get_part_color(props), 'color': get_part_color(props),
'canCollide': bool(props.get('CanCollide', True)), 'canCollide': bool(props.get('CanCollide', True)),
'anchored': bool(props.get('Anchored', False)), # FORCE-ANCHORED — Welds импортируем как заглушки, без них
# физика 700+ unanchored Part'ов = карта рассыпается.
'anchored': True,
'origin': 'roblox-union', 'origin': 'roblox-union',
'rbxAssetId': rbx_id, 'rbxAssetId': rbx_id,
}) })

View File

@ -507,8 +507,11 @@ export class PrimitiveManager {
const matName = `${mesh.name}_mat`; const matName = `${mesh.name}_mat`;
const mat = new StandardMaterial(matName, this.scene); const mat = new StandardMaterial(matName, this.scene);
mat.diffuseColor = Color3.FromHexString(color || '#888888'); mat.diffuseColor = Color3.FromHexString(color || '#888888');
// ambient = default (0,0,0). Освещение настраивается через // ambient = (1,1,1) — пассивный, реагирует на scene.ambientColor.
// глобальную панель «Свет и атмосфера» (sun/hemi/saturation). // Юзер крутит «Заливку теней» (sceneAmbient) → тени светлеют.
// На прямом свете diffuse доминирует — пересвета нет если
// sceneAmbient в разумных пределах (0..0.5).
mat.ambientColor = new Color3(1, 1, 1);
// Если задан textureUrl — подгружаем PNG как diffuseTexture. Это // Если задан textureUrl — подгружаем PNG как diffuseTexture. Это
// используется для GD-скинов куба (например /gd/skins/cube_smile.png). // используется для GD-скинов куба (например /gd/skins/cube_smile.png).