package org.jrenner.fps; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g3d.Material; import com.badlogic.gdx.graphics.g3d.Model; import com.badlogic.gdx.graphics.g3d.ModelInstance; import com.badlogic.gdx.graphics.g3d.attributes.BlendingAttribute; import com.badlogic.gdx.graphics.g3d.attributes.TextureAttribute; import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.utils.Array; import static com.badlogic.gdx.graphics.VertexAttributes.Usage; /** blob shadow */ public class Shadow { private static Model model; public ModelInstance modelInstance; public static Array<Shadow> list; private float height; public static void init() { list = new Array<>(); ModelBuilder mb = new ModelBuilder(); Vector3 norm = new Vector3(0f, 1f, 0f); Texture texture = Assets.manager.get("textures/shadow.png", Texture.class); Material material = new Material(TextureAttribute.createDiffuse(texture)); material.set(new BlendingAttribute(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, 0.7f)); //material.set(new DepthTestAttribute(0)); // disable depth testing long attr = Usage.Position | Usage.TextureCoordinates; float s = 1f; model = mb.createRect( -s, 0f, -s,// bl -s, 0f, s, // tl s, 0f, s, // tr s, 0f, -s, // br norm.x, norm.y, norm.z, material, attr ); } public Shadow(float size) { modelInstance = new ModelInstance(model); modelInstance.transform.scale(size, 1f, size); list.add(this); } public static final float MAX_SHADOW_HEIGHT = 100f; private float heightOffset = MathUtils.random(0.01f, 0.03f); private static Vector3 tmp = new Vector3(); public void update(Vector3 position) { // optimize for Mobile if (Main.isMobile() && Main.frame % 6 != 0) { // don't update height } else { height = Physics.inst.getShadowHeightAboveGround(position) - heightOffset; } tmp.set(position.x, position.y - height, position.z); modelInstance.transform.setToTranslation(tmp); modelInstance.transform.rotate(Vector3.Y, Physics.inst.raycastReport.hitNormal); } public void removeFromGame() { list.removeValue(this, true); } }