Code Monkey home page Code Monkey logo

mundus's Introduction

Mundus

Mundus is a platform independent 3D world editor, built with Java, Kotlin and LibGDX + VisUI. The plan is, that the world you create with Mundus can be exported into a unified format (such as JSON + assets). The exported data can then be imported into any Game Engine, if someone writes a runtime/parser for that engine.

Screenshot

This project is at a very early stage in development, so expect large changes in the future.

Current features

Please note, that a lot of the UI contains dummy controls for functionality that still needs to be implemented. Below are some of the more interesting features, that already work

  • Creation of multiple terrains
  • Height map loader for terrains
  • Procedural terrain generation
  • Texture splatting for the terrain texture (max 5 textures per terrain)
  • A complete terrain editing system with texture & height brushes
  • 4 different brushes (brush form can be an arbitrary image, like in Blender or Gimp)
  • 3 brush modes for each brush: Raise/Lower, Flatten & texture paint
  • A skybox (not exportable yet)
  • Loading of g3db files
  • Loading of obj/fbx/dae files (note, that the fbx-conv binary must be set in the settings)
  • A visual translation & rotation tool (scaling coming soon)
  • Multiple scenes in one project
  • A component based scene graph (not fully implemented yet)
  • Basic export of the project into a json format + assets
  • Undo/Redo system for most operations
  • Highly accurate game object picking system, based on id color coding & offscreen framebuffer rendering. Basic concept: http://www.opengl-tutorial.org/miscellaneous/clicking-on-objects/picking-with-an-opengl-hack/

Things to consider

  • Mundus is constantly changing. Especially the internal representation of save files. At this stage of the project i don't care very much for backward compatibility, so don't fall to much in love with your creations if you want to stay up to date ;)
  • Depending on your keyboard layout some key shortcuts might be twisted (especially CTRL+Z and CTRL+Y for QWERTZ and QWERTY layouts) because of the default GLFW keycode mapping. You can change the layout mapping in the settings dialog under Window -> Settings.

Runtime

Currently i'm in the process of implementing the libGDX runtime, which is included in this repository. Runtimes for other engines/frameworks are not planed in the near future.

Contributing

Contributions are greatly appreciated. To make the process as easy as possible please follow the Contribution Guide. To get an overview over the project you might also want to check out the Project overview & architecture article.

Working from source

See this wiki article.

Credits

Logo design: Franziska Böhm / noxmoon.de (CC-BY-SA 4.0)

mundus's People

Contributors

attilabo avatar codenigma avatar krukhlis avatar mbrlabs avatar nox-moon avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mundus's Issues

Procedural terrain generation

Implementation of some common noise functions (e.g. Perlin noise) for the terrain (Terrain.java).
Each noise function should have it's own class to keep the terrain class clean.

UI controls should be implemented in the Terrain widget of the inspector (TerrainComponentWidget.java / TerrainGenTab.java).

Better outline tree update

Currently the ui tree in the outline gets rebuilt from scratch if a game object is added, deleted or moved. This causes all expanded nodes to collapse, which is bad.

NPE when setting Fog color for first time.

When I try to set Fog params, selection of the color for Fog results in
[23:19][Fatal][Log] java.lang.NullPointerException
at com.mbrlabs.mundus.ui.modules.dialogs.FogDialog$4.selected(FogDialog.
java:124)
at com.mbrlabs.mundus.ui.widgets.ColorPickerField$1.finished(ColorPicker
Field.java:97)
at com.kotcrab.vis.ui.widget.color.ColorPicker$2.changed(ColorPicker.jav
a:118)
at com.badlogic.gdx.scenes.scene2d.utils.ChangeListener.handle(ChangeLis
tener.java:28)

Note, if you save project -- next time it works ok. If you see some values in the Fog dialog -- it will work.
According to code, either getFog(), either getFog().color is null.

Physics component

I think sooner or later we will need a physics component for the game objects:

  • integrate physics library (create physics world, bind game objects with phy. component to phy. world)
  • assign simple geometry as bounding box (for the first version)
  • construct bounding box with simple geometry and assign it (maybe as editor plugin?)
  • calculate simplified bounding box from low-poly model (ideal solution but very complex)

So the question is, which priority does this feature have and which features must be implemented first to achieve a good solution?

Script component

I dont't know the actual planned workflow to create a game with mundus, but i think we will need something for the game logic.

1 Solution (possible in near future):

  • When the libgdx runtime is ready we will load the world and program the logic in java with libgdx functionality. So the editor will be an optional tool for game creation.

2 Integrate a script component (javascript):

  • We implement a scripting language compatible with java6. Possible candidates are rhino, nashorn and j2v8:
    rhino is a standalone lib (100% java6 and highly compatible with android, no actual benchmark present (slower than j2v8 and nashorn in 2014))
    nashorn will only work with java8 (so not working with older android < 7.0, not an option at the moment)
    j2v8 is the implementation of google V8 engine. It is written in c++ and wrapped in java with native interfaces. At the moment it is the fastest implementation, but it must be compiled for every platform. This will complicate everything.
  • expose the commons library into a javascript library to manipulate game objects/world
  • the user can use every editor he likes to write his scripts, he will just need to point his project into the mundus project and bind the commons library
  • hot reloading of scripts, when user changed a loaded script

3 Integrate other compatible scripting language (but which is compatible with android?)

But why use a scripting component?

  • we can dynamically load game logic into Mundus (making Mundus to a real engine)
  • in future we can extend Mundus to a sandbox (like cryengine) and manipulate the world (set daytime, tree growth and other world/physics parameter)

What do you think? Do we need scripting add all, how far will this project go?

Duplicate GameObjects

In the outline you should be able to duplicate game objects.
-> deep copy of game object with all children + attached components

The project can't be run on MacOS X

Hi,
Considering you've switched this project to use LWJGL3, these changes require passing additional property to JVM on MacOS X( any 7\8 jvm will fail): -XstartOnFirstThread
Otherwise application fails during the start with the following:
Exception in thread "main" java.lang.ExceptionInInitializerError at org.lwjgl.glfw.GLFW.glfwShowWindow(GLFW.java:1689) at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window.setVisible(Lwjgl3Window.java:174) at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.createWindow(Lwjgl3Application.java:326) at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.<init>(Lwjgl3Application.java:92) at com.mbrlabs.mundus.Main.main(Main.java:40) Caused by: java.lang.IllegalStateException: Please run the JVM with -XstartOnFirstThread and make sure a window toolkit other than GLFW (e.g. AWT or JavaFX) is not initialized. at org.lwjgl.glfw.EventLoop$OnScreen.<clinit>(EventLoop.java:64) ... 5 more

The fix that worked for me was modification of the editor/build.gradle script with extension of the task run with the following:
jvmArgs "-XstartOnFirstThread"
There is another issue with LWJGL3 and keyboard input that I will post separately.

Async loading/storing

Currently all load/store operations happen on the UI thread. While this is not a problem for small scenes, the editor is going to be unresponsive if they get bigger.

This requires also a load/store process dialog while the operation is running. The best way to do this is probably to have something like an AsyncTask (see how Android does it).

Model import

Make ModelImportDialog UI more intuative.
Also inform user about fbx-conv if not set in the settings dialog.
Currently the editor crashes when trying to import a fbx model and the binary path to fbx-conv is not set correctly.

New mundus fails to start.

After last tons of changes with assets there is an issue with mundus.

  1. It can't start failing during startup with ArrayIndexOutOfBounds exception in the last project load code.
  2. In order to cleanup any old artifacts of Mundus I have removed .mundus folder. After removal of the .mundus subfolder from the User's folder, Mundus fails to start with the following exception:

`

:editor:run[23:08][Fatal][Log] java.io.IOException: The system cannot find the path specified
    at java.io.WinNTFileSystem.createFileExclusively(Native Method)
    at java.io.File.createNewFile(File.java:1012)
    at com.mbrlabs.mundus.utils.Log.prepareLogFile(Log.java:92)
    at com.mbrlabs.mundus.utils.Log.init(Log.java:70)
    at com.mbrlabs.mundus.Main.main(Main.java:37)

[23:08][Fatal][Log] java.lang.NullPointerException
    at com.mbrlabs.mundus.utils.Log.prepareLogFile(Log.java:98)
    at com.mbrlabs.mundus.utils.Log.init(Log.java:70)
    at com.mbrlabs.mundus.Main.main(Main.java:37)

[23:08][Fatal][Log] Uncaught exception occurred, error report will be saved

Exception: java.lang.NullPointerException thrown from the UncaughtExceptionHandler in thread "main"

`
The problem is it doesn't create the .mundus subfolder under Windows user's folder.
Also, just wondering -- is it typo or "as designed" -- the name of the log file is mundusspacedate.log?

Projects loading is not working any more.

During the start Mundus tries to load the last project. If you have exited Mundus with "Exit" option in Exit Dialog and not the "Save and Exit" option, the following behaviour occurs:

Unf-ly, something is really wrong in the latest version -- projects loads suc-ly, but the view misses objects and terrain:
image

Please check the log of start:
image

And see the actual view.
I've added the new terrain and closed Mundus
Please see the log of Mundus shutdown:
image

As one can see, Mundus still has all the assets it has loaded during the start. But nothing was visual, and tree was empty. :(

Model components with individual materials

Currently all model assets have one or more default materials. All model components that use this model asset adopt these materials and you can not change the material of model components individually.

Model components must store the materials asset ids they use by themselves. This way, the can change materials assets and modify them.

Improve: Models should respect the slope of the terrain when they are being placed.

Currently, when one puts the model to some point on terrain, the model has its normal always facing Y-UP(0,1,0). IMHO, model should respect the slope of the terrain when user places it. It means it should ac-ly respect the normal at the point of terrain. Please see the image with example how it looks like after the corresponding code change:
mundus-improvement-malign

At least, we should give an option to the user if he wants his model to respect the slope of the terrain.
This is improvement, not a bug :)

Mundus Logo/Icon

Hey guys,
for the first real usable release it would be cool if we had a project logo.

We need 2 logos/icons:

  • A simplified one for the top left corner of the editor and as application icon
  • A big logo for a project website, splash screen, etc..

Unfortunately i'm not very artistic. So this is the current placeholder:

icon

3d Model thumbnail creation

Render model to offscreen framebuffer, fetch pixel data and save image thumbnail.
This feature can be developed independently as util class. This will be useful for #43

Asset browser improvements

  • Rename assets
  • Delete assets (check for asset usage before allowing that)
  • Organize assets in folders
  • Search by name
  • Filter by asset type

Unable to load assets in editor

When I select an asset like a tree, I see in the dialog the tree rotating, but when I try to import, nothing happens. I can supply screenshots if necessary.

Extending this to a full game engine?

Since the world editor already exists it would be really cool to extend it into a more feature rich game engine/creator similar to unreal and unity.
I would like to contribute. Its also ok if you dont want to since I can fork the project and extend it by myself.

NullPointerException on build.

I tried building the project from the command line and after the dependencies were downloaded, I got a NullPointerException. Here is the full message:

[08:34][Fatal] java.lang.NullPointerException
at com.mbrlabs.mundus.core.Mundus.dispose(Mundus.java:238)
at com.mbrlabs.mundus.Editor.dispose(Editor.java:234)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window.dispose(Lwjgl3Window.java:281)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.cleanup(Lwjgl3Application.java:153)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.<init>(Lwjgl3Application.java:104)
at com.mbrlabs.mundus.Main.main(Main.java:51)

When dispose is called, goPicker, toolManager, commandHistory, and projectManager are null. When I tried to comment out those dispose() calls, I got this error:

[08:35][Fatal] java.lang.IllegalStateException: frame buffer couldn't be constructed: incomplete     attachment
at com.badlogic.gdx.graphics.glutils.GLFrameBuffer.build(GLFrameBuffer.java:223)
at com.badlogic.gdx.graphics.glutils.GLFrameBuffer.<init>(GLFrameBuffer.java:118)
at com.badlogic.gdx.graphics.glutils.FrameBuffer.<init>(FrameBuffer.java:57)
at com.badlogic.gdx.graphics.glutils.FrameBuffer.<init>(FrameBuffer.java:45)
at com.mbrlabs.mundus.tools.picker.BasePicker.<init>(BasePicker.java:40)
at com.mbrlabs.mundus.tools.picker.GameObjectPicker.<init>(GameObjectPicker.java:39)
at com.mbrlabs.mundus.core.Mundus.init(Mundus.java:105)
at com.mbrlabs.mundus.Editor.create(Editor.java:83)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window.initializeListener(Lwjgl3Window.java:272)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window.update(Lwjgl3Window.java:239)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.loop(Lwjgl3Application.java:127)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.<init>(Lwjgl3Application.java:97)
at com.mbrlabs.mundus.Main.main(Main.java:51)

[08:35][Fatal] Uncaught exception occurred, error report will be saved

I don't know enough about Libgdx or this project to fix the bug but hopefully it can be fixed. This happened on macOS.

Materials

Add materials to everything, that can be rendered. This consists of 3 parts:

  1. Add Ui elements to deal with material values (inspector; per component widget)
  2. Update all shaders, so that they can handle materials
  3. Update the Kryo serialization for all components that have materials

Do we need bulk selection mechanism and support for bulk operations?

Hi All,
Want to use this issue as disc-n for the titled topic.
IMHO, bulk operations are really important for any world editor:

  1. we can apply the same material to multiple game objects
  2. we can set the same orientations or scale to the group of objects or translate them by some coordinates difference.
  3. in real engine we will also specify game properties, kinda speed, stamina, health, etc.
  4. etc.

The multiple selection should be possible from the tree navigator and with ribbon lasso in the world's view, e.g.:
image

What do you think guys?

Documentation

Could you add some user documentation to the wiki? I built Mundus from the Git repo, downloaded the MundusDemo project from the other Github project, but all I could figure out how to do was move the camera XYZ with the QWEASD keys. I installed (and tested) fbx-conv and pointed to it in Mundus settings, but still all OBJ imports failed, advising to pick the right file and set the right fbx-conv. Clicking Add Component didn't seem to add a component, etc. How to exercise these features (and whatever else, like procedural terrain generation, etc)?

ERROR!

I have an exception:
java.io.FileNotFoundException: C:\Users\LINKOR.mundus\mundus.registry (Не удается найти указанный файл)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.(FileInputStream.java:138)
at java.io.FileInputStream.(FileInputStream.java:93)
at com.mbrlabs.mundus.editor.core.kryo.KryoManager.loadRegistry(KryoManager.java:94)
at com.mbrlabs.mundus.editor.Mundus.(Mundus.kt:93)
at com.mbrlabs.mundus.editor.Mundus.(Mundus.kt:54)
at com.mbrlabs.mundus.editor.Editor.create(Editor.kt:62)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window.initializeListener(Lwjgl3Window.java:416)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window.update(Lwjgl3Window.java:364)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.loop(Lwjgl3Application.java:136)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.(Lwjgl3Application.java:110)
at com.mbrlabs.mundus.editor.Main.launchEditor(Main.kt:52)
at com.mbrlabs.mundus.editor.Main.main(Main.kt:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
[09:08][Fatal][Log] com.badlogic.gdx.utils.GdxRuntimeException: java.lang.ExceptionInInitializerError
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.(Lwjgl3Application.java:116)
at com.mbrlabs.mundus.editor.Main.launchEditor(Main.kt:52)
at com.mbrlabs.mundus.editor.Main.main(Main.kt:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.ExceptionInInitializerError
at com.mbrlabs.mundus.editor.Editor.setupInput(Editor.kt:96)
at com.mbrlabs.mundus.editor.Editor.create(Editor.kt:70)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window.initializeListener(Lwjgl3Window.java:416)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window.update(Lwjgl3Window.java:364)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.loop(Lwjgl3Application.java:136)
at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.(Lwjgl3Application.java:110)
... 7 more
Caused by: com.badlogic.gdx.utils.GdxRuntimeException: No com.badlogic.gdx.scenes.scene2d.ui.Window$WindowStyle registered with name: default
at com.badlogic.gdx.scenes.scene2d.ui.Skin.get(Skin.java:154)
at com.badlogic.gdx.scenes.scene2d.ui.Window.(Window.java:61)
at com.kotcrab.vis.ui.widget.VisWindow.(VisWindow.java:52)
at com.kotcrab.vis.ui.widget.VisWindow.(VisWindow.java:47)
at com.kotcrab.vis.ui.widget.file.FileChooser.(FileChooser.java:170)
at com.kotcrab.vis.ui.widget.file.FileChooser.(FileChooser.java:162)
at com.mbrlabs.mundus.editor.ui.UI.(UI.kt:58)
at com.mbrlabs.mundus.editor.ui.UI.(UI.kt:47)
... 13 more

[09:08][Fatal][Log] Uncaught exception occurred, error report will be saved
I ran Mundus in IntelliJ IDEA...

Uber bug with assets.

Ok, so the latest version has complitely redesigned assets manager. Which comes with lots of issues.
Please see the image attached.
textures_loading_management_issues

In short:

  1. The "Assets" menu lets you load only models, not textures.
  2. To load texture one can use only submenu of the button before "Gift box button".
  3. One can load the same texture multiple times which is waste of the resources.
  4. Assets outline shows only models, not textures. :(

AWT can't be used with LWJGL3 on MacOS X

As continuation of the
#4

After I've passed the corresponding param to jvm via modified run task, Mundus editor has successfully started. But when I've tried WSAD keys to move my camera around -- the Mundus window has disappeared( but the process wasn't killed). I had 3 retries with the same result. So I've tried to figure out and it seems that the statement from GLFW in exception covers the reason:

Please run the JVM with -XstartOnFirstThread and
make sure a window toolkit other than GLFW (e.g. AWT or JavaFX) is not initialized.
at org.lwjgl.glfw.EventLoop

I have added jvmArgs "-Djava.awt.headless=true" to the run task extended in #4
and had to remove the GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); from com.mbrlabs.mundus.Main because it throws exception in headless mode.

After such set of changes everything works like a charm.

Child node translation

  1. Set a game object C as child node of node P.
  2. Rotate P
  3. C now translates on the rotated axis of the parent node.

That's not really a bug, but confusing, since the translation handles of the tool are world axis aligned.
Make it so, that one can switch between local & global space.

New feature: Minimap with navigation means.

Hi All, just bringing new idea. :)
I think, we need Minimap functionality with support for navigation by click.
Minimap should show heights of terrain( probably by using some pallette to distinguish different heights). Also, it should show all the gameobjects as dots\circles\etc.
By clicking on some region of minimap, camera will be immediately relocated to the corresponding position on the corresponding terrain.

Plugin system

Define a stable editor api and load plugins at runtime. More like a v.0.2.0 feature

Api scope:

  • Manipulation of the scene graph
  • Access to some ui elements
  • Creation of new ui elements
  • ...

v0.0.8 checklist

  • Refactor entity component system
  • Write unit tests for the scene graph
  • Fix relative transformation of scene graph objects
  • Implement game object scaling (just scaling, the tool comes later)

Material system

Materials are special asset files, that describe the material of a model or anything that can be rendered.
Thy can be be created, edited and assigned to models.

Improve the tool manager

When switching between tools, the last selected tool should be used for all subsequent clicks on game objects.
This is especially important if the user selects a game object from the outline.

Currently the tool defaults back to the translate tool if the game object is deselected using the ESC key.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.