• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package jme3test.post;
2 
3 import com.jme3.app.SimpleApplication;
4 import com.jme3.light.AmbientLight;
5 import com.jme3.light.DirectionalLight;
6 import com.jme3.material.Material;
7 import com.jme3.math.*;
8 import com.jme3.post.FilterPostProcessor;
9 import com.jme3.post.filters.CartoonEdgeFilter;
10 import com.jme3.renderer.queue.RenderQueue.Bucket;
11 import com.jme3.renderer.queue.RenderQueue.ShadowMode;
12 import com.jme3.scene.Geometry;
13 import com.jme3.scene.Node;
14 import com.jme3.scene.Spatial;
15 import com.jme3.scene.shape.Quad;
16 import com.jme3.texture.Texture;
17 
18 public class TestTransparentCartoonEdge extends SimpleApplication {
19 
main(String[] args)20     public static void main(String[] args){
21         TestTransparentCartoonEdge app = new TestTransparentCartoonEdge();
22         app.start();
23     }
24 
simpleInitApp()25     public void simpleInitApp() {
26         renderManager.setAlphaToCoverage(true);
27         cam.setLocation(new Vector3f(0.14914267f, 0.58147097f, 4.7686534f));
28         cam.setRotation(new Quaternion(-0.0044764364f, 0.9767943f, 0.21314798f, 0.020512417f));
29 
30 //        cam.setLocation(new Vector3f(2.0606942f, 3.20342f, 6.7860126f));
31 //        cam.setRotation(new Quaternion(-0.017481906f, 0.98241085f, -0.12393151f, -0.13857932f));
32 
33         viewPort.setBackgroundColor(ColorRGBA.DarkGray);
34 
35         Quad q = new Quad(20, 20);
36         q.scaleTextureCoordinates(Vector2f.UNIT_XY.mult(5));
37         Geometry geom = new Geometry("floor", q);
38         Material mat = assetManager.loadMaterial("Textures/Terrain/Pond/Pond.j3m");
39         geom.setMaterial(mat);
40 
41         geom.rotate(-FastMath.HALF_PI, 0, 0);
42         geom.center();
43         geom.setShadowMode(ShadowMode.Receive);
44         rootNode.attachChild(geom);
45 
46         // create the geometry and attach it
47         Spatial teaGeom = assetManager.loadModel("Models/Tree/Tree.mesh.j3o");
48         teaGeom.setQueueBucket(Bucket.Transparent);
49         teaGeom.setShadowMode(ShadowMode.Cast);
50         makeToonish(teaGeom);
51 
52         AmbientLight al = new AmbientLight();
53         al.setColor(ColorRGBA.White.mult(2));
54         rootNode.addLight(al);
55 
56         DirectionalLight dl1 = new DirectionalLight();
57         dl1.setDirection(new Vector3f(1, -1, 1).normalizeLocal());
58         dl1.setColor(new ColorRGBA(0.965f, 0.949f, 0.772f, 1f).mult(0.7f));
59         rootNode.addLight(dl1);
60 
61         DirectionalLight dl = new DirectionalLight();
62         dl.setDirection(new Vector3f(-1, -1, -1).normalizeLocal());
63         dl.setColor(new ColorRGBA(0.965f, 0.949f, 0.772f, 1f).mult(0.7f));
64         rootNode.addLight(dl);
65 
66         rootNode.attachChild(teaGeom);
67 
68         FilterPostProcessor fpp=new FilterPostProcessor(assetManager);
69         CartoonEdgeFilter toon=new CartoonEdgeFilter();
70         toon.setEdgeWidth(0.5f);
71         toon.setEdgeIntensity(1.0f);
72         toon.setNormalThreshold(0.8f);
73         fpp.addFilter(toon);
74         viewPort.addProcessor(fpp);
75     }
76 
makeToonish(Spatial spatial)77         public void makeToonish(Spatial spatial){
78         if (spatial instanceof Node){
79             Node n = (Node) spatial;
80             for (Spatial child : n.getChildren())
81                 makeToonish(child);
82         }else if (spatial instanceof Geometry){
83             Geometry g = (Geometry) spatial;
84             Material m = g.getMaterial();
85             if (m.getMaterialDef().getName().equals("Phong Lighting")){
86                 Texture t = assetManager.loadTexture("Textures/ColorRamp/toon.png");
87 //                t.setMinFilter(Texture.MinFilter.NearestNoMipMaps);
88 //                t.setMagFilter(Texture.MagFilter.Nearest);
89                 m.setTexture("ColorRamp", t);
90                 m.setBoolean("UseMaterialColors", true);
91                 m.setColor("Specular", ColorRGBA.Black);
92                 m.setColor("Diffuse", ColorRGBA.White);
93                 m.setBoolean("VertexLighting", true);
94             }
95         }
96     }
97 }
98