jMonkeyEngine Hub
hub.jmonkeyengine.org.web.brid.gy
jMonkeyEngine Hub
@hub.jmonkeyengine.org.web.brid.gy
Community site for the jMonkeyEngine

🌉 bridged from 🌐 https://hub.jmonkeyengine.org/: https://fed.brid.gy/web/hub.jmonkeyengine.org
How do I create sub projects in my Java project?
And for sub-projects, gradle has the advantage that they are genuine sub-projects and not just some hacked in wiring around “separate projects in the same directory structure” like for maven. If you rebuild just a gradle subproject, it knows which other sub-projects to rebuild and tracks the dependencies for it correctly. It’s possible that if you use an IDE then it will gloss over some of maven’s multi-project ugliness but it will never be as good at gradle is at tracking dependencies. So if you are still in the “undecided” camp, gradle is the more modern option. If you are already using gradle, you probably already have a settings.gradle file in the root. After creating the sub-project subdirectories, add new subprojects in settings.gradle. To have one sub-project depend on another, add the dependency in build.gradle like for any other jar except use `project(:foo:bar)` as the dependency. Here is an example of a settings.gradle file for a simple multi-project build: github.com/jMonkeyEngine-Contributions/zay-es #### settings.gradle `78d4045f3` // To declare projects as part of a multi-project build use the 'include' method include 'extensions:Zay-ES-Net' rootProject.name = 'zay-es' // More sensible sub-project names project(":extensions:Zay-ES-Net").name = "zay-es-net" …it has the advanced application of renaming the sub-project, too… if for some reason you want/need different sub-directory names than sub-project names.
hub.jmonkeyengine.org
December 3, 2025 at 6:06 AM
(Q4 - 2025) Quarterly Marketing Thread
Twitter/x has been running a deal on the monthly verified subscription, usually its $8 a month but currently is just $1 for the first month. So I decided to try it out and see if it helps get anymore reach on the engine’s x account. From what I am reading, being verified _does_ help boost your replies when commenting on other posts. It sounds like one of the best ways to build a following on twitter is to frequently reply to other popular game dev related posts (important to be done respectfully, of course), and the verified badge should greatly help with this. I also signed up for verified on my own twitter account for my game, since it’s just a dollar. If anyone else is interested, they are running the $1 subscription sale until tomorrow night. At the end of next month, I will then assess whether the verified subscription is worth it for the jMonkeyEngine account, and if so then I will continue paying the $8 monthly fee using our funds from jME’s donations on open-source collective. This will run us about ~$96.00 a year at 8.00 per month. And of course I would like to hear community input on this matter. If anyone opposes this idea, or if you do not think it is a good use of jME’s funds, then please feel free to speak up and voice your concerns. The last thing I want to do is use the community funding for something that the community doesn’t agree on, so please do not hesitate to speak up with your opinions on this matter.
hub.jmonkeyengine.org
December 2, 2025 at 2:22 PM
(November 2025) Monthly WIP Screenshot Thread
More modeling practice.
hub.jmonkeyengine.org
December 2, 2025 at 1:55 AM
Selective Post-Process Outlining
Thanks for your reply, @TesterY. I really appreciate it. The filter is now working correctly. The important thing is not to change the background color (default = black) of the `ViewPort`. That was the cause of the problem I was having. Another optimization you can add to the filter is to avoid continuously creating a new `SceneGraphVisitor` in the `postQueue()` method, but rather to create a single class variable that can be reused each time. @Override protected void postQueue(RenderQueue queue) { Renderer renderer = renderManager.getRenderer(); // 1. Render objects to the mask FrameBuffer renderer.setFrameBuffer(maskFrameBuffer); renderer.clearBuffers(true, true, true); // Render each selected spatial using the mask material for (Spatial sp : selectedSpatials) { sp.depthFirstTraversal(maskVisitor); } // 2. Pass the generated mask texture to the final filter material this.material.setTexture("MaskTexture", this.getMaskTexture()); // 3. Reset the FrameBuffer to the main viewport output renderer.setFrameBuffer(viewPort.getOutputFrameBuffer()); } private final SceneGraphVisitorAdapter maskVisitor = new SceneGraphVisitorAdapter() { @Override public void visit(Geometry geo) { renderManager.setForcedMaterial(maskMaterial); renderManager.renderGeometry(geo); renderManager.setForcedMaterial(null); } };
hub.jmonkeyengine.org
November 30, 2025 at 5:43 AM
Tamarin (VR library) Version 3 release: Android Support
I’ve just released version 3.0.0 of Tamarin. The big new feature is Android support! I.e. running locally on a Quest or similar android based headset. [Obligatory AI generated image of an Android Tamarin to break up the wall of text] # Technical details on OpenXR bindings Modern VR is implemented using OpenXR calls to the VR runtime, LWJGL doesn’t have android bindings for OpenXR (only desktop bindings) and there are no java android bindings (inexplicably!) only c bindings. So as part of this I’ve created my own java-c bindings for openXR. You can use these with any java project, they aren’t dependent on either Tamarin or JMonkeyEngine (but obviously do use Tamarin and JMonkeyEngine!) This binding is available at github and is called TamarinOpenXrAndroidBindings. It it available as a maven/gradle dependency: com.onemillionworlds.tamarin:openxr-bindings-native. This uses code generation based on parsing the c header file so covers the whole OpenXR spec, not just the bits I needed for Tamarin (but only the bits I used for Tamarin are tested). It is a thin binding (just like LWJGL) so it mirrors the C calls one for one (and so is a nightmare to use). Realistically you don’t need to care about this but it took _ages_ so I want to mention it ## Better Hand Bone Simulation On desktop I was getting the hand bone positions from the runtime even when holding the controllers. This doesn’t seem to work on Android (it seems with the right magic spells it might be possible, but I don’t want to hold up the release trying to get it to work). In PC VR I have basic Tamarin supplied hand bone simulation as a fall back, as it will be the primary source for bones in android I have improved it for version 3. It now uses both the trigger and grip pressure as inputs so can make pointing gestures as well as grabbing gestures It has to be explicitly set up (to give the TRIGGER and GRIP handles) VRHandsAppState vrHands = new VRHandsAppState(handSpec()); vrHands.setSkeletonSynthesiser(new DefaultSkeletonSynthesiser(ActionHandles.TRIGGER,ActionHandles.GRIP,SkeletonSynthesiser.SynthesiseMode.FALLBACK_ONLY)); getStateManager().attach(vrHands) ## Project structure As part of this I’ve broken the project into 4 published maven dependencies * Tamarin Core: big module containing most of the features of Tamarin * Tamarin (aka Tamarin Desktop): wires in LWJGL calls for openXR * Tamarin-Android: Wires in Tamarin OpenXR native bindings for OpenXR * Tamarin OpenXR bindings: Provides OpenXR thin binding for Java You mostly don’t need to care about the structure as the transitory dependencies are brought in for you. But if you were trying to target both PCVR and Android you’d want your main module to have tamarin-core as its dependency and a module each for PCVR and Android using the appropriate Tamarin version in each ### Desktop If you’re using desktop just depend on com.onemillionworlds:tamarin as before (as well as jmonkeyEngine of course) There is a sample application at TamarinTestBed ### Android If you’re using android just depend on com.onemillionworlds:tamarin-android (as well as jmonkeyEngine of course) There is a sample application at TamarinTestBedAndroid (I’m a bit new to Android so suggestions for improvement appreciated) ## Conclusion Feedback and bug reports are as always very much appreciated. I’ve tested on a Quest 3 but no other devices
hub.jmonkeyengine.org
November 30, 2025 at 5:44 AM