#VRML_SIM R2022b utf8
# license: Copyright Cyberbotics Ltd. Licensed for use only with Webots.
# license url: https://cyberbotics.com/webots_assets_license
# Customizable table.
# template language: javascript

EXTERNPROTO "webots://projects/appearances/protos/VarnishedPine.proto"
EXTERNPROTO "webots://projects/objects/solids/protos/SolidBox.proto"

PROTO Table [
  field SFVec3f    translation    0 0 0
  field SFRotation rotation       0 0 1 0
  field SFString   name           "table"
  field SFVec3f    size           1 1.8 0.74                                                           # Defines the size of the table.
  field SFVec2f    feetSize       0.1 0.1                                                              # Defines the size of the feet.
  field SFFloat    feetPadding    0                                                                    # Defines the padding of the feet.
  field SFFloat    frameThickness 0.05                                                                 # Defines the thickness of the frame.
  field SFNode     trayAppearance VarnishedPine { textureTransform TextureTransform { scale 10 10 } }  # Defines the appearance of the tray.
  field SFNode     legAppearance  VarnishedPine { textureTransform TextureTransform { scale 4 5 } }    # Defines the appearance of the feet.
]
{
  %<
    // parameters check
    let size = fields.size.value;
    if (size.x <= 0.0 || size.y <= 0.0 || size.z <= 0.0) { // avoid a negative values
      size = fields.size.defaultValue;
      console.error('\'size\' must contain positive values.');
    }

    let feetSize = fields.feetSize.value;
    if (feetSize.x < 0.0 || feetSize.y < 0.0) { // avoid a negative values
      feetSize = fields.feetSize.defaultValue;
      console.error('\'feetSize\' must contain positive values.');
    }

    let feetPadding = fields.feetPadding.value;
    if (feetPadding < 0.0) {
      console.error('\'feetPadding\' must be positive.');
      feetPadding = fields.feetPadding.defaultValue;
    }

    let frameThickness = fields.frameThickness.value;
    if (frameThickness <= 0.0) {
      console.error('\'frameThickness\' must be positive.');
      frameThickness = fields.frameThickness.defaultValue;
    }

    const mainFrameSize = {x: size.x, y: size.y, z: frameThickness};
    const feetTextureFactor = Math.max(feetSize.y, feetSize.z);
    const feetTranslation = {x: 0.5 * size.x - feetPadding - 0.5 * feetSize.x, y: 0.5 * size.y - feetPadding - 0.5 * feetSize.y, z: 0.5 * (size.z - frameThickness)};
  >%
  Solid {
    translation IS translation
    rotation IS rotation
    children [
      # Main frame
      SolidBox {
        translation 0 0 %<= size.z - 0.5 * frameThickness >%
        name "main frame"
        size %<= mainFrameSize.x >% %<= mainFrameSize.y >% %<= mainFrameSize.z >%
        appearance IS trayAppearance
      }
      %< if (feetSize.x !== 0.0 && feetSize.y !== 0.0) { >%
        # Foot 1
        SolidBox {
          translation %<= feetTranslation.x >% %<= feetTranslation.y >% %<= feetTranslation.z >%
          name "foot 1"
          size %<= feetSize.x >% %<= feetSize.y >% %<= size.z - frameThickness >%
          appearance IS legAppearance
        }
        # Foot 2
        SolidBox {
          translation %<= -feetTranslation.x >% %<= feetTranslation.y >% %<= feetTranslation.z >%
          name "foot 2"
          size %<= feetSize.x >% %<= feetSize.y >% %<= size.z - frameThickness >%
          appearance IS legAppearance
        }
        # Foot 3
        SolidBox {
          translation %<= feetTranslation.x >% %<= -feetTranslation.y >% %<= feetTranslation.z >%
          name "foot 3"
          size %<= feetSize.x >% %<= feetSize.y >% %<= size.z - frameThickness >%
          appearance IS legAppearance
        }
        # Foot 4
        SolidBox {
          translation %<= -feetTranslation.x >% %<= -feetTranslation.y >% %<= feetTranslation.z >%
          name "foot 4"
          size %<= feetSize.x >% %<= feetSize.y >% %<= size.z - frameThickness >%
          appearance IS legAppearance
        }
      %< } >%
    ]
    name IS name
    model "table"
  }
}