|
@@ -0,0 +1,116 @@
|
|
|
+package jme3test.texture;
|
|
|
+
|
|
|
+import com.jme3.app.SimpleApplication;
|
|
|
+import com.jme3.app.state.ScreenshotAppState;
|
|
|
+import com.jme3.asset.AssetManager;
|
|
|
+import com.jme3.input.KeyInput;
|
|
|
+import com.jme3.input.controls.ActionListener;
|
|
|
+import com.jme3.input.controls.KeyTrigger;
|
|
|
+import com.jme3.material.Material;
|
|
|
+import com.jme3.math.ColorRGBA;
|
|
|
+import com.jme3.math.FastMath;
|
|
|
+import com.jme3.math.Quaternion;
|
|
|
+import com.jme3.math.Vector2f;
|
|
|
+import com.jme3.math.Vector3f;
|
|
|
+import com.jme3.renderer.Limits;
|
|
|
+import com.jme3.scene.Geometry;
|
|
|
+import com.jme3.scene.shape.Quad;
|
|
|
+import com.jme3.texture.Image;
|
|
|
+import com.jme3.texture.Image.Format;
|
|
|
+import com.jme3.texture.Texture;
|
|
|
+import com.jme3.texture.Texture2D;
|
|
|
+import com.jme3.texture.image.ColorSpace;
|
|
|
+import com.jme3.texture.image.ImageRaster;
|
|
|
+import com.jme3.util.BufferUtils;
|
|
|
+
|
|
|
+public class TestAnisotropicFilter extends SimpleApplication implements ActionListener {
|
|
|
+
|
|
|
+ private int globalAniso = 1;
|
|
|
+ private int maxAniso = 1;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void simpleInitApp() {
|
|
|
+ maxAniso = renderer.getLimits().get(Limits.TextureAnisotropy);
|
|
|
+
|
|
|
+ flyCam.setDragToRotate(true);
|
|
|
+ flyCam.setMoveSpeed(100);
|
|
|
+ cam.setLocation(new Vector3f(197.02617f, 4.6769195f, -194.89545f));
|
|
|
+ cam.setRotation(new Quaternion(0.07921988f, 0.8992258f, -0.18292196f, 0.38943136f));
|
|
|
+ Quad q = new Quad(1000, 1000);
|
|
|
+ q.scaleTextureCoordinates(new Vector2f(1000, 1000));
|
|
|
+ Geometry geom = new Geometry("quad", q);
|
|
|
+ geom.rotate(-FastMath.HALF_PI, 0, 0);
|
|
|
+ geom.setMaterial(createCheckerBoardMaterial(assetManager));
|
|
|
+ rootNode.attachChild(geom);
|
|
|
+
|
|
|
+ inputManager.addMapping("higher", new KeyTrigger(KeyInput.KEY_1));
|
|
|
+ inputManager.addMapping("lower", new KeyTrigger(KeyInput.KEY_2));
|
|
|
+ inputManager.addListener(this, "higher");
|
|
|
+ inputManager.addListener(this, "lower");
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Material createCheckerBoardMaterial(AssetManager assetManager) {
|
|
|
+ Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
|
|
|
+ Texture tex = createCheckerBoardTexture(); // assetManager.loadTexture("Textures/Terrain/BrickWall/BrickWall.dds");
|
|
|
+ tex.setMagFilter(Texture.MagFilter.Bilinear);
|
|
|
+ tex.setMinFilter(Texture.MinFilter.Trilinear);
|
|
|
+ tex.setWrap(Texture.WrapMode.Repeat);
|
|
|
+ mat.setTexture("ColorMap", tex);
|
|
|
+ return mat;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Texture2D createCheckerBoardTexture() {
|
|
|
+ Image image = new Image(Format.RGBA8, 1024, 1024, BufferUtils.createByteBuffer(1024 * 1024 * 4), ColorSpace.sRGB);
|
|
|
+
|
|
|
+ ImageRaster raster = ImageRaster.create(image);
|
|
|
+ for (int y = 0; y < 1024; y++) {
|
|
|
+ for (int x = 0; x < 1024; x++) {
|
|
|
+ if (y < 512) {
|
|
|
+ if (x < 512) {
|
|
|
+ raster.setPixel(x, y, ColorRGBA.Black);
|
|
|
+ } else {
|
|
|
+ raster.setPixel(x, y, ColorRGBA.White);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (x < 512) {
|
|
|
+ raster.setPixel(x, y, ColorRGBA.White);
|
|
|
+ } else {
|
|
|
+ raster.setPixel(x, y, ColorRGBA.Black);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return new Texture2D(image);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onAction(String name, boolean isPressed, float tpf) {
|
|
|
+ if (isPressed) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ switch (name) {
|
|
|
+ case "higher":
|
|
|
+ globalAniso++;
|
|
|
+ if (globalAniso > 32) {
|
|
|
+ globalAniso = 32;
|
|
|
+ }
|
|
|
+ renderer.setDefaultAnisotropicFilter(globalAniso);
|
|
|
+ System.out.format("Global Aniso: %d / %d\r\n", globalAniso, maxAniso);
|
|
|
+ break;
|
|
|
+ case "lower":
|
|
|
+ globalAniso--;
|
|
|
+ if (globalAniso < 1) {
|
|
|
+ globalAniso = 1;
|
|
|
+ }
|
|
|
+ renderer.setDefaultAnisotropicFilter(globalAniso);
|
|
|
+ System.out.format("Global Aniso: %d / %d\r\n", globalAniso, maxAniso);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ TestAnisotropicFilter app = new TestAnisotropicFilter();
|
|
|
+ app.start();
|
|
|
+ }
|
|
|
+}
|