12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- import * as RE from 'rogue-engine';
- import * as THREE from 'three';
- import RogueRapier from '../Lib/RogueRapier';
- import RapierBody from './RapierBody.re';
- import RAPIER from '@dimforge/rapier3d-compat';
- export default class RapierConfig extends RE.Component {
- @RE.props.vector3() gravity = new THREE.Vector3(0, -9.81, 0);
- private _debug = false;
- @RE.props.checkbox() get debug() {return this._debug}
- set debug(value: boolean) {
- this._debug = value;
- RE.Runtime.isRunning && value ?
- RE.App.currentScene.add(this.lines) :
- RE.App.currentScene.remove(this.lines)
- }
- lines = new THREE.LineSegments(
- new THREE.BufferGeometry(),
- new THREE.LineBasicMaterial({ color: new THREE.Color("#00FF00") })
- );
- awake() {
- this.lines.name = "Rapier Debug Lines";
- RogueRapier.init(() => {
- RogueRapier.world.gravity = this.gravity;
- });
- }
- start() {
- if (this.debug) {
- RE.App.currentScene.add(this.lines);
- }
- }
- beforeUpdate() {
- if (!RogueRapier.initialized) return;
- if (this.debug) {
- let buffers = RogueRapier.world.debugRender();
- this.lines.geometry.setAttribute(
- "position",
- new THREE.BufferAttribute(buffers.vertices, 3),
- );
-
- this.lines.geometry.setAttribute(
- "color",
- new THREE.BufferAttribute(buffers.colors, 4),
- );
- }
- RogueRapier.world.step(RogueRapier.eventQueue);
- RogueRapier.eventQueue.drainCollisionEvents((handle1, handle2, started) => {
- const col1 = RogueRapier.world.getCollider(handle1);
- const col2 = RogueRapier.world.getCollider(handle2);
- const body1 = col1.parent();
- const body2 = col2.parent();
- const components = RE.getComponents(RapierBody);
- let bodyComp1: RapierBody | undefined;
- let bodyComp2: RapierBody | undefined;
- components.forEach(bodyComp => {
- if (bodyComp.body.handle === body1?.handle) {
- bodyComp1 = bodyComp;
- }
- else if (bodyComp.body.handle === body2?.handle) {
- bodyComp2 = bodyComp;
- }
- });
- if (bodyComp1 && col1.activeEvents() === RAPIER.ActiveEvents.COLLISION_EVENTS) {
- const colInfo = {ownCollider: col1, otherCollider: col2, otherBody: bodyComp2 as RapierBody}
- started ? bodyComp1.onCollisionStart(colInfo) : bodyComp1.onCollisionEnd(colInfo);
- }
- if (bodyComp2 && col2.activeEvents() === RAPIER.ActiveEvents.COLLISION_EVENTS) {
- const colInfo = {ownCollider: col1, otherCollider: col2, otherBody: bodyComp1 as RapierBody}
- started ? bodyComp2.onCollisionStart(colInfo) : bodyComp2.onCollisionEnd(colInfo);
- }
- });
- }
- }
- RE.registerComponent(RapierConfig);
|