!2759 修复:墙独立材质优化,对接渲染器

Merge pull request !2759 from 林三/fix_roomWall_mtl
pull/2778/head
林三 4 months ago
parent 15c1b39a69
commit 703643fd5d

@ -102,7 +102,7 @@
"@blueprintjs/popover2": "^0.12.9", "@blueprintjs/popover2": "^0.12.9",
"@blueprintjs/table": "^3.10.0", "@blueprintjs/table": "^3.10.0",
"@epicgames-ps/lib-pixelstreamingfrontend-ue5.2": "^0.5.1", "@epicgames-ps/lib-pixelstreamingfrontend-ue5.2": "^0.5.1",
"@jscad/modeling": "^2.12.0", "@jscad/modeling": "^2.12.1",
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
"detect-browser": "^5.3.0", "detect-browser": "^5.3.0",
"dwg2dxf": "^1.0.0", "dwg2dxf": "^1.0.0",

@ -40,7 +40,7 @@ import { PhysicalMaterialRecord } from "../DatabaseServices/PhysicalMaterialReco
import { BulkheadCeiling } from '../DatabaseServices/Room/Entity/Ceiling/BulkheadCeiling'; import { BulkheadCeiling } from '../DatabaseServices/Room/Entity/Ceiling/BulkheadCeiling';
import { RoomFlatBase } from '../DatabaseServices/Room/Entity/Flat/RoomFlatBase'; import { RoomFlatBase } from '../DatabaseServices/Room/Entity/Flat/RoomFlatBase';
import { RoomHolePolyline } from '../DatabaseServices/Room/Entity/Wall/Hole/RoomHolePolyline'; import { RoomHolePolyline } from '../DatabaseServices/Room/Entity/Wall/Hole/RoomHolePolyline';
import { CURVE_FACE_TYPE_KEY, RoomWallBase } from '../DatabaseServices/Room/Entity/Wall/RoomWallBase'; import { CURVE_FACE_TYPE_KEY, RoomWallBase, WallFaceType } from '../DatabaseServices/Room/Entity/Wall/RoomWallBase';
import { RoomWallParse } from '../DatabaseServices/Room/ParseService/RoomWallParse'; import { RoomWallParse } from '../DatabaseServices/Room/ParseService/RoomWallParse';
import { Shape } from "../DatabaseServices/Shape"; import { Shape } from "../DatabaseServices/Shape";
import { TextureTableRecord } from "../DatabaseServices/Texture"; import { TextureTableRecord } from "../DatabaseServices/Texture";
@ -786,6 +786,49 @@ function ConverRoomWall2Data(roomEnt: RoomWallBase)
ed.Holes = roomEnt.RealHoles; ed.Holes = roomEnt.RealHoles;
let materials: Set<number> = new Set([ed.MaterialId]);//所有的材质
for (let [number, ObjectId] of roomEnt.OverWriteMaterial)
{
if (ObjectId)
materials.add(ObjectId.Index);
}
ed.Materials = Array.from(materials);
let overWriteMaterial: number[] = [];
let materialIndex = 0;
let hasOutsideCu = false;
const addMaterial = (curves: (Arc | Line)[]) =>
{
if (curves)
for (let c of curves)
{
if (c[CURVE_FACE_TYPE_KEY] === WallFaceType.Outside)
{
hasOutsideCu = true;
continue;
}
overWriteMaterial.push(roomEnt.OverWriteMaterial.get(materialIndex)?.Index ?? ed.MaterialId);
materialIndex++;
//这里不使用1 渲染器1固定为外墙
if (materialIndex === 1)
materialIndex++;
}
};
addMaterial(roomEnt.LeftCurves);
addMaterial(roomEnt.RightCurves);
addMaterial(roomEnt.LidCurves);
//渲染器外墙固定使用67
if (hasOutsideCu)
overWriteMaterial.splice(1, 0, 67);
ed.overWriteMaterial = overWriteMaterial;
let f = new CADFiler; let f = new CADFiler;
f.Write(roomEnt.LeftCurves.length); f.Write(roomEnt.LeftCurves.length);
for (let c of roomEnt.LeftCurves) for (let c of roomEnt.LeftCurves)
@ -805,6 +848,7 @@ function ConverRoomWall2Data(roomEnt: RoomWallBase)
f.WriteObject(roomEnt.Region); f.WriteObject(roomEnt.Region);
roomEnt.WriteFile(f); roomEnt.WriteFile(f);
ed.Data = f.Data; ed.Data = f.Data;
return ed; return ed;
} }

@ -312,7 +312,9 @@ export class RoomWallArc extends RoomWallBase
let inv = this.OCSInv; let inv = this.OCSInv;
let thisParam = new GetArcParam(this as unknown as Arc); let thisParam = new GetArcParam(this as unknown as Arc);
let materialIndex = 0; let materialIndex = 0;
let expMaterialIndex = 0;
this.Thickness === 500; this.Thickness === 500;
let newLeftSign: Map<number, number> = new Map(); let newLeftSign: Map<number, number> = new Map();
@ -323,7 +325,6 @@ export class RoomWallArc extends RoomWallBase
{ {
if (curve[CURVE_FACE_TYPE_KEY] === WallFaceType.Outside) if (curve[CURVE_FACE_TYPE_KEY] === WallFaceType.Outside)
{ {
materialIndex++;
//del_exp_start //del_exp_start
return;//我们暂时直接不绘制外墙 return;//我们暂时直接不绘制外墙
//del_exp_end //del_exp_end
@ -496,17 +497,33 @@ export class RoomWallArc extends RoomWallBase
); );
} }
} }
//如果是1的话 是渲染器走的
if (materialIndex === 1)
{
materialIndex = expMaterialIndex;
}
else
{
materialIndex++;
expMaterialIndex++;
//这里不使用1
if (materialIndex === 1)
{
materialIndex++; materialIndex++;
expMaterialIndex++;
}
}
} }
}; };
const BuildRightFace = (curve: Curve, isLid?: boolean) => const BuildRightFace = (curve: Curve, isLid?: boolean) =>
{ {
if (curve[CURVE_FACE_TYPE_KEY] === WallFaceType.Outside) if (curve[CURVE_FACE_TYPE_KEY] === WallFaceType.Outside)
{ {
materialIndex++;
//del_exp_start //del_exp_start
return;//我们暂时直接不绘制外墙 return;//我们暂时直接不绘制外墙
//del_exp_end //del_exp_end
materialIndex = 1;
} }
if (curve instanceof Line) if (curve instanceof Line)
@ -690,7 +707,22 @@ export class RoomWallArc extends RoomWallBase
); );
} }
} }
}
//如果是1的话 是渲染器走的
if (materialIndex === 1)
{
materialIndex = expMaterialIndex;
}
else
{
materialIndex++;
expMaterialIndex++;
//这里不使用1
if (materialIndex === 1)
{
materialIndex++; materialIndex++;
expMaterialIndex++;
}
} }
}; };
const BuildRegionFace = (region: Polyline) => const BuildRegionFace = (region: Polyline) =>
@ -828,30 +860,30 @@ export class RoomWallArc extends RoomWallBase
let materials: Material[] = []; let materials: Material[] = [];
let materialIndex = 0; let materialIndex = 0;
if (this.LeftCurves)
for (let c of this.LeftCurves)
{
materials.push(this.OverWriteMaterial.get(materialIndex)?.Object.Material ?? defaultMtl);
materialIndex++;
}
if (this.RightCurves) const addMaterial = (curves: (Arc | Line)[]) =>
{ {
for (let c of this.RightCurves) if (curves)
for (let c of curves)
{ {
if (c[CURVE_FACE_TYPE_KEY] === WallFaceType.Outside)
continue;
materials.push(this.OverWriteMaterial.get(materialIndex)?.Object.Material ?? defaultMtl); materials.push(this.OverWriteMaterial.get(materialIndex)?.Object.Material ?? defaultMtl);
materialIndex++; materialIndex++;
} //这里不使用1
} if (materialIndex === 1)
if (this.LidCurves)
{
for (let c of this.LidCurves)
{ {
materials.push(this.OverWriteMaterial.get(materialIndex)?.Object.Material ?? defaultMtl); materials.push(defaultMtl);
materialIndex++; materialIndex++;
} }
} }
};
addMaterial(this.LeftCurves);
addMaterial(this.RightCurves);
addMaterial(this.LidCurves);
if (this.Region) if (this.Region)
{ {

@ -121,6 +121,7 @@ export abstract class RoomWallBase extends RoomBase
//标记算法 求出分裂或合并墙时材质状态 //标记算法 求出分裂或合并墙时材质状态
ResetSign(oldSign: Map<number, number>, newSign: Map<number, number>, allChange?: boolean, isLid?: boolean) ResetSign(oldSign: Map<number, number>, newSign: Map<number, number>, allChange?: boolean, isLid?: boolean)
{ {
this.Thickness;
let materials = Array.from(this.OverWriteMaterial).sort((a, b) => a[0] - b[0]); let materials = Array.from(this.OverWriteMaterial).sort((a, b) => a[0] - b[0]);
//单面墙面增加时 找到增加的位置n n+1面使用n的材质 n+1后材质OverWriteMaterial索引都加1 //单面墙面增加时 找到增加的位置n n+1面使用n的材质 n+1后材质OverWriteMaterial索引都加1
if (oldSign.size < newSign.size) if (oldSign.size < newSign.size)
@ -137,7 +138,12 @@ export abstract class RoomWallBase extends RoomBase
if (n > num) if (n > num)
this.OverWriteMaterial.set(n + 1, m); this.OverWriteMaterial.set(n + 1, m);
} }
this.OverWriteMaterial.set(num + 1, this.OverWriteMaterial.get(num)); let index = num + 1;
if (index === 1)
{
index++;
}
this.OverWriteMaterial.set(index, this.OverWriteMaterial.get(num));
break; break;
} }
} }
@ -166,8 +172,13 @@ export abstract class RoomWallBase extends RoomBase
this.WriteAllObjectRecord(); this.WriteAllObjectRecord();
for (let [n, m] of materials) for (let [n, m] of materials)
{ {
if (n > num) if (n > num)
this.OverWriteMaterial.set(n - 1, m); {
let index = n;
if (index === 2) index--;
this.OverWriteMaterial.set(index - 1, m);
}
} }
this.OverWriteMaterial.delete(materials[materials.length - 1][0]); this.OverWriteMaterial.delete(materials[materials.length - 1][0]);

@ -14,6 +14,7 @@ import { MoveMatrix, ZAxis, ZeroVec, equaln, equalv3, midPoint } from "../../../
import { RenderType } from "../../../../GraphicsSystem/RenderType"; import { RenderType } from "../../../../GraphicsSystem/RenderType";
import { Factory } from "../../../CADFactory"; import { Factory } from "../../../CADFactory";
import { CADFiler } from "../../../CADFiler"; import { CADFiler } from "../../../CADFiler";
import { Arc } from "../../../Entity/Arc";
import { Curve } from "../../../Entity/Curve"; import { Curve } from "../../../Entity/Curve";
import { Line } from "../../../Entity/Line"; import { Line } from "../../../Entity/Line";
import { ObjectId } from "../../../ObjectId"; import { ObjectId } from "../../../ObjectId";
@ -369,6 +370,7 @@ export class RoomWallLine extends RoomWallBase
let parse = new GetLineParam(line); let parse = new GetLineParam(line);
let materialIndex = 0; let materialIndex = 0;
let expMaterialIndex = 0;
if (!this.LeftCurves) if (!this.LeftCurves)
{ {
@ -513,7 +515,23 @@ export class RoomWallLine extends RoomWallBase
[new Vector2(endX, startZ), new Vector2(startX, endZ), new Vector2(endX, endZ)], [new Vector2(endX, startZ), new Vector2(startX, endZ), new Vector2(endX, endZ)],
); );
} }
//如果是1的话 是渲染器走的
if (materialIndex === 1)
{
materialIndex = expMaterialIndex;
}
else
{
materialIndex++;
expMaterialIndex++;
//这里不使用1
if (materialIndex === 1)
{
materialIndex++; materialIndex++;
expMaterialIndex++;
}
}
} }
}; };
const BuildRightFace = (curve: Curve, isLid?: boolean) => const BuildRightFace = (curve: Curve, isLid?: boolean) =>
@ -597,7 +615,23 @@ export class RoomWallLine extends RoomWallBase
[new Vector2(endX, startZ), new Vector2(endX, endZ), new Vector2(startX, endZ)], [new Vector2(endX, startZ), new Vector2(endX, endZ), new Vector2(startX, endZ)],
); );
} }
//如果是1的话 是渲染器走的
if (materialIndex === 1)
{
materialIndex = expMaterialIndex;
}
else
{
materialIndex++;
expMaterialIndex++;
//这里不使用1
if (materialIndex === 1)
{
materialIndex++; materialIndex++;
expMaterialIndex++;
}
}
} }
}; };
@ -703,30 +737,30 @@ export class RoomWallLine extends RoomWallBase
let materials: Material[] = []; let materials: Material[] = [];
let materialIndex = 0; let materialIndex = 0;
if (this.LeftCurves)
for (let c of this.LeftCurves)
{
materials.push(this.OverWriteMaterial.get(materialIndex)?.Object.Material ?? defaultMtl);
materialIndex++;
}
if (this.RightCurves) const addMaterial = (curves: (Arc | Line)[]) =>
{ {
for (let c of this.RightCurves) if (curves)
for (let c of curves)
{ {
if (c[CURVE_FACE_TYPE_KEY] === WallFaceType.Outside)
continue;
materials.push(this.OverWriteMaterial.get(materialIndex)?.Object.Material ?? defaultMtl); materials.push(this.OverWriteMaterial.get(materialIndex)?.Object.Material ?? defaultMtl);
materialIndex++; materialIndex++;
} //这里不使用1
} if (materialIndex === 1)
if (this.LidCurves)
{ {
for (let c of this.LidCurves) materials.push(defaultMtl);
{
materials.push(this.OverWriteMaterial.get(materialIndex)?.Object.Material ?? defaultMtl);
materialIndex++; materialIndex++;
} }
} }
};
addMaterial(this.LeftCurves);
addMaterial(this.RightCurves);
addMaterial(this.LidCurves);
if (this.Region) if (this.Region)
{ {

@ -14,6 +14,7 @@ import { Curve } from '../../DatabaseServices/Entity/Curve';
import { Entity } from '../../DatabaseServices/Entity/Entity'; import { Entity } from '../../DatabaseServices/Entity/Entity';
import { HardwareCompositeEntity } from '../../DatabaseServices/Hardware/HardwareCompositeEntity'; import { HardwareCompositeEntity } from '../../DatabaseServices/Hardware/HardwareCompositeEntity';
import { PhysicalMaterialRecord } from '../../DatabaseServices/PhysicalMaterialRecord'; import { PhysicalMaterialRecord } from '../../DatabaseServices/PhysicalMaterialRecord';
import { RoomWallBase } from '../../DatabaseServices/Room/Entity/Wall/RoomWallBase';
import { Text } from '../../DatabaseServices/Text/Text'; import { Text } from '../../DatabaseServices/Text/Text';
import { TextureTableRecord } from '../../DatabaseServices/Texture'; import { TextureTableRecord } from '../../DatabaseServices/Texture';
import { CommandWrap, commandMachine } from '../../Editor/CommandMachine'; import { CommandWrap, commandMachine } from '../../Editor/CommandMachine';
@ -181,7 +182,15 @@ export class Asset extends React.Component<AssetProps, {}>
if (en instanceof Text) continue; if (en instanceof Text) continue;
if (en instanceof Hole) continue; if (en instanceof Hole) continue;
if (en instanceof RoomWallBase)
{
en.WriteAllObjectRecord();
for (let [num, mtl] of en.OverWriteMaterial)
en.OverWriteMaterial.set(num, material.Id);
}
en.Material = material.Id; en.Material = material.Id;
if (en instanceof Board) if (en instanceof Board)
{ {
if (userConfig.isModifyMaterial) if (userConfig.isModifyMaterial)

@ -15,6 +15,7 @@ import { inflateBase64 } from "../../../Common/inflate";
import { Hole } from '../../../DatabaseServices/3DSolid/Hole'; import { Hole } from '../../../DatabaseServices/3DSolid/Hole';
import { Board } from '../../../DatabaseServices/Entity/Board'; import { Board } from '../../../DatabaseServices/Entity/Board';
import { PhysicalMaterialRecord } from '../../../DatabaseServices/PhysicalMaterialRecord'; import { PhysicalMaterialRecord } from '../../../DatabaseServices/PhysicalMaterialRecord';
import { RoomWallBase } from '../../../DatabaseServices/Room/Entity/Wall/RoomWallBase';
import { CommandWrap } from '../../../Editor/CommandMachine'; import { CommandWrap } from '../../../Editor/CommandMachine';
import { GenerateRaycaster, PointPick, Raycast } from '../../../Editor/PointPick'; import { GenerateRaycaster, PointPick, Raycast } from '../../../Editor/PointPick';
import { userConfig } from '../../../Editor/UserConfig'; import { userConfig } from '../../../Editor/UserConfig';
@ -268,6 +269,13 @@ export class MaterialList extends React.Component<IImgListProps, {}> {
if (en instanceof Text) continue; if (en instanceof Text) continue;
if (en instanceof Hole) continue; if (en instanceof Hole) continue;
if (en instanceof RoomWallBase)
{
en.WriteAllObjectRecord();
for (let [num, mtl] of en.OverWriteMaterial)
en.OverWriteMaterial.set(num, newMaterial.Id);
}
en.Material = newMaterial.Id; en.Material = newMaterial.Id;
if (en instanceof Board) if (en instanceof Board)
{ {

@ -9,6 +9,7 @@ import { UserCollection } from "../../../../../../Common/HostUrl";
import { PostJson } from "../../../../../../Common/Request"; import { PostJson } from "../../../../../../Common/Request";
import { Hole } from "../../../../../../DatabaseServices/3DSolid/Hole"; import { Hole } from "../../../../../../DatabaseServices/3DSolid/Hole";
import { Board } from "../../../../../../DatabaseServices/Entity/Board"; import { Board } from "../../../../../../DatabaseServices/Entity/Board";
import { RoomWallBase } from "../../../../../../DatabaseServices/Room/Entity/Wall/RoomWallBase";
import { CommandWrap } from "../../../../../../Editor/CommandMachine"; import { CommandWrap } from "../../../../../../Editor/CommandMachine";
import { VisualSpaceBox } from "../../../../../../Editor/VisualSpaceBox"; import { VisualSpaceBox } from "../../../../../../Editor/VisualSpaceBox";
import { AppToaster } from "../../../../Toaster"; import { AppToaster } from "../../../../Toaster";
@ -270,6 +271,13 @@ class ResourceItem extends React.Component<{ module: ModuleData; }> {
if (en instanceof Text) continue; if (en instanceof Text) continue;
if (en instanceof Hole) continue; if (en instanceof Hole) continue;
if (en instanceof RoomWallBase)
{
en.WriteAllObjectRecord();
for (let [num, mtl] of en.OverWriteMaterial)
en.OverWriteMaterial.set(num, material.Id);
}
en.Material = material.Id; en.Material = material.Id;
if (en instanceof Board) if (en instanceof Board)
{ {

@ -11,6 +11,7 @@ import { PostJson } from '../../../../Common/Request';
import { Hole } from '../../../../DatabaseServices/3DSolid/Hole'; import { Hole } from '../../../../DatabaseServices/3DSolid/Hole';
import { Board } from '../../../../DatabaseServices/Entity/Board'; import { Board } from '../../../../DatabaseServices/Entity/Board';
import { PhysicalMaterialRecord } from '../../../../DatabaseServices/PhysicalMaterialRecord'; import { PhysicalMaterialRecord } from '../../../../DatabaseServices/PhysicalMaterialRecord';
import { RoomWallBase } from '../../../../DatabaseServices/Room/Entity/Wall/RoomWallBase';
import { CommandWrap } from '../../../../Editor/CommandMachine'; import { CommandWrap } from '../../../../Editor/CommandMachine';
import { VisualSpaceBox } from '../../../../Editor/VisualSpaceBox'; import { VisualSpaceBox } from '../../../../Editor/VisualSpaceBox';
import { AppToaster } from '../../Toaster'; import { AppToaster } from '../../Toaster';
@ -471,6 +472,13 @@ export class ResourceItem extends Component<{ module: ModuleData; }, {}>
if (en instanceof Text) continue; if (en instanceof Text) continue;
if (en instanceof Hole) continue; if (en instanceof Hole) continue;
if (en instanceof RoomWallBase)
{
en.WriteAllObjectRecord();
for (let [num, mtl] of en.OverWriteMaterial)
en.OverWriteMaterial.set(num, material.Id);
}
en.Material = material.Id; en.Material = material.Id;
if (en instanceof Board) if (en instanceof Board)
{ {

@ -10,6 +10,7 @@ import { PostJson } from '../../../../Common/Request';
import { Hole } from '../../../../DatabaseServices/3DSolid/Hole'; import { Hole } from '../../../../DatabaseServices/3DSolid/Hole';
import { Board } from '../../../../DatabaseServices/Entity/Board'; import { Board } from '../../../../DatabaseServices/Entity/Board';
import { PhysicalMaterialRecord } from '../../../../DatabaseServices/PhysicalMaterialRecord'; import { PhysicalMaterialRecord } from '../../../../DatabaseServices/PhysicalMaterialRecord';
import { RoomWallBase } from '../../../../DatabaseServices/Room/Entity/Wall/RoomWallBase';
import { CommandWrap } from '../../../../Editor/CommandMachine'; import { CommandWrap } from '../../../../Editor/CommandMachine';
import { userConfig } from '../../../../Editor/UserConfig'; import { userConfig } from '../../../../Editor/UserConfig';
import { VisualSpaceBox } from '../../../../Editor/VisualSpaceBox'; import { VisualSpaceBox } from '../../../../Editor/VisualSpaceBox';
@ -129,6 +130,13 @@ export default class UserCollect extends Component<{}, {}>
if (en instanceof Text) continue; if (en instanceof Text) continue;
if (en instanceof Hole) continue; if (en instanceof Hole) continue;
if (en instanceof RoomWallBase)
{
en.WriteAllObjectRecord();
for (let [num, mtl] of en.OverWriteMaterial)
en.OverWriteMaterial.set(num, material.Id);
}
en.Material = material.Id; en.Material = material.Id;
if (en instanceof Board) if (en instanceof Board)
{ {

Loading…
Cancel
Save