Newer
Older
AegisforEcosystem / next / AR.js-3.4.0 / three.js / src / markers-area / arjs-markersareautils.js
@KAOKA Daisuke KAOKA Daisuke on 31 May 2022 9 KB into AR.js
import * as THREE from "three";
import Context from "../threex/arjs-context"; // TODO context build-dependent

const MarkersAreaUtils = {};

//////////////////////////////////////////////////////////////////////////////
//		navigateToLearnerPage
//////////////////////////////////////////////////////////////////////////////

/**
 * Navigate to the multi-marker learner page
 *
 * @param {String} learnerBaseURL  - the base url for the learner
 * @param {String} trackingBackend - the tracking backend to use
 */
MarkersAreaUtils.navigateToLearnerPage = function (
  learnerBaseURL,
  trackingBackend
) {
  var learnerParameters = {
    backURL: location.href,
    trackingBackend: trackingBackend,
    markersControlsParameters:
      MarkersAreaUtils.createDefaultMarkersControlsParameters(trackingBackend),
  };
  location.href =
    learnerBaseURL +
    "?" +
    encodeURIComponent(JSON.stringify(learnerParameters));
};

//////////////////////////////////////////////////////////////////////////////
//		DefaultMultiMarkerFile
//////////////////////////////////////////////////////////////////////////////

/**
 * Create and store a default multi-marker file
 *
 * @param {String} trackingBackend - the tracking backend to use
 */
MarkersAreaUtils.storeDefaultMultiMarkerFile = function (trackingBackend) {
  var file = MarkersAreaUtils.createDefaultMultiMarkerFile(trackingBackend);
  // json.strinfy the value and store it in localStorage
  localStorage.setItem("ARjsMultiMarkerFile", JSON.stringify(file));
};

/**
 * Create a default multi-marker file
 * @param {String} trackingBackend - the tracking backend to use
 * @return {Object} - json object of the multi-marker file
 */
MarkersAreaUtils.createDefaultMultiMarkerFile = function (trackingBackend) {
  console.assert(trackingBackend);
  if (trackingBackend === undefined) debugger;

  // create absoluteBaseURL
  var link = document.createElement("a");
  link.href = Context.baseURL;
  var absoluteBaseURL = link.href;

  // create the base file
  var file = {
    meta: {
      createdBy: "AR.js " + Context.REVISION + " - Default Marker",
      createdAt: new Date().toJSON(),
    },
    trackingBackend: trackingBackend,
    subMarkersControls: [
      // empty for now... being filled
    ],
  };
  // add a subMarkersControls
  file.subMarkersControls[0] = {
    parameters: {},
    poseMatrix: new THREE.Matrix4().makeTranslation(0, 0, 0).toArray(),
  };
  if (trackingBackend === "artoolkit") {
    file.subMarkersControls[0].parameters.type = "pattern";
    file.subMarkersControls[0].parameters.patternUrl =
      absoluteBaseURL +
      "examples/marker-training/examples/pattern-files/pattern-hiro.patt";
  } else console.assert(false);

  // json.strinfy the value and store it in localStorage
  return file;
};

//////////////////////////////////////////////////////////////////////////////
//		createDefaultMarkersControlsParameters
//////////////////////////////////////////////////////////////////////////////

/**
 * Create a default controls parameters for the multi-marker learner
 *
 * @param {String} trackingBackend - the tracking backend to use
 * @return {Object} - json object containing the controls parameters
 */
MarkersAreaUtils.createDefaultMarkersControlsParameters = function (
  trackingBackend
) {
  // create absoluteBaseURL
  var link = document.createElement("a");
  link.href = Context.baseURL;
  var absoluteBaseURL = link.href;

  if (trackingBackend === "artoolkit") {
    // pattern hiro/kanji/a/b/c/f
    var markersControlsParameters = [
      {
        type: "pattern",
        patternUrl:
          absoluteBaseURL +
          "examples/marker-training/examples/pattern-files/pattern-hiro.patt",
      },
      {
        type: "pattern",
        patternUrl:
          absoluteBaseURL +
          "examples/marker-training/examples/pattern-files/pattern-kanji.patt",
      },
      {
        type: "pattern",
        patternUrl:
          absoluteBaseURL +
          "examples/marker-training/examples/pattern-files/pattern-letterA.patt",
      },
      {
        type: "pattern",
        patternUrl:
          absoluteBaseURL +
          "examples/marker-training/examples/pattern-files/pattern-letterB.patt",
      },
      {
        type: "pattern",
        patternUrl:
          absoluteBaseURL +
          "examples/marker-training/examples/pattern-files/pattern-letterC.patt",
      },
      {
        type: "pattern",
        patternUrl:
          absoluteBaseURL +
          "examples/marker-training/examples/pattern-files/pattern-letterF.patt",
      },
    ];
  } else console.assert(false);
  return markersControlsParameters;
};

//////////////////////////////////////////////////////////////////////////////
//		Code Separator
//////////////////////////////////////////////////////////////////////////////
/**
 * generate areaFile
 */
MarkersAreaUtils.storeMarkersAreaFileFromResolution = function (
  trackingBackend,
  resolutionW,
  resolutionH
) {
  // generate areaFile
  var areaFile = this.buildMarkersAreaFileFromResolution(
    trackingBackend,
    resolutionW,
    resolutionH
  );
  // store areaFile in localStorage
  localStorage.setItem("ARjsMultiMarkerFile", JSON.stringify(areaFile));
};

//////////////////////////////////////////////////////////////////////////////
//		Code Separator
//////////////////////////////////////////////////////////////////////////////

MarkersAreaUtils.buildMarkersAreaFileFromResolution = function (
  trackingBackend,
  resolutionW,
  resolutionH
) {
  // create the base file
  var file = {
    meta: {
      createdBy: "AR.js - Augmented Website",
      createdAt: new Date().toJSON(),
    },
    trackingBackend: trackingBackend,
    subMarkersControls: [
      // empty for now...
    ],
  };

  var whiteMargin = 0.1;
  if (resolutionW > resolutionH) {
    var markerImageSize = 0.4 * resolutionH;
  } else if (resolutionW < resolutionH) {
    var markerImageSize = 0.4 * resolutionW;
  } else if (resolutionW === resolutionH) {
    // specific for twitter player - https://dev.twitter.com/cards/types/player
    var markerImageSize = 0.33 * resolutionW;
  } else console.assert(false);

  // console.warn('using new markerImageSize computation')
  var actualMarkerSize = markerImageSize * (1 - 2 * whiteMargin);

  var deltaX = (resolutionW - markerImageSize) / 2 / actualMarkerSize;
  var deltaZ = (resolutionH - markerImageSize) / 2 / actualMarkerSize;

  var subMarkerControls = buildSubMarkerControls("center", 0, 0);
  file.subMarkersControls.push(subMarkerControls);

  var subMarkerControls = buildSubMarkerControls("topleft", -deltaX, -deltaZ);
  file.subMarkersControls.push(subMarkerControls);

  var subMarkerControls = buildSubMarkerControls("topright", +deltaX, -deltaZ);
  file.subMarkersControls.push(subMarkerControls);

  var subMarkerControls = buildSubMarkerControls(
    "bottomleft",
    -deltaX,
    +deltaZ
  );
  file.subMarkersControls.push(subMarkerControls);

  var subMarkerControls = buildSubMarkerControls(
    "bottomright",
    +deltaX,
    +deltaZ
  );
  file.subMarkersControls.push(subMarkerControls);

  return file;

  //////////////////////////////////////////////////////////////////////////////
  //		Code Separator
  //////////////////////////////////////////////////////////////////////////////

  function buildSubMarkerControls(layout, positionX, positionZ) {
    console.log("buildSubMarkerControls", layout, positionX, positionZ);
    // create subMarkersControls
    var subMarkersControls = {
      parameters: {},
      poseMatrix: new THREE.Matrix4()
        .makeTranslation(positionX, 0, positionZ)
        .toArray(),
    };
    // fill the parameters
    if (trackingBackend === "artoolkit") {
      layout2MarkerParametersArtoolkit(subMarkersControls.parameters, layout);
    } else console.assert(false);
    // return subMarkersControls
    return subMarkersControls;
  }

  function layout2MarkerParametersArtoolkit(parameters, layout) {
    // create absoluteBaseURL
    var link = document.createElement("a");
    link.href = Context.baseURL;
    var absoluteBaseURL = link.href;

    var layout2PatternUrl = {
      center: convertRelativeUrlToAbsolute(
        absoluteBaseURL +
          "examples/marker-training/examples/pattern-files/pattern-hiro.patt"
      ),
      topleft: convertRelativeUrlToAbsolute(
        absoluteBaseURL +
          "examples/marker-training/examples/pattern-files/pattern-letterA.patt"
      ),
      topright: convertRelativeUrlToAbsolute(
        absoluteBaseURL +
          "examples/marker-training/examples/pattern-files/pattern-letterB.patt"
      ),
      bottomleft: convertRelativeUrlToAbsolute(
        absoluteBaseURL +
          "examples/marker-training/examples/pattern-files/pattern-letterC.patt"
      ),
      bottomright: convertRelativeUrlToAbsolute(
        absoluteBaseURL +
          "examples/marker-training/examples/pattern-files/pattern-letterF.patt"
      ),
    };
    console.assert(layout2PatternUrl[layout] !== undefined);
    parameters.type = "pattern";
    parameters.patternUrl = layout2PatternUrl[layout];
    return;
    function convertRelativeUrlToAbsolute(relativeUrl) {
      var tmpLink = document.createElement("a");
      tmpLink.href = relativeUrl;
      return tmpLink.href;
    }
  }
};

export default MarkersAreaUtils;