/* Copyright 2003-2005 ROBLOX Corporation, All Rights Reserved */ #include "stdafx.h" #include "V8World/MaterialProperties.h" #include "V8World/World.h" #include "V8World/Primitive.h" #include "v8kernel/ContactParams.h" #include "v8kernel/Constants.h" #include "util/PhysicalProperties.h" FASTFLAGVARIABLE(ModifyDefaultMaterialProperties, false) // Thousandths FASTINTVARIABLE(PhysicalPropDensity_PLASTIC_MATERIAL, 700) FASTINTVARIABLE(PhysicalPropDensity_SMOOTH_PLASTIC_MATERIAL, 700) FASTINTVARIABLE(PhysicalPropDensity_NEON_MATERIAL, 700) FASTINTVARIABLE(PhysicalPropDensity_WOOD_MATERIAL, 350) FASTINTVARIABLE(PhysicalPropDensity_WOODPLANKS_MATERIAL, 350) FASTINTVARIABLE(PhysicalPropDensity_MARBLE_MATERIAL, 2563) FASTINTVARIABLE(PhysicalPropDensity_SLATE_MATERIAL, 2691) FASTINTVARIABLE(PhysicalPropDensity_CONCRETE_MATERIAL, 2403) FASTINTVARIABLE(PhysicalPropDensity_GRANITE_MATERIAL, 2691) FASTINTVARIABLE(PhysicalPropDensity_BRICK_MATERIAL, 1922) FASTINTVARIABLE(PhysicalPropDensity_PEBBLE_MATERIAL, 2403) FASTINTVARIABLE(PhysicalPropDensity_COBBLESTONE_MATERIAL, 2691) FASTINTVARIABLE(PhysicalPropDensity_RUST_MATERIAL, 7850) FASTINTVARIABLE(PhysicalPropDensity_DIAMONDPLATE_MATERIAL, 7850) FASTINTVARIABLE(PhysicalPropDensity_ALUMINUM_MATERIAL, 7700) FASTINTVARIABLE(PhysicalPropDensity_METAL_MATERIAL, 7850) FASTINTVARIABLE(PhysicalPropDensity_GRASS_MATERIAL, 900) FASTINTVARIABLE(PhysicalPropDensity_SAND_MATERIAL, 1602) FASTINTVARIABLE(PhysicalPropDensity_FABRIC_MATERIAL, 700) FASTINTVARIABLE(PhysicalPropDensity_ICE_MATERIAL, 919) FASTINTVARIABLE(PhysicalPropDensity_AIR_MATERIAL, 0) FASTINTVARIABLE(PhysicalPropDensity_WATER_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropDensity_ROCK_MATERIAL, 2691) FASTINTVARIABLE(PhysicalPropDensity_GLACIER_MATERIAL, 919) FASTINTVARIABLE(PhysicalPropDensity_SNOW_MATERIAL, 900) FASTINTVARIABLE(PhysicalPropDensity_SANDSTONE_MATERIAL, 2691) FASTINTVARIABLE(PhysicalPropDensity_MUD_MATERIAL, 900) FASTINTVARIABLE(PhysicalPropDensity_BASALT_MATERIAL, 2691) FASTINTVARIABLE(PhysicalPropDensity_GROUND_MATERIAL, 900) FASTINTVARIABLE(PhysicalPropDensity_CRACKED_LAVA_MATERIAL, 2691) FASTINTVARIABLE(PhysicalPropFriction_PLASTIC_MATERIAL, 300) FASTINTVARIABLE(PhysicalPropFriction_SMOOTH_PLASTIC_MATERIAL, 200) FASTINTVARIABLE(PhysicalPropFriction_NEON_MATERIAL, 300) FASTINTVARIABLE(PhysicalPropFriction_WOOD_MATERIAL, 480) FASTINTVARIABLE(PhysicalPropFriction_WOODPLANKS_MATERIAL, 480) FASTINTVARIABLE(PhysicalPropFriction_MARBLE_MATERIAL, 200) FASTINTVARIABLE(PhysicalPropFriction_SLATE_MATERIAL, 400) FASTINTVARIABLE(PhysicalPropFriction_CONCRETE_MATERIAL, 700) FASTINTVARIABLE(PhysicalPropFriction_GRANITE_MATERIAL, 400) FASTINTVARIABLE(PhysicalPropFriction_BRICK_MATERIAL, 800) FASTINTVARIABLE(PhysicalPropFriction_PEBBLE_MATERIAL, 400) FASTINTVARIABLE(PhysicalPropFriction_COBBLESTONE_MATERIAL, 500) FASTINTVARIABLE(PhysicalPropFriction_RUST_MATERIAL, 700) FASTINTVARIABLE(PhysicalPropFriction_DIAMONDPLATE_MATERIAL, 350) FASTINTVARIABLE(PhysicalPropFriction_ALUMINUM_MATERIAL, 400) FASTINTVARIABLE(PhysicalPropFriction_METAL_MATERIAL, 400) FASTINTVARIABLE(PhysicalPropFriction_GRASS_MATERIAL, 400) FASTINTVARIABLE(PhysicalPropFriction_SAND_MATERIAL, 500) FASTINTVARIABLE(PhysicalPropFriction_FABRIC_MATERIAL, 350) FASTINTVARIABLE(PhysicalPropFriction_ICE_MATERIAL, 20) FASTINTVARIABLE(PhysicalPropFriction_AIR_MATERIAL, 10) FASTINTVARIABLE(PhysicalPropFriction_WATER_MATERIAL, 5) FASTINTVARIABLE(PhysicalPropFriction_ROCK_MATERIAL, 500) FASTINTVARIABLE(PhysicalPropFriction_GLACIER_MATERIAL, 50) FASTINTVARIABLE(PhysicalPropFriction_SNOW_MATERIAL, 300) FASTINTVARIABLE(PhysicalPropFriction_SANDSTONE_MATERIAL, 500) FASTINTVARIABLE(PhysicalPropFriction_MUD_MATERIAL, 300) FASTINTVARIABLE(PhysicalPropFriction_BASALT_MATERIAL, 700) FASTINTVARIABLE(PhysicalPropFriction_GROUND_MATERIAL, 450) FASTINTVARIABLE(PhysicalPropFriction_CRACKED_LAVA_MATERIAL, 650) FASTINTVARIABLE(PhysicalPropElasticity_PLASTIC_MATERIAL, 500) FASTINTVARIABLE(PhysicalPropElasticity_SMOOTH_PLASTIC_MATERIAL, 500) FASTINTVARIABLE(PhysicalPropElasticity_NEON_MATERIAL, 200) FASTINTVARIABLE(PhysicalPropElasticity_WOOD_MATERIAL, 200) FASTINTVARIABLE(PhysicalPropElasticity_WOODPLANKS_MATERIAL, 200) FASTINTVARIABLE(PhysicalPropElasticity_MARBLE_MATERIAL, 170) FASTINTVARIABLE(PhysicalPropElasticity_SLATE_MATERIAL, 200) FASTINTVARIABLE(PhysicalPropElasticity_CONCRETE_MATERIAL, 200) FASTINTVARIABLE(PhysicalPropElasticity_GRANITE_MATERIAL, 200) FASTINTVARIABLE(PhysicalPropElasticity_BRICK_MATERIAL, 150) FASTINTVARIABLE(PhysicalPropElasticity_PEBBLE_MATERIAL, 170) FASTINTVARIABLE(PhysicalPropElasticity_COBBLESTONE_MATERIAL, 170) FASTINTVARIABLE(PhysicalPropElasticity_RUST_MATERIAL, 200) FASTINTVARIABLE(PhysicalPropElasticity_DIAMONDPLATE_MATERIAL, 250) FASTINTVARIABLE(PhysicalPropElasticity_ALUMINUM_MATERIAL, 250) FASTINTVARIABLE(PhysicalPropElasticity_METAL_MATERIAL, 250) FASTINTVARIABLE(PhysicalPropElasticity_GRASS_MATERIAL, 100) FASTINTVARIABLE(PhysicalPropElasticity_SAND_MATERIAL, 50) FASTINTVARIABLE(PhysicalPropElasticity_FABRIC_MATERIAL, 50) FASTINTVARIABLE(PhysicalPropElasticity_ICE_MATERIAL, 150) FASTINTVARIABLE(PhysicalPropElasticity_AIR_MATERIAL, 10) FASTINTVARIABLE(PhysicalPropElasticity_WATER_MATERIAL, 10) FASTINTVARIABLE(PhysicalPropElasticity_ROCK_MATERIAL, 170) FASTINTVARIABLE(PhysicalPropElasticity_GLACIER_MATERIAL, 150) FASTINTVARIABLE(PhysicalPropElasticity_SNOW_MATERIAL, 30) FASTINTVARIABLE(PhysicalPropElasticity_SANDSTONE_MATERIAL, 150) FASTINTVARIABLE(PhysicalPropElasticity_MUD_MATERIAL, 70) FASTINTVARIABLE(PhysicalPropElasticity_BASALT_MATERIAL, 150) FASTINTVARIABLE(PhysicalPropElasticity_GROUND_MATERIAL, 100) FASTINTVARIABLE(PhysicalPropElasticity_CRACKED_LAVA_MATERIAL, 150) FASTINTVARIABLE(PhysicalPropFWeight_PLASTIC_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_SMOOTH_PLASTIC_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_NEON_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_WOOD_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_WOODPLANKS_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_MARBLE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_SLATE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_CONCRETE_MATERIAL, 300) FASTINTVARIABLE(PhysicalPropFWeight_GRANITE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_BRICK_MATERIAL, 300) FASTINTVARIABLE(PhysicalPropFWeight_PEBBLE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_COBBLESTONE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_RUST_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_DIAMONDPLATE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_ALUMINUM_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_METAL_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_GRASS_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_SAND_MATERIAL, 5000) FASTINTVARIABLE(PhysicalPropFWeight_FABRIC_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_ICE_MATERIAL, 3000) FASTINTVARIABLE(PhysicalPropFWeight_AIR_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_WATER_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_ROCK_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_GLACIER_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_SNOW_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_SANDSTONE_MATERIAL, 5000) FASTINTVARIABLE(PhysicalPropFWeight_MUD_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_BASALT_MATERIAL, 300) FASTINTVARIABLE(PhysicalPropFWeight_GROUND_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropFWeight_CRACKED_LAVA_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_PLASTIC_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_SMOOTH_PLASTIC_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_NEON_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_WOOD_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_WOODPLANKS_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_MARBLE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_SLATE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_CONCRETE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_GRANITE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_BRICK_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_PEBBLE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_COBBLESTONE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_RUST_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_DIAMONDPLATE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_ALUMINUM_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_METAL_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_GRASS_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_SAND_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_FABRIC_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_ICE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_AIR_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_WATER_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_ROCK_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_GLACIER_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_SNOW_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_SANDSTONE_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_MUD_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_BASALT_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_GROUND_MATERIAL, 1000) FASTINTVARIABLE(PhysicalPropEWeight_CRACKED_LAVA_MATERIAL, 1000) using namespace RBX; static float getPropertyValueFromFlag(const int& flagVal) { return (float)flagVal / 1000.0; } PhysicalProperties MaterialProperties::generatePhysicalMaterialFromPartMaterial(PartMaterial material) { return PhysicalProperties( getDefaultMaterialDensity(material), getDefaultMaterialFriction(material), getDefaultMaterialElasticity(material), getDefaultMaterialFrictionWeight(material), getDefaultMaterialElasticityWeight(material)); } PhysicalProperties MaterialProperties::getPrimitivePhysicalProperties(Primitive* prim) { if (prim->getPhysicalProperties().getCustomEnabled()) { return prim->getPhysicalProperties(); } else { return generatePhysicalMaterialFromPartMaterial(prim->getPartMaterial()); } } float MaterialProperties::frictionBetweenPrimAndMaterial(Primitive* primA, PartMaterial materialB) { PhysicalProperties aProp = primA->getPhysicalProperties(); PhysicalProperties bProp = MaterialProperties::generatePhysicalMaterialFromPartMaterial(materialB); return calculateUsingWeightedAverage(aProp.getFrictionWeight(), aProp.getFriction(), bProp.getFrictionWeight(), bProp.getFriction()); } float MaterialProperties::frictionBetweenMaterials(PartMaterial materialA, PartMaterial materialB) { PhysicalProperties aProp = MaterialProperties::generatePhysicalMaterialFromPartMaterial(materialA); PhysicalProperties bProp = MaterialProperties::generatePhysicalMaterialFromPartMaterial(materialB); return calculateUsingWeightedAverage(aProp.getFrictionWeight(), aProp.getFriction(), bProp.getFrictionWeight(), bProp.getFriction()); } void MaterialProperties::updateContactParamsPrims(ContactParams& params, Primitive* prim0, Primitive* prim1) { const PhysicalProperties& prop0 = getPrimitivePhysicalProperties(prim0); const PhysicalProperties& prop1 = getPrimitivePhysicalProperties(prim1); params.kFriction = calculateUsingWeightedAverage(prop0.getFrictionWeight(), prop0.getFriction(), prop1.getFrictionWeight(), prop1.getFriction()); params.kElasticity = calculateUsingWeightedAverage(prop0.getElasticityWeight(),prop0.getElasticity(), prop1.getElasticityWeight(),prop1.getElasticity()); params.kSpring = std::min( prim0->getJointK(), prim1->getJointK() ); params.kNeg = params.kSpring * Constants::getElasticMultiplier(params.kElasticity); } void MaterialProperties::updateContactParamsPrimMaterial(ContactParams& params, Primitive* prim, Primitive* otherPrim, PartMaterial otherMaterial) { const PhysicalProperties& propPrim = getPrimitivePhysicalProperties(prim); const PhysicalProperties& propMaterial = generatePhysicalMaterialFromPartMaterial(otherMaterial); params.kFriction = calculateUsingWeightedAverage(propPrim.getFrictionWeight(), propPrim.getFriction(), propMaterial.getFrictionWeight(), propMaterial.getFriction()); params.kElasticity = calculateUsingWeightedAverage(propPrim.getElasticityWeight(), propPrim.getElasticity(), propMaterial.getElasticityWeight(), propMaterial.getElasticity()); params.kSpring = std::min( prim->getJointK(), otherPrim->getJointK() ); params.kNeg = params.kSpring * Constants::getElasticMultiplier(params.kElasticity); } float MaterialProperties::getDensity(Primitive* prim) { if (prim->getPhysicalProperties().getCustomEnabled()) { return prim->getPhysicalProperties().getDensity(); } else { PartMaterial mat = prim->getPartMaterial(); return getDefaultMaterialDensity(mat); } } float MaterialProperties::calculateUsingWeightedAverage(float weightX, float X, float weightY, float Y) { // Divide by 0 guard float denominator = weightX + weightY; if (denominator <= 0.0f) { denominator = 0.1f; } // Simply get the weighted Average return (weightX * X + weightY * Y)/(weightX + weightY); } float MaterialProperties::getDefaultMaterialFriction(PartMaterial material) { if (FFlag::ModifyDefaultMaterialProperties) { switch (material) { case LEGACY_MATERIAL: case PLASTIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_PLASTIC_MATERIAL); //NYLON case SMOOTH_PLASTIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_SMOOTH_PLASTIC_MATERIAL); //TEFLON case NEON_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_NEON_MATERIAL); case WOOD_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_WOOD_MATERIAL); //WOOD case WOODPLANKS_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_WOODPLANKS_MATERIAL); //WOOD case MARBLE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_MARBLE_MATERIAL); case SLATE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_SLATE_MATERIAL); case CONCRETE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_CONCRETE_MATERIAL); //CONCRETE SEE 11.7.4.3 of https://law.resource.org/pub/us/cfr/ibr/001/aci.318.1995.pdf case GRANITE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_GRANITE_MATERIAL); case BRICK_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_BRICK_MATERIAL); case PEBBLE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_PEBBLE_MATERIAL); case COBBLESTONE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_COBBLESTONE_MATERIAL); case RUST_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_RUST_MATERIAL); //IRON case DIAMONDPLATE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_DIAMONDPLATE_MATERIAL); //GUESS: based on Aluminum and Steel experimental data. case ALUMINUM_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_ALUMINUM_MATERIAL); //GUESS: Manually tested small bricks of Aluminum case METAL_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_METAL_MATERIAL); //STEEL case GRASS_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_GRASS_MATERIAL); case SAND_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_SAND_MATERIAL); case FABRIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_FABRIC_MATERIAL); case ICE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_ICE_MATERIAL); //ICE case AIR_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_AIR_MATERIAL); case WATER_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_WATER_MATERIAL); case ROCK_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_ROCK_MATERIAL); case GLACIER_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_GLACIER_MATERIAL); case SNOW_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_SNOW_MATERIAL); case SANDSTONE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_SANDSTONE_MATERIAL); case MUD_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_MUD_MATERIAL); case BASALT_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_BASALT_MATERIAL); case GROUND_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_GROUND_MATERIAL); case CRACKED_LAVA_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFriction_CRACKED_LAVA_MATERIAL); default:; } } else { // All uncommented values are guesses // http://www.engineeringtoolbox.com/friction-coefficients-d_778.html // Other results were adjusted from rought Testing results: // Ice, Acrylic (Plastic), Steel, Diamond Plate, Aluminum, Wood, Brick // See: https://docs.google.com/spreadsheets/d/1dwJYlGHSCAb0OU101bTWH-Q4eJyYSmXk85sQKBIVTuo/edit#gid=70389283 switch (material) { case LEGACY_MATERIAL: case PLASTIC_MATERIAL: return 0.30; //NYLON case SMOOTH_PLASTIC_MATERIAL: return 0.20; //TEFLON case NEON_MATERIAL: return 0.30; case WOOD_MATERIAL: return 0.48; //WOOD case WOODPLANKS_MATERIAL: return 0.48; //WOOD case MARBLE_MATERIAL: return 0.20; case SLATE_MATERIAL: return 0.40; case CONCRETE_MATERIAL: return 0.70; //CONCRETE SEE 11.7.4.3 of https://law.resource.org/pub/us/cfr/ibr/001/aci.318.1995.pdf case GRANITE_MATERIAL: return 0.40; case BRICK_MATERIAL: return 0.80; case PEBBLE_MATERIAL: return 0.40; case COBBLESTONE_MATERIAL: return 0.50; case RUST_MATERIAL: return 0.70; //IRON case DIAMONDPLATE_MATERIAL: return 0.35; //GUESS: based on Aluminum and Steel experimental data. case ALUMINUM_MATERIAL: return 0.40; //GUESS: Manually tested small bricks of Aluminum case METAL_MATERIAL: return 0.40; //STEEL case GRASS_MATERIAL: return 0.40; case SAND_MATERIAL: return 0.50; case FABRIC_MATERIAL: return 0.35; case ICE_MATERIAL: return 0.02; //ICE case AIR_MATERIAL: return 0.01; case WATER_MATERIAL: return 0.005; case ROCK_MATERIAL: return 0.50; case GLACIER_MATERIAL: return 0.05; case SNOW_MATERIAL: return 0.30; case SANDSTONE_MATERIAL: return 0.50; case MUD_MATERIAL: return 0.30; case BASALT_MATERIAL: return 0.70; case GROUND_MATERIAL: return 0.45; case CRACKED_LAVA_MATERIAL: return 0.65; default:; } } RBXASSERT(false); return 1; } float MaterialProperties::getDefaultMaterialFrictionWeight(PartMaterial material) { if (FFlag::ModifyDefaultMaterialProperties) { switch (material) { case LEGACY_MATERIAL: case PLASTIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_PLASTIC_MATERIAL); //NYLON case SMOOTH_PLASTIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_SMOOTH_PLASTIC_MATERIAL); //TEFLON case NEON_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_NEON_MATERIAL); case WOOD_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_WOOD_MATERIAL); //WOOD case WOODPLANKS_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_WOODPLANKS_MATERIAL); //WOOD case MARBLE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_MARBLE_MATERIAL); case SLATE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_SLATE_MATERIAL); case CONCRETE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_CONCRETE_MATERIAL); //CONCRETE SEE 11.7.4.3 of https://law.resource.org/pub/us/cfr/ibr/001/aci.318.1995.pdf case GRANITE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_GRANITE_MATERIAL); case BRICK_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_BRICK_MATERIAL); case PEBBLE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_PEBBLE_MATERIAL); case COBBLESTONE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_COBBLESTONE_MATERIAL); case RUST_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_RUST_MATERIAL); //IRON case DIAMONDPLATE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_DIAMONDPLATE_MATERIAL); //GUESS: based on Aluminum and Steel experimental data. case ALUMINUM_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_ALUMINUM_MATERIAL); //GUESS: Manually tested small bricks of Aluminum case METAL_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_METAL_MATERIAL); //STEEL case GRASS_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_GRASS_MATERIAL); case SAND_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_SAND_MATERIAL); case FABRIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_FABRIC_MATERIAL); case ICE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_ICE_MATERIAL); //ICE case AIR_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_AIR_MATERIAL); case WATER_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_WATER_MATERIAL); case ROCK_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_ROCK_MATERIAL); case GLACIER_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_GLACIER_MATERIAL); case SNOW_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_SNOW_MATERIAL); case SANDSTONE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_SANDSTONE_MATERIAL); case MUD_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_MUD_MATERIAL); case BASALT_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_BASALT_MATERIAL); case GROUND_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_GROUND_MATERIAL); case CRACKED_LAVA_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropFWeight_CRACKED_LAVA_MATERIAL); default:; } } else { switch (material) { // Add materials that need override here. // If no override present for material, it's 1.0f. // This is to prevent the painful life of anyone adding more materials // as they already have to deal with Density, Elasticity, Friction // example /* case ICE_MATERIAL: return 10; */ case ICE_MATERIAL: return 3; case BRICK_MATERIAL: return 0.3; case CONCRETE_MATERIAL: return 0.3; case SANDSTONE_MATERIAL: return 5; case BASALT_MATERIAL: return 0.3; case SAND_MATERIAL: return 5; default:; } } return 1; } float MaterialProperties::getDefaultMaterialElasticity(PartMaterial material) { if (FFlag::ModifyDefaultMaterialProperties) { switch(material) { case LEGACY_MATERIAL: case PLASTIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_PLASTIC_MATERIAL); //NYLON case SMOOTH_PLASTIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_SMOOTH_PLASTIC_MATERIAL); //TEFLON case NEON_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_NEON_MATERIAL); case WOOD_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_WOOD_MATERIAL); //WOOD case WOODPLANKS_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_WOODPLANKS_MATERIAL); //WOOD case MARBLE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_MARBLE_MATERIAL); case SLATE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_SLATE_MATERIAL); case CONCRETE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_CONCRETE_MATERIAL); //CONCRETE SEE 11.7.4.3 of https://law.resource.org/pub/us/cfr/ibr/001/aci.318.1995.pdf case GRANITE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_GRANITE_MATERIAL); case BRICK_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_BRICK_MATERIAL); case PEBBLE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_PEBBLE_MATERIAL); case COBBLESTONE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_COBBLESTONE_MATERIAL); case RUST_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_RUST_MATERIAL); //IRON case DIAMONDPLATE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_DIAMONDPLATE_MATERIAL); //GUESS: based on Aluminum and Steel experimental data. case ALUMINUM_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_ALUMINUM_MATERIAL); //GUESS: Manually tested small bricks of Aluminum case METAL_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_METAL_MATERIAL); //STEEL case GRASS_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_GRASS_MATERIAL); case SAND_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_SAND_MATERIAL); case FABRIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_FABRIC_MATERIAL); case ICE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_ICE_MATERIAL); //ICE case AIR_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_AIR_MATERIAL); case WATER_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_WATER_MATERIAL); case ROCK_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_ROCK_MATERIAL); case GLACIER_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_GLACIER_MATERIAL); case SNOW_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_SNOW_MATERIAL); case SANDSTONE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_SANDSTONE_MATERIAL); case MUD_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_MUD_MATERIAL); case BASALT_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_BASALT_MATERIAL); case GROUND_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_GROUND_MATERIAL); case CRACKED_LAVA_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropElasticity_CRACKED_LAVA_MATERIAL); default:; } } else { // Estimates based on limited Subset testing: // Brick, Aluminum, Wood, Acrylic (Plastic) were tested // See: https://docs.google.com/spreadsheets/d/1dwJYlGHSCAb0OU101bTWH-Q4eJyYSmXk85sQKBIVTuo/edit#gid=1422912501 switch (material) { case LEGACY_MATERIAL: case PLASTIC_MATERIAL: return 0.50; case SMOOTH_PLASTIC_MATERIAL: return 0.50; case NEON_MATERIAL: return 0.20; case WOOD_MATERIAL: return 0.20; case WOODPLANKS_MATERIAL: return 0.20; case MARBLE_MATERIAL: return 0.17; case SLATE_MATERIAL: return 0.20; case CONCRETE_MATERIAL: return 0.20; case GRANITE_MATERIAL: return 0.20; case BRICK_MATERIAL: return 0.15; case PEBBLE_MATERIAL: return 0.17; case COBBLESTONE_MATERIAL: return 0.17; case RUST_MATERIAL: return 0.20; case DIAMONDPLATE_MATERIAL: return 0.25; case ALUMINUM_MATERIAL: return 0.25; case METAL_MATERIAL: return 0.25; case GRASS_MATERIAL: return 0.10; case SAND_MATERIAL: return 0.05; case FABRIC_MATERIAL: return 0.05; case ICE_MATERIAL: return 0.15; case AIR_MATERIAL: return 0.01; case WATER_MATERIAL: return 0.10; case ROCK_MATERIAL: return 0.17; case GLACIER_MATERIAL: return 0.15; case SNOW_MATERIAL: return 0.03; case SANDSTONE_MATERIAL: return 0.15; case MUD_MATERIAL: return 0.07; case BASALT_MATERIAL: return 0.15; case GROUND_MATERIAL: return 0.10; case CRACKED_LAVA_MATERIAL: return 0.15; default:; } } RBXASSERT(false); return 0.50; } float MaterialProperties::getDefaultMaterialElasticityWeight(PartMaterial material) { if (FFlag::ModifyDefaultMaterialProperties) { switch (material) { case LEGACY_MATERIAL: case PLASTIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_PLASTIC_MATERIAL); //NYLON case SMOOTH_PLASTIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_SMOOTH_PLASTIC_MATERIAL); //TEFLON case NEON_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_NEON_MATERIAL); case WOOD_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_WOOD_MATERIAL); //WOOD case WOODPLANKS_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_WOODPLANKS_MATERIAL); //WOOD case MARBLE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_MARBLE_MATERIAL); case SLATE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_SLATE_MATERIAL); case CONCRETE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_CONCRETE_MATERIAL); //CONCRETE SEE 11.7.4.3 of https://law.resource.org/pub/us/cfr/ibr/001/aci.318.1995.pdf case GRANITE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_GRANITE_MATERIAL); case BRICK_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_BRICK_MATERIAL); case PEBBLE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_PEBBLE_MATERIAL); case COBBLESTONE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_COBBLESTONE_MATERIAL); case RUST_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_RUST_MATERIAL); //IRON case DIAMONDPLATE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_DIAMONDPLATE_MATERIAL); //GUESS: based on Aluminum and Steel experimental data. case ALUMINUM_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_ALUMINUM_MATERIAL); //GUESS: Manually tested small bricks of Aluminum case METAL_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_METAL_MATERIAL); //STEEL case GRASS_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_GRASS_MATERIAL); case SAND_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_SAND_MATERIAL); case FABRIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_FABRIC_MATERIAL); case ICE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_ICE_MATERIAL); //ICE case AIR_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_AIR_MATERIAL); case WATER_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_WATER_MATERIAL); case ROCK_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_ROCK_MATERIAL); case GLACIER_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_GLACIER_MATERIAL); case SNOW_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_SNOW_MATERIAL); case SANDSTONE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_SANDSTONE_MATERIAL); case MUD_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_MUD_MATERIAL); case BASALT_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_BASALT_MATERIAL); case GROUND_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_GROUND_MATERIAL); case CRACKED_LAVA_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropEWeight_CRACKED_LAVA_MATERIAL); default:; } } else { switch (material) { // Add materials that need override here. // If no override present for material, it's 1.0f. // This is to prevent the painful life of anyone adding more materials // as they already have to deal with Density, Elasticity, Friction // example /* case ICE_MATERIAL: return 10; */ case ICE_MATERIAL: return 1; default:; } } return 1; } float MaterialProperties::getDefaultMaterialDensity(PartMaterial material) { if (FFlag::ModifyDefaultMaterialProperties) { switch (material) { case LEGACY_MATERIAL: case PLASTIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_PLASTIC_MATERIAL); //NYLON case SMOOTH_PLASTIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_SMOOTH_PLASTIC_MATERIAL); //TEFLON case NEON_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_NEON_MATERIAL); case WOOD_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_WOOD_MATERIAL); //WOOD case WOODPLANKS_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_WOODPLANKS_MATERIAL); //WOOD case MARBLE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_MARBLE_MATERIAL); case SLATE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_SLATE_MATERIAL); case CONCRETE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_CONCRETE_MATERIAL); //CONCRETE SEE 11.7.4.3 of https://law.resource.org/pub/us/cfr/ibr/001/aci.318.1995.pdf case GRANITE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_GRANITE_MATERIAL); case BRICK_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_BRICK_MATERIAL); case PEBBLE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_PEBBLE_MATERIAL); case COBBLESTONE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_COBBLESTONE_MATERIAL); case RUST_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_RUST_MATERIAL); //IRON case DIAMONDPLATE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_DIAMONDPLATE_MATERIAL); //GUESS: based on Aluminum and Steel experimental data. case ALUMINUM_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_ALUMINUM_MATERIAL); //GUESS: Manually tested small bricks of Aluminum case METAL_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_METAL_MATERIAL); //STEEL case GRASS_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_GRASS_MATERIAL); case SAND_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_SAND_MATERIAL); case FABRIC_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_FABRIC_MATERIAL); case ICE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_ICE_MATERIAL); //ICE case AIR_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_AIR_MATERIAL); case WATER_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_WATER_MATERIAL); case ROCK_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_ROCK_MATERIAL); case GLACIER_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_GLACIER_MATERIAL); case SNOW_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_SNOW_MATERIAL); case SANDSTONE_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_SANDSTONE_MATERIAL); case MUD_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_MUD_MATERIAL); case BASALT_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_BASALT_MATERIAL); case GROUND_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_GROUND_MATERIAL); case CRACKED_LAVA_MATERIAL: return getPropertyValueFromFlag(FInt::PhysicalPropDensity_CRACKED_LAVA_MATERIAL); default:; } } else { // http://www.simetric.co.uk/si_materials.htm switch (material) { case LEGACY_MATERIAL: case PLASTIC_MATERIAL: case SMOOTH_PLASTIC_MATERIAL: case NEON_MATERIAL: return 0.7; case WOOD_MATERIAL: return 0.350; // Pine case WOODPLANKS_MATERIAL: return 0.350; case MARBLE_MATERIAL: return 2.563; case SLATE_MATERIAL: return 2.691; case CONCRETE_MATERIAL: return 2.403; case GRANITE_MATERIAL: return 2.691; case BRICK_MATERIAL: return 1.922; case PEBBLE_MATERIAL: return 2.403; case COBBLESTONE_MATERIAL: return 2.691; case RUST_MATERIAL: return 7.850; case DIAMONDPLATE_MATERIAL: return 7.850; case ALUMINUM_MATERIAL: return 7.700; case METAL_MATERIAL: return 7.850; case GRASS_MATERIAL: return 0.9; case SAND_MATERIAL: return 1.602; case FABRIC_MATERIAL: return 0.7; case ICE_MATERIAL: return 0.919; case AIR_MATERIAL: return 0; case WATER_MATERIAL: return 1; case ROCK_MATERIAL: return 2.691; case GLACIER_MATERIAL: return 0.919; case SNOW_MATERIAL: return 0.9; case SANDSTONE_MATERIAL: return 2.691; case MUD_MATERIAL: return 0.9; case BASALT_MATERIAL: return 2.691; case GROUND_MATERIAL: return 0.9; case CRACKED_LAVA_MATERIAL: return 2.691; default:; } } RBXASSERT(false); return 1; }