How to add .obj model to JME - models

For some reason I am having a hard time figuring out how to add obj models to JME. I am new to JME and have not imported models before (other than the sample assets tutorial).
I created a basic model in Blender and exported it as an obj. I added the obj to the project/assets/models folder and the mtl to the the materials folder. Unfortunately, I am still unable to see the model when I run the program. The scene appears black. I am able to see a 1x1x1 cube created in JME.
The object is a default square with another square intersecting it. Both squares have default textures.
public class TestImport extends SimpleApplication {
public static void main(String[] args){
TestImport app = new TestImport();
app.start();
}
#Override
public void simpleInitApp(){
Spatial object = assetManager.loadModel(“Models/TestingOBJ/TestingOBJ.obj”);
rootNode.attachChild(object);
DirectionalLight sun = new DirectionalLight();
sun.setDirection(new Vector3f(-2f,-2f,-2f).normalizeLocal());
rootNode.addLight(sun);
}
}
Help please!

Textures are not exported in .obj files, and therefore you are trying to view an untextured asset within JME. Try adding a Material to the object after using the asset manager to load the model.
public class TestImport extends SimpleApplication {
public static void main(String[] args){
TestImport app = new TestImport();
app.start();
}
#Override
public void simpleInitApp(){
Spatial object = assetManager.loadModel(“Models/TestingOBJ/TestingOBJ.obj”);
Material mat_default = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
object.setMaterial(mat_default);
DirectionalLight sun = new DirectionalLight();
sun.setDirection(new Vector3f(-2f,-2f,-2f).normalizeLocal());
rootNode.addLight(sun);
}
}
So that JME knows where to find them, ensure that you have placed your assets in the assets/Textures/ folder.

Related

Java: Call method in Controller from another class? [duplicate]

I would like to communicate with a FXML controller class at any time, to update information on the screen from the main application or other stages.
Is this possible? I havent found any way to do it.
Static functions could be a way, but they don't have access to the form's controls.
Any ideas?
You can get the controller from the FXMLLoader
FXMLLoader fxmlLoader = new FXMLLoader();
Pane p = fxmlLoader.load(getClass().getResource("foo.fxml").openStream());
FooController fooController = (FooController) fxmlLoader.getController();
store it in your main stage and provide getFooController() getter method.
From other classes or stages, every time when you need to refresh the loaded "foo.fxml" page, ask it from its controller:
getFooController().updatePage(strData);
updatePage() can be something like:
// ...
#FXML private Label lblData;
// ...
public void updatePage(String data){
lblData.setText(data);
}
// ...
in the FooController class.
This way other page users do not bother about page's internal structure like what and where Label lblData is.
Also look the https://stackoverflow.com/a/10718683/682495. In JavaFX 2.2 FXMLLoader is improved.
Just to help clarify the accepted answer and maybe save a bit of time for others that are new to JavaFX:
For a JavaFX FXML Application, NetBeans will auto-generate your start method in the main class as follows:
#Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
Now, all we need to do to have access to the controller class is to change the FXMLLoader load() method from the static implementation to an instantiated implementation and then we can use the instance's method to get the controller, like this:
//Static global variable for the controller (where MyController is the name of your controller class
static MyController myControllerHandle;
#Override
public void start(Stage stage) throws Exception {
//Set up instance instead of using static load() method
FXMLLoader loader = new FXMLLoader(getClass().getResource("FXMLDocument.fxml"));
Parent root = loader.load();
//Now we have access to getController() through the instance... don't forget the type cast
myControllerHandle = (MyController)loader.getController();
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
Another solution is to set the controller from your controller class, like so...
public class Controller implements javafx.fxml.Initializable {
#Override
public void initialize(URL location, ResourceBundle resources) {
// Implementing the Initializable interface means that this method
// will be called when the controller instance is created
App.setController(this);
}
}
This is the solution I prefer to use since the code is somewhat messy to create a fully functional FXMLLoader instance which properly handles local resources etc
#Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("/sample.fxml"));
}
versus
#Override
public void start(Stage stage) throws Exception {
URL location = getClass().getResource("/sample.fxml");
FXMLLoader loader = createFXMLLoader(location);
Parent root = loader.load(location.openStream());
}
public FXMLLoader createFXMLLoader(URL location) {
return new FXMLLoader(location, null, new JavaFXBuilderFactory(), null, Charset.forName(FXMLLoader.DEFAULT_CHARSET_NAME));
}
On the object's loading from the Main screen, one way to pass data that I have found and works is to use lookup and then set the data inside an invisible label that I can retrieve later from the controller class. Like this:
Parent root = FXMLLoader.load(me.getClass().getResource("Form.fxml"));
Label lblData = (Label) root.lookup("#lblData");
if (lblData!=null) lblData.setText(strData);
This works, but there must be a better way.

Libgdx, Why Should I Use Constructors When Switching Screens?

I am a beginner in libgdx and was wondering in what cases you would need to use a constructor when switching screens (examples would be helpful). Is it to save memory? Also, is it better to create instances of all the screens in the main class that extends the game?
Here is an example of instances from https://code.google.com/p/libgdx-users/wiki/ScreenAndGameClasses :
public class MyGame extends Game {
MainMenuScreen mainMenuScreen;
AnotherScreen anotherScreen;
#Override
public void create() {
mainMenuScreen = new MainMenuScreen(this);
anotherScreen = new AnotherScreen(this);
setScreen(mainMenuScreen);
}
}
The constructor is in the next class:
public class MainMenuScreen implements Screen {
MyGame game; // Note it's "MyGame" not "Game"
// constructor to keep a reference to the main Game class
public MainMenuScreen(MyGame game){
this.game = game;
}
...
You should avoid creating all screens in Game class in create() method (you will allocate much memory at once and pointlesly). Create only one screen at a time when do you need It. So e.g. you click button New game in menu and there you call game.setScreen(new NextScreen(this));
You do not have to make constructor with Game parameter - but you will not have reference to the main Game class. Having reference to main game class is good for changing screens, method setScreen(screen).
You need the constructor because your changing to a screen that doesnt extend the Game class which is what u need to call setScreen(); Since ur passing the game class to the constructor you can use it to get back to the screen you were at (or another screen) without creating another class that extends Game
I prefer using a singleton.
Something like
public class MyGame extends Game {
private static MyGame myGame;
public static MyGame getInstance() {
if (myGame == null) {
myGame = new MyGame();
}
return myGame;
}
#Override
public void create() {
setScreen(new MainMenuScreen();
}
}
And the example for desktop main class
public class Main {
public static void main(String[] args) {
LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration();
cfg.width = 800;
cfg.height = 480;
new LwjglApplication(MyGame.getInstance(), cfg);
}
}
Now whenever you need to change your screen use MyGame.getInstance().setScreen(new ScreenName());

How to call functions on the stage in JavaFX's controller file

I am using javafx along with fxml, so I use the controller for the real coding. I need to do a few operations on the stage, such as getting its x- or y-axis position. I have tried stage.getX() & stage.getY, but they don't work(the stage name is high-lited as the error). How do I use such functions in my controller? I tried doing this in my main file:
public int locationX = stage.getX();
and
public double locationX = stage.getX();
But it doesn't work, instead makes the whole program one big error.
So how do I get to do such functions in my controller file? Do I need to import something or do something like above in another way?
error: cannot find symbol
locationX = stage.getX();
symbol: variable stage
location: class FXMLController
I know that the "stage" is missing. But how to get the "stage" in my controller?
From your root Pane in the fxml file :
#FXML
Parent root
You can get the stage from it by:
Stage stage = (Stage) root.getScene().getWindow()
You have a reference to your stage, you can do what you want.
Sample Solution
You can initialize the stage in the controller using the technique from: Passing Parameters JavaFX FXML.
Here is a sample program which creates a utility window which tracks the x and y co-ordinates of the screen as you drag the utility window around. The contents of the utility window are rendered in an fxml defined pane.
StageTrackingSample.java
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.*;
import javafx.stage.*;
public class StageTrackingSample extends Application {
#Override public void start(final Stage stage) throws Exception {
final FXMLLoader loader = new FXMLLoader(
getClass().getResource(
"stagetracking.fxml"
)
);
final Parent root = (Parent) loader.load();
final StageTrackingController controller = loader.getController();
controller.initData(stage);
stage.initStyle(StageStyle.UTILITY);
stage.setResizable(false);
stage.setScene(new Scene(root));
stage.show();
}
public static void main(String[] args) { launch(args); }
}
StageTrackingController.java
import javafx.beans.binding.Bindings;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.stage.Stage;
public class StageTrackingController {
#FXML private Label stageX;
public void initialize() {}
public void initData(final Stage stage) {
stageX.textProperty().bind(
Bindings.format(
"(%1$.2f, %2$.2f)",
stage.xProperty(),
stage.yProperty()
)
);
}
}
stagetracking.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="30" minWidth="100" xmlns:fx="http://javafx.com/fxml" fx:controller="test.StageTrackingController">
<Label fx:id="stageX" layoutX="0" layoutY="0"/>
</AnchorPane>
Alternate Solutions
tarrsalah's answer of just getting the stage from an #FXML component is also a good way if you know that the root component of the controller has already been added to a scene which has already been added to a stage (which is often the case when something like a button event handler is fired).
Another way to do it is similar to tarrsalah's answer, but to use ChangeListeners on the scene property of an #FXML node and the window property of the changed scene. This allows you to track changes to the scene and stage in case the pane is moved to a new scene or stage. Most of the time you don't need to track those changes though as most panes are just added to a single scene which stays on one stage.
Answers to Additional Questions and Comments
Can I get a simpler answer?
tarrsalah already provided a simpler answer.
The only problem with a simpler answer in this case is that it might not provide enough context required for you to replicate the answer's solution and adapt it to your work.
I made my current answer as simple as I could, but, unfortunately, even the most basic JavaFX FXML application requires quite a bit code and markup to work.
I am a mere beginner in java
Don't use FXML when you are first starting to develop your initial Java and JavaFX applications. Instead, just stick with the standard Java API in your JavaFX code, for which there are many more tutorials as well as the excellent Ensemble Sample to refer to.
Make sure before beginning JavaFX, that you have completed all of the Java Tutorial Trails Covering the Basics. Only the basics of Java are required to start using JavaFX, you don't need to branch off into learning Java Enterprise Edition and can forget about Swing.
Consider using SceneBuilder and FXML for larger applications once you have written a few basic JavaFX applications, hand-coded some layouts according to the Java API and reached a level of comfort with the core technologies. At that time you will likely find that learning FXML is quite straightforward. FXML attributes and elements are just a reflection of the Java APIs.
please explain the other-than-usual bits of your code
I can't really do that as I don't know what is unusual for you.
If there are particular parts of the code that you cannot understand through your own knowledge or research, create a new StackOverflow question for each difficult concept.
Well, the simplest answer to that...
In your Main class create an instance (an object) of your Controller class:
FXMLLoader loader = new FXMLLoader(getClass().getResource("Example.fxml"));
MyController controller = loader.getController();
controller.setStage(this.stage);
In your Controller class you should put a method of "extraction" (a setter):
private Stage primaryStage;
public void setStage(Stage stage) {
this.primaryStage = stage;
}
And then you can add a fullscreen button ;)
#FXML
private Button btnFullScreen = new Button();
public void setFullscreen(ActionEvent event){
if(primaryStage.isFullScreen()){
primaryStage.setFullScreen(false);
} else {
primaryStage.setFullScreen(true);
}
}
This thread is old, but I discovered something pertinent to it quite by accident. What I thought was a coding error that shouldn't have worked, yet it did. In the controller class, simply declaring the following member variable:
#FXML private Stage stage;
gave me access to the stage in the controller, much like I have access to a widget in the fxml document. I have not found any documentation that this is the case, but I'll admit I am noob to JavaFX (although an old hand at Swing). But it seems to work. Maybe it's dangerous to count on it though?
With *.FXML files and Controllers and not with Main or Events , use this :
#FXML private Stage stage;
stage = (Stage) elemen.getScene().getWindow();
element, can be any control or element in you FXML, in my case is an AnchorPane:
#FXML private AnchorPane element;
The best approach is to create a new controller and pass the stage via the constructor (don't use fx:controller on FXML file), otherwise the stage will be null when initialize() is invoked (At that moment of time, when load() invokes initialize(), no stage is attached to the scene, hence the scene's stage is null).
public class AppEntryPoint extends Application
{
private FXMLLoader loader;
#Override
public void init() throws Exception
{
loader = new FXMLLoader(getClass().getResource("path-to-fxml-file"));
}
#Override
public void start(Stage initStage) throws Exception
{
MyController controller = new MyController(initStage);
loader.setController(controller);
Scene scene = loader.load();
initStage.setScene(scene);
initStage.show();
}
public static void main(String[] args)
{
launch(args);
}
}
public class MyController
{
private Stage stage;
#FXML private URL location;
#FXML private ResourceBundle resources;
public MyController(Stage stage)
{
this.stage = stage;
}
#FXML
private void initialize()
{
// You have access to the stage right here
}
}

sharing view model objects in eclipse RCP without OSGi services

What is best practice to share light weight view models or data context objects in an Eclipse RCP application, since I do not have control over view creation? I will prefer not to use OSGi services or static variables for something this light.
Say I have a MapView that will create an instance of its MapViewController in its constructor.
public class MapView extends ViewPart {
public static final String ID = "myapp.mapview";
MapViewController controller = null;
public MapView() {
LegendContainer legends = new LegendContainer();
MapViewModel viewModel = new MapViewModel();
controller = new MapViewController(null, legends, viewModel);
}
#Override
public void createPartControl(Composite parent) {
// create main map
}
}
MapViewModel has a property called Legends that needs to be accessed by a TableOfContentsView (TocView), which is trivial if TocView is created as child of MapView in MapView.createPartControl()
#Override
public void createPartControl(Composite parent) {
// pass model to child here when creating it
}
If I want TocView and MapView to exist as independent views in the perspective, added to the platform in MapPerspective.createInitialLayout like this:
public class MapPerspective implements IPerspectiveFactory {
#Override
public void createInitialLayout(IPageLayout layout) {
String editorArea = layout.getEditorArea();
layout.setEditorAreaVisible(false);
IFolderLayout main = layout.createFolder("right", IPageLayout.RIGHT, 0.2f, editorArea);
IFolderLayout top = layout.createFolder("top", IPageLayout.TOP, 0.5f, editorArea);
IFolderLayout bottom = layout.createFolder("bottom", IPageLayout.BOTTOM, 0.5f, editorArea);
// how do I share stuff???
main.addView(MapView.ID);
layout.getViewLayout(MapView.ID).setCloseable(false);
top.addView(TableOfContentsView.ID);
layout.getViewLayout(TableOfContentsView.ID).setCloseable(false);
bottom.addView(PropertiesView.ID);
layout.getViewLayout(PropertiesView.ID).setCloseable(false);
How do I pass around the view model or data context that needs to be shared?

Need help converting PRISM Unity Module Init to PRISM MEF Module Init

I need help converting the following class for use in a program that I am developing. The original was a demo program from IdeaBlade called "PRISM EXPLORER" based on Unity. I need help converting one part from UNITY to MEF. I handled everything else. Just stuck on this one. I already marked my classes with the MEF "[EXPORT(typeof(XXX))]" and I think I need to use the "ComposeExportedValue" somehow. The confusing part is finding the equivelant for this line:
var provider =
(IEntityManagerProvider) _container.Resolve<IPersistenceGateway>();
_container.RegisterInstance<IEntityManagerProvider>(provider);
THANKS!
The following is the entire class I need to convert. You can find the original here: Ideablade PRISM Page
using Microsoft.Practices.Composite.Modularity;
using Microsoft.Practices.Composite.Regions;
using Microsoft.Practices.Unity;
using PrismExplorer.Infrastructure;
namespace ModelExplorer.Explorer {
public class ExplorerModule : IModule {
private readonly IUnityContainer _container;
public ExplorerModule(IUnityContainer container) {
_container = container;
}
public void Initialize() {
InitializeContainer();
SetViews();
}
// ToDo: Consider getting from configuration
private void InitializeContainer() {
RegisterGatewayAndEntityManagerProvider();
_container.RegisterType<IQueryRepository, QueryRepository>(
new ContainerControlledLifetimeManager()); // singleton
}
private void RegisterGatewayAndEntityManagerProvider() {
_container.RegisterType<IPersistenceGateway, PrismExplorerPersistenceGateway>(
new ContainerControlledLifetimeManager()); // singleton
var provider =
(IEntityManagerProvider) _container.Resolve<IPersistenceGateway>();
_container.RegisterInstance<IEntityManagerProvider>(provider);
}
private void SetViews() {
var regionManager = _container.Resolve<IRegionManager>();
var view = _container.Resolve<ExplorerView>();
regionManager.AddToRegion(RegionNames.MainRegion, view);
regionManager.RegisterViewWithRegion(RegionNames.MainRegion, typeof(ExplorerView));
}
// Destructor strictly to demonstrate when module is GC'd
//~MevModule() {
// System.Console.WriteLine("Goodbye, MevModule");
//}
}
}
The two corresponding methods on a CompositionContainer are ComposeExportedValue<T>(...), which allows you to add a specific instance to the container, and GetExportedValue<T>(...) which gets an instance of T from the container.
If you can design your types in a way to reduce this use of service location and try and prefer constructor injection, it will make your code much easier to maintain and test. E.g., could your code be transformed into:
[Export(typeof(IModule))]
public class ExplorerModule : IModule
{
[ImportingConstructor]
public ExplorerModule(IPersistenceGateway gateway)
{
}
}

Resources