diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index ffc9f62b1..043f9d937 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -6,25 +6,37 @@ name: Nightly NBM Deployment on: push: branches: [ master ] + pull_request: + jobs: - build: + BuildSDK: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Set up JDK 17 - uses: actions/setup-java@v1 + - uses: actions/checkout@v3 + - name: Set up JDK 21 + uses: actions/setup-java@v3 with: - java-version: 17 + java-version: 21 + distribution: 'temurin' + + - name: Validate the Gradle wrapper + uses: gradle/wrapper-validation-action@v2 - name: Grant execute permission for gradle run: chmod +x gradlew - name: Build the SDK run: ./gradlew buildSdk + + NBMDeployment: + needs: [BuildSDK] + runs-on: ubuntu-latest + if: github.event_name == 'push' + steps: - name: Checkout the nightly-trigger repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: repository: 'jMonkeyEngine/sdk-update-center' ref: nightly diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 550006e4c..83d222d5a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,11 +9,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: distribution: temurin - java-version: 17 + java-version: 21 - name: Grant execute permission for gradle run: chmod +x gradlew - name: Build the SDK @@ -26,7 +26,7 @@ jobs: - name: Build Installers run: ant -Dstorepass="$NBM_SIGN_PASS" -Dpack200.enabled=false set-spec-version build-installers unset-spec-version env: - BUILD_X86: true + BUILD_X86: false BUILD_X64: true BUILD_OTHER: true - name: Fix Platform Independent Build diff --git a/BasicGameTemplate/nbproject/project.properties b/BasicGameTemplate/nbproject/project.properties index c718e5de9..f3c44b70d 100644 --- a/BasicGameTemplate/nbproject/project.properties +++ b/BasicGameTemplate/nbproject/project.properties @@ -43,14 +43,16 @@ javac.classpath=\ ${libs.jme3-effects.classpath}:\ ${libs.jme3-terrain.classpath}:\ ${libs.jme3-jbullet.classpath}:\ - ${libs.jme3-awt-dialogs.classpath} + ${libs.jme3-awt-dialogs.classpath}:\ + ${libs.jme3-plugins-json.classpath}:\ + ${libs.jme3-plugins-json-gson.classpath} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false javac.processorpath=\ ${javac.classpath} -javac.source=17 -javac.target=17 +javac.source=21 +javac.target=21 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir} diff --git a/JME3TestsTemplate/nbproject/project.properties b/JME3TestsTemplate/nbproject/project.properties index 3ba596308..9c88d6ff3 100644 --- a/JME3TestsTemplate/nbproject/project.properties +++ b/JME3TestsTemplate/nbproject/project.properties @@ -26,7 +26,8 @@ includes=** jar.compress=false javac.classpath=\ ${libs.jme3-jogg.classpath}:\ - ${libs.jme3-blender.classpath}:\ + ${libs.jme3-plugins-json.classpath}:\ + ${libs.jme3-plugins-json-gson.classpath}:\ ${libs.jme3-networking.classpath}:\ ${libs.jme3-plugins.classpath}:\ ${libs.jme3-core.classpath}:\ @@ -41,8 +42,8 @@ javac.classpath=\ # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false -javac.source=17 -javac.target=17 +javac.source=21 +javac.target=21 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir} diff --git a/ant-jme/src/com/jme/ant/LoadWikiImages.java b/ant-jme/src/com/jme/ant/LoadWikiImages.java index 12f824bbc..5691c4d43 100644 --- a/ant-jme/src/com/jme/ant/LoadWikiImages.java +++ b/ant-jme/src/com/jme/ant/LoadWikiImages.java @@ -9,6 +9,7 @@ import java.io.FileOutputStream; import java.io.FileReader; import java.io.InputStream; +import java.net.URI; import java.net.URL; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; @@ -48,7 +49,7 @@ public void execute() throws BuildException { name = name.substring(0, markIdx); } name = name.replaceAll(":", "/"); - URL url = new URL(host + link); + URL url = URI.create(host + link).toURL(); InputStream in = null; FileOutputStream out = null; try { @@ -83,7 +84,7 @@ public void execute() throws BuildException { } //make external folder and clean filename name = "external/" + name.replaceAll("[_[^\\w\\däüöÄÜÖ\\/\\+\\-\\. ]]", "_"); - URL url = new URL(host + link); + URL url = URI.create((host + link)).toURL(); InputStream in = url.openStream(); File file = new File(getLocation().getFileName().replaceAll("build.xml", "") + File.separator + targetFolder + File.separator + name.replaceAll("/", File.separator)); log("Getting external image: " + host + link); diff --git a/branding/core/core.jar/org/netbeans/core/startup/about.png b/branding/core/core.jar/org/netbeans/core/startup/about.png index f261c86ff..2ea64d99b 100644 Binary files a/branding/core/core.jar/org/netbeans/core/startup/about.png and b/branding/core/core.jar/org/netbeans/core/startup/about.png differ diff --git a/branding/core/core.jar/org/netbeans/core/startup/splash.gif b/branding/core/core.jar/org/netbeans/core/startup/splash.gif index 5febf2180..18f1772a4 100644 Binary files a/branding/core/core.jar/org/netbeans/core/startup/splash.gif and b/branding/core/core.jar/org/netbeans/core/startup/splash.gif differ diff --git a/branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties b/branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties index cd29774b6..7003bebeb 100644 --- a/branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties +++ b/branding/modules/org-netbeans-core.jar/org/netbeans/core/ui/Bundle.properties @@ -1,3 +1,3 @@ -LBL_Copyright=
Copyright © 2023 jMonkeyEngine.\n
Please visit http://jmonkeyengine.org for more information.
Icons sets :
Copyright © 2025 jMonkeyEngine.\n
Please visit http://jmonkeyengine.org for more information.
Icons sets :
Updates: jMonkeyEngine SDK is updated to version {0}
\n URL_ON_IMG=http://jmonkeyengine.org/ diff --git a/build.gradle b/build.gradle index c86156d0c..32c0b0154 100644 --- a/build.gradle +++ b/build.gradle @@ -33,18 +33,18 @@ configurations.examplelibs { } dependencies { - - corelibs dep("com.github.xbuf:jme3_xbuf:0.9.1", false, false) corelibs dep("com.badlogicgames.gdx:gdx-ai:1.8.2", true, true) corelibs dep("javax.help:javahelp:2.0.05", false, false) corelibs dep("org.jmonkeyengine:jme3-core:$jmeVersion-$jmeVersionTag", true, true) corelibs dep("org.jmonkeyengine:jme3-desktop:$jmeVersion-$jmeVersionTag", true, true) - corelibs dep("org.jmonkeyengine:jme3-awt-dialogs:$jmeVersion-$jmeVersionTag", true, true) + corelibs dep("org.jmonkeyengine:jme3-awt-dialogs:$jmeVersion-$jmeVersionTag", true, true) + corelibs dep("org.jmonkeyengine:jme3-plugins-json:$jmeVersion-$jmeVersionTag", true, true) + corelibs dep("org.jmonkeyengine:jme3-plugins-json-gson:$jmeVersion-$jmeVersionTag", true, true) corelibs dep("org.jmonkeyengine:jme3-lwjgl:$jmeVersion-$jmeVersionTag", true, true) corelibs dep("org.jmonkeyengine:jme3-effects:$jmeVersion-$jmeVersionTag", true, true) - corelibs dep("org.jmonkeyengine:jme3-blender:3.3.2-stable", false, false) // Pin Pointed until jme3-blender has a dedicated release or support is phased out. - optlibs dep("com.github.stephengold:Minie:7.1.0", false, false) // replacement for bullet-native + corelibs dep("com.github.stephengold:Minie:8.2.0", true, true) // replacement for bullet-native + corelibs dep("com.github.stephengold:Heart:9.1.0", true, true) // requirement for Minie corelibs dep(fileTree("lib"), false, false) corelibs dep("org.jmonkeyengine:jme3-jogg:$jmeVersion-$jmeVersionTag", true, true) @@ -53,13 +53,18 @@ dependencies { corelibs dep("org.jmonkeyengine:jme3-plugins:$jmeVersion-$jmeVersionTag", true, true) corelibs dep("org.jmonkeyengine:jme3-terrain:$jmeVersion-$jmeVersionTag", true, true) + optlibs dep("com.simsilica:lemur:1.16.0", true, true) + optlibs dep("com.simsilica:lemur-props:1.2.0", true, true) + optlibs dep("com.simsilica:sio2:1.8.0", true, true) + optlibs dep("com.simsilica:sim-math:1.6.0", true, true) + optlibs dep("com.simsilica:zay-es:1.5.0", true, true) + optlibs dep("org.jmonkeyengine:jme3-jbullet:$jmeVersion-$jmeVersionTag", true, true) optlibs dep("org.jmonkeyengine:jme3-android:$jmeVersion-$jmeVersionTag", true, true) optlibs dep("org.jmonkeyengine:jme3-ios:$jmeVersion-$jmeVersionTag", true, true) optlibs dep("org.jmonkeyengine:jme3-android-native:$jmeVersion-$jmeVersionTag", true, true) optlibs dep("org.jmonkeyengine:jme3-lwjgl3:$jmeVersion-$jmeVersionTag", true, true) - optlibs dep("com.github.stephengold:Heart:8.2.0", true, true) - optlibs dep("com.github.stephengold:Wes:0.7.2", true, true) + optlibs dep("com.github.stephengold:Wes:0.8.1", true, true) testdatalibs dep("org.jmonkeyengine:jme3-testdata:$jmeVersion-$jmeVersionTag", false, false) examplelibs dep("org.jmonkeyengine:jme3-examples:$jmeVersion-$jmeVersionTag", false, true) } @@ -121,7 +126,19 @@ task copyBaseLibs(dependsOn:configurations.corelibs) { from file into "jme3-core-baselibs/release/modules/ext/" } - }else if( !isSourceOrJavadoc(file.name)){ + } else if( file.name.contains("Minie") && !isSourceOrJavadoc(file.name)) { + // Special handling of Minie, since it doesn't follow the name convention + copy { + from file + into "jme3-core-baselibs/release/modules/ext/" + } + } else if( file.name.contains("Heart") && !isSourceOrJavadoc(file.name)) { + // Special handling of Minie, since it doesn't follow the name convention + copy { + from file + into "jme3-core-baselibs/release/modules/ext/" + } + } else if( !isSourceOrJavadoc(file.name)){ copy { from file into "jme3-core-libraries/release/modules/ext/" @@ -168,6 +185,16 @@ task createBaseXml(dependsOn: configurations.corelibs) { jmeJarFiles.add(file) } + } else if( file.name.contains("Minie") && !isSourceOrJavadoc(file.name)) { + // Special handling of Minie, since it doesn't follow the name convention + if(!jmeJarFiles.contains(file)) { + jmeJarFiles.add(file) + } + } else if( file.name.contains("Heart") && !isSourceOrJavadoc(file.name)) { + // Special handling of Minie, since it doesn't follow the name convention + if(!jmeJarFiles.contains(file)) { + jmeJarFiles.add(file) + } } else if(!isSourceOrJavadoc(file.name)) { //collect external jars externalJarFiles.add(file) @@ -583,7 +610,7 @@ file('.').eachDir{ buildSdk.inputs.dir it } } -buildSdk.outputs.dir "build" +//buildSdk.outputs.dir "build" task run(dependsOn: buildSdk) { doLast { @@ -609,14 +636,14 @@ task cleanSdk() { task extractPlatformIndependent(type: Copy) { from zipTree('dist/jmonkeyplatform.zip') into "dist/temp/" - + exclude("jmonkeyplatform/etc/jmonkeyplatform.conf") } task patchPlatformIndependent(type: Copy, dependsOn: extractPlatformIndependent) { from zipTree('dist/jmonkeyplatform.zip') into "dist/temp/" - + include("jmonkeyplatform/etc/jmonkeyplatform.conf") filter { String line -> @@ -641,7 +668,7 @@ task fixPlatformIndependent(dependsOn: patchPlatformIndependent, type: Zip) { } wrapper { - gradleVersion = '7.5.1' + gradleVersion = '8.6' } //jar.dependsOn(buildSdk) diff --git a/build.xml b/build.xml index 656267f59..1afd2bea0 100644 --- a/build.xml +++ b/build.xml @@ -220,7 +220,7 @@assets
directory.
-To create 3D models and scenes, you need a 3D Mesh Editor such as
-Tip: Learn how to create
-3D model editors are third-party products, so please consult their documentation for instructions how to use them. Here is an example workflow for Blender users: -
--To export your models as Ogre XML meshes with materials: -
-something.mesh.xml
goes with something.material
, plus (optionally) something.skeleton.xml
, and some JPG files.assets/Models/
directory. E.g. assets/Models/something/
.You can now use the jMonkeyEngine SDK to load and view models. You can create scenes from them and write code that loads them into your application. @@ -82,4 +35,4 @@
-This section discusses how to create and import models from Blender3D (2.62+, see bottom of page for Blender 2.49 and before) to jME3. Furthermore it explains how you can create various typical game-related assets like normal maps of high-poly models and baked lighting maps. -
- --For the managing of assets in general, be sure to read the Asset Pipeline Documentation. It contains vital information on how to manage your asset files. -
- --Game-compatible models are models that basically only consist of a mesh and UV-mapped textures, in some cases animations. All other material parameters or effects (like particles etc.) can not be expected to be transferred properly and probably would not translate to live rendering very well anyway. -
- --To successfully import a texture, the texture has to be UV-mapped to the model. Heres how to assign diffuse, normal and specular maps: -
--Its important to note that each used texture will create one separate geometry. So its best to either combine the UV maps or use a premade atlas with different texture types from the start and then map the uv coords of the models to the atlas instead of painting on the texture. This works best for large models like cities and space ships. -
- --Animations for jME3 have to be bone animations, simple object movement is supported by the blender importer, mesh deformation or other forms of animation are not supported. -
- --To create an animation from scratch do the following: -
--Sometimes you do not create the model yourself and often times models from the web are not really made for OpenGL live rendering or not completely compatible with the bone system in jME. -
- --To export an animated model in Blender make sure the following conditions are met: -
--You can use SkeletonDebugger to show the skeleton on your game in order to check if the mesh and the skeleton are loaded correctly: -
-final Material soldier2Mat = assetManager.loadMaterial("Materials/soldier2/soldier2.j3m"); - final Spatial soldier2 = assetManager.loadModel("Models/soldier2/soldier2.j3o"); - TangentBinormalGenerator.generate(soldier2); - soldier2.setMaterial(soldier2Mat); - - final Node soldier2Node = new Node("Soldier2 Node"); - - soldier2Node.attachChild(soldier2); - rootNode.attachChild(soldier2Node); - - final AnimControl control = soldier2.getControl(AnimControl.class); - control.addListener(this); - final AnimChanel channel = control.createChannel(); - - final SkeletonDebugger skeletonDebug = new SkeletonDebugger("skeleton", control.getSkeleton()); - final Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - mat.setColor("Color", ColorRGBA.Green); - mat.getAdditionalRenderState().setDepthTest(false); - skeletonDebug.setMaterial(mat); - soldier2Node.attachChild(skeletonDebug);-
-Also check out these videos and resources: -
--Models for live rendering should have a low polygon count. To increase the perceived detail of a model normal maps are commonly used in games. This tutorial will show how to create a normalmap from a highpoly version of your model that you can apply to a lowpoly version of the model in your game. -
- --
-
-
-Blender has its own normal colors standard. We need to fix the colors to prepare the normalmap for using it with the JME Lighting Material. -
- --To do this, go to the Blender Node Window -
--The goal of this tutorial is to explain briefly how to bake light map in blender with a separate set of texture coordinates and then export a model using this map in jME3. -
- --Once this is done, export your model with the ogre exporter (or import it directly via the blend importer), and turn it into J3o with the SDK. -
--The blend file, the ogre xml files and the textures can be found in the download section of the google code repo -
- -
-
-Follow the link below to a pdf tutorial by rhymez where I guide you to modelling a car and importing it to the jMonkeyengine correctly and edit it in the vehicle editor.Plus how to model a simple racing track.
-
-Follow the link below to a pdf tutorial by rhymez where I guide you on how you can optimize your models for faster rendering.
-
-There are several ways to create static images to use for a sky in your game. This will describe the concepts used in blender and create an ugly sky Check the links below for other ways and prettier skies.
-
-A sky box is a texture mapped cube, it can also, loosely, be called en EnvMap or a CubeMap. The camera is inside the cube and the clever thing that jME does is to draw the sky so it is always behind whatever else is in your scene. Imagine the monkey is the camera in the picture. -
--But a real sky is not a box around our heads, it is more like a sphere. So if we put any old image in the sky it will look strange and might even look like a box. This is not what we want. The trick is to distort the image so that it will look like a sphere even if it in fact is a picture pasted on a box. Luckily blender can do that tricky distortion for us. -
- --The screenshots are from Blender 2.63 but the equivalent operations have been in blender for years so with minor tweaks should work for almost any version. -
- --So let's get started -
-Environment Map
, that the Viewpoint Object
is set to the cube. The resolution is how large the resulting image will be. More pixels makes the sky look better but comes at the cost of texture memory. You'll have to trim the resolution to what works in your application.-
Add Spatial
and then select Skybox
.-If you want to do it from code, here is an example: -
-public void simpleInitApp() { - - Texture westTex = assetManager.loadTexture("Textures/west.png"); - Texture eastTex = assetManager.loadTexture("Textures/east.png"); - Texture northTex = assetManager.loadTexture("Textures/north.png"); - Texture southTex = assetManager.loadTexture("Textures/south.png"); - Texture upTex = assetManager.loadTexture("Textures/top.png"); - Texture downTex = assetManager.loadTexture("Textures/bottom.png"); - - final Vector3f normalScale = new Vector3f(-1, 1, 1); - Spatial skySpatial = SkyFactory.createSky( - assetManager, - westTex, - eastTex, - northTex, - southTex, - upTex, - downTex, - normalScale); - rootNode.attachChild(skySpatial); -}- -
-
-The jMonkeyEngine SDK supports .blend files and can convert them to jMonkeyEngine's .j3o format. This means you can use Blender to convert, for example, a 3dMax file to .j3o format. -
- --I'm using the blender 2.59 at this tutorial, but if you blender 2.49b, no problem ;). -After you saved your .3ds file in 3dmax, open the blender, delete the default cube, -and import your .3ds file via File—→Import—–>3D Studio. -
- -
-
-
-Now save your .blend file so you can load it into the jMonkeyEngine SDK. -
- -
-
-
-Click on Import Model button and then click on Open Model button to open the .blend file. Click next, select the checkbox to import a copy from .blend file, and click finish. -
- -
-
-
-As you can see, the .blend model was automatically converted to .j3o binary format. Now, you are able to edit it in SceneComposer ;D. -
- -
-
-
-Importing models to any game engine is as important as using them. The quality of the models depends on the abilities of the people who create it and on the tools they use. -Blender is one of the best free tools for creating 3D enviroments. Its high amount of features attract many model designers. -So far jMonkeyEngine used Ogre mesh files to import 3D data. These files were created by the python script that exported data from blender. -It was important to have always the lates version of the script that is compatible with the version of blender and to use it before importing data to jme. -Now we have an opportunity to simplify the import process by loading data directly from blender binary files: *.blend. -
- --
-To use it in your game or the SDK you should follow the standard asset loading instructions. -By default a BlenderModelLoader is registered with your assetManager to load blend files. This means you can load and convert .blend model files to .j3o format, just like any other supported model format. -
- --You have two loaders available. -
-public static class LoadingResults extends Spatial { - /** Bitwise mask of features that are to be loaded. */ - private final int featuresToLoad; - /** The scenes from the file. */ - private List<Node> scenes; - /** Objects from all scenes. */ - private List<Node> objects; - /** Materials from all objects. */ - private List<Material> materials; - /** Textures from all objects. */ - private List<Texture> textures; - /** Animations of all objects. */ - private List<AnimData> animations; - /** All cameras from the file. */ - private List<Camera> cameras; - /** All lights from the file. */ - private List<Light> lights; - /** Access Methods goes here. */ -}-
-To register the model do the following: -
-assetManager.registerLoader(BlenderLoader.class, "blend");- -
-or -
-assetManager.registerLoader(BlenderModelLoader.class, "blend");-
-You can use com.jme3.asset.BlenderKey for that. -The simplest use is to create the key with the asset's name. -It has many differens settings descibing the blender file more precisely, but all of them have default values so you do not need to worry about it at the beggining. -You can use ModelKey as well. This will give the same result as using default BlenderKey. -
- --BlenderLoader (as well as BlenderModelLoader) is looking for all kinds of known assets to load. -It's primary use is of course to load the models withon the files. -Each blender object is imported as scene Node. The node should have applied textures and materials as well. -If you define animations in your BlenderKey the animations will as well be imported and attached to the model. -
- --Here is the list of how blender features are mapped into jme. -
-Blender | jMonkeyEngine3 | Note | -
---|---|---|
Scene | Node | - |
Object | Node | - |
Mesh | List<Geometry> | One mesh can have several materials so that is why a list is needed here. | -
Lamp | Light | - |
Camera | Camera | - |
Material | Material | - |
Texture | Texture | - |
Curve | Node | Node with Curve as its mesh | -
Surface | Node | The surface is transformed to the proper mesh | -
-Using BlenderLoader can allow you to use blend file as your local assets repository. -You can store your textures, materials or meshes there and simply import it when needed. -Currently blender 2.49 and 2.5+ are supported (only the stable versions). -Probably versions before 2.49 will work pretty well too, but I never checked that :) -
- --I know that the current version of loader is not yet fully functional, but belive me – Blender is a very large issue ;) -Hope I will meet your expectations. -
- --Be mindful of the result model vertices amount. The best results are achieved when the model is smooth and has no texture. Then the vertex amount is equal to the vertex amount in blender. If the model is not smooth or has a generated texture applied then the amount of vertices is 3 times larger than mesh's triangles amount. If a 2d texture is applied with UV mapping then the vertex count will vary depending on how much the UV map is fragmented. -
- --When using polygon meshes in blender 2.5 and newer, better add and apply the triangulation modifier (if available in your version) or save the file with convertion from polygons to triangles. -Even though the importer supports loading of polygons as the mesh faces, if your face isn't convex, the results might contain errors. -
- --Not all modifiers are supported. If your model has modifiers and looks not the way you want in the jme scene - try to apply them and load again. -
- --Cheers, -Marcin Roguski (Kaelthas) -
- --P.S. -This text might be edited in a meantime if I forgot about something ;) -
--See also: -
-A production-quality JMonkeyEngine 3.7.0 stable release with the following noteworthy changes relative to 3.6.1-stable:
+A production-quality JMonkeyEngine 3.8.0 stable release with the following noteworthy changes relative to 3.7.0-stable:
+