parent
f3806b3733
commit
32b29e4434
@ -0,0 +1,4 @@ |
||||
/SigDN/nbproject/private/ |
||||
/SigDN/build/ |
||||
/JmeTests/nbproject/private/ |
||||
/JmeTests/build/ |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,128 @@ |
||||
|
||||
material archer_arms |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
ambient 0 0 0 |
||||
diffuse 1 1 1 |
||||
specular 0.0980392 0.0980392 0.0980392 0 |
||||
emissive 0 0 0 |
||||
|
||||
texture_unit |
||||
{ |
||||
texture ar_ropie_d01_glove.png |
||||
filtering point point point |
||||
} |
||||
} |
||||
} |
||||
} |
||||
material archer_body |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
ambient 0 0 0 |
||||
diffuse 1 1 1 |
||||
specular 0.0980392 0.0980392 0.0980392 0 |
||||
emissive 0 0 0 |
||||
|
||||
texture_unit |
||||
{ |
||||
texture ar_ropie_d01_body.png |
||||
filtering point point point |
||||
} |
||||
} |
||||
} |
||||
} |
||||
material archer_boots |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
ambient 0 0 0 |
||||
diffuse 1 1 1 |
||||
specular 0.0980392 0.0980392 0.0980392 0 |
||||
emissive 0 0 0 |
||||
|
||||
texture_unit |
||||
{ |
||||
texture ar_ropie_d01_boots.png |
||||
filtering point point point |
||||
} |
||||
} |
||||
} |
||||
} |
||||
material archer_face |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
ambient 0 0 0 |
||||
diffuse 1 1 1 |
||||
specular 0.0980392 0.0980392 0.0980392 0 |
||||
emissive 0 0 0 |
||||
|
||||
texture_unit |
||||
{ |
||||
texture ar_head01.png |
||||
filtering point point point |
||||
} |
||||
} |
||||
} |
||||
} |
||||
material archer_hair |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
ambient 0 0 0 |
||||
diffuse 1 1 1 |
||||
specular 0.423529 0.423529 0.423529 0 |
||||
emissive 0 0 0 |
||||
|
||||
texture_unit |
||||
{ |
||||
texture ar_hair01_yellow.png |
||||
filtering point point point |
||||
} |
||||
} |
||||
} |
||||
} |
||||
material archer_legs |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
ambient 0 0 0 |
||||
diffuse 0.509804 0.509804 0.509804 |
||||
specular 0.137255 0.137255 0.137255 20 |
||||
emissive 0 0 0 |
||||
|
||||
texture_unit |
||||
{ |
||||
texture ar_ropie_d01_leg.png.png |
||||
filtering point point point |
||||
} |
||||
} |
||||
} |
||||
} |
||||
material default |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
ambient 0 0 0 |
||||
diffuse 0.788235 0.811765 0.690196 |
||||
specular 0.168627 0.168627 0.156863 20 |
||||
emissive 0 0 0 |
||||
} |
||||
} |
||||
} |
Binary file not shown.
@ -0,0 +1,137 @@ |
||||
material |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
} |
||||
} |
||||
} |
||||
|
||||
material archer_arms |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
ambient 0 0 0 |
||||
diffuse 1 1 1 |
||||
specular 0.0980392 0.0980392 0.0980392 0 |
||||
emissive 0 0 0 |
||||
|
||||
texture_unit |
||||
{ |
||||
texture ar_ropie_d01_glove.png |
||||
filtering point point point |
||||
} |
||||
} |
||||
} |
||||
} |
||||
material archer_body |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
ambient 0 0 0 |
||||
diffuse 1 1 1 |
||||
specular 0.0980392 0.0980392 0.0980392 0 |
||||
emissive 0 0 0 |
||||
|
||||
texture_unit |
||||
{ |
||||
texture ar_ropie_d01_body.png |
||||
filtering point point point |
||||
} |
||||
} |
||||
} |
||||
} |
||||
material archer_boots |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
ambient 0 0 0 |
||||
diffuse 1 1 1 |
||||
specular 0.0980392 0.0980392 0.0980392 0 |
||||
emissive 0 0 0 |
||||
|
||||
texture_unit |
||||
{ |
||||
texture ar_ropie_d01_boots.png |
||||
filtering point point point |
||||
} |
||||
} |
||||
} |
||||
} |
||||
material archer_face |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
ambient 0 0 0 |
||||
diffuse 1 1 1 |
||||
specular 0.0980392 0.0980392 0.0980392 0 |
||||
emissive 0 0 0 |
||||
|
||||
texture_unit |
||||
{ |
||||
texture ar_head01.png |
||||
filtering point point point |
||||
} |
||||
} |
||||
} |
||||
} |
||||
material archer_hair |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
ambient 0 0 0 |
||||
diffuse 1 1 1 |
||||
specular 0.423529 0.423529 0.423529 0 |
||||
emissive 0 0 0 |
||||
|
||||
texture_unit |
||||
{ |
||||
texture ar_hair01_yellow.png |
||||
filtering point point point |
||||
} |
||||
} |
||||
} |
||||
} |
||||
material archer_legs |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
ambient 0 0 0 |
||||
diffuse 0.509804 0.509804 0.509804 |
||||
specular 0.137255 0.137255 0.137255 20 |
||||
emissive 0 0 0 |
||||
|
||||
texture_unit |
||||
{ |
||||
texture ar_ropie_d01_leg.png.png |
||||
filtering point point point |
||||
} |
||||
} |
||||
} |
||||
} |
||||
material default |
||||
{ |
||||
technique |
||||
{ |
||||
pass |
||||
{ |
||||
ambient 0 0 0 |
||||
diffuse 0.788235 0.811765 0.690196 |
||||
specular 0.168627 0.168627 0.156863 20 |
||||
emissive 0 0 0 |
||||
} |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,66 @@ |
||||
# Wavefront MTL |
||||
# Created by fragMOTION 1.3.5 |
||||
# http://www.fragmosoft.com |
||||
|
||||
newmtl archer_arms |
||||
illum 2 |
||||
d 1 |
||||
ka 0 0 0 |
||||
kd 1 1 1 |
||||
ks 0.0980392 0.0980392 0.0980392 |
||||
ke 0 0 0 |
||||
ns 0 |
||||
map_kd ar_ropie_d01_glove.png |
||||
newmtl archer_body |
||||
illum 2 |
||||
d 1 |
||||
ka 0 0 0 |
||||
kd 1 1 1 |
||||
ks 0.0980392 0.0980392 0.0980392 |
||||
ke 0 0 0 |
||||
ns 0 |
||||
map_kd ar_ropie_d01_body.png |
||||
newmtl archer_boots |
||||
illum 2 |
||||
d 1 |
||||
ka 0 0 0 |
||||
kd 1 1 1 |
||||
ks 0.0980392 0.0980392 0.0980392 |
||||
ke 0 0 0 |
||||
ns 0 |
||||
map_kd ar_ropie_d01_boots.png |
||||
newmtl archer_face |
||||
illum 2 |
||||
d 1 |
||||
ka 0 0 0 |
||||
kd 1 1 1 |
||||
ks 0.0980392 0.0980392 0.0980392 |
||||
ke 0 0 0 |
||||
ns 0 |
||||
map_kd ar_head01.png |
||||
newmtl archer_hair |
||||
illum 2 |
||||
d 1 |
||||
ka 0 0 0 |
||||
kd 1 1 1 |
||||
ks 0.423529 0.423529 0.423529 |
||||
ke 0 0 0 |
||||
ns 0 |
||||
map_kd ar_hair01_yellow.png |
||||
newmtl archer_legs |
||||
illum 2 |
||||
d 1 |
||||
ka 0 0 0 |
||||
kd 0.509804 0.509804 0.509804 |
||||
ks 0.137255 0.137255 0.137255 |
||||
ke 0 0 0 |
||||
ns 20 |
||||
map_kd ar_ropie_d01_leg.png.png |
||||
newmtl default |
||||
illum 2 |
||||
d 1 |
||||
ka 0 0 0 |
||||
kd 0.788235 0.811765 0.690196 |
||||
ks 0.168627 0.168627 0.156863 |
||||
ke 0 0 0 |
||||
ns 20 |
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -0,0 +1,100 @@ |
||||
03:07:19: Creating resource group General |
||||
03:07:19: Creating resource group Internal |
||||
03:07:19: Creating resource group Autodetect |
||||
03:07:19: Registering ResourceManager for type Mesh |
||||
03:07:19: Registering ResourceManager for type Material |
||||
03:07:19: Registering ResourceManager for type Skeleton |
||||
03:07:19: XMLMeshSerializer reading mesh data from D:\Documents\DN\Archer\Archer_finalrig.mesh.xml... |
||||
03:07:19: Reading submeshes... |
||||
03:07:19: Reading geometry... |
||||
03:07:19: Geometry done... |
||||
03:07:19: Reading bone assignments... |
||||
03:07:19: Bone assignments done. |
||||
03:07:19: Reading geometry... |
||||
03:07:19: Geometry done... |
||||
03:07:19: Reading bone assignments... |
||||
03:07:19: Bone assignments done. |
||||
03:07:19: Reading geometry... |
||||
03:07:19: Geometry done... |
||||
03:07:19: Reading bone assignments... |
||||
03:07:19: Bone assignments done. |
||||
03:07:19: Reading geometry... |
||||
03:07:19: Geometry done... |
||||
03:07:19: Reading bone assignments... |
||||
03:07:19: Bone assignments done. |
||||
03:07:19: Reading geometry... |
||||
03:07:19: Geometry done... |
||||
03:07:19: Reading bone assignments... |
||||
03:07:19: Bone assignments done. |
||||
03:07:19: Reading geometry... |
||||
03:07:19: Geometry done... |
||||
03:07:19: Reading bone assignments... |
||||
03:07:19: Bone assignments done. |
||||
03:07:19: Reading geometry... |
||||
03:07:19: Geometry done... |
||||
03:07:19: Reading bone assignments... |
||||
03:07:19: Bone assignments done. |
||||
03:07:19: Submeshes done. |
||||
03:07:19: Skeleton: Loading Archer_finalrig.skeleton |
||||
03:07:19: OGRE EXCEPTION(6:FileNotFoundException): Cannot locate resource Archer_finalrig.skeleton in resource group General or any other group. in ResourceGroupManager::openResource at ..\..\..\..\OgreMain\src\OgreResourceGroupManager.cpp (line 753) |
||||
03:07:19: Unable to load skeleton Archer_finalrig.skeleton for Mesh conversion. This Mesh will not be animated. You can ignore this message if you are using an offline tool. |
||||
03:07:19: XMLMeshSerializer import successful. |
||||
03:07:19: Reorganising vertex buffers to automatic layout.. |
||||
03:07:19: MeshSerializer writing mesh data to D:\Documents\DN\Archer\Archer_finalrig.mesh... |
||||
03:07:19: File header written. |
||||
03:07:19: Writing mesh data... |
||||
03:07:19: Writing submesh... |
||||
03:07:19: Exporting submesh texture aliases... |
||||
03:07:19: Submesh texture aliases exported. |
||||
03:07:19: Exporting dedicated geometry bone assignments... |
||||
03:07:19: Dedicated geometry bone assignments exported. |
||||
03:07:19: Submesh exported. |
||||
03:07:19: Writing submesh... |
||||
03:07:19: Exporting submesh texture aliases... |
||||
03:07:19: Submesh texture aliases exported. |
||||
03:07:19: Exporting dedicated geometry bone assignments... |
||||
03:07:19: Dedicated geometry bone assignments exported. |
||||
03:07:19: Submesh exported. |
||||
03:07:19: Writing submesh... |
||||
03:07:19: Exporting submesh texture aliases... |
||||
03:07:19: Submesh texture aliases exported. |
||||
03:07:19: Exporting dedicated geometry bone assignments... |
||||
03:07:19: Dedicated geometry bone assignments exported. |
||||
03:07:19: Submesh exported. |
||||
03:07:19: Writing submesh... |
||||
03:07:19: Exporting submesh texture aliases... |
||||
03:07:19: Submesh texture aliases exported. |
||||
03:07:19: Exporting dedicated geometry bone assignments... |
||||
03:07:19: Dedicated geometry bone assignments exported. |
||||
03:07:19: Submesh exported. |
||||
03:07:19: Writing submesh... |
||||
03:07:19: Exporting submesh texture aliases... |
||||
03:07:19: Submesh texture aliases exported. |
||||
03:07:19: Exporting dedicated geometry bone assignments... |
||||
03:07:19: Dedicated geometry bone assignments exported. |
||||
03:07:19: Submesh exported. |
||||
03:07:19: Writing submesh... |
||||
03:07:19: Exporting submesh texture aliases... |
||||
03:07:19: Submesh texture aliases exported. |
||||
03:07:19: Exporting dedicated geometry bone assignments... |
||||
03:07:19: Dedicated geometry bone assignments exported. |
||||
03:07:19: Submesh exported. |
||||
03:07:19: Writing submesh... |
||||
03:07:19: Exporting submesh texture aliases... |
||||
03:07:19: Submesh texture aliases exported. |
||||
03:07:19: Exporting dedicated geometry bone assignments... |
||||
03:07:19: Dedicated geometry bone assignments exported. |
||||
03:07:19: Submesh exported. |
||||
03:07:19: Exporting skeleton link... |
||||
03:07:19: Skeleton link exported. |
||||
03:07:19: Exporting bounds information.... |
||||
03:07:19: Bounds information exported. |
||||
03:07:19: Exporting submesh name table... |
||||
03:07:19: Submesh name table exported. |
||||
03:07:19: Exporting edge lists... |
||||
03:07:19: Edge lists exported |
||||
03:07:19: Mesh data exported. |
||||
03:07:19: MeshSerializer export successful. |
||||
03:07:19: Unregistering ResourceManager for type Skeleton |
||||
03:07:19: Unregistering ResourceManager for type Material |
||||
03:07:19: Unregistering ResourceManager for type Mesh |
Binary file not shown.
@ -0,0 +1 @@ |
||||
|
@ -0,0 +1,73 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!-- You may freely edit this file. See commented blocks below for --> |
||||
<!-- some examples of how to customize the build. --> |
||||
<!-- (If you delete it and reopen the project it will be recreated.) --> |
||||
<!-- By default, only the Clean and Build commands use this build script. --> |
||||
<!-- Commands such as Run, Debug, and Test only use this build script if --> |
||||
<!-- the Compile on Save feature is turned off for the project. --> |
||||
<!-- You can turn off the Compile on Save (or Deploy on Save) setting --> |
||||
<!-- in the project's Project Properties dialog box.--> |
||||
<project name="JmeTests" default="default" basedir="."> |
||||
<description>Builds, tests, and runs the project JmeTests.</description> |
||||
<import file="nbproject/build-impl.xml"/> |
||||
<!-- |
||||
|
||||
There exist several targets which are by default empty and which can be |
||||
used for execution of your tasks. These targets are usually executed |
||||
before and after some main targets. They are: |
||||
|
||||
-pre-init: called before initialization of project properties |
||||
-post-init: called after initialization of project properties |
||||
-pre-compile: called before javac compilation |
||||
-post-compile: called after javac compilation |
||||
-pre-compile-single: called before javac compilation of single file |
||||
-post-compile-single: called after javac compilation of single file |
||||
-pre-compile-test: called before javac compilation of JUnit tests |
||||
-post-compile-test: called after javac compilation of JUnit tests |
||||
-pre-compile-test-single: called before javac compilation of single JUnit test |
||||
-post-compile-test-single: called after javac compilation of single JUunit test |
||||
-pre-jar: called before JAR building |
||||
-post-jar: called after JAR building |
||||
-post-clean: called after cleaning build products |
||||
|
||||
(Targets beginning with '-' are not intended to be called on their own.) |
||||
|
||||
Example of inserting an obfuscator after compilation could look like this: |
||||
|
||||
<target name="-post-compile"> |
||||
<obfuscate> |
||||
<fileset dir="${build.classes.dir}"/> |
||||
</obfuscate> |
||||
</target> |
||||
|
||||
For list of available properties check the imported |
||||
nbproject/build-impl.xml file. |
||||
|
||||
|
||||
Another way to customize the build is by overriding existing main targets. |
||||
The targets of interest are: |
||||
|
||||
-init-macrodef-javac: defines macro for javac compilation |
||||
-init-macrodef-junit: defines macro for junit execution |
||||
-init-macrodef-debug: defines macro for class debugging |
||||
-init-macrodef-java: defines macro for class execution |
||||
-do-jar: JAR building |
||||
run: execution of project |
||||
-javadoc-build: Javadoc generation |
||||
test-report: JUnit report generation |
||||
|
||||
An example of overriding the target for project execution could look like this: |
||||
|
||||
<target name="run" depends="JmeTests-impl.jar"> |
||||
<exec dir="bin" executable="launcher.exe"> |
||||
<arg file="${dist.jar}"/> |
||||
</exec> |
||||
</target> |
||||
|
||||
Notice that the overridden target depends on the jar target and not only on |
||||
the compile target as the regular run target does. Again, for a list of available |
||||
properties which you can use, check the target you are overriding in the |
||||
nbproject/build-impl.xml file. |
||||
|
||||
--> |
||||
</project> |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,880 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!-- |
||||
*** GENERATED FROM project.xml - DO NOT EDIT *** |
||||
*** EDIT ../build.xml INSTEAD *** |
||||
|
||||
For the purpose of easier reading the script |
||||
is divided into following sections: |
||||
|
||||
- initialization |
||||
- compilation |
||||
- jar |
||||
- execution |
||||
- debugging |
||||
- javadoc |
||||
- junit compilation |
||||
- junit execution |
||||
- junit debugging |
||||
- applet |
||||
- cleanup |
||||
|
||||
--> |
||||
<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="JME3TestsTemplate-impl"> |
||||
<fail message="Please build using Ant 1.7.1 or higher."> |
||||
<condition> |
||||
<not> |
||||
<antversion atleast="1.7.1"/> |
||||
</not> |
||||
</condition> |
||||
</fail> |
||||
<target depends="test,jar,javadoc" description="Build and test whole project." name="default"/> |
||||
<!-- |
||||
====================== |
||||
INITIALIZATION SECTION |
||||
====================== |
||||
--> |
||||
<target name="-pre-init"> |
||||
<!-- Empty placeholder for easier customization. --> |
||||
<!-- You can override this target in the ../build.xml file. --> |
||||
</target> |
||||
<target depends="-pre-init" name="-init-private"> |
||||
<property file="nbproject/private/config.properties"/> |
||||
<property file="nbproject/private/configs/${config}.properties"/> |
||||
<property file="nbproject/private/private.properties"/> |
||||
</target> |
||||
<target depends="-pre-init,-init-private" name="-init-user"> |
||||
<property file="${user.properties.file}"/> |
||||
<!-- The two properties below are usually overridden --> |
||||
<!-- by the active platform. Just a fallback. --> |
||||
<property name="default.javac.source" value="1.4"/> |
||||
<property name="default.javac.target" value="1.4"/> |
||||
</target> |
||||
<target depends="-pre-init,-init-private,-init-user" name="-init-project"> |
||||
<property file="nbproject/configs/${config}.properties"/> |
||||
<property file="nbproject/project.properties"/> |
||||
</target> |
||||
<target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init"> |
||||
<available file="${manifest.file}" property="manifest.available"/> |
||||
<available file="${application.splash}" property="splashscreen.available"/> |
||||
<condition property="main.class.available"> |
||||
<and> |
||||
<isset property="main.class"/> |
||||
<not> |
||||
<equals arg1="${main.class}" arg2="" trim="true"/> |
||||
</not> |
||||
</and> |
||||
</condition> |
||||
<condition property="manifest.available+main.class"> |
||||
<and> |
||||
<isset property="manifest.available"/> |
||||
<isset property="main.class.available"/> |
||||
</and> |
||||
</condition> |
||||
<condition property="do.mkdist"> |
||||
<and> |
||||
<isset property="libs.CopyLibs.classpath"/> |
||||
<not> |
||||
<istrue value="${mkdist.disabled}"/> |
||||
</not> |
||||
</and> |
||||
</condition> |
||||
<condition property="manifest.available+main.class+mkdist.available"> |
||||
<and> |
||||
<istrue value="${manifest.available+main.class}"/> |
||||
<isset property="do.mkdist"/> |
||||
</and> |
||||
</condition> |
||||
<condition property="manifest.available+main.class+mkdist.available+splashscreen.available"> |
||||
<and> |
||||
<istrue value="${manifest.available+main.class+mkdist.available}"/> |
||||
<istrue value="${splashscreen.available}"/> |
||||
</and> |
||||
</condition> |
||||
<condition property="do.archive"> |
||||
<not> |
||||
<istrue value="${jar.archive.disabled}"/> |
||||
</not> |
||||
</condition> |
||||
<condition property="do.archive+manifest.available"> |
||||
<and> |
||||
<isset property="manifest.available"/> |
||||
<istrue value="${do.archive}"/> |
||||
</and> |
||||
</condition> |
||||
<condition property="do.archive+manifest.available+main.class"> |
||||
<and> |
||||
<istrue value="${manifest.available+main.class}"/> |
||||
<istrue value="${do.archive}"/> |
||||
</and> |
||||
</condition> |
||||
<condition property="do.archive+manifest.available+main.class+mkdist.available"> |
||||
<and> |
||||
<istrue value="${manifest.available+main.class+mkdist.available}"/> |
||||
<istrue value="${do.archive}"/> |
||||
</and> |
||||
</condition> |
||||
<condition property="do.archive+manifest.available+main.class+mkdist.available+splashscreen.available"> |
||||
<and> |
||||
<istrue value="${manifest.available+main.class+mkdist.available+splashscreen.available}"/> |
||||
<istrue value="${do.archive}"/> |
||||
</and> |
||||
</condition> |
||||
<condition property="have.tests"> |
||||
<or/> |
||||
</condition> |
||||
<condition property="have.sources"> |
||||
<or> |
||||
<available file="${src.dir}"/> |
||||
</or> |
||||
</condition> |
||||
<condition property="netbeans.home+have.tests"> |
||||
<and> |
||||
<isset property="netbeans.home"/> |
||||
<isset property="have.tests"/> |
||||
</and> |
||||
</condition> |
||||
<condition property="no.javadoc.preview"> |
||||
<and> |
||||
<isset property="javadoc.preview"/> |
||||
<isfalse value="${javadoc.preview}"/> |
||||
</and> |
||||
</condition> |
||||
<property name="run.jvmargs" value=""/> |
||||
<property name="javac.compilerargs" value=""/> |
||||
<property name="work.dir" value="${basedir}"/> |
||||
<condition property="no.deps"> |
||||
<and> |
||||
<istrue value="${no.dependencies}"/> |
||||
</and> |
||||
</condition> |
||||
<property name="javac.debug" value="true"/> |
||||
<property name="javadoc.preview" value="true"/> |
||||
<property name="application.args" value=""/> |
||||
<property name="source.encoding" value="${file.encoding}"/> |
||||
<property name="runtime.encoding" value="${source.encoding}"/> |
||||
<condition property="javadoc.encoding.used" value="${javadoc.encoding}"> |
||||
<and> |
||||
<isset property="javadoc.encoding"/> |
||||
<not> |
||||
<equals arg1="${javadoc.encoding}" arg2=""/> |
||||
</not> |
||||
</and> |
||||
</condition> |
||||
<property name="javadoc.encoding.used" value="${source.encoding}"/> |
||||
<property name="includes" value="**"/> |
||||
<property name="excludes" value=""/> |
||||
<property name="do.depend" value="false"/> |
||||
<condition property="do.depend.true"> |
||||
<istrue value="${do.depend}"/> |
||||
</condition> |
||||
<path id="endorsed.classpath.path" path="${endorsed.classpath}"/> |
||||
<condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'"> |
||||
<length length="0" string="${endorsed.classpath}" when="greater"/> |
||||
</condition> |
||||
<property name="javac.fork" value="false"/> |
||||
<property name="jar.index" value="false"/> |
||||
<available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/> |
||||
</target> |
||||
<target name="-post-init"> |
||||
<!-- Empty placeholder for easier customization. --> |
||||
<!-- You can override this target in the ../build.xml file. --> |
||||
</target> |
||||
<target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check"> |
||||
<fail unless="src.dir">Must set src.dir</fail> |
||||
<fail unless="build.dir">Must set build.dir</fail> |
||||
<fail unless="dist.dir">Must set dist.dir</fail> |
||||
<fail unless="build.classes.dir">Must set build.classes.dir</fail> |
||||
<fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail> |
||||
<fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail> |
||||
<fail unless="build.test.results.dir">Must set build.test.results.dir</fail> |
||||
<fail unless="build.classes.excludes">Must set build.classes.excludes</fail> |
||||
<fail unless="dist.jar">Must set dist.jar</fail> |
||||
</target> |
||||
<target name="-init-macrodef-property"> |
||||
<macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1"> |
||||
<attribute name="name"/> |
||||
<attribute name="value"/> |
||||
<sequential> |
||||
<property name="@{name}" value="${@{value}}"/> |
||||
</sequential> |
||||
</macrodef> |
||||
</target> |
||||
<target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors"> |
||||
<macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3"> |
||||
<attribute default="${src.dir}" name="srcdir"/> |
||||
<attribute default="${build.classes.dir}" name="destdir"/> |
||||
<attribute default="${javac.classpath}" name="classpath"/> |
||||
<attribute default="${javac.processorpath}" name="processorpath"/> |
||||
<attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/> |
||||
<attribute default="${includes}" name="includes"/> |
||||
<attribute default="${excludes}" name="excludes"/> |
||||
<attribute default="${javac.debug}" name="debug"/> |
||||
<attribute default="${empty.dir}" name="sourcepath"/> |
||||
<attribute default="${empty.dir}" name="gensrcdir"/> |
||||
<element name="customize" optional="true"/> |
||||
<sequential> |
||||
<property location="${build.dir}/empty" name="empty.dir"/> |
||||
<mkdir dir="${empty.dir}"/> |
||||
<mkdir dir="@{apgeneratedsrcdir}"/> |
||||
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}"> |
||||
<src> |
||||
<dirset dir="@{gensrcdir}" erroronmissingdir="false"> |
||||
<include name="*"/> |
||||
</dirset> |
||||
</src> |
||||
<classpath> |
||||
<path path="@{classpath}"/> |
||||
</classpath> |
||||
<compilerarg line="${endorsed.classpath.cmd.line.arg}"/> |
||||
<compilerarg line="${javac.compilerargs}"/> |
||||
<compilerarg value="-processorpath"/> |
||||
<compilerarg path="@{processorpath}:${empty.dir}"/> |
||||
<compilerarg line="${ap.processors.internal}"/> |
||||
<compilerarg line="${annotation.processing.processor.options}"/> |
||||
<compilerarg value="-s"/> |
||||
<compilerarg path="@{apgeneratedsrcdir}"/> |
||||
<compilerarg line="${ap.proc.none.internal}"/> |
||||
<customize/> |
||||
</javac> |
||||
</sequential> |
||||
</macrodef> |
||||
</target> |
||||
<target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal"> |
||||
<macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3"> |
||||
<attribute default="${src.dir}" name="srcdir"/> |
||||
<attribute default="${build.classes.dir}" name="destdir"/> |
||||
<attribute default="${javac.classpath}" name="classpath"/> |
||||
<attribute default="${javac.processorpath}" name="processorpath"/> |
||||
<attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/> |
||||
<attribute default="${includes}" name="includes"/> |
||||
<attribute default="${excludes}" name="excludes"/> |
||||
<attribute default="${javac.debug}" name="debug"/> |
||||
<attribute default="${empty.dir}" name="sourcepath"/> |
||||
<attribute default="${empty.dir}" name="gensrcdir"/> |
||||
<element name="customize" optional="true"/> |
||||
<sequential> |
||||
<property location="${build.dir}/empty" name="empty.dir"/> |
||||
<mkdir dir="${empty.dir}"/> |
||||
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}"> |
||||
<src> |
||||
<dirset dir="@{gensrcdir}" erroronmissingdir="false"> |
||||
<include name="*"/> |
||||
</dirset> |
||||
</src> |
||||
<classpath> |
||||
<path path="@{classpath}"/> |
||||
</classpath> |
||||
<compilerarg line="${endorsed.classpath.cmd.line.arg}"/> |
||||
<compilerarg line="${javac.compilerargs}"/> |
||||
<customize/> |
||||
</javac> |
||||
</sequential> |
||||
</macrodef> |
||||
</target> |
||||
<target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac"> |
||||
<macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3"> |
||||
<attribute default="${src.dir}" name="srcdir"/> |
||||
<attribute default="${build.classes.dir}" name="destdir"/> |
||||
<attribute default="${javac.classpath}" name="classpath"/> |
||||
<sequential> |
||||
<depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}"> |
||||
<classpath> |
||||
<path path="@{classpath}"/> |
||||
</classpath> |
||||
</depend> |
||||
</sequential> |
||||
</macrodef> |
||||
<macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3"> |
||||
<attribute default="${build.classes.dir}" name="destdir"/> |
||||
<sequential> |
||||
<fail unless="javac.includes">Must set javac.includes</fail> |
||||
<pathconvert pathsep="," property="javac.includes.binary"> |
||||
<path> |
||||
<filelist dir="@{destdir}" files="${javac.includes}"/> |
||||
</path> |
||||
<globmapper from="*.java" to="*.class"/> |
||||
</pathconvert> |
||||
<delete> |
||||
<files includes="${javac.includes.binary}"/> |
||||
</delete> |
||||
</sequential> |
||||
</macrodef> |
||||
</target> |
||||
<target name="-init-macrodef-junit"> |
||||
<macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3"> |
||||
<attribute default="${includes}" name="includes"/> |
||||
<attribute default="${excludes}" name="excludes"/> |
||||
<attribute default="**" name="testincludes"/> |
||||
<sequential> |
||||
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true" tempdir="${build.dir}"> |
||||
<batchtest todir="${build.test.results.dir}"/> |
||||
<classpath> |
||||
<path path="${run.test.classpath}"/> |
||||
</classpath> |
||||
<syspropertyset> |
||||
<propertyref prefix="test-sys-prop."/> |
||||
<mapper from="test-sys-prop.*" to="*" type="glob"/> |
||||
</syspropertyset> |
||||
<formatter type="brief" usefile="false"/> |
||||
<formatter type="xml"/> |
||||
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/> |
||||
<jvmarg line="${run.jvmargs}"/> |
||||
</junit> |
||||
</sequential> |
||||
</macrodef> |
||||
</target> |
||||
<target depends="-init-debug-args" name="-init-macrodef-nbjpda"> |
||||
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1"> |
||||
<attribute default="${main.class}" name="name"/> |
||||
<attribute default="${debug.classpath}" name="classpath"/> |
||||
<attribute default="" name="stopclassname"/> |
||||
<sequential> |
||||
<nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}"> |
||||
<classpath> |
||||
<path path="@{classpath}"/> |
||||
</classpath> |
||||
</nbjpdastart> |
||||
</sequential> |
||||
</macrodef> |
||||
<macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1"> |
||||
<attribute default="${build.classes.dir}" name="dir"/> |
||||
<sequential> |
||||
<nbjpdareload> |
||||
<fileset dir="@{dir}" includes="${fix.classes}"> |
||||
<include name="${fix.includes}*.class"/> |
||||
</fileset> |
||||
</nbjpdareload> |
||||
</sequential> |
||||
</macrodef> |
||||
</target> |
||||
<target name="-init-debug-args"> |
||||
<property name="version-output" value="java version "${ant.java.version}"/> |
||||
<condition property="have-jdk-older-than-1.4"> |
||||
<or> |
||||
<contains string="${version-output}" substring="java version "1.0"/> |
||||
<contains string="${version-output}" substring="java version "1.1"/> |
||||
<contains string="${version-output}" substring="java version "1.2"/> |
||||
<contains string="${version-output}" substring="java version "1.3"/> |
||||
</or> |
||||
</condition> |
||||
<condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none"> |
||||
<istrue value="${have-jdk-older-than-1.4}"/> |
||||
</condition> |
||||
<condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem"> |
||||
<os family="windows"/> |
||||
</condition> |
||||
<condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}"> |
||||
<isset property="debug.transport"/> |
||||
</condition> |
||||
</target> |
||||
<target depends="-init-debug-args" name="-init-macrodef-debug"> |
||||
<macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3"> |
||||
<attribute default="${main.class}" name="classname"/> |
||||
<attribute default="${debug.classpath}" name="classpath"/> |
||||
<element name="customize" optional="true"/> |
||||
<sequential> |
||||
<java classname="@{classname}" dir="${work.dir}" fork="true"> |
||||
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/> |
||||
<jvmarg line="${debug-args-line}"/> |
||||
<jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/> |
||||
<jvmarg value="-Dfile.encoding=${runtime.encoding}"/> |
||||
<redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/> |
||||
<jvmarg line="${run.jvmargs}"/> |
||||
<classpath> |
||||
<path path="@{classpath}"/> |
||||
</classpath> |
||||
<syspropertyset> |
||||
<propertyref prefix="run-sys-prop."/> |
||||
<mapper from="run-sys-prop.*" to="*" type="glob"/> |
||||
</syspropertyset> |
||||
<customize/> |
||||
</java> |
||||
</sequential> |
||||
</macrodef> |
||||
</target> |
||||
<target name="-init-macrodef-java"> |
||||
<macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1"> |
||||
<attribute default="${main.class}" name="classname"/> |
||||
<attribute default="${run.classpath}" name="classpath"/> |
||||
<element name="customize" optional="true"/> |
||||
<sequential> |
||||
<java classname="@{classname}" dir="${work.dir}" fork="true"> |
||||
<jvmarg line="${endorsed.classpath.cmd.line.arg}"/> |
||||
<jvmarg value="-Dfile.encoding=${runtime.encoding}"/> |
||||
<redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/> |
||||
<jvmarg line="${run.jvmargs}"/> |
||||
<classpath> |
||||
<path path="@{classpath}"/> |
||||
</classpath> |
||||
<syspropertyset> |
||||
<propertyref prefix="run-sys-prop."/> |
||||
<mapper from="run-sys-prop.*" to="*" type="glob"/> |
||||
</syspropertyset> |
||||
<customize/> |
||||
</java> |
||||
</sequential> |
||||
</macrodef> |
||||
</target> |
||||
<target name="-init-macrodef-copylibs"> |
||||
<macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3"> |
||||
<element name="customize" optional="true"/> |
||||
<sequential> |
||||
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/> |
||||
<pathconvert property="run.classpath.without.build.classes.dir"> |
||||
<path path="${run.classpath}"/> |
||||
<map from="${build.classes.dir.resolved}" to=""/> |
||||
</pathconvert> |
||||
<pathconvert pathsep=" " property="jar.classpath"> |
||||
<path path="${run.classpath.without.build.classes.dir}"/> |
||||
<chainedmapper> |
||||
<flattenmapper/> |
||||
<globmapper from="*" to="lib/*"/> |
||||
</chainedmapper> |
||||
</pathconvert> |
||||
<taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/> |
||||
<copylibs compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}"> |
||||
<fileset dir="${build.classes.dir}"/> |
||||
<manifest> |
||||
<attribute name="Class-Path" value="${jar.classpath}"/> |
||||
<customize/> |
||||
</manifest> |
||||
</copylibs> |
||||
</sequential> |
||||
</macrodef> |
||||
</target> |
||||
<target name="-init-presetdef-jar"> |
||||
<presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1"> |
||||
<jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}"> |
||||
<j2seproject1:fileset dir="${build.classes.dir}"/> |
||||
</jar> |
||||
</presetdef> |
||||
</target> |
||||
<target name="-init-ap-cmdline-properties"> |
||||
<property name="annotation.processing.enabled" value="true"/> |
||||
<property name="annotation.processing.processors.list" value=""/> |
||||
<property name="annotation.processing.processor.options" value=""/> |
||||
<property name="annotation.processing.run.all.processors" value="true"/> |
||||
<property name="javac.processorpath" value="${javac.classpath}"/> |
||||
<property name="javac.test.processorpath" value="${javac.test.classpath}"/> |
||||
<condition property="ap.supported.internal" value="true"> |
||||
<not> |
||||
<matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/> |
||||
</not> |
||||
</condition> |
||||
</target> |
||||
<target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported"> |
||||
<condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}"> |
||||
<isfalse value="${annotation.processing.run.all.processors}"/> |
||||
</condition> |
||||
<condition else="" property="ap.proc.none.internal" value="-proc:none"> |
||||
<isfalse value="${annotation.processing.enabled}"/> |
||||
</condition> |
||||
</target> |
||||
<target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline"> |
||||
<property name="ap.cmd.line.internal" value=""/> |
||||
</target> |
||||
<target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/> |
||||
<!-- |
||||
=================== |
||||
COMPILATION SECTION |
||||
=================== |
||||
--> |
||||
<target name="-deps-jar-init" unless="built-jar.properties"> |
||||
<property location="${build.dir}/built-jar.properties" name="built-jar.properties"/> |
||||
<delete file="${built-jar.properties}" quiet="true"/> |
||||
</target> |
||||
<target if="already.built.jar.${basedir}" name="-warn-already-built-jar"> |
||||
<echo level="warn" message="Cycle detected: JME3TestsTemplate was already built"/> |
||||
</target> |
||||
<target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps"> |
||||
<mkdir dir="${build.dir}"/> |
||||
<touch file="${built-jar.properties}" verbose="false"/> |
||||
<property file="${built-jar.properties}" prefix="already.built.jar."/> |
||||
<antcall target="-warn-already-built-jar"/> |
||||
<propertyfile file="${built-jar.properties}"> |
||||
<entry key="${basedir}" value=""/> |
||||
</propertyfile> |
||||
</target> |
||||
<target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/> |
||||
<target depends="init" name="-check-automatic-build"> |
||||
<available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/> |
||||
</target> |
||||
<target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build"> |
||||
<antcall target="clean"/> |
||||
</target> |
||||
<target depends="init,deps-jar" name="-pre-pre-compile"> |
||||
<mkdir dir="${build.classes.dir}"/> |
||||
</target> |
||||
<target name="-pre-compile"> |
||||
<!-- Empty placeholder for easier customization. --> |
||||
<!-- You can override this target in the ../build.xml file. --> |
||||
</target> |
||||
<target if="do.depend.true" name="-compile-depend"> |
||||
<pathconvert property="build.generated.subdirs"> |
||||
<dirset dir="${build.generated.sources.dir}" erroronmissingdir="false"> |
||||
<include name="*"/> |
||||
</dirset> |
||||
</pathconvert> |
||||
<j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/> |
||||
</target> |
||||
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile"> |
||||
<j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/> |
||||
<copy todir="${build.classes.dir}"> |
||||
<fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/> |
||||
</copy> |
||||
</target> |
||||
<target if="has.persistence.xml" name="-copy-persistence-xml"> |
||||
<mkdir dir="${build.classes.dir}/META-INF"/> |
||||
<copy todir="${build.classes.dir}/META-INF"> |
||||
<fileset dir="${meta.inf.dir}" includes="persistence.xml"/> |
||||
</copy> |
||||
</target> |
||||
<target name="-post-compile"> |
||||
<!-- Empty placeholder for easier customization. --> |
||||
<!-- You can override this target in the ../build.xml file. --> |
||||
</target> |
||||
<target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/> |
||||
<target name="-pre-compile-single"> |
||||
<!-- Empty placeholder for easier customization. --> |
||||
<!-- You can override this target in the ../build.xml file. --> |
||||
</target> |
||||
<target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single"> |
||||
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail> |
||||
<j2seproject3:force-recompile/> |
||||
<j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/> |
||||
</target> |
||||
<target name="-post-compile-single"> |
||||
<!-- Empty placeholder for easier customization. --> |
||||
<!-- You can override this target in the ../build.xml file. --> |
||||
</target> |
||||
<target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/> |
||||
<!-- |
||||
==================== |
||||
JAR BUILDING SECTION |
||||
==================== |
||||
--> |
||||
<target depends="init" name="-pre-pre-jar"> |
||||
<dirname file="${dist.jar}" property="dist.jar.dir"/> |
||||
<mkdir dir="${dist.jar.dir}"/> |
||||
</target> |
||||
<target name="-pre-jar"> |
||||
<!-- Empty placeholder for easier customization. --> |
||||
<!-- You can override this target in the ../build.xml file. --> |
||||
</target> |
||||
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available"> |
||||
<j2seproject1:jar/> |
||||
</target> |
||||
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class"> |
||||
<j2seproject1:jar manifest="${manifest.file}"/> |
||||
</target> |
||||
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available"> |
||||
<j2seproject1:jar manifest="${manifest.file}"> |
||||
<j2seproject1:manifest> |
||||
<j2seproject1:attribute name="Main-Class" value="${main.class}"/> |
||||
</j2seproject1:manifest> |
||||
</j2seproject1:jar> |
||||
<echo>To run this application from the command line without Ant, try:</echo> |
||||
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/> |
||||
<property location="${dist.jar}" name="dist.jar.resolved"/> |
||||
<pathconvert property="run.classpath.with.dist.jar"> |
||||
<path path="${run.classpath}"/> |
||||
<map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/> |
||||
</pathconvert> |
||||
<echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo> |
||||
</target> |
||||
<target depends="init,compile,-pre-pre-jar,-pre-jar,-init-macrodef-copylibs" if="do.archive+manifest.available+main.class+mkdist.available+splashscreen.available" name="-do-jar-with-libraries-and-splashscreen"> |
||||
<basename file="${application.splash}" property="splashscreen.basename"/> |
||||
<mkdir dir="${build.classes.dir}/META-INF"/> |
||||
<copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/> |
||||
<j2seproject3:copylibs> |
||||
<customize> |
||||
<attribute name="Main-Class" value="${main.class}"/> |
||||
<attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/> |
||||
</customize> |
||||
</j2seproject3:copylibs> |
||||
<echo>To run this application from the command line without Ant, try:</echo> |
||||
<property location="${dist.jar}" name="dist.jar.resolved"/> |
||||
<echo>java -jar "${dist.jar.resolved}"</echo> |
||||
</target> |
||||
<target depends="init,compile,-pre-pre-jar,-pre-jar,-init-macrodef-copylibs" if="do.archive+manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries" unless="splashscreen.available"> |
||||
<j2seproject3:copylibs> |
||||
<customize> |
||||
<attribute name="Main-Class" value="${main.class}"/> |
||||
</customize> |
||||
</j2seproject3:copylibs> |
||||
<echo>To run this application from the command line without Ant, try:</echo> |
||||
<property location="${dist.jar}" name="dist.jar.resolved"/> |
||||
<echo>java -jar "${dist.jar.resolved}"</echo> |
||||
</target> |
||||
<target name="-post-jar"> |
||||
<!-- Empty placeholder for easier customization. --> |
||||
<!-- You can override this target in the ../build.xml file. --> |
||||
</target> |
||||
<target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries-and-splashscreen,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/> |
||||
<!-- |
||||
================= |
||||
EXECUTION SECTION |
||||
================= |
||||
--> |
||||
<target depends="init,compile" description="Run a main class." name="run"> |
||||
<j2seproject1:java> |
||||
<customize> |
||||
<arg line="${application.args}"/> |
||||
</customize> |
||||
</j2seproject1:java> |
||||
</target> |
||||
<target name="-do-not-recompile"> |
||||
<property name="javac.includes.binary" value=""/> |
||||
</target> |
||||
<target depends="init,compile-single" name="run-single"> |
||||
<fail unless="run.class">Must select one file in the IDE or set run.class</fail> |
||||
<j2seproject1:java classname="${run.class}"/> |
||||
</target> |
||||
<target depends="init,compile-test-single" name="run-test-with-main"> |
||||
<fail unless="run.class">Must select one file in the IDE or set run.class</fail> |
||||
<j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/> |
||||
</target> |
||||
<!-- |
||||
================= |
||||
DEBUGGING SECTION |
||||
================= |
||||
--> |
||||
<target depends="init" if="netbeans.home" name="-debug-start-debugger"> |
||||
<j2seproject1:nbjpdastart name="${debug.class}"/> |
||||
</target> |
||||
<target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test"> |
||||
<j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/> |
||||
</target> |
||||
<target depends="init,compile" name="-debug-start-debuggee"> |
||||
<j2seproject3:debug> |
||||
<customize> |
||||
<arg line="${application.args}"/> |
||||
</customize> |
||||
</j2seproject3:debug> |
||||
</target> |
||||
<target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/> |
||||
<target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto"> |
||||
<j2seproject1:nbjpdastart stopclassname="${main.class}"/> |
||||
</target> |
||||
<target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/> |
||||
<target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single"> |
||||
<fail unless="debug.class">Must select one file in the IDE or set debug.class</fail> |
||||
<j2seproject3:debug classname="${debug.class}"/> |
||||
</target> |
||||
<target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/> |
||||
<target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test"> |
||||
<fail unless="debug.class">Must select one file in the IDE or set debug.class</fail> |
||||
<j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/> |
||||
</target> |
||||
<target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/> |
||||
<target depends="init" name="-pre-debug-fix"> |
||||
<fail unless="fix.includes">Must set fix.includes</fail> |
||||
<property name="javac.includes" value="${fix.includes}.java"/> |
||||
</target> |
||||
<target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix"> |
||||
<j2seproject1:nbjpdareload/> |
||||
</target> |
||||
<target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/> |
||||
<!-- |
||||
=============== |
||||
JAVADOC SECTION |
||||
=============== |
||||
--> |
||||
<target depends="init" if="have.sources" name="-javadoc-build"> |
||||
<mkdir dir="${dist.javadoc.dir}"/> |
||||
<javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}"> |
||||
<classpath> |
||||
<path path="${javac.classpath}"/> |
||||
</classpath> |
||||
<fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}"> |
||||
<filename name="**/*.java"/> |
||||
</fileset> |
||||
<fileset dir="${build.generated.sources.dir}" erroronmissingdir="false"> |
||||
<include name="**/*.java"/> |
||||
</fileset> |
||||
</javadoc> |
||||
<copy todir="${dist.javadoc.dir}"> |
||||
<fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}"> |
||||
<filename name="**/doc-files/**"/> |
||||
</fileset> |
||||
<fileset dir="${build.generated.sources.dir}" erroronmissingdir="false"> |
||||
<include name="**/doc-files/**"/> |
||||
</fileset> |
||||
</copy> |
||||
</target> |
||||
<target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview"> |
||||
<nbbrowse file="${dist.javadoc.dir}/index.html"/> |
||||
</target> |
||||
<target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/> |
||||
<!-- |
||||
========================= |
||||
JUNIT COMPILATION SECTION |
||||
========================= |
||||
--> |
||||
<target depends="init,compile" if="have.tests" name="-pre-pre-compile-test"> |
||||
<mkdir dir="${build.test.classes.dir}"/> |
||||
</target> |
||||
<target name="-pre-compile-test"> |
||||
<!-- Empty placeholder for easier customization. --> |
||||
<!-- You can override this target in the ../build.xml file. --> |
||||
</target> |
||||
<target if="do.depend.true" name="-compile-test-depend"> |
||||
<j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir=""/> |
||||
</target> |
||||
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test"> |
||||
<j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir=""/> |
||||
<copy todir="${build.test.classes.dir}"/> |
||||
</target> |
||||
<target name="-post-compile-test"> |
||||
<!-- Empty placeholder for easier customization. --> |
||||
<!-- You can override this target in the ../build.xml file. --> |
||||
</target> |
||||
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/> |
||||
<target name="-pre-compile-test-single"> |
||||
<!-- Empty placeholder for easier customization. --> |
||||
<!-- You can override this target in the ../build.xml file. --> |
||||
</target> |
||||
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single"> |
||||
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail> |
||||
<j2seproject3:force-recompile destdir="${build.test.classes.dir}"/> |
||||
<j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="" srcdir=""/> |
||||
<copy todir="${build.test.classes.dir}"/> |
||||
</target> |
||||
<target name="-post-compile-test-single"> |
||||
<!-- Empty placeholder for easier customization. --> |
||||
<!-- You can override this target in the ../build.xml file. --> |
||||
</target> |
||||
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/> |
||||
<!-- |
||||
======================= |
||||
JUNIT EXECUTION SECTION |
||||
======================= |
||||
--> |
||||
<target depends="init" if="have.tests" name="-pre-test-run"> |
||||
<mkdir dir="${build.test.results.dir}"/> |
||||
</target> |
||||
<target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run"> |
||||
<j2seproject3:junit testincludes="**/*Test.java"/> |
||||
</target> |
||||
<target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run"> |
||||
<fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail> |
||||
</target> |
||||
<target depends="init" if="have.tests" name="test-report"/> |
||||
<target depends="init" if="netbeans.home+have.tests" name="-test-browse"/> |
||||
<target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/> |
||||
<target depends="init" if="have.tests" name="-pre-test-run-single"> |
||||
<mkdir dir="${build.test.results.dir}"/> |
||||
</target> |
||||
<target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single"> |
||||
<fail unless="test.includes">Must select some files in the IDE or set test.includes</fail> |
||||
<j2seproject3:junit excludes="" includes="${test.includes}"/> |
||||
</target> |
||||
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single"> |
||||
<fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail> |
||||
</target> |
||||
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/> |
||||
<!-- |
||||
======================= |
||||
JUNIT DEBUGGING SECTION |
||||
======================= |
||||
--> |
||||
<target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test"> |
||||
<fail unless="test.class">Must select one file in the IDE or set test.class</fail> |
||||
<property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/> |
||||
<delete file="${test.report.file}"/> |
||||
<mkdir dir="${build.test.results.dir}"/> |
||||
<j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}"> |
||||
<customize> |
||||
<syspropertyset> |
||||
<propertyref prefix="test-sys-prop."/> |
||||
<mapper from="test-sys-prop.*" to="*" type="glob"/> |
||||
</syspropertyset> |
||||
<arg value="${test.class}"/> |
||||
<arg value="showoutput=true"/> |
||||
<arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/> |
||||
<arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/> |
||||
</customize> |
||||
</j2seproject3:debug> |
||||
</target> |
||||
<target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test"> |
||||
<j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/> |
||||
</target> |
||||
<target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/> |
||||
<target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test"> |
||||
<j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/> |
||||
</target> |
||||
<target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/> |
||||
<!-- |
||||
========================= |
||||
APPLET EXECUTION SECTION |
||||
========================= |
||||
--> |
||||
<target depends="init,compile-single" name="run-applet"> |
||||
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail> |
||||
<j2seproject1:java classname="sun.applet.AppletViewer"> |
||||
<customize> |
||||
<arg value="${applet.url}"/> |
||||
</customize> |
||||
</j2seproject1:java> |
||||
</target> |
||||
<!-- |
||||
========================= |
||||
APPLET DEBUGGING SECTION |
||||
========================= |
||||
--> |
||||
<target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet"> |
||||
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail> |
||||
<j2seproject3:debug classname="sun.applet.AppletViewer"> |
||||
<customize> |
||||
<arg value="${applet.url}"/> |
||||
</customize> |
||||
</j2seproject3:debug> |
||||
</target> |
||||
<target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/> |
||||
<!-- |
||||
=============== |
||||
CLEANUP SECTION |
||||
=============== |
||||
--> |
||||
<target name="-deps-clean-init" unless="built-clean.properties"> |
||||
<property location="${build.dir}/built-clean.properties" name="built-clean.properties"/> |
||||
<delete file="${built-clean.properties}" quiet="true"/> |
||||
</target> |
||||
<target if="already.built.clean.${basedir}" name="-warn-already-built-clean"> |
||||
<echo level="warn" message="Cycle detected: JME3TestsTemplate was already built"/> |
||||
</target> |
||||
<target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps"> |
||||
<mkdir dir="${build.dir}"/> |
||||
<touch file="${built-clean.properties}" verbose="false"/> |
||||
<property file="${built-clean.properties}" prefix="already.built.clean."/> |
||||
<antcall target="-warn-already-built-clean"/> |
||||
<propertyfile file="${built-clean.properties}"> |
||||
<entry key="${basedir}" value=""/> |
||||
</propertyfile> |
||||
</target> |
||||
<target depends="init" name="-do-clean"> |
||||
<delete dir="${build.dir}"/> |
||||
<delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/> |
||||
</target> |
||||
<target name="-post-clean"> |
||||
<!-- Empty placeholder for easier customization. --> |
||||
<!-- You can override this target in the ../build.xml file. --> |
||||
</target> |
||||
<target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/> |
||||
<target name="-check-call-dep"> |
||||
<property file="${call.built.properties}" prefix="already.built."/> |
||||
<condition property="should.call.dep"> |
||||
<not> |
||||
<isset property="already.built.${call.subproject}"/> |
||||
</not> |
||||
</condition> |
||||
</target> |
||||
<target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep"> |
||||
<ant antfile="${call.script}" inheritall="false" target="${call.target}"> |
||||
<propertyset> |
||||
<propertyref prefix="transfer."/> |
||||
<mapper from="transfer.*" to="*" type="glob"/> |
||||
</propertyset> |
||||
</ant> |
||||
</target> |
||||
</project> |
@ -0,0 +1,8 @@ |
||||
build.xml.data.CRC32=3af791c6 |
||||
build.xml.script.CRC32=fc2bfcc3 |
||||
build.xml.stylesheet.CRC32=8064a381@1.80.1.48 |
||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. |
||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. |
||||
nbproject/build-impl.xml.data.CRC32=0f706f4a |
||||
nbproject/build-impl.xml.script.CRC32=46d1a69a |
||||
nbproject/build-impl.xml.stylesheet.CRC32=0ae3a408@1.44.1.45 |
@ -0,0 +1,84 @@ |
||||
application.title=JME3TestsTemplate |
||||
application.vendor=jMonkeyEngine |
||||
build.classes.dir=${build.dir}/classes |
||||
build.classes.excludes=**/*.java,**/*.form |
||||
# This directory is removed when the project is cleaned: |
||||
build.dir=build |
||||
build.generated.dir=${build.dir}/generated |
||||
build.generated.sources.dir=${build.dir}/generated-sources |
||||
# Only compile against the classpath explicitly listed here: |
||||
build.sysclasspath=ignore |
||||
build.test.classes.dir=${build.dir}/test/classes |
||||
build.test.results.dir=${build.dir}/test/results |
||||
# Uncomment to specify the preferred debugger connection transport: |
||||
#debug.transport=dt_socket |
||||
debug.classpath=\ |
||||
${run.classpath} |
||||
debug.test.classpath=\ |
||||
${run.test.classpath} |
||||
# This directory is removed when the project is cleaned: |
||||
dist.dir=dist |
||||
dist.jar=${dist.dir}/JME3TestsTemplate.jar |
||||
dist.javadoc.dir=${dist.dir}/javadoc |
||||
endorsed.classpath= |
||||
excludes= |
||||
includes=** |
||||
jar.compress=false |
||||
javac.classpath=\ |
||||
${libs.jme3-jogg.classpath}:\ |
||||
${libs.jme3-blender.classpath}:\ |
||||
${libs.jme3-networking.classpath}:\ |
||||
${libs.jme3-plugins.classpath}:\ |
||||
${libs.jme3-core.classpath}:\ |
||||
${libs.jme3-desktop.classpath}:\ |
||||
${libs.jme3-lwjgl.classpath}:\ |
||||
${libs.jme3-niftygui.classpath}:\ |
||||
${libs.jme3-effects.classpath}:\ |
||||
${libs.jme3-terrain.classpath}:\ |
||||
${libs.jme3-bullet.classpath}:\ |
||||
${libs.jme3-bullet-native.classpath}:\ |
||||
${libs.jme3-test-data.classpath} |
||||
# Space-separated list of extra javac options |
||||
javac.compilerargs= |
||||
javac.deprecation=false |
||||
javac.source=1.7 |
||||
javac.target=1.7 |
||||
javac.test.classpath=\ |
||||
${javac.classpath}:\ |
||||
${build.classes.dir} |
||||
javadoc.additionalparam= |
||||
javadoc.author=false |
||||
javadoc.encoding=${source.encoding} |
||||
javadoc.noindex=false |
||||
javadoc.nonavbar=false |
||||
javadoc.notree=false |
||||
javadoc.private=false |
||||
javadoc.splitindex=true |
||||
javadoc.use=true |
||||
javadoc.version=false |
||||
javadoc.windowtitle= |
||||
jaxbwiz.endorsed.dirs="${netbeans.home}/../ide12/modules/ext/jaxb/api" |
||||
jnlp.applet.class=jme3test.awt.TestApplet |
||||
jnlp.applet.height=300 |
||||
jnlp.applet.width=300 |
||||
jnlp.codebase.type=local |
||||
jnlp.descriptor=application |
||||
jnlp.enabled=false |
||||
jnlp.offline-allowed=false |
||||
jnlp.signed=false |
||||
main.class=jme3test.TestChooser |
||||
manifest.file=manifest.mf |
||||
meta.inf.dir=${src.dir}/META-INF |
||||
platform.active=default_platform |
||||
run.classpath=\ |
||||
${javac.classpath}:\ |
||||
${build.classes.dir} |
||||
# Space-separated list of JVM arguments used when running the project |
||||
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value |
||||
# or test-sys-prop.name=value to set system properties for unit tests): |
||||
run.jvmargs= |
||||
run.test.classpath=\ |
||||
${javac.test.classpath}:\ |
||||
${build.test.classes.dir} |
||||
source.encoding=UTF-8 |
||||
src.dir=src |
@ -0,0 +1,13 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://www.netbeans.org/ns/project/1"> |
||||
<type>org.netbeans.modules.java.j2seproject</type> |
||||
<configuration> |
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3"> |
||||
<name>JmeTests</name> |
||||
<source-roots> |
||||
<root id="src.dir" name="JME3 Examples"/> |
||||
</source-roots> |
||||
<test-roots/> |
||||
</data> |
||||
</configuration> |
||||
</project> |
@ -0,0 +1,2 @@ |
||||
Manifest-Version: 1.0 |
||||
|
@ -0,0 +1,504 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test; |
||||
|
||||
import com.jme3.app.LegacyApplication; |
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.system.JmeContext; |
||||
import java.awt.*; |
||||
import java.awt.event.*; |
||||
import java.io.File; |
||||
import java.io.FileFilter; |
||||
import java.io.IOException; |
||||
import java.io.UnsupportedEncodingException; |
||||
import java.lang.reflect.Field; |
||||
import java.lang.reflect.InvocationTargetException; |
||||
import java.lang.reflect.Method; |
||||
import java.net.JarURLConnection; |
||||
import java.net.URL; |
||||
import java.net.URLConnection; |
||||
import java.net.URLDecoder; |
||||
import java.util.Collection; |
||||
import java.util.Enumeration; |
||||
import java.util.Vector; |
||||
import java.util.jar.JarFile; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
import java.util.zip.ZipEntry; |
||||
import javax.swing.*; |
||||
import javax.swing.border.EmptyBorder; |
||||
import javax.swing.event.DocumentEvent; |
||||
import javax.swing.event.DocumentListener; |
||||
import javax.swing.event.ListSelectionEvent; |
||||
import javax.swing.event.ListSelectionListener; |
||||
|
||||
|
||||
/** |
||||
* Class with a main method that displays a dialog to choose any jME demo to be |
||||
* started. |
||||
*/ |
||||
public class TestChooser extends JDialog { |
||||
private static final Logger logger = Logger.getLogger(TestChooser.class |
||||
.getName()); |
||||
|
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
/** |
||||
* Only accessed from EDT |
||||
*/ |
||||
private java.util.List selectedClass = null; |
||||
private boolean showSetting = true; |
||||
|
||||
/** |
||||
* Constructs a new TestChooser that is initially invisible. |
||||
*/ |
||||
public TestChooser() throws HeadlessException { |
||||
super((JFrame) null, "TestChooser"); |
||||
/** This listener ends application when window is closed (x button on top right corner of test chooser). |
||||
* @see issue#85 https://github.com/jMonkeyEngine/jmonkeyengine/issues/85
|
||||
*/ |
||||
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); |
||||
} |
||||
|
||||
/** |
||||
* @param classes |
||||
* vector that receives the found classes |
||||
* @return classes vector, list of all the classes in a given package (must |
||||
* be found in classpath). |
||||
*/ |
||||
protected Vector<Class> find(String pckgname, boolean recursive, |
||||
Vector<Class> classes) { |
||||
URL url; |
||||
|
||||
// Translate the package name into an absolute path
|
||||
String name = pckgname; |
||||
if (!name.startsWith("/")) { |
||||
name = "/" + name; |
||||
} |
||||
name = name.replace('.', '/'); |
||||
|
||||
// Get a File object for the package
|
||||
// URL url = UPBClassLoader.get().getResource(name);
|
||||
url = this.getClass().getResource(name); |
||||
// URL url = ClassLoader.getSystemClassLoader().getResource(name);
|
||||
pckgname = pckgname + "."; |
||||
|
||||
File directory; |
||||
try { |
||||
directory = new File(URLDecoder.decode(url.getFile(), "UTF-8")); |
||||
} catch (UnsupportedEncodingException e) { |
||||
throw new RuntimeException(e); // should never happen
|
||||
} |
||||
|
||||
if (directory.exists()) { |
||||
logger.fine("Searching for Demo classes in \"" |
||||
+ directory.getName() + "\"."); |
||||
addAllFilesInDirectory(directory, classes, pckgname, recursive); |
||||
} else { |
||||
try { |
||||
// It does not work with the filesystem: we must
|
||||
// be in the case of a package contained in a jar file.
|
||||
logger.fine("Searching for Demo classes in \"" + url + "\"."); |
||||
URLConnection urlConnection = url.openConnection(); |
||||
if (urlConnection instanceof JarURLConnection) { |
||||
JarURLConnection conn = (JarURLConnection) urlConnection; |
||||
|
||||
JarFile jfile = conn.getJarFile(); |
||||
Enumeration e = jfile.entries(); |
||||
while (e.hasMoreElements()) { |
||||
ZipEntry entry = (ZipEntry) e.nextElement(); |
||||
Class result = load(entry.getName()); |
||||
if (result != null && !classes.contains(result)) { |
||||
classes.add(result); |
||||
} |
||||
} |
||||
} |
||||
} catch (IOException e) { |
||||
logger.logp(Level.SEVERE, this.getClass().toString(), |
||||
"find(pckgname, recursive, classes)", "Exception", e); |
||||
} catch (Exception e) { |
||||
logger.logp(Level.SEVERE, this.getClass().toString(), |
||||
"find(pckgname, recursive, classes)", "Exception", e); |
||||
} |
||||
} |
||||
return classes; |
||||
} |
||||
|
||||
/** |
||||
* Load a class specified by a file- or entry-name |
||||
* |
||||
* @param name |
||||
* name of a file or entry |
||||
* @return class file that was denoted by the name, null if no class or does |
||||
* not contain a main method |
||||
*/ |
||||
private Class load(String name) { |
||||
if (name.endsWith(".class") |
||||
&& name.indexOf("Test") >= 0 |
||||
&& name.indexOf('$') < 0) { |
||||
String classname = name.substring(0, name.length() |
||||
- ".class".length()); |
||||
|
||||
if (classname.startsWith("/")) { |
||||
classname = classname.substring(1); |
||||
} |
||||
classname = classname.replace('/', '.'); |
||||
|
||||
try { |
||||
final Class<?> cls = Class.forName(classname); |
||||
cls.getMethod("main", new Class[] { String[].class }); |
||||
if (!getClass().equals(cls)) { |
||||
return cls; |
||||
} |
||||
} catch (NoClassDefFoundError e) { |
||||
// class has unresolved dependencies
|
||||
return null; |
||||
} catch (ClassNotFoundException e) { |
||||
// class not in classpath
|
||||
return null; |
||||
} catch (NoSuchMethodException e) { |
||||
// class does not have a main method
|
||||
return null; |
||||
} catch (UnsupportedClassVersionError e){ |
||||
// unsupported version
|
||||
return null; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* Used to descent in directories, loads classes via {@link #load} |
||||
* |
||||
* @param directory |
||||
* where to search for class files |
||||
* @param allClasses |
||||
* add loaded classes to this collection |
||||
* @param packageName |
||||
* current package name for the diven directory |
||||
* @param recursive |
||||
* true to descent into subdirectories |
||||
*/ |
||||
private void addAllFilesInDirectory(File directory, |
||||
Collection<Class> allClasses, String packageName, boolean recursive) { |
||||
// Get the list of the files contained in the package
|
||||
File[] files = directory.listFiles(getFileFilter()); |
||||
if (files != null) { |
||||
for (int i = 0; i < files.length; i++) { |
||||
// we are only interested in .class files
|
||||
if (files[i].isDirectory()) { |
||||
if (recursive) { |
||||
addAllFilesInDirectory(files[i], allClasses, |
||||
packageName + files[i].getName() + ".", true); |
||||
} |
||||
} else { |
||||
Class result = load(packageName + files[i].getName()); |
||||
if (result != null && !allClasses.contains(result)) { |
||||
allClasses.add(result); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* @return FileFilter for searching class files (no inner classes, only |
||||
* those with "Test" in the name) |
||||
*/ |
||||
private FileFilter getFileFilter() { |
||||
return new FileFilter() { |
||||
public boolean accept(File pathname) { |
||||
return (pathname.isDirectory() && !pathname.getName().startsWith(".")) |
||||
|| (pathname.getName().endsWith(".class") |
||||
&& (pathname.getName().indexOf("Test") >= 0) |
||||
&& pathname.getName().indexOf('$') < 0); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
private void startApp(final java.util.List appClass){ |
||||
if (appClass == null){ |
||||
JOptionPane.showMessageDialog(rootPane, |
||||
"Please select a test from the list", |
||||
"Error", |
||||
JOptionPane.ERROR_MESSAGE); |
||||
return; |
||||
} |
||||
|
||||
new Thread(new Runnable(){ |
||||
public void run(){ |
||||
for (int i = 0; i < appClass.size(); i++) { |
||||
Class<?> clazz = (Class)appClass.get(i); |
||||
try { |
||||
if (LegacyApplication.class.isAssignableFrom(clazz)) { |
||||
Object app = clazz.newInstance(); |
||||
if (app instanceof SimpleApplication) { |
||||
final Method settingMethod = clazz.getMethod("setShowSettings", boolean.class); |
||||
settingMethod.invoke(app, showSetting); |
||||
} |
||||
final Method mainMethod = clazz.getMethod("start"); |
||||
mainMethod.invoke(app); |
||||
Field contextField = LegacyApplication.class.getDeclaredField("context"); |
||||
contextField.setAccessible(true); |
||||
JmeContext context = null; |
||||
while (context == null) { |
||||
context = (JmeContext) contextField.get(app); |
||||
Thread.sleep(100); |
||||
} |
||||
while (!context.isCreated()) { |
||||
Thread.sleep(100); |
||||
} |
||||
while (context.isCreated()) { |
||||
Thread.sleep(100); |
||||
} |
||||
} else { |
||||
final Method mainMethod = clazz.getMethod("main", (new String[0]).getClass()); |
||||
mainMethod.invoke(clazz, new Object[]{new String[0]}); |
||||
} |
||||
// wait for destroy
|
||||
System.gc(); |
||||
} catch (IllegalAccessException ex) { |
||||
logger.log(Level.SEVERE, "Cannot access constructor: "+clazz.getName(), ex); |
||||
} catch (IllegalArgumentException ex) { |
||||
logger.log(Level.SEVERE, "main() had illegal argument: "+clazz.getName(), ex); |
||||
} catch (InvocationTargetException ex) { |
||||
logger.log(Level.SEVERE, "main() method had exception: "+clazz.getName(), ex); |
||||
} catch (InstantiationException ex) { |
||||
logger.log(Level.SEVERE, "Failed to create app: "+clazz.getName(), ex); |
||||
} catch (NoSuchMethodException ex){ |
||||
logger.log(Level.SEVERE, "Test class doesn't have main method: "+clazz.getName(), ex); |
||||
} catch (Exception ex) { |
||||
logger.log(Level.SEVERE, "Cannot start test: "+clazz.getName(), ex); |
||||
ex.printStackTrace(); |
||||
} |
||||
} |
||||
} |
||||
}).start(); |
||||
} |
||||
|
||||
/** |
||||
* Code to create components and action listeners. |
||||
* |
||||
* @param classes |
||||
* what Classes to show in the list box |
||||
*/ |
||||
private void setup(Vector<Class> classes) { |
||||
final JPanel mainPanel = new JPanel(); |
||||
mainPanel.setLayout(new BorderLayout()); |
||||
getContentPane().setLayout(new BorderLayout()); |
||||
getContentPane().add(mainPanel, BorderLayout.CENTER); |
||||
mainPanel.setBorder(new EmptyBorder(10, 10, 10, 10)); |
||||
|
||||
final FilteredJList list = new FilteredJList(); |
||||
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); |
||||
DefaultListModel model = new DefaultListModel(); |
||||
for (Class c : classes) { |
||||
model.addElement(c); |
||||
} |
||||
list.setModel(model); |
||||
|
||||
mainPanel.add(createSearchPanel(list), BorderLayout.NORTH); |
||||
mainPanel.add(new JScrollPane(list), BorderLayout.CENTER); |
||||
|
||||
list.getSelectionModel().addListSelectionListener( |
||||
new ListSelectionListener() { |
||||
public void valueChanged(ListSelectionEvent e) { |
||||
selectedClass = list.getSelectedValuesList(); |
||||
} |
||||
}); |
||||
list.addMouseListener(new MouseAdapter() { |
||||
public void mouseClicked(MouseEvent e) { |
||||
if (e.getClickCount() == 2 && selectedClass != null) { |
||||
startApp(selectedClass); |
||||
} |
||||
} |
||||
}); |
||||
list.addKeyListener(new KeyAdapter() { |
||||
@Override |
||||
public void keyTyped(KeyEvent e) { |
||||
if (e.getKeyCode() == KeyEvent.VK_ENTER) { |
||||
startApp(selectedClass); |
||||
} else if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { |
||||
dispose(); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
final JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); |
||||
mainPanel.add(buttonPanel, BorderLayout.PAGE_END); |
||||
|
||||
final JButton okButton = new JButton("Ok"); |
||||
okButton.setMnemonic('O'); |
||||
buttonPanel.add(okButton); |
||||
getRootPane().setDefaultButton(okButton); |
||||
okButton.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
startApp(selectedClass); |
||||
} |
||||
}); |
||||
|
||||
final JButton cancelButton = new JButton("Cancel"); |
||||
cancelButton.setMnemonic('C'); |
||||
buttonPanel.add(cancelButton); |
||||
cancelButton.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
dispose(); |
||||
} |
||||
}); |
||||
|
||||
pack(); |
||||
center(); |
||||
} |
||||
|
||||
private class FilteredJList extends JList { |
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
private String filter; |
||||
private ListModel originalModel; |
||||
|
||||
public void setModel(ListModel m) { |
||||
originalModel = m; |
||||
super.setModel(m); |
||||
} |
||||
|
||||
private void update() { |
||||
if (filter == null || filter.length() == 0) { |
||||
super.setModel(originalModel); |
||||
} |
||||
|
||||
DefaultListModel v = new DefaultListModel(); |
||||
for (int i = 0; i < originalModel.getSize(); i++) { |
||||
Object o = originalModel.getElementAt(i); |
||||
String s = String.valueOf(o).toLowerCase(); |
||||
if (s.contains(filter)) { |
||||
v.addElement(o); |
||||
} |
||||
} |
||||
super.setModel(v); |
||||
if (v.getSize() == 1) { |
||||
setSelectedIndex(0); |
||||
} |
||||
revalidate(); |
||||
} |
||||
|
||||
public String getFilter() { |
||||
return filter; |
||||
} |
||||
|
||||
public void setFilter(String filter) { |
||||
this.filter = filter.toLowerCase(); |
||||
update(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* center the frame. |
||||
*/ |
||||
private void center() { |
||||
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); |
||||
Dimension frameSize = this.getSize(); |
||||
if (frameSize.height > screenSize.height) { |
||||
frameSize.height = screenSize.height; |
||||
} |
||||
if (frameSize.width > screenSize.width) { |
||||
frameSize.width = screenSize.width; |
||||
} |
||||
this.setLocation((screenSize.width - frameSize.width) / 2, |
||||
(screenSize.height - frameSize.height) / 2); |
||||
} |
||||
|
||||
/** |
||||
* Start the chooser. |
||||
* |
||||
* @param args |
||||
* command line parameters |
||||
*/ |
||||
public static void main(final String[] args) { |
||||
try { |
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); |
||||
} catch (Exception e) { |
||||
} |
||||
new TestChooser().start(args); |
||||
} |
||||
|
||||
protected void start(String[] args) { |
||||
final Vector<Class> classes = new Vector<Class>(); |
||||
logger.fine("Composing Test list..."); |
||||
addDisplayedClasses(classes); |
||||
setup(classes); |
||||
Class<?> cls; |
||||
setVisible(true); |
||||
} |
||||
|
||||
protected void addDisplayedClasses(Vector<Class> classes) { |
||||
find("jme3test", true, classes); |
||||
} |
||||
|
||||
private JPanel createSearchPanel(final FilteredJList classes) { |
||||
JPanel search = new JPanel(); |
||||
search.setLayout(new BorderLayout()); |
||||
search.add(new JLabel("Choose a Demo to start: Find: "), |
||||
BorderLayout.WEST); |
||||
final javax.swing.JTextField jtf = new javax.swing.JTextField(); |
||||
jtf.getDocument().addDocumentListener(new DocumentListener() { |
||||
public void removeUpdate(DocumentEvent e) { |
||||
classes.setFilter(jtf.getText()); |
||||
} |
||||
|
||||
public void insertUpdate(DocumentEvent e) { |
||||
classes.setFilter(jtf.getText()); |
||||
} |
||||
|
||||
public void changedUpdate(DocumentEvent e) { |
||||
classes.setFilter(jtf.getText()); |
||||
} |
||||
}); |
||||
jtf.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
selectedClass = classes.getSelectedValuesList(); |
||||
startApp(selectedClass); |
||||
} |
||||
}); |
||||
final JCheckBox showSettingCheck = new JCheckBox("Show Setting"); |
||||
showSettingCheck.setSelected(true); |
||||
showSettingCheck.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
showSetting = showSettingCheck.isSelected(); |
||||
} |
||||
}); |
||||
jtf.setPreferredSize(new Dimension(100, 25)); |
||||
search.add(jtf, BorderLayout.CENTER); |
||||
search.add(showSettingCheck, BorderLayout.EAST); |
||||
return search; |
||||
} |
||||
} |
@ -0,0 +1,64 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.animation; |
||||
|
||||
import com.jme3.cinematic.events.GuiEvent; |
||||
import de.lessvoid.nifty.Nifty; |
||||
import de.lessvoid.nifty.elements.render.TextRenderer; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class SubtitleTrack extends GuiEvent{ |
||||
private String text=""; |
||||
|
||||
public SubtitleTrack(Nifty nifty, String screen,float initialDuration, String text) { |
||||
super(nifty, screen, initialDuration); |
||||
this.text=text; |
||||
} |
||||
|
||||
@Override |
||||
public void onPlay() { |
||||
super.onPlay(); |
||||
nifty.getScreen(screen).findElementById("text") |
||||
.getRenderer(TextRenderer.class).setText(text); |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
} |
@ -0,0 +1,208 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.animation; |
||||
|
||||
import com.jme3.animation.LoopMode; |
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.cinematic.MotionPath; |
||||
import com.jme3.cinematic.MotionPathListener; |
||||
import com.jme3.cinematic.events.MotionEvent; |
||||
import com.jme3.cinematic.events.MotionEvent; |
||||
import com.jme3.font.BitmapText; |
||||
import com.jme3.input.ChaseCamera; |
||||
import com.jme3.input.KeyInput; |
||||
import com.jme3.input.controls.ActionListener; |
||||
import com.jme3.input.controls.KeyTrigger; |
||||
import com.jme3.light.DirectionalLight; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.ColorRGBA; |
||||
import com.jme3.math.Spline.SplineType; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.CameraNode; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.Spatial; |
||||
import com.jme3.scene.control.CameraControl.ControlDirection; |
||||
import com.jme3.scene.shape.Box; |
||||
|
||||
public class TestCameraMotionPath extends SimpleApplication { |
||||
|
||||
private Spatial teapot; |
||||
private boolean active = true; |
||||
private boolean playing = false; |
||||
private MotionPath path; |
||||
private MotionEvent cameraMotionControl; |
||||
private ChaseCamera chaser; |
||||
private CameraNode camNode; |
||||
|
||||
public static void main(String[] args) { |
||||
TestCameraMotionPath app = new TestCameraMotionPath(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
createScene(); |
||||
cam.setLocation(new Vector3f(8.4399185f, 11.189463f, 14.267577f)); |
||||
camNode = new CameraNode("Motion cam", cam); |
||||
camNode.setControlDir(ControlDirection.SpatialToCamera); |
||||
camNode.setEnabled(false); |
||||
path = new MotionPath(); |
||||
path.setCycle(true); |
||||
path.addWayPoint(new Vector3f(20, 3, 0)); |
||||
path.addWayPoint(new Vector3f(0, 3, 20)); |
||||
path.addWayPoint(new Vector3f(-20, 3, 0)); |
||||
path.addWayPoint(new Vector3f(0, 3, -20)); |
||||
path.setCurveTension(0.83f); |
||||
path.enableDebugShape(assetManager, rootNode); |
||||
|
||||
cameraMotionControl = new MotionEvent(camNode, path); |
||||
cameraMotionControl.setLoopMode(LoopMode.Loop); |
||||
//cameraMotionControl.setDuration(15f);
|
||||
cameraMotionControl.setLookAt(teapot.getWorldTranslation(), Vector3f.UNIT_Y); |
||||
cameraMotionControl.setDirectionType(MotionEvent.Direction.LookAt); |
||||
|
||||
rootNode.attachChild(camNode); |
||||
|
||||
guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt"); |
||||
final BitmapText wayPointsText = new BitmapText(guiFont, false); |
||||
wayPointsText.setSize(guiFont.getCharSet().getRenderedSize()); |
||||
|
||||
guiNode.attachChild(wayPointsText); |
||||
|
||||
path.addListener(new MotionPathListener() { |
||||
|
||||
public void onWayPointReach(MotionEvent control, int wayPointIndex) { |
||||
if (path.getNbWayPoints() == wayPointIndex + 1) { |
||||
wayPointsText.setText(control.getSpatial().getName() + " Finish!!! "); |
||||
} else { |
||||
wayPointsText.setText(control.getSpatial().getName() + " Reached way point " + wayPointIndex); |
||||
} |
||||
wayPointsText.setLocalTranslation((cam.getWidth() - wayPointsText.getLineWidth()) / 2, cam.getHeight(), 0); |
||||
} |
||||
}); |
||||
|
||||
flyCam.setEnabled(false); |
||||
chaser = new ChaseCamera(cam, teapot); |
||||
chaser.registerWithInput(inputManager); |
||||
chaser.setSmoothMotion(true); |
||||
chaser.setMaxDistance(50); |
||||
chaser.setDefaultDistance(50); |
||||
initInputs(); |
||||
|
||||
} |
||||
|
||||
private void createScene() { |
||||
Material mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); |
||||
mat.setFloat("Shininess", 1f); |
||||
mat.setBoolean("UseMaterialColors", true); |
||||
mat.setColor("Ambient", ColorRGBA.Black); |
||||
mat.setColor("Diffuse", ColorRGBA.DarkGray); |
||||
mat.setColor("Specular", ColorRGBA.White.mult(0.6f)); |
||||
Material matSoil = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); |
||||
matSoil.setBoolean("UseMaterialColors", true); |
||||
matSoil.setColor("Ambient", ColorRGBA.Gray); |
||||
matSoil.setColor("Diffuse", ColorRGBA.Gray); |
||||
matSoil.setColor("Specular", ColorRGBA.Black); |
||||
teapot = assetManager.loadModel("Models/Teapot/Teapot.obj"); |
||||
teapot.setLocalScale(3); |
||||
teapot.setMaterial(mat); |
||||
|
||||
|
||||
|
||||
rootNode.attachChild(teapot); |
||||
Geometry soil = new Geometry("soil", new Box(50, 1, 50)); |
||||
soil.setLocalTranslation(0, -1, 0); |
||||
soil.setMaterial(matSoil); |
||||
rootNode.attachChild(soil); |
||||
DirectionalLight light = new DirectionalLight(); |
||||
light.setDirection(new Vector3f(0, -1, 0).normalizeLocal()); |
||||
light.setColor(ColorRGBA.White.mult(1.5f)); |
||||
rootNode.addLight(light); |
||||
} |
||||
|
||||
private void initInputs() { |
||||
inputManager.addMapping("display_hidePath", new KeyTrigger(KeyInput.KEY_P)); |
||||
inputManager.addMapping("SwitchPathInterpolation", new KeyTrigger(KeyInput.KEY_I)); |
||||
inputManager.addMapping("tensionUp", new KeyTrigger(KeyInput.KEY_U)); |
||||
inputManager.addMapping("tensionDown", new KeyTrigger(KeyInput.KEY_J)); |
||||
inputManager.addMapping("play_stop", new KeyTrigger(KeyInput.KEY_SPACE)); |
||||
ActionListener acl = new ActionListener() { |
||||
|
||||
public void onAction(String name, boolean keyPressed, float tpf) { |
||||
if (name.equals("display_hidePath") && keyPressed) { |
||||
if (active) { |
||||
active = false; |
||||
path.disableDebugShape(); |
||||
} else { |
||||
active = true; |
||||
path.enableDebugShape(assetManager, rootNode); |
||||
} |
||||
} |
||||
if (name.equals("play_stop") && keyPressed) { |
||||
if (playing) { |
||||
playing = false; |
||||
cameraMotionControl.stop(); |
||||
chaser.setEnabled(true); |
||||
camNode.setEnabled(false); |
||||
} else { |
||||
playing = true; |
||||
chaser.setEnabled(false); |
||||
camNode.setEnabled(true); |
||||
cameraMotionControl.play(); |
||||
} |
||||
} |
||||
|
||||
if (name.equals("SwitchPathInterpolation") && keyPressed) { |
||||
if (path.getPathSplineType() == SplineType.CatmullRom) { |
||||
path.setPathSplineType(SplineType.Linear); |
||||
} else { |
||||
path.setPathSplineType(SplineType.CatmullRom); |
||||
} |
||||
} |
||||
|
||||
if (name.equals("tensionUp") && keyPressed) { |
||||
path.setCurveTension(path.getCurveTension() + 0.1f); |
||||
System.err.println("Tension : " + path.getCurveTension()); |
||||
} |
||||
if (name.equals("tensionDown") && keyPressed) { |
||||
path.setCurveTension(path.getCurveTension() - 0.1f); |
||||
System.err.println("Tension : " + path.getCurveTension()); |
||||
} |
||||
|
||||
|
||||
} |
||||
}; |
||||
|
||||
inputManager.addListener(acl, "display_hidePath", "play_stop", "SwitchPathInterpolation", "tensionUp", "tensionDown"); |
||||
|
||||
} |
||||
} |
@ -0,0 +1,337 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.animation; |
||||
|
||||
import com.jme3.animation.AnimControl; |
||||
import com.jme3.animation.AnimationFactory; |
||||
import com.jme3.animation.LoopMode; |
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.cinematic.Cinematic; |
||||
import com.jme3.cinematic.MotionPath; |
||||
import com.jme3.cinematic.PlayState; |
||||
import com.jme3.cinematic.events.*; |
||||
import com.jme3.font.BitmapText; |
||||
import com.jme3.input.ChaseCamera; |
||||
import com.jme3.input.controls.ActionListener; |
||||
import com.jme3.input.controls.KeyTrigger; |
||||
import com.jme3.light.DirectionalLight; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.ColorRGBA; |
||||
import com.jme3.math.FastMath; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.niftygui.NiftyJmeDisplay; |
||||
import com.jme3.post.FilterPostProcessor; |
||||
import com.jme3.post.filters.FadeFilter; |
||||
import com.jme3.renderer.Caps; |
||||
import com.jme3.renderer.queue.RenderQueue.ShadowMode; |
||||
import com.jme3.scene.CameraNode; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.Spatial; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.shadow.DirectionalLightShadowRenderer; |
||||
import de.lessvoid.nifty.Nifty; |
||||
|
||||
public class TestCinematic extends SimpleApplication { |
||||
|
||||
private Spatial model; |
||||
private Spatial teapot; |
||||
private MotionPath path; |
||||
private MotionEvent cameraMotionEvent; |
||||
private Cinematic cinematic; |
||||
private ChaseCamera chaseCam; |
||||
private FilterPostProcessor fpp; |
||||
private FadeFilter fade; |
||||
private float time = 0; |
||||
|
||||
public static void main(String[] args) { |
||||
TestCinematic app = new TestCinematic(); |
||||
app.start(); |
||||
|
||||
|
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
//just some text
|
||||
NiftyJmeDisplay niftyDisplay = new NiftyJmeDisplay(getAssetManager(), |
||||
getInputManager(), |
||||
getAudioRenderer(), |
||||
getGuiViewPort()); |
||||
Nifty nifty; |
||||
nifty = niftyDisplay.getNifty(); |
||||
nifty.fromXmlWithoutStartScreen("Interface/Nifty/CinematicTest.xml"); |
||||
getGuiViewPort().addProcessor(niftyDisplay); |
||||
guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt"); |
||||
final BitmapText text = new BitmapText(guiFont, false); |
||||
text.setSize(guiFont.getCharSet().getRenderedSize()); |
||||
text.setText("Press enter to play/pause cinematic"); |
||||
text.setLocalTranslation((cam.getWidth() - text.getLineWidth()) / 2, cam.getHeight(), 0); |
||||
guiNode.attachChild(text); |
||||
|
||||
|
||||
createScene(); |
||||
|
||||
cinematic = new Cinematic(rootNode, 20); |
||||
stateManager.attach(cinematic); |
||||
|
||||
createCameraMotion(); |
||||
|
||||
//creating spatial animation for the teapot
|
||||
AnimationFactory factory = new AnimationFactory(20, "teapotAnim"); |
||||
factory.addTimeTranslation(0, new Vector3f(10, 0, 10)); |
||||
factory.addTimeTranslation(20, new Vector3f(10, 0, -10)); |
||||
factory.addTimeScale(10, new Vector3f(4, 4, 4)); |
||||
factory.addTimeScale(20, new Vector3f(1, 1, 1)); |
||||
factory.addTimeRotationAngles(20, 0, 4 * FastMath.TWO_PI, 0); |
||||
AnimControl control = new AnimControl(); |
||||
control.addAnim(factory.buildAnimation()); |
||||
teapot.addControl(control); |
||||
|
||||
//fade in
|
||||
cinematic.addCinematicEvent(0, new FadeEvent(true)); |
||||
// cinematic.activateCamera(0, "aroundCam");
|
||||
cinematic.addCinematicEvent(0, new AnimationEvent(teapot, "teapotAnim", LoopMode.DontLoop)); |
||||
cinematic.addCinematicEvent(0, cameraMotionEvent); |
||||
cinematic.addCinematicEvent(0, new SoundEvent("Sound/Environment/Nature.ogg", LoopMode.Loop)); |
||||
cinematic.addCinematicEvent(3f, new SoundEvent("Sound/Effects/kick.wav")); |
||||
cinematic.addCinematicEvent(3, new SubtitleTrack(nifty, "start", 3, "jMonkey engine really kicks A...")); |
||||
cinematic.addCinematicEvent(5.1f, new SoundEvent("Sound/Effects/Beep.ogg", 1)); |
||||
cinematic.addCinematicEvent(2, new AnimationEvent(model, "Walk", LoopMode.Loop)); |
||||
cinematic.activateCamera(0, "topView"); |
||||
// cinematic.activateCamera(10, "aroundCam");
|
||||
|
||||
//fade out
|
||||
cinematic.addCinematicEvent(19, new FadeEvent(false)); |
||||
// cinematic.addCinematicEvent(19, new AbstractCinematicEvent() {
|
||||
//
|
||||
// @Override
|
||||
// public void onPlay() {
|
||||
// fade.setDuration(1f / cinematic.getSpeed());
|
||||
// fade.fadeOut();
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onUpdate(float tpf) {
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onStop() {
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onPause() {
|
||||
// }
|
||||
// });
|
||||
|
||||
cinematic.addListener(new CinematicEventListener() { |
||||
|
||||
public void onPlay(CinematicEvent cinematic) { |
||||
chaseCam.setEnabled(false); |
||||
System.out.println("play"); |
||||
} |
||||
|
||||
public void onPause(CinematicEvent cinematic) { |
||||
System.out.println("pause"); |
||||
} |
||||
|
||||
public void onStop(CinematicEvent cinematic) { |
||||
chaseCam.setEnabled(true); |
||||
fade.setValue(1); |
||||
System.out.println("stop"); |
||||
} |
||||
}); |
||||
|
||||
//cinematic.setSpeed(2);
|
||||
flyCam.setEnabled(false); |
||||
chaseCam = new ChaseCamera(cam, model, inputManager); |
||||
initInputs(); |
||||
|
||||
} |
||||
|
||||
private void createCameraMotion() { |
||||
|
||||
CameraNode camNode = cinematic.bindCamera("topView", cam); |
||||
camNode.setLocalTranslation(new Vector3f(0, 50, 0)); |
||||
camNode.lookAt(teapot.getLocalTranslation(), Vector3f.UNIT_Y); |
||||
|
||||
CameraNode camNode2 = cinematic.bindCamera("aroundCam", cam); |
||||
path = new MotionPath(); |
||||
path.setCycle(true); |
||||
path.addWayPoint(new Vector3f(20, 3, 0)); |
||||
path.addWayPoint(new Vector3f(0, 3, 20)); |
||||
path.addWayPoint(new Vector3f(-20, 3, 0)); |
||||
path.addWayPoint(new Vector3f(0, 3, -20)); |
||||
path.setCurveTension(0.83f); |
||||
cameraMotionEvent = new MotionEvent(camNode2, path); |
||||
cameraMotionEvent.setLoopMode(LoopMode.Loop); |
||||
cameraMotionEvent.setLookAt(model.getWorldTranslation(), Vector3f.UNIT_Y); |
||||
cameraMotionEvent.setDirectionType(MotionEvent.Direction.LookAt); |
||||
|
||||
} |
||||
|
||||
private void createScene() { |
||||
|
||||
model = (Spatial) assetManager.loadModel("Models/Oto/Oto.mesh.xml"); |
||||
model.center(); |
||||
model.setShadowMode(ShadowMode.CastAndReceive); |
||||
rootNode.attachChild(model); |
||||
|
||||
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat.setColor("Color", ColorRGBA.Cyan); |
||||
|
||||
teapot = assetManager.loadModel("Models/Teapot/Teapot.obj"); |
||||
teapot.setLocalTranslation(10, 0, 10); |
||||
teapot.setMaterial(mat); |
||||
teapot.setShadowMode(ShadowMode.CastAndReceive); |
||||
rootNode.attachChild(teapot); |
||||
|
||||
Material matSoil = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); |
||||
matSoil.setBoolean("UseMaterialColors", true); |
||||
matSoil.setColor("Ambient", ColorRGBA.Gray); |
||||
matSoil.setColor("Diffuse", ColorRGBA.Green); |
||||
matSoil.setColor("Specular", ColorRGBA.Black); |
||||
|
||||
Geometry soil = new Geometry("soil", new Box(50, 1, 50)); |
||||
soil.setLocalTranslation(0, -6, 0); |
||||
soil.setMaterial(matSoil); |
||||
soil.setShadowMode(ShadowMode.Receive); |
||||
rootNode.attachChild(soil); |
||||
DirectionalLight light = new DirectionalLight(); |
||||
light.setDirection(new Vector3f(0, -1, -1).normalizeLocal()); |
||||
light.setColor(ColorRGBA.White.mult(1.5f)); |
||||
rootNode.addLight(light); |
||||
|
||||
fpp = new FilterPostProcessor(assetManager); |
||||
fade = new FadeFilter(); |
||||
fpp.addFilter(fade); |
||||
|
||||
if (renderer.getCaps().contains(Caps.GLSL100)) { |
||||
DirectionalLightShadowRenderer dlsr |
||||
= new DirectionalLightShadowRenderer(assetManager, 512, 1); |
||||
dlsr.setLight(light); |
||||
dlsr.setShadowIntensity(0.4f); |
||||
viewPort.addProcessor(dlsr); |
||||
viewPort.addProcessor(fpp); |
||||
} |
||||
} |
||||
|
||||
private void initInputs() { |
||||
inputManager.addMapping("togglePause", new KeyTrigger(keyInput.KEY_RETURN)); |
||||
inputManager.addMapping("navFwd", new KeyTrigger(keyInput.KEY_RIGHT)); |
||||
inputManager.addMapping("navBack", new KeyTrigger(keyInput.KEY_LEFT)); |
||||
ActionListener acl = new ActionListener() { |
||||
|
||||
public void onAction(String name, boolean keyPressed, float tpf) { |
||||
if (name.equals("togglePause") && keyPressed) { |
||||
if (cinematic.getPlayState() == PlayState.Playing) { |
||||
cinematic.pause(); |
||||
time = cinematic.getTime(); |
||||
} else { |
||||
cinematic.play(); |
||||
} |
||||
} |
||||
|
||||
if (cinematic.getPlayState() != PlayState.Playing) { |
||||
if (name.equals("navFwd") && keyPressed) { |
||||
time += 0.25; |
||||
FastMath.clamp(time, 0, cinematic.getInitialDuration()); |
||||
cinematic.setTime(time); |
||||
} |
||||
if (name.equals("navBack") && keyPressed) { |
||||
time -= 0.25; |
||||
FastMath.clamp(time, 0, cinematic.getInitialDuration()); |
||||
cinematic.setTime(time); |
||||
} |
||||
|
||||
} |
||||
} |
||||
}; |
||||
inputManager.addListener(acl, "togglePause", "navFwd", "navBack"); |
||||
} |
||||
|
||||
private class FadeEvent extends AbstractCinematicEvent { |
||||
|
||||
boolean in = true; |
||||
float value = 0; |
||||
|
||||
public FadeEvent(boolean in) { |
||||
super(1); |
||||
this.in = in; |
||||
value = in ? 0 : 1; |
||||
} |
||||
|
||||
@Override |
||||
public void onPlay() { |
||||
|
||||
fade.setDuration(1f / cinematic.getSpeed()); |
||||
if (in) { |
||||
fade.fadeIn(); |
||||
} else { |
||||
fade.fadeOut(); |
||||
} |
||||
fade.setValue(value); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setTime(float time) { |
||||
super.setTime(time); |
||||
if (time >= fade.getDuration()) { |
||||
value = in ? 1 : 0; |
||||
fade.setValue(value); |
||||
} else { |
||||
value = time; |
||||
if (in) { |
||||
fade.setValue(time / cinematic.getSpeed()); |
||||
} else { |
||||
fade.setValue(1 - time / cinematic.getSpeed()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void onUpdate(float tpf) { |
||||
} |
||||
|
||||
@Override |
||||
public void onStop() { |
||||
} |
||||
|
||||
@Override |
||||
public void onPause() { |
||||
value = fade.getValue(); |
||||
fade.pause(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,229 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.animation; |
||||
|
||||
import com.jme3.animation.AnimControl; |
||||
import com.jme3.animation.AnimationFactory; |
||||
import com.jme3.animation.LoopMode; |
||||
import com.jme3.app.DebugKeysAppState; |
||||
import com.jme3.app.FlyCamAppState; |
||||
import com.jme3.app.ResetStatsState; |
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.app.StatsAppState; |
||||
import com.jme3.cinematic.Cinematic; |
||||
import com.jme3.cinematic.MotionPath; |
||||
import com.jme3.cinematic.PlayState; |
||||
import com.jme3.cinematic.events.AnimationEvent; |
||||
import com.jme3.cinematic.events.MotionEvent; |
||||
import com.jme3.input.KeyInput; |
||||
import com.jme3.input.controls.ActionListener; |
||||
import com.jme3.input.controls.KeyTrigger; |
||||
import com.jme3.light.AmbientLight; |
||||
import com.jme3.light.PointLight; |
||||
import com.jme3.light.SpotLight; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.ColorRGBA; |
||||
import com.jme3.math.FastMath; |
||||
import com.jme3.math.Vector2f; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.post.FilterPostProcessor; |
||||
import com.jme3.post.filters.FXAAFilter; |
||||
import com.jme3.post.ssao.SSAOFilter; |
||||
import com.jme3.renderer.queue.RenderQueue; |
||||
import com.jme3.scene.CameraNode; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.Node; |
||||
import com.jme3.scene.shape.Quad; |
||||
import com.jme3.shadow.EdgeFilteringMode; |
||||
import com.jme3.shadow.SpotLightShadowRenderer; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class TestJaime extends SimpleApplication { |
||||
|
||||
|
||||
Cinematic cinematic; |
||||
|
||||
public static void main(String... argv){ |
||||
TestJaime app = new TestJaime(); |
||||
app.start(); |
||||
} |
||||
|
||||
|
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
stateManager.detach(stateManager.getState(FlyCamAppState.class)); |
||||
stateManager.detach(stateManager.getState(ResetStatsState.class)); |
||||
stateManager.detach(stateManager.getState(DebugKeysAppState.class)); |
||||
stateManager.detach(stateManager.getState(StatsAppState.class)); |
||||
final Node jaime = LoadModel(); |
||||
|
||||
setupLights(); |
||||
setupCamera(); |
||||
setupFloor(); |
||||
setupCinematic(jaime); |
||||
setupInput(); |
||||
} |
||||
|
||||
public Node LoadModel() { |
||||
Node jaime = (Node)assetManager.loadModel("Models/Jaime/Jaime.j3o"); |
||||
jaime.setShadowMode(RenderQueue.ShadowMode.CastAndReceive); |
||||
rootNode.attachChild(jaime); |
||||
return jaime; |
||||
} |
||||
|
||||
public void setupLights() { |
||||
AmbientLight al = new AmbientLight(); |
||||
al.setColor(new ColorRGBA(0.1f, 0.1f, 0.1f, 1)); |
||||
rootNode.addLight(al); |
||||
|
||||
SpotLight sl = new SpotLight(); |
||||
sl.setColor(ColorRGBA.White.mult(1.0f)); |
||||
sl.setPosition(new Vector3f(1.2074411f, 10.6868908f, 4.1489987f)); |
||||
sl.setDirection(sl.getPosition().mult(-1)); |
||||
sl.setSpotOuterAngle(0.1f); |
||||
sl.setSpotInnerAngle(0.004f); |
||||
rootNode.addLight(sl); |
||||
|
||||
//pointlight to fake indirect light coming from the ground
|
||||
PointLight pl = new PointLight(); |
||||
pl.setColor(ColorRGBA.White.mult(1.5f)); |
||||
pl.setPosition(new Vector3f(0, 0, 1)); |
||||
pl.setRadius(2); |
||||
rootNode.addLight(pl); |
||||
|
||||
SpotLightShadowRenderer shadows = new SpotLightShadowRenderer(assetManager, 1024); |
||||
shadows.setLight(sl); |
||||
shadows.setShadowIntensity(0.3f); |
||||
shadows.setEdgeFilteringMode(EdgeFilteringMode.PCF8); |
||||
viewPort.addProcessor(shadows); |
||||
|
||||
|
||||
FilterPostProcessor fpp = new FilterPostProcessor(assetManager); |
||||
SSAOFilter filter = new SSAOFilter(0.10997847f,0.440001f,0.39999998f,-0.008000026f);; |
||||
fpp.addFilter(filter); |
||||
fpp.addFilter(new FXAAFilter()); |
||||
fpp.addFilter(new FXAAFilter()); |
||||
|
||||
viewPort.addProcessor(fpp); |
||||
} |
||||
|
||||
public void setupCamera() { |
||||
flyCam.setEnabled(false); |
||||
} |
||||
|
||||
public void setupCinematic(final Node jaime) { |
||||
cinematic = new Cinematic(rootNode, 60); |
||||
stateManager.attach(cinematic); |
||||
|
||||
jaime.move(0, 0, -3); |
||||
AnimationFactory af = new AnimationFactory(0.7f, "JumpForward"); |
||||
af.addTimeTranslation(0, new Vector3f(0, 0, -3)); |
||||
af.addTimeTranslation(0.35f, new Vector3f(0, 1, -1.5f)); |
||||
af.addTimeTranslation(0.7f, new Vector3f(0, 0, 0)); |
||||
jaime.getControl(AnimControl.class).addAnim(af.buildAnimation()); |
||||
|
||||
cinematic.enqueueCinematicEvent(new AnimationEvent(jaime, "Idle",3, LoopMode.DontLoop)); |
||||
float jumpStart = cinematic.enqueueCinematicEvent(new AnimationEvent(jaime, "JumpStart", LoopMode.DontLoop)); |
||||
cinematic.addCinematicEvent(jumpStart+0.2f, new AnimationEvent(jaime, "JumpForward", LoopMode.DontLoop,1)); |
||||
cinematic.enqueueCinematicEvent( new AnimationEvent(jaime, "JumpEnd", LoopMode.DontLoop)); |
||||
cinematic.enqueueCinematicEvent( new AnimationEvent(jaime, "Punches", LoopMode.DontLoop)); |
||||
cinematic.enqueueCinematicEvent( new AnimationEvent(jaime, "SideKick", LoopMode.DontLoop)); |
||||
float camStart = cinematic.enqueueCinematicEvent( new AnimationEvent(jaime, "Taunt", LoopMode.DontLoop)); |
||||
cinematic.enqueueCinematicEvent( new AnimationEvent(jaime, "Idle",1, LoopMode.DontLoop)); |
||||
cinematic.enqueueCinematicEvent( new AnimationEvent(jaime, "Wave", LoopMode.DontLoop)); |
||||
cinematic.enqueueCinematicEvent( new AnimationEvent(jaime, "Idle", LoopMode.DontLoop)); |
||||
|
||||
CameraNode camNode = cinematic.bindCamera("cam", cam); |
||||
camNode.setLocalTranslation(new Vector3f(1.1f, 1.2f, 2.9f)); |
||||
camNode.lookAt(new Vector3f(0, 0.5f, 0), Vector3f.UNIT_Y); |
||||
|
||||
MotionPath path = new MotionPath(); |
||||
path.addWayPoint(new Vector3f(1.1f, 1.2f, 2.9f)); |
||||
path.addWayPoint(new Vector3f(0f, 1.2f, 3.0f)); |
||||
path.addWayPoint(new Vector3f(-1.1f, 1.2f, 2.9f)); |
||||
path.enableDebugShape(assetManager, rootNode); |
||||
path.setCurveTension(0.8f); |
||||
|
||||
MotionEvent camMotion = new MotionEvent(camNode, path,6); |
||||
camMotion.setDirectionType(MotionEvent.Direction.LookAt); |
||||
camMotion.setLookAt(new Vector3f(0, 0.5f, 0), Vector3f.UNIT_Y); |
||||
cinematic.addCinematicEvent(camStart, camMotion); |
||||
cinematic.activateCamera(0, "cam"); |
||||
|
||||
|
||||
cinematic.fitDuration(); |
||||
cinematic.setSpeed(1.2f); |
||||
cinematic.setLoopMode(LoopMode.Loop); |
||||
cinematic.play(); |
||||
} |
||||
|
||||
public void setupFloor() { |
||||
Quad q = new Quad(20, 20); |
||||
q.scaleTextureCoordinates(Vector2f.UNIT_XY.mult(10)); |
||||
Geometry geom = new Geometry("floor", q); |
||||
Material mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); |
||||
mat.setColor("Diffuse", ColorRGBA.White); |
||||
mat.setColor("Specular", ColorRGBA.White); |
||||
mat.setColor("Ambient", ColorRGBA.Black); |
||||
mat.setBoolean("UseMaterialColors", true); |
||||
mat.setFloat("Shininess", 0); |
||||
geom.setMaterial(mat); |
||||
|
||||
geom.rotate(-FastMath.HALF_PI, 0, 0); |
||||
geom.center(); |
||||
geom.setShadowMode(RenderQueue.ShadowMode.Receive); |
||||
rootNode.attachChild(geom); |
||||
} |
||||
|
||||
public void setupInput() { |
||||
inputManager.addMapping("start", new KeyTrigger(KeyInput.KEY_PAUSE)); |
||||
inputManager.addListener(new ActionListener() { |
||||
|
||||
public void onAction(String name, boolean isPressed, float tpf) { |
||||
if(name.equals("start") && isPressed){ |
||||
if(cinematic.getPlayState() != PlayState.Playing){ |
||||
cinematic.play(); |
||||
}else{ |
||||
cinematic.pause(); |
||||
} |
||||
} |
||||
} |
||||
}, "start"); |
||||
} |
||||
|
||||
|
||||
|
||||
} |
@ -0,0 +1,202 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.animation; |
||||
|
||||
import com.jme3.animation.LoopMode; |
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.cinematic.MotionPath; |
||||
import com.jme3.cinematic.MotionPathListener; |
||||
import com.jme3.cinematic.events.MotionEvent; |
||||
import com.jme3.cinematic.events.MotionEvent; |
||||
import com.jme3.font.BitmapText; |
||||
import com.jme3.input.ChaseCamera; |
||||
import com.jme3.input.KeyInput; |
||||
import com.jme3.input.controls.ActionListener; |
||||
import com.jme3.input.controls.KeyTrigger; |
||||
import com.jme3.light.DirectionalLight; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.ColorRGBA; |
||||
import com.jme3.math.FastMath; |
||||
import com.jme3.math.Quaternion; |
||||
import com.jme3.math.Spline.SplineType; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.Spatial; |
||||
import com.jme3.scene.shape.Box; |
||||
|
||||
public class TestMotionPath extends SimpleApplication { |
||||
|
||||
private Spatial teapot; |
||||
private boolean active = true; |
||||
private boolean playing = false; |
||||
private MotionPath path; |
||||
private MotionEvent motionControl; |
||||
|
||||
public static void main(String[] args) { |
||||
TestMotionPath app = new TestMotionPath(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
createScene(); |
||||
cam.setLocation(new Vector3f(8.4399185f, 11.189463f, 14.267577f)); |
||||
path = new MotionPath(); |
||||
path.addWayPoint(new Vector3f(10, 3, 0)); |
||||
path.addWayPoint(new Vector3f(10, 3, 10)); |
||||
path.addWayPoint(new Vector3f(-40, 3, 10)); |
||||
path.addWayPoint(new Vector3f(-40, 3, 0)); |
||||
path.addWayPoint(new Vector3f(-40, 8, 0)); |
||||
path.addWayPoint(new Vector3f(10, 8, 0)); |
||||
path.addWayPoint(new Vector3f(10, 8, 10)); |
||||
path.addWayPoint(new Vector3f(15, 8, 10)); |
||||
path.enableDebugShape(assetManager, rootNode); |
||||
|
||||
motionControl = new MotionEvent(teapot,path); |
||||
motionControl.setDirectionType(MotionEvent.Direction.PathAndRotation); |
||||
motionControl.setRotation(new Quaternion().fromAngleNormalAxis(-FastMath.HALF_PI, Vector3f.UNIT_Y)); |
||||
motionControl.setInitialDuration(10f); |
||||
motionControl.setSpeed(2f); |
||||
guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt"); |
||||
final BitmapText wayPointsText = new BitmapText(guiFont, false); |
||||
wayPointsText.setSize(guiFont.getCharSet().getRenderedSize()); |
||||
|
||||
guiNode.attachChild(wayPointsText); |
||||
|
||||
path.addListener(new MotionPathListener() { |
||||
|
||||
public void onWayPointReach(MotionEvent control, int wayPointIndex) { |
||||
if (path.getNbWayPoints() == wayPointIndex + 1) { |
||||
wayPointsText.setText(control.getSpatial().getName() + "Finished!!! "); |
||||
} else { |
||||
wayPointsText.setText(control.getSpatial().getName() + " Reached way point " + wayPointIndex); |
||||
} |
||||
wayPointsText.setLocalTranslation((cam.getWidth() - wayPointsText.getLineWidth()) / 2, cam.getHeight(), 0); |
||||
} |
||||
}); |
||||
|
||||
flyCam.setEnabled(false); |
||||
ChaseCamera chaser = new ChaseCamera(cam, teapot); |
||||
// motionControl.setSpeed(-3f);
|
||||
// motionControl.setLoopMode(LoopMode.Loop);
|
||||
// path.setCycle(true);
|
||||
|
||||
|
||||
// chaser.setEnabled(false);
|
||||
chaser.registerWithInput(inputManager); |
||||
initInputs(); |
||||
|
||||
} |
||||
|
||||
private void createScene() { |
||||
Material mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); |
||||
mat.setFloat("Shininess", 1f); |
||||
mat.setBoolean("UseMaterialColors", true); |
||||
mat.setColor("Ambient", ColorRGBA.Black); |
||||
mat.setColor("Diffuse", ColorRGBA.DarkGray); |
||||
mat.setColor("Specular", ColorRGBA.White.mult(0.6f)); |
||||
Material matSoil = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); |
||||
matSoil.setBoolean("UseMaterialColors", true); |
||||
matSoil.setColor("Ambient", ColorRGBA.Black); |
||||
matSoil.setColor("Diffuse", ColorRGBA.Black); |
||||
matSoil.setColor("Specular", ColorRGBA.Black); |
||||
teapot = assetManager.loadModel("Models/Teapot/Teapot.obj"); |
||||
teapot.setName("Teapot"); |
||||
teapot.setLocalScale(3); |
||||
teapot.setMaterial(mat); |
||||
|
||||
|
||||
rootNode.attachChild(teapot); |
||||
Geometry soil = new Geometry("soil", new Box(50, 1, 50)); |
||||
soil.setLocalTranslation(0, -1, 0); |
||||
soil.setMaterial(matSoil); |
||||
|
||||
rootNode.attachChild(soil); |
||||
DirectionalLight light = new DirectionalLight(); |
||||
light.setDirection(new Vector3f(0, -1, 0).normalizeLocal()); |
||||
light.setColor(ColorRGBA.White.mult(1.5f)); |
||||
rootNode.addLight(light); |
||||
} |
||||
|
||||
private void initInputs() { |
||||
inputManager.addMapping("display_hidePath", new KeyTrigger(KeyInput.KEY_P)); |
||||
inputManager.addMapping("SwitchPathInterpolation", new KeyTrigger(KeyInput.KEY_I)); |
||||
inputManager.addMapping("tensionUp", new KeyTrigger(KeyInput.KEY_U)); |
||||
inputManager.addMapping("tensionDown", new KeyTrigger(KeyInput.KEY_J)); |
||||
inputManager.addMapping("play_stop", new KeyTrigger(KeyInput.KEY_SPACE)); |
||||
ActionListener acl = new ActionListener() { |
||||
|
||||
public void onAction(String name, boolean keyPressed, float tpf) { |
||||
if (name.equals("display_hidePath") && keyPressed) { |
||||
if (active) { |
||||
active = false; |
||||
path.disableDebugShape(); |
||||
} else { |
||||
active = true; |
||||
path.enableDebugShape(assetManager, rootNode); |
||||
} |
||||
} |
||||
if (name.equals("play_stop") && keyPressed) { |
||||
if (playing) { |
||||
playing = false; |
||||
motionControl.stop(); |
||||
} else { |
||||
playing = true; |
||||
motionControl.play(); |
||||
} |
||||
} |
||||
|
||||
if (name.equals("SwitchPathInterpolation") && keyPressed) { |
||||
if (path.getPathSplineType() == SplineType.CatmullRom){ |
||||
path.setPathSplineType(SplineType.Linear); |
||||
} else { |
||||
path.setPathSplineType(SplineType.CatmullRom); |
||||
} |
||||
} |
||||
|
||||
if (name.equals("tensionUp") && keyPressed) { |
||||
path.setCurveTension(path.getCurveTension() + 0.1f); |
||||
System.err.println("Tension : " + path.getCurveTension()); |
||||
} |
||||
if (name.equals("tensionDown") && keyPressed) { |
||||
path.setCurveTension(path.getCurveTension() - 0.1f); |
||||
System.err.println("Tension : " + path.getCurveTension()); |
||||
} |
||||
|
||||
|
||||
} |
||||
}; |
||||
|
||||
inputManager.addListener(acl, "display_hidePath", "play_stop", "SwitchPathInterpolation", "tensionUp", "tensionDown"); |
||||
|
||||
} |
||||
} |
@ -0,0 +1,126 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.app; |
||||
|
||||
import com.jme3.app.Application; |
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.app.state.AbstractAppState; |
||||
import com.jme3.app.state.AppStateManager; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.renderer.RenderManager; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Box; |
||||
|
||||
|
||||
/** |
||||
* Tests the app state lifecycles. |
||||
* |
||||
* @author Paul Speed |
||||
*/ |
||||
public class TestAppStateLifeCycle extends SimpleApplication { |
||||
|
||||
public static void main(String[] args){ |
||||
TestAppStateLifeCycle app = new TestAppStateLifeCycle(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
Box b = new Box(1, 1, 1); |
||||
Geometry geom = new Geometry("Box", b); |
||||
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); |
||||
geom.setMaterial(mat); |
||||
rootNode.attachChild(geom); |
||||
|
||||
System.out.println("Attaching test state."); |
||||
stateManager.attach(new TestState()); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
|
||||
if(stateManager.getState(TestState.class) != null) { |
||||
System.out.println("Detaching test state."); |
||||
stateManager.detach(stateManager.getState(TestState.class)); |
||||
System.out.println("Done"); |
||||
} |
||||
} |
||||
|
||||
public class TestState extends AbstractAppState { |
||||
|
||||
@Override |
||||
public void initialize(AppStateManager stateManager, Application app) { |
||||
super.initialize(stateManager, app); |
||||
System.out.println("Initialized"); |
||||
} |
||||
|
||||
@Override |
||||
public void stateAttached(AppStateManager stateManager) { |
||||
super.stateAttached(stateManager); |
||||
System.out.println("Attached"); |
||||
} |
||||
|
||||
@Override |
||||
public void update(float tpf) { |
||||
super.update(tpf); |
||||
System.out.println("update"); |
||||
} |
||||
|
||||
@Override |
||||
public void render(RenderManager rm) { |
||||
super.render(rm); |
||||
System.out.println("render"); |
||||
} |
||||
|
||||
@Override |
||||
public void postRender() { |
||||
super.postRender(); |
||||
System.out.println("postRender"); |
||||
} |
||||
|
||||
@Override |
||||
public void stateDetached(AppStateManager stateManager) { |
||||
super.stateDetached(stateManager); |
||||
System.out.println("Detached"); |
||||
} |
||||
|
||||
@Override |
||||
public void cleanup() { |
||||
super.cleanup(); |
||||
System.out.println("Cleanup"); |
||||
} |
||||
|
||||
} |
||||
} |
@ -0,0 +1,75 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.app; |
||||
|
||||
import com.jme3.app.LegacyApplication; |
||||
import com.jme3.system.AppSettings; |
||||
import com.jme3.system.JmeContext.Type; |
||||
|
||||
/** |
||||
* Test LegacyApplication functionality, such as create, restart, destroy, etc. |
||||
* @author Kirill |
||||
*/ |
||||
public class TestApplication { |
||||
|
||||
public static void main(String[] args) throws InterruptedException{ |
||||
System.out.println("Creating application.."); |
||||
LegacyApplication app = new LegacyApplication(); |
||||
System.out.println("Starting application in LWJGL mode.."); |
||||
app.start(); |
||||
System.out.println("Waiting 5 seconds"); |
||||
Thread.sleep(5000); |
||||
System.out.println("Closing application.."); |
||||
app.stop(); |
||||
|
||||
Thread.sleep(2000); |
||||
System.out.println("Starting in fullscreen mode"); |
||||
app = new LegacyApplication(); |
||||
AppSettings settings = new AppSettings(true); |
||||
settings.setFullscreen(true); |
||||
settings.setResolution(-1,-1); // current width/height
|
||||
app.setSettings(settings); |
||||
app.start(); |
||||
Thread.sleep(5000); |
||||
app.stop(); |
||||
|
||||
Thread.sleep(2000); |
||||
System.out.println("Creating offscreen buffer application"); |
||||
app = new LegacyApplication(); |
||||
app.start(Type.OffscreenSurface); |
||||
Thread.sleep(3000); |
||||
System.out.println("Destroying offscreen buffer"); |
||||
app.stop(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,90 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.app; |
||||
|
||||
import com.jme3.app.LegacyApplication; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Box; |
||||
|
||||
/** |
||||
* Test a bare-bones application, without SimpleApplication. |
||||
*/ |
||||
public class TestBareBonesApp extends LegacyApplication { |
||||
|
||||
private Geometry boxGeom; |
||||
|
||||
public static void main(String[] args){ |
||||
TestBareBonesApp app = new TestBareBonesApp(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void initialize(){ |
||||
super.initialize(); |
||||
|
||||
System.out.println("Initialize"); |
||||
|
||||
// create a box
|
||||
boxGeom = new Geometry("Box", new Box(2, 2, 2)); |
||||
|
||||
// load some default material
|
||||
boxGeom.setMaterial(assetManager.loadMaterial("Interface/Logo/Logo.j3m")); |
||||
|
||||
// attach box to display in primary viewport
|
||||
viewPort.attachScene(boxGeom); |
||||
} |
||||
|
||||
@Override |
||||
public void update(){ |
||||
super.update(); |
||||
|
||||
// do some animation
|
||||
float tpf = timer.getTimePerFrame(); |
||||
boxGeom.rotate(tpf * 2, tpf * 4, tpf * 3); |
||||
|
||||
// dont forget to update the scenes
|
||||
boxGeom.updateLogicalState(tpf); |
||||
boxGeom.updateGeometricState(); |
||||
|
||||
// render the viewports
|
||||
renderManager.render(tpf, context.isRenderable()); |
||||
} |
||||
|
||||
@Override |
||||
public void destroy(){ |
||||
super.destroy(); |
||||
|
||||
System.out.println("Destroy"); |
||||
} |
||||
} |
@ -0,0 +1,75 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.app; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.font.BitmapText; |
||||
import com.jme3.system.AppSettings; |
||||
import java.awt.image.BufferedImage; |
||||
import java.io.IOException; |
||||
import java.util.logging.Logger; |
||||
import javax.imageio.ImageIO; |
||||
|
||||
public class TestChangeAppIcon extends SimpleApplication { |
||||
|
||||
private static final Logger log=Logger.getLogger(TestChangeAppIcon.class.getName()); |
||||
|
||||
public static void main(String[] args) { |
||||
TestChangeAppIcon app = new TestChangeAppIcon(); |
||||
AppSettings settings = new AppSettings(true); |
||||
|
||||
try { |
||||
Class<TestChangeAppIcon> clazz = TestChangeAppIcon.class; |
||||
|
||||
settings.setIcons(new BufferedImage[]{ |
||||
ImageIO.read(clazz.getResourceAsStream("/Interface/icons/SmartMonkey256.png")), |
||||
ImageIO.read(clazz.getResourceAsStream("/Interface/icons/SmartMonkey128.png")), |
||||
ImageIO.read(clazz.getResourceAsStream("/Interface/icons/SmartMonkey32.png")), |
||||
ImageIO.read(clazz.getResourceAsStream("/Interface/icons/SmartMonkey16.png")), |
||||
}); |
||||
} catch (IOException e) { |
||||
log.log(java.util.logging.Level.WARNING, "Unable to load program icons", e); |
||||
} |
||||
app.setSettings(settings); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
// Write text on the screen (HUD)
|
||||
setDisplayStatView(false); |
||||
BitmapText helloText = new BitmapText(guiFont); |
||||
helloText.setText("The icon of the app should be a smart monkey!"); |
||||
helloText.setLocalTranslation(300, helloText.getLineHeight(), 0); |
||||
guiNode.attachChild(helloText); |
||||
} |
||||
} |
@ -0,0 +1,228 @@ |
||||
/* |
||||
* Copyright (c) 2016 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.app; |
||||
|
||||
import java.lang.reflect.*; |
||||
import java.util.*; |
||||
|
||||
import com.jme3.asset.*; |
||||
import com.jme3.font.*; |
||||
import com.jme3.light.*; |
||||
import com.jme3.material.*; |
||||
import com.jme3.math.*; |
||||
import com.jme3.scene.*; |
||||
import com.jme3.scene.control.*; |
||||
import com.jme3.scene.shape.*; |
||||
import com.jme3.util.clone.*; |
||||
|
||||
|
||||
/** |
||||
* |
||||
* |
||||
* @author Paul Speed |
||||
*/ |
||||
public class TestCloneSpatial { |
||||
|
||||
public static void main( String... args ) throws Exception { |
||||
|
||||
// Setup a test node with some children, controls, etc.
|
||||
Node root = new Node("rootNode"); |
||||
|
||||
// A root light
|
||||
DirectionalLight rootLight = new DirectionalLight(); |
||||
root.addLight(rootLight); |
||||
|
||||
Box sharedBox = new Box(1, 1, 1); |
||||
Geometry geom1 = new Geometry("box1", sharedBox); |
||||
Material sharedMaterial = new Material(); // not a valid material, just for testing
|
||||
geom1.setMaterial(sharedMaterial); |
||||
|
||||
Geometry geom2 = new Geometry("box2", sharedBox); |
||||
geom2.setMaterial(sharedMaterial); |
||||
|
||||
root.attachChild(geom1); |
||||
root.attachChild(geom2); |
||||
|
||||
// Add some controls
|
||||
geom1.addControl(new BillboardControl()); |
||||
geom2.addControl(new BillboardControl()); |
||||
|
||||
// A light that will only affect the children and be controlled
|
||||
// by one child
|
||||
PointLight childLight = new PointLight(); |
||||
geom1.addLight(childLight); |
||||
geom2.addLight(childLight); |
||||
|
||||
geom1.addControl(new LightControl(childLight)); |
||||
|
||||
// Set some shared user data also
|
||||
Vector3f sharedUserData = new Vector3f(1, 2, 3); |
||||
geom1.setUserData("shared", sharedUserData); |
||||
geom2.setUserData("shared", sharedUserData); |
||||
|
||||
dump("", root); |
||||
|
||||
System.out.println("-------- cloning spatial --------------"); |
||||
Node clone = root.clone(true); |
||||
dump("", clone); |
||||
|
||||
System.out.println("-------- cloning spatial without cloning material --------------"); |
||||
clone = root.clone(false); |
||||
dump("", clone); |
||||
|
||||
System.out.println("-------- cloning BitmapText ------------"); |
||||
DesktopAssetManager assets = new DesktopAssetManager(true); |
||||
BitmapFont font = assets.loadFont("Interface/Fonts/Console.fnt"); |
||||
BitmapText text1 = new BitmapText(font); |
||||
text1.setText("Testing"); |
||||
System.out.println("Original:"); |
||||
dump("", text1); |
||||
|
||||
System.out.println("Clone:"); |
||||
clone = text1.clone(); |
||||
dump("", clone); |
||||
|
||||
} |
||||
|
||||
|
||||
/** |
||||
* Debug dump to check structure and identity |
||||
*/ |
||||
public static void dump( String indent, Spatial s ) { |
||||
if( s instanceof Node ) { |
||||
dump(indent, (Node)s); |
||||
} else if( s instanceof Geometry ) { |
||||
dump(indent, (Geometry)s); |
||||
} |
||||
} |
||||
|
||||
public static void dump( String indent, Node n ) { |
||||
System.out.println(indent + objectToString(n)); |
||||
dumpSpatialProperties(indent + " ", n); |
||||
if( !n.getChildren().isEmpty() ) { |
||||
System.out.println(indent + " children:"); |
||||
for( Spatial s : n.getChildren() ) { |
||||
dump(indent + " ", s); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public static void dump( String indent, Geometry g ) { |
||||
System.out.println(indent + objectToString(g)); |
||||
//System.out.println(indent + " mesh:" + objectToString(g.getMesh()));
|
||||
//System.out.println(indent + " material:" + objectToString(g.getMaterial()));
|
||||
dumpSpatialProperties(indent + " ", g); |
||||
} |
||||
|
||||
public static void dump( String indent, Control ctl ) { |
||||
System.out.println(indent + objectToString(ctl)); |
||||
if( ctl instanceof AbstractControl ) { |
||||
System.out.println(indent + " spatial:" + objectToString(((AbstractControl)ctl).getSpatial())); |
||||
} |
||||
} |
||||
|
||||
private static void dumpSpatialProperties( String indent, Spatial s ) { |
||||
dumpProperties(indent, s, "children"); |
||||
|
||||
if( !s.getUserDataKeys().isEmpty() ) { |
||||
System.out.println(indent + "userData:"); |
||||
for( String key : s.getUserDataKeys() ) { |
||||
System.out.println(indent + " " + key + ":" + objectToString(s.getUserData(key))); |
||||
} |
||||
} |
||||
|
||||
if( s.getNumControls() > 0 ) { |
||||
System.out.println(indent + "controls:"); |
||||
for( int i = 0; i < s.getNumControls(); i++ ) { |
||||
Control ctl = s.getControl(i); |
||||
//dump(indent + " ", ctl);
|
||||
dumpObject(indent + " ", ctl); |
||||
} |
||||
} |
||||
|
||||
LightList lights = s.getLocalLightList(); |
||||
if( lights.size() > 0 ) { |
||||
System.out.println(indent + "lights:"); |
||||
for( Light l : lights ) { |
||||
dumpObject(indent + " ", l); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private static void dumpObject( String indent, Object o ) { |
||||
System.out.println(indent + objectToString(o)); |
||||
dumpProperties(indent + " ", o); |
||||
} |
||||
|
||||
private static void dumpProperties( String indent, Object o, String... skip ) { |
||||
if( o == null ) { |
||||
return; |
||||
} |
||||
Set<String> skipSet = new HashSet<>(Arrays.asList(skip)); |
||||
for( Method m : o.getClass().getMethods() ) { |
||||
if( m.getParameterTypes().length > 0 ) { |
||||
continue; |
||||
} |
||||
String name = m.getName(); |
||||
if( "getClass".equals(name) ) { |
||||
continue; |
||||
} |
||||
if( !name.startsWith("get") ) { |
||||
continue; |
||||
} |
||||
Class type = m.getReturnType(); |
||||
if( type.isPrimitive() || type.isEnum() ) { |
||||
continue; |
||||
} |
||||
name = name.substring(3); |
||||
if( skipSet.contains(name.toLowerCase()) ) { |
||||
continue; |
||||
} |
||||
try { |
||||
Object value = m.invoke(o); |
||||
System.out.println(indent + name + ":" + objectToString(value)); |
||||
} catch( Exception e ) { |
||||
throw new RuntimeException("Error with method:" + m, e); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private static String objectToString( Object o ) { |
||||
if( o == null ) { |
||||
return null; |
||||
} |
||||
String s = o + "@" + System.identityHashCode(o); |
||||
s = s.replaceAll("\\r?\\n", ""); |
||||
return s; |
||||
} |
||||
} |
@ -0,0 +1,367 @@ |
||||
/* |
||||
* Copyright (c) 2016 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.app; |
||||
|
||||
import java.util.*; |
||||
|
||||
import com.jme3.util.clone.*; |
||||
|
||||
/** |
||||
* |
||||
* |
||||
* @author Paul Speed |
||||
*/ |
||||
public class TestCloner { |
||||
|
||||
public static void main( String... args ) { |
||||
|
||||
System.out.println("Clone test:"); |
||||
|
||||
Cloner cloner = new Cloner(); |
||||
|
||||
RegularObject ro = new RegularObject(42); |
||||
System.out.println("Regular Object:" + ro); |
||||
RegularObject roCloneLegacy = ro.clone(); |
||||
System.out.println("Regular Object Clone:" + roCloneLegacy); |
||||
RegularObject roClone = cloner.clone(ro); |
||||
System.out.println("cloner: Regular Object Clone:" + roClone); |
||||
|
||||
System.out.println("------------------------------------"); |
||||
System.out.println(); |
||||
|
||||
cloner = new Cloner(); |
||||
RegularSubclass rsc = new RegularSubclass(69, "test"); |
||||
System.out.println("Regular subclass:" + rsc); |
||||
RegularSubclass rscCloneLegacy = (RegularSubclass)rsc.clone(); |
||||
System.out.println("Regular subclass Clone:" + rscCloneLegacy); |
||||
RegularSubclass rscClone = cloner.clone(rsc); |
||||
System.out.println("cloner: Regular subclass Clone:" + rscClone); |
||||
|
||||
System.out.println("------------------------------------"); |
||||
System.out.println(); |
||||
|
||||
cloner = new Cloner(); |
||||
Parent parent = new Parent("Foo", 34); |
||||
System.out.println("Parent:" + parent); |
||||
Parent parentCloneLegacy = parent.clone(); |
||||
System.out.println("Parent Clone:" + parentCloneLegacy); |
||||
Parent parentClone = cloner.clone(parent); |
||||
System.out.println("cloner: Parent Clone:" + parentClone); |
||||
|
||||
System.out.println("------------------------------------"); |
||||
System.out.println(); |
||||
|
||||
cloner = new Cloner(); |
||||
GraphNode root = new GraphNode("root"); |
||||
GraphNode child1 = root.addLink("child1"); |
||||
GraphNode child2 = root.addLink("child2"); |
||||
GraphNode shared = child1.addLink("shared"); |
||||
child2.addLink(shared); |
||||
|
||||
// Add a circular reference to get fancy
|
||||
shared.addLink(root); |
||||
|
||||
System.out.println("Simple graph:"); |
||||
root.dump(" "); |
||||
|
||||
GraphNode rootClone = cloner.clone(root); |
||||
System.out.println("clone:"); |
||||
rootClone.dump(" "); |
||||
|
||||
System.out.println("original:"); |
||||
root.dump(" "); |
||||
|
||||
GraphNode reclone = Cloner.deepClone(root); |
||||
System.out.println("reclone:"); |
||||
reclone.dump(" "); |
||||
|
||||
System.out.println("------------------------------------"); |
||||
System.out.println(); |
||||
cloner = new Cloner(); |
||||
|
||||
ArrayHolder arrays = new ArrayHolder(5, 3, 7, 3, 7, 2, 1, 4); |
||||
System.out.println("Array holder:" + arrays); |
||||
ArrayHolder arraysClone = cloner.clone(arrays); |
||||
System.out.println("Array holder clone:" + arraysClone); |
||||
|
||||
|
||||
|
||||
} |
||||
|
||||
public static class RegularObject implements Cloneable { |
||||
protected int i; |
||||
|
||||
public RegularObject( int i ) { |
||||
this.i = i; |
||||
} |
||||
|
||||
public RegularObject clone() { |
||||
try { |
||||
return (RegularObject)super.clone(); |
||||
} catch( CloneNotSupportedException e ) { |
||||
throw new RuntimeException(e); |
||||
} |
||||
} |
||||
|
||||
public String toString() { |
||||
return getClass().getSimpleName() + "@" + System.identityHashCode(this) |
||||
+ "[i=" + i + "]"; |
||||
} |
||||
} |
||||
|
||||
public static class RegularSubclass extends RegularObject { |
||||
protected String name; |
||||
|
||||
public RegularSubclass( int i, String name ) { |
||||
super(i); |
||||
this.name = name; |
||||
} |
||||
|
||||
public String toString() { |
||||
return getClass().getSimpleName() + "@" + System.identityHashCode(this) |
||||
+ "[i=" + i + ", name=" + name + "]"; |
||||
} |
||||
} |
||||
|
||||
public static class Parent implements Cloneable, JmeCloneable { |
||||
|
||||
private RegularObject ro; |
||||
private RegularSubclass rsc; |
||||
|
||||
public Parent( String name, int age ) { |
||||
this.ro = new RegularObject(age); |
||||
this.rsc = new RegularSubclass(age, name); |
||||
} |
||||
|
||||
public Parent clone() { |
||||
try { |
||||
return (Parent)super.clone(); |
||||
} catch( CloneNotSupportedException e ) { |
||||
throw new RuntimeException(e); |
||||
} |
||||
} |
||||
|
||||
public Parent jmeClone() { |
||||
// Ok to delegate to clone() in this case because no deep
|
||||
// cloning is done there.
|
||||
return clone(); |
||||
} |
||||
|
||||
public void cloneFields( Cloner cloner, Object original ) { |
||||
this.ro = cloner.clone(ro); |
||||
this.rsc = cloner.clone(rsc); |
||||
} |
||||
|
||||
public String toString() { |
||||
return getClass().getSimpleName() + "@" + System.identityHashCode(this) |
||||
+ "[ro=" + ro + ", rsc=" + rsc + "]"; |
||||
} |
||||
} |
||||
|
||||
public static class GraphNode implements Cloneable, JmeCloneable { |
||||
|
||||
private String name; |
||||
private List<GraphNode> links = new ArrayList<>(); |
||||
|
||||
public GraphNode( String name ) { |
||||
this.name = name; |
||||
} |
||||
|
||||
public void dump( String indent ) { |
||||
dump(indent, new HashSet<GraphNode>()); |
||||
} |
||||
|
||||
private void dump( String indent, Set<GraphNode> visited ) { |
||||
if( visited.contains(this) ) { |
||||
// already been here
|
||||
System.out.println(indent + this + " ** circular."); |
||||
return; |
||||
} |
||||
System.out.println(indent + this); |
||||
visited.add(this); |
||||
for( GraphNode n : links ) { |
||||
n.dump(indent + " ", visited); |
||||
} |
||||
visited.remove(this); |
||||
} |
||||
|
||||
public GraphNode addLink( String name ) { |
||||
GraphNode node = new GraphNode(name); |
||||
links.add(node); |
||||
return node; |
||||
} |
||||
|
||||
public GraphNode addLink( GraphNode node ) { |
||||
links.add(node); |
||||
return node; |
||||
} |
||||
|
||||
public List<GraphNode> getLinks() { |
||||
return links; |
||||
} |
||||
|
||||
public GraphNode jmeClone() { |
||||
try { |
||||
return (GraphNode)super.clone(); |
||||
} catch( CloneNotSupportedException e ) { |
||||
throw new RuntimeException(e); |
||||
} |
||||
} |
||||
|
||||
public void cloneFields( Cloner cloner, Object original ) { |
||||
this.links = cloner.clone(links); |
||||
} |
||||
|
||||
public String toString() { |
||||
return getClass().getSimpleName() + "@" + System.identityHashCode(this) |
||||
+ "[name=" + name + "]"; |
||||
} |
||||
} |
||||
|
||||
public static class ArrayHolder implements JmeCloneable { |
||||
|
||||
private int[] intArray; |
||||
private int[][] intArray2D; |
||||
private Object[] objects; |
||||
private RegularObject[] regularObjects; |
||||
private String[] strings; |
||||
|
||||
public ArrayHolder( int... values ) { |
||||
this.intArray = values; |
||||
this.intArray2D = new int[values.length][2]; |
||||
for( int i = 0; i < values.length; i++ ) { |
||||
intArray2D[i][0] = values[i] + 1; |
||||
intArray2D[i][1] = values[i] * 2; |
||||
} |
||||
this.objects = new Object[values.length]; |
||||
this.regularObjects = new RegularObject[values.length]; |
||||
this.strings = new String[values.length]; |
||||
for( int i = 0; i < values.length; i++ ) { |
||||
objects[i] = values[i]; |
||||
regularObjects[i] = new RegularObject(values[i]); |
||||
strings[i] = String.valueOf(values[i]); |
||||
} |
||||
} |
||||
|
||||
public ArrayHolder jmeClone() { |
||||
try { |
||||
return (ArrayHolder)super.clone(); |
||||
} catch( CloneNotSupportedException e ) { |
||||
throw new RuntimeException(e); |
||||
} |
||||
} |
||||
|
||||
public void cloneFields( Cloner cloner, Object original ) { |
||||
intArray = cloner.clone(intArray); |
||||
intArray2D = cloner.clone(intArray2D); |
||||
|
||||
// Boxed types are not cloneable so this will fail
|
||||
//objects = cloner.clone(objects);
|
||||
|
||||
regularObjects = cloner.clone(regularObjects); |
||||
|
||||
// Strings are also not cloneable
|
||||
//strings = cloner.clone(strings);
|
||||
} |
||||
|
||||
public String toString() { |
||||
StringBuilder sb = new StringBuilder(); |
||||
sb.append("intArray=" + intArray); |
||||
for( int i = 0; i < intArray.length; i++ ) { |
||||
if( i == 0 ) { |
||||
sb.append("["); |
||||
} else { |
||||
sb.append(", "); |
||||
} |
||||
sb.append(intArray[i]); |
||||
} |
||||
sb.append("], "); |
||||
|
||||
sb.append("intArray2D=" + intArray2D); |
||||
for( int i = 0; i < intArray2D.length; i++ ) { |
||||
if( i == 0 ) { |
||||
sb.append("["); |
||||
} else { |
||||
sb.append(", "); |
||||
} |
||||
sb.append("intArray2D[" + i + "]=" + intArray2D[i]); |
||||
for( int j = 0; j < 2; j++ ) { |
||||
if( j == 0 ) { |
||||
sb.append("["); |
||||
} else { |
||||
sb.append(", "); |
||||
} |
||||
sb.append(intArray2D[i][j]); |
||||
} |
||||
sb.append("], "); |
||||
} |
||||
sb.append("], "); |
||||
|
||||
sb.append("objectArray=" + objects); |
||||
for( int i = 0; i < objects.length; i++ ) { |
||||
if( i == 0 ) { |
||||
sb.append("["); |
||||
} else { |
||||
sb.append(", "); |
||||
} |
||||
sb.append(objects[i]); |
||||
} |
||||
sb.append("], "); |
||||
|
||||
sb.append("objectArray=" + regularObjects); |
||||
for( int i = 0; i < regularObjects.length; i++ ) { |
||||
if( i == 0 ) { |
||||
sb.append("["); |
||||
} else { |
||||
sb.append(", "); |
||||
} |
||||
sb.append(regularObjects[i]); |
||||
} |
||||
sb.append("], "); |
||||
|
||||
sb.append("stringArray=" + strings); |
||||
for( int i = 0; i < strings.length; i++ ) { |
||||
if( i == 0 ) { |
||||
sb.append("["); |
||||
} else { |
||||
sb.append(", "); |
||||
} |
||||
sb.append(strings[i]); |
||||
} |
||||
sb.append("]"); |
||||
|
||||
return getClass().getSimpleName() + "@" + System.identityHashCode(this) |
||||
+ "[" + sb + "]"; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,59 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.app; |
||||
|
||||
import com.jme3.app.LegacyApplication; |
||||
import com.jme3.system.AppSettings; |
||||
|
||||
public class TestContextRestart { |
||||
|
||||
public static void main(String[] args) throws InterruptedException{ |
||||
AppSettings settings = new AppSettings(true); |
||||
|
||||
final LegacyApplication app = new LegacyApplication(); |
||||
app.setSettings(settings); |
||||
app.start(); |
||||
|
||||
Thread.sleep(3000); |
||||
|
||||
settings.setFullscreen(true); |
||||
settings.setResolution(-1, -1); |
||||
app.setSettings(settings); |
||||
app.restart(); |
||||
|
||||
Thread.sleep(3000); |
||||
|
||||
app.stop(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,88 @@ |
||||
package jme3test.app; |
||||
|
||||
import com.jme3.scene.Mesh; |
||||
import com.jme3.system.AppSettings; |
||||
import java.io.ByteArrayInputStream; |
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.IOException; |
||||
import java.util.prefs.BackingStoreException; |
||||
|
||||
public class TestCustomAppSettings { |
||||
|
||||
private static final String APPSETTINGS_KEY = "JME_AppSettingsTest"; |
||||
|
||||
private static void assertEqual(Object a, Object b) { |
||||
if (!a.equals(b)){ |
||||
throw new AssertionError(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Tests preference based AppSettings. |
||||
*/ |
||||
private static void testPreferenceSettings() { |
||||
AppSettings settings = new AppSettings(false); |
||||
settings.putBoolean("TestBool", true); |
||||
settings.putInteger("TestInt", 123); |
||||
settings.putString("TestStr", "HelloWorld"); |
||||
settings.putFloat("TestFloat", 123.567f); |
||||
settings.put("TestObj", new Mesh()); // Objects not supported by preferences
|
||||
|
||||
try { |
||||
settings.save(APPSETTINGS_KEY); |
||||
} catch (BackingStoreException ex) { |
||||
ex.printStackTrace(); |
||||
} |
||||
|
||||
AppSettings loadedSettings = new AppSettings(false); |
||||
try { |
||||
loadedSettings.load(APPSETTINGS_KEY); |
||||
} catch (BackingStoreException ex) { |
||||
ex.printStackTrace(); |
||||
} |
||||
|
||||
assertEqual(loadedSettings.getBoolean("TestBool"), true); |
||||
assertEqual(loadedSettings.getInteger("TestInt"), 123); |
||||
assertEqual(loadedSettings.getString("TestStr"), "HelloWorld"); |
||||
assertEqual(loadedSettings.get("TestFloat"), 123.567f); |
||||
} |
||||
|
||||
/** |
||||
* Test Java properties file based AppSettings. |
||||
*/ |
||||
private static void testFileSettings() { |
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
||||
|
||||
AppSettings settings = new AppSettings(false); |
||||
settings.putBoolean("TestBool", true); |
||||
settings.putInteger("TestInt", 123); |
||||
settings.putString("TestStr", "HelloWorld"); |
||||
settings.putFloat("TestFloat", 123.567f); |
||||
settings.put("TestObj", new Mesh()); // Objects not supported by file settings
|
||||
|
||||
try { |
||||
settings.save(baos); |
||||
} catch (IOException ex) { |
||||
ex.printStackTrace(); |
||||
} |
||||
|
||||
AppSettings loadedSettings = new AppSettings(false); |
||||
try { |
||||
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); |
||||
loadedSettings.load(bais); |
||||
} catch (IOException ex) { |
||||
ex.printStackTrace(); |
||||
} |
||||
|
||||
assertEqual(loadedSettings.getBoolean("TestBool"), true); |
||||
assertEqual(loadedSettings.getInteger("TestInt"), 123); |
||||
assertEqual(loadedSettings.getString("TestStr"), "HelloWorld"); |
||||
assertEqual(loadedSettings.get("TestFloat"), 123.567f); |
||||
} |
||||
|
||||
public static void main(String[] args){ |
||||
testPreferenceSettings(); |
||||
testFileSettings(); |
||||
System.out.println("All OK"); |
||||
} |
||||
} |
@ -0,0 +1,72 @@ |
||||
package jme3test.app; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.ColorRGBA; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Box; |
||||
|
||||
/** |
||||
* @author john01dav |
||||
*/ |
||||
public class TestEnqueueRunnable extends SimpleApplication{ |
||||
private ExampleAsyncTask exampleAsyncTask; |
||||
|
||||
public static void main(String[] args){ |
||||
new TestEnqueueRunnable().start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp(){ |
||||
Geometry geom = new Geometry("Box", new Box(1, 1, 1)); |
||||
Material material = new Material(getAssetManager(), "/Common/MatDefs/Misc/Unshaded.j3md"); |
||||
material.setColor("Color", ColorRGBA.Blue); //a color is needed to start with
|
||||
geom.setMaterial(material); |
||||
getRootNode().attachChild(geom); |
||||
|
||||
exampleAsyncTask = new ExampleAsyncTask(material); |
||||
exampleAsyncTask.getThread().start(); |
||||
} |
||||
|
||||
@Override |
||||
public void destroy(){ |
||||
exampleAsyncTask.endTask(); |
||||
super.destroy(); |
||||
} |
||||
|
||||
private class ExampleAsyncTask implements Runnable{ |
||||
private final Thread thread; |
||||
private final Material material; |
||||
private volatile boolean running = true; |
||||
|
||||
public ExampleAsyncTask(Material material){ |
||||
this.thread = new Thread(this); |
||||
this.material = material; |
||||
} |
||||
|
||||
public Thread getThread(){ |
||||
return thread; |
||||
} |
||||
|
||||
public void run(){ |
||||
while(running){ |
||||
enqueue(new Runnable(){ //primary usage of this in real applications would use lambda expressions which are unavailable at java 6
|
||||
public void run(){ |
||||
material.setColor("Color", ColorRGBA.randomColor()); |
||||
} |
||||
}); |
||||
|
||||
try{ |
||||
Thread.sleep(1000); |
||||
}catch(InterruptedException e){} |
||||
} |
||||
} |
||||
|
||||
public void endTask(){ |
||||
running = false; |
||||
thread.interrupt(); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,164 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.app; |
||||
|
||||
import com.jme3.renderer.IDList; |
||||
import java.util.*; |
||||
|
||||
public class TestIDList { |
||||
|
||||
static class StateCol { |
||||
|
||||
static Random rand = new Random(); |
||||
|
||||
Map<Integer, Object> objs = new HashMap<Integer, Object>(); |
||||
|
||||
public StateCol(){ |
||||
// populate with free ids
|
||||
List<Integer> freeIds = new ArrayList(); |
||||
for (int i = 0; i < 16; i++){ |
||||
freeIds.add(i); |
||||
} |
||||
|
||||
// create random
|
||||
int numStates = rand.nextInt(6) + 1; |
||||
for (int i = 0; i < numStates; i++){ |
||||
// remove a random id from free id list
|
||||
int idx = rand.nextInt(freeIds.size()); |
||||
int id = freeIds.remove(idx); |
||||
|
||||
objs.put(id, new Object()); |
||||
} |
||||
} |
||||
|
||||
public void print(){ |
||||
System.out.println("-----------------"); |
||||
|
||||
Set<Integer> keys = objs.keySet(); |
||||
Integer[] keysArr = keys.toArray(new Integer[0]); |
||||
Arrays.sort(keysArr); |
||||
for (int i = 0; i < keysArr.length; i++){ |
||||
System.out.println(keysArr[i]+" => "+objs.get(keysArr[i]).hashCode()); |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
static IDList list = new IDList(); |
||||
static int boundSlot = 0; |
||||
|
||||
static Object[] slots = new Object[16]; |
||||
static boolean[] enabledSlots = new boolean[16]; |
||||
|
||||
static void enable(int slot){ |
||||
System.out.println("Enabled SLOT["+slot+"]"); |
||||
if (enabledSlots[slot] == true){ |
||||
System.err.println("FAIL! Extra state change"); |
||||
} |
||||
enabledSlots[slot] = true; |
||||
} |
||||
|
||||
static void disable(int slot){ |
||||
System.out.println("Disabled SLOT["+slot+"]"); |
||||
if (enabledSlots[slot] == false){ |
||||
System.err.println("FAIL! Extra state change"); |
||||
} |
||||
enabledSlots[slot] = false; |
||||
} |
||||
|
||||
static void setSlot(int slot, Object val){ |
||||
if (!list.moveToNew(slot)){ |
||||
enable(slot); |
||||
} |
||||
if (slots[slot] != val){ |
||||
System.out.println("SLOT["+slot+"] = "+val.hashCode()); |
||||
slots[slot] = val; |
||||
} |
||||
} |
||||
|
||||
static void checkSlots(StateCol state){ |
||||
for (int i = 0; i < 16; i++){ |
||||
if (slots[i] != null && enabledSlots[i] == false){ |
||||
System.err.println("FAIL! SLOT["+i+"] assigned, but disabled"); |
||||
} |
||||
if (slots[i] == null && enabledSlots[i] == true){ |
||||
System.err.println("FAIL! SLOT["+i+"] enabled, but not assigned"); |
||||
} |
||||
|
||||
Object val = state.objs.get(i); |
||||
if (val != null){ |
||||
if (slots[i] != val) |
||||
System.err.println("FAIL! SLOT["+i+"] does not contain correct value"); |
||||
if (!enabledSlots[i]) |
||||
System.err.println("FAIL! SLOT["+i+"] is not enabled"); |
||||
}else{ |
||||
if (slots[i] != null) |
||||
System.err.println("FAIL! SLOT["+i+"] is not set"); |
||||
if (enabledSlots[i]) |
||||
System.err.println("FAIL! SLOT["+i+"] is enabled"); |
||||
} |
||||
} |
||||
} |
||||
|
||||
static void clearSlots(){ |
||||
for (int i = 0; i < list.oldLen; i++){ |
||||
int slot = list.oldList[i]; |
||||
disable(slot); |
||||
slots[slot] = null; |
||||
} |
||||
list.copyNewToOld(); |
||||
// context.attribIndexList.print();
|
||||
} |
||||
|
||||
static void setState(StateCol state){ |
||||
state.print(); |
||||
for (Map.Entry<Integer, Object> entry : state.objs.entrySet()){ |
||||
setSlot(entry.getKey(), entry.getValue()); |
||||
} |
||||
clearSlots(); |
||||
checkSlots(state); |
||||
} |
||||
|
||||
public static void main(String[] args){ |
||||
StateCol[] states = new StateCol[20]; |
||||
for (int i = 0; i < states.length; i++) |
||||
states[i] = new StateCol(); |
||||
|
||||
// shuffle would be useful here..
|
||||
|
||||
for (int i = 0; i < states.length; i++){ |
||||
setState(states[i]); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,70 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.app; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.util.BufferUtils; |
||||
import java.nio.ByteBuffer; |
||||
import java.nio.FloatBuffer; |
||||
|
||||
public class TestReleaseDirectMemory extends SimpleApplication { |
||||
|
||||
public static void main(String[] args){ |
||||
TestReleaseDirectMemory app = new TestReleaseDirectMemory(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
Box b = new Box(1, 1, 1); |
||||
Geometry geom = new Geometry("Box", b); |
||||
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); |
||||
geom.setMaterial(mat); |
||||
rootNode.attachChild(geom); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
ByteBuffer buf = BufferUtils.createByteBuffer(500000); |
||||
BufferUtils.destroyDirectBuffer(buf); |
||||
|
||||
FloatBuffer buf2 = BufferUtils.createFloatBuffer(500000); |
||||
BufferUtils.destroyDirectBuffer(buf2); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,87 @@ |
||||
/* |
||||
* Copyright (c) 2009-2015 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.app; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.font.BitmapText; |
||||
import com.jme3.font.Rectangle; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.system.AppSettings; |
||||
import jme3test.model.shape.TestBox; |
||||
|
||||
/** |
||||
* Tests the capability to resize the application window. |
||||
* |
||||
* @author Kirill Vainer |
||||
*/ |
||||
public class TestResizableApp extends SimpleApplication { |
||||
|
||||
private BitmapText txt; |
||||
|
||||
public static void main(String[] args){ |
||||
TestResizableApp app = new TestResizableApp(); |
||||
AppSettings settings = new AppSettings(true); |
||||
settings.setResizable(true); |
||||
app.setSettings(settings); |
||||
app.setShowSettings(false); |
||||
app.start(); |
||||
} |
||||
|
||||
public void reshape(int width, int height) { |
||||
super.reshape(width, height); |
||||
|
||||
// Need to move text relative to app height
|
||||
txt.setLocalTranslation(0, settings.getHeight(), 0); |
||||
txt.setText("Drag the corners of the application to resize it.\n" + |
||||
"Current Size: " + settings.getWidth() + "x" + settings.getHeight()); |
||||
} |
||||
|
||||
public void simpleInitApp() { |
||||
flyCam.setDragToRotate(true); |
||||
|
||||
Box b = new Box(1, 1, 1); |
||||
Geometry geom = new Geometry("Box", b); |
||||
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); |
||||
geom.setMaterial(mat); |
||||
rootNode.attachChild(geom); |
||||
|
||||
txt = new BitmapText(loadGuiFont(), false); |
||||
txt.setText("Drag the corners of the application to resize it.\n" + |
||||
"Current Size: " + settings.getWidth() + "x" + settings.getHeight()); |
||||
txt.setLocalTranslation(0, settings.getHeight(), 0); |
||||
guiNode.attachChild(txt); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,114 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.app; |
||||
|
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.util.TempVars; |
||||
|
||||
public class TestTempVars { |
||||
|
||||
private static final int ITERATIONS = 10000000; |
||||
private static final int NANOS_TO_MS = 1000000; |
||||
|
||||
private static final Vector3f sumCompute = new Vector3f(); |
||||
|
||||
public static void main(String[] args) { |
||||
long milliseconds, nanos; |
||||
|
||||
for (int i = 0; i < 4; i++){ |
||||
System.gc(); |
||||
} |
||||
|
||||
// sumCompute.set(0, 0, 0);
|
||||
// long nanos = System.nanoTime();
|
||||
// for (int i = 0; i < ITERATIONS; i++) {
|
||||
// recursiveMethod(0);
|
||||
// }
|
||||
// long milliseconds = (System.nanoTime() - nanos) / NANOS_TO_MS;
|
||||
// System.out.println("100 million TempVars calls with 5 recursions: " + milliseconds + " ms");
|
||||
// System.out.println(sumCompute);
|
||||
|
||||
sumCompute.set(0, 0, 0); |
||||
nanos = System.nanoTime(); |
||||
for (int i = 0; i < ITERATIONS; i++) { |
||||
methodThatUsesTempVars(); |
||||
} |
||||
milliseconds = (System.nanoTime() - nanos) / NANOS_TO_MS; |
||||
System.out.println("100 million TempVars calls: " + milliseconds + " ms"); |
||||
System.out.println(sumCompute); |
||||
|
||||
sumCompute.set(0, 0, 0); |
||||
nanos = System.nanoTime(); |
||||
for (int i = 0; i < ITERATIONS; i++) { |
||||
methodThatUsesAllocation(); |
||||
} |
||||
milliseconds = (System.nanoTime() - nanos) / NANOS_TO_MS; |
||||
System.out.println("100 million allocation calls: " + milliseconds + " ms"); |
||||
System.out.println(sumCompute); |
||||
|
||||
nanos = System.nanoTime(); |
||||
for (int i = 0; i < 10; i++){ |
||||
System.gc(); |
||||
} |
||||
milliseconds = (System.nanoTime() - nanos) / NANOS_TO_MS; |
||||
System.out.println("cleanup time after allocation calls: " + milliseconds + " ms"); |
||||
} |
||||
|
||||
public static void methodThatUsesAllocation(){ |
||||
Vector3f vector = new Vector3f(); |
||||
vector.set(0.1f, 0.2f, 0.3f); |
||||
sumCompute.addLocal(vector); |
||||
} |
||||
|
||||
public static void recursiveMethod(int recurse) { |
||||
TempVars vars = TempVars.get(); |
||||
{ |
||||
vars.vect1.set(0.1f, 0.2f, 0.3f); |
||||
|
||||
if (recurse < 4) { |
||||
recursiveMethod(recurse + 1); |
||||
} |
||||
|
||||
sumCompute.addLocal(vars.vect1); |
||||
} |
||||
vars.release(); |
||||
} |
||||
|
||||
public static void methodThatUsesTempVars() { |
||||
TempVars vars = TempVars.get(); |
||||
{ |
||||
vars.vect1.set(0.1f, 0.2f, 0.3f); |
||||
sumCompute.addLocal(vars.vect1); |
||||
} |
||||
vars.release(); |
||||
} |
||||
} |
@ -0,0 +1,84 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.app; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.texture.Texture; |
||||
import com.jme3.util.BufferUtils; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
public class TestUseAfterFree extends SimpleApplication { |
||||
|
||||
private float time = 0; |
||||
private Material mat; |
||||
private Texture deletedTex; |
||||
|
||||
public static void main(String[] args) { |
||||
TestUseAfterFree app = new TestUseAfterFree(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
Box box = new Box(1, 1, 1); |
||||
Geometry geom = new Geometry("Box", box); |
||||
mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); |
||||
geom.setMaterial(mat); |
||||
rootNode.attachChild(geom); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
if (time < 0) { |
||||
if (deletedTex != null) { |
||||
deletedTex.getImage().resetObject(); |
||||
} |
||||
return; |
||||
} |
||||
|
||||
time += tpf; |
||||
if (time > 5) { |
||||
System.out.println("Assiging texture to deleted object!"); |
||||
|
||||
deletedTex = assetManager.loadTexture("Interface/Logo/Monkey.png"); |
||||
BufferUtils.destroyDirectBuffer(deletedTex.getImage().getData(0)); |
||||
mat.setTexture("ColorMap", deletedTex); |
||||
|
||||
time = -1; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,54 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.app.state; |
||||
|
||||
import com.jme3.app.state.AbstractAppState; |
||||
import com.jme3.scene.Node; |
||||
|
||||
public class RootNodeState extends AbstractAppState { |
||||
|
||||
private Node rootNode = new Node("Root Node"); |
||||
|
||||
public Node getRootNode(){ |
||||
return rootNode; |
||||
} |
||||
|
||||
@Override |
||||
public void update(float tpf) { |
||||
super.update(tpf); |
||||
|
||||
rootNode.updateLogicalState(tpf); |
||||
rootNode.updateGeometricState(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,100 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.app.state; |
||||
|
||||
import com.jme3.app.LegacyApplication; |
||||
import com.jme3.niftygui.NiftyJmeDisplay; |
||||
import com.jme3.scene.Spatial; |
||||
import com.jme3.system.AppSettings; |
||||
import com.jme3.system.JmeContext; |
||||
|
||||
public class TestAppStates extends LegacyApplication { |
||||
|
||||
public static void main(String[] args){ |
||||
TestAppStates app = new TestAppStates(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void start(JmeContext.Type contextType){ |
||||
AppSettings settings = new AppSettings(true); |
||||
settings.setResolution(1024, 768); |
||||
setSettings(settings); |
||||
|
||||
super.start(contextType); |
||||
} |
||||
|
||||
@Override |
||||
public void initialize(){ |
||||
super.initialize(); |
||||
|
||||
System.out.println("Initialize"); |
||||
|
||||
RootNodeState state = new RootNodeState(); |
||||
viewPort.attachScene(state.getRootNode()); |
||||
stateManager.attach(state); |
||||
|
||||
Spatial model = assetManager.loadModel("Models/Teapot/Teapot.obj"); |
||||
model.scale(3); |
||||
model.setMaterial(assetManager.loadMaterial("Interface/Logo/Logo.j3m")); |
||||
state.getRootNode().attachChild(model); |
||||
|
||||
NiftyJmeDisplay niftyDisplay = new NiftyJmeDisplay(assetManager, |
||||
inputManager, |
||||
audioRenderer, |
||||
guiViewPort); |
||||
niftyDisplay.getNifty().fromXml("Interface/Nifty/HelloJme.xml", "start"); |
||||
guiViewPort.addProcessor(niftyDisplay); |
||||
} |
||||
|
||||
@Override |
||||
public void update(){ |
||||
super.update(); |
||||
|
||||
// do some animation
|
||||
float tpf = timer.getTimePerFrame(); |
||||
|
||||
stateManager.update(tpf); |
||||
stateManager.render(renderManager); |
||||
|
||||
// render the viewports
|
||||
renderManager.render(tpf, context.isRenderable()); |
||||
} |
||||
|
||||
@Override |
||||
public void destroy(){ |
||||
super.destroy(); |
||||
|
||||
System.out.println("Destroy"); |
||||
} |
||||
} |
@ -0,0 +1,71 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.asset; |
||||
|
||||
import com.jme3.asset.AssetManager; |
||||
import com.jme3.asset.plugins.ClasspathLocator; |
||||
import com.jme3.audio.AudioData; |
||||
import com.jme3.audio.plugins.WAVLoader; |
||||
import com.jme3.system.JmeSystem; |
||||
import com.jme3.texture.Texture; |
||||
import com.jme3.texture.plugins.AWTLoader; |
||||
|
||||
public class TestAbsoluteLocators { |
||||
public static void main(String[] args){ |
||||
AssetManager am = JmeSystem.newAssetManager(); |
||||
|
||||
am.registerLoader(AWTLoader.class, "jpg"); |
||||
am.registerLoader(WAVLoader.class, "wav"); |
||||
|
||||
// register absolute locator
|
||||
am.registerLocator("/", ClasspathLocator.class); |
||||
|
||||
// find a sound
|
||||
AudioData audio = am.loadAudio("Sound/Effects/Gun.wav"); |
||||
|
||||
// find a texture
|
||||
Texture tex = am.loadTexture("Textures/Terrain/Pond/Pond.jpg"); |
||||
|
||||
if (audio == null) |
||||
throw new RuntimeException("Cannot find audio!"); |
||||
else |
||||
System.out.println("Audio loaded from Sounds/Effects/Gun.wav"); |
||||
|
||||
if (tex == null) |
||||
throw new RuntimeException("Cannot find texture!"); |
||||
else |
||||
System.out.println("Texture loaded from Textures/Terrain/Pond/Pond.jpg"); |
||||
|
||||
System.out.println("Success!"); |
||||
} |
||||
} |
@ -0,0 +1,228 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.asset; |
||||
|
||||
import com.jme3.asset.AssetKey; |
||||
import com.jme3.asset.AssetProcessor; |
||||
import com.jme3.asset.CloneableAssetProcessor; |
||||
import com.jme3.asset.CloneableSmartAsset; |
||||
import com.jme3.asset.cache.AssetCache; |
||||
import com.jme3.asset.cache.SimpleAssetCache; |
||||
import com.jme3.asset.cache.WeakRefAssetCache; |
||||
import com.jme3.asset.cache.WeakRefCloneAssetCache; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
public class TestAssetCache { |
||||
|
||||
/** |
||||
* Counter for asset keys |
||||
*/ |
||||
private static int counter = 0; |
||||
|
||||
/** |
||||
* Dummy data is an asset having 10 KB to put a dent in the garbage collector |
||||
*/ |
||||
private static class DummyData implements CloneableSmartAsset { |
||||
|
||||
private AssetKey key; |
||||
private byte[] data = new byte[10 * 1024]; |
||||
|
||||
@Override |
||||
public Object clone(){ |
||||
try { |
||||
DummyData clone = (DummyData) super.clone(); |
||||
clone.data = data.clone(); |
||||
return clone; |
||||
} catch (CloneNotSupportedException ex) { |
||||
throw new AssertionError(); |
||||
} |
||||
} |
||||
|
||||
public byte[] getData(){ |
||||
return data; |
||||
} |
||||
|
||||
public AssetKey getKey() { |
||||
return key; |
||||
} |
||||
|
||||
public void setKey(AssetKey key) { |
||||
this.key = key; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Dummy key is indexed by a generated ID |
||||
*/ |
||||
private static class DummyKey extends AssetKey<DummyData> implements Cloneable { |
||||
|
||||
private int id = 0; |
||||
|
||||
public DummyKey(){ |
||||
super("."); |
||||
id = counter++; |
||||
} |
||||
|
||||
public DummyKey(int id){ |
||||
super("."); |
||||
this.id = id; |
||||
} |
||||
|
||||
@Override |
||||
public int hashCode(){ |
||||
return id; |
||||
} |
||||
|
||||
@Override |
||||
public boolean equals(Object other){ |
||||
return ((DummyKey)other).id == id; |
||||
} |
||||
|
||||
@Override |
||||
public DummyKey clone(){ |
||||
return new DummyKey(id); |
||||
} |
||||
|
||||
@Override |
||||
public String toString() { |
||||
return "ID=" + id; |
||||
} |
||||
} |
||||
|
||||
private static void runTest(boolean cloneAssets, boolean smartCache, boolean keepRefs, int limit) { |
||||
counter = 0; |
||||
List<Object> refs = new ArrayList<Object>(limit); |
||||
|
||||
AssetCache cache; |
||||
AssetProcessor proc = null; |
||||
|
||||
if (cloneAssets) { |
||||
proc = new CloneableAssetProcessor(); |
||||
} |
||||
|
||||
if (smartCache) { |
||||
if (cloneAssets) { |
||||
cache = new WeakRefCloneAssetCache(); |
||||
} else { |
||||
cache = new WeakRefAssetCache(); |
||||
} |
||||
} else { |
||||
cache = new SimpleAssetCache(); |
||||
} |
||||
|
||||
System.gc(); |
||||
System.gc(); |
||||
System.gc(); |
||||
System.gc(); |
||||
|
||||
long memory = Runtime.getRuntime().freeMemory(); |
||||
|
||||
while (counter < limit){ |
||||
// Create a key
|
||||
DummyKey key = new DummyKey(); |
||||
|
||||
// Create some data
|
||||
DummyData data = new DummyData(); |
||||
|
||||
// Post process the data before placing it in the cache
|
||||
if (proc != null){ |
||||
data = (DummyData) proc.postProcess(key, data); |
||||
} |
||||
|
||||
if (data.key != null){ |
||||
// Keeping a hard reference to the key in the cache
|
||||
// means the asset will never be collected => bug
|
||||
throw new AssertionError(); |
||||
} |
||||
|
||||
cache.addToCache(key, data); |
||||
|
||||
// Get the asset from the cache
|
||||
AssetKey<DummyData> keyToGet = key.clone(); |
||||
|
||||
// NOTE: Commented out because getFromCache leaks the original key
|
||||
// DummyData someLoaded = (DummyData) cache.getFromCache(keyToGet);
|
||||
// if (someLoaded != data){
|
||||
// // Failed to get the same asset from the cache => bug
|
||||
// // Since a hard reference to the key is kept,
|
||||
// // it cannot be collected at this point.
|
||||
// throw new AssertionError();
|
||||
// }
|
||||
|
||||
// Clone the asset
|
||||
if (proc != null){ |
||||
// Data is now the clone!
|
||||
data = (DummyData) proc.createClone(data); |
||||
if (smartCache) { |
||||
// Registering a clone is only needed
|
||||
// if smart cache is used.
|
||||
cache.registerAssetClone(keyToGet, data); |
||||
// The clone of the asset must have the same key as the original
|
||||
// otherwise => bug
|
||||
if (data.key != key){ |
||||
throw new AssertionError(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Keep references to the asset => *should* prevent
|
||||
// collections of the asset in the cache thus causing
|
||||
// an out of memory error.
|
||||
if (keepRefs){ |
||||
// Prevent the saved references from taking too much memory ..
|
||||
if (cloneAssets) { |
||||
data.data = null; |
||||
} |
||||
refs.add(data); |
||||
} |
||||
|
||||
if ((counter % 1000) == 0){ |
||||
long newMem = Runtime.getRuntime().freeMemory(); |
||||
System.out.println("Allocated objects: " + counter); |
||||
System.out.println("Allocated memory: " + ((memory - newMem)/(1024*1024)) + " MB" ); |
||||
memory = newMem; |
||||
} |
||||
} |
||||
} |
||||
|
||||
public static void main(String[] args){ |
||||
// Test cloneable smart asset
|
||||
System.out.println("====== Running Cloneable Smart Asset Test ======"); |
||||
runTest(true, true, false, 100000); |
||||
|
||||
// Test non-cloneable smart asset
|
||||
System.out.println("====== Running Non-cloneable Smart Asset Test ======"); |
||||
runTest(false, true, false, 100000); |
||||
} |
||||
} |
@ -0,0 +1,50 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.asset; |
||||
|
||||
import com.jme3.asset.AssetLoader; |
||||
import com.jme3.asset.AssetManager; |
||||
import com.jme3.asset.plugins.ClasspathLocator; |
||||
import com.jme3.system.JmeSystem; |
||||
|
||||
/** |
||||
* Demonstrates loading a file from a custom {@link AssetLoader} |
||||
*/ |
||||
public class TestCustomLoader { |
||||
public static void main(String[] args){ |
||||
AssetManager assetManager = JmeSystem.newAssetManager(); |
||||
assetManager.registerLocator("/", ClasspathLocator.class); |
||||
assetManager.registerLoader(TextLoader.class, "fnt"); |
||||
System.out.println(assetManager.loadAsset("Interface/Fonts/Console.fnt")); |
||||
} |
||||
} |
@ -0,0 +1,90 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.asset; |
||||
|
||||
import com.jme3.asset.*; |
||||
import com.jme3.asset.plugins.ClasspathLocator; |
||||
import com.jme3.asset.plugins.HttpZipLocator; |
||||
import com.jme3.asset.plugins.UrlLocator; |
||||
import com.jme3.asset.plugins.ZipLocator; |
||||
import com.jme3.system.JmeSystem; |
||||
|
||||
public class TestManyLocators { |
||||
public static void main(String[] args){ |
||||
AssetManager am = JmeSystem.newAssetManager(); |
||||
|
||||
am.registerLocator("http://www.jmonkeyengine.com/wp-content/uploads/2010/09/", |
||||
UrlLocator.class); |
||||
|
||||
am.registerLocator("town.zip", ZipLocator.class); |
||||
am.registerLocator("http://jmonkeyengine.googlecode.com/files/wildhouse.zip", |
||||
HttpZipLocator.class); |
||||
|
||||
|
||||
am.registerLocator("/", ClasspathLocator.class); |
||||
|
||||
|
||||
|
||||
// Try loading from Core-Data source package
|
||||
AssetInfo a = am.locateAsset(new AssetKey<Object>("Interface/Fonts/Default.fnt")); |
||||
|
||||
// Try loading from town scene zip file
|
||||
AssetInfo b = am.locateAsset(new ModelKey("casaamarela.jpg")); |
||||
|
||||
// Try loading from wildhouse online scene zip file
|
||||
AssetInfo c = am.locateAsset(new ModelKey("glasstile2.png")); |
||||
|
||||
// Try loading directly from HTTP
|
||||
AssetInfo d = am.locateAsset(new TextureKey("planet-2.jpg")); |
||||
|
||||
if (a == null) |
||||
System.out.println("Failed to load from classpath"); |
||||
else |
||||
System.out.println("Found classpath font: " + a.toString()); |
||||
|
||||
if (b == null) |
||||
System.out.println("Failed to load from town.zip"); |
||||
else |
||||
System.out.println("Found zip image: " + b.toString()); |
||||
|
||||
if (c == null) |
||||
System.out.println("Failed to load from wildhouse.zip on googlecode.com"); |
||||
else |
||||
System.out.println("Found online zip image: " + c.toString()); |
||||
|
||||
if (d == null) |
||||
System.out.println("Failed to load from HTTP"); |
||||
else |
||||
System.out.println("Found HTTP showcase image: " + d.toString()); |
||||
} |
||||
} |
@ -0,0 +1,85 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.asset; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.asset.TextureKey; |
||||
import com.jme3.asset.plugins.HttpZipLocator; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Quad; |
||||
import com.jme3.texture.Texture; |
||||
import com.jme3.ui.Picture; |
||||
|
||||
/** |
||||
* This tests loading a file from a jar stored online. |
||||
* @author Kirill Vainer |
||||
*/ |
||||
public class TestOnlineJar extends SimpleApplication { |
||||
|
||||
public static void main(String[] args){ |
||||
TestOnlineJar app = new TestOnlineJar(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
// create a simple plane/quad
|
||||
Quad quadMesh = new Quad(1, 1); |
||||
quadMesh.updateGeometry(1, 1, true); |
||||
|
||||
Geometry quad = new Geometry("Textured Quad", quadMesh); |
||||
|
||||
assetManager.registerLocator("https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/jmonkeyengine/town.zip", |
||||
HttpZipLocator.class); |
||||
assetManager.registerLocator("https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/jmonkeyengine/wildhouse.zip", |
||||
HttpZipLocator.class); |
||||
|
||||
Picture pic1 = new Picture("Picture1"); |
||||
pic1.move(0, 0, -1); |
||||
pic1.setPosition(0, 0); |
||||
pic1.setWidth(128); |
||||
pic1.setHeight(128); |
||||
pic1.setImage(assetManager, "grass.jpg", false); |
||||
guiNode.attachChild(pic1); |
||||
|
||||
Picture pic2 = new Picture("Picture1"); |
||||
pic2.move(0, 0, -1); |
||||
pic2.setPosition(128, 0); |
||||
pic2.setWidth(128); |
||||
pic2.setHeight(128); |
||||
pic2.setImage(assetManager, "glasstile2.png", false); |
||||
guiNode.attachChild(pic2); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,80 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.asset; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.asset.TextureKey; |
||||
import com.jme3.asset.plugins.UrlLocator; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Quad; |
||||
import com.jme3.texture.Texture; |
||||
|
||||
/** |
||||
* Load an image and display it from the internet using the UrlLocator. |
||||
* @author Kirill Vainer |
||||
*/ |
||||
public class TestUrlLoading extends SimpleApplication { |
||||
|
||||
public static void main(String[] args){ |
||||
TestUrlLoading app = new TestUrlLoading(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
// create a simple plane/quad
|
||||
Quad quadMesh = new Quad(1, 1); |
||||
quadMesh.updateGeometry(1, 1, true); |
||||
|
||||
Geometry quad = new Geometry("Textured Quad", quadMesh); |
||||
|
||||
assetManager.registerLocator("https://raw.githubusercontent.com/jMonkeyEngine/BookSamples/master/assets/Textures/", |
||||
UrlLocator.class); |
||||
TextureKey key = new TextureKey("mucha-window.png", false); |
||||
key.setGenerateMips(true); |
||||
Texture tex = assetManager.loadTexture(key); |
||||
|
||||
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat.setTexture("ColorMap", tex); |
||||
quad.setMaterial(mat); |
||||
|
||||
float aspect = tex.getImage().getWidth() / (float) tex.getImage().getHeight(); |
||||
quad.setLocalScale(new Vector3f(aspect * 1.5f, 1.5f, 1)); |
||||
quad.center(); |
||||
|
||||
rootNode.attachChild(quad); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,25 @@ |
||||
package jme3test.asset; |
||||
|
||||
import com.jme3.asset.AssetInfo; |
||||
import com.jme3.asset.AssetLoader; |
||||
import java.io.IOException; |
||||
import java.util.Scanner; |
||||
|
||||
/** |
||||
* An example implementation of {@link AssetLoader} to load text |
||||
* files as strings. |
||||
*/ |
||||
public class TextLoader implements AssetLoader { |
||||
public Object load(AssetInfo assetInfo) throws IOException { |
||||
Scanner scan = new Scanner(assetInfo.openStream()); |
||||
StringBuilder sb = new StringBuilder(); |
||||
try { |
||||
while (scan.hasNextLine()) { |
||||
sb.append(scan.nextLine()).append('\n'); |
||||
} |
||||
} finally { |
||||
scan.close(); |
||||
} |
||||
return sb.toString(); |
||||
} |
||||
} |
@ -0,0 +1,87 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are met: |
||||
* * * Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||
* POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.audio; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.audio.AudioData.DataType; |
||||
import com.jme3.audio.AudioNode; |
||||
import com.jme3.audio.Environment; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.ColorRGBA; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Box; |
||||
|
||||
public class TestAmbient extends SimpleApplication { |
||||
|
||||
private AudioNode nature, waves; |
||||
|
||||
public static void main(String[] args) { |
||||
TestAmbient test = new TestAmbient(); |
||||
test.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
float[] eax = new float[]{15, 38.0f, 0.300f, -1000, -3300, 0, |
||||
1.49f, 0.54f, 1.00f, -2560, 0.162f, 0.00f, 0.00f, |
||||
0.00f, -229, 0.088f, 0.00f, 0.00f, 0.00f, 0.125f, 1.000f, |
||||
0.250f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.00f, 0x3f}; |
||||
Environment env = new Environment(eax); |
||||
audioRenderer.setEnvironment(env); |
||||
|
||||
waves = new AudioNode(assetManager, "Sound/Environment/Ocean Waves.ogg", |
||||
DataType.Buffer); |
||||
waves.setPositional(true); |
||||
waves.setLocalTranslation(new Vector3f(0, 0,0)); |
||||
waves.setMaxDistance(100); |
||||
waves.setRefDistance(5); |
||||
|
||||
nature = new AudioNode(assetManager, "Sound/Environment/Nature.ogg", |
||||
DataType.Stream); |
||||
nature.setPositional(false); |
||||
nature.setVolume(3); |
||||
|
||||
waves.playInstance(); |
||||
nature.play(); |
||||
|
||||
// just a blue box to mark the spot
|
||||
Box box1 = new Box(.5f, .5f, .5f); |
||||
Geometry player = new Geometry("Player", box1); |
||||
Material mat1 = new Material(assetManager, |
||||
"Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat1.setColor("Color", ColorRGBA.Blue); |
||||
player.setMaterial(mat1); |
||||
rootNode.attachChild(player); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
} |
||||
} |
@ -0,0 +1,94 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.audio; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.audio.AudioData; |
||||
import com.jme3.audio.AudioNode; |
||||
import com.jme3.math.FastMath; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Sphere; |
||||
import com.jme3.scene.shape.Torus; |
||||
|
||||
/** |
||||
* Test Doppler Effect |
||||
*/ |
||||
public class TestDoppler extends SimpleApplication { |
||||
|
||||
private float pos = -5; |
||||
private float vel = 5; |
||||
private AudioNode ufoNode; |
||||
|
||||
public static void main(String[] args){ |
||||
TestDoppler test = new TestDoppler(); |
||||
test.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
flyCam.setMoveSpeed(10); |
||||
|
||||
Torus torus = new Torus(10, 6, 1, 3); |
||||
Geometry g = new Geometry("Torus Geom", torus); |
||||
g.rotate(-FastMath.HALF_PI, 0, 0); |
||||
g.center(); |
||||
|
||||
g.setMaterial(assetManager.loadMaterial("Common/Materials/RedColor.j3m")); |
||||
// rootNode.attachChild(g);
|
||||
|
||||
ufoNode = new AudioNode(assetManager, "Sound/Effects/Beep.ogg", AudioData.DataType.Buffer); |
||||
ufoNode.setLooping(true); |
||||
ufoNode.setPitch(0.5f); |
||||
ufoNode.setRefDistance(1); |
||||
ufoNode.setMaxDistance(100000000); |
||||
ufoNode.setVelocityFromTranslation(true); |
||||
ufoNode.play(); |
||||
|
||||
Geometry ball = new Geometry("Beeper", new Sphere(10, 10, 0.1f)); |
||||
ball.setMaterial(assetManager.loadMaterial("Common/Materials/RedColor.j3m")); |
||||
ufoNode.attachChild(ball); |
||||
|
||||
rootNode.attachChild(ufoNode); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
pos += tpf * vel; |
||||
if (pos < -10 || pos > 10) { |
||||
vel *= -1; |
||||
} |
||||
ufoNode.setLocalTranslation(new Vector3f(pos, 0, 0)); |
||||
} |
||||
} |
@ -0,0 +1,117 @@ |
||||
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
||||
<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> |
||||
<Properties> |
||||
<Property name="defaultCloseOperation" type="int" value="3"/> |
||||
</Properties> |
||||
<SyntheticProperties> |
||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/> |
||||
</SyntheticProperties> |
||||
<Events> |
||||
<EventHandler event="windowClosing" listener="java.awt.event.WindowListener" parameters="java.awt.event.WindowEvent" handler="formWindowClosing"/> |
||||
</Events> |
||||
<AuxValues> |
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/> |
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> |
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> |
||||
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,82,0,0,1,-112"/> |
||||
</AuxValues> |
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/> |
||||
<SubComponents> |
||||
<Container class="javax.swing.JPanel" name="pnlButtons"> |
||||
<Constraints> |
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription"> |
||||
<BorderConstraints direction="Center"/> |
||||
</Constraint> |
||||
</Constraints> |
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"/> |
||||
<SubComponents> |
||||
<Component class="javax.swing.JSlider" name="sldVolume"> |
||||
<Properties> |
||||
<Property name="majorTickSpacing" type="int" value="20"/> |
||||
<Property name="orientation" type="int" value="1"/> |
||||
<Property name="paintTicks" type="boolean" value="true"/> |
||||
<Property name="value" type="int" value="100"/> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="sldVolumeStateChanged"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JButton" name="btnRewind"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" value="<<"/> |
||||
</Properties> |
||||
</Component> |
||||
<Component class="javax.swing.JButton" name="btnStop"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" value="[ ]"/> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnStopActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JButton" name="btnPlay"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" value="II / >"/> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnPlayActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JButton" name="btnFF"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" value=">>"/> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnFFActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JButton" name="btnOpen"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" value="Open ..."/> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnOpenActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
</SubComponents> |
||||
</Container> |
||||
<Container class="javax.swing.JPanel" name="pnlBar"> |
||||
<Constraints> |
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription"> |
||||
<BorderConstraints direction="First"/> |
||||
</Constraint> |
||||
</Constraints> |
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"/> |
||||
<SubComponents> |
||||
<Component class="javax.swing.JLabel" name="lblTime"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" value="0:00-0:00"/> |
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor"> |
||||
<Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo"> |
||||
<EmptyBorder bottom="3" left="3" right="3" top="3"/> |
||||
</Border> |
||||
</Property> |
||||
</Properties> |
||||
</Component> |
||||
<Component class="javax.swing.JSlider" name="sldBar"> |
||||
<Properties> |
||||
<Property name="value" type="int" value="0"/> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="sldBarStateChanged"/> |
||||
</Events> |
||||
</Component> |
||||
</SubComponents> |
||||
</Container> |
||||
</SubComponents> |
||||
</Form> |
@ -0,0 +1,298 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.audio; |
||||
|
||||
import com.jme3.asset.AssetInfo; |
||||
import com.jme3.asset.AssetLoader; |
||||
import com.jme3.audio.*; |
||||
import com.jme3.audio.AudioSource.Status; |
||||
import com.jme3.audio.plugins.OGGLoader; |
||||
import com.jme3.audio.plugins.WAVLoader; |
||||
import com.jme3.system.AppSettings; |
||||
import com.jme3.system.JmeSystem; |
||||
import java.io.*; |
||||
import javax.swing.JFileChooser; |
||||
|
||||
public class TestMusicPlayer extends javax.swing.JFrame { |
||||
|
||||
private AudioRenderer ar; |
||||
private AudioData musicData; |
||||
private AudioNode musicSource; |
||||
private float musicLength = 0; |
||||
private float curTime = 0; |
||||
private Listener listener = new Listener(); |
||||
|
||||
public TestMusicPlayer() { |
||||
initComponents(); |
||||
setLocationRelativeTo(null); |
||||
initAudioPlayer(); |
||||
} |
||||
|
||||
private void initAudioPlayer(){ |
||||
AppSettings settings = new AppSettings(true); |
||||
settings.setRenderer(null); // disable rendering
|
||||
settings.setAudioRenderer("LWJGL"); |
||||
ar = JmeSystem.newAudioRenderer(settings); |
||||
ar.initialize(); |
||||
ar.setListener(listener); |
||||
AudioContext.setAudioRenderer(ar); |
||||
} |
||||
|
||||
/** This method is called from within the constructor to |
||||
* initialize the form. |
||||
* WARNING: Do NOT modify this code. The content of this method is |
||||
* always regenerated by the Form Editor. |
||||
*/ |
||||
@SuppressWarnings("unchecked") |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() { |
||||
|
||||
pnlButtons = new javax.swing.JPanel(); |
||||
sldVolume = new javax.swing.JSlider(); |
||||
btnRewind = new javax.swing.JButton(); |
||||
btnStop = new javax.swing.JButton(); |
||||
btnPlay = new javax.swing.JButton(); |
||||
btnFF = new javax.swing.JButton(); |
||||
btnOpen = new javax.swing.JButton(); |
||||
pnlBar = new javax.swing.JPanel(); |
||||
lblTime = new javax.swing.JLabel(); |
||||
sldBar = new javax.swing.JSlider(); |
||||
|
||||
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); |
||||
addWindowListener(new java.awt.event.WindowAdapter() { |
||||
public void windowClosing(java.awt.event.WindowEvent evt) { |
||||
formWindowClosing(evt); |
||||
} |
||||
}); |
||||
|
||||
pnlButtons.setLayout(new javax.swing.BoxLayout(pnlButtons, javax.swing.BoxLayout.LINE_AXIS)); |
||||
|
||||
sldVolume.setMajorTickSpacing(20); |
||||
sldVolume.setOrientation(javax.swing.JSlider.VERTICAL); |
||||
sldVolume.setPaintTicks(true); |
||||
sldVolume.setValue(100); |
||||
sldVolume.addChangeListener(new javax.swing.event.ChangeListener() { |
||||
public void stateChanged(javax.swing.event.ChangeEvent evt) { |
||||
sldVolumeStateChanged(evt); |
||||
} |
||||
}); |
||||
pnlButtons.add(sldVolume); |
||||
|
||||
btnRewind.setText("<<"); |
||||
pnlButtons.add(btnRewind); |
||||
|
||||
btnStop.setText("[ ]"); |
||||
btnStop.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
btnStopActionPerformed(evt); |
||||
} |
||||
}); |
||||
pnlButtons.add(btnStop); |
||||
|
||||
btnPlay.setText("II / >"); |
||||
btnPlay.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
btnPlayActionPerformed(evt); |
||||
} |
||||
}); |
||||
pnlButtons.add(btnPlay); |
||||
|
||||
btnFF.setText(">>"); |
||||
btnFF.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
btnFFActionPerformed(evt); |
||||
} |
||||
}); |
||||
pnlButtons.add(btnFF); |
||||
|
||||
btnOpen.setText("Open ..."); |
||||
btnOpen.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
btnOpenActionPerformed(evt); |
||||
} |
||||
}); |
||||
pnlButtons.add(btnOpen); |
||||
|
||||
getContentPane().add(pnlButtons, java.awt.BorderLayout.CENTER); |
||||
|
||||
pnlBar.setLayout(new javax.swing.BoxLayout(pnlBar, javax.swing.BoxLayout.LINE_AXIS)); |
||||
|
||||
lblTime.setText("0:00-0:00"); |
||||
lblTime.setBorder(javax.swing.BorderFactory.createEmptyBorder(3, 3, 3, 3)); |
||||
pnlBar.add(lblTime); |
||||
|
||||
sldBar.setValue(0); |
||||
sldBar.addChangeListener(new javax.swing.event.ChangeListener() { |
||||
public void stateChanged(javax.swing.event.ChangeEvent evt) { |
||||
sldBarStateChanged(evt); |
||||
} |
||||
}); |
||||
pnlBar.add(sldBar); |
||||
|
||||
getContentPane().add(pnlBar, java.awt.BorderLayout.PAGE_START); |
||||
|
||||
pack(); |
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void btnOpenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOpenActionPerformed
|
||||
JFileChooser chooser = new JFileChooser(); |
||||
chooser.setAcceptAllFileFilterUsed(true); |
||||
chooser.setDialogTitle("Select OGG file"); |
||||
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); |
||||
chooser.setMultiSelectionEnabled(false); |
||||
if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION){ |
||||
btnStopActionPerformed(null); |
||||
|
||||
final File selected = chooser.getSelectedFile(); |
||||
AssetLoader loader = null; |
||||
if(selected.getName().endsWith(".wav")){ |
||||
loader = new WAVLoader(); |
||||
}else{ |
||||
loader = new OGGLoader(); |
||||
} |
||||
|
||||
AudioKey key = new AudioKey(selected.getName(), true, true); |
||||
try{ |
||||
musicData = (AudioData) loader.load(new AssetInfo(null, key) { |
||||
@Override |
||||
public InputStream openStream() { |
||||
try{ |
||||
return new FileInputStream(selected); |
||||
}catch (FileNotFoundException ex){ |
||||
ex.printStackTrace(); |
||||
} |
||||
return null; |
||||
} |
||||
}); |
||||
}catch (IOException ex){ |
||||
ex.printStackTrace(); |
||||
} |
||||
|
||||
musicSource = new AudioNode(musicData, key); |
||||
musicLength = musicData.getDuration(); |
||||
updateTime(); |
||||
} |
||||
}//GEN-LAST:event_btnOpenActionPerformed
|
||||
|
||||
private void updateTime(){ |
||||
int max = (int) (musicLength * 100); |
||||
int pos = (int) (curTime * 100); |
||||
sldBar.setMaximum(max); |
||||
sldBar.setValue(pos); |
||||
|
||||
int minutesTotal = (int) (musicLength / 60); |
||||
int secondsTotal = (int) (musicLength % 60); |
||||
int minutesNow = (int) (curTime / 60); |
||||
int secondsNow = (int) (curTime % 60); |
||||
String txt = String.format("%01d:%02d-%01d:%02d", minutesNow, secondsNow, |
||||
minutesTotal, secondsTotal); |
||||
lblTime.setText(txt); |
||||
} |
||||
|
||||
private void btnPlayActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnPlayActionPerformed
|
||||
if (musicSource == null){ |
||||
btnOpenActionPerformed(evt); |
||||
return; |
||||
} |
||||
|
||||
if (musicSource.getStatus() == Status.Playing){ |
||||
musicSource.setPitch(1); |
||||
ar.pauseSource(musicSource); |
||||
}else{ |
||||
musicSource.setPitch(1); |
||||
musicSource.play(); |
||||
} |
||||
}//GEN-LAST:event_btnPlayActionPerformed
|
||||
|
||||
private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
|
||||
ar.cleanup(); |
||||
}//GEN-LAST:event_formWindowClosing
|
||||
|
||||
private void sldVolumeStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_sldVolumeStateChanged
|
||||
listener.setVolume( (float) sldVolume.getValue() / 100f); |
||||
ar.setListener(listener); |
||||
}//GEN-LAST:event_sldVolumeStateChanged
|
||||
|
||||
private void btnStopActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnStopActionPerformed
|
||||
if (musicSource != null){ |
||||
musicSource.setPitch(1); |
||||
ar.stopSource(musicSource); |
||||
} |
||||
}//GEN-LAST:event_btnStopActionPerformed
|
||||
|
||||
private void btnFFActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnFFActionPerformed
|
||||
if (musicSource.getStatus() == Status.Playing){ |
||||
musicSource.setPitch(2); |
||||
} |
||||
}//GEN-LAST:event_btnFFActionPerformed
|
||||
|
||||
private void sldBarStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_sldBarStateChanged
|
||||
if (musicSource != null && !sldBar.getValueIsAdjusting()){ |
||||
curTime = sldBar.getValue() / 100f; |
||||
if (curTime < 0) |
||||
curTime = 0; |
||||
|
||||
musicSource.setTimeOffset(curTime); |
||||
// if (musicSource.getStatus() == Status.Playing){
|
||||
// musicSource.stop();
|
||||
// musicSource.play();
|
||||
// }
|
||||
updateTime(); |
||||
} |
||||
}//GEN-LAST:event_sldBarStateChanged
|
||||
|
||||
/** |
||||
* @param args the command line arguments |
||||
*/ |
||||
public static void main(String args[]) { |
||||
java.awt.EventQueue.invokeLater(new Runnable() { |
||||
public void run() { |
||||
new TestMusicPlayer().setVisible(true); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton btnFF; |
||||
private javax.swing.JButton btnOpen; |
||||
private javax.swing.JButton btnPlay; |
||||
private javax.swing.JButton btnRewind; |
||||
private javax.swing.JButton btnStop; |
||||
private javax.swing.JLabel lblTime; |
||||
private javax.swing.JPanel pnlBar; |
||||
private javax.swing.JPanel pnlButtons; |
||||
private javax.swing.JSlider sldBar; |
||||
private javax.swing.JSlider sldVolume; |
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
} |
@ -0,0 +1,60 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.audio; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.asset.plugins.UrlLocator; |
||||
import com.jme3.audio.AudioData; |
||||
import com.jme3.audio.AudioNode; |
||||
|
||||
public class TestMusicStreaming extends SimpleApplication { |
||||
|
||||
public static void main(String[] args){ |
||||
TestMusicStreaming test = new TestMusicStreaming(); |
||||
test.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp(){ |
||||
assetManager.registerLocator("http://www.vorbis.com/music/", UrlLocator.class); |
||||
AudioNode audioSource = new AudioNode(assetManager, "Lumme-Badloop.ogg", |
||||
AudioData.DataType.Stream); |
||||
audioSource.setPositional(false); |
||||
audioSource.setReverbEnabled(false); |
||||
audioSource.play(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf){} |
||||
|
||||
} |
@ -0,0 +1,70 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.audio; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.audio.AudioData.DataType; |
||||
import com.jme3.audio.AudioNode; |
||||
import com.jme3.audio.AudioSource; |
||||
import com.jme3.audio.LowPassFilter; |
||||
|
||||
public class TestOgg extends SimpleApplication { |
||||
|
||||
private AudioNode audioSource; |
||||
|
||||
public static void main(String[] args){ |
||||
TestOgg test = new TestOgg(); |
||||
test.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp(){ |
||||
System.out.println("Playing without filter"); |
||||
audioSource = new AudioNode(assetManager, "Sound/Effects/Foot steps.ogg", DataType.Buffer); |
||||
audioSource.play(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf){ |
||||
if (audioSource.getStatus() != AudioSource.Status.Playing){ |
||||
audioRenderer.deleteAudioData(audioSource.getAudioData()); |
||||
|
||||
System.out.println("Playing with low pass filter"); |
||||
audioSource = new AudioNode(assetManager, "Sound/Effects/Foot steps.ogg", DataType.Buffer); |
||||
audioSource.setDryFilter(new LowPassFilter(1f, .1f)); |
||||
audioSource.setVolume(3); |
||||
audioSource.play(); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,81 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are met: |
||||
* * * Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||
* POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.audio; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.audio.AudioData; |
||||
import com.jme3.audio.AudioNode; |
||||
import com.jme3.audio.Environment; |
||||
import com.jme3.math.FastMath; |
||||
import com.jme3.math.Vector3f; |
||||
|
||||
public class TestReverb extends SimpleApplication { |
||||
|
||||
private AudioNode audioSource; |
||||
private float time = 0; |
||||
private float nextTime = 1; |
||||
|
||||
public static void main(String[] args) { |
||||
TestReverb test = new TestReverb(); |
||||
test.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
audioSource = new AudioNode(assetManager, "Sound/Effects/Bang.wav", |
||||
AudioData.DataType.Buffer); |
||||
|
||||
float[] eax = new float[]{15, 38.0f, 0.300f, -1000, -3300, 0, |
||||
1.49f, 0.54f, 1.00f, -2560, 0.162f, 0.00f, 0.00f, 0.00f, |
||||
-229, 0.088f, 0.00f, 0.00f, 0.00f, 0.125f, 1.000f, 0.250f, |
||||
0.000f, -5.0f, 5000.0f, 250.0f, 0.00f, 0x3f}; |
||||
audioRenderer.setEnvironment(new Environment(eax)); |
||||
Environment env = Environment.Cavern; |
||||
audioRenderer.setEnvironment(env); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
time += tpf; |
||||
|
||||
if (time > nextTime) { |
||||
Vector3f v = new Vector3f(); |
||||
v.setX(FastMath.nextRandomFloat()); |
||||
v.setY(FastMath.nextRandomFloat()); |
||||
v.setZ(FastMath.nextRandomFloat()); |
||||
v.multLocal(40, 2, 40); |
||||
v.subtractLocal(20, 1, 20); |
||||
|
||||
audioSource.setLocalTranslation(v); |
||||
audioSource.playInstance(); |
||||
time = 0; |
||||
nextTime = FastMath.nextRandomFloat() * 2 + 0.5f; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,62 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are met: |
||||
* * |
||||
* * Redistributions of source code must retain the above copyright notice, |
||||
* this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||
* POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.audio; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.audio.AudioData; |
||||
import com.jme3.audio.AudioNode; |
||||
|
||||
public class TestWav extends SimpleApplication { |
||||
|
||||
private float time = 0; |
||||
private AudioNode audioSource; |
||||
|
||||
public static void main(String[] args) { |
||||
TestWav test = new TestWav(); |
||||
test.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
time += tpf; |
||||
if (time > 1f) { |
||||
audioSource.playInstance(); |
||||
time = 0; |
||||
} |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
audioSource = new AudioNode(assetManager, "Sound/Effects/Gun.wav", |
||||
AudioData.DataType.Buffer); |
||||
audioSource.setLooping(false); |
||||
} |
||||
} |
@ -0,0 +1,150 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.awt; |
||||
|
||||
import com.jme3.app.LegacyApplication; |
||||
import com.jme3.system.AppSettings; |
||||
import com.jme3.system.JmeCanvasContext; |
||||
import com.jme3.system.JmeSystem; |
||||
import java.applet.Applet; |
||||
import java.awt.Canvas; |
||||
import java.awt.Graphics; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.net.MalformedURLException; |
||||
import java.net.URL; |
||||
import javax.swing.SwingUtilities; |
||||
|
||||
/** |
||||
* |
||||
* @author Kirill |
||||
*/ |
||||
public class AppHarness extends Applet { |
||||
|
||||
private JmeCanvasContext context; |
||||
private Canvas canvas; |
||||
private LegacyApplication app; |
||||
|
||||
private String appClass; |
||||
private URL appCfg = null; |
||||
|
||||
private void createCanvas(){ |
||||
AppSettings settings = new AppSettings(true); |
||||
|
||||
// load app cfg
|
||||
if (appCfg != null){ |
||||
try { |
||||
InputStream in = appCfg.openStream(); |
||||
settings.load(in); |
||||
in.close(); |
||||
} catch (IOException ex){ |
||||
ex.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
settings.setWidth(getWidth()); |
||||
settings.setHeight(getHeight()); |
||||
settings.setAudioRenderer(null); |
||||
|
||||
JmeSystem.setLowPermissions(true); |
||||
|
||||
try{ |
||||
Class<? extends LegacyApplication> clazz = (Class<? extends LegacyApplication>) Class.forName(appClass); |
||||
app = clazz.newInstance(); |
||||
}catch (ClassNotFoundException ex){ |
||||
ex.printStackTrace(); |
||||
}catch (InstantiationException ex){ |
||||
ex.printStackTrace(); |
||||
}catch (IllegalAccessException ex){ |
||||
ex.printStackTrace(); |
||||
} |
||||
|
||||
app.setSettings(settings); |
||||
app.createCanvas(); |
||||
|
||||
context = (JmeCanvasContext) app.getContext(); |
||||
canvas = context.getCanvas(); |
||||
canvas.setSize(getWidth(), getHeight()); |
||||
|
||||
add(canvas); |
||||
app.startCanvas(); |
||||
} |
||||
|
||||
@Override |
||||
public final void update(Graphics g) { |
||||
canvas.setSize(getWidth(), getHeight()); |
||||
} |
||||
|
||||
@Override |
||||
public void init(){ |
||||
appClass = getParameter("AppClass"); |
||||
if (appClass == null) |
||||
throw new RuntimeException("The required parameter AppClass isn't specified!"); |
||||
|
||||
try { |
||||
appCfg = new URL(getParameter("AppSettingsURL")); |
||||
} catch (MalformedURLException ex) { |
||||
ex.printStackTrace(); |
||||
appCfg = null; |
||||
} |
||||
|
||||
createCanvas(); |
||||
System.out.println("applet:init"); |
||||
} |
||||
|
||||
@Override |
||||
public void start(){ |
||||
context.setAutoFlushFrames(true); |
||||
System.out.println("applet:start"); |
||||
} |
||||
|
||||
@Override |
||||
public void stop(){ |
||||
context.setAutoFlushFrames(false); |
||||
System.out.println("applet:stop"); |
||||
} |
||||
|
||||
@Override |
||||
public void destroy(){ |
||||
System.out.println("applet:destroyStart"); |
||||
SwingUtilities.invokeLater(new Runnable(){ |
||||
public void run(){ |
||||
removeAll(); |
||||
System.out.println("applet:destroyRemoved"); |
||||
} |
||||
}); |
||||
app.stop(true); |
||||
System.out.println("applet:destroyDone"); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,145 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.awt; |
||||
|
||||
import com.jme3.app.LegacyApplication; |
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.system.AppSettings; |
||||
import com.jme3.system.JmeCanvasContext; |
||||
import com.jme3.system.JmeSystem; |
||||
import java.applet.Applet; |
||||
import java.awt.Canvas; |
||||
import java.awt.Graphics; |
||||
import java.util.concurrent.Callable; |
||||
import javax.swing.SwingUtilities; |
||||
|
||||
public class TestApplet extends Applet { |
||||
|
||||
private static JmeCanvasContext context; |
||||
private static LegacyApplication app; |
||||
private static Canvas canvas; |
||||
private static TestApplet applet; |
||||
|
||||
public TestApplet(){ |
||||
} |
||||
|
||||
public static void createCanvas(String appClass){ |
||||
AppSettings settings = new AppSettings(true); |
||||
settings.setWidth(640); |
||||
settings.setHeight(480); |
||||
// settings.setRenderer(AppSettings.JOGL);
|
||||
|
||||
JmeSystem.setLowPermissions(true); |
||||
|
||||
try{ |
||||
Class<? extends LegacyApplication> clazz = (Class<? extends LegacyApplication>) Class.forName(appClass); |
||||
app = clazz.newInstance(); |
||||
}catch (ClassNotFoundException ex){ |
||||
ex.printStackTrace(); |
||||
}catch (InstantiationException ex){ |
||||
ex.printStackTrace(); |
||||
}catch (IllegalAccessException ex){ |
||||
ex.printStackTrace(); |
||||
} |
||||
|
||||
app.setSettings(settings); |
||||
app.createCanvas(); |
||||
|
||||
context = (JmeCanvasContext) app.getContext(); |
||||
canvas = context.getCanvas(); |
||||
canvas.setSize(settings.getWidth(), settings.getHeight()); |
||||
} |
||||
|
||||
public static void startApp(){ |
||||
applet.add(canvas); |
||||
app.startCanvas(); |
||||
|
||||
app.enqueue(new Callable<Void>(){ |
||||
public Void call(){ |
||||
if (app instanceof SimpleApplication){ |
||||
SimpleApplication simpleApp = (SimpleApplication) app; |
||||
simpleApp.getFlyByCamera().setDragToRotate(true); |
||||
simpleApp.getInputManager().setCursorVisible(true); |
||||
} |
||||
return null; |
||||
} |
||||
}); |
||||
} |
||||
|
||||
public void freezeApp(){ |
||||
remove(canvas); |
||||
} |
||||
|
||||
public void unfreezeApp(){ |
||||
add(canvas); |
||||
} |
||||
|
||||
@Override |
||||
public final void update(Graphics g) { |
||||
// canvas.setSize(getWidth(), getHeight());
|
||||
} |
||||
|
||||
@Override |
||||
public void init(){ |
||||
applet = this; |
||||
createCanvas("jme3test.model.shape.TestBox"); |
||||
startApp(); |
||||
app.setPauseOnLostFocus(false); |
||||
System.out.println("applet:init"); |
||||
} |
||||
|
||||
@Override |
||||
public void start(){ |
||||
// context.setAutoFlushFrames(true);
|
||||
System.out.println("applet:start"); |
||||
} |
||||
|
||||
@Override |
||||
public void stop(){ |
||||
// context.setAutoFlushFrames(false);
|
||||
System.out.println("applet:stop"); |
||||
} |
||||
|
||||
@Override |
||||
public void destroy(){ |
||||
SwingUtilities.invokeLater(new Runnable(){ |
||||
public void run(){ |
||||
removeAll(); |
||||
System.out.println("applet:destroyStart"); |
||||
} |
||||
}); |
||||
app.stop(true); |
||||
System.out.println("applet:destroyEnd"); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,112 @@ |
||||
package jme3test.awt; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.system.AppSettings; |
||||
import com.jme3.system.awt.AwtPanel; |
||||
import com.jme3.system.awt.AwtPanelsContext; |
||||
import com.jme3.system.awt.PaintMode; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.awt.Toolkit; |
||||
import java.awt.event.WindowAdapter; |
||||
import java.awt.event.WindowEvent; |
||||
import java.util.concurrent.CountDownLatch; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
import javax.swing.JFrame; |
||||
import javax.swing.SwingUtilities; |
||||
|
||||
public class TestAwtPanels extends SimpleApplication { |
||||
|
||||
final private static CountDownLatch panelsAreReady = new CountDownLatch(1); |
||||
private static TestAwtPanels app; |
||||
private static AwtPanel panel, panel2; |
||||
private static int panelsClosed = 0; |
||||
|
||||
private static void createWindowForPanel(AwtPanel panel, int location){ |
||||
JFrame frame = new JFrame("Render Display " + location); |
||||
frame.getContentPane().setLayout(new BorderLayout()); |
||||
frame.getContentPane().add(panel, BorderLayout.CENTER); |
||||
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); |
||||
frame.addWindowListener(new WindowAdapter() { |
||||
@Override |
||||
public void windowClosed(WindowEvent e) { |
||||
if (++panelsClosed == 2){ |
||||
app.stop(); |
||||
} |
||||
} |
||||
}); |
||||
frame.pack(); |
||||
frame.setLocation(location, Toolkit.getDefaultToolkit().getScreenSize().height - 400); |
||||
frame.setVisible(true); |
||||
} |
||||
|
||||
public static void main(String[] args){ |
||||
Logger.getLogger("com.jme3").setLevel(Level.WARNING); |
||||
|
||||
app = new TestAwtPanels(); |
||||
app.setShowSettings(false); |
||||
AppSettings settings = new AppSettings(true); |
||||
settings.setCustomRenderer(AwtPanelsContext.class); |
||||
settings.setFrameRate(60); |
||||
app.setSettings(settings); |
||||
app.start(); |
||||
|
||||
SwingUtilities.invokeLater(new Runnable(){ |
||||
public void run(){ |
||||
/* |
||||
* Sleep 2 seconds to ensure there's no race condition. |
||||
* The sleep is not required for correctness. |
||||
*/ |
||||
try { |
||||
Thread.sleep(2000); |
||||
} catch (InterruptedException exception) { |
||||
return; |
||||
} |
||||
|
||||
final AwtPanelsContext ctx = (AwtPanelsContext) app.getContext(); |
||||
panel = ctx.createPanel(PaintMode.Accelerated); |
||||
panel.setPreferredSize(new Dimension(400, 300)); |
||||
ctx.setInputSource(panel); |
||||
|
||||
panel2 = ctx.createPanel(PaintMode.Accelerated); |
||||
panel2.setPreferredSize(new Dimension(400, 300)); |
||||
|
||||
createWindowForPanel(panel, 300); |
||||
createWindowForPanel(panel2, 700); |
||||
/* |
||||
* Both panels are ready. |
||||
*/ |
||||
panelsAreReady.countDown(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
flyCam.setDragToRotate(true); |
||||
|
||||
Box b = new Box(1, 1, 1); |
||||
Geometry geom = new Geometry("Box", b); |
||||
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); |
||||
geom.setMaterial(mat); |
||||
rootNode.attachChild(geom); |
||||
/* |
||||
* Wait until both AWT panels are ready. |
||||
*/ |
||||
try { |
||||
panelsAreReady.await(); |
||||
} catch (InterruptedException exception) { |
||||
throw new RuntimeException("Interrupted while waiting for panels", exception); |
||||
} |
||||
|
||||
panel.attachTo(true, viewPort); |
||||
guiViewPort.setClearFlags(true, true, true); |
||||
panel2.attachTo(false, guiViewPort); |
||||
} |
||||
} |
@ -0,0 +1,270 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.awt; |
||||
|
||||
import com.jme3.app.LegacyApplication; |
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.system.AppSettings; |
||||
import com.jme3.system.JmeCanvasContext; |
||||
import com.jme3.util.JmeFormatter; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Canvas; |
||||
import java.awt.Container; |
||||
import java.awt.Dimension; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.WindowAdapter; |
||||
import java.awt.event.WindowEvent; |
||||
import java.util.concurrent.Callable; |
||||
import java.util.logging.ConsoleHandler; |
||||
import java.util.logging.Handler; |
||||
import java.util.logging.Logger; |
||||
import javax.swing.*; |
||||
|
||||
public class TestCanvas { |
||||
|
||||
private static JmeCanvasContext context; |
||||
private static Canvas canvas; |
||||
private static LegacyApplication app; |
||||
private static JFrame frame; |
||||
private static Container canvasPanel1, canvasPanel2; |
||||
private static Container currentPanel; |
||||
private static JTabbedPane tabbedPane; |
||||
private static final String appClass = "jme3test.post.TestRenderToTexture"; |
||||
|
||||
private static void createTabs(){ |
||||
tabbedPane = new JTabbedPane(); |
||||
|
||||
canvasPanel1 = new JPanel(); |
||||
canvasPanel1.setLayout(new BorderLayout()); |
||||
tabbedPane.addTab("jME3 Canvas 1", canvasPanel1); |
||||
|
||||
canvasPanel2 = new JPanel(); |
||||
canvasPanel2.setLayout(new BorderLayout()); |
||||
tabbedPane.addTab("jME3 Canvas 2", canvasPanel2); |
||||
|
||||
frame.getContentPane().add(tabbedPane); |
||||
|
||||
currentPanel = canvasPanel1; |
||||
} |
||||
|
||||
private static void createMenu(){ |
||||
JMenuBar menuBar = new JMenuBar(); |
||||
frame.setJMenuBar(menuBar); |
||||
|
||||
JMenu menuTortureMethods = new JMenu("Canvas Torture Methods"); |
||||
menuBar.add(menuTortureMethods); |
||||
|
||||
final JMenuItem itemRemoveCanvas = new JMenuItem("Remove Canvas"); |
||||
menuTortureMethods.add(itemRemoveCanvas); |
||||
itemRemoveCanvas.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
if (itemRemoveCanvas.getText().equals("Remove Canvas")){ |
||||
currentPanel.remove(canvas); |
||||
|
||||
itemRemoveCanvas.setText("Add Canvas"); |
||||
}else if (itemRemoveCanvas.getText().equals("Add Canvas")){ |
||||
currentPanel.add(canvas, BorderLayout.CENTER); |
||||
|
||||
itemRemoveCanvas.setText("Remove Canvas"); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
final JMenuItem itemHideCanvas = new JMenuItem("Hide Canvas"); |
||||
menuTortureMethods.add(itemHideCanvas); |
||||
itemHideCanvas.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
if (itemHideCanvas.getText().equals("Hide Canvas")){ |
||||
canvas.setVisible(false); |
||||
itemHideCanvas.setText("Show Canvas"); |
||||
}else if (itemHideCanvas.getText().equals("Show Canvas")){ |
||||
canvas.setVisible(true); |
||||
itemHideCanvas.setText("Hide Canvas"); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
final JMenuItem itemSwitchTab = new JMenuItem("Switch to tab #2"); |
||||
menuTortureMethods.add(itemSwitchTab); |
||||
itemSwitchTab.addActionListener(new ActionListener(){ |
||||
public void actionPerformed(ActionEvent e){ |
||||
if (itemSwitchTab.getText().equals("Switch to tab #2")){ |
||||
canvasPanel1.remove(canvas); |
||||
canvasPanel2.add(canvas, BorderLayout.CENTER); |
||||
currentPanel = canvasPanel2; |
||||
itemSwitchTab.setText("Switch to tab #1"); |
||||
}else if (itemSwitchTab.getText().equals("Switch to tab #1")){ |
||||
canvasPanel2.remove(canvas); |
||||
canvasPanel1.add(canvas, BorderLayout.CENTER); |
||||
currentPanel = canvasPanel1; |
||||
itemSwitchTab.setText("Switch to tab #2"); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
JMenuItem itemSwitchLaf = new JMenuItem("Switch Look and Feel"); |
||||
menuTortureMethods.add(itemSwitchLaf); |
||||
itemSwitchLaf.addActionListener(new ActionListener(){ |
||||
public void actionPerformed(ActionEvent e){ |
||||
try { |
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); |
||||
} catch (Throwable t){ |
||||
t.printStackTrace(); |
||||
} |
||||
SwingUtilities.updateComponentTreeUI(frame); |
||||
frame.pack(); |
||||
} |
||||
}); |
||||
|
||||
JMenuItem itemSmallSize = new JMenuItem("Set size to (0, 0)"); |
||||
menuTortureMethods.add(itemSmallSize); |
||||
itemSmallSize.addActionListener(new ActionListener(){ |
||||
public void actionPerformed(ActionEvent e){ |
||||
Dimension preferred = frame.getPreferredSize(); |
||||
frame.setPreferredSize(new Dimension(0, 0)); |
||||
frame.pack(); |
||||
frame.setPreferredSize(preferred); |
||||
} |
||||
}); |
||||
|
||||
JMenuItem itemKillCanvas = new JMenuItem("Stop/Start Canvas"); |
||||
menuTortureMethods.add(itemKillCanvas); |
||||
itemKillCanvas.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
currentPanel.remove(canvas); |
||||
app.stop(true); |
||||
|
||||
createCanvas(appClass); |
||||
currentPanel.add(canvas, BorderLayout.CENTER); |
||||
frame.pack(); |
||||
startApp(); |
||||
} |
||||
}); |
||||
|
||||
JMenuItem itemExit = new JMenuItem("Exit"); |
||||
menuTortureMethods.add(itemExit); |
||||
itemExit.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent ae) { |
||||
frame.dispose(); |
||||
app.stop(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private static void createFrame(){ |
||||
frame = new JFrame("Test"); |
||||
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); |
||||
frame.addWindowListener(new WindowAdapter(){ |
||||
@Override |
||||
public void windowClosed(WindowEvent e) { |
||||
app.stop(); |
||||
} |
||||
}); |
||||
|
||||
createTabs(); |
||||
createMenu(); |
||||
} |
||||
|
||||
public static void createCanvas(String appClass){ |
||||
AppSettings settings = new AppSettings(true); |
||||
settings.setWidth(640); |
||||
settings.setHeight(480); |
||||
|
||||
try{ |
||||
Class<? extends LegacyApplication> clazz = (Class<? extends LegacyApplication>) Class.forName(appClass); |
||||
app = clazz.newInstance(); |
||||
}catch (ClassNotFoundException ex){ |
||||
ex.printStackTrace(); |
||||
}catch (InstantiationException ex){ |
||||
ex.printStackTrace(); |
||||
}catch (IllegalAccessException ex){ |
||||
ex.printStackTrace(); |
||||
} |
||||
|
||||
app.setPauseOnLostFocus(false); |
||||
app.setSettings(settings); |
||||
app.createCanvas(); |
||||
app.startCanvas(); |
||||
|
||||
context = (JmeCanvasContext) app.getContext(); |
||||
canvas = context.getCanvas(); |
||||
canvas.setSize(settings.getWidth(), settings.getHeight()); |
||||
} |
||||
|
||||
public static void startApp(){ |
||||
app.startCanvas(); |
||||
app.enqueue(new Callable<Void>(){ |
||||
public Void call(){ |
||||
if (app instanceof SimpleApplication){ |
||||
SimpleApplication simpleApp = (SimpleApplication) app; |
||||
simpleApp.getFlyByCamera().setDragToRotate(true); |
||||
} |
||||
return null; |
||||
} |
||||
}); |
||||
|
||||
} |
||||
|
||||
public static void main(String[] args){ |
||||
JmeFormatter formatter = new JmeFormatter(); |
||||
|
||||
Handler consoleHandler = new ConsoleHandler(); |
||||
consoleHandler.setFormatter(formatter); |
||||
|
||||
Logger.getLogger("").removeHandler(Logger.getLogger("").getHandlers()[0]); |
||||
Logger.getLogger("").addHandler(consoleHandler); |
||||
|
||||
createCanvas(appClass); |
||||
|
||||
try { |
||||
Thread.sleep(500); |
||||
} catch (InterruptedException ex) { |
||||
} |
||||
|
||||
SwingUtilities.invokeLater(new Runnable(){ |
||||
public void run(){ |
||||
JPopupMenu.setDefaultLightWeightPopupEnabled(false); |
||||
|
||||
createFrame(); |
||||
|
||||
currentPanel.add(canvas, BorderLayout.CENTER); |
||||
frame.pack(); |
||||
startApp(); |
||||
frame.setLocationRelativeTo(null); |
||||
frame.setVisible(true); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,69 @@ |
||||
package jme3test.awt; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.system.AppSettings; |
||||
import com.jme3.system.JmeCanvasContext; |
||||
import java.awt.Canvas; |
||||
import java.awt.event.WindowAdapter; |
||||
import java.awt.event.WindowEvent; |
||||
import javax.swing.JFrame; |
||||
|
||||
public class TestSafeCanvas extends SimpleApplication { |
||||
|
||||
public static void main(String[] args) throws InterruptedException{ |
||||
AppSettings settings = new AppSettings(true); |
||||
settings.setWidth(640); |
||||
settings.setHeight(480); |
||||
|
||||
final TestSafeCanvas app = new TestSafeCanvas(); |
||||
app.setPauseOnLostFocus(false); |
||||
app.setSettings(settings); |
||||
app.createCanvas(); |
||||
app.startCanvas(true); |
||||
|
||||
JmeCanvasContext context = (JmeCanvasContext) app.getContext(); |
||||
Canvas canvas = context.getCanvas(); |
||||
canvas.setSize(settings.getWidth(), settings.getHeight()); |
||||
|
||||
|
||||
|
||||
Thread.sleep(3000); |
||||
|
||||
JFrame frame = new JFrame("Test"); |
||||
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); |
||||
frame.addWindowListener(new WindowAdapter() { |
||||
@Override |
||||
public void windowClosing(WindowEvent e) { |
||||
app.stop(); |
||||
} |
||||
}); |
||||
frame.getContentPane().add(canvas); |
||||
frame.pack(); |
||||
frame.setLocationRelativeTo(null); |
||||
frame.setVisible(true); |
||||
|
||||
Thread.sleep(3000); |
||||
|
||||
frame.getContentPane().remove(canvas); |
||||
|
||||
Thread.sleep(3000); |
||||
|
||||
frame.getContentPane().add(canvas); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
flyCam.setDragToRotate(true); |
||||
|
||||
Box b = new Box(1, 1, 1); |
||||
Geometry geom = new Geometry("Box", b); |
||||
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); |
||||
geom.setMaterial(mat); |
||||
rootNode.attachChild(geom); |
||||
} |
||||
} |
@ -0,0 +1,175 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.batching; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bounding.BoundingBox; |
||||
import com.jme3.light.DirectionalLight; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.ColorRGBA; |
||||
import com.jme3.math.FastMath; |
||||
import com.jme3.math.Quaternion; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.BatchNode; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.Node; |
||||
import com.jme3.scene.Spatial; |
||||
import com.jme3.scene.debug.WireFrustum; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.system.NanoTimer; |
||||
import com.jme3.util.TangentBinormalGenerator; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class TestBatchNode extends SimpleApplication { |
||||
|
||||
public static void main(String[] args) { |
||||
|
||||
TestBatchNode app = new TestBatchNode(); |
||||
app.start(); |
||||
} |
||||
BatchNode batch; |
||||
WireFrustum frustum; |
||||
Geometry frustumMdl; |
||||
private Vector3f[] points; |
||||
|
||||
{ |
||||
points = new Vector3f[8]; |
||||
for (int i = 0; i < points.length; i++) { |
||||
points[i] = new Vector3f(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
timer = new NanoTimer(); |
||||
batch = new BatchNode("theBatchNode"); |
||||
|
||||
|
||||
|
||||
/** |
||||
* A cube with a color "bleeding" through transparent texture. Uses |
||||
* Texture from jme3-test-data library! |
||||
*/ |
||||
Box boxshape4 = new Box(1f, 1f, 1f); |
||||
cube = new Geometry("cube1", boxshape4); |
||||
Material mat = assetManager.loadMaterial("Textures/Terrain/Pond/Pond.j3m"); |
||||
cube.setMaterial(mat); |
||||
// Material mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md");
|
||||
// mat.setColor("Diffuse", ColorRGBA.Blue);
|
||||
// mat.setBoolean("UseMaterialColors", true);
|
||||
/** |
||||
* A cube with a color "bleeding" through transparent texture. Uses |
||||
* Texture from jme3-test-data library! |
||||
*/ |
||||
Box box = new Box(1f, 1f, 1f); |
||||
cube2 = new Geometry("cube2", box); |
||||
cube2.setMaterial(mat); |
||||
|
||||
TangentBinormalGenerator.generate(cube); |
||||
TangentBinormalGenerator.generate(cube2); |
||||
|
||||
|
||||
n = new Node("aNode"); |
||||
// n.attachChild(cube2);
|
||||
batch.attachChild(cube); |
||||
// batch.attachChild(cube2);
|
||||
// batch.setMaterial(mat);
|
||||
batch.batch(); |
||||
rootNode.attachChild(batch); |
||||
cube.setLocalTranslation(3, 0, 0); |
||||
cube2.setLocalTranslation(0, 20, 0); |
||||
|
||||
|
||||
updateBoindPoints(points); |
||||
frustum = new WireFrustum(points); |
||||
frustumMdl = new Geometry("f", frustum); |
||||
frustumMdl.setCullHint(Spatial.CullHint.Never); |
||||
frustumMdl.setMaterial(new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md")); |
||||
frustumMdl.getMaterial().getAdditionalRenderState().setWireframe(true); |
||||
frustumMdl.getMaterial().setColor("Color", ColorRGBA.Red); |
||||
rootNode.attachChild(frustumMdl); |
||||
dl = new DirectionalLight(); |
||||
dl.setColor(ColorRGBA.White.mult(2)); |
||||
dl.setDirection(new Vector3f(1, -1, -1)); |
||||
rootNode.addLight(dl); |
||||
flyCam.setMoveSpeed(10); |
||||
} |
||||
Node n; |
||||
Geometry cube; |
||||
Geometry cube2; |
||||
float time = 0; |
||||
DirectionalLight dl; |
||||
boolean done = false; |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
if (!done) { |
||||
done = true; |
||||
batch.attachChild(cube2); |
||||
batch.batch(); |
||||
} |
||||
updateBoindPoints(points); |
||||
frustum.update(points); |
||||
time += tpf; |
||||
dl.setDirection(cam.getDirection()); |
||||
cube2.setLocalTranslation(FastMath.sin(-time) * 3, FastMath.cos(time) * 3, 0); |
||||
cube2.setLocalRotation(new Quaternion().fromAngleAxis(time, Vector3f.UNIT_Z)); |
||||
cube2.setLocalScale(Math.max(FastMath.sin(time), 0.5f)); |
||||
|
||||
// batch.setLocalRotation(new Quaternion().fromAngleAxis(time, Vector3f.UNIT_Z));
|
||||
|
||||
} |
||||
//
|
||||
|
||||
public void updateBoindPoints(Vector3f[] points) { |
||||
BoundingBox bb = (BoundingBox) batch.getWorldBound(); |
||||
float xe = bb.getXExtent(); |
||||
float ye = bb.getYExtent(); |
||||
float ze = bb.getZExtent(); |
||||
float x = bb.getCenter().x; |
||||
float y = bb.getCenter().y; |
||||
float z = bb.getCenter().z; |
||||
|
||||
points[0].set(new Vector3f(x - xe, y - ye, z - ze)); |
||||
points[1].set(new Vector3f(x - xe, y + ye, z - ze)); |
||||
points[2].set(new Vector3f(x + xe, y + ye, z - ze)); |
||||
points[3].set(new Vector3f(x + xe, y - ye, z - ze)); |
||||
|
||||
points[4].set(new Vector3f(x + xe, y - ye, z + ze)); |
||||
points[5].set(new Vector3f(x - xe, y - ye, z + ze)); |
||||
points[6].set(new Vector3f(x - xe, y + ye, z + ze)); |
||||
points[7].set(new Vector3f(x + xe, y + ye, z + ze)); |
||||
} |
||||
} |
@ -0,0 +1,372 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.batching; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
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.Vector3f; |
||||
import com.jme3.post.FilterPostProcessor; |
||||
import com.jme3.post.filters.BloomFilter; |
||||
import com.jme3.scene.*; |
||||
import com.jme3.scene.debug.Arrow; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.system.AppSettings; |
||||
import com.jme3.system.NanoTimer; |
||||
import java.util.ArrayList; |
||||
import java.util.Random; |
||||
|
||||
public class TestBatchNodeCluster extends SimpleApplication { |
||||
|
||||
public static void main(String[] args) { |
||||
TestBatchNodeCluster app = new TestBatchNodeCluster(); |
||||
settingst = new AppSettings(true); |
||||
//settingst.setFrameRate(75);
|
||||
settingst.setResolution(640, 480); |
||||
settingst.setVSync(false); |
||||
settingst.setFullscreen(false); |
||||
app.setSettings(settingst); |
||||
app.setShowSettings(false); |
||||
app.start(); |
||||
} |
||||
private ActionListener al = new ActionListener() { |
||||
|
||||
public void onAction(String name, boolean isPressed, float tpf) { |
||||
if (name.equals("Start Game")) { |
||||
// randomGenerator();
|
||||
} |
||||
} |
||||
}; |
||||
protected Random rand = new Random(); |
||||
protected int maxCubes = 2000; |
||||
protected int startAt = 0; |
||||
protected static int xPositions = 0, yPositions = 0, zPositions = 0; |
||||
protected int returner = 0; |
||||
protected ArrayList<Integer> xPosition = new ArrayList<Integer>(); |
||||
protected ArrayList<Integer> yPosition = new ArrayList<Integer>(); |
||||
protected ArrayList<Integer> zPosition = new ArrayList<Integer>(); |
||||
protected int xLimitf = 60, xLimits = -60, yLimitf = 60, yLimits = -20, zLimitf = 60, zLimits = -60; |
||||
protected int circ = 8;//increases by 8 every time.
|
||||
protected int dynamic = 4; |
||||
protected static AppSettings settingst; |
||||
protected boolean isTrue = true; |
||||
private int lineLength = 50; |
||||
protected BatchNode batchNode; |
||||
Material mat1; |
||||
Material mat2; |
||||
Material mat3; |
||||
Material mat4; |
||||
Node terrain; |
||||
//protected
|
||||
// protected Geometry player;
|
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
timer = new NanoTimer(); |
||||
|
||||
batchNode = new SimpleBatchNode("BatchNode"); |
||||
|
||||
|
||||
xPosition.add(0); |
||||
yPosition.add(0); |
||||
zPosition.add(0); |
||||
|
||||
mat1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat1.setColor("Color", ColorRGBA.White); |
||||
mat1.setColor("GlowColor", ColorRGBA.Blue.mult(10)); |
||||
|
||||
mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat2.setColor("Color", ColorRGBA.White); |
||||
mat2.setColor("GlowColor", ColorRGBA.Red.mult(10)); |
||||
|
||||
mat3 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat3.setColor("Color", ColorRGBA.White); |
||||
mat3.setColor("GlowColor", ColorRGBA.Yellow.mult(10)); |
||||
|
||||
mat4 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat4.setColor("Color", ColorRGBA.White); |
||||
mat4.setColor("GlowColor", ColorRGBA.Orange.mult(10)); |
||||
|
||||
randomGenerator(); |
||||
|
||||
//rootNode.attachChild(SkyFactory.createSky(
|
||||
// assetManager, "Textures/SKY02.zip", false));
|
||||
inputManager.addMapping("Start Game", new KeyTrigger(KeyInput.KEY_J)); |
||||
inputManager.addListener(al, new String[]{"Start Game"}); |
||||
|
||||
|
||||
cam.setLocation(new Vector3f(-34.403286f, 126.65158f, 434.791f)); |
||||
cam.setRotation(new Quaternion(0.022630932f, 0.9749435f, -0.18736298f, 0.11776358f)); |
||||
|
||||
|
||||
batchNode.batch(); |
||||
|
||||
|
||||
terrain = new Node("terrain"); |
||||
terrain.setLocalTranslation(50, 0, 50); |
||||
terrain.attachChild(batchNode); |
||||
|
||||
flyCam.setMoveSpeed(100); |
||||
rootNode.attachChild(terrain); |
||||
Vector3f pos = new Vector3f(-40, 0, -40); |
||||
batchNode.setLocalTranslation(pos); |
||||
|
||||
|
||||
Arrow a = new Arrow(new Vector3f(0, 50, 0)); |
||||
Geometry g = new Geometry("a", a); |
||||
g.setLocalTranslation(terrain.getLocalTranslation()); |
||||
Material m = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
m.setColor("Color", ColorRGBA.Blue); |
||||
g.setMaterial(m); |
||||
|
||||
|
||||
|
||||
FilterPostProcessor fpp = new FilterPostProcessor(assetManager); |
||||
fpp.addFilter(new BloomFilter(BloomFilter.GlowMode.Objects)); |
||||
// SSAOFilter ssao = new SSAOFilter(8.630104f,22.970434f,2.9299977f,0.2999997f);
|
||||
// fpp.addFilter(ssao);
|
||||
viewPort.addProcessor(fpp); |
||||
// viewPort.setBackgroundColor(ColorRGBA.DarkGray);
|
||||
} |
||||
|
||||
public void randomGenerator() { |
||||
for (int i = startAt; i < maxCubes - 1; i++) { |
||||
randomize(); |
||||
Geometry box = new Geometry("Box" + i, new Box(1, 1, 1)); |
||||
box.setLocalTranslation(new Vector3f(xPosition.get(xPosition.size() - 1), |
||||
yPosition.get(yPosition.size() - 1), |
||||
zPosition.get(zPosition.size() - 1))); |
||||
batchNode.attachChild(box); |
||||
if (i < 500) { |
||||
box.setMaterial(mat1); |
||||
} else if (i < 1000) { |
||||
|
||||
box.setMaterial(mat2); |
||||
} else if (i < 1500) { |
||||
|
||||
box.setMaterial(mat3); |
||||
} else { |
||||
|
||||
box.setMaterial(mat4); |
||||
} |
||||
|
||||
} |
||||
} |
||||
|
||||
// public BatchNode randomBatch() {
|
||||
//
|
||||
// int randomn = rand.nextInt(4);
|
||||
// if (randomn == 0) {
|
||||
// return blue;
|
||||
// } else if (randomn == 1) {
|
||||
// return brown;
|
||||
// } else if (randomn == 2) {
|
||||
// return pink;
|
||||
// } else if (randomn == 3) {
|
||||
// return orange;
|
||||
// }
|
||||
// return null;
|
||||
// }
|
||||
public ColorRGBA randomColor() { |
||||
ColorRGBA color = ColorRGBA.Black; |
||||
int randomn = rand.nextInt(4); |
||||
if (randomn == 0) { |
||||
color = ColorRGBA.Orange; |
||||
} else if (randomn == 1) { |
||||
color = ColorRGBA.Blue; |
||||
} else if (randomn == 2) { |
||||
color = ColorRGBA.Brown; |
||||
} else if (randomn == 3) { |
||||
color = ColorRGBA.Magenta; |
||||
} |
||||
return color; |
||||
} |
||||
|
||||
public void randomize() { |
||||
int xpos = xPosition.get(xPosition.size() - 1); |
||||
int ypos = yPosition.get(yPosition.size() - 1); |
||||
int zpos = zPosition.get(zPosition.size() - 1); |
||||
int x = 0; |
||||
int y = 0; |
||||
int z = 0; |
||||
boolean unTrue = true; |
||||
while (unTrue) { |
||||
unTrue = false; |
||||
boolean xChanged = false; |
||||
x = 0; |
||||
y = 0; |
||||
z = 0; |
||||
if (xpos >= lineLength * 2) { |
||||
x = 2; |
||||
xChanged = true; |
||||
} else { |
||||
x = xPosition.get(xPosition.size() - 1) + 2; |
||||
} |
||||
if (xChanged) { |
||||
//y = yPosition.get(yPosition.size() - lineLength) + 2;
|
||||
} else { |
||||
y = rand.nextInt(3); |
||||
if (yPosition.size() > lineLength) { |
||||
if (yPosition.size() > 51) { |
||||
if (y == 0 && ypos < yLimitf && getym(lineLength) > ypos - 2) { |
||||
y = ypos + 2; |
||||
} else if (y == 1 && ypos > yLimits && getym(lineLength) < ypos + 2) { |
||||
y = ypos - 2; |
||||
} else if (y == 2 && getym(lineLength) > ypos - 2 && getym(lineLength) < ypos + 2) { |
||||
y = ypos; |
||||
} else { |
||||
if (ypos >= yLimitf) { |
||||
y = ypos - 2; |
||||
} else if (ypos <= yLimits) { |
||||
y = ypos + 2; |
||||
} else if (y == 0 && getym(lineLength) >= ypos - 4) { |
||||
y = ypos - 2; |
||||
} else if (y == 0 && getym(lineLength) >= ypos - 2) { |
||||
y = ypos; |
||||
} else if (y == 1 && getym(lineLength) >= ypos + 4) { |
||||
y = ypos + 2; |
||||
} else if (y == 1 && getym(lineLength) >= ypos + 2) { |
||||
y = ypos; |
||||
} else if (y == 2 && getym(lineLength) <= ypos - 2) { |
||||
y = ypos - 2; |
||||
} else if (y == 2 && getym(lineLength) >= ypos + 2) { |
||||
y = ypos + 2; |
||||
} else { |
||||
System.out.println("wtf"); |
||||
} |
||||
} |
||||
} else if (yPosition.size() == lineLength) { |
||||
if (y == 0 && ypos < yLimitf) { |
||||
y = getym(lineLength) + 2; |
||||
} else if (y == 1 && ypos > yLimits) { |
||||
y = getym(lineLength) - 2; |
||||
} |
||||
} |
||||
} else { |
||||
if (y == 0 && ypos < yLimitf) { |
||||
y = ypos + 2; |
||||
} else if (y == 1 && ypos > yLimits) { |
||||
y = ypos - 2; |
||||
} else if (y == 2) { |
||||
y = ypos; |
||||
} else if (y == 0 && ypos >= yLimitf) { |
||||
y = ypos - 2; |
||||
} else if (y == 1 && ypos <= yLimits) { |
||||
y = ypos + 2; |
||||
} |
||||
} |
||||
} |
||||
if (xChanged) { |
||||
z = zpos + 2; |
||||
} else { |
||||
z = zpos; |
||||
} |
||||
// for (int i = 0; i < xPosition.size(); i++)
|
||||
// {
|
||||
// if (x - xPosition.get(i) <= 1 && x - xPosition.get(i) >= -1 &&
|
||||
// y - yPosition.get(i) <= 1 && y - yPosition.get(i) >= -1
|
||||
// &&z - zPosition.get(i) <= 1 && z - zPosition.get(i) >=
|
||||
// -1)
|
||||
// {
|
||||
// unTrue = true;
|
||||
// }
|
||||
// }
|
||||
} |
||||
xPosition.add(x); |
||||
yPosition.add(y); |
||||
zPosition.add(z); |
||||
} |
||||
|
||||
public int getxm(int i) { |
||||
return xPosition.get(xPosition.size() - i); |
||||
} |
||||
|
||||
public int getym(int i) { |
||||
return yPosition.get(yPosition.size() - i); |
||||
} |
||||
|
||||
public int getzm(int i) { |
||||
return zPosition.get(zPosition.size() - i); |
||||
} |
||||
|
||||
public int getx(int i) { |
||||
return xPosition.get(i); |
||||
} |
||||
|
||||
public int gety(int i) { |
||||
return yPosition.get(i); |
||||
} |
||||
|
||||
public int getz(int i) { |
||||
return zPosition.get(i); |
||||
} |
||||
long nbFrames = 0; |
||||
long cullTime = 0; |
||||
float time = 0; |
||||
Vector3f lookAtPos = new Vector3f(0, 0, 0); |
||||
float xpos = 0; |
||||
Spatial box; |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
time += tpf; |
||||
int random = rand.nextInt(2000); |
||||
float mult1 = 1.0f; |
||||
float mult2 = 1.0f; |
||||
if (random < 500) { |
||||
mult1 = 1.0f; |
||||
mult2 = 1.0f; |
||||
} else if (random < 1000) { |
||||
mult1 = -1.0f; |
||||
mult2 = 1.0f; |
||||
} else if (random < 1500) { |
||||
mult1 = 1.0f; |
||||
mult2 = -1.0f; |
||||
} else if (random <= 2000) { |
||||
mult1 = -1.0f; |
||||
mult2 = -1.0f; |
||||
} |
||||
box = batchNode.getChild("Box" + random); |
||||
if (box != null) { |
||||
Vector3f v = box.getLocalTranslation(); |
||||
box.setLocalTranslation(v.x + FastMath.sin(time * mult1) * 20, v.y + (FastMath.sin(time * mult1) * FastMath.cos(time * mult1) * 20), v.z + FastMath.cos(time * mult2) * 20); |
||||
} |
||||
terrain.setLocalRotation(new Quaternion().fromAngleAxis(time, Vector3f.UNIT_Y)); |
||||
|
||||
|
||||
} |
||||
} |
@ -0,0 +1,252 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.batching; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.asset.TextureKey; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.font.BitmapText; |
||||
import com.jme3.input.MouseInput; |
||||
import com.jme3.input.controls.ActionListener; |
||||
import com.jme3.input.controls.MouseButtonTrigger; |
||||
import com.jme3.light.DirectionalLight; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.Vector2f; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.post.FilterPostProcessor; |
||||
import com.jme3.renderer.queue.RenderQueue.ShadowMode; |
||||
import com.jme3.scene.BatchNode; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.scene.shape.Sphere; |
||||
import com.jme3.scene.shape.Sphere.TextureMode; |
||||
import com.jme3.shadow.CompareMode; |
||||
import com.jme3.shadow.DirectionalLightShadowFilter; |
||||
import com.jme3.shadow.EdgeFilteringMode; |
||||
import com.jme3.system.AppSettings; |
||||
import com.jme3.system.NanoTimer; |
||||
import com.jme3.texture.Texture; |
||||
import com.jme3.texture.Texture.WrapMode; |
||||
import jme3test.bullet.BombControl; |
||||
|
||||
/** |
||||
* |
||||
* @author double1984 (tower mod by atom) |
||||
*/ |
||||
public class TestBatchNodeTower extends SimpleApplication { |
||||
|
||||
int bricksPerLayer = 8; |
||||
int brickLayers = 30; |
||||
|
||||
static float brickWidth = .75f, brickHeight = .25f, brickDepth = .25f; |
||||
float radius = 3f; |
||||
float angle = 0; |
||||
|
||||
|
||||
Material mat; |
||||
Material mat2; |
||||
Material mat3; |
||||
DirectionalLightShadowFilter shadowRenderer; |
||||
private Sphere bullet; |
||||
private Box brick; |
||||
private SphereCollisionShape bulletCollisionShape; |
||||
|
||||
private BulletAppState bulletAppState; |
||||
BatchNode batchNode = new BatchNode("batch Node"); |
||||
|
||||
public static void main(String args[]) { |
||||
TestBatchNodeTower f = new TestBatchNodeTower(); |
||||
AppSettings s = new AppSettings(true); |
||||
f.setSettings(s); |
||||
f.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
timer = new NanoTimer(); |
||||
bulletAppState = new BulletAppState(); |
||||
bulletAppState.setThreadingType(BulletAppState.ThreadingType.PARALLEL); |
||||
// bulletAppState.setEnabled(false);
|
||||
stateManager.attach(bulletAppState); |
||||
bullet = new Sphere(32, 32, 0.4f, true, false); |
||||
bullet.setTextureMode(TextureMode.Projected); |
||||
bulletCollisionShape = new SphereCollisionShape(0.4f); |
||||
|
||||
brick = new Box(brickWidth, brickHeight, brickDepth); |
||||
brick.scaleTextureCoordinates(new Vector2f(1f, .5f)); |
||||
//bulletAppState.getPhysicsSpace().enableDebug(assetManager);
|
||||
initMaterial(); |
||||
initTower(); |
||||
initFloor(); |
||||
initCrossHairs(); |
||||
this.cam.setLocation(new Vector3f(0, 25f, 8f)); |
||||
cam.lookAt(Vector3f.ZERO, new Vector3f(0, 1, 0)); |
||||
cam.setFrustumFar(80); |
||||
inputManager.addMapping("shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); |
||||
inputManager.addListener(actionListener, "shoot"); |
||||
rootNode.setShadowMode(ShadowMode.Off); |
||||
|
||||
batchNode.batch(); |
||||
batchNode.setShadowMode(ShadowMode.CastAndReceive); |
||||
rootNode.attachChild(batchNode); |
||||
|
||||
|
||||
shadowRenderer = new DirectionalLightShadowFilter(assetManager, 1024, 2); |
||||
DirectionalLight dl = new DirectionalLight(); |
||||
dl.setDirection(new Vector3f(-1, -1, -1).normalizeLocal()); |
||||
shadowRenderer.setLight(dl); |
||||
shadowRenderer.setLambda(0.55f); |
||||
shadowRenderer.setShadowIntensity(0.6f); |
||||
shadowRenderer.setShadowCompareMode(CompareMode.Hardware); |
||||
shadowRenderer.setEdgeFilteringMode(EdgeFilteringMode.PCF4); |
||||
FilterPostProcessor fpp = new FilterPostProcessor(assetManager); |
||||
fpp.addFilter(shadowRenderer); |
||||
viewPort.addProcessor(fpp); |
||||
} |
||||
|
||||
private PhysicsSpace getPhysicsSpace() { |
||||
return bulletAppState.getPhysicsSpace(); |
||||
} |
||||
private ActionListener actionListener = new ActionListener() { |
||||
|
||||
public void onAction(String name, boolean keyPressed, float tpf) { |
||||
if (name.equals("shoot") && !keyPressed) { |
||||
Geometry bulletg = new Geometry("bullet", bullet); |
||||
bulletg.setMaterial(mat2); |
||||
bulletg.setShadowMode(ShadowMode.CastAndReceive); |
||||
bulletg.setLocalTranslation(cam.getLocation()); |
||||
RigidBodyControl bulletNode = new BombControl(assetManager, bulletCollisionShape, 1); |
||||
// RigidBodyControl bulletNode = new RigidBodyControl(bulletCollisionShape, 1);
|
||||
bulletNode.setLinearVelocity(cam.getDirection().mult(25)); |
||||
bulletg.addControl(bulletNode); |
||||
rootNode.attachChild(bulletg); |
||||
getPhysicsSpace().add(bulletNode); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
public void initTower() { |
||||
double tempX = 0; |
||||
double tempY = 0; |
||||
double tempZ = 0; |
||||
angle = 0f; |
||||
for (int i = 0; i < brickLayers; i++){ |
||||
// Increment rows
|
||||
if (i != 0) { |
||||
tempY += brickHeight * 2; |
||||
} else { |
||||
tempY = brickHeight; |
||||
} |
||||
// Alternate brick seams
|
||||
angle = 360.0f / bricksPerLayer * i/2f; |
||||
for (int j = 0; j < bricksPerLayer; j++){ |
||||
tempZ = Math.cos(Math.toRadians(angle))*radius; |
||||
tempX = Math.sin(Math.toRadians(angle))*radius; |
||||
System.out.println("x="+((float)(tempX))+" y="+((float)(tempY))+" z="+(float)(tempZ)); |
||||
Vector3f vt = new Vector3f((float)(tempX), (float)(tempY), (float)(tempZ)); |
||||
// Add crenelation
|
||||
if (i==brickLayers-1){ |
||||
if (j%2 == 0){ |
||||
addBrick(vt); |
||||
} |
||||
} |
||||
// Create main tower
|
||||
else { |
||||
addBrick(vt); |
||||
} |
||||
angle += 360.0/bricksPerLayer; |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
public void initFloor() { |
||||
Box floorBox = new Box(10f, 0.1f, 5f); |
||||
floorBox.scaleTextureCoordinates(new Vector2f(3, 6)); |
||||
|
||||
Geometry floor = new Geometry("floor", floorBox); |
||||
floor.setMaterial(mat3); |
||||
floor.setShadowMode(ShadowMode.Receive); |
||||
floor.setLocalTranslation(0, 0, 0); |
||||
floor.addControl(new RigidBodyControl(0)); |
||||
this.rootNode.attachChild(floor); |
||||
this.getPhysicsSpace().add(floor); |
||||
} |
||||
|
||||
public void initMaterial() { |
||||
mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
TextureKey key = new TextureKey("Textures/Terrain/BrickWall/BrickWall.jpg"); |
||||
key.setGenerateMips(true); |
||||
Texture tex = assetManager.loadTexture(key); |
||||
mat.setTexture("ColorMap", tex); |
||||
|
||||
mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
TextureKey key2 = new TextureKey("Textures/Terrain/Rock/Rock.PNG"); |
||||
key2.setGenerateMips(true); |
||||
Texture tex2 = assetManager.loadTexture(key2); |
||||
mat2.setTexture("ColorMap", tex2); |
||||
|
||||
mat3 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
TextureKey key3 = new TextureKey("Textures/Terrain/Pond/Pond.jpg"); |
||||
key3.setGenerateMips(true); |
||||
Texture tex3 = assetManager.loadTexture(key3); |
||||
tex3.setWrap(WrapMode.Repeat); |
||||
mat3.setTexture("ColorMap", tex3); |
||||
} |
||||
int nbBrick =0; |
||||
public void addBrick(Vector3f ori) { |
||||
Geometry reBoxg = new Geometry("brick", brick); |
||||
reBoxg.setMaterial(mat); |
||||
reBoxg.setLocalTranslation(ori); |
||||
reBoxg.rotate(0f, (float)Math.toRadians(angle) , 0f ); |
||||
reBoxg.addControl(new RigidBodyControl(1.5f)); |
||||
reBoxg.setShadowMode(ShadowMode.CastAndReceive); |
||||
reBoxg.getControl(RigidBodyControl.class).setFriction(1.6f); |
||||
this.batchNode.attachChild(reBoxg); |
||||
this.getPhysicsSpace().add(reBoxg); |
||||
nbBrick++; |
||||
} |
||||
|
||||
protected void initCrossHairs() { |
||||
guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt"); |
||||
BitmapText ch = new BitmapText(guiFont, false); |
||||
ch.setSize(guiFont.getCharSet().getRenderedSize() * 2); |
||||
ch.setText("+"); // crosshairs
|
||||
ch.setLocalTranslation( // center
|
||||
settings.getWidth() / 2 - guiFont.getCharSet().getRenderedSize() / 3 * 2, |
||||
settings.getHeight() / 2 + ch.getLineHeight() / 2, 0); |
||||
guiNode.attachChild(ch); |
||||
} |
||||
} |
@ -0,0 +1,83 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.blender; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.light.DirectionalLight; |
||||
import com.jme3.math.ColorRGBA; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Spatial; |
||||
|
||||
public class TestBlenderLoader extends SimpleApplication { |
||||
|
||||
public static void main(String[] args){ |
||||
TestBlenderLoader app = new TestBlenderLoader(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
viewPort.setBackgroundColor(ColorRGBA.DarkGray); |
||||
|
||||
//load model with packed images
|
||||
Spatial ogre = assetManager.loadModel("Blender/2.4x/Sinbad.blend"); |
||||
rootNode.attachChild(ogre); |
||||
|
||||
//load model with referenced images
|
||||
Spatial track = assetManager.loadModel("Blender/2.4x/MountainValley_Track.blend"); |
||||
rootNode.attachChild(track); |
||||
|
||||
// sunset light
|
||||
DirectionalLight dl = new DirectionalLight(); |
||||
dl.setDirection(new Vector3f(-0.1f,-0.7f,1).normalizeLocal()); |
||||
dl.setColor(new ColorRGBA(0.44f, 0.30f, 0.20f, 1.0f)); |
||||
rootNode.addLight(dl); |
||||
|
||||
// skylight
|
||||
dl = new DirectionalLight(); |
||||
dl.setDirection(new Vector3f(-0.6f,-1,-0.6f).normalizeLocal()); |
||||
dl.setColor(new ColorRGBA(0.10f, 0.22f, 0.44f, 1.0f)); |
||||
rootNode.addLight(dl); |
||||
|
||||
// white ambient light
|
||||
dl = new DirectionalLight(); |
||||
dl.setDirection(new Vector3f(1, -0.5f,-0.1f).normalizeLocal()); |
||||
dl.setColor(new ColorRGBA(0.80f, 0.70f, 0.80f, 1.0f)); |
||||
rootNode.addLight(dl); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf){ |
||||
} |
||||
|
||||
} |
@ -0,0 +1,65 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.bounding; |
||||
|
||||
import com.jme3.bounding.BoundingBox; |
||||
import com.jme3.collision.CollisionResults; |
||||
import com.jme3.math.Ray; |
||||
import com.jme3.math.Vector3f; |
||||
|
||||
/** |
||||
* Tests picking/collision between bounds and shapes. |
||||
*/ |
||||
public class TestRayCollision { |
||||
|
||||
public static void main(String[] args){ |
||||
Ray r = new Ray(Vector3f.ZERO, Vector3f.UNIT_X); |
||||
BoundingBox bbox = new BoundingBox(new Vector3f(5, 0, 0), 1, 1, 1); |
||||
|
||||
CollisionResults res = new CollisionResults(); |
||||
bbox.collideWith(r, res); |
||||
|
||||
System.out.println("Bounding:" +bbox); |
||||
System.out.println("Ray: "+r); |
||||
|
||||
System.out.println("Num collisions: "+res.size()); |
||||
for (int i = 0; i < res.size(); i++){ |
||||
System.out.println("--- Collision #"+i+" ---"); |
||||
float dist = res.getCollision(i).getDistance(); |
||||
Vector3f pt = res.getCollision(i).getContactPoint(); |
||||
System.out.println("distance: "+dist); |
||||
System.out.println("point: "+pt); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,217 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.asset.AssetManager; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.PhysicsTickListener; |
||||
import com.jme3.bullet.collision.PhysicsCollisionEvent; |
||||
import com.jme3.bullet.collision.PhysicsCollisionListener; |
||||
import com.jme3.bullet.collision.PhysicsCollisionObject; |
||||
import com.jme3.bullet.collision.shapes.CollisionShape; |
||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.bullet.objects.PhysicsGhostObject; |
||||
import com.jme3.bullet.objects.PhysicsRigidBody; |
||||
import com.jme3.effect.ParticleEmitter; |
||||
import com.jme3.effect.ParticleMesh.Type; |
||||
import com.jme3.effect.shapes.EmitterSphereShape; |
||||
import com.jme3.export.JmeExporter; |
||||
import com.jme3.export.JmeImporter; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.ColorRGBA; |
||||
import com.jme3.math.Vector3f; |
||||
import java.io.IOException; |
||||
import java.util.Iterator; |
||||
|
||||
/** |
||||
* |
||||
* @author normenhansen |
||||
*/ |
||||
public class BombControl extends RigidBodyControl implements PhysicsCollisionListener, PhysicsTickListener { |
||||
|
||||
private float explosionRadius = 10; |
||||
private PhysicsGhostObject ghostObject; |
||||
private Vector3f vector = new Vector3f(); |
||||
private Vector3f vector2 = new Vector3f(); |
||||
private float forceFactor = 1; |
||||
private ParticleEmitter effect; |
||||
private float fxTime = 0.5f; |
||||
private float maxTime = 4f; |
||||
private float curTime = -1.0f; |
||||
private float timer; |
||||
|
||||
public BombControl(CollisionShape shape, float mass) { |
||||
super(shape, mass); |
||||
createGhostObject(); |
||||
} |
||||
|
||||
public BombControl(AssetManager manager, CollisionShape shape, float mass) { |
||||
super(shape, mass); |
||||
createGhostObject(); |
||||
prepareEffect(manager); |
||||
} |
||||
|
||||
public void setPhysicsSpace(PhysicsSpace space) { |
||||
super.setPhysicsSpace(space); |
||||
if (space != null) { |
||||
space.addCollisionListener(this); |
||||
} |
||||
} |
||||
|
||||
private void prepareEffect(AssetManager assetManager) { |
||||
int COUNT_FACTOR = 1; |
||||
float COUNT_FACTOR_F = 1f; |
||||
effect = new ParticleEmitter("Flame", Type.Triangle, 32 * COUNT_FACTOR); |
||||
effect.setSelectRandomImage(true); |
||||
effect.setStartColor(new ColorRGBA(1f, 0.4f, 0.05f, (float) (1f / COUNT_FACTOR_F))); |
||||
effect.setEndColor(new ColorRGBA(.4f, .22f, .12f, 0f)); |
||||
effect.setStartSize(1.3f); |
||||
effect.setEndSize(2f); |
||||
effect.setShape(new EmitterSphereShape(Vector3f.ZERO, 1f)); |
||||
effect.setParticlesPerSec(0); |
||||
effect.setGravity(0, -5f, 0); |
||||
effect.setLowLife(.4f); |
||||
effect.setHighLife(.5f); |
||||
effect.getParticleInfluencer() |
||||
.setInitialVelocity(new Vector3f(0, 7, 0)); |
||||
effect.getParticleInfluencer().setVelocityVariation(1f); |
||||
effect.setImagesX(2); |
||||
effect.setImagesY(2); |
||||
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md"); |
||||
mat.setTexture("Texture", assetManager.loadTexture("Effects/Explosion/flame.png")); |
||||
effect.setMaterial(mat); |
||||
} |
||||
|
||||
protected void createGhostObject() { |
||||
ghostObject = new PhysicsGhostObject(new SphereCollisionShape(explosionRadius)); |
||||
} |
||||
|
||||
public void collision(PhysicsCollisionEvent event) { |
||||
if (space == null) { |
||||
return; |
||||
} |
||||
if (event.getObjectA() == this || event.getObjectB() == this) { |
||||
space.add(ghostObject); |
||||
ghostObject.setPhysicsLocation(getPhysicsLocation(vector)); |
||||
space.addTickListener(this); |
||||
if (effect != null && spatial.getParent() != null) { |
||||
curTime = 0; |
||||
effect.setLocalTranslation(spatial.getLocalTranslation()); |
||||
spatial.getParent().attachChild(effect); |
||||
effect.emitAllParticles(); |
||||
} |
||||
space.remove(this); |
||||
spatial.removeFromParent(); |
||||
} |
||||
} |
||||
|
||||
public void prePhysicsTick(PhysicsSpace space, float f) { |
||||
space.removeCollisionListener(this); |
||||
} |
||||
|
||||
public void physicsTick(PhysicsSpace space, float f) { |
||||
//get all overlapping objects and apply impulse to them
|
||||
for (Iterator<PhysicsCollisionObject> it = ghostObject.getOverlappingObjects().iterator(); it.hasNext();) { |
||||
PhysicsCollisionObject physicsCollisionObject = it.next(); |
||||
if (physicsCollisionObject instanceof PhysicsRigidBody) { |
||||
PhysicsRigidBody rBody = (PhysicsRigidBody) physicsCollisionObject; |
||||
rBody.getPhysicsLocation(vector2); |
||||
vector2.subtractLocal(vector); |
||||
float force = explosionRadius - vector2.length(); |
||||
force *= forceFactor; |
||||
force = force > 0 ? force : 0; |
||||
vector2.normalizeLocal(); |
||||
vector2.multLocal(force); |
||||
((PhysicsRigidBody) physicsCollisionObject).applyImpulse(vector2, Vector3f.ZERO); |
||||
} |
||||
} |
||||
space.removeTickListener(this); |
||||
space.remove(ghostObject); |
||||
} |
||||
|
||||
@Override |
||||
public void update(float tpf) { |
||||
super.update(tpf); |
||||
if(enabled){ |
||||
timer+=tpf; |
||||
if(timer>maxTime){ |
||||
if(spatial.getParent()!=null){ |
||||
space.removeCollisionListener(this); |
||||
space.remove(this); |
||||
spatial.removeFromParent(); |
||||
} |
||||
} |
||||
} |
||||
if (enabled && curTime >= 0) { |
||||
curTime += tpf; |
||||
if (curTime > fxTime) { |
||||
curTime = -1; |
||||
effect.removeFromParent(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* @return the explosionRadius |
||||
*/ |
||||
public float getExplosionRadius() { |
||||
return explosionRadius; |
||||
} |
||||
|
||||
/** |
||||
* @param explosionRadius the explosionRadius to set |
||||
*/ |
||||
public void setExplosionRadius(float explosionRadius) { |
||||
this.explosionRadius = explosionRadius; |
||||
createGhostObject(); |
||||
} |
||||
|
||||
public float getForceFactor() { |
||||
return forceFactor; |
||||
} |
||||
|
||||
public void setForceFactor(float forceFactor) { |
||||
this.forceFactor = forceFactor; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void read(JmeImporter im) throws IOException { |
||||
throw new UnsupportedOperationException("Reading not supported."); |
||||
} |
||||
|
||||
@Override |
||||
public void write(JmeExporter ex) throws IOException { |
||||
throw new UnsupportedOperationException("Saving not supported."); |
||||
} |
||||
} |
@ -0,0 +1,245 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.PhysicsTickListener; |
||||
import com.jme3.bullet.collision.shapes.CollisionShape; |
||||
import com.jme3.bullet.control.PhysicsControl; |
||||
import com.jme3.bullet.objects.PhysicsVehicle; |
||||
import com.jme3.export.InputCapsule; |
||||
import com.jme3.export.JmeExporter; |
||||
import com.jme3.export.JmeImporter; |
||||
import com.jme3.export.OutputCapsule; |
||||
import com.jme3.math.FastMath; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.renderer.RenderManager; |
||||
import com.jme3.renderer.ViewPort; |
||||
import com.jme3.scene.Spatial; |
||||
import com.jme3.scene.control.Control; |
||||
import com.jme3.util.clone.Cloner; |
||||
import com.jme3.util.clone.JmeCloneable; |
||||
import java.io.IOException; |
||||
|
||||
/** |
||||
* PhysicsHoverControl uses a RayCast Vehicle with "slippery wheels" to simulate a hovering tank |
||||
* @author normenhansen |
||||
*/ |
||||
public class PhysicsHoverControl extends PhysicsVehicle implements PhysicsControl, PhysicsTickListener, JmeCloneable { |
||||
|
||||
protected Spatial spatial; |
||||
protected boolean enabled = true; |
||||
protected PhysicsSpace space = null; |
||||
protected float steeringValue = 0; |
||||
protected float accelerationValue = 0; |
||||
protected int xw = 3; |
||||
protected int zw = 5; |
||||
protected int yw = 2; |
||||
protected Vector3f HOVER_HEIGHT_LF_START = new Vector3f(xw, 1, zw); |
||||
protected Vector3f HOVER_HEIGHT_RF_START = new Vector3f(-xw, 1, zw); |
||||
protected Vector3f HOVER_HEIGHT_LR_START = new Vector3f(xw, 1, -zw); |
||||
protected Vector3f HOVER_HEIGHT_RR_START = new Vector3f(-xw, 1, -zw); |
||||
protected Vector3f HOVER_HEIGHT_LF = new Vector3f(xw, -yw, zw); |
||||
protected Vector3f HOVER_HEIGHT_RF = new Vector3f(-xw, -yw, zw); |
||||
protected Vector3f HOVER_HEIGHT_LR = new Vector3f(xw, -yw, -zw); |
||||
protected Vector3f HOVER_HEIGHT_RR = new Vector3f(-xw, -yw, -zw); |
||||
protected Vector3f tempVect1 = new Vector3f(0, 0, 0); |
||||
protected Vector3f tempVect2 = new Vector3f(0, 0, 0); |
||||
protected Vector3f tempVect3 = new Vector3f(0, 0, 0); |
||||
// protected float rotationCounterForce = 10000f;
|
||||
// protected float speedCounterMult = 2000f;
|
||||
// protected float multiplier = 1000f;
|
||||
|
||||
public PhysicsHoverControl() { |
||||
} |
||||
|
||||
/** |
||||
* Creates a new PhysicsNode with the supplied collision shape |
||||
* @param shape |
||||
*/ |
||||
public PhysicsHoverControl(CollisionShape shape) { |
||||
super(shape); |
||||
createWheels(); |
||||
} |
||||
|
||||
public PhysicsHoverControl(CollisionShape shape, float mass) { |
||||
super(shape, mass); |
||||
createWheels(); |
||||
} |
||||
|
||||
@Override |
||||
public Control cloneForSpatial(Spatial spatial) { |
||||
throw new UnsupportedOperationException("Not supported yet."); |
||||
} |
||||
|
||||
@Override |
||||
public Object jmeClone() { |
||||
throw new UnsupportedOperationException("Not yet implemented."); |
||||
} |
||||
|
||||
@Override |
||||
public void cloneFields( Cloner cloner, Object original ) { |
||||
throw new UnsupportedOperationException("Not yet implemented."); |
||||
} |
||||
|
||||
public void setSpatial(Spatial spatial) { |
||||
this.spatial = spatial; |
||||
setUserObject(spatial); |
||||
if (spatial == null) { |
||||
return; |
||||
} |
||||
setPhysicsLocation(spatial.getWorldTranslation()); |
||||
setPhysicsRotation(spatial.getWorldRotation().toRotationMatrix()); |
||||
} |
||||
|
||||
public void setEnabled(boolean enabled) { |
||||
this.enabled = enabled; |
||||
} |
||||
|
||||
public boolean isEnabled() { |
||||
return enabled; |
||||
} |
||||
|
||||
private void createWheels() { |
||||
addWheel(HOVER_HEIGHT_LF_START, new Vector3f(0, -1, 0), new Vector3f(-1, 0, 0), yw, yw, false); |
||||
addWheel(HOVER_HEIGHT_RF_START, new Vector3f(0, -1, 0), new Vector3f(-1, 0, 0), yw, yw, false); |
||||
addWheel(HOVER_HEIGHT_LR_START, new Vector3f(0, -1, 0), new Vector3f(-1, 0, 0), yw, yw, false); |
||||
addWheel(HOVER_HEIGHT_RR_START, new Vector3f(0, -1, 0), new Vector3f(-1, 0, 0), yw, yw, false); |
||||
for (int i = 0; i < 4; i++) { |
||||
getWheel(i).setFrictionSlip(0.001f); |
||||
} |
||||
} |
||||
|
||||
public void prePhysicsTick(PhysicsSpace space, float f) { |
||||
Vector3f angVel = getAngularVelocity(); |
||||
float rotationVelocity = angVel.getY(); |
||||
Vector3f dir = getForwardVector(tempVect2).multLocal(1, 0, 1).normalizeLocal(); |
||||
getLinearVelocity(tempVect3); |
||||
Vector3f linearVelocity = tempVect3.multLocal(1, 0, 1); |
||||
|
||||
if (steeringValue != 0) { |
||||
if (rotationVelocity < 1 && rotationVelocity > -1) { |
||||
applyTorque(tempVect1.set(0, steeringValue, 0)); |
||||
} |
||||
} else { |
||||
// counter the steering value!
|
||||
if (rotationVelocity > 0.2f) { |
||||
applyTorque(tempVect1.set(0, -mass * 20, 0)); |
||||
} else if (rotationVelocity < -0.2f) { |
||||
applyTorque(tempVect1.set(0, mass * 20, 0)); |
||||
} |
||||
} |
||||
if (accelerationValue > 0) { |
||||
// counter force that will adjust velocity
|
||||
// if we are not going where we want to go.
|
||||
// this will prevent "drifting" and thus improve control
|
||||
// of the vehicle
|
||||
float d = dir.dot(linearVelocity.normalize()); |
||||
Vector3f counter = dir.project(linearVelocity).normalizeLocal().negateLocal().multLocal(1 - d); |
||||
applyForce(counter.multLocal(mass * 10), Vector3f.ZERO); |
||||
|
||||
if (linearVelocity.length() < 30) { |
||||
applyForce(dir.multLocal(accelerationValue), Vector3f.ZERO); |
||||
} |
||||
} else { |
||||
// counter the acceleration value
|
||||
if (linearVelocity.length() > FastMath.ZERO_TOLERANCE) { |
||||
linearVelocity.normalizeLocal().negateLocal(); |
||||
applyForce(linearVelocity.mult(mass * 10), Vector3f.ZERO); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void physicsTick(PhysicsSpace space, float f) { |
||||
} |
||||
|
||||
public void update(float tpf) { |
||||
if (enabled && spatial != null) { |
||||
getMotionState().applyTransform(spatial); |
||||
} |
||||
} |
||||
|
||||
public void render(RenderManager rm, ViewPort vp) { |
||||
} |
||||
|
||||
public void setPhysicsSpace(PhysicsSpace space) { |
||||
createVehicle(space); |
||||
if (space == null) { |
||||
if (this.space != null) { |
||||
this.space.removeCollisionObject(this); |
||||
this.space.removeTickListener(this); |
||||
} |
||||
this.space = space; |
||||
} else { |
||||
space.addCollisionObject(this); |
||||
space.addTickListener(this); |
||||
} |
||||
this.space = space; |
||||
} |
||||
|
||||
public PhysicsSpace getPhysicsSpace() { |
||||
return space; |
||||
} |
||||
|
||||
@Override |
||||
public void write(JmeExporter ex) throws IOException { |
||||
super.write(ex); |
||||
OutputCapsule oc = ex.getCapsule(this); |
||||
oc.write(enabled, "enabled", true); |
||||
oc.write(spatial, "spatial", null); |
||||
} |
||||
|
||||
@Override |
||||
public void read(JmeImporter im) throws IOException { |
||||
super.read(im); |
||||
InputCapsule ic = im.getCapsule(this); |
||||
enabled = ic.readBoolean("enabled", true); |
||||
spatial = (Spatial) ic.readSavable("spatial", null); |
||||
} |
||||
|
||||
/** |
||||
* @param steeringValue the steeringValue to set |
||||
*/ |
||||
@Override |
||||
public void steer(float steeringValue) { |
||||
this.steeringValue = steeringValue * getMass(); |
||||
} |
||||
|
||||
/** |
||||
* @param accelerationValue the accelerationValue to set |
||||
*/ |
||||
@Override |
||||
public void accelerate(float accelerationValue) { |
||||
this.accelerationValue = accelerationValue * getMass(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,242 @@ |
||||
/* |
||||
* Copyright (c) 2009-2018 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.Application; |
||||
import com.jme3.asset.AssetManager; |
||||
import com.jme3.asset.TextureKey; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.shapes.CollisionShape; |
||||
import com.jme3.bullet.collision.shapes.MeshCollisionShape; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.input.MouseInput; |
||||
import com.jme3.input.controls.ActionListener; |
||||
import com.jme3.input.controls.MouseButtonTrigger; |
||||
import com.jme3.light.AmbientLight; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.ColorRGBA; |
||||
import com.jme3.renderer.queue.RenderQueue.ShadowMode; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.Node; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.scene.shape.Sphere; |
||||
import com.jme3.scene.shape.Sphere.TextureMode; |
||||
import com.jme3.texture.Texture; |
||||
|
||||
/** |
||||
* |
||||
* @author normenhansen |
||||
*/ |
||||
public class PhysicsTestHelper { |
||||
|
||||
/** |
||||
* creates a simple physics test world with a floor, an obstacle and some test boxes |
||||
* @param rootNode |
||||
* @param assetManager |
||||
* @param space |
||||
*/ |
||||
public static void createPhysicsTestWorld(Node rootNode, AssetManager assetManager, PhysicsSpace space) { |
||||
AmbientLight light = new AmbientLight(); |
||||
light.setColor(ColorRGBA.LightGray); |
||||
rootNode.addLight(light); |
||||
|
||||
Material material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
material.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); |
||||
|
||||
Box floorBox = new Box(140, 0.25f, 140); |
||||
Geometry floorGeometry = new Geometry("Floor", floorBox); |
||||
floorGeometry.setMaterial(material); |
||||
floorGeometry.setLocalTranslation(0, -5, 0); |
||||
// Plane plane = new Plane();
|
||||
// plane.setOriginNormal(new Vector3f(0, 0.25f, 0), Vector3f.UNIT_Y);
|
||||
// floorGeometry.addControl(new RigidBodyControl(new PlaneCollisionShape(plane), 0));
|
||||
floorGeometry.addControl(new RigidBodyControl(0)); |
||||
rootNode.attachChild(floorGeometry); |
||||
space.add(floorGeometry); |
||||
|
||||
//movable boxes
|
||||
for (int i = 0; i < 12; i++) { |
||||
Box box = new Box(0.25f, 0.25f, 0.25f); |
||||
Geometry boxGeometry = new Geometry("Box", box); |
||||
boxGeometry.setMaterial(material); |
||||
boxGeometry.setLocalTranslation(i, 5, -3); |
||||
//RigidBodyControl automatically uses box collision shapes when attached to single geometry with box mesh
|
||||
boxGeometry.addControl(new RigidBodyControl(2)); |
||||
rootNode.attachChild(boxGeometry); |
||||
space.add(boxGeometry); |
||||
} |
||||
|
||||
//immovable sphere with mesh collision shape
|
||||
Sphere sphere = new Sphere(8, 8, 1); |
||||
Geometry sphereGeometry = new Geometry("Sphere", sphere); |
||||
sphereGeometry.setMaterial(material); |
||||
sphereGeometry.setLocalTranslation(4, -4, 2); |
||||
sphereGeometry.addControl(new RigidBodyControl(new MeshCollisionShape(sphere), 0)); |
||||
rootNode.attachChild(sphereGeometry); |
||||
space.add(sphereGeometry); |
||||
|
||||
} |
||||
|
||||
public static void createPhysicsTestWorldSoccer(Node rootNode, AssetManager assetManager, PhysicsSpace space) { |
||||
AmbientLight light = new AmbientLight(); |
||||
light.setColor(ColorRGBA.LightGray); |
||||
rootNode.addLight(light); |
||||
|
||||
Material material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
material.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); |
||||
|
||||
Box floorBox = new Box(20, 0.25f, 20); |
||||
Geometry floorGeometry = new Geometry("Floor", floorBox); |
||||
floorGeometry.setMaterial(material); |
||||
floorGeometry.setLocalTranslation(0, -0.25f, 0); |
||||
// Plane plane = new Plane();
|
||||
// plane.setOriginNormal(new Vector3f(0, 0.25f, 0), Vector3f.UNIT_Y);
|
||||
// floorGeometry.addControl(new RigidBodyControl(new PlaneCollisionShape(plane), 0));
|
||||
floorGeometry.addControl(new RigidBodyControl(0)); |
||||
rootNode.attachChild(floorGeometry); |
||||
space.add(floorGeometry); |
||||
|
||||
//movable spheres
|
||||
for (int i = 0; i < 5; i++) { |
||||
Sphere sphere = new Sphere(16, 16, .5f); |
||||
Geometry ballGeometry = new Geometry("Soccer ball", sphere); |
||||
ballGeometry.setMaterial(material); |
||||
ballGeometry.setLocalTranslation(i, 2, -3); |
||||
//RigidBodyControl automatically uses Sphere collision shapes when attached to single geometry with sphere mesh
|
||||
ballGeometry.addControl(new RigidBodyControl(.001f)); |
||||
ballGeometry.getControl(RigidBodyControl.class).setRestitution(1); |
||||
rootNode.attachChild(ballGeometry); |
||||
space.add(ballGeometry); |
||||
} |
||||
{ |
||||
//immovable Box with mesh collision shape
|
||||
Box box = new Box(1, 1, 1); |
||||
Geometry boxGeometry = new Geometry("Box", box); |
||||
boxGeometry.setMaterial(material); |
||||
boxGeometry.setLocalTranslation(4, 1, 2); |
||||
boxGeometry.addControl(new RigidBodyControl(new MeshCollisionShape(box), 0)); |
||||
rootNode.attachChild(boxGeometry); |
||||
space.add(boxGeometry); |
||||
} |
||||
{ |
||||
//immovable Box with mesh collision shape
|
||||
Box box = new Box(1, 1, 1); |
||||
Geometry boxGeometry = new Geometry("Box", box); |
||||
boxGeometry.setMaterial(material); |
||||
boxGeometry.setLocalTranslation(4, 3, 4); |
||||
boxGeometry.addControl(new RigidBodyControl(new MeshCollisionShape(box), 0)); |
||||
rootNode.attachChild(boxGeometry); |
||||
space.add(boxGeometry); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* creates a box geometry with a RigidBodyControl |
||||
* @param assetManager |
||||
* @return |
||||
*/ |
||||
public static Geometry createPhysicsTestBox(AssetManager assetManager) { |
||||
Material material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
material.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); |
||||
Box box = new Box(0.25f, 0.25f, 0.25f); |
||||
Geometry boxGeometry = new Geometry("Box", box); |
||||
boxGeometry.setMaterial(material); |
||||
//RigidBodyControl automatically uses box collision shapes when attached to single geometry with box mesh
|
||||
boxGeometry.addControl(new RigidBodyControl(2)); |
||||
return boxGeometry; |
||||
} |
||||
|
||||
/** |
||||
* creates a sphere geometry with a RigidBodyControl |
||||
* @param assetManager |
||||
* @return |
||||
*/ |
||||
public static Geometry createPhysicsTestSphere(AssetManager assetManager) { |
||||
Material material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
material.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); |
||||
Sphere sphere = new Sphere(8, 8, 0.25f); |
||||
Geometry boxGeometry = new Geometry("Sphere", sphere); |
||||
boxGeometry.setMaterial(material); |
||||
//RigidBodyControl automatically uses sphere collision shapes when attached to single geometry with sphere mesh
|
||||
boxGeometry.addControl(new RigidBodyControl(2)); |
||||
return boxGeometry; |
||||
} |
||||
|
||||
/** |
||||
* creates an empty node with a RigidBodyControl |
||||
* @param manager |
||||
* @param shape |
||||
* @param mass |
||||
* @return |
||||
*/ |
||||
public static Node createPhysicsTestNode(AssetManager manager, CollisionShape shape, float mass) { |
||||
Node node = new Node("PhysicsNode"); |
||||
RigidBodyControl control = new RigidBodyControl(shape, mass); |
||||
node.addControl(control); |
||||
return node; |
||||
} |
||||
|
||||
/** |
||||
* creates the necessary inputlistener and action to shoot balls from the camera |
||||
* @param app |
||||
* @param rootNode |
||||
* @param space |
||||
*/ |
||||
public static void createBallShooter(final Application app, final Node rootNode, final PhysicsSpace space) { |
||||
ActionListener actionListener = new ActionListener() { |
||||
|
||||
public void onAction(String name, boolean keyPressed, float tpf) { |
||||
Sphere bullet = new Sphere(32, 32, 0.4f, true, false); |
||||
bullet.setTextureMode(TextureMode.Projected); |
||||
Material mat2 = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
TextureKey key2 = new TextureKey("Textures/Terrain/Rock/Rock.PNG"); |
||||
key2.setGenerateMips(true); |
||||
Texture tex2 = app.getAssetManager().loadTexture(key2); |
||||
mat2.setTexture("ColorMap", tex2); |
||||
if (name.equals("shoot") && !keyPressed) { |
||||
Geometry bulletg = new Geometry("bullet", bullet); |
||||
bulletg.setMaterial(mat2); |
||||
bulletg.setShadowMode(ShadowMode.CastAndReceive); |
||||
bulletg.setLocalTranslation(app.getCamera().getLocation()); |
||||
RigidBodyControl bulletControl = new RigidBodyControl(10); |
||||
bulletg.addControl(bulletControl); |
||||
bulletControl.setLinearVelocity(app.getCamera().getDirection().mult(25)); |
||||
bulletg.addControl(bulletControl); |
||||
rootNode.attachChild(bulletg); |
||||
space.add(bulletControl); |
||||
} |
||||
} |
||||
}; |
||||
app.getInputManager().addMapping("shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); |
||||
app.getInputManager().addListener(actionListener, "shoot"); |
||||
} |
||||
} |
@ -0,0 +1,294 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.asset.TextureKey; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.shapes.BoxCollisionShape; |
||||
import com.jme3.bullet.collision.shapes.CompoundCollisionShape; |
||||
import com.jme3.bullet.collision.shapes.MeshCollisionShape; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.bullet.control.VehicleControl; |
||||
import com.jme3.bullet.joints.SliderJoint; |
||||
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.*; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.Node; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.scene.shape.Cylinder; |
||||
import com.jme3.texture.Texture; |
||||
|
||||
/** |
||||
* Tests attaching/detaching nodes via joints |
||||
* @author normenhansen |
||||
*/ |
||||
public class TestAttachDriver extends SimpleApplication implements ActionListener { |
||||
|
||||
private VehicleControl vehicle; |
||||
private RigidBodyControl driver; |
||||
private RigidBodyControl bridge; |
||||
private SliderJoint slider; |
||||
private final float accelerationForce = 1000.0f; |
||||
private final float brakeForce = 100.0f; |
||||
private float steeringValue = 0; |
||||
private float accelerationValue = 0; |
||||
private Vector3f jumpForce = new Vector3f(0, 3000, 0); |
||||
private BulletAppState bulletAppState; |
||||
|
||||
public static void main(String[] args) { |
||||
TestAttachDriver app = new TestAttachDriver(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
bulletAppState = new BulletAppState(); |
||||
stateManager.attach(bulletAppState); |
||||
bulletAppState.setDebugEnabled(true); |
||||
setupKeys(); |
||||
setupFloor(); |
||||
buildPlayer(); |
||||
} |
||||
|
||||
private PhysicsSpace getPhysicsSpace(){ |
||||
return bulletAppState.getPhysicsSpace(); |
||||
} |
||||
|
||||
private void setupKeys() { |
||||
inputManager.addMapping("Lefts", new KeyTrigger(KeyInput.KEY_H)); |
||||
inputManager.addMapping("Rights", new KeyTrigger(KeyInput.KEY_K)); |
||||
inputManager.addMapping("Ups", new KeyTrigger(KeyInput.KEY_U)); |
||||
inputManager.addMapping("Downs", new KeyTrigger(KeyInput.KEY_J)); |
||||
inputManager.addMapping("Space", new KeyTrigger(KeyInput.KEY_SPACE)); |
||||
inputManager.addMapping("Reset", new KeyTrigger(KeyInput.KEY_RETURN)); |
||||
inputManager.addListener(this, "Lefts"); |
||||
inputManager.addListener(this, "Rights"); |
||||
inputManager.addListener(this, "Ups"); |
||||
inputManager.addListener(this, "Downs"); |
||||
inputManager.addListener(this, "Space"); |
||||
inputManager.addListener(this, "Reset"); |
||||
} |
||||
|
||||
public void setupFloor() { |
||||
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
TextureKey key = new TextureKey("Interface/Logo/Monkey.jpg", true); |
||||
key.setGenerateMips(true); |
||||
Texture tex = assetManager.loadTexture(key); |
||||
tex.setMinFilter(Texture.MinFilter.Trilinear); |
||||
mat.setTexture("ColorMap", tex); |
||||
|
||||
Box floor = new Box(100, 1f, 100); |
||||
Geometry floorGeom = new Geometry("Floor", floor); |
||||
floorGeom.setMaterial(mat); |
||||
floorGeom.setLocalTranslation(new Vector3f(0f, -3, 0f)); |
||||
|
||||
floorGeom.addControl(new RigidBodyControl(new MeshCollisionShape(floorGeom.getMesh()), 0)); |
||||
rootNode.attachChild(floorGeom); |
||||
getPhysicsSpace().add(floorGeom); |
||||
} |
||||
|
||||
private void buildPlayer() { |
||||
Material mat = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat.getAdditionalRenderState().setWireframe(true); |
||||
mat.setColor("Color", ColorRGBA.Red); |
||||
|
||||
//create a compound shape and attach the BoxCollisionShape for the car body at 0,1,0
|
||||
//this shifts the effective center of mass of the BoxCollisionShape to 0,-1,0
|
||||
CompoundCollisionShape compoundShape = new CompoundCollisionShape(); |
||||
BoxCollisionShape box = new BoxCollisionShape(new Vector3f(1.2f, 0.5f, 2.4f)); |
||||
compoundShape.addChildShape(box, new Vector3f(0, 1, 0)); |
||||
|
||||
//create vehicle node
|
||||
Node vehicleNode=new Node("vehicleNode"); |
||||
vehicle = new VehicleControl(compoundShape, 800); |
||||
vehicleNode.addControl(vehicle); |
||||
|
||||
//setting suspension values for wheels, this can be a bit tricky
|
||||
//see also https://docs.google.com/Doc?docid=0AXVUZ5xw6XpKZGNuZG56a3FfMzU0Z2NyZnF4Zmo&hl=en
|
||||
float stiffness = 60.0f;//200=f1 car
|
||||
float compValue = .3f; //(should be lower than damp)
|
||||
float dampValue = .4f; |
||||
vehicle.setSuspensionCompression(compValue * 2.0f * FastMath.sqrt(stiffness)); |
||||
vehicle.setSuspensionDamping(dampValue * 2.0f * FastMath.sqrt(stiffness)); |
||||
vehicle.setSuspensionStiffness(stiffness); |
||||
vehicle.setMaxSuspensionForce(10000.0f); |
||||
|
||||
//Create four wheels and add them at their locations
|
||||
Vector3f wheelDirection = new Vector3f(0, -1, 0); // was 0, -1, 0
|
||||
Vector3f wheelAxle = new Vector3f(-1, 0, 0); // was -1, 0, 0
|
||||
float radius = 0.5f; |
||||
float restLength = 0.3f; |
||||
float yOff = 0.5f; |
||||
float xOff = 1f; |
||||
float zOff = 2f; |
||||
|
||||
Cylinder wheelMesh = new Cylinder(16, 16, radius, radius * 0.6f, true); |
||||
|
||||
Node node1 = new Node("wheel 1 node"); |
||||
Geometry wheels1 = new Geometry("wheel 1", wheelMesh); |
||||
node1.attachChild(wheels1); |
||||
wheels1.rotate(0, FastMath.HALF_PI, 0); |
||||
wheels1.setMaterial(mat); |
||||
vehicle.addWheel(node1, new Vector3f(-xOff, yOff, zOff), |
||||
wheelDirection, wheelAxle, restLength, radius, true); |
||||
|
||||
Node node2 = new Node("wheel 2 node"); |
||||
Geometry wheels2 = new Geometry("wheel 2", wheelMesh); |
||||
node2.attachChild(wheels2); |
||||
wheels2.rotate(0, FastMath.HALF_PI, 0); |
||||
wheels2.setMaterial(mat); |
||||
vehicle.addWheel(node2, new Vector3f(xOff, yOff, zOff), |
||||
wheelDirection, wheelAxle, restLength, radius, true); |
||||
|
||||
Node node3 = new Node("wheel 3 node"); |
||||
Geometry wheels3 = new Geometry("wheel 3", wheelMesh); |
||||
node3.attachChild(wheels3); |
||||
wheels3.rotate(0, FastMath.HALF_PI, 0); |
||||
wheels3.setMaterial(mat); |
||||
vehicle.addWheel(node3, new Vector3f(-xOff, yOff, -zOff), |
||||
wheelDirection, wheelAxle, restLength, radius, false); |
||||
|
||||
Node node4 = new Node("wheel 4 node"); |
||||
Geometry wheels4 = new Geometry("wheel 4", wheelMesh); |
||||
node4.attachChild(wheels4); |
||||
wheels4.rotate(0, FastMath.HALF_PI, 0); |
||||
wheels4.setMaterial(mat); |
||||
vehicle.addWheel(node4, new Vector3f(xOff, yOff, -zOff), |
||||
wheelDirection, wheelAxle, restLength, radius, false); |
||||
|
||||
vehicleNode.attachChild(node1); |
||||
vehicleNode.attachChild(node2); |
||||
vehicleNode.attachChild(node3); |
||||
vehicleNode.attachChild(node4); |
||||
|
||||
rootNode.attachChild(vehicleNode); |
||||
getPhysicsSpace().add(vehicle); |
||||
|
||||
//driver
|
||||
Node driverNode=new Node("driverNode"); |
||||
driverNode.setLocalTranslation(0,2,0); |
||||
driver=new RigidBodyControl(new BoxCollisionShape(new Vector3f(0.2f,.5f,0.2f))); |
||||
driverNode.addControl(driver); |
||||
|
||||
rootNode.attachChild(driverNode); |
||||
getPhysicsSpace().add(driver); |
||||
|
||||
//joint
|
||||
slider=new SliderJoint(driver, vehicle, Vector3f.UNIT_Y.negate(), Vector3f.UNIT_Y, true); |
||||
slider.setUpperLinLimit(.1f); |
||||
slider.setLowerLinLimit(-.1f); |
||||
|
||||
getPhysicsSpace().add(slider); |
||||
|
||||
Node pole1Node=new Node("pole1Node"); |
||||
Node pole2Node=new Node("pole1Node"); |
||||
Node bridgeNode=new Node("pole1Node"); |
||||
pole1Node.setLocalTranslation(new Vector3f(-2,-1,4)); |
||||
pole2Node.setLocalTranslation(new Vector3f(2,-1,4)); |
||||
bridgeNode.setLocalTranslation(new Vector3f(0,1.4f,4)); |
||||
|
||||
RigidBodyControl pole1=new RigidBodyControl(new BoxCollisionShape(new Vector3f(0.2f,1.25f,0.2f)),0); |
||||
pole1Node.addControl(pole1); |
||||
RigidBodyControl pole2=new RigidBodyControl(new BoxCollisionShape(new Vector3f(0.2f,1.25f,0.2f)),0); |
||||
pole2Node.addControl(pole2); |
||||
bridge=new RigidBodyControl(new BoxCollisionShape(new Vector3f(2.5f,0.2f,0.2f))); |
||||
bridgeNode.addControl(bridge); |
||||
|
||||
rootNode.attachChild(pole1Node); |
||||
rootNode.attachChild(pole2Node); |
||||
rootNode.attachChild(bridgeNode); |
||||
getPhysicsSpace().add(pole1); |
||||
getPhysicsSpace().add(pole2); |
||||
getPhysicsSpace().add(bridge); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
Quaternion quat=new Quaternion(); |
||||
cam.lookAt(vehicle.getPhysicsLocation(), Vector3f.UNIT_Y); |
||||
} |
||||
|
||||
public void onAction(String binding, boolean value, float tpf) { |
||||
if (binding.equals("Lefts")) { |
||||
if (value) { |
||||
steeringValue += .5f; |
||||
} else { |
||||
steeringValue += -.5f; |
||||
} |
||||
vehicle.steer(steeringValue); |
||||
} else if (binding.equals("Rights")) { |
||||
if (value) { |
||||
steeringValue += -.5f; |
||||
} else { |
||||
steeringValue += .5f; |
||||
} |
||||
vehicle.steer(steeringValue); |
||||
} else if (binding.equals("Ups")) { |
||||
if (value) { |
||||
accelerationValue += accelerationForce; |
||||
} else { |
||||
accelerationValue -= accelerationForce; |
||||
} |
||||
vehicle.accelerate(accelerationValue); |
||||
} else if (binding.equals("Downs")) { |
||||
if (value) { |
||||
vehicle.brake(brakeForce); |
||||
} else { |
||||
vehicle.brake(0f); |
||||
} |
||||
} else if (binding.equals("Space")) { |
||||
if (value) { |
||||
getPhysicsSpace().remove(slider); |
||||
slider.destroy(); |
||||
vehicle.applyImpulse(jumpForce, Vector3f.ZERO); |
||||
} |
||||
} else if (binding.equals("Reset")) { |
||||
if (value) { |
||||
System.out.println("Reset"); |
||||
vehicle.setPhysicsLocation(new Vector3f(0, 0, 0)); |
||||
vehicle.setPhysicsRotation(new Matrix3f()); |
||||
vehicle.setLinearVelocity(Vector3f.ZERO); |
||||
vehicle.setAngularVelocity(Vector3f.ZERO); |
||||
vehicle.resetSuspension(); |
||||
bridge.setPhysicsLocation(new Vector3f(0,1.4f,4)); |
||||
bridge.setPhysicsRotation(Quaternion.DIRECTION_Z.toRotationMatrix()); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,130 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.shapes.BoxCollisionShape; |
||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
||||
import com.jme3.bullet.control.GhostControl; |
||||
import com.jme3.bullet.control.PhysicsControl; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.bullet.joints.HingeJoint; |
||||
import com.jme3.input.KeyInput; |
||||
import com.jme3.input.controls.AnalogListener; |
||||
import com.jme3.input.controls.KeyTrigger; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Node; |
||||
|
||||
/** |
||||
* Tests attaching ghost nodes to physicsnodes via the scenegraph |
||||
* @author normenhansen |
||||
*/ |
||||
public class TestAttachGhostObject extends SimpleApplication implements AnalogListener { |
||||
|
||||
private HingeJoint joint; |
||||
private GhostControl ghostControl; |
||||
private Node collisionNode; |
||||
private Node hammerNode; |
||||
private Vector3f tempVec = new Vector3f(); |
||||
private BulletAppState bulletAppState; |
||||
|
||||
public static void main(String[] args) { |
||||
TestAttachGhostObject app = new TestAttachGhostObject(); |
||||
app.start(); |
||||
} |
||||
|
||||
private void setupKeys() { |
||||
inputManager.addMapping("Lefts", new KeyTrigger(KeyInput.KEY_H)); |
||||
inputManager.addMapping("Rights", new KeyTrigger(KeyInput.KEY_K)); |
||||
inputManager.addMapping("Space", new KeyTrigger(KeyInput.KEY_SPACE)); |
||||
inputManager.addListener(this, "Lefts", "Rights", "Space"); |
||||
} |
||||
|
||||
public void onAnalog(String binding, float value, float tpf) { |
||||
if (binding.equals("Lefts")) { |
||||
joint.enableMotor(true, 1, .1f); |
||||
} else if (binding.equals("Rights")) { |
||||
joint.enableMotor(true, -1, .1f); |
||||
} else if (binding.equals("Space")) { |
||||
joint.enableMotor(false, 0, 0); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
bulletAppState = new BulletAppState(); |
||||
stateManager.attach(bulletAppState); |
||||
bulletAppState.setDebugEnabled(true); |
||||
setupKeys(); |
||||
setupJoint(); |
||||
} |
||||
|
||||
private PhysicsSpace getPhysicsSpace() { |
||||
return bulletAppState.getPhysicsSpace(); |
||||
} |
||||
|
||||
public void setupJoint() { |
||||
Node holderNode = PhysicsTestHelper.createPhysicsTestNode(assetManager, new BoxCollisionShape(new Vector3f(.1f, .1f, .1f)), 0); |
||||
holderNode.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(0f, 0, 0f)); |
||||
rootNode.attachChild(holderNode); |
||||
getPhysicsSpace().add(holderNode); |
||||
|
||||
Node hammerNode = PhysicsTestHelper.createPhysicsTestNode(assetManager, new BoxCollisionShape(new Vector3f(.3f, .3f, .3f)), 1); |
||||
hammerNode.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(0f, -1, 0f)); |
||||
rootNode.attachChild(hammerNode); |
||||
getPhysicsSpace().add(hammerNode); |
||||
|
||||
//immovable
|
||||
collisionNode = PhysicsTestHelper.createPhysicsTestNode(assetManager, new BoxCollisionShape(new Vector3f(.3f, .3f, .3f)), 0); |
||||
collisionNode.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(1.8f, 0, 0f)); |
||||
rootNode.attachChild(collisionNode); |
||||
getPhysicsSpace().add(collisionNode); |
||||
|
||||
//ghost node
|
||||
ghostControl = new GhostControl(new SphereCollisionShape(0.7f)); |
||||
|
||||
hammerNode.addControl(ghostControl); |
||||
getPhysicsSpace().add(ghostControl); |
||||
|
||||
joint = new HingeJoint(holderNode.getControl(RigidBodyControl.class), hammerNode.getControl(RigidBodyControl.class), Vector3f.ZERO, new Vector3f(0f, -1, 0f), Vector3f.UNIT_Z, Vector3f.UNIT_Z); |
||||
getPhysicsSpace().add(joint); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
if (ghostControl.getOverlappingObjects().contains(collisionNode.getControl(PhysicsControl.class))) { |
||||
fpsText.setText("collide"); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,295 @@ |
||||
/* |
||||
* Copyright (c) 2009-2018 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.shapes.MeshCollisionShape; |
||||
import com.jme3.bullet.control.BetterCharacterControl; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
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.FastMath; |
||||
import com.jme3.math.Quaternion; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.renderer.RenderManager; |
||||
import com.jme3.scene.CameraNode; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.Node; |
||||
import com.jme3.scene.control.CameraControl.ControlDirection; |
||||
import com.jme3.scene.shape.Sphere; |
||||
import com.jme3.system.AppSettings; |
||||
|
||||
/** |
||||
* A walking physical character followed by a 3rd person camera. (No animation.) |
||||
* |
||||
* @author normenhansen, zathras |
||||
*/ |
||||
public class TestBetterCharacter extends SimpleApplication implements ActionListener { |
||||
|
||||
private BulletAppState bulletAppState; |
||||
private BetterCharacterControl physicsCharacter; |
||||
private Node characterNode; |
||||
private CameraNode camNode; |
||||
boolean rotate = false; |
||||
private Vector3f walkDirection = new Vector3f(0, 0, 0); |
||||
private Vector3f viewDirection = new Vector3f(0, 0, 1); |
||||
boolean leftStrafe = false, rightStrafe = false, forward = false, backward = false, |
||||
leftRotate = false, rightRotate = false; |
||||
private Vector3f normalGravity = new Vector3f(0, -9.81f, 0); |
||||
private Geometry planet; |
||||
|
||||
public static void main(String[] args) { |
||||
TestBetterCharacter app = new TestBetterCharacter(); |
||||
AppSettings settings = new AppSettings(true); |
||||
settings.setRenderer(AppSettings.LWJGL_OPENGL2); |
||||
settings.setAudioRenderer(AppSettings.LWJGL_OPENAL); |
||||
app.setSettings(settings); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
//setup keyboard mapping
|
||||
setupKeys(); |
||||
|
||||
// activate physics
|
||||
bulletAppState = new BulletAppState() { |
||||
@Override |
||||
public void prePhysicsTick(PhysicsSpace space, float tpf) { |
||||
// Apply radial gravity near the planet, downward gravity elsewhere.
|
||||
checkPlanetGravity(); |
||||
} |
||||
}; |
||||
stateManager.attach(bulletAppState); |
||||
bulletAppState.setDebugEnabled(true); |
||||
|
||||
// init a physics test scene
|
||||
PhysicsTestHelper.createPhysicsTestWorldSoccer(rootNode, assetManager, bulletAppState.getPhysicsSpace()); |
||||
PhysicsTestHelper.createBallShooter(this, rootNode, bulletAppState.getPhysicsSpace()); |
||||
setupPlanet(); |
||||
|
||||
// Create a node for the character model
|
||||
characterNode = new Node("character node"); |
||||
characterNode.setLocalTranslation(new Vector3f(4, 5, 2)); |
||||
|
||||
// Add a character control to the node so we can add other things and
|
||||
// control the model rotation
|
||||
physicsCharacter = new BetterCharacterControl(0.3f, 2.5f, 8f); |
||||
characterNode.addControl(physicsCharacter); |
||||
getPhysicsSpace().add(physicsCharacter); |
||||
|
||||
// Load model, attach to character node
|
||||
Node model = (Node) assetManager.loadModel("Models/Jaime/Jaime.j3o"); |
||||
model.setLocalScale(1.50f); |
||||
characterNode.attachChild(model); |
||||
|
||||
// Add character node to the rootNode
|
||||
rootNode.attachChild(characterNode); |
||||
|
||||
// Set forward camera node that follows the character, only used when
|
||||
// view is "locked"
|
||||
camNode = new CameraNode("CamNode", cam); |
||||
camNode.setControlDir(ControlDirection.SpatialToCamera); |
||||
camNode.setLocalTranslation(new Vector3f(0, 2, -6)); |
||||
Quaternion quat = new Quaternion(); |
||||
// These coordinates are local, the camNode is attached to the character node!
|
||||
quat.lookAt(Vector3f.UNIT_Z, Vector3f.UNIT_Y); |
||||
camNode.setLocalRotation(quat); |
||||
characterNode.attachChild(camNode); |
||||
// Disable by default, can be enabled via keyboard shortcut
|
||||
camNode.setEnabled(false); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
// Get current forward and left vectors of model by using its rotation
|
||||
// to rotate the unit vectors
|
||||
Vector3f modelForwardDir = characterNode.getWorldRotation().mult(Vector3f.UNIT_Z); |
||||
Vector3f modelLeftDir = characterNode.getWorldRotation().mult(Vector3f.UNIT_X); |
||||
|
||||
// WalkDirection is global!
|
||||
// You *can* make your character fly with this.
|
||||
walkDirection.set(0, 0, 0); |
||||
if (leftStrafe) { |
||||
walkDirection.addLocal(modelLeftDir.mult(3)); |
||||
} else if (rightStrafe) { |
||||
walkDirection.addLocal(modelLeftDir.negate().multLocal(3)); |
||||
} |
||||
if (forward) { |
||||
walkDirection.addLocal(modelForwardDir.mult(3)); |
||||
} else if (backward) { |
||||
walkDirection.addLocal(modelForwardDir.negate().multLocal(3)); |
||||
} |
||||
physicsCharacter.setWalkDirection(walkDirection); |
||||
|
||||
// ViewDirection is local to characters physics system!
|
||||
// The final world rotation depends on the gravity and on the state of
|
||||
// setApplyPhysicsLocal()
|
||||
if (leftRotate) { |
||||
Quaternion rotateL = new Quaternion().fromAngleAxis(FastMath.PI * tpf, Vector3f.UNIT_Y); |
||||
rotateL.multLocal(viewDirection); |
||||
} else if (rightRotate) { |
||||
Quaternion rotateR = new Quaternion().fromAngleAxis(-FastMath.PI * tpf, Vector3f.UNIT_Y); |
||||
rotateR.multLocal(viewDirection); |
||||
} |
||||
physicsCharacter.setViewDirection(viewDirection); |
||||
fpsText.setText("Touch da ground = " + physicsCharacter.isOnGround()); |
||||
if (!lockView) { |
||||
cam.lookAt(characterNode.getWorldTranslation().add(new Vector3f(0, 2, 0)), Vector3f.UNIT_Y); |
||||
} |
||||
} |
||||
|
||||
private void setupPlanet() { |
||||
Material material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
material.setTexture("ColorMap", assetManager.loadTexture("Interface/Logo/Monkey.jpg")); |
||||
//immovable sphere with mesh collision shape
|
||||
Sphere sphere = new Sphere(64, 64, 20); |
||||
planet = new Geometry("Sphere", sphere); |
||||
planet.setMaterial(material); |
||||
planet.setLocalTranslation(30, -15, 30); |
||||
planet.addControl(new RigidBodyControl(new MeshCollisionShape(sphere), 0)); |
||||
rootNode.attachChild(planet); |
||||
getPhysicsSpace().add(planet); |
||||
} |
||||
|
||||
private void checkPlanetGravity() { |
||||
Vector3f planetDist = planet.getWorldTranslation().subtract(characterNode.getWorldTranslation()); |
||||
if (planetDist.length() < 24) { |
||||
physicsCharacter.setGravity(planetDist.normalizeLocal().multLocal(9.81f)); |
||||
} else { |
||||
physicsCharacter.setGravity(normalGravity); |
||||
} |
||||
} |
||||
|
||||
private PhysicsSpace getPhysicsSpace() { |
||||
return bulletAppState.getPhysicsSpace(); |
||||
} |
||||
|
||||
public void onAction(String binding, boolean value, float tpf) { |
||||
if (binding.equals("Strafe Left")) { |
||||
if (value) { |
||||
leftStrafe = true; |
||||
} else { |
||||
leftStrafe = false; |
||||
} |
||||
} else if (binding.equals("Strafe Right")) { |
||||
if (value) { |
||||
rightStrafe = true; |
||||
} else { |
||||
rightStrafe = false; |
||||
} |
||||
} else if (binding.equals("Rotate Left")) { |
||||
if (value) { |
||||
leftRotate = true; |
||||
} else { |
||||
leftRotate = false; |
||||
} |
||||
} else if (binding.equals("Rotate Right")) { |
||||
if (value) { |
||||
rightRotate = true; |
||||
} else { |
||||
rightRotate = false; |
||||
} |
||||
} else if (binding.equals("Walk Forward")) { |
||||
if (value) { |
||||
forward = true; |
||||
} else { |
||||
forward = false; |
||||
} |
||||
} else if (binding.equals("Walk Backward")) { |
||||
if (value) { |
||||
backward = true; |
||||
} else { |
||||
backward = false; |
||||
} |
||||
} else if (binding.equals("Jump")) { |
||||
physicsCharacter.jump(); |
||||
} else if (binding.equals("Duck")) { |
||||
if (value) { |
||||
physicsCharacter.setDucked(true); |
||||
} else { |
||||
physicsCharacter.setDucked(false); |
||||
} |
||||
} else if (binding.equals("Lock View")) { |
||||
if (value && lockView) { |
||||
lockView = false; |
||||
} else if (value && !lockView) { |
||||
lockView = true; |
||||
} |
||||
flyCam.setEnabled(!lockView); |
||||
camNode.setEnabled(lockView); |
||||
} |
||||
} |
||||
private boolean lockView = false; |
||||
|
||||
private void setupKeys() { |
||||
inputManager.addMapping("Strafe Left", |
||||
new KeyTrigger(KeyInput.KEY_U), |
||||
new KeyTrigger(KeyInput.KEY_Z)); |
||||
inputManager.addMapping("Strafe Right", |
||||
new KeyTrigger(KeyInput.KEY_O), |
||||
new KeyTrigger(KeyInput.KEY_X)); |
||||
inputManager.addMapping("Rotate Left", |
||||
new KeyTrigger(KeyInput.KEY_J), |
||||
new KeyTrigger(KeyInput.KEY_LEFT)); |
||||
inputManager.addMapping("Rotate Right", |
||||
new KeyTrigger(KeyInput.KEY_L), |
||||
new KeyTrigger(KeyInput.KEY_RIGHT)); |
||||
inputManager.addMapping("Walk Forward", |
||||
new KeyTrigger(KeyInput.KEY_I), |
||||
new KeyTrigger(KeyInput.KEY_UP)); |
||||
inputManager.addMapping("Walk Backward", |
||||
new KeyTrigger(KeyInput.KEY_K), |
||||
new KeyTrigger(KeyInput.KEY_DOWN)); |
||||
inputManager.addMapping("Jump", |
||||
new KeyTrigger(KeyInput.KEY_F), |
||||
new KeyTrigger(KeyInput.KEY_SPACE)); |
||||
inputManager.addMapping("Duck", |
||||
new KeyTrigger(KeyInput.KEY_G), |
||||
new KeyTrigger(KeyInput.KEY_LSHIFT), |
||||
new KeyTrigger(KeyInput.KEY_RSHIFT)); |
||||
inputManager.addMapping("Lock View", |
||||
new KeyTrigger(KeyInput.KEY_RETURN)); |
||||
inputManager.addListener(this, "Strafe Left", "Strafe Right"); |
||||
inputManager.addListener(this, "Rotate Left", "Rotate Right"); |
||||
inputManager.addListener(this, "Walk Forward", "Walk Backward"); |
||||
inputManager.addListener(this, "Jump", "Duck", "Lock View"); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleRender(RenderManager rm) { |
||||
} |
||||
} |
@ -0,0 +1,357 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.animation.*; |
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.asset.TextureKey; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.PhysicsCollisionEvent; |
||||
import com.jme3.bullet.collision.PhysicsCollisionObject; |
||||
import com.jme3.bullet.collision.RagdollCollisionListener; |
||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
||||
import com.jme3.bullet.control.KinematicRagdollControl; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.font.BitmapText; |
||||
import com.jme3.input.KeyInput; |
||||
import com.jme3.input.MouseInput; |
||||
import com.jme3.input.controls.ActionListener; |
||||
import com.jme3.input.controls.KeyTrigger; |
||||
import com.jme3.input.controls.MouseButtonTrigger; |
||||
import com.jme3.light.DirectionalLight; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.ColorRGBA; |
||||
import com.jme3.math.FastMath; |
||||
import com.jme3.math.Quaternion; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.Node; |
||||
import com.jme3.scene.debug.SkeletonDebugger; |
||||
import com.jme3.scene.shape.Sphere; |
||||
import com.jme3.scene.shape.Sphere.TextureMode; |
||||
import com.jme3.texture.Texture; |
||||
|
||||
/** |
||||
* PHYSICS RAGDOLLS ARE NOT WORKING PROPERLY YET! |
||||
* @author normenhansen |
||||
*/ |
||||
public class TestBoneRagdoll extends SimpleApplication implements RagdollCollisionListener, AnimEventListener { |
||||
|
||||
private BulletAppState bulletAppState; |
||||
Material matBullet; |
||||
Node model; |
||||
KinematicRagdollControl ragdoll; |
||||
float bulletSize = 1f; |
||||
Material mat; |
||||
Material mat3; |
||||
private Sphere bullet; |
||||
private SphereCollisionShape bulletCollisionShape; |
||||
|
||||
public static void main(String[] args) { |
||||
TestBoneRagdoll app = new TestBoneRagdoll(); |
||||
app.start(); |
||||
} |
||||
|
||||
public void simpleInitApp() { |
||||
initCrossHairs(); |
||||
initMaterial(); |
||||
|
||||
cam.setLocation(new Vector3f(0.26924422f, 6.646658f, 22.265987f)); |
||||
cam.setRotation(new Quaternion(-2.302544E-4f, 0.99302495f, -0.117888905f, -0.0019395084f)); |
||||
|
||||
|
||||
bulletAppState = new BulletAppState(); |
||||
bulletAppState.setEnabled(true); |
||||
stateManager.attach(bulletAppState); |
||||
bullet = new Sphere(32, 32, 1.0f, true, false); |
||||
bullet.setTextureMode(TextureMode.Projected); |
||||
bulletCollisionShape = new SphereCollisionShape(1.0f); |
||||
|
||||
// bulletAppState.getPhysicsSpace().enableDebug(assetManager);
|
||||
PhysicsTestHelper.createPhysicsTestWorld(rootNode, assetManager, bulletAppState.getPhysicsSpace()); |
||||
setupLight(); |
||||
|
||||
model = (Node) assetManager.loadModel("Models/Sinbad/Sinbad.mesh.xml"); |
||||
|
||||
// model.setLocalRotation(new Quaternion().fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_X));
|
||||
|
||||
//debug view
|
||||
AnimControl control = model.getControl(AnimControl.class); |
||||
SkeletonDebugger skeletonDebug = new SkeletonDebugger("skeleton", control.getSkeleton()); |
||||
Material mat2 = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat2.getAdditionalRenderState().setWireframe(true); |
||||
mat2.setColor("Color", ColorRGBA.Green); |
||||
mat2.getAdditionalRenderState().setDepthTest(false); |
||||
skeletonDebug.setMaterial(mat2); |
||||
skeletonDebug.setLocalTranslation(model.getLocalTranslation()); |
||||
|
||||
//Note: PhysicsRagdollControl is still TODO, constructor will change
|
||||
ragdoll = new KinematicRagdollControl(0.5f); |
||||
setupSinbad(ragdoll); |
||||
ragdoll.addCollisionListener(this); |
||||
model.addControl(ragdoll); |
||||
|
||||
float eighth_pi = FastMath.PI * 0.125f; |
||||
ragdoll.setJointLimit("Waist", eighth_pi, eighth_pi, eighth_pi, eighth_pi, eighth_pi, eighth_pi); |
||||
ragdoll.setJointLimit("Chest", eighth_pi, eighth_pi, 0, 0, eighth_pi, eighth_pi); |
||||
|
||||
|
||||
//Oto's head is almost rigid
|
||||
// ragdoll.setJointLimit("head", 0, 0, eighth_pi, -eighth_pi, 0, 0);
|
||||
|
||||
getPhysicsSpace().add(ragdoll); |
||||
speed = 1.3f; |
||||
|
||||
rootNode.attachChild(model); |
||||
// rootNode.attachChild(skeletonDebug);
|
||||
flyCam.setMoveSpeed(50); |
||||
|
||||
|
||||
animChannel = control.createChannel(); |
||||
animChannel.setAnim("Dance"); |
||||
control.addListener(this); |
||||
|
||||
inputManager.addListener(new ActionListener() { |
||||
|
||||
public void onAction(String name, boolean isPressed, float tpf) { |
||||
if (name.equals("toggle") && isPressed) { |
||||
|
||||
Vector3f v = new Vector3f(); |
||||
v.set(model.getLocalTranslation()); |
||||
v.y = 0; |
||||
model.setLocalTranslation(v); |
||||
Quaternion q = new Quaternion(); |
||||
float[] angles = new float[3]; |
||||
model.getLocalRotation().toAngles(angles); |
||||
q.fromAngleAxis(angles[1], Vector3f.UNIT_Y); |
||||
model.setLocalRotation(q); |
||||
if (angles[0] < 0) { |
||||
animChannel.setAnim("StandUpBack"); |
||||
ragdoll.blendToKinematicMode(0.5f); |
||||
} else { |
||||
animChannel.setAnim("StandUpFront"); |
||||
ragdoll.blendToKinematicMode(0.5f); |
||||
} |
||||
|
||||
} |
||||
if (name.equals("bullet+") && isPressed) { |
||||
bulletSize += 0.1f; |
||||
|
||||
} |
||||
if (name.equals("bullet-") && isPressed) { |
||||
bulletSize -= 0.1f; |
||||
|
||||
} |
||||
|
||||
if (name.equals("stop") && isPressed) { |
||||
ragdoll.setEnabled(!ragdoll.isEnabled()); |
||||
ragdoll.setRagdollMode(); |
||||
} |
||||
|
||||
if (name.equals("shoot") && !isPressed) { |
||||
Geometry bulletg = new Geometry("bullet", bullet); |
||||
bulletg.setMaterial(matBullet); |
||||
bulletg.setLocalTranslation(cam.getLocation()); |
||||
bulletg.setLocalScale(bulletSize); |
||||
bulletCollisionShape = new SphereCollisionShape(bulletSize); |
||||
RigidBodyControl bulletNode = new RigidBodyControl(bulletCollisionShape, bulletSize * 10); |
||||
bulletNode.setCcdMotionThreshold(0.001f); |
||||
bulletNode.setLinearVelocity(cam.getDirection().mult(80)); |
||||
bulletg.addControl(bulletNode); |
||||
rootNode.attachChild(bulletg); |
||||
getPhysicsSpace().add(bulletNode); |
||||
} |
||||
if (name.equals("boom") && !isPressed) { |
||||
Geometry bulletg = new Geometry("bullet", bullet); |
||||
bulletg.setMaterial(matBullet); |
||||
bulletg.setLocalTranslation(cam.getLocation()); |
||||
bulletg.setLocalScale(bulletSize); |
||||
bulletCollisionShape = new SphereCollisionShape(bulletSize); |
||||
BombControl bulletNode = new BombControl(assetManager, bulletCollisionShape, 1); |
||||
bulletNode.setForceFactor(8); |
||||
bulletNode.setExplosionRadius(20); |
||||
bulletNode.setCcdMotionThreshold(0.001f); |
||||
bulletNode.setLinearVelocity(cam.getDirection().mult(180)); |
||||
bulletg.addControl(bulletNode); |
||||
rootNode.attachChild(bulletg); |
||||
getPhysicsSpace().add(bulletNode); |
||||
} |
||||
} |
||||
}, "toggle", "shoot", "stop", "bullet+", "bullet-", "boom"); |
||||
inputManager.addMapping("toggle", new KeyTrigger(KeyInput.KEY_SPACE)); |
||||
inputManager.addMapping("shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); |
||||
inputManager.addMapping("boom", new MouseButtonTrigger(MouseInput.BUTTON_RIGHT)); |
||||
inputManager.addMapping("stop", new KeyTrigger(KeyInput.KEY_H)); |
||||
inputManager.addMapping("bullet-", new KeyTrigger(KeyInput.KEY_COMMA)); |
||||
inputManager.addMapping("bullet+", new KeyTrigger(KeyInput.KEY_PERIOD)); |
||||
|
||||
|
||||
} |
||||
|
||||
private void setupLight() { |
||||
// AmbientLight al = new AmbientLight();
|
||||
// al.setColor(ColorRGBA.White.mult(1));
|
||||
// rootNode.addLight(al);
|
||||
|
||||
DirectionalLight dl = new DirectionalLight(); |
||||
dl.setDirection(new Vector3f(-0.1f, -0.7f, -1).normalizeLocal()); |
||||
dl.setColor(new ColorRGBA(1f, 1f, 1f, 1.0f)); |
||||
rootNode.addLight(dl); |
||||
} |
||||
|
||||
private PhysicsSpace getPhysicsSpace() { |
||||
return bulletAppState.getPhysicsSpace(); |
||||
} |
||||
|
||||
public void initMaterial() { |
||||
|
||||
matBullet = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
TextureKey key2 = new TextureKey("Textures/Terrain/Rock/Rock.PNG"); |
||||
key2.setGenerateMips(true); |
||||
Texture tex2 = assetManager.loadTexture(key2); |
||||
matBullet.setTexture("ColorMap", tex2); |
||||
} |
||||
|
||||
protected void initCrossHairs() { |
||||
guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt"); |
||||
BitmapText ch = new BitmapText(guiFont, false); |
||||
ch.setSize(guiFont.getCharSet().getRenderedSize() * 2); |
||||
ch.setText("+"); // crosshairs
|
||||
ch.setLocalTranslation( // center
|
||||
settings.getWidth() / 2 - guiFont.getCharSet().getRenderedSize() / 3 * 2, |
||||
settings.getHeight() / 2 + ch.getLineHeight() / 2, 0); |
||||
guiNode.attachChild(ch); |
||||
} |
||||
|
||||
public void collide(Bone bone, PhysicsCollisionObject object, PhysicsCollisionEvent event) { |
||||
|
||||
if (object.getUserObject() != null && object.getUserObject() instanceof Geometry) { |
||||
Geometry geom = (Geometry) object.getUserObject(); |
||||
if ("Floor".equals(geom.getName())) { |
||||
return; |
||||
} |
||||
} |
||||
|
||||
ragdoll.setRagdollMode(); |
||||
|
||||
} |
||||
|
||||
private void setupSinbad(KinematicRagdollControl ragdoll) { |
||||
ragdoll.addBoneName("Ulna.L"); |
||||
ragdoll.addBoneName("Ulna.R"); |
||||
ragdoll.addBoneName("Chest"); |
||||
ragdoll.addBoneName("Foot.L"); |
||||
ragdoll.addBoneName("Foot.R"); |
||||
ragdoll.addBoneName("Hand.R"); |
||||
ragdoll.addBoneName("Hand.L"); |
||||
ragdoll.addBoneName("Neck"); |
||||
ragdoll.addBoneName("Root"); |
||||
ragdoll.addBoneName("Stomach"); |
||||
ragdoll.addBoneName("Waist"); |
||||
ragdoll.addBoneName("Humerus.L"); |
||||
ragdoll.addBoneName("Humerus.R"); |
||||
ragdoll.addBoneName("Thigh.L"); |
||||
ragdoll.addBoneName("Thigh.R"); |
||||
ragdoll.addBoneName("Calf.L"); |
||||
ragdoll.addBoneName("Calf.R"); |
||||
ragdoll.addBoneName("Clavicle.L"); |
||||
ragdoll.addBoneName("Clavicle.R"); |
||||
|
||||
} |
||||
float elTime = 0; |
||||
boolean forward = true; |
||||
AnimControl animControl; |
||||
AnimChannel animChannel; |
||||
Vector3f direction = new Vector3f(0, 0, 1); |
||||
Quaternion rotate = new Quaternion().fromAngleAxis(FastMath.PI / 8, Vector3f.UNIT_Y); |
||||
boolean dance = true; |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
// System.out.println(((BoundingBox) model.getWorldBound()).getYExtent());
|
||||
// elTime += tpf;
|
||||
// if (elTime > 3) {
|
||||
// elTime = 0;
|
||||
// if (dance) {
|
||||
// rotate.multLocal(direction);
|
||||
// }
|
||||
// if (Math.random() > 0.80) {
|
||||
// dance = true;
|
||||
// animChannel.setAnim("Dance");
|
||||
// } else {
|
||||
// dance = false;
|
||||
// animChannel.setAnim("RunBase");
|
||||
// rotate.fromAngleAxis(FastMath.QUARTER_PI * ((float) Math.random() - 0.5f), Vector3f.UNIT_Y);
|
||||
// rotate.multLocal(direction);
|
||||
// }
|
||||
// }
|
||||
// if (!ragdoll.hasControl() && !dance) {
|
||||
// if (model.getLocalTranslation().getZ() < -10) {
|
||||
// direction.z = 1;
|
||||
// direction.normalizeLocal();
|
||||
// } else if (model.getLocalTranslation().getZ() > 10) {
|
||||
// direction.z = -1;
|
||||
// direction.normalizeLocal();
|
||||
// }
|
||||
// if (model.getLocalTranslation().getX() < -10) {
|
||||
// direction.x = 1;
|
||||
// direction.normalizeLocal();
|
||||
// } else if (model.getLocalTranslation().getX() > 10) {
|
||||
// direction.x = -1;
|
||||
// direction.normalizeLocal();
|
||||
// }
|
||||
// model.move(direction.multLocal(tpf * 8));
|
||||
// direction.normalizeLocal();
|
||||
// model.lookAt(model.getLocalTranslation().add(direction), Vector3f.UNIT_Y);
|
||||
// }
|
||||
} |
||||
|
||||
public void onAnimCycleDone(AnimControl control, AnimChannel channel, String animName) { |
||||
// if(channel.getAnimationName().equals("StandUpFront")){
|
||||
// channel.setAnim("Dance");
|
||||
// }
|
||||
|
||||
if (channel.getAnimationName().equals("StandUpBack") || channel.getAnimationName().equals("StandUpFront")) { |
||||
channel.setLoopMode(LoopMode.DontLoop); |
||||
channel.setAnim("IdleTop", 5); |
||||
channel.setLoopMode(LoopMode.Loop); |
||||
} |
||||
// if(channel.getAnimationName().equals("IdleTop")){
|
||||
// channel.setAnim("StandUpFront");
|
||||
// }
|
||||
|
||||
} |
||||
|
||||
public void onAnimChange(AnimControl control, AnimChannel channel, String animName) { |
||||
} |
||||
} |
@ -0,0 +1,251 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.asset.TextureKey; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.font.BitmapText; |
||||
import com.jme3.input.MouseInput; |
||||
import com.jme3.input.controls.ActionListener; |
||||
import com.jme3.input.controls.MouseButtonTrigger; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.Vector2f; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.renderer.queue.RenderQueue.ShadowMode; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.scene.shape.Sphere; |
||||
import com.jme3.scene.shape.Sphere.TextureMode; |
||||
import com.jme3.texture.Texture; |
||||
import com.jme3.texture.Texture.WrapMode; |
||||
|
||||
/** |
||||
* |
||||
* @author double1984 (tower mod by atom) |
||||
*/ |
||||
public class TestBrickTower extends SimpleApplication { |
||||
|
||||
int bricksPerLayer = 8; |
||||
int brickLayers = 30; |
||||
|
||||
static float brickWidth = .75f, brickHeight = .25f, brickDepth = .25f; |
||||
float radius = 3f; |
||||
float angle = 0; |
||||
|
||||
|
||||
Material mat; |
||||
Material mat2; |
||||
Material mat3; |
||||
private Sphere bullet; |
||||
private Box brick; |
||||
private SphereCollisionShape bulletCollisionShape; |
||||
|
||||
private BulletAppState bulletAppState; |
||||
|
||||
public static void main(String args[]) { |
||||
TestBrickTower f = new TestBrickTower(); |
||||
f.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
bulletAppState = new BulletAppState(); |
||||
bulletAppState.setThreadingType(BulletAppState.ThreadingType.PARALLEL); |
||||
// bulletAppState.setEnabled(false);
|
||||
stateManager.attach(bulletAppState); |
||||
bullet = new Sphere(32, 32, 0.4f, true, false); |
||||
bullet.setTextureMode(TextureMode.Projected); |
||||
bulletCollisionShape = new SphereCollisionShape(0.4f); |
||||
|
||||
brick = new Box(brickWidth, brickHeight, brickDepth); |
||||
brick.scaleTextureCoordinates(new Vector2f(1f, .5f)); |
||||
//bulletAppState.getPhysicsSpace().enableDebug(assetManager);
|
||||
initMaterial(); |
||||
initTower(); |
||||
initFloor(); |
||||
initCrossHairs(); |
||||
this.cam.setLocation(new Vector3f(0, 25f, 8f)); |
||||
cam.lookAt(Vector3f.ZERO, new Vector3f(0, 1, 0)); |
||||
cam.setFrustumFar(80); |
||||
inputManager.addMapping("shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); |
||||
inputManager.addListener(actionListener, "shoot"); |
||||
rootNode.setShadowMode(ShadowMode.Off); |
||||
} |
||||
|
||||
private PhysicsSpace getPhysicsSpace() { |
||||
return bulletAppState.getPhysicsSpace(); |
||||
} |
||||
private ActionListener actionListener = new ActionListener() { |
||||
|
||||
public void onAction(String name, boolean keyPressed, float tpf) { |
||||
if (name.equals("shoot") && !keyPressed) { |
||||
Geometry bulletg = new Geometry("bullet", bullet); |
||||
bulletg.setMaterial(mat2); |
||||
bulletg.setShadowMode(ShadowMode.CastAndReceive); |
||||
bulletg.setLocalTranslation(cam.getLocation()); |
||||
RigidBodyControl bulletNode = new BombControl(assetManager, bulletCollisionShape, 1); |
||||
// RigidBodyControl bulletNode = new RigidBodyControl(bulletCollisionShape, 1);
|
||||
bulletNode.setLinearVelocity(cam.getDirection().mult(25)); |
||||
bulletg.addControl(bulletNode); |
||||
rootNode.attachChild(bulletg); |
||||
getPhysicsSpace().add(bulletNode); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
public void initTower() { |
||||
double tempX = 0; |
||||
double tempY = 0; |
||||
double tempZ = 0; |
||||
angle = 0f; |
||||
for (int i = 0; i < brickLayers; i++){ |
||||
// Increment rows
|
||||
if(i!=0) |
||||
tempY+=brickHeight*2; |
||||
else |
||||
tempY=brickHeight; |
||||
// Alternate brick seams
|
||||
angle = 360.0f / bricksPerLayer * i/2f; |
||||
for (int j = 0; j < bricksPerLayer; j++){ |
||||
tempZ = Math.cos(Math.toRadians(angle))*radius; |
||||
tempX = Math.sin(Math.toRadians(angle))*radius; |
||||
System.out.println("x="+((float)(tempX))+" y="+((float)(tempY))+" z="+(float)(tempZ)); |
||||
Vector3f vt = new Vector3f((float)(tempX), (float)(tempY), (float)(tempZ)); |
||||
// Add crenelation
|
||||
if (i==brickLayers-1){ |
||||
if (j%2 == 0){ |
||||
addBrick(vt); |
||||
} |
||||
} |
||||
// Create main tower
|
||||
else { |
||||
addBrick(vt); |
||||
} |
||||
angle += 360.0/bricksPerLayer; |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
public void initFloor() { |
||||
Box floorBox = new Box(10f, 0.1f, 5f); |
||||
floorBox.scaleTextureCoordinates(new Vector2f(3, 6)); |
||||
|
||||
Geometry floor = new Geometry("floor", floorBox); |
||||
floor.setMaterial(mat3); |
||||
floor.setShadowMode(ShadowMode.Receive); |
||||
floor.setLocalTranslation(0, 0, 0); |
||||
floor.addControl(new RigidBodyControl(0)); |
||||
this.rootNode.attachChild(floor); |
||||
this.getPhysicsSpace().add(floor); |
||||
} |
||||
|
||||
public void initMaterial() { |
||||
mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
TextureKey key = new TextureKey("Textures/Terrain/BrickWall/BrickWall.jpg"); |
||||
key.setGenerateMips(true); |
||||
Texture tex = assetManager.loadTexture(key); |
||||
mat.setTexture("ColorMap", tex); |
||||
|
||||
mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
TextureKey key2 = new TextureKey("Textures/Terrain/Rock/Rock.PNG"); |
||||
key2.setGenerateMips(true); |
||||
Texture tex2 = assetManager.loadTexture(key2); |
||||
mat2.setTexture("ColorMap", tex2); |
||||
|
||||
mat3 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
TextureKey key3 = new TextureKey("Textures/Terrain/Pond/Pond.jpg"); |
||||
key3.setGenerateMips(true); |
||||
Texture tex3 = assetManager.loadTexture(key3); |
||||
tex3.setWrap(WrapMode.Repeat); |
||||
mat3.setTexture("ColorMap", tex3); |
||||
} |
||||
|
||||
public void addBrick(Vector3f ori) { |
||||
Geometry reBoxg = new Geometry("brick", brick); |
||||
reBoxg.setMaterial(mat); |
||||
reBoxg.setLocalTranslation(ori); |
||||
reBoxg.rotate(0f, (float)Math.toRadians(angle) , 0f ); |
||||
reBoxg.addControl(new RigidBodyControl(1.5f)); |
||||
reBoxg.setShadowMode(ShadowMode.CastAndReceive); |
||||
reBoxg.getControl(RigidBodyControl.class).setFriction(1.6f); |
||||
this.rootNode.attachChild(reBoxg); |
||||
this.getPhysicsSpace().add(reBoxg); |
||||
} |
||||
|
||||
protected void initCrossHairs() { |
||||
guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt"); |
||||
BitmapText ch = new BitmapText(guiFont, false); |
||||
ch.setSize(guiFont.getCharSet().getRenderedSize() * 2); |
||||
ch.setText("+"); // crosshairs
|
||||
ch.setLocalTranslation( // center
|
||||
settings.getWidth() / 2 - guiFont.getCharSet().getRenderedSize() / 3 * 2, |
||||
settings.getHeight() / 2 + ch.getLineHeight() / 2, 0); |
||||
guiNode.attachChild(ch); |
||||
} |
||||
} |
@ -0,0 +1,205 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.asset.TextureKey; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.shapes.BoxCollisionShape; |
||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.font.BitmapText; |
||||
import com.jme3.input.KeyInput; |
||||
import com.jme3.input.MouseInput; |
||||
import com.jme3.input.controls.ActionListener; |
||||
import com.jme3.input.controls.KeyTrigger; |
||||
import com.jme3.input.controls.MouseButtonTrigger; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.Vector2f; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.renderer.queue.RenderQueue.ShadowMode; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.scene.shape.Sphere; |
||||
import com.jme3.scene.shape.Sphere.TextureMode; |
||||
import com.jme3.texture.Texture; |
||||
import com.jme3.texture.Texture.WrapMode; |
||||
|
||||
/** |
||||
* |
||||
* @author double1984 |
||||
*/ |
||||
public class TestBrickWall extends SimpleApplication { |
||||
|
||||
static float bLength = 0.48f; |
||||
static float bWidth = 0.24f; |
||||
static float bHeight = 0.12f; |
||||
Material mat; |
||||
Material mat2; |
||||
Material mat3; |
||||
private static Sphere bullet; |
||||
private static Box brick; |
||||
private static SphereCollisionShape bulletCollisionShape; |
||||
|
||||
private BulletAppState bulletAppState; |
||||
|
||||
public static void main(String args[]) { |
||||
TestBrickWall f = new TestBrickWall(); |
||||
f.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
|
||||
bulletAppState = new BulletAppState(); |
||||
bulletAppState.setThreadingType(BulletAppState.ThreadingType.PARALLEL); |
||||
stateManager.attach(bulletAppState); |
||||
|
||||
bullet = new Sphere(32, 32, 0.4f, true, false); |
||||
bullet.setTextureMode(TextureMode.Projected); |
||||
bulletCollisionShape = new SphereCollisionShape(0.4f); |
||||
brick = new Box(bLength, bHeight, bWidth); |
||||
brick.scaleTextureCoordinates(new Vector2f(1f, .5f)); |
||||
|
||||
initMaterial(); |
||||
initWall(); |
||||
initFloor(); |
||||
initCrossHairs(); |
||||
this.cam.setLocation(new Vector3f(0, 6f, 6f)); |
||||
cam.lookAt(Vector3f.ZERO, new Vector3f(0, 1, 0)); |
||||
cam.setFrustumFar(15); |
||||
inputManager.addMapping("shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); |
||||
inputManager.addListener(actionListener, "shoot"); |
||||
inputManager.addMapping("gc", new KeyTrigger(KeyInput.KEY_X)); |
||||
inputManager.addListener(actionListener, "gc"); |
||||
|
||||
rootNode.setShadowMode(ShadowMode.Off); |
||||
} |
||||
|
||||
private PhysicsSpace getPhysicsSpace() { |
||||
return bulletAppState.getPhysicsSpace(); |
||||
} |
||||
private ActionListener actionListener = new ActionListener() { |
||||
|
||||
public void onAction(String name, boolean keyPressed, float tpf) { |
||||
if (name.equals("shoot") && !keyPressed) { |
||||
Geometry bulletg = new Geometry("bullet", bullet); |
||||
bulletg.setMaterial(mat2); |
||||
bulletg.setShadowMode(ShadowMode.CastAndReceive); |
||||
bulletg.setLocalTranslation(cam.getLocation()); |
||||
|
||||
SphereCollisionShape bulletCollisionShape = new SphereCollisionShape(0.4f); |
||||
RigidBodyControl bulletNode = new BombControl(assetManager, bulletCollisionShape, 1); |
||||
// RigidBodyControl bulletNode = new RigidBodyControl(bulletCollisionShape, 1);
|
||||
bulletNode.setLinearVelocity(cam.getDirection().mult(25)); |
||||
bulletg.addControl(bulletNode); |
||||
rootNode.attachChild(bulletg); |
||||
getPhysicsSpace().add(bulletNode); |
||||
} |
||||
if (name.equals("gc") && !keyPressed) { |
||||
System.gc(); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
public void initWall() { |
||||
float startpt = bLength / 4; |
||||
float height = 0; |
||||
for (int j = 0; j < 15; j++) { |
||||
for (int i = 0; i < 4; i++) { |
||||
Vector3f vt = new Vector3f(i * bLength * 2 + startpt, bHeight + height, 0); |
||||
addBrick(vt); |
||||
} |
||||
startpt = -startpt; |
||||
height += 2 * bHeight; |
||||
} |
||||
} |
||||
|
||||
public void initFloor() { |
||||
Box floorBox = new Box(10f, 0.1f, 5f); |
||||
floorBox.scaleTextureCoordinates(new Vector2f(3, 6)); |
||||
|
||||
Geometry floor = new Geometry("floor", floorBox); |
||||
floor.setMaterial(mat3); |
||||
floor.setShadowMode(ShadowMode.Receive); |
||||
floor.setLocalTranslation(0, -0.1f, 0); |
||||
floor.addControl(new RigidBodyControl(new BoxCollisionShape(new Vector3f(10f, 0.1f, 5f)), 0)); |
||||
this.rootNode.attachChild(floor); |
||||
this.getPhysicsSpace().add(floor); |
||||
} |
||||
|
||||
public void initMaterial() { |
||||
mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
TextureKey key = new TextureKey("Textures/Terrain/BrickWall/BrickWall.jpg"); |
||||
key.setGenerateMips(true); |
||||
Texture tex = assetManager.loadTexture(key); |
||||
mat.setTexture("ColorMap", tex); |
||||
|
||||
mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
TextureKey key2 = new TextureKey("Textures/Terrain/Rock/Rock.PNG"); |
||||
key2.setGenerateMips(true); |
||||
Texture tex2 = assetManager.loadTexture(key2); |
||||
mat2.setTexture("ColorMap", tex2); |
||||
|
||||
mat3 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
TextureKey key3 = new TextureKey("Textures/Terrain/Pond/Pond.jpg"); |
||||
key3.setGenerateMips(true); |
||||
Texture tex3 = assetManager.loadTexture(key3); |
||||
tex3.setWrap(WrapMode.Repeat); |
||||
mat3.setTexture("ColorMap", tex3); |
||||
} |
||||
|
||||
public void addBrick(Vector3f ori) { |
||||
|
||||
Geometry reBoxg = new Geometry("brick", brick); |
||||
reBoxg.setMaterial(mat); |
||||
reBoxg.setLocalTranslation(ori); |
||||
//for geometry with sphere mesh the physics system automatically uses a sphere collision shape
|
||||
reBoxg.addControl(new RigidBodyControl(1.5f)); |
||||
reBoxg.setShadowMode(ShadowMode.CastAndReceive); |
||||
reBoxg.getControl(RigidBodyControl.class).setFriction(0.6f); |
||||
this.rootNode.attachChild(reBoxg); |
||||
this.getPhysicsSpace().add(reBoxg); |
||||
} |
||||
|
||||
protected void initCrossHairs() { |
||||
guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt"); |
||||
BitmapText ch = new BitmapText(guiFont, false); |
||||
ch.setSize(guiFont.getCharSet().getRenderedSize() * 2); |
||||
ch.setText("+"); // crosshairs
|
||||
ch.setLocalTranslation( // center
|
||||
settings.getWidth() / 2 - guiFont.getCharSet().getRenderedSize() / 3 * 2, |
||||
settings.getHeight() / 2 + ch.getLineHeight() / 2, 0); |
||||
guiNode.attachChild(ch); |
||||
} |
||||
} |
@ -0,0 +1,152 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.shapes.BoxCollisionShape; |
||||
import com.jme3.bullet.collision.shapes.MeshCollisionShape; |
||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.input.MouseInput; |
||||
import com.jme3.input.controls.ActionListener; |
||||
import com.jme3.input.controls.MouseButtonTrigger; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.ColorRGBA; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.renderer.RenderManager; |
||||
import com.jme3.renderer.queue.RenderQueue.ShadowMode; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.Node; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.scene.shape.Sphere; |
||||
import com.jme3.scene.shape.Sphere.TextureMode; |
||||
|
||||
/** |
||||
* |
||||
* @author normenhansen |
||||
*/ |
||||
public class TestCcd extends SimpleApplication implements ActionListener { |
||||
|
||||
private Material mat; |
||||
private Material mat2; |
||||
private Sphere bullet; |
||||
private SphereCollisionShape bulletCollisionShape; |
||||
private BulletAppState bulletAppState; |
||||
|
||||
public static void main(String[] args) { |
||||
TestCcd app = new TestCcd(); |
||||
app.start(); |
||||
} |
||||
|
||||
private void setupKeys() { |
||||
inputManager.addMapping("shoot", new MouseButtonTrigger(MouseInput.BUTTON_LEFT)); |
||||
inputManager.addMapping("shoot2", new MouseButtonTrigger(MouseInput.BUTTON_RIGHT)); |
||||
inputManager.addListener(this, "shoot"); |
||||
inputManager.addListener(this, "shoot2"); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
bulletAppState = new BulletAppState(); |
||||
stateManager.attach(bulletAppState); |
||||
bulletAppState.setDebugEnabled(true); |
||||
bullet = new Sphere(32, 32, 0.4f, true, false); |
||||
bullet.setTextureMode(TextureMode.Projected); |
||||
bulletCollisionShape = new SphereCollisionShape(0.1f); |
||||
setupKeys(); |
||||
|
||||
mat = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat.getAdditionalRenderState().setWireframe(true); |
||||
mat.setColor("Color", ColorRGBA.Green); |
||||
|
||||
mat2 = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat2.getAdditionalRenderState().setWireframe(true); |
||||
mat2.setColor("Color", ColorRGBA.Red); |
||||
|
||||
// An obstacle mesh, does not move (mass=0)
|
||||
Node node2 = new Node(); |
||||
node2.setName("mesh"); |
||||
node2.setLocalTranslation(new Vector3f(2.5f, 0, 0f)); |
||||
node2.addControl(new RigidBodyControl(new MeshCollisionShape(new Box(4, 4, 0.1f)), 0)); |
||||
rootNode.attachChild(node2); |
||||
getPhysicsSpace().add(node2); |
||||
|
||||
// The floor, does not move (mass=0)
|
||||
Node node3 = new Node(); |
||||
node3.setLocalTranslation(new Vector3f(0f, -6, 0f)); |
||||
node3.addControl(new RigidBodyControl(new BoxCollisionShape(new Vector3f(100, 1, 100)), 0)); |
||||
rootNode.attachChild(node3); |
||||
getPhysicsSpace().add(node3); |
||||
|
||||
} |
||||
|
||||
private PhysicsSpace getPhysicsSpace() { |
||||
return bulletAppState.getPhysicsSpace(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
//TODO: add update code
|
||||
} |
||||
|
||||
@Override |
||||
public void simpleRender(RenderManager rm) { |
||||
//TODO: add render code
|
||||
} |
||||
|
||||
public void onAction(String binding, boolean value, float tpf) { |
||||
if (binding.equals("shoot") && !value) { |
||||
Geometry bulletg = new Geometry("bullet", bullet); |
||||
bulletg.setMaterial(mat); |
||||
bulletg.setName("bullet"); |
||||
bulletg.setLocalTranslation(cam.getLocation()); |
||||
bulletg.setShadowMode(ShadowMode.CastAndReceive); |
||||
bulletg.addControl(new RigidBodyControl(bulletCollisionShape, 1)); |
||||
bulletg.getControl(RigidBodyControl.class).setCcdMotionThreshold(0.1f); |
||||
bulletg.getControl(RigidBodyControl.class).setLinearVelocity(cam.getDirection().mult(40)); |
||||
rootNode.attachChild(bulletg); |
||||
getPhysicsSpace().add(bulletg); |
||||
} else if (binding.equals("shoot2") && !value) { |
||||
Geometry bulletg = new Geometry("bullet", bullet); |
||||
bulletg.setMaterial(mat2); |
||||
bulletg.setName("bullet"); |
||||
bulletg.setLocalTranslation(cam.getLocation()); |
||||
bulletg.setShadowMode(ShadowMode.CastAndReceive); |
||||
bulletg.addControl(new RigidBodyControl(bulletCollisionShape, 1)); |
||||
bulletg.getControl(RigidBodyControl.class).setLinearVelocity(cam.getDirection().mult(40)); |
||||
rootNode.attachChild(bulletg); |
||||
getPhysicsSpace().add(bulletg); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,107 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.PhysicsCollisionObject; |
||||
import com.jme3.bullet.collision.shapes.MeshCollisionShape; |
||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.renderer.RenderManager; |
||||
import com.jme3.scene.Node; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.scene.shape.Sphere; |
||||
|
||||
/** |
||||
* |
||||
* @author normenhansen |
||||
*/ |
||||
public class TestCollisionGroups extends SimpleApplication { |
||||
|
||||
private BulletAppState bulletAppState; |
||||
|
||||
public static void main(String[] args) { |
||||
TestCollisionGroups app = new TestCollisionGroups(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
bulletAppState = new BulletAppState(); |
||||
stateManager.attach(bulletAppState); |
||||
bulletAppState.setDebugEnabled(true); |
||||
|
||||
// Add a physics sphere to the world
|
||||
Node physicsSphere = PhysicsTestHelper.createPhysicsTestNode(assetManager, new SphereCollisionShape(1), 1); |
||||
physicsSphere.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(3, 6, 0)); |
||||
rootNode.attachChild(physicsSphere); |
||||
getPhysicsSpace().add(physicsSphere); |
||||
|
||||
// Add a physics sphere to the world
|
||||
Node physicsSphere2 = PhysicsTestHelper.createPhysicsTestNode(assetManager, new SphereCollisionShape(1), 1); |
||||
physicsSphere2.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(4, 8, 0)); |
||||
physicsSphere2.getControl(RigidBodyControl.class).addCollideWithGroup(PhysicsCollisionObject.COLLISION_GROUP_02); |
||||
rootNode.attachChild(physicsSphere2); |
||||
getPhysicsSpace().add(physicsSphere2); |
||||
|
||||
// an obstacle mesh, does not move (mass=0)
|
||||
Node node2 = PhysicsTestHelper.createPhysicsTestNode(assetManager, new MeshCollisionShape(new Sphere(16, 16, 1.2f)), 0); |
||||
node2.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(2.5f, -4, 0f)); |
||||
node2.getControl(RigidBodyControl.class).setCollisionGroup(PhysicsCollisionObject.COLLISION_GROUP_02); |
||||
node2.getControl(RigidBodyControl.class).setCollideWithGroups(PhysicsCollisionObject.COLLISION_GROUP_02); |
||||
rootNode.attachChild(node2); |
||||
getPhysicsSpace().add(node2); |
||||
|
||||
// the floor, does not move (mass=0)
|
||||
Node node3 = PhysicsTestHelper.createPhysicsTestNode(assetManager, new MeshCollisionShape(new Box(100f, 0.2f, 100f)), 0); |
||||
node3.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(0f, -6, 0f)); |
||||
rootNode.attachChild(node3); |
||||
getPhysicsSpace().add(node3); |
||||
} |
||||
|
||||
private PhysicsSpace getPhysicsSpace() { |
||||
return bulletAppState.getPhysicsSpace(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
//TODO: add update code
|
||||
} |
||||
|
||||
@Override |
||||
public void simpleRender(RenderManager rm) { |
||||
//TODO: add render code
|
||||
} |
||||
} |
@ -0,0 +1,98 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.PhysicsCollisionEvent; |
||||
import com.jme3.bullet.collision.PhysicsCollisionListener; |
||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
||||
import com.jme3.renderer.RenderManager; |
||||
import com.jme3.scene.shape.Sphere; |
||||
import com.jme3.scene.shape.Sphere.TextureMode; |
||||
|
||||
/** |
||||
* |
||||
* @author normenhansen |
||||
*/ |
||||
public class TestCollisionListener extends SimpleApplication implements PhysicsCollisionListener { |
||||
|
||||
private BulletAppState bulletAppState; |
||||
private Sphere bullet; |
||||
private SphereCollisionShape bulletCollisionShape; |
||||
|
||||
public static void main(String[] args) { |
||||
TestCollisionListener app = new TestCollisionListener(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
bulletAppState = new BulletAppState(); |
||||
stateManager.attach(bulletAppState); |
||||
bulletAppState.setDebugEnabled(true); |
||||
bullet = new Sphere(32, 32, 0.4f, true, false); |
||||
bullet.setTextureMode(TextureMode.Projected); |
||||
bulletCollisionShape = new SphereCollisionShape(0.4f); |
||||
|
||||
PhysicsTestHelper.createPhysicsTestWorld(rootNode, assetManager, bulletAppState.getPhysicsSpace()); |
||||
PhysicsTestHelper.createBallShooter(this, rootNode, bulletAppState.getPhysicsSpace()); |
||||
|
||||
// add ourselves as collision listener
|
||||
getPhysicsSpace().addCollisionListener(this); |
||||
} |
||||
|
||||
private PhysicsSpace getPhysicsSpace(){ |
||||
return bulletAppState.getPhysicsSpace(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
//TODO: add update code
|
||||
} |
||||
|
||||
@Override |
||||
public void simpleRender(RenderManager rm) { |
||||
//TODO: add render code
|
||||
} |
||||
|
||||
public void collision(PhysicsCollisionEvent event) { |
||||
if ("Box".equals(event.getNodeA().getName()) || "Box".equals(event.getNodeB().getName())) { |
||||
if ("bullet".equals(event.getNodeA().getName()) || "bullet".equals(event.getNodeB().getName())) { |
||||
fpsText.setText("You hit the box!"); |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,137 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.ColorRGBA; |
||||
import com.jme3.math.FastMath; |
||||
import com.jme3.math.Quaternion; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.Node; |
||||
import com.jme3.scene.Spatial; |
||||
import com.jme3.scene.shape.Box; |
||||
import com.jme3.scene.shape.Cylinder; |
||||
import com.jme3.scene.shape.Torus; |
||||
|
||||
/** |
||||
* This is a basic Test of jbullet-jme functions |
||||
* |
||||
* @author normenhansen |
||||
*/ |
||||
public class TestCollisionShapeFactory extends SimpleApplication { |
||||
|
||||
private BulletAppState bulletAppState; |
||||
private Material mat1; |
||||
private Material mat2; |
||||
private Material mat3; |
||||
|
||||
public static void main(String[] args) { |
||||
TestCollisionShapeFactory app = new TestCollisionShapeFactory(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
bulletAppState = new BulletAppState(); |
||||
stateManager.attach(bulletAppState); |
||||
bulletAppState.setDebugEnabled(true); |
||||
createMaterial(); |
||||
|
||||
Node node = new Node("node1"); |
||||
attachRandomGeometry(node, mat1); |
||||
randomizeTransform(node); |
||||
|
||||
Node node2 = new Node("node2"); |
||||
attachRandomGeometry(node2, mat2); |
||||
randomizeTransform(node2); |
||||
|
||||
node.attachChild(node2); |
||||
rootNode.attachChild(node); |
||||
|
||||
RigidBodyControl control = new RigidBodyControl(0); |
||||
node.addControl(control); |
||||
getPhysicsSpace().add(control); |
||||
|
||||
//test single geometry too
|
||||
Geometry myGeom = new Geometry("cylinder", new Cylinder(16, 16, 0.5f, 1)); |
||||
myGeom.setMaterial(mat3); |
||||
randomizeTransform(myGeom); |
||||
rootNode.attachChild(myGeom); |
||||
RigidBodyControl control3 = new RigidBodyControl(0); |
||||
myGeom.addControl(control3); |
||||
getPhysicsSpace().add(control3); |
||||
} |
||||
|
||||
private void attachRandomGeometry(Node node, Material mat) { |
||||
Box box = new Box(0.25f, 0.25f, 0.25f); |
||||
Torus torus = new Torus(16, 16, 0.2f, 0.8f); |
||||
Geometry[] boxes = new Geometry[]{ |
||||
new Geometry("box1", box), |
||||
new Geometry("box2", box), |
||||
new Geometry("box3", box), |
||||
new Geometry("torus1", torus), |
||||
new Geometry("torus2", torus), |
||||
new Geometry("torus3", torus) |
||||
}; |
||||
for (int i = 0; i < boxes.length; i++) { |
||||
Geometry geometry = boxes[i]; |
||||
geometry.setLocalTranslation((float) Math.random() * 10 -10, (float) Math.random() * 10 -10, (float) Math.random() * 10 -10); |
||||
geometry.setLocalRotation(new Quaternion().fromAngles((float) Math.random() * FastMath.PI, (float) Math.random() * FastMath.PI, (float) Math.random() * FastMath.PI)); |
||||
geometry.setLocalScale((float) Math.random() * 10 -10, (float) Math.random() * 10 -10, (float) Math.random() * 10 -10); |
||||
geometry.setMaterial(mat); |
||||
node.attachChild(geometry); |
||||
} |
||||
} |
||||
|
||||
private void randomizeTransform(Spatial spat){ |
||||
spat.setLocalTranslation((float) Math.random() * 10, (float) Math.random() * 10, (float) Math.random() * 10); |
||||
spat.setLocalTranslation((float) Math.random() * 10, (float) Math.random() * 10, (float) Math.random() * 10); |
||||
spat.setLocalScale((float) Math.random() * 2, (float) Math.random() * 2, (float) Math.random() * 2); |
||||
} |
||||
|
||||
private void createMaterial() { |
||||
mat1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat1.setColor("Color", ColorRGBA.Green); |
||||
mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat2.setColor("Color", ColorRGBA.Red); |
||||
mat3 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); |
||||
mat3.setColor("Color", ColorRGBA.Yellow); |
||||
} |
||||
|
||||
private PhysicsSpace getPhysicsSpace() { |
||||
return bulletAppState.getPhysicsSpace(); |
||||
} |
||||
} |
@ -0,0 +1,259 @@ |
||||
/* |
||||
* Copyright (c) 2009-2018 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bounding.BoundingBox; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.shapes.CollisionShape; |
||||
import com.jme3.bullet.control.VehicleControl; |
||||
import com.jme3.bullet.objects.VehicleWheel; |
||||
import com.jme3.bullet.util.CollisionShapeFactory; |
||||
import com.jme3.input.KeyInput; |
||||
import com.jme3.input.controls.ActionListener; |
||||
import com.jme3.input.controls.KeyTrigger; |
||||
import com.jme3.light.DirectionalLight; |
||||
import com.jme3.math.FastMath; |
||||
import com.jme3.math.Matrix3f; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.renderer.queue.RenderQueue.ShadowMode; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.Node; |
||||
import com.jme3.scene.Spatial; |
||||
|
||||
public class TestFancyCar extends SimpleApplication implements ActionListener { |
||||
|
||||
private BulletAppState bulletAppState; |
||||
private VehicleControl player; |
||||
private VehicleWheel fr, fl, br, bl; |
||||
private Node node_fr, node_fl, node_br, node_bl; |
||||
private float wheelRadius; |
||||
private float steeringValue = 0; |
||||
private float accelerationValue = 0; |
||||
private Node carNode; |
||||
|
||||
public static void main(String[] args) { |
||||
TestFancyCar app = new TestFancyCar(); |
||||
app.start(); |
||||
} |
||||
|
||||
private void setupKeys() { |
||||
inputManager.addMapping("Lefts", new KeyTrigger(KeyInput.KEY_H)); |
||||
inputManager.addMapping("Rights", new KeyTrigger(KeyInput.KEY_K)); |
||||
inputManager.addMapping("Ups", new KeyTrigger(KeyInput.KEY_U)); |
||||
inputManager.addMapping("Downs", new KeyTrigger(KeyInput.KEY_J)); |
||||
inputManager.addMapping("Space", new KeyTrigger(KeyInput.KEY_SPACE)); |
||||
inputManager.addMapping("Reset", new KeyTrigger(KeyInput.KEY_RETURN)); |
||||
inputManager.addListener(this, "Lefts"); |
||||
inputManager.addListener(this, "Rights"); |
||||
inputManager.addListener(this, "Ups"); |
||||
inputManager.addListener(this, "Downs"); |
||||
inputManager.addListener(this, "Space"); |
||||
inputManager.addListener(this, "Reset"); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
bulletAppState = new BulletAppState(); |
||||
stateManager.attach(bulletAppState); |
||||
// bulletAppState.getPhysicsSpace().enableDebug(assetManager);
|
||||
cam.setFrustumFar(150f); |
||||
flyCam.setMoveSpeed(10); |
||||
|
||||
setupKeys(); |
||||
PhysicsTestHelper.createPhysicsTestWorld(rootNode, assetManager, bulletAppState.getPhysicsSpace()); |
||||
// setupFloor();
|
||||
buildPlayer(); |
||||
|
||||
DirectionalLight dl = new DirectionalLight(); |
||||
dl.setDirection(new Vector3f(-0.5f, -1f, -0.3f).normalizeLocal()); |
||||
rootNode.addLight(dl); |
||||
|
||||
dl = new DirectionalLight(); |
||||
dl.setDirection(new Vector3f(0.5f, -0.1f, 0.3f).normalizeLocal()); |
||||
// rootNode.addLight(dl);
|
||||
} |
||||
|
||||
private PhysicsSpace getPhysicsSpace() { |
||||
return bulletAppState.getPhysicsSpace(); |
||||
} |
||||
|
||||
// public void setupFloor() {
|
||||
// Material mat = assetManager.loadMaterial("Textures/Terrain/BrickWall/BrickWall.j3m");
|
||||
// mat.getTextureParam("DiffuseMap").getTextureValue().setWrap(WrapMode.Repeat);
|
||||
//// mat.getTextureParam("NormalMap").getTextureValue().setWrap(WrapMode.Repeat);
|
||||
//// mat.getTextureParam("ParallaxMap").getTextureValue().setWrap(WrapMode.Repeat);
|
||||
//
|
||||
// Box floor = new Box(Vector3f.ZERO, 140, 1f, 140);
|
||||
// floor.scaleTextureCoordinates(new Vector2f(112.0f, 112.0f));
|
||||
// Geometry floorGeom = new Geometry("Floor", floor);
|
||||
// floorGeom.setShadowMode(ShadowMode.Receive);
|
||||
// floorGeom.setMaterial(mat);
|
||||
//
|
||||
// PhysicsNode tb = new PhysicsNode(floorGeom, new MeshCollisionShape(floorGeom.getMesh()), 0);
|
||||
// tb.setLocalTranslation(new Vector3f(0f, -6, 0f));
|
||||
//// tb.attachDebugShape(assetManager);
|
||||
// rootNode.attachChild(tb);
|
||||
// getPhysicsSpace().add(tb);
|
||||
// }
|
||||
|
||||
private Geometry findGeom(Spatial spatial, String name) { |
||||
if (spatial instanceof Node) { |
||||
Node node = (Node) spatial; |
||||
for (int i = 0; i < node.getQuantity(); i++) { |
||||
Spatial child = node.getChild(i); |
||||
Geometry result = findGeom(child, name); |
||||
if (result != null) { |
||||
return result; |
||||
} |
||||
} |
||||
} else if (spatial instanceof Geometry) { |
||||
if (spatial.getName().startsWith(name)) { |
||||
return (Geometry) spatial; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
private void buildPlayer() { |
||||
float stiffness = 120.0f;//200=f1 car
|
||||
float compValue = 0.2f; //(lower than damp!)
|
||||
float dampValue = 0.3f; |
||||
final float mass = 400; |
||||
|
||||
//Load model and get chassis Geometry
|
||||
carNode = (Node)assetManager.loadModel("Models/Ferrari/Car.scene"); |
||||
carNode.setShadowMode(ShadowMode.Cast); |
||||
Geometry chasis = findGeom(carNode, "Car"); |
||||
BoundingBox box = (BoundingBox) chasis.getModelBound(); |
||||
|
||||
//Create a hull collision shape for the chassis
|
||||
CollisionShape carHull = CollisionShapeFactory.createDynamicMeshShape(chasis); |
||||
|
||||
//Create a vehicle control
|
||||
player = new VehicleControl(carHull, mass); |
||||
carNode.addControl(player); |
||||
|
||||
//Setting default values for wheels
|
||||
player.setSuspensionCompression(compValue * 2.0f * FastMath.sqrt(stiffness)); |
||||
player.setSuspensionDamping(dampValue * 2.0f * FastMath.sqrt(stiffness)); |
||||
player.setSuspensionStiffness(stiffness); |
||||
player.setMaxSuspensionForce(10000); |
||||
|
||||
//Create four wheels and add them at their locations
|
||||
//note that our fancy car actually goes backwards..
|
||||
Vector3f wheelDirection = new Vector3f(0, -1, 0); |
||||
Vector3f wheelAxle = new Vector3f(-1, 0, 0); |
||||
|
||||
Geometry wheel_fr = findGeom(carNode, "WheelFrontRight"); |
||||
wheel_fr.center(); |
||||
box = (BoundingBox) wheel_fr.getModelBound(); |
||||
wheelRadius = box.getYExtent(); |
||||
float back_wheel_h = (wheelRadius * 1.7f) - 1f; |
||||
float front_wheel_h = (wheelRadius * 1.9f) - 1f; |
||||
player.addWheel(wheel_fr.getParent(), box.getCenter().add(0, -front_wheel_h, 0), |
||||
wheelDirection, wheelAxle, 0.2f, wheelRadius, true); |
||||
|
||||
Geometry wheel_fl = findGeom(carNode, "WheelFrontLeft"); |
||||
wheel_fl.center(); |
||||
box = (BoundingBox) wheel_fl.getModelBound(); |
||||
player.addWheel(wheel_fl.getParent(), box.getCenter().add(0, -front_wheel_h, 0), |
||||
wheelDirection, wheelAxle, 0.2f, wheelRadius, true); |
||||
|
||||
Geometry wheel_br = findGeom(carNode, "WheelBackRight"); |
||||
wheel_br.center(); |
||||
box = (BoundingBox) wheel_br.getModelBound(); |
||||
player.addWheel(wheel_br.getParent(), box.getCenter().add(0, -back_wheel_h, 0), |
||||
wheelDirection, wheelAxle, 0.2f, wheelRadius, false); |
||||
|
||||
Geometry wheel_bl = findGeom(carNode, "WheelBackLeft"); |
||||
wheel_bl.center(); |
||||
box = (BoundingBox) wheel_bl.getModelBound(); |
||||
player.addWheel(wheel_bl.getParent(), box.getCenter().add(0, -back_wheel_h, 0), |
||||
wheelDirection, wheelAxle, 0.2f, wheelRadius, false); |
||||
|
||||
player.getWheel(2).setFrictionSlip(4); |
||||
player.getWheel(3).setFrictionSlip(4); |
||||
|
||||
rootNode.attachChild(carNode); |
||||
getPhysicsSpace().add(player); |
||||
} |
||||
|
||||
public void onAction(String binding, boolean value, float tpf) { |
||||
if (binding.equals("Lefts")) { |
||||
if (value) { |
||||
steeringValue += .5f; |
||||
} else { |
||||
steeringValue += -.5f; |
||||
} |
||||
player.steer(steeringValue); |
||||
} else if (binding.equals("Rights")) { |
||||
if (value) { |
||||
steeringValue += -.5f; |
||||
} else { |
||||
steeringValue += .5f; |
||||
} |
||||
player.steer(steeringValue); |
||||
} //note that our fancy car actually goes backwards..
|
||||
else if (binding.equals("Ups")) { |
||||
if (value) { |
||||
accelerationValue -= 800; |
||||
} else { |
||||
accelerationValue += 800; |
||||
} |
||||
player.accelerate(accelerationValue); |
||||
player.setCollisionShape(CollisionShapeFactory.createDynamicMeshShape(findGeom(carNode, "Car"))); |
||||
} else if (binding.equals("Downs")) { |
||||
if (value) { |
||||
player.brake(40f); |
||||
} else { |
||||
player.brake(0f); |
||||
} |
||||
} else if (binding.equals("Reset")) { |
||||
if (value) { |
||||
System.out.println("Reset"); |
||||
player.setPhysicsLocation(Vector3f.ZERO); |
||||
player.setPhysicsRotation(new Matrix3f()); |
||||
player.setLinearVelocity(Vector3f.ZERO); |
||||
player.setAngularVelocity(Vector3f.ZERO); |
||||
player.resetSuspension(); |
||||
} else { |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
cam.lookAt(carNode.getWorldTranslation(), Vector3f.UNIT_Y); |
||||
} |
||||
} |
@ -0,0 +1,117 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
|
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.Application; |
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.shapes.BoxCollisionShape; |
||||
import com.jme3.bullet.collision.shapes.CollisionShape; |
||||
import com.jme3.bullet.control.GhostControl; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Node; |
||||
import com.jme3.scene.shape.Box; |
||||
|
||||
/** |
||||
* |
||||
* @author tim8dev [at] gmail [dot com] |
||||
*/ |
||||
public class TestGhostObject extends SimpleApplication { |
||||
|
||||
private BulletAppState bulletAppState; |
||||
private GhostControl ghostControl; |
||||
|
||||
public static void main(String[] args) { |
||||
Application app = new TestGhostObject(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
bulletAppState = new BulletAppState(); |
||||
stateManager.attach(bulletAppState); |
||||
bulletAppState.setDebugEnabled(true); |
||||
|
||||
// Mesh to be shared across several boxes.
|
||||
Box boxGeom = new Box(1f, 1f, 1f); |
||||
// CollisionShape to be shared across several boxes.
|
||||
CollisionShape shape = new BoxCollisionShape(new Vector3f(1, 1, 1)); |
||||
|
||||
Node physicsBox = PhysicsTestHelper.createPhysicsTestNode(assetManager, shape, 1); |
||||
physicsBox.setName("box0"); |
||||
physicsBox.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(.6f, 4, .5f)); |
||||
rootNode.attachChild(physicsBox); |
||||
getPhysicsSpace().add(physicsBox); |
||||
|
||||
Node physicsBox1 = PhysicsTestHelper.createPhysicsTestNode(assetManager, shape, 1); |
||||
physicsBox1.setName("box1"); |
||||
physicsBox1.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(0, 40, 0)); |
||||
rootNode.attachChild(physicsBox1); |
||||
getPhysicsSpace().add(physicsBox1); |
||||
|
||||
Node physicsBox2 = PhysicsTestHelper.createPhysicsTestNode(assetManager, new BoxCollisionShape(new Vector3f(1, 1, 1)), 1); |
||||
physicsBox2.setName("box0"); |
||||
physicsBox2.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(.5f, 80, -.8f)); |
||||
rootNode.attachChild(physicsBox2); |
||||
getPhysicsSpace().add(physicsBox2); |
||||
|
||||
// the floor, does not move (mass=0)
|
||||
Node node = PhysicsTestHelper.createPhysicsTestNode(assetManager, new BoxCollisionShape(new Vector3f(100, 1, 100)), 0); |
||||
node.setName("floor"); |
||||
node.getControl(RigidBodyControl.class).setPhysicsLocation(new Vector3f(0f, -6, 0f)); |
||||
rootNode.attachChild(node); |
||||
getPhysicsSpace().add(node); |
||||
|
||||
initGhostObject(); |
||||
} |
||||
|
||||
private PhysicsSpace getPhysicsSpace(){ |
||||
return bulletAppState.getPhysicsSpace(); |
||||
} |
||||
|
||||
private void initGhostObject() { |
||||
Vector3f halfExtents = new Vector3f(3, 4.2f, 1); |
||||
ghostControl = new GhostControl(new BoxCollisionShape(halfExtents)); |
||||
Node node=new Node("Ghost Object"); |
||||
node.addControl(ghostControl); |
||||
rootNode.attachChild(node); |
||||
getPhysicsSpace().add(ghostControl); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
fpsText.setText("Overlapping objects: " + ghostControl.getOverlappingObjects().toString()); |
||||
} |
||||
} |
@ -0,0 +1,301 @@ |
||||
/* |
||||
* Copyright (c) 2009-2012 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bounding.BoundingBox; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.PhysicsCollisionObject; |
||||
import com.jme3.bullet.collision.shapes.BoxCollisionShape; |
||||
import com.jme3.bullet.collision.shapes.CollisionShape; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.bullet.util.CollisionShapeFactory; |
||||
import com.jme3.font.BitmapText; |
||||
import com.jme3.input.ChaseCamera; |
||||
import com.jme3.input.KeyInput; |
||||
import com.jme3.input.controls.ActionListener; |
||||
import com.jme3.input.controls.AnalogListener; |
||||
import com.jme3.input.controls.KeyTrigger; |
||||
import com.jme3.light.DirectionalLight; |
||||
import com.jme3.light.PointLight; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.*; |
||||
import com.jme3.renderer.Camera; |
||||
import com.jme3.renderer.queue.RenderQueue.ShadowMode; |
||||
import com.jme3.scene.Geometry; |
||||
import com.jme3.scene.Spatial; |
||||
import com.jme3.shadow.DirectionalLightShadowRenderer; |
||||
import com.jme3.shadow.EdgeFilteringMode; |
||||
import com.jme3.system.AppSettings; |
||||
import com.jme3.terrain.geomipmap.TerrainLodControl; |
||||
import com.jme3.terrain.geomipmap.TerrainQuad; |
||||
import com.jme3.terrain.heightmap.AbstractHeightMap; |
||||
import com.jme3.terrain.heightmap.ImageBasedHeightMap; |
||||
import com.jme3.texture.Texture; |
||||
import com.jme3.texture.Texture.WrapMode; |
||||
import com.jme3.util.SkyFactory; |
||||
import com.jme3.util.SkyFactory.EnvMapType; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
public class TestHoveringTank extends SimpleApplication implements AnalogListener, |
||||
ActionListener { |
||||
|
||||
private BulletAppState bulletAppState; |
||||
private PhysicsHoverControl hoverControl; |
||||
private Spatial spaceCraft; |
||||
TerrainQuad terrain; |
||||
Material matRock; |
||||
boolean wireframe = false; |
||||
protected BitmapText hintText; |
||||
PointLight pl; |
||||
Geometry lightMdl; |
||||
Geometry collisionMarker; |
||||
|
||||
public static void main(String[] args) { |
||||
TestHoveringTank app = new TestHoveringTank(); |
||||
app.start(); |
||||
} |
||||
|
||||
private PhysicsSpace getPhysicsSpace() { |
||||
return bulletAppState.getPhysicsSpace(); |
||||
} |
||||
|
||||
private void setupKeys() { |
||||
inputManager.addMapping("Lefts", new KeyTrigger(KeyInput.KEY_A)); |
||||
inputManager.addMapping("Rights", new KeyTrigger(KeyInput.KEY_D)); |
||||
inputManager.addMapping("Ups", new KeyTrigger(KeyInput.KEY_W)); |
||||
inputManager.addMapping("Downs", new KeyTrigger(KeyInput.KEY_S)); |
||||
inputManager.addMapping("Space", new KeyTrigger(KeyInput.KEY_SPACE)); |
||||
inputManager.addMapping("Reset", new KeyTrigger(KeyInput.KEY_RETURN)); |
||||
inputManager.addListener(this, "Lefts"); |
||||
inputManager.addListener(this, "Rights"); |
||||
inputManager.addListener(this, "Ups"); |
||||
inputManager.addListener(this, "Downs"); |
||||
inputManager.addListener(this, "Space"); |
||||
inputManager.addListener(this, "Reset"); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
bulletAppState = new BulletAppState(); |
||||
bulletAppState.setThreadingType(BulletAppState.ThreadingType.PARALLEL); |
||||
stateManager.attach(bulletAppState); |
||||
// bulletAppState.getPhysicsSpace().enableDebug(assetManager);
|
||||
bulletAppState.getPhysicsSpace().setAccuracy(1f/30f); |
||||
rootNode.attachChild(SkyFactory.createSky(assetManager, |
||||
"Textures/Sky/Bright/BrightSky.dds", EnvMapType.CubeMap)); |
||||
|
||||
DirectionalLightShadowRenderer dlsr |
||||
= new DirectionalLightShadowRenderer(assetManager, 2048, 3); |
||||
dlsr.setLambda(0.55f); |
||||
dlsr.setShadowIntensity(0.6f); |
||||
dlsr.setEdgeFilteringMode(EdgeFilteringMode.Bilinear); |
||||
viewPort.addProcessor(dlsr); |
||||
|
||||
setupKeys(); |
||||
createTerrain(); |
||||
buildPlayer(); |
||||
|
||||
DirectionalLight dl = new DirectionalLight(); |
||||
dlsr.setLight(dl); |
||||
dl.setColor(new ColorRGBA(1.0f, 0.94f, 0.8f, 1f).multLocal(1.3f)); |
||||
dl.setDirection(new Vector3f(-0.5f, -0.3f, -0.3f).normalizeLocal()); |
||||
rootNode.addLight(dl); |
||||
|
||||
Vector3f lightDir2 = new Vector3f(0.70518064f, 0.5902297f, -0.39287305f); |
||||
DirectionalLight dl2 = new DirectionalLight(); |
||||
dl2.setColor(new ColorRGBA(0.7f, 0.85f, 1.0f, 1f)); |
||||
dl2.setDirection(lightDir2); |
||||
rootNode.addLight(dl2); |
||||
} |
||||
|
||||
private void buildPlayer() { |
||||
spaceCraft = assetManager.loadModel("Models/HoverTank/Tank2.mesh.xml"); |
||||
CollisionShape colShape = CollisionShapeFactory.createDynamicMeshShape(spaceCraft); |
||||
spaceCraft.setShadowMode(ShadowMode.CastAndReceive); |
||||
spaceCraft.setLocalTranslation(new Vector3f(-140, 50, -23)); |
||||
spaceCraft.setLocalRotation(new Quaternion(new float[]{0, 0.01f, 0})); |
||||
|
||||
hoverControl = new PhysicsHoverControl(colShape, 500); |
||||
|
||||
spaceCraft.addControl(hoverControl); |
||||
|
||||
|
||||
rootNode.attachChild(spaceCraft); |
||||
getPhysicsSpace().add(hoverControl); |
||||
hoverControl.setCollisionGroup(PhysicsCollisionObject.COLLISION_GROUP_02); |
||||
|
||||
ChaseCamera chaseCam = new ChaseCamera(cam, inputManager); |
||||
spaceCraft.addControl(chaseCam); |
||||
|
||||
flyCam.setEnabled(false); |
||||
} |
||||
|
||||
public void makeMissile() { |
||||
Vector3f pos = spaceCraft.getWorldTranslation().clone(); |
||||
Quaternion rot = spaceCraft.getWorldRotation(); |
||||
Vector3f dir = rot.getRotationColumn(2); |
||||
|
||||
Spatial missile = assetManager.loadModel("Models/SpaceCraft/Rocket.mesh.xml"); |
||||
missile.scale(0.5f); |
||||
missile.rotate(0, FastMath.PI, 0); |
||||
missile.updateGeometricState(); |
||||
|
||||
BoundingBox box = (BoundingBox) missile.getWorldBound(); |
||||
final Vector3f extent = box.getExtent(null); |
||||
|
||||
BoxCollisionShape boxShape = new BoxCollisionShape(extent); |
||||
|
||||
missile.setName("Missile"); |
||||
missile.rotate(rot); |
||||
missile.setLocalTranslation(pos.addLocal(0, extent.y * 4.5f, 0)); |
||||
missile.setLocalRotation(hoverControl.getPhysicsRotation()); |
||||
missile.setShadowMode(ShadowMode.Cast); |
||||
RigidBodyControl control = new BombControl(assetManager, boxShape, 20); |
||||
control.setLinearVelocity(dir.mult(100)); |
||||
control.setCollisionGroup(PhysicsCollisionObject.COLLISION_GROUP_03); |
||||
missile.addControl(control); |
||||
|
||||
|
||||
rootNode.attachChild(missile); |
||||
getPhysicsSpace().add(missile); |
||||
} |
||||
|
||||
public void onAnalog(String binding, float value, float tpf) { |
||||
} |
||||
|
||||
public void onAction(String binding, boolean value, float tpf) { |
||||
if (binding.equals("Lefts")) { |
||||
hoverControl.steer(value ? 50f : 0); |
||||
} else if (binding.equals("Rights")) { |
||||
hoverControl.steer(value ? -50f : 0); |
||||
} else if (binding.equals("Ups")) { |
||||
hoverControl.accelerate(value ? 100f : 0); |
||||
} else if (binding.equals("Downs")) { |
||||
hoverControl.accelerate(value ? -100f : 0); |
||||
} else if (binding.equals("Reset")) { |
||||
if (value) { |
||||
System.out.println("Reset"); |
||||
hoverControl.setPhysicsLocation(new Vector3f(-140, 14, -23)); |
||||
hoverControl.setPhysicsRotation(new Matrix3f()); |
||||
hoverControl.clearForces(); |
||||
} else { |
||||
} |
||||
} else if (binding.equals("Space") && value) { |
||||
makeMissile(); |
||||
} |
||||
} |
||||
|
||||
public void updateCamera() { |
||||
rootNode.updateGeometricState(); |
||||
|
||||
Vector3f pos = spaceCraft.getWorldTranslation().clone(); |
||||
Quaternion rot = spaceCraft.getWorldRotation(); |
||||
Vector3f dir = rot.getRotationColumn(2); |
||||
|
||||
// make it XZ only
|
||||
Vector3f camPos = new Vector3f(dir); |
||||
camPos.setY(0); |
||||
camPos.normalizeLocal(); |
||||
|
||||
// negate and multiply by distance from object
|
||||
camPos.negateLocal(); |
||||
camPos.multLocal(15); |
||||
|
||||
// add Y distance
|
||||
camPos.setY(2); |
||||
camPos.addLocal(pos); |
||||
cam.setLocation(camPos); |
||||
|
||||
Vector3f lookAt = new Vector3f(dir); |
||||
lookAt.multLocal(7); // look at dist
|
||||
lookAt.addLocal(pos); |
||||
cam.lookAt(lookAt, Vector3f.UNIT_Y); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
} |
||||
|
||||
private void createTerrain() { |
||||
matRock = new Material(assetManager, "Common/MatDefs/Terrain/TerrainLighting.j3md"); |
||||
matRock.setBoolean("useTriPlanarMapping", false); |
||||
matRock.setBoolean("WardIso", true); |
||||
matRock.setTexture("AlphaMap", assetManager.loadTexture("Textures/Terrain/splat/alphamap.png")); |
||||
Texture heightMapImage = assetManager.loadTexture("Textures/Terrain/splat/mountains512.png"); |
||||
Texture grass = assetManager.loadTexture("Textures/Terrain/splat/grass.jpg"); |
||||
grass.setWrap(WrapMode.Repeat); |
||||
matRock.setTexture("DiffuseMap", grass); |
||||
matRock.setFloat("DiffuseMap_0_scale", 64); |
||||
Texture dirt = assetManager.loadTexture("Textures/Terrain/splat/dirt.jpg"); |
||||
dirt.setWrap(WrapMode.Repeat); |
||||
matRock.setTexture("DiffuseMap_1", dirt); |
||||
matRock.setFloat("DiffuseMap_1_scale", 16); |
||||
Texture rock = assetManager.loadTexture("Textures/Terrain/splat/road.jpg"); |
||||
rock.setWrap(WrapMode.Repeat); |
||||
matRock.setTexture("DiffuseMap_2", rock); |
||||
matRock.setFloat("DiffuseMap_2_scale", 128); |
||||
Texture normalMap0 = assetManager.loadTexture("Textures/Terrain/splat/grass_normal.jpg"); |
||||
normalMap0.setWrap(WrapMode.Repeat); |
||||
Texture normalMap1 = assetManager.loadTexture("Textures/Terrain/splat/dirt_normal.png"); |
||||
normalMap1.setWrap(WrapMode.Repeat); |
||||
Texture normalMap2 = assetManager.loadTexture("Textures/Terrain/splat/road_normal.png"); |
||||
normalMap2.setWrap(WrapMode.Repeat); |
||||
matRock.setTexture("NormalMap", normalMap0); |
||||
matRock.setTexture("NormalMap_1", normalMap2); |
||||
matRock.setTexture("NormalMap_2", normalMap2); |
||||
|
||||
AbstractHeightMap heightmap = null; |
||||
try { |
||||
heightmap = new ImageBasedHeightMap(heightMapImage.getImage(), 0.25f); |
||||
heightmap.load(); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} |
||||
terrain = new TerrainQuad("terrain", 65, 513, heightmap.getHeightMap()); |
||||
List<Camera> cameras = new ArrayList<Camera>(); |
||||
cameras.add(getCamera()); |
||||
TerrainLodControl control = new TerrainLodControl(terrain, cameras); |
||||
terrain.addControl(control); |
||||
terrain.setMaterial(matRock); |
||||
terrain.setLocalScale(new Vector3f(2, 2, 2)); |
||||
terrain.setLocked(false); // unlock it so we can edit the height
|
||||
|
||||
terrain.setShadowMode(ShadowMode.CastAndReceive); |
||||
terrain.addControl(new RigidBodyControl(0)); |
||||
rootNode.attachChild(terrain); |
||||
getPhysicsSpace().addAll(terrain); |
||||
|
||||
} |
||||
} |
@ -0,0 +1,93 @@ |
||||
/* |
||||
* Copyright (c) 2009-2010 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.animation.AnimEventListener; |
||||
import com.jme3.animation.Bone; |
||||
import com.jme3.bullet.collision.RagdollCollisionListener; |
||||
import com.jme3.bullet.control.KinematicRagdollControl; |
||||
import com.jme3.input.KeyInput; |
||||
import com.jme3.input.controls.ActionListener; |
||||
import com.jme3.input.controls.KeyTrigger; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Node; |
||||
|
||||
/** |
||||
* @author reden |
||||
*/ |
||||
public class TestIK extends TestBoneRagdoll implements RagdollCollisionListener, AnimEventListener { |
||||
|
||||
Node targetNode = new Node(""); |
||||
Vector3f targetPoint; |
||||
Bone mouseBone; |
||||
Vector3f oldMousePos; |
||||
|
||||
public static void main(String[] args) { |
||||
TestIK app = new TestIK(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
super.simpleInitApp(); |
||||
final KinematicRagdollControl ikControl = model.getControl(KinematicRagdollControl.class); |
||||
inputManager.addListener(new ActionListener() { |
||||
|
||||
public void onAction(String name, boolean isPressed, float tpf) { |
||||
|
||||
if (name.equals("stop") && isPressed) { |
||||
ikControl.setEnabled(!ikControl.isEnabled()); |
||||
ikControl.setIKMode(); |
||||
} |
||||
|
||||
if (name.equals("one") && isPressed) { |
||||
//ragdoll.setKinematicMode();
|
||||
targetPoint = model.getWorldTranslation().add(new Vector3f(0,2,4)); |
||||
targetNode.setLocalTranslation(targetPoint); |
||||
ikControl.setIKTarget(ikControl.getBone("Hand.L"), targetPoint, 2); |
||||
ikControl.setIKMode(); |
||||
} |
||||
if (name.equals("two") && isPressed) { |
||||
//ragdoll.setKinematicMode();
|
||||
targetPoint = model.getWorldTranslation().add(new Vector3f(-3,3,0)); |
||||
targetNode.setLocalTranslation(targetPoint); |
||||
ikControl.setIKTarget(ikControl.getBone("Hand.R"), targetPoint, 3); |
||||
ikControl.setIKMode(); |
||||
} |
||||
} |
||||
}, "one", "two"); |
||||
inputManager.addMapping("one", new KeyTrigger(KeyInput.KEY_1)); |
||||
inputManager.addMapping("two", new KeyTrigger(KeyInput.KEY_2)); |
||||
inputManager.addMapping("stop", new KeyTrigger(KeyInput.KEY_H)); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,148 @@ |
||||
/* |
||||
* Copyright (c) 2018 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
/** |
||||
* Test case for JME issue #877: multiple hinges. Based on code submitted by |
||||
* Daniel Martensson. |
||||
* |
||||
* If successful, all pendulums will swing at the same frequency, and all the |
||||
* free-falling objects will fall straight down. |
||||
*/ |
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.collision.shapes.BoxCollisionShape; |
||||
import com.jme3.bullet.collision.shapes.CollisionShape; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.bullet.joints.HingeJoint; |
||||
import com.jme3.math.Quaternion; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.scene.Node; |
||||
|
||||
public class TestIssue877 extends SimpleApplication { |
||||
|
||||
BulletAppState bulletAppState = new BulletAppState(); |
||||
int numPendulums = 6; |
||||
int numFalling = 6; |
||||
Node pivots[] = new Node[numPendulums]; |
||||
Node bobs[] = new Node[numPendulums]; |
||||
Node falling[] = new Node[numFalling]; |
||||
float timeToNextPrint = 1f; // in seconds
|
||||
|
||||
public static void main(String[] args) { |
||||
TestIssue877 app = new TestIssue877(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
flyCam.setEnabled(false); |
||||
cam.setLocation(new Vector3f(-4.77f, -7.55f, 16.52f)); |
||||
cam.setRotation(new Quaternion(-0.103433f, 0.889420f, 0.368792f, 0.249449f)); |
||||
|
||||
stateManager.attach(bulletAppState); |
||||
bulletAppState.setDebugEnabled(true); |
||||
|
||||
float pivotY = 14.6214f; |
||||
float bobStartY = 3f; |
||||
float length = pivotY - bobStartY; |
||||
for (int i = 0; i < numPendulums; i++) { |
||||
float x = 6f - 2.5f * i; |
||||
Vector3f pivotLocation = new Vector3f(x, pivotY, 0f); |
||||
pivots[i] = createTestNode(0f, pivotLocation); |
||||
|
||||
Vector3f bobLocation = new Vector3f(x, bobStartY, 0f); |
||||
bobs[i] = createTestNode(1f, bobLocation); |
||||
} |
||||
|
||||
for (int i = 0; i < numFalling; i++) { |
||||
float x = -6f - 2.5f * (i + numPendulums); |
||||
Vector3f createLocation = new Vector3f(x, bobStartY, 0f); |
||||
falling[i] = createTestNode(1f, createLocation); |
||||
} |
||||
|
||||
for (int i = 0; i < numPendulums; i++) { |
||||
HingeJoint joint = new HingeJoint( |
||||
pivots[i].getControl(RigidBodyControl.class), |
||||
bobs[i].getControl(RigidBodyControl.class), |
||||
new Vector3f(0f, 0f, 0f), |
||||
new Vector3f(length, 0f, 0f), |
||||
Vector3f.UNIT_Z.clone(), |
||||
Vector3f.UNIT_Z.clone()); |
||||
bulletAppState.getPhysicsSpace().add(joint); |
||||
} |
||||
} |
||||
|
||||
Node createTestNode(float mass, Vector3f location) { |
||||
float size = 0.1f; |
||||
Vector3f halfExtents = new Vector3f(size, size, size); |
||||
CollisionShape shape = new BoxCollisionShape(halfExtents); |
||||
RigidBodyControl control = new RigidBodyControl(shape, mass); |
||||
Node node = new Node(); |
||||
node.addControl(control); |
||||
rootNode.attachChild(node); |
||||
bulletAppState.getPhysicsSpace().add(node); |
||||
control.setPhysicsLocation(location); |
||||
|
||||
return node; |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
if (timeToNextPrint > 0f) { |
||||
timeToNextPrint -= tpf; |
||||
return; |
||||
} |
||||
|
||||
if (numFalling > 0) { |
||||
Vector3f fallingLocation = falling[0].getWorldTranslation(); |
||||
System.out.printf(" falling[0] location(x=%f, z=%f)", |
||||
fallingLocation.x, fallingLocation.z); |
||||
/* |
||||
* If an object is falling vertically, its X- and Z-coordinates |
||||
* should not change. |
||||
*/ |
||||
} |
||||
if (numPendulums > 0) { |
||||
Vector3f bobLocation = bobs[0].getWorldTranslation(); |
||||
Vector3f pivotLocation = pivots[0].getWorldTranslation(); |
||||
float distance = bobLocation.distance(pivotLocation); |
||||
System.out.printf(" bob[0] distance=%f", distance); |
||||
/* |
||||
* If the hinge is working properly, the distance from the |
||||
* pivot to the bob should remain roughly constant. |
||||
*/ |
||||
} |
||||
System.out.println(); |
||||
timeToNextPrint = 1f; |
||||
} |
||||
} |
@ -0,0 +1,87 @@ |
||||
/* |
||||
* Copyright (c) 2018 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
/** |
||||
* Test case for JME issue #883: extra physicsTicks in ThreadingType.PARALLEL. |
||||
* |
||||
* If successful, physics time and frame time will advance at the same rate. |
||||
*/ |
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
|
||||
public class TestIssue883 extends SimpleApplication { |
||||
|
||||
boolean firstPrint = true; |
||||
float timeToNextPrint = 1f; // in seconds
|
||||
double frameTime; // in seconds
|
||||
double physicsTime; // in seconds
|
||||
|
||||
public static void main(String[] args) { |
||||
TestIssue883 app = new TestIssue883(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
|
||||
BulletAppState bulletAppState = new BulletAppState() { |
||||
@Override |
||||
public void physicsTick(PhysicsSpace space, float timeStep) { |
||||
physicsTime += timeStep; |
||||
} |
||||
}; |
||||
bulletAppState.setThreadingType(BulletAppState.ThreadingType.PARALLEL); |
||||
stateManager.attach(bulletAppState); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
frameTime += tpf; |
||||
|
||||
if (timeToNextPrint > 0f) { |
||||
timeToNextPrint -= tpf; |
||||
return; |
||||
} |
||||
|
||||
if (firstPrint) { // synchronize
|
||||
frameTime = 0.; |
||||
physicsTime = 0.; |
||||
firstPrint = false; |
||||
} |
||||
|
||||
System.out.printf(" frameTime= %s physicsTime= %s%n", |
||||
frameTime, physicsTime); |
||||
timeToNextPrint = 1f; |
||||
} |
||||
} |
@ -0,0 +1,87 @@ |
||||
/* |
||||
* Copyright (c) 2018 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
/** |
||||
* Test case for JME issue #889: disabled physics control gets added to a |
||||
* physics space. |
||||
* <p> |
||||
* If successful, no debug meshes will be visible. |
||||
*/ |
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.PhysicsSpace; |
||||
import com.jme3.bullet.collision.shapes.BoxCollisionShape; |
||||
import com.jme3.bullet.collision.shapes.CollisionShape; |
||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
||||
import com.jme3.bullet.control.BetterCharacterControl; |
||||
import com.jme3.bullet.control.GhostControl; |
||||
import com.jme3.bullet.control.RigidBodyControl; |
||||
import com.jme3.math.Vector3f; |
||||
|
||||
public class TestIssue889 extends SimpleApplication { |
||||
|
||||
public static void main(String[] args) { |
||||
TestIssue889 app = new TestIssue889(); |
||||
app.start(); |
||||
} |
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
flyCam.setEnabled(false); |
||||
|
||||
BulletAppState bulletAppState = new BulletAppState(); |
||||
bulletAppState.setDebugEnabled(true); |
||||
bulletAppState.setSpeed(0f); |
||||
stateManager.attach(bulletAppState); |
||||
PhysicsSpace space = bulletAppState.getPhysicsSpace(); |
||||
|
||||
float radius = 1f; |
||||
CollisionShape sphere = new SphereCollisionShape(radius); |
||||
CollisionShape box = new BoxCollisionShape(Vector3f.UNIT_XYZ); |
||||
|
||||
RigidBodyControl rbc = new RigidBodyControl(box); |
||||
rbc.setEnabled(false); |
||||
rbc.setPhysicsSpace(space); |
||||
rootNode.addControl(rbc); |
||||
|
||||
BetterCharacterControl bcc = new BetterCharacterControl(radius, 4f, 1f); |
||||
bcc.setEnabled(false); |
||||
bcc.setPhysicsSpace(space); |
||||
rootNode.addControl(bcc); |
||||
|
||||
GhostControl gc = new GhostControl(sphere); |
||||
gc.setEnabled(false); |
||||
gc.setPhysicsSpace(space); |
||||
rootNode.addControl(gc); |
||||
} |
||||
} |
@ -0,0 +1,81 @@ |
||||
/* |
||||
* Copyright (c) 2018 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bullet.collision.shapes.CollisionShape; |
||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
||||
import com.jme3.bullet.joints.Point2PointJoint; |
||||
import com.jme3.bullet.objects.PhysicsRigidBody; |
||||
import com.jme3.math.Vector3f; |
||||
|
||||
/** |
||||
* Test case for JME issue #918: Point2PointJoint.getImpulseClamp() and |
||||
* .getTau() return the damping value instead. The bug existed in Native Bullet |
||||
* only. |
||||
* <p> |
||||
* If successful, no UnsatisfiedLinkError exception will be thrown. |
||||
*/ |
||||
public class TestIssue918 extends SimpleApplication { |
||||
// *************************************************************************
|
||||
// new methods exposed
|
||||
|
||||
public static void main(String[] args) { |
||||
TestIssue918 app = new TestIssue918(); |
||||
app.start(); |
||||
} |
||||
// *************************************************************************
|
||||
// SimpleApplication methods
|
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
CollisionShape capsule = new SphereCollisionShape(1f); |
||||
PhysicsRigidBody body1 = new PhysicsRigidBody(capsule, 1f); |
||||
PhysicsRigidBody body2 = new PhysicsRigidBody(capsule, 1f); |
||||
Vector3f pivot1 = new Vector3f(); |
||||
Vector3f pivot2 = new Vector3f(); |
||||
Point2PointJoint joint |
||||
= new Point2PointJoint(body1, body2, pivot1, pivot2); |
||||
|
||||
joint.setImpulseClamp(42f); |
||||
joint.setTau(99f); |
||||
|
||||
if (joint.getImpulseClamp() != 42f) { |
||||
throw new RuntimeException(); |
||||
} |
||||
if (joint.getTau() != 99f) { |
||||
throw new RuntimeException(); |
||||
} |
||||
|
||||
stop(); |
||||
} |
||||
} |
@ -0,0 +1,72 @@ |
||||
/* |
||||
* Copyright (c) 2018 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bullet.collision.shapes.CollisionShape; |
||||
import com.jme3.bullet.collision.shapes.SphereCollisionShape; |
||||
import com.jme3.bullet.joints.SixDofJoint; |
||||
import com.jme3.bullet.objects.PhysicsRigidBody; |
||||
import com.jme3.math.Vector3f; |
||||
|
||||
/** |
||||
* Test case for JME issue #919: native implementation of |
||||
* TranslationalLimitMotor.getLimitSoftness() has wrong name. The bug existed in |
||||
* Native Bullet only. |
||||
* <p> |
||||
* If successful, no UnsatisfiedLinkError exception will be thrown. |
||||
*/ |
||||
public class TestIssue919 extends SimpleApplication { |
||||
// *************************************************************************
|
||||
// new methods exposed
|
||||
|
||||
public static void main(String[] args) { |
||||
TestIssue919 app = new TestIssue919(); |
||||
app.start(); |
||||
} |
||||
// *************************************************************************
|
||||
// SimpleApplication methods
|
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
CollisionShape capsule = new SphereCollisionShape(1f); |
||||
PhysicsRigidBody body1 = new PhysicsRigidBody(capsule, 1f); |
||||
PhysicsRigidBody body2 = new PhysicsRigidBody(capsule, 1f); |
||||
Vector3f pivot1 = new Vector3f(); |
||||
Vector3f pivot2 = new Vector3f(); |
||||
SixDofJoint joint = new SixDofJoint(body1, body2, pivot1, pivot2, true); |
||||
|
||||
joint.getTranslationalLimitMotor().getLimitSoftness(); |
||||
|
||||
stop(); |
||||
} |
||||
} |
@ -0,0 +1,80 @@ |
||||
/* |
||||
* Copyright (c) 2018 jMonkeyEngine |
||||
* All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions are |
||||
* met: |
||||
* |
||||
* * Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* |
||||
* * Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in the |
||||
* documentation and/or other materials provided with the distribution. |
||||
* |
||||
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors |
||||
* may be used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
*/ |
||||
package jme3test.bullet; |
||||
|
||||
import com.jme3.app.SimpleApplication; |
||||
import com.jme3.bullet.BulletAppState; |
||||
import com.jme3.bullet.BulletAppState.ThreadingType; |
||||
|
||||
/** |
||||
* Test case for JME issue #928: crash after 64 attached and detached |
||||
* BulletAppStates with parallel threading. The bug existed in Native Bullet |
||||
* only. |
||||
* <p> |
||||
* If successful, no crash will occur. |
||||
*/ |
||||
public class TestIssue928 extends SimpleApplication { |
||||
// *************************************************************************
|
||||
// new methods exposed
|
||||
|
||||
public static void main(String[] args) { |
||||
TestIssue928 app = new TestIssue928(); |
||||
app.start(); |
||||
} |
||||
|
||||
int count = 0; |
||||
int frame = 0; |
||||
BulletAppState bulletAppState; |
||||
// *************************************************************************
|
||||
// SimpleApplication methods
|
||||
|
||||
@Override |
||||
public void simpleInitApp() { |
||||
} |
||||
|
||||
@Override |
||||
public void simpleUpdate(float tpf) { |
||||
if (frame % 4 == 0) { |
||||
System.out.println(++count); |
||||
bulletAppState = new BulletAppState(); |
||||
bulletAppState.setThreadingType(ThreadingType.PARALLEL); |
||||
stateManager.attach(bulletAppState); |
||||
} else if (frame % 4 == 2) { |
||||
stateManager.detach(bulletAppState); |
||||
} |
||||
|
||||
frame++; |
||||
if (count == 70) { |
||||
System.exit(0); |
||||
} |
||||
} |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue