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