]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d.jme/src/org/simantics/g3d/jme/test/JMETestViewPart.java
7576c849fbff0ac8fdebba053ba127173af8ae01
[simantics/3d.git] / org.simantics.g3d.jme / src / org / simantics / g3d / jme / test / JMETestViewPart.java
1 package org.simantics.g3d.jme.test;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.List;\r
5 \r
6 import org.eclipse.swt.events.DisposeEvent;\r
7 import org.eclipse.swt.events.DisposeListener;\r
8 import org.eclipse.swt.widgets.Composite;\r
9 import org.eclipse.ui.part.ViewPart;\r
10 import org.simantics.g3d.jme.system.SWTCanvas;\r
11 import org.simantics.g3d.jme.system.SimpleSWTApplication;\r
12 \r
13 import com.jme3.audio.AudioNode;\r
14 import com.jme3.audio.LowPassFilter;\r
15 import com.jme3.effect.ParticleEmitter;\r
16 import com.jme3.effect.ParticleMesh;\r
17 import com.jme3.input.controls.ActionListener;\r
18 import com.jme3.input.controls.KeyTrigger;\r
19 import com.jme3.light.DirectionalLight;\r
20 import com.jme3.light.PointLight;\r
21 import com.jme3.material.Material;\r
22 import com.jme3.material.RenderState.BlendMode;\r
23 import com.jme3.math.ColorRGBA;\r
24 import com.jme3.math.FastMath;\r
25 import com.jme3.math.Quaternion;\r
26 import com.jme3.math.Vector3f;\r
27 import com.jme3.post.FilterPostProcessor;\r
28 import com.jme3.post.filters.BloomFilter;\r
29 import com.jme3.post.filters.DepthOfFieldFilter;\r
30 import com.jme3.post.filters.LightScatteringFilter;\r
31 import com.jme3.renderer.Camera;\r
32 import com.jme3.renderer.queue.RenderQueue.Bucket;\r
33 import com.jme3.renderer.queue.RenderQueue.ShadowMode;\r
34 import com.jme3.scene.Geometry;\r
35 import com.jme3.scene.Node;\r
36 import com.jme3.scene.Spatial;\r
37 import com.jme3.scene.shape.Box;\r
38 import com.jme3.scene.shape.Sphere;\r
39 import com.jme3.terrain.geomipmap.TerrainQuad;\r
40 import com.jme3.terrain.heightmap.AbstractHeightMap;\r
41 import com.jme3.terrain.heightmap.ImageBasedHeightMap;\r
42 import com.jme3.texture.Texture;\r
43 import com.jme3.texture.Texture.WrapMode;\r
44 import com.jme3.texture.Texture2D;\r
45 import com.jme3.util.SkyFactory;\r
46 import com.jme3.water.WaterFilter;\r
47 \r
48 public class JMETestViewPart extends ViewPart {\r
49         \r
50         \r
51         protected SWTCanvas canvas;\r
52         \r
53         \r
54         \r
55         @Override\r
56         public void createPartControl(Composite parent) {\r
57                 \r
58                 canvas = new SWTCanvas(parent);\r
59                 \r
60                 \r
61                 parent.addDisposeListener(new DisposeListener() {\r
62                         \r
63                         @Override\r
64                         public void widgetDisposed(DisposeEvent arg0) {\r
65                                 canvas.dispose();\r
66                         }\r
67                 });\r
68                 \r
69                 TestApp app = new TestApp(canvas);\r
70                 //TestPostWater app = new TestPostWater(canvas);\r
71                 //app.createCanvas();\r
72                 app.start();\r
73                 \r
74                 \r
75         }\r
76         \r
77         \r
78         \r
79         \r
80         @Override\r
81         public void setFocus() {\r
82                 canvas.setFocus();\r
83                 \r
84         }\r
85 \r
86     public class TestApp extends SimpleSWTApplication {\r
87         \r
88         public TestApp(SWTCanvas canvas) {\r
89                         super(canvas);\r
90                         \r
91                 }\r
92 \r
93                 float angle;\r
94         PointLight pl;\r
95         Spatial lightMdl;\r
96         \r
97          @Override\r
98             public void simpleInitApp() {\r
99                 viewPort.setBackgroundColor(ColorRGBA.DarkGray);\r
100 \r
101                 Spatial bumpy = (Spatial) assetManager.loadModel("Models/MonkeyHead/MonkeyHead.mesh.xml");\r
102                 rootNode.attachChild(bumpy);\r
103 \r
104                 lightMdl = new Geometry("Light", new Sphere(10, 10, 0.1f));\r
105                 lightMdl.setMaterial(assetManager.loadMaterial("Common/Materials/RedColor.j3m"));\r
106                 rootNode.attachChild(lightMdl);\r
107 \r
108                 // flourescent main light\r
109                 pl = new PointLight();\r
110                 pl.setColor(new ColorRGBA(0.88f, 0.92f, 0.95f, 1.0f));\r
111                 rootNode.addLight(pl);\r
112 \r
113                 // sunset light\r
114                 DirectionalLight dl = new DirectionalLight();\r
115                 dl.setDirection(new Vector3f(-0.1f,-0.7f,1).normalizeLocal());\r
116                 dl.setColor(new ColorRGBA(0.44f, 0.30f, 0.20f, 1.0f));\r
117                 rootNode.addLight(dl);\r
118 \r
119                 // skylight\r
120                 dl = new DirectionalLight();\r
121                 dl.setDirection(new Vector3f(-0.6f,-1,-0.6f).normalizeLocal());\r
122                 dl.setColor(new ColorRGBA(0.10f, 0.22f, 0.44f, 1.0f));\r
123                 rootNode.addLight(dl);\r
124 \r
125                 // white ambient light\r
126                 dl = new DirectionalLight();\r
127                 dl.setDirection(new Vector3f(1, -0.5f,-0.1f).normalizeLocal());\r
128                 dl.setColor(new ColorRGBA(0.50f, 0.40f, 0.50f, 1.0f));\r
129                 rootNode.addLight(dl);\r
130             }\r
131 \r
132             @Override\r
133             public void simpleUpdate(float tpf){\r
134                 angle += tpf * 0.25f;\r
135                 angle %= FastMath.TWO_PI;\r
136 \r
137                 pl.setPosition(new Vector3f(FastMath.cos(angle) * 6f, 3f, FastMath.sin(angle) * 6f));\r
138                 lightMdl.setLocalTranslation(pl.getPosition());\r
139             }\r
140     }\r
141         \r
142         \r
143     public class TestPostWater extends SimpleSWTApplication {\r
144 \r
145         public TestPostWater(SWTCanvas canvas) {\r
146                         super(canvas);\r
147                 }\r
148         \r
149                 private Vector3f lightDir = new Vector3f(-4.9236743f, -1.27054665f, 5.896916f);\r
150         private WaterFilter water;\r
151         TerrainQuad terrain;\r
152         Material matRock;\r
153         AudioNode waves;\r
154         LowPassFilter underWaterAudioFilter = new LowPassFilter(0.5f, 0.1f);\r
155         LowPassFilter underWaterReverbFilter = new LowPassFilter(0.5f, 0.1f);\r
156         LowPassFilter aboveWaterAudioFilter = new LowPassFilter(1, 1);\r
157 \r
158 \r
159 \r
160         @Override\r
161         public void simpleInitApp() {\r
162 \r
163           setDisplayFps(false);\r
164           setDisplayStatView(false);\r
165 \r
166             Node mainScene = new Node("Main Scene");\r
167             rootNode.attachChild(mainScene);\r
168 \r
169             createTerrain(mainScene);\r
170             DirectionalLight sun = new DirectionalLight();\r
171             sun.setDirection(lightDir);\r
172             sun.setColor(ColorRGBA.White.clone().multLocal(1.7f));\r
173             mainScene.addLight(sun);\r
174 \r
175             DirectionalLight l = new DirectionalLight();\r
176             l.setDirection(Vector3f.UNIT_Y.mult(-1));\r
177             l.setColor(ColorRGBA.White.clone().multLocal(0.3f));\r
178 //            mainScene.addLight(l);\r
179 \r
180             flyCam.setMoveSpeed(50);\r
181 \r
182             //cam.setLocation(new Vector3f(-700, 100, 300));\r
183              //cam.setRotation(new Quaternion().fromAngleAxis(0.5f, Vector3f.UNIT_Z));\r
184             cam.setLocation(new Vector3f(-327.21957f, 61.6459f, 126.884346f));\r
185             cam.setRotation(new Quaternion(0.052168474f, 0.9443102f, -0.18395276f, 0.2678024f));\r
186 \r
187               \r
188             cam.setRotation(new Quaternion().fromAngles(new float[]{FastMath.PI * 0.06f, FastMath.PI * 0.65f, 0}));\r
189 \r
190 \r
191             Spatial sky = SkyFactory.createSky(assetManager, "Scenes/Beach/FullskiesSunset0068.dds", false);\r
192             sky.setLocalScale(350);\r
193           \r
194             mainScene.attachChild(sky);\r
195             cam.setFrustumFar(4000);\r
196             //cam.setFrustumNear(100);\r
197            \r
198             \r
199 \r
200             //private FilterPostProcessor fpp;\r
201 \r
202 \r
203             water = new WaterFilter(rootNode, lightDir);\r
204 \r
205             FilterPostProcessor fpp = new FilterPostProcessor(assetManager);\r
206             \r
207             fpp.addFilter(water);\r
208             BloomFilter bloom=new BloomFilter();\r
209             //bloom.getE\r
210             bloom.setExposurePower(55);\r
211             bloom.setBloomIntensity(1.0f);\r
212             fpp.addFilter(bloom);\r
213             LightScatteringFilter lsf = new LightScatteringFilter(lightDir.mult(-300));\r
214             lsf.setLightDensity(1.0f);\r
215             fpp.addFilter(lsf);\r
216             DepthOfFieldFilter dof=new DepthOfFieldFilter();\r
217             dof.setFocusDistance(0);\r
218             dof.setFocusRange(100);     \r
219             fpp.addFilter(dof);\r
220 //            \r
221             \r
222          //   fpp.addFilter(new TranslucentBucketFilter());\r
223      //       \r
224             \r
225              // fpp.setNumSamples(4);\r
226 \r
227 \r
228             water.setWaveScale(0.003f);\r
229             water.setMaxAmplitude(2f);\r
230             water.setFoamExistence(new Vector3f(1f, 4, 0.5f));\r
231             water.setFoamTexture((Texture2D) assetManager.loadTexture("Common/MatDefs/Water/Textures/foam2.jpg"));\r
232             //water.setNormalScale(0.5f);\r
233 \r
234             //water.setRefractionConstant(0.25f);\r
235             water.setRefractionStrength(0.2f);\r
236             //water.setFoamHardness(0.6f);\r
237 \r
238             water.setWaterHeight(initialWaterHeight);\r
239           uw=cam.getLocation().y<waterHeight; \r
240           \r
241             waves = new AudioNode(assetManager, "Sound/Environment/Ocean Waves.ogg", false);\r
242             waves.setLooping(true);\r
243             waves.setReverbEnabled(true);\r
244             if(uw){\r
245                 waves.setDryFilter(new LowPassFilter(0.5f, 0.1f));\r
246             }else{\r
247                 waves.setDryFilter(aboveWaterAudioFilter);            \r
248             }\r
249             audioRenderer.playSource(waves);\r
250             //  \r
251             viewPort.addProcessor(fpp);\r
252 \r
253             inputManager.addListener(new ActionListener() {\r
254 \r
255                 public void onAction(String name, boolean isPressed, float tpf) {\r
256                     if (isPressed) {\r
257                         if (name.equals("foam1")) {\r
258                             water.setFoamTexture((Texture2D) assetManager.loadTexture("Common/MatDefs/Water/Textures/foam.jpg"));\r
259                         }\r
260                         if (name.equals("foam2")) {\r
261                             water.setFoamTexture((Texture2D) assetManager.loadTexture("Common/MatDefs/Water/Textures/foam2.jpg"));\r
262                         }\r
263                         if (name.equals("foam3")) {\r
264                             water.setFoamTexture((Texture2D) assetManager.loadTexture("Common/MatDefs/Water/Textures/foam3.jpg"));\r
265                         }\r
266                     }\r
267                 }\r
268             }, "foam1", "foam2", "foam3");\r
269             inputManager.addMapping("foam1", new KeyTrigger(keyInput.KEY_1));\r
270             inputManager.addMapping("foam2", new KeyTrigger(keyInput.KEY_2));\r
271             inputManager.addMapping("foam3", new KeyTrigger(keyInput.KEY_3));\r
272 //            createBox();\r
273           //  createFire();\r
274         }\r
275         Geometry box;\r
276 \r
277         private void createBox() {\r
278             //creating a transluscent box\r
279             box = new Geometry("box", new Box(new Vector3f(0, 0, 0), 50, 50, 50));\r
280             Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");\r
281             mat.setColor("Color", new ColorRGBA(1.0f, 0, 0, 0.3f));\r
282             mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);\r
283             //mat.getAdditionalRenderState().setDepthWrite(false);\r
284             //mat.getAdditionalRenderState().setDepthTest(false);\r
285             box.setMaterial(mat);\r
286             box.setQueueBucket(Bucket.Translucent);\r
287 \r
288 \r
289             //creating a post view port\r
290 //            ViewPort post=renderManager.createPostView("transpPost", cam);\r
291 //            post.setClearFlags(false, true, true);\r
292 \r
293 \r
294             box.setLocalTranslation(-600, 0, 300);\r
295 \r
296             //attaching the box to the post viewport\r
297             //Don't forget to updateGeometricState() the box in the simpleUpdate\r
298             //  post.attachScene(box);\r
299 \r
300             rootNode.attachChild(box);\r
301         }\r
302 \r
303         private void createFire() {\r
304             /** Uses Texture from jme3-test-data library! */\r
305             ParticleEmitter fire = new ParticleEmitter("Emitter", ParticleMesh.Type.Triangle, 30);\r
306             Material mat_red = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md");\r
307             mat_red.setTexture("Texture", assetManager.loadTexture("Effects/Explosion/flame.png"));\r
308 \r
309             fire.setMaterial(mat_red);\r
310             fire.setImagesX(2);\r
311             fire.setImagesY(2); // 2x2 texture animation\r
312             fire.setEndColor(new ColorRGBA(1f, 0f, 0f, 1f));   // red\r
313             fire.setStartColor(new ColorRGBA(1f, 1f, 0f, 0.5f)); // yellow\r
314             fire.getParticleInfluencer().setInitialVelocity(new Vector3f(0, 2, 0));\r
315             fire.setStartSize(10f);\r
316             fire.setEndSize(1f);\r
317             fire.setGravity(0, 0, 0);\r
318             fire.setLowLife(0.5f);\r
319             fire.setHighLife(1.5f);\r
320             fire.getParticleInfluencer().setVelocityVariation(0.3f);\r
321             fire.setLocalTranslation(-350, 40, 430);\r
322 \r
323             fire.setQueueBucket(Bucket.Transparent);\r
324             rootNode.attachChild(fire);\r
325         }\r
326 \r
327         private void createTerrain(Node rootNode) {\r
328             matRock = new Material(assetManager, "Common/MatDefs/Terrain/TerrainLighting.j3md");\r
329             matRock.setBoolean("useTriPlanarMapping", false);\r
330             matRock.setBoolean("WardIso", true);\r
331             matRock.setTexture("AlphaMap", assetManager.loadTexture("Textures/Terrain/splat/alphamap.png"));\r
332             Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png");\r
333             Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg");\r
334             grass.setWrap(WrapMode.Repeat);\r
335             matRock.setTexture("DiffuseMap", grass);\r
336             matRock.setFloat("DiffuseMap_0_scale", 64);\r
337             Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg");\r
338             dirt.setWrap(WrapMode.Repeat);\r
339             matRock.setTexture("DiffuseMap_1", dirt);\r
340             matRock.setFloat("DiffuseMap_1_scale", 16);\r
341             Texture rock = assetManager.loadTexture("Textures/Terrain/splat/road.jpg");\r
342             rock.setWrap(WrapMode.Repeat);\r
343             matRock.setTexture("DiffuseMap_2", rock);\r
344             matRock.setFloat("DiffuseMap_2_scale", 128);\r
345             Texture normalMap0 = assetManager.loadTexture("Textures/Terrain/splat/grass_normal.jpg");\r
346             normalMap0.setWrap(WrapMode.Repeat);\r
347             Texture normalMap1 = assetManager.loadTexture("Textures/Terrain/splat/dirt_normal.png");\r
348             normalMap1.setWrap(WrapMode.Repeat);\r
349             Texture normalMap2 = assetManager.loadTexture("Textures/Terrain/splat/road_normal.png");\r
350             normalMap2.setWrap(WrapMode.Repeat);\r
351             matRock.setTexture("NormalMap", normalMap0);\r
352             matRock.setTexture("NormalMap_1", normalMap2);\r
353             matRock.setTexture("NormalMap_2", normalMap2);\r
354 \r
355             AbstractHeightMap heightmap = null;\r
356             try {\r
357                 heightmap = new ImageBasedHeightMap(heightMapImage.getImage(), 0.25f);\r
358                 heightmap.load();\r
359             } catch (Exception e) {\r
360                 e.printStackTrace();\r
361             }\r
362             terrain = new TerrainQuad("terrain", 65, 513, heightmap.getHeightMap());\r
363             List<Camera> cameras = new ArrayList<Camera>();\r
364             cameras.add(getCamera());\r
365             terrain.setMaterial(matRock);\r
366             terrain.setLocalScale(new Vector3f(5, 5, 5));\r
367             terrain.setLocalTranslation(new Vector3f(0, -30, 0));\r
368             terrain.setLocked(false); // unlock it so we can edit the height\r
369 \r
370             terrain.setShadowMode(ShadowMode.Receive);\r
371             rootNode.attachChild(terrain);\r
372 \r
373         }\r
374         //This part is to emulate tides, slightly varrying the height of the water plane\r
375         private float time = 0.0f;\r
376         private float waterHeight = 0.0f;\r
377         private float initialWaterHeight = 0.8f;\r
378     private boolean uw=false;\r
379         @Override\r
380         public void simpleUpdate(float tpf) {\r
381             super.simpleUpdate(tpf);\r
382             //     box.updateGeometricState();\r
383             time += tpf;\r
384             waterHeight = (float) Math.cos(((time * 0.6f) % FastMath.TWO_PI)) * 1.5f;\r
385             water.setWaterHeight(initialWaterHeight + waterHeight);\r
386             if(water.isUnderWater() && !uw){\r
387                \r
388                 waves.setDryFilter(new LowPassFilter(0.5f, 0.1f));\r
389                 uw=true;\r
390             }\r
391             if(!water.isUnderWater() && uw){\r
392                 uw=false;\r
393                  //waves.setReverbEnabled(false);\r
394                  waves.setDryFilter(new LowPassFilter(1, 1f));\r
395                  //waves.setDryFilter(new LowPassFilter(1,1f));\r
396                  \r
397             }     \r
398         }\r
399     }\r
400         \r
401         \r
402         \r
403 }\r