silphius/app/react-components/pixi/entities.jsx

82 lines
2.3 KiB
React
Raw Normal View History

2024-07-01 18:12:53 -05:00
import {AdjustmentFilter} from '@pixi/filter-adjustment';
import {GlowFilter} from '@pixi/filter-glow';
2024-06-27 13:57:18 -05:00
import {Container} from '@pixi/react';
2024-07-01 18:12:53 -05:00
import {useEffect, useState} from 'react';
2024-07-11 03:09:28 -05:00
import {usePacket} from '@/context/client.js';
import {useEcs, useEcsTick} from '@/context/ecs.js';
2024-07-01 18:12:53 -05:00
import {useMainEntity} from '@/context/main-entity.js';
2024-06-27 13:57:18 -05:00
2024-06-27 02:57:28 -05:00
import Entity from './entity.jsx';
2024-06-18 07:24:20 -05:00
2024-07-11 03:09:28 -05:00
export default function Entities({filters}) {
2024-07-01 18:12:53 -05:00
const [ecs] = useEcs();
2024-07-11 03:09:28 -05:00
const [entities, setEntities] = useState({});
2024-07-01 18:12:53 -05:00
const [mainEntity] = useMainEntity();
const [radians, setRadians] = useState(0);
const [willInteractWith, setWillInteractWith] = useState(0);
2024-07-05 18:25:57 -05:00
const [interactionFilters] = useState([new AdjustmentFilter(), new GlowFilter({color: 0x0})]);
2024-07-01 18:12:53 -05:00
const pulse = (Math.cos(radians) + 1) * 0.5;
2024-07-05 18:25:57 -05:00
interactionFilters[0].brightness = (pulse * 0.75) + 1;
interactionFilters[1].outerStrength = pulse * 0.5;
2024-07-11 03:09:28 -05:00
usePacket('EcsChange', async () => {
setEntities({});
}, [setEntities]);
useEcsTick((payload) => {
if (!ecs) {
return;
}
const updatedEntities = {...entities};
for (const id in payload) {
2024-07-11 16:44:41 -05:00
if ('1' === id) {
continue;
}
2024-07-11 03:09:28 -05:00
const update = payload[id];
if (false === update) {
delete updatedEntities[id];
}
else {
2024-07-11 16:44:41 -05:00
updatedEntities[id] = ecs.get(id);
if (update.Emitter?.emit) {
updatedEntities[id].Emitter.emitting = {
...updatedEntities[id].Emitter.emitting,
...update.Emitter.emit,
};
2024-07-11 03:09:28 -05:00
}
}
}
setEntities(updatedEntities);
const main = ecs.get(mainEntity);
if (main) {
setWillInteractWith(main.Interacts.willInteractWith);
}
}, [ecs, entities, mainEntity]);
2024-07-01 18:12:53 -05:00
useEffect(() => {
setRadians(0);
const handle = setInterval(() => {
setRadians((radians) => (radians + 0.1) % (Math.PI * 2))
}, 50);
return () => {
clearInterval(handle);
};
2024-07-13 02:35:29 -05:00
}, []);
2024-06-18 07:24:20 -05:00
const renderables = [];
2024-06-11 18:42:48 -05:00
for (const id in entities) {
2024-07-01 18:12:53 -05:00
const isHighlightedInteraction = id == willInteractWith;
2024-06-18 07:24:20 -05:00
renderables.push(
2024-06-27 02:57:28 -05:00
<Entity
2024-07-10 14:16:47 -05:00
filters={isHighlightedInteraction ? interactionFilters : null}
2024-06-27 02:57:28 -05:00
entity={entities[id]}
key={id}
2024-06-27 02:57:28 -05:00
/>
2024-06-11 18:42:48 -05:00
);
}
2024-06-27 13:57:18 -05:00
return (
<Container
2024-07-10 14:16:47 -05:00
filters={filters}
2024-06-27 13:57:18 -05:00
sortableChildren
>
{renderables}
</Container>
);
2024-06-11 18:42:48 -05:00
}