Home | History | Annotate | Download | only in texture
      1 /*
      2  * To change this template, choose Tools | Templates
      3  * and open the template in the editor.
      4  */
      5 package jme3test.texture;
      6 
      7 import com.jme3.app.SimpleApplication;
      8 import com.jme3.bounding.BoundingBox;
      9 import com.jme3.light.PointLight;
     10 import com.jme3.material.Material;
     11 import com.jme3.math.ColorRGBA;
     12 import com.jme3.math.Vector3f;
     13 import com.jme3.scene.Geometry;
     14 import com.jme3.scene.VertexBuffer;
     15 import com.jme3.scene.VertexBuffer.Type;
     16 import com.jme3.scene.VertexBuffer.Usage;
     17 import com.jme3.scene.shape.Sphere;
     18 import com.jme3.texture.Image;
     19 import com.jme3.texture.Image.Format;
     20 import com.jme3.texture.Texture;
     21 import com.jme3.texture.Texture3D;
     22 import com.jme3.util.BufferUtils;
     23 import java.io.IOException;
     24 import java.nio.ByteBuffer;
     25 import java.nio.FloatBuffer;
     26 import java.util.ArrayList;
     27 
     28 public class TestTexture3D extends SimpleApplication {
     29 
     30     public static void main(String[] args) {
     31         TestTexture3D app = new TestTexture3D();
     32         app.start();
     33     }
     34 
     35     @Override
     36     public void simpleInitApp() {
     37         //mouseInput.setCursorVisible(true);
     38         flyCam.setMoveSpeed(10);
     39         //creating a sphere
     40         Sphere sphere = new Sphere(32, 32, 1);
     41         //getting the boundingbox
     42         sphere.updateBound();
     43         BoundingBox bb = (BoundingBox) sphere.getBound();
     44         Vector3f min = bb.getMin(null);
     45         float[] ext = new float[]{bb.getXExtent() * 2, bb.getYExtent() * 2, bb.getZExtent() * 2};
     46         //we need to change the UV coordinates (the sphere is assumet to be inside the 3D image box)
     47         sphere.clearBuffer(Type.TexCoord);
     48         VertexBuffer vb = sphere.getBuffer(Type.Position);
     49         FloatBuffer fb = (FloatBuffer) vb.getData();
     50         float[] uvCoordinates = BufferUtils.getFloatArray(fb);
     51         //now transform the coordinates so that they are in the range of <0; 1>
     52         for (int i = 0; i < uvCoordinates.length; i += 3) {
     53             uvCoordinates[i] = (uvCoordinates[i] - min.x) / ext[0];
     54             uvCoordinates[i + 1] = (uvCoordinates[i + 1] - min.y) / ext[1];
     55             uvCoordinates[i + 2] = (uvCoordinates[i + 2] - min.z) / ext[2];
     56         }
     57         //apply new texture coordinates
     58         VertexBuffer uvCoordsBuffer = new VertexBuffer(Type.TexCoord);
     59         uvCoordsBuffer.setupData(Usage.Static, 3, com.jme3.scene.VertexBuffer.Format.Float,
     60                 BufferUtils.createFloatBuffer(uvCoordinates));
     61         sphere.setBuffer(uvCoordsBuffer);
     62         //create geometry, and apply material and our 3D texture
     63         Geometry g = new Geometry("sphere", sphere);
     64         Material material = new Material(assetManager, "jme3test/texture/tex3D.j3md");
     65         try {
     66             Texture texture = this.getTexture();
     67             material.setTexture("Texture", texture);
     68         } catch (IOException e) {
     69             e.printStackTrace();
     70         }
     71         g.setMaterial(material);
     72         rootNode.attachChild(g);
     73         //add some light so that it is visible
     74         PointLight light = new PointLight();
     75         light.setColor(ColorRGBA.White);
     76         light.setPosition(new Vector3f(5, 5, 5));
     77         light.setRadius(20);
     78         rootNode.addLight(light);
     79         light = new PointLight();
     80         light.setColor(ColorRGBA.White);
     81         light.setPosition(new Vector3f(-5, -5, -5));
     82         light.setRadius(20);
     83         rootNode.addLight(light);
     84     }
     85 
     86     /**
     87          * This method creates a RGB8 texture with the sizes of 10x10x10 pixels.
     88          */
     89     private Texture getTexture() throws IOException {
     90         ArrayList<ByteBuffer> data = new ArrayList<ByteBuffer>(1);
     91         ByteBuffer bb = BufferUtils.createByteBuffer(10 * 10 * 10 * 3);//all data must be inside one buffer
     92         for (int i = 0; i < 10; ++i) {
     93             for (int j = 0; j < 10 * 10; ++j) {
     94                 bb.put((byte) (255f*i/10f));
     95                 bb.put((byte) (255f*i/10f));
     96                 bb.put((byte) (255f));
     97             }
     98         }
     99         bb.rewind();
    100         data.add(bb);
    101         return new Texture3D(new Image(Format.RGB8, 10, 10, 10, data));
    102     }
    103 }