mirror of
https://github.com/troisjs/trois.git
synced 2024-11-24 04:12:02 +08:00
instancedmesh
This commit is contained in:
parent
3b53044f14
commit
8a2d874290
@ -1,64 +0,0 @@
|
|||||||
import { defineComponent } from 'vue';
|
|
||||||
import { InstancedMesh } from 'three';
|
|
||||||
import Object3D from '../core/Object3D';
|
|
||||||
import { bindProp } from '../tools';
|
|
||||||
import { pointerProps } from './Mesh';
|
|
||||||
|
|
||||||
export default defineComponent({
|
|
||||||
extends: Object3D,
|
|
||||||
props: {
|
|
||||||
castShadow: Boolean,
|
|
||||||
receiveShadow: Boolean,
|
|
||||||
count: Number,
|
|
||||||
...pointerProps,
|
|
||||||
},
|
|
||||||
provide() {
|
|
||||||
return {
|
|
||||||
mesh: this,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
beforeMount() {
|
|
||||||
if (!this.$slots.default) {
|
|
||||||
console.error('Missing Geometry');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.initMesh();
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
initMesh() {
|
|
||||||
this.mesh = new InstancedMesh(this.geometry, this.material, this.count);
|
|
||||||
this.mesh.component = this;
|
|
||||||
|
|
||||||
bindProp(this, 'castShadow', this.mesh);
|
|
||||||
bindProp(this, 'receiveShadow', this.mesh);
|
|
||||||
|
|
||||||
if (this.onPointerEnter ||
|
|
||||||
this.onPointerOver ||
|
|
||||||
this.onPointerMove ||
|
|
||||||
this.onPointerLeave ||
|
|
||||||
this.onPointerDown ||
|
|
||||||
this.onPointerUp ||
|
|
||||||
this.onClick) {
|
|
||||||
this.three.addIntersectObject(this.mesh);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.initObject3D(this.mesh);
|
|
||||||
},
|
|
||||||
setGeometry(geometry) {
|
|
||||||
this.geometry = geometry;
|
|
||||||
if (this.mesh) this.mesh.geometry = geometry;
|
|
||||||
},
|
|
||||||
setMaterial(material) {
|
|
||||||
this.material = material;
|
|
||||||
this.material.instancingColor = true;
|
|
||||||
if (this.mesh) this.mesh.material = material;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
unmounted() {
|
|
||||||
if (this.mesh) {
|
|
||||||
this.three.removeIntersectObject(this.mesh);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
__hmrId: 'InstancedMesh',
|
|
||||||
});
|
|
67
src/meshes/InstancedMesh.ts
Normal file
67
src/meshes/InstancedMesh.ts
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
import { defineComponent } from 'vue'
|
||||||
|
import { BufferGeometry, InstancedMesh, Material } from 'three'
|
||||||
|
import Object3D, { object3DSetup } from '../core/Object3D'
|
||||||
|
import { bindProp } from '../tools'
|
||||||
|
import { MeshSetupInterface, pointerProps } from './Mesh'
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
extends: Object3D,
|
||||||
|
props: {
|
||||||
|
castShadow: Boolean,
|
||||||
|
receiveShadow: Boolean,
|
||||||
|
count: { type: Number, required: true },
|
||||||
|
...pointerProps,
|
||||||
|
},
|
||||||
|
setup(): MeshSetupInterface {
|
||||||
|
return object3DSetup()
|
||||||
|
},
|
||||||
|
provide() {
|
||||||
|
return {
|
||||||
|
mesh: this,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
if (!this.$slots.default) {
|
||||||
|
console.error('Missing geometry and material')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.initMesh()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
initMesh() {
|
||||||
|
console.log(this.material)
|
||||||
|
if (!this.geometry || !this.material) return false
|
||||||
|
this.mesh = new InstancedMesh(this.geometry, this.material, this.count)
|
||||||
|
this.mesh.userData.component = this
|
||||||
|
|
||||||
|
bindProp(this, 'castShadow', this.mesh)
|
||||||
|
bindProp(this, 'receiveShadow', this.mesh)
|
||||||
|
|
||||||
|
if (this.onPointerEnter ||
|
||||||
|
this.onPointerOver ||
|
||||||
|
this.onPointerMove ||
|
||||||
|
this.onPointerLeave ||
|
||||||
|
this.onPointerDown ||
|
||||||
|
this.onPointerUp ||
|
||||||
|
this.onClick) {
|
||||||
|
this.three.addIntersectObject(this.mesh)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.initObject3D(this.mesh)
|
||||||
|
},
|
||||||
|
setGeometry(geometry: BufferGeometry) {
|
||||||
|
this.geometry = geometry
|
||||||
|
if (this.mesh) this.mesh.geometry = geometry
|
||||||
|
},
|
||||||
|
setMaterial(material: Material) {
|
||||||
|
this.material = material
|
||||||
|
if (this.mesh) this.mesh.material = material
|
||||||
|
},
|
||||||
|
},
|
||||||
|
unmounted() {
|
||||||
|
if (this.mesh) {
|
||||||
|
this.three.removeIntersectObject(this.mesh)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
__hmrId: 'InstancedMesh',
|
||||||
|
})
|
Loading…
Reference in New Issue
Block a user