@@ -4,7 +4,6 @@ import { BufferGeometry, Mesh, MeshBasicMaterial, MeshNormalMaterial, Vector3 }
44import { setComponent , useComponent } from '@ir-engine/ecs/src/ComponentFunctions'
55import { createEntity , removeEntity , useEntityContext } from '@ir-engine/ecs/src/EntityFunctions'
66import { NameComponent } from '@ir-engine/spatial/src/common/NameComponent'
7- import { addObjectToGroup , removeObjectFromGroup } from '@ir-engine/spatial/src/renderer/components/GroupComponent'
87
98import { EntityTreeComponent } from '@ir-engine/ecs'
109import { QueryReactor } from '@ir-engine/ecs/src/QueryFunctions'
@@ -13,6 +12,8 @@ import { ColliderComponent } from '@ir-engine/spatial/src/physics/components/Col
1312import { RigidBodyComponent } from '@ir-engine/spatial/src/physics/components/RigidBodyComponent'
1413import { CollisionGroups , DefaultCollisionMask } from '@ir-engine/spatial/src/physics/enums/CollisionGroups'
1514import { BodyTypes , Shapes } from '@ir-engine/spatial/src/physics/types/PhysicsTypes'
15+ import { MeshComponent } from '@ir-engine/spatial/src/renderer/components/MeshComponent'
16+ import { VisibleComponent } from '@ir-engine/spatial/src/renderer/components/VisibleComponent'
1617import { XRDetectedMeshComponent } from '@ir-engine/spatial/src/xr/XRDetectedMeshComponent'
1718import { XRDetectedPlaneComponent } from '@ir-engine/spatial/src/xr/XRDetectedPlaneComponent'
1819import { Template } from './utils/template'
@@ -22,35 +23,38 @@ const normalMaterial = new MeshNormalMaterial({ opacity: 0.5, transparent: true
2223
2324export const DetectedPlanes = ( ) => {
2425 const entity = useEntityContext ( )
25-
2626 const xrPlane = useComponent ( entity , XRDetectedPlaneComponent )
2727
2828 useEffect ( ( ) => {
2929 if ( ! xrPlane . geometry . value ) return
30- const transparentMesh = new Mesh ( xrPlane . geometry . value as BufferGeometry , normalMaterial )
31- addObjectToGroup ( entity , transparentMesh )
32- setComponent (
33- entity ,
34- NameComponent ,
35- 'Plane ' + ( xrPlane . plane . value . semanticLabel ?? xrPlane . plane . orientation . value )
36- )
37-
30+ const planeName =
31+ 'XR Plane ' + entity + '(' + ( xrPlane . plane . value . semanticLabel ?? xrPlane . plane . orientation . value ) + ')'
3832 const geometry = xrPlane . geometry . value as BufferGeometry
3933 const box = geometry . boundingBox !
4034 const height = box . max . x - box . min . x
4135 const width = box . max . z - box . min . z
4236
4337 /** Create a child entity such that we can have a distinct scale for the collider */
4438
39+ const meshEntity = createEntity ( )
40+
41+ setComponent ( meshEntity , NameComponent , planeName + ' Mesh' )
42+ setComponent ( meshEntity , EntityTreeComponent , {
43+ parentEntity : entity
44+ } )
45+ setComponent ( meshEntity , TransformComponent )
46+ setComponent ( meshEntity , VisibleComponent )
47+ const transparentMesh = new Mesh ( xrPlane . geometry . value as BufferGeometry , normalMaterial )
48+ setComponent ( meshEntity , MeshComponent , transparentMesh )
49+
4550 const colliderEntity = createEntity ( )
46- setComponent ( colliderEntity , NameComponent , 'Plane ' + entity + ' Collider' )
51+ setComponent ( colliderEntity , NameComponent , planeName + ' Collider' )
4752 setComponent ( colliderEntity , EntityTreeComponent , {
4853 parentEntity : entity
4954 } )
5055 setComponent ( colliderEntity , TransformComponent , {
5156 scale : new Vector3 ( height , 0.01 , width )
5257 } )
53-
5458 setComponent ( colliderEntity , RigidBodyComponent , {
5559 type : BodyTypes . Fixed
5660 } )
@@ -60,15 +64,11 @@ export const DetectedPlanes = () => {
6064 collisionMask : DefaultCollisionMask
6165 } )
6266 return ( ) => {
67+ removeEntity ( meshEntity )
6368 removeEntity ( colliderEntity )
64- removeObjectFromGroup ( entity , transparentMesh )
6569 }
6670 } , [ xrPlane . geometry ] )
6771
68- useEffect ( ( ) => {
69- if ( ! xrPlane . value || ! xrPlane . geometry . value ) return
70- } , [ xrPlane ?. geometry ] )
71-
7272 return null
7373}
7474
@@ -79,20 +79,36 @@ export const DetectedMeshes = () => {
7979
8080 useEffect ( ( ) => {
8181 if ( ! xrmesh . geometry . value ) return
82- const outlineMesh = new Mesh ( xrmesh . geometry . value as BufferGeometry , wireframeMaterial )
83- addObjectToGroup ( entity , outlineMesh )
84- setComponent ( entity , NameComponent , 'Plane ' + ( xrmesh . mesh . value . semanticLabel ?? entity ) )
8582
86- setComponent ( entity , RigidBodyComponent , {
83+ const meshName = 'XR Mesh ' + ( xrmesh . mesh . value . semanticLabel ?? entity )
84+
85+ const meshEntity = createEntity ( )
86+ setComponent ( meshEntity , NameComponent , meshName + ' Mesh' )
87+ setComponent ( meshEntity , EntityTreeComponent , {
88+ parentEntity : entity
89+ } )
90+ setComponent ( meshEntity , TransformComponent )
91+ setComponent ( meshEntity , VisibleComponent )
92+ const mesh = new Mesh ( xrmesh . geometry . value as BufferGeometry , wireframeMaterial )
93+ setComponent ( meshEntity , MeshComponent , mesh )
94+
95+ const colliderEntity = createEntity ( )
96+ setComponent ( colliderEntity , NameComponent , meshName + ' Collider' )
97+ setComponent ( colliderEntity , EntityTreeComponent , {
98+ parentEntity : entity
99+ } )
100+ setComponent ( colliderEntity , TransformComponent )
101+ setComponent ( colliderEntity , RigidBodyComponent , {
87102 type : BodyTypes . Fixed
88103 } )
89- setComponent ( entity , ColliderComponent , {
104+ setComponent ( colliderEntity , ColliderComponent , {
90105 shape : Shapes . Mesh ,
91106 collisionLayer : CollisionGroups . Ground ,
92107 collisionMask : DefaultCollisionMask
93108 } )
94109 return ( ) => {
95- removeObjectFromGroup ( entity , outlineMesh )
110+ removeEntity ( meshEntity )
111+ removeEntity ( colliderEntity )
96112 }
97113 } , [ xrmesh . geometry ] )
98114
0 commit comments