classpublicabstractPriority 3
ForceProviderStandard
com.hypixel.hytale.server.core.modules.physics.util.ForceProviderStandard
implements ForceProvider
8
Methods
8
Public Methods
0
Fields
1
Constructors
Constructors
public
ForceProviderStandard()Methods
Public Methods (8)
public
void clipForce(Vector3d value, Vector3d threshold)public
double getDensity()public
ForceProviderStandardState getForceProviderStandardState()public
double getFrictionCoefficient()public
double getMass(double var1)public
double getProjectedArea(PhysicsBodyState var1, double var2)public
double getVolume()public
void update(PhysicsBodyState bodyState, ForceAccumulator accumulator, boolean onGround)@Override
Inheritance
Parent
Current
Interface
Child
Use mouse wheel to zoom, drag to pan. Click nodes to navigate.
Related Classes
Used By
Source Code
package com.hypixel.hytale.server.core.modules.physics.util;
import com.hypixel.hytale.logger.HytaleLogger;
import com.hypixel.hytale.math.vector.Vector3d;
import javax.annotation.Nonnull;
public abstract class ForceProviderStandard implements ForceProvider {
@Nonnull
public static HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
@Nonnull
protected Vector3d dragForce = new Vector3d();
public ForceProviderStandard() {
}
public abstract double getMass(double var1);
public abstract double getVolume();
public abstract double getDensity();
public abstract double getProjectedArea(PhysicsBodyState var1, double var2);
public abstract double getFrictionCoefficient();
public abstract ForceProviderStandardState getForceProviderStandardState();
@Override
public void update(@Nonnull PhysicsBodyState bodyState, @Nonnull ForceAccumulator accumulator, boolean onGround) {
ForceProviderStandardState standardState = this.getForceProviderStandardState();
Vector3d extForce = standardState.externalForce;
double extForceY = extForce.y;
accumulator.force.add(extForce);
double speed = accumulator.speed;
double dragForceDivSpeed = standardState.dragCoefficient * this.getProjectedArea(bodyState, speed) * speed;
this.dragForce.assign(bodyState.velocity).scale(-dragForceDivSpeed);
this.clipForce(this.dragForce, accumulator.resistanceForceLimit);
accumulator.force.add(this.dragForce);
double gravityForce = -standardState.gravity * this.getMass(this.getVolume());
if (onGround) {
double frictionForce = (gravityForce + extForceY) * this.getFrictionCoefficient();
if (speed > 0.0 && frictionForce > 0.0) {
frictionForce /= speed;
accumulator.force.x = accumulator.force.x - bodyState.velocity.x * frictionForce;
accumulator.force.z = accumulator.force.z - bodyState.velocity.z * frictionForce;
}
} else {
accumulator.force.y += gravityForce;
}
if (standardState.displacedMass != 0.0) {
accumulator.force.y = accumulator.force.y + standardState.displacedMass * standardState.gravity;
}
}
public void clipForce(@Nonnull Vector3d value, @Nonnull Vector3d threshold) {
if (threshold.x < 0.0) {
if (value.x < threshold.x) {
value.x = threshold.x;
}
} else if (value.x > threshold.x) {
value.x = threshold.x;
}
if (threshold.y < 0.0) {
if (value.y < threshold.y) {
value.y = threshold.y;
}
} else if (value.y > threshold.y) {
value.y = threshold.y;
}
if (threshold.z < 0.0) {
if (value.z < threshold.z) {
value.z = threshold.z;
}
} else if (value.z > threshold.z) {
value.z = threshold.z;
}
}
}