- Jump To … +
  ./source/core/animation-loop.js ./source/core/display-cycle.js ./source/core/document-root-elements.js ./source/core/document.js ./source/core/events.js ./source/core/init.js ./source/core/library.js ./source/core/random-seed.js ./source/core/shared-vars.js ./source/core/snippets.js ./source/core/system-flags.js ./source/core/user-interaction.js ./source/core/utilities.js ./source/factory/action.js ./source/factory/anchor.js ./source/factory/animation.js ./source/factory/array-pool.js ./source/factory/bezier.js ./source/factory/block.js ./source/factory/canvas.js ./source/factory/cell-fragment.js ./source/factory/cell.js ./source/factory/cog.js ./source/factory/color.js ./source/factory/conic-gradient.js ./source/factory/coordinate.js ./source/factory/crescent.js ./source/factory/drag-zone.js ./source/factory/element.js ./source/factory/emitter.js ./source/factory/filter-engine-bluenoise-data.js ./source/factory/filter-engine.js ./source/factory/filter.js ./source/factory/font-attributes.js ./source/factory/gradient.js ./source/factory/grid.js ./source/factory/group.js ./source/factory/image-asset.js ./source/factory/keyboard-zone.js ./source/factory/line-spiral.js ./source/factory/line.js ./source/factory/loom.js ./source/factory/mesh.js ./source/factory/net.js ./source/factory/noise-asset.js ./source/factory/observe-update.js ./source/factory/oval.js ./source/factory/palette.js ./source/factory/particle-force.js ./source/factory/particle-history.js ./source/factory/particle-spring.js ./source/factory/particle-world.js ./source/factory/particle.js ./source/factory/pattern.js ./source/factory/phrase.js ./source/factory/picture.js ./source/factory/polygon.js ./source/factory/polyline.js ./source/factory/quadratic.js ./source/factory/quaternion.js ./source/factory/radial-gradient.js ./source/factory/raw-asset.js ./source/factory/reaction-diffusion-asset.js ./source/factory/rectangle.js ./source/factory/render-animation.js ./source/factory/shape.js ./source/factory/spiral.js ./source/factory/sprite-asset.js ./source/factory/stack.js ./source/factory/star.js ./source/factory/state.js ./source/factory/tetragon.js ./source/factory/ticker.js ./source/factory/tracer.js ./source/factory/tween.js ./source/factory/unstacked-element.js ./source/factory/vector.js ./source/factory/video-asset.js ./source/factory/wheel.js ./source/mixin/anchor.js ./source/mixin/asset-advanced-functionality.js ./source/mixin/asset-consumer.js ./source/mixin/asset.js ./source/mixin/base.js ./source/mixin/cascade.js ./source/mixin/cell-key-functions.js ./source/mixin/delta.js ./source/mixin/display-shape.js ./source/mixin/dom.js ./source/mixin/entity.js ./source/mixin/filter.js ./source/mixin/mimic.js ./source/mixin/path.js ./source/mixin/pattern.js ./source/mixin/pivot.js ./source/mixin/position.js ./source/mixin/shape-basic.js ./source/mixin/shape-curve.js ./source/mixin/shape-path-calculation.js ./source/mixin/styles.js ./source/mixin/tween.js

- §

  # Path mixin

  This mixin defines the attributes and functionality required by an artefact so that it can position and rotate itself along the contours of a shape-based entity.

- §

  #### Imports

      import { artefact } from '../core/library.js';

      import { isa_boolean, mergeOver, pushUnique, removeItem, Ωempty } from '../core/utilities.js';

      import { _abs, PATH, START, ZERO_STR } from '../core/shared-vars.js';

- §

  #### Export function

      export default function (P = Ωempty) {

- §

  #### Shared attributes

          const defaultAttributes = {

- §

  path - reference Shape entity object. Can also be set using the Shape’s name-String.

              path: ZERO_STR,

- §

  pathPosition - float Number between `0.0` - `1.0` representing the distance along the Shape path which is to be used as the reference coordinate.

              pathPosition: 0,

- §

  addPathHandle, addPathOffset, addPathRotation - Boolean flags. When set, the artifact will add its own values to the reference artefact’s values, rather than use them as replacement values.

              addPathHandle: false,
              addPathOffset: true,
              addPathRotation: false,

- §

  DEPRECATION WARNING: `constantSpeedAlongPath` replaces the old attribute `constantPathSpeed` which clashes with the attribute set by the ShapeBasic mixin.

              constantSpeedAlongPath: false,
          };
          P.defs = mergeOver(P.defs, defaultAttributes);
          mergeOver(P, defaultAttributes);

- §

  #### Packet management

          P.packetObjects = pushUnique(P.packetObjects, ['path']);

- §

  #### Clone management

  No additional clone functionality defined here

- §

  #### Kill management

  No additional kill functionality defined here

- §

  #### Get, Set, deltaSet

          const S = P.setters,
              D = P.deltaSetters;

- §

  #### Prototype functions

- §

  path

          S.path = function (item) {

              if (isa_boolean(item) && !item) {

                  this.path = null;

                  if (this.lockTo[0] === PATH) this.lockTo[0] = START;
                  if (this.lockTo[1] === PATH) this.lockTo[1] = START;

                  this.dirtyStampPositions = true;
                  this.dirtyStampHandlePositions = true;
              }
              else {

                  const oldPath = this.path,
                      newPath = (item.substring) ? artefact[item] : item,
                      name = this.name;

                  if (newPath && newPath.name && newPath.useAsPath) {

                      if (oldPath && oldPath.name != newPath.name) removeItem(oldPath.pathed, name);

                      pushUnique(newPath.pathed, name);

                      this.path = newPath;
                      this.dirtyStampPositions = true;
                      this.dirtyStampHandlePositions = true;
                  }
              }
          };

- §

  pathPosition

  - TODO: current functionality is for pathPosition to loop - is there a case for adding a pathPosition loop flag? If yes, then when that flag is false values < 0 would be corrected back to 0, and vals > 1 would be corrected back to 1.

          S.pathPosition = function (item) {

              if (item < 0) item = _abs(item);
              if (item > 1) item = item % 1;

              this.pathPosition = parseFloat(item.toFixed(6));
              this.dirtyStampPositions = true;
              this.dirtyStampHandlePositions = true;
              this.currentPathData = false;
          };
          D.pathPosition = function (item) {

              let pos = this.pathPosition + item

              if (pos < 0) pos += 1;
              if (pos > 1) pos = pos % 1;

              this.pathPosition = parseFloat(pos.toFixed(6));
              this.dirtyStampPositions = true;
              this.dirtyStampHandlePositions = true;
              this.currentPathData = false;
          };

- §

  addPathHandle, addPathOffset, addPathRotation

          S.addPathHandle = function (item) {

              this.addPathHandle = item;
              this.dirtyHandle = true;
          };
          S.addPathOffset = function (item) {

              this.addPathOffset = item;
              this.dirtyOffset = true;
          };
          S.addPathRotation = function (item) {

              this.addPathRotation = item;
              this.dirtyRotation = true;
          };

- §

  #### Prototype functions

- §

  `getPathData`

          P.getPathData = function () {

              if (this.currentPathData) return this.currentPathData;

              const pos = this.pathPosition,
                  path = this.path;

              if (path) {

- §

  Note: the old attribute `constantPathSpeed` has been deprecated because the ShapeBasic mixin adds that attributes to shapes where it has different functionality. This code is temporary until Scrawl-canvas v9 is released

                  const speed = this.constantSpeedAlongPath || this.constantPathSpeed || false;
                  const val = path.getPathPositionData(pos, speed);

                  if (this.addPathRotation) this.dirtyRotation = true;

                  this.currentPathData = val;

                  return val;
              }
              return false;
          };
      }