npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

hecs-plugin-three

v0.17.0

Published

A plugin for hecs that provides rendering, models and primitive shapes via three.js

Downloads

4

Readme

| :warning: Important: This package is WIP and is not ready for use | | --- |

Hecs Plugin Three

A plugin for Hecs that adds functionality to render three.js models and primitives. When used in node or without a viewport configured then appropriate systems become inactive.


Usage

Install via npm/yarn:

yarn add hecs hecs-plugin-core hecs-plugin-three three

Add the plugin to your plugin list when creating a World

import { World } from 'hecs'
import ThreePlugin from 'hecs-plugin-three'

const world = new World({
  plugins: [ThreePlugin],
  systems: [/* your systems */],
  components: [/* your components */],
})

A world instance with this plugin installed can now use all of the features below:


World.presentation.scene

This is the three.js scene used internally. It's available if you need it but completely optional.

World.presentation.setViewport(DOMElement)

Configuring this with a DOMElement will attach the renderer and start rendering your scenes to it. Interally it uses ResizeObserver to watch for resize and automatically updates the camera and renderer perspectives. When no viewport is defined nothing will be rendered and some systems will run passively. Can be unset with null

World.presentation.takePhoto(width, height)

Allows you to take a photo of the scene at any arbitrary size, from the point of view of the camera. The returned value is a base64 string representing the image. Internally this uses CanvasElement.toDataURL(). This is useful for editors to generate thumbnails of a scene, but could also be used during a running simulation to take photos.

Camera (Component)

Adding this component to an entity controls where the camera is in the scene. This component is a singleton so adding it to another entity will remove it from any previous entity.

Requires: Transform

import { Transform } from 'hecs-plugin-core'
import { Camera } from 'hecs-plugin-three'

entity
  .add(Transform)
  .add(Camera)

Model (Component)

Adding this component to an entity will load and render a GLTF asset.

Field|Type|Default|Description ---|---|---|--- asset|Asset|new Asset()|The asset to load and use for the model

Requires: Transform

Advanced: You can determine whether a model is still loading by looking for a ModelLoading component. Once loaded, a ModelMesh component is available to access the actual three.js mesh.

import { Transform, Asset } from 'hecs-plugin-core'
import { Model } from 'hecs-plugin-three'

entity
  .add(Transform)
  .add(Model, { 
    asset: new Asset('me.com/spaceship.glb') 
  })

Shape (Component)

Adding this component to an entity will build and render a primitive shape

Field|Type|Default|Description ---|---|---|--- kind|String|'BOX'|The kind of shape to build. Must be one of BOX, SPHERE or CAPSULE boxSize|Vector3|new Vector3(1, 1, 1)|The size of the box. Only applicable when kind is BOX. sphereRadius|Number|0.5|The radius of the sphere. Only applicable when kind is SPHERE. sphereWidthSegments|Number|16|The width segments of the sphere. Only applicable when kind is SPHERE. sphereHeightSegments|Number|12|The height segments of the sphere. Only applicable when kind is SPHERE. capsuleRadius|Number|0.5|The radius of the capsule. Only applicable when kind is CAPSULE. capsuleHeight|Number|1|The height of the capsule. Only applicable when kind is CAPSULE. capsuleSegments|Number|5|The number of segments for the capsule. Only applicable when kind is CAPSULE. color|Color|'#fff'|The color of the shape.

Requires: Transform

Advanced: A ShapeMesh component is available to access the actual three.js mesh.

import { Transform, Vector3 } from 'hecs-plugin-core'
import { Shape } from 'hecs-plugin-three'

entity
  .add(Transform)
  .add(Shape, { 
    kind: 'BOX',
    boxSize: new Vector3(1, 1, 1),
    color: 'purple'
  })

Object3D (Component)

All entities with a Transform are given an Object3D component which will be displayed in the scene in the correct hierarchical position. This container is used internally for all Model and Shape meshes that are created.

Field|Type|Default|Description ---|---|---|--- value|Object3D|new Object3D()|The object3d

Advanced: You can use this container to add and remove your own meshes without needing to worry about scene hierarchy. See how this can be done in the ModelSystem and ShapeSystem.

Image (Component)

Adding this component to an entity will render an image at its location

Field|Type|Default|Description ---|---|---|--- asset|Asset|new Asset()|The image asset to render width|Number|1|The width of the plane the image is displayed on. height|Number|1|The height of the plane the image is displayed on. fit|String|'CONTAIN'|The fitting mode. CONTAIN means the image will be made to fit inside of the width and height props. COVER means the image will be resized to ensure it covers all width and height surface, cropping the overflow.

Requires: Transform

import { Transform, Asset } from 'hecs-plugin-core'
import { Image } from 'hecs-plugin-three'

entity
  .add(Transform)
  .add(Image, { 
    asset: new Asset('billboard-sign.png'),
    width: 6,
    height: 3,
    fit: 'COVER',
  })

LookAt (Component)

An entity with this component will have its transform constantly updated to look at it's target

Field|Type|Default|Description ---|---|---|--- entity|String|''|The target entity id limit|String|'NONE'|Limits the axis of rotation. NONE means all axis will be rotated, Y_AXIS means only Y will rotate. You can also use X_AXIS and Z_AXIS.

Requires: Transform

import { Transform, Asset } from 'hecs-plugin-core'
import { LookAt, Image } from 'hecs-plugin-three'

entity
  .add(Transform)
  .add(Image, { asset: new Asset('billboard-sign.png') })
  .add(LookAt, { 
    entity: '0:1',
    limit: 'Y_AXIS'
  })

LookAtCamera (Component)

Works the same as the LookAt component but always targets the camera.

Field|Type|Default|Description ---|---|---|--- limit|String|'NONE'|Limits the axis of rotation. NONE means all axis will be rotated, Y_AXIS means only Y will rotate. You can also use X_AXIS and Z_AXIS.

Requires: Transform

import { Transform, Asset } from 'hecs-plugin-core'
import { LookAtCamera, Image } from 'hecs-plugin-three'

entity
  .add(Transform)
  .add(Image, { asset: new Asset('billboard-sign.png') })
  .add(LookAtCamera, { limit: 'Y_AXIS' })