#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" } }