mirror of
https://github.com/troisjs/trois.git
synced 2024-11-24 04:12:02 +08:00
wip: lights
This commit is contained in:
parent
ca2ef58436
commit
a7a4f15734
@ -1,12 +0,0 @@
|
||||
import { defineComponent } from 'vue';
|
||||
import { AmbientLight } from 'three';
|
||||
import Light from './Light.js';
|
||||
|
||||
export default defineComponent({
|
||||
extends: Light,
|
||||
created() {
|
||||
this.light = new AmbientLight(this.color, this.intensity);
|
||||
this.initLight();
|
||||
},
|
||||
__hmrId: 'AmbientLight',
|
||||
});
|
11
src/lights/AmbientLight.ts
Normal file
11
src/lights/AmbientLight.ts
Normal file
@ -0,0 +1,11 @@
|
||||
import { defineComponent } from 'vue'
|
||||
import { AmbientLight } from 'three'
|
||||
import Light from './Light'
|
||||
|
||||
export default defineComponent({
|
||||
extends: Light,
|
||||
created() {
|
||||
this.initLight(new AmbientLight(this.color, this.intensity))
|
||||
},
|
||||
__hmrId: 'AmbientLight',
|
||||
})
|
@ -1,15 +0,0 @@
|
||||
import { defineComponent } from 'vue';
|
||||
import { DirectionalLight } from 'three';
|
||||
import Light from './Light.js';
|
||||
|
||||
export default defineComponent({
|
||||
extends: Light,
|
||||
props: {
|
||||
target: Object,
|
||||
},
|
||||
created() {
|
||||
this.light = new DirectionalLight(this.color, this.intensity);
|
||||
this.initLight();
|
||||
},
|
||||
__hmrId: 'DirectionalLight',
|
||||
});
|
14
src/lights/DirectionalLight.ts
Normal file
14
src/lights/DirectionalLight.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import { defineComponent } from 'vue'
|
||||
import { DirectionalLight } from 'three'
|
||||
import Light from './Light'
|
||||
|
||||
export default defineComponent({
|
||||
extends: Light,
|
||||
props: {
|
||||
target: { type: Object, default: () => ({ x: 0, y: 0, z: 0 }) },
|
||||
},
|
||||
created() {
|
||||
this.initLight(new DirectionalLight(this.color, this.intensity))
|
||||
},
|
||||
__hmrId: 'DirectionalLight',
|
||||
})
|
@ -1,16 +0,0 @@
|
||||
import { defineComponent, watch } from 'vue';
|
||||
import { HemisphereLight } from 'three';
|
||||
import Light from './Light.js';
|
||||
|
||||
export default defineComponent({
|
||||
extends: Light,
|
||||
props: {
|
||||
groundColor: { type: String, default: '#444444' },
|
||||
},
|
||||
created() {
|
||||
this.light = new HemisphereLight(this.color, this.groundColor, this.intensity);
|
||||
watch(() => this.groundColor, (value) => { this.light.groundColor.set(value); });
|
||||
this.initLight();
|
||||
},
|
||||
__hmrId: 'HemisphereLight',
|
||||
});
|
16
src/lights/HemisphereLight.ts
Normal file
16
src/lights/HemisphereLight.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import { defineComponent, watch } from 'vue'
|
||||
import { HemisphereLight } from 'three'
|
||||
import Light from './Light'
|
||||
|
||||
export default defineComponent({
|
||||
extends: Light,
|
||||
props: {
|
||||
groundColor: { type: String, default: '#444444' },
|
||||
},
|
||||
created() {
|
||||
const light = new HemisphereLight(this.color, this.groundColor, this.intensity)
|
||||
watch(() => this.groundColor, (value) => { light.groundColor.set(value) })
|
||||
this.initLight(light)
|
||||
},
|
||||
__hmrId: 'HemisphereLight',
|
||||
})
|
@ -1,47 +0,0 @@
|
||||
import { defineComponent, watch } from 'vue';
|
||||
import Object3D from '../core/Object3D';
|
||||
import { bindProp, setFromProp } from '../tools';
|
||||
|
||||
export default defineComponent({
|
||||
extends: Object3D,
|
||||
name: 'Light',
|
||||
props: {
|
||||
color: { type: String, default: '#ffffff' },
|
||||
intensity: { type: Number, default: 1 },
|
||||
castShadow: { type: Boolean, default: false },
|
||||
shadowMapSize: { type: Object, default: { x: 512, y: 512 } },
|
||||
shadowCamera: { type: Object, default: {} },
|
||||
},
|
||||
// can't use setup because it will not be used in sub components
|
||||
// setup() {},
|
||||
unmounted() {
|
||||
if (this.light.target) this.removeFromParent(this.light.target);
|
||||
},
|
||||
methods: {
|
||||
initLight() {
|
||||
if (this.light.target) {
|
||||
bindProp(this, 'target', this.light.target, 'position');
|
||||
}
|
||||
|
||||
if (this.light.shadow) {
|
||||
this.light.castShadow = this.castShadow;
|
||||
setFromProp(this.light.shadow.mapSize, this.shadowMapSize);
|
||||
setFromProp(this.light.shadow.camera, this.shadowCamera);
|
||||
}
|
||||
|
||||
['color', 'intensity', 'castShadow'].forEach(p => {
|
||||
watch(() => this[p], () => {
|
||||
if (p === 'color') {
|
||||
this.light.color.set(this.color);
|
||||
} else {
|
||||
this.light[p] = this[p];
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
this.initObject3D(this.light);
|
||||
if (this.light.target) this.addToParent(this.light.target);
|
||||
},
|
||||
},
|
||||
__hmrId: 'Light',
|
||||
});
|
59
src/lights/Light.ts
Normal file
59
src/lights/Light.ts
Normal file
@ -0,0 +1,59 @@
|
||||
import { DirectionalLight, Light, SpotLight } from 'three'
|
||||
import { defineComponent, watch } from 'vue'
|
||||
import Object3D from '../core/Object3D'
|
||||
import { bindProp, setFromProp } from '../tools'
|
||||
|
||||
interface LightInterface {
|
||||
light?: Light
|
||||
}
|
||||
|
||||
type LightWithTarget = SpotLight | DirectionalLight
|
||||
|
||||
export default defineComponent({
|
||||
extends: Object3D,
|
||||
name: 'Light',
|
||||
props: {
|
||||
color: { type: String, default: '#ffffff' },
|
||||
intensity: { type: Number, default: 1 },
|
||||
castShadow: { type: Boolean, default: false },
|
||||
shadowMapSize: { type: Object, default: () => ({ x: 512, y: 512 }) },
|
||||
shadowCamera: { type: Object, default: () => ({}) },
|
||||
},
|
||||
setup(): LightInterface {
|
||||
return {}
|
||||
},
|
||||
unmounted() {
|
||||
const light = this.light as LightWithTarget
|
||||
if (light && light.target) this.removeFromParent(light.target)
|
||||
},
|
||||
methods: {
|
||||
initLight(light: Light) {
|
||||
this.light = light
|
||||
|
||||
const lightWithTarget = light as LightWithTarget
|
||||
if (lightWithTarget.target) {
|
||||
bindProp(this, 'target', lightWithTarget.target, 'position')
|
||||
}
|
||||
|
||||
if (this.light?.shadow) {
|
||||
this.light.castShadow = this.castShadow
|
||||
setFromProp(this.light.shadow.mapSize, this.shadowMapSize)
|
||||
setFromProp(this.light.shadow.camera, this.shadowCamera)
|
||||
}
|
||||
|
||||
['color', 'intensity', 'castShadow'].forEach(p => {
|
||||
watch(() => this[p], () => {
|
||||
if (p === 'color') {
|
||||
light.color.set(this.color)
|
||||
} else {
|
||||
light[p] = this[p]
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
this.initObject3D(this.light)
|
||||
if (lightWithTarget.target) this.addToParent(lightWithTarget.target)
|
||||
},
|
||||
},
|
||||
__hmrId: 'Light',
|
||||
})
|
@ -1,22 +0,0 @@
|
||||
import { defineComponent } from 'vue';
|
||||
import { PointLight } from 'three';
|
||||
import Light from './Light.js';
|
||||
|
||||
export default defineComponent({
|
||||
extends: Light,
|
||||
props: {
|
||||
distance: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
decay: {
|
||||
type: Number,
|
||||
default: 1,
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.light = new PointLight(this.color, this.intensity, this.distance, this.decay);
|
||||
this.initLight();
|
||||
},
|
||||
__hmrId: 'PointLight',
|
||||
});
|
15
src/lights/PointLight.ts
Normal file
15
src/lights/PointLight.ts
Normal file
@ -0,0 +1,15 @@
|
||||
import { defineComponent } from 'vue'
|
||||
import { PointLight } from 'three'
|
||||
import Light from './Light'
|
||||
|
||||
export default defineComponent({
|
||||
extends: Light,
|
||||
props: {
|
||||
distance: { type: Number, default: 0 },
|
||||
decay: { type: Number, default: 1 },
|
||||
},
|
||||
created() {
|
||||
this.initLight(new PointLight(this.color, this.intensity, this.distance, this.decay))
|
||||
},
|
||||
__hmrId: 'PointLight',
|
||||
})
|
@ -1,32 +0,0 @@
|
||||
import { defineComponent, watch } from 'vue';
|
||||
import { RectAreaLight } from 'three';
|
||||
import { RectAreaLightUniformsLib } from 'three/examples/jsm/lights/RectAreaLightUniformsLib.js';
|
||||
import { RectAreaLightHelper } from 'three/examples/jsm/helpers/RectAreaLightHelper.js';
|
||||
import Light from './Light.js';
|
||||
|
||||
export default defineComponent({
|
||||
extends: Light,
|
||||
props: {
|
||||
width: { type: Number, default: 10 },
|
||||
height: { type: Number, default: 10 },
|
||||
helper: Boolean,
|
||||
},
|
||||
created() {
|
||||
RectAreaLightUniformsLib.init();
|
||||
this.light = new RectAreaLight(this.color, this.intensity, this.width, this.height);
|
||||
|
||||
['width', 'height'].forEach(p => {
|
||||
watch(() => this[p], () => {
|
||||
this.light[p] = this[p];
|
||||
});
|
||||
});
|
||||
|
||||
if (this.helper) {
|
||||
this.lightHelper = new RectAreaLightHelper(this.light);
|
||||
this.light.add(this.lightHelper);
|
||||
}
|
||||
|
||||
this.initLight();
|
||||
},
|
||||
__hmrId: 'RectAreaLight',
|
||||
});
|
33
src/lights/RectAreaLight.ts
Normal file
33
src/lights/RectAreaLight.ts
Normal file
@ -0,0 +1,33 @@
|
||||
import { defineComponent, watch } from 'vue'
|
||||
import { RectAreaLight } from 'three'
|
||||
import { RectAreaLightUniformsLib } from 'three/examples/jsm/lights/RectAreaLightUniformsLib.js'
|
||||
import { RectAreaLightHelper } from 'three/examples/jsm/helpers/RectAreaLightHelper.js'
|
||||
import Light from './Light'
|
||||
|
||||
export default defineComponent({
|
||||
extends: Light,
|
||||
props: {
|
||||
width: { type: Number, default: 10 },
|
||||
height: { type: Number, default: 10 },
|
||||
helper: Boolean,
|
||||
},
|
||||
created() {
|
||||
RectAreaLightUniformsLib.init()
|
||||
const light = new RectAreaLight(this.color, this.intensity, this.width, this.height)
|
||||
|
||||
const watchProps = ['width', 'height']
|
||||
watchProps.forEach(p => {
|
||||
watch(() => this[p], () => {
|
||||
light[p] = this[p]
|
||||
})
|
||||
})
|
||||
|
||||
if (this.helper) {
|
||||
const lightHelper = new RectAreaLightHelper(light)
|
||||
light.add(lightHelper)
|
||||
}
|
||||
|
||||
this.initLight(light)
|
||||
},
|
||||
__hmrId: 'RectAreaLight',
|
||||
})
|
@ -1,24 +0,0 @@
|
||||
import { defineComponent, watch } from 'vue';
|
||||
import { SpotLight } from 'three';
|
||||
import Light from './Light.js';
|
||||
|
||||
export default defineComponent({
|
||||
extends: Light,
|
||||
props: {
|
||||
angle: { type: Number, default: Math.PI / 3 },
|
||||
decay: { type: Number, default: 1 },
|
||||
distance: { type: Number, default: 0 },
|
||||
penumbra: { type: Number, default: 0 },
|
||||
target: Object,
|
||||
},
|
||||
created() {
|
||||
this.light = new SpotLight(this.color, this.intensity, this.distance, this.angle, this.penumbra, this.decay);
|
||||
['angle', 'decay', 'distance', 'penumbra'].forEach(p => {
|
||||
watch(() => this[p], () => {
|
||||
this.light[p] = this[p];
|
||||
});
|
||||
});
|
||||
this.initLight();
|
||||
},
|
||||
__hmrId: 'SpotLight',
|
||||
});
|
27
src/lights/SpotLight.ts
Normal file
27
src/lights/SpotLight.ts
Normal file
@ -0,0 +1,27 @@
|
||||
import { defineComponent, watch } from 'vue'
|
||||
import { SpotLight } from 'three'
|
||||
import Light from './Light'
|
||||
|
||||
export default defineComponent({
|
||||
extends: Light,
|
||||
props: {
|
||||
angle: { type: Number, default: Math.PI / 3 },
|
||||
decay: { type: Number, default: 1 },
|
||||
distance: { type: Number, default: 0 },
|
||||
penumbra: { type: Number, default: 0 },
|
||||
target: Object,
|
||||
},
|
||||
created() {
|
||||
const light = new SpotLight(this.color, this.intensity, this.distance, this.angle, this.penumbra, this.decay)
|
||||
|
||||
const watchProps = ['angle', 'decay', 'distance', 'penumbra']
|
||||
watchProps.forEach(p => {
|
||||
watch(() => this[p], () => {
|
||||
light[p] = this[p]
|
||||
})
|
||||
})
|
||||
|
||||
this.initLight(light)
|
||||
},
|
||||
__hmrId: 'SpotLight',
|
||||
})
|
@ -1,6 +0,0 @@
|
||||
export { default as AmbientLight } from './AmbientLight.js';
|
||||
export { default as DirectionalLight } from './DirectionalLight.js';
|
||||
export { default as HemisphereLight } from './HemisphereLight.js';
|
||||
export { default as PointLight } from './PointLight.js';
|
||||
export { default as RectAreaLight } from './RectAreaLight.js';
|
||||
export { default as SpotLight } from './SpotLight.js';
|
6
src/lights/index.ts
Normal file
6
src/lights/index.ts
Normal file
@ -0,0 +1,6 @@
|
||||
export { default as AmbientLight } from './AmbientLight'
|
||||
export { default as DirectionalLight } from './DirectionalLight'
|
||||
export { default as HemisphereLight } from './HemisphereLight'
|
||||
export { default as PointLight } from './PointLight'
|
||||
export { default as RectAreaLight } from './RectAreaLight'
|
||||
export { default as SpotLight } from './SpotLight'
|
Loading…
Reference in New Issue
Block a user