fix(import): сочные цвета в импортированных Roblox-картах

Crossroads-импорт давал тёмно-грязные цвета вместо классических
насыщенных Roblox-цветов:
- трава тёмно-зелёная вместо ярко-зелёной
- дороги серые вместо белых
- крыши приглушённо-красные

Причины:
1. mat.ambientColor=(0,0,0) default — scene.ambientColor=(0.3,0.3,0.3)
   не действовал. Тени получали 0 контрибьюшна цвета.
2. material=glossy (default для Roblox Plastic) шёл в case default:
   только specularColor=(0,0,0), без emissive — цвет blandный.

Фикс:
- mat.ambientColor=(1,1,1) для всех материалов: подмешивает scene
  ambient в тени, цвета остаются видны.
- Для glossy/default: emissive = 25% цвета (как в studs/45%, но скромнее),
  specular слабый (0.05). Roblox-look — насыщенный даже без прямого
  света.

Также case 'matte' теперь отдельный (был под default).
This commit is contained in:
min 2026-06-08 16:49:54 +03:00
parent 0b677529e1
commit 14e173a089
2 changed files with 17 additions and 1 deletions

View File

@ -507,6 +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 — даёт «среднее» освещение боковым граням что не освещены
// прямо. Без этого scene.ambientColor=(0.3,0.3,0.3) не работает —
// материал тени получает только diffuse от hemi, что приводит к
// тёмно-грязным цветам в импортированных Roblox-картах.
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).
@ -567,9 +572,20 @@ export class PrimitiveManager {
break; break;
} }
case 'matte': case 'matte':
default:
mat.specularColor = new Color3(0, 0, 0); mat.specularColor = new Color3(0, 0, 0);
break; break;
case 'glossy':
default: {
// Roblox Plastic — это белый specular маленький + цвет «сочный»
// даже в тени. Подмешиваем 25% цвета в emissive чтобы избежать
// грязных тёмных пятен в импортированных Roblox-картах
// (Crossroads и подобные). Specular низкий и нейтральный.
const dc = Color3.FromHexString(color || '#cccccc');
mat.emissiveColor = new Color3(dc.r * 0.25, dc.g * 0.25, dc.b * 0.25);
mat.specularColor = new Color3(0.05, 0.05, 0.05);
mat.specularPower = 64;
break;
}
} }
// Триггеры — всегда полупрозрачные жёлтые в редакторе // Триггеры — всегда полупрозрачные жёлтые в редакторе