添加材质切换,调节功能
This commit is contained in:
@@ -1,11 +1,10 @@
|
||||
|
||||
import { AmbientLight, BoxBufferGeometry, BufferGeometry, ConeBufferGeometry, CubeRefractionMapping, CubeTextureLoader, Geometry, Mesh, MeshPhysicalMaterial, Object3D, SphereBufferGeometry, sRGBEncoding, Texture, TorusBufferGeometry, TorusKnotBufferGeometry } from 'three';
|
||||
import { AmbientLight, BoxBufferGeometry, BufferGeometry, Color, ConeBufferGeometry, CubeRefractionMapping, CubeTextureLoader, FrontSide, Geometry, LinearEncoding, Mesh, MeshPhysicalMaterial, Object3D, SphereBufferGeometry, sRGBEncoding, Texture, TextureLoader, TorusBufferGeometry, TorusKnotBufferGeometry, Vector3 } from 'three';
|
||||
import { Singleton } from './Singleton';
|
||||
import { Viewer } from './Viewer';
|
||||
import { PMREMGenerator3 } from './PMREMGenerator2';
|
||||
import type { PhysicalMaterialRecord, TextureTableRecord } from 'webcad_ue4_api';
|
||||
import { MaterialEditorCamerControl } from './MaterialMouseControl';
|
||||
import { ref } from 'vue';
|
||||
import { MaterialEditorCameraControl } from './MaterialMouseControl';
|
||||
|
||||
async function textureRenderUpdate(textureRecord:TextureTableRecord){
|
||||
const texture = textureRecord['texture'] as Texture;
|
||||
@@ -29,9 +28,11 @@ async function textureRenderUpdate(textureRecord:TextureTableRecord){
|
||||
*/
|
||||
export class MaterialEditor extends Singleton
|
||||
{
|
||||
private _pointerLocked = false;
|
||||
|
||||
Geometrys: Map<string, Geometry | BufferGeometry>;
|
||||
|
||||
CurGeometryName = ref("球");
|
||||
CurGeometryName = "球";
|
||||
Canvas: HTMLElement;
|
||||
ShowObject: Object3D;
|
||||
ShowMesh: Mesh;
|
||||
@@ -68,14 +69,21 @@ export class MaterialEditor extends Singleton
|
||||
{
|
||||
this.Viewer = new Viewer(this.Canvas);
|
||||
// this.Viewer.PreViewer.Cursor.CursorObject.visible = false;
|
||||
// this.Viewer.CameraCtrl.CameraType = CameraType.PerspectiveCamera;
|
||||
// this.Viewer.UsePass = false;
|
||||
this.initScene();
|
||||
new MaterialEditorCamerControl(this.Viewer);
|
||||
new MaterialEditorCameraControl(this.Viewer, this.ShowObject.position);
|
||||
this.Viewer.ZoomAll();
|
||||
|
||||
// 初始化相机位置到观察物体的正后方
|
||||
// CameraUpdate中的Rotate参数类型并非标准的欧拉角。。。
|
||||
this.Viewer.RotateAround(new Vector3(0, -90 * 8, 0), this.ShowObject.position);
|
||||
this.Viewer.Pan(new Vector3(0, 0, -1500));
|
||||
this.Viewer.UpdateRender();
|
||||
this.Viewer.Fov = 90;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.Canvas.appendChild(this.Viewer.Renderer.domElement);
|
||||
this.Canvas.appendChild(document);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -83,28 +91,18 @@ export class MaterialEditor extends Singleton
|
||||
{
|
||||
this.Canvas = canvas;
|
||||
this.initViewer();
|
||||
this.CurGeometryName.value = "球";
|
||||
this.CurGeometryName = "球";
|
||||
}
|
||||
initScene()
|
||||
{
|
||||
let scene = this.Viewer.Scene;
|
||||
this.ShowObject = new Object3D();
|
||||
let geo = this.Geometrys.get(this.CurGeometryName.value);
|
||||
let geo = this.Geometrys.get(this.CurGeometryName);
|
||||
this.ShowMesh = new Mesh(geo, this._MeshMaterial);
|
||||
this.ShowMesh.scale.set(1000, 1000, 1000);
|
||||
|
||||
this.ShowObject.add(this.ShowMesh);
|
||||
scene.add(this.ShowObject);
|
||||
// let remove = autorun(() =>
|
||||
// {
|
||||
// let geo = this.Geometrys.get(this.CurGeometryName.get());
|
||||
// if (geo)
|
||||
// {
|
||||
// this.ShowMesh.geometry = geo;
|
||||
// this.Viewer.UpdateRender();
|
||||
// }
|
||||
// });
|
||||
// end(this as MaterialEditor, this.dispose, remove);
|
||||
|
||||
//环境光
|
||||
let ambient = new AmbientLight();
|
||||
@@ -119,14 +117,15 @@ export class MaterialEditor extends Singleton
|
||||
if (this.metaTexture) return this.metaTexture;
|
||||
if (this.metaPromise) return this.metaPromise;
|
||||
|
||||
return new Promise((res, rej) =>
|
||||
return new Promise(async (res, rej) =>
|
||||
{
|
||||
let urls = ['right.webp', 'left.webp', 'top.webp', 'bottom.webp', 'front.webp', 'back.webp'];
|
||||
new CubeTextureLoader().setPath('https://cdn.cfcad.cn/t/house/')
|
||||
new CubeTextureLoader().setPath('./')
|
||||
.load(urls, (t) =>
|
||||
{
|
||||
t.encoding = sRGBEncoding;
|
||||
t.mapping = CubeRefractionMapping;
|
||||
t.encoding = LinearEncoding;
|
||||
|
||||
let pmremGenerator = new PMREMGenerator3(this.Viewer.Renderer);
|
||||
let ldrCubeRenderTarget = pmremGenerator.fromCubemap(t);
|
||||
@@ -135,8 +134,6 @@ export class MaterialEditor extends Singleton
|
||||
res(this.metaTexture);
|
||||
|
||||
this.Viewer.Scene.background = this.metaTexture;
|
||||
// this.Viewer.Scene.background = new Color(255,0,0);
|
||||
|
||||
this.Viewer.UpdateRender();
|
||||
});
|
||||
});
|
||||
@@ -151,12 +148,14 @@ export class MaterialEditor extends Singleton
|
||||
|
||||
this.exrPromise = new Promise<Texture>((res, rej) =>
|
||||
{
|
||||
let urls = ['right.webp', 'left.webp', 'top.webp', 'bottom.webp', 'front.webp', 'back.webp'];
|
||||
new CubeTextureLoader().setPath('https://cdn.cfcad.cn/t/house_gray/')
|
||||
let urls = ['right-gray.webp', 'left-gray.webp', 'top-gray.webp', 'bottom-gray.webp', 'front-gray.webp', 'back-gray.webp'];
|
||||
new CubeTextureLoader().setPath('./')
|
||||
.load(urls, (t) =>
|
||||
{
|
||||
t.encoding = sRGBEncoding;
|
||||
t.mapping = CubeRefractionMapping;
|
||||
t.encoding = LinearEncoding;
|
||||
|
||||
let pmremGenerator = new PMREMGenerator3(this.Viewer.Renderer);
|
||||
let target = pmremGenerator.fromCubemap(t);
|
||||
this.exrTexture = target.texture;
|
||||
@@ -198,21 +197,6 @@ export class MaterialEditor extends Singleton
|
||||
async Update()
|
||||
{
|
||||
let mat = this.ShowMesh.material as MeshPhysicalMaterial;
|
||||
if (this.Material.map && this.Material.map.Object && this.Material.useMap)
|
||||
{
|
||||
let texture = this.Material.map.Object as TextureTableRecord;
|
||||
await textureRenderUpdate(texture);
|
||||
}
|
||||
if (this.Material.bumpMap && this.Material.bumpMap.Object)
|
||||
{
|
||||
let texture = this.Material.bumpMap.Object as TextureTableRecord;
|
||||
await textureRenderUpdate(texture);
|
||||
}
|
||||
if (this.Material.roughnessMap && this.Material.roughnessMap.Object)
|
||||
{
|
||||
let texture = this.Material.roughnessMap.Object as TextureTableRecord;
|
||||
await textureRenderUpdate(texture);
|
||||
}
|
||||
mat.needsUpdate = true;
|
||||
|
||||
this._MeshMaterial.copy(this.Material.Material);
|
||||
|
Reference in New Issue
Block a user