silphius/app/react-components/pixi/pixi.jsx
2024-07-17 05:07:50 -05:00

74 lines
1.7 KiB
JavaScript

import {SCALE_MODES} from '@pixi/constants';
import {BaseTexture} from '@pixi/core';
import {createElement, useContext} from 'react';
import {RESOLUTION} from '@/constants.js';
import AssetsContext from '@/context/assets.js';
import ClientContext from '@/context/client.js';
import DebugContext from '@/context/debug.js';
import EcsContext from '@/context/ecs.js';
import MainEntityContext from '@/context/main-entity.js';
import RadiansContext from '@/context/radians.js';
import Ecs from './ecs.jsx';
import styles from './pixi.module.css';
import PixiStage from './stage.jsx';
BaseTexture.defaultOptions.scaleMode = SCALE_MODES.NEAREST;
const Contexts = [
AssetsContext,
ClientContext,
DebugContext,
EcsContext,
MainEntityContext,
RadiansContext,
];
const ContextBridge = ({children, render}) => {
const contexts = Contexts.map(useContext);
return render(
<>
{
Contexts.reduce(
(children, Context, i) => ([
createElement(Context.Provider, {value: contexts[i], key: Context}, children)
]),
children,
)
}
</>
);
};
export const Stage = ({children, ...props}) => {
return (
<ContextBridge
render={(children) => <PixiStage {...props}>{children}</PixiStage>}
>
{children}
</ContextBridge>
);
};
export default function Pixi({applyFilters, camera, monopolizers, scale}) {
return (
<Stage
className={styles.stage}
width={RESOLUTION.x}
height={RESOLUTION.y}
options={{
background: 0x0,
}}
>
<Ecs
applyFilters={applyFilters}
camera={camera}
monopolizers={monopolizers}
scale={scale}
/>
</Stage>
);
}