Skip to content

Commit

Permalink
Merge pull request #143 from Dgzt/water-add-dialog
Browse files Browse the repository at this point in the history
Water add dialog
  • Loading branch information
JamesTKhan authored Mar 29, 2023
2 parents c2a6dd7 + 19898fd commit 55c6bb3
Show file tree
Hide file tree
Showing 6 changed files with 148 additions and 45 deletions.
1 change: 1 addition & 0 deletions editor/CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
- Duplicate materials from inspector
- Show brush selection
- Object picker can use with left mouse button. Switchable in the settings
- Water creation dialog

[0.4.2] ~ 10/24/2022
- Fix shader compilation error for Terrain when using normal maps
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -822,7 +822,7 @@ class EditorAssetManager(assetsRoot: FileHandle) : AssetManager(assetsRoot) {
return copy
}

fun createWaterAsset(name: String): WaterAsset {
fun createWaterAsset(name: String, width: Int): WaterAsset {
val waterFileName = "$name.water"
val metaFilename = "$waterFileName.meta"

Expand All @@ -842,6 +842,7 @@ class EditorAssetManager(assetsRoot: FileHandle) : AssetManager(assetsRoot) {

val asset = WaterAsset(meta, FileHandle(file))
asset.load()
asset.water.waterWidth = width

// set base textures
asset.applyDependencies()
Expand Down
14 changes: 2 additions & 12 deletions editor/src/main/com/mbrlabs/mundus/editor/ui/UI.kt
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,7 @@ import com.mbrlabs.mundus.editor.preferences.MundusPreferencesManager
import com.mbrlabs.mundus.editor.ui.modules.MundusToolbar
import com.mbrlabs.mundus.editor.ui.modules.outline.Outline
import com.mbrlabs.mundus.editor.ui.modules.StatusBar
import com.mbrlabs.mundus.editor.ui.modules.dialogs.AddComponentDialog
import com.mbrlabs.mundus.editor.ui.modules.dialogs.AddTerrainDialog
import com.mbrlabs.mundus.editor.ui.modules.dialogs.AmbientLightDialog
import com.mbrlabs.mundus.editor.ui.modules.dialogs.DirectionalLightsDialog
import com.mbrlabs.mundus.editor.ui.modules.dialogs.ExitDialog
import com.mbrlabs.mundus.editor.ui.modules.dialogs.ExportDialog
import com.mbrlabs.mundus.editor.ui.modules.dialogs.FogDialog
import com.mbrlabs.mundus.editor.ui.modules.dialogs.KeyboardShortcutsDialog
import com.mbrlabs.mundus.editor.ui.modules.dialogs.NewProjectDialog
import com.mbrlabs.mundus.editor.ui.modules.dialogs.ShadowSettingsDialog
import com.mbrlabs.mundus.editor.ui.modules.dialogs.SkyboxDialog
import com.mbrlabs.mundus.editor.ui.modules.dialogs.VersionDialog
import com.mbrlabs.mundus.editor.ui.modules.dialogs.*
import com.mbrlabs.mundus.editor.ui.modules.dialogs.assets.AssetPickerDialog
import com.mbrlabs.mundus.editor.ui.modules.dialogs.importer.ImportModelDialog
import com.mbrlabs.mundus.editor.ui.modules.dialogs.importer.ImportTextureDialog
Expand Down Expand Up @@ -107,6 +96,7 @@ object UI : Stage(ScreenViewport()) {
var shadowSettingsDialog: ShadowSettingsDialog = ShadowSettingsDialog()
var addComponentDialog: AddComponentDialog = AddComponentDialog()
var addTerrainDialog: AddTerrainDialog = AddTerrainDialog()
val addWaterDialog: AddWaterDialog = AddWaterDialog()
val versionDialog: VersionDialog = VersionDialog()
val keyboardShortcuts: KeyboardShortcutsDialog = KeyboardShortcutsDialog()
val debugRenderDialog: DebugRenderDialog = DebugRenderDialog()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,6 @@ class AddTerrainDialog : BaseDialog("Add Terrain") {
// Save context here so that the ID above is persisted in .pro file
kryoManager.saveProjectContext(projectManager.current())

//val name = "Terrain $goID"
val asset: TerrainAsset
try {
// create asset
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
package com.mbrlabs.mundus.editor.ui.modules.dialogs

import com.badlogic.gdx.scenes.scene2d.InputEvent
import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener
import com.kotcrab.vis.ui.util.dialog.Dialogs
import com.kotcrab.vis.ui.widget.VisLabel
import com.kotcrab.vis.ui.widget.VisTable
import com.kotcrab.vis.ui.widget.VisTextButton
import com.kotcrab.vis.ui.widget.VisTextField
import com.mbrlabs.mundus.commons.assets.WaterAsset
import com.mbrlabs.mundus.commons.water.Water
import com.mbrlabs.mundus.editor.Mundus
import com.mbrlabs.mundus.editor.assets.AssetAlreadyExistsException
import com.mbrlabs.mundus.editor.core.kryo.KryoManager
import com.mbrlabs.mundus.editor.core.project.ProjectManager
import com.mbrlabs.mundus.editor.events.AssetImportEvent
import com.mbrlabs.mundus.editor.events.SceneGraphChangedEvent
import com.mbrlabs.mundus.editor.ui.widgets.FloatFieldWithLabel
import com.mbrlabs.mundus.editor.ui.widgets.IntegerFieldWithLabel
import com.mbrlabs.mundus.editor.ui.widgets.ToolTipLabel
import com.mbrlabs.mundus.editor.utils.Log
import com.mbrlabs.mundus.editor.utils.createWaterGO

class AddWaterDialog : BaseDialog("Add Water") {

companion object {
private val TAG = AddWaterDialog::class.java.simpleName
}

private val name = VisTextField("Water")
private val waterWidth = IntegerFieldWithLabel("", -1, false)
private val positionX = FloatFieldWithLabel("", -1, true)
private val positionY = FloatFieldWithLabel("", -1, true)
private val positionZ = FloatFieldWithLabel("", -1, true)

private val generateBtn = VisTextButton("Generate Water")

private var projectManager : ProjectManager
private var kryoManager : KryoManager

init {
isResizable = true

projectManager = Mundus.inject()
kryoManager = Mundus.inject()

setupUI()
setDefaults()
setupListeners()
}

private fun setupUI() {
val root = Table()
// root.debugAll();
root.padTop(6f).padRight(6f).padBottom(22f)
add(root)

// left table
val content = VisTable()
content.defaults().pad(4f)
content.left().top()
content.add(VisLabel("Name: ")).left().padBottom(10f)
content.add(name).fillX().expandX().row()
content.add(ToolTipLabel("Water width: ", "Size of the water, in meters.")).left().padBottom(10f)
content.add(waterWidth).fillX().expandX().row()
content.add(VisLabel("Position on x-axis:")).left().padBottom(10f)
content.add(positionX).fillX().expandX().row()
content.add(VisLabel("Position on y-axis:")).left().padBottom(10f)
content.add(positionY).fillX().expandX().row()
content.add(VisLabel("Position on z-axis: ")).left().padBottom(10f)
content.add(positionZ).fillX().expandX().row()

content.add(generateBtn).fillX().expand().colspan(2).bottom()
root.add(content)
}

private fun setDefaults() {
waterWidth.text = Water.DEFAULT_SIZE.toString()
positionX.text = "0"
positionY.text = "0"
positionZ.text = "0"
}

private fun setupListeners() {
generateBtn.addListener(object : ClickListener() {
override fun clicked(event: InputEvent, x: Float, y: Float) {
super.clicked(event, x, y)
createWater()
}
})
}

private fun createWater() {
try {
val waterName: String = name.text
val width: Int = waterWidth.int
val posX: Float = positionX.float
val posY: Float = positionY.float
val posZ: Float = positionZ.float

try {
Log.trace(TAG, "Add water game object in root node.")
val context = projectManager.current()
val sceneGraph = context.currScene.sceneGraph
val goID = projectManager.current().obtainID()

// Save context here so that the ID above is persisted in .pro file
kryoManager.saveProjectContext(projectManager.current())

val asset: WaterAsset
try {
// create asset
asset = context.assetManager.createWaterAsset(waterName, width)
} catch (ex: AssetAlreadyExistsException) {
Dialogs.showErrorDialog(stage, "An asset with that name already exists.")
return
}
asset.load()
asset.applyDependencies()

val waterGO = createWaterGO(sceneGraph,
null, goID, waterName, asset)
// update sceneGraph
sceneGraph.addGameObject(waterGO)
waterGO.setLocalPosition(posX, posY, posZ)

Mundus.postEvent(SceneGraphChangedEvent())

projectManager.current().assetManager.addNewAsset(asset)
Mundus.postEvent(AssetImportEvent(asset))
Mundus.postEvent(SceneGraphChangedEvent())

close()
} catch (e: Exception) {
e.printStackTrace()
}
} catch (nfe: NumberFormatException) {
Log.error(TAG, nfe.message)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,10 @@ import com.mbrlabs.mundus.commons.scene3d.components.Component
import com.mbrlabs.mundus.editor.Mundus
import com.mbrlabs.mundus.editor.core.kryo.KryoManager
import com.mbrlabs.mundus.editor.core.project.ProjectManager
import com.mbrlabs.mundus.editor.events.AssetImportEvent
import com.mbrlabs.mundus.editor.events.SceneGraphChangedEvent
import com.mbrlabs.mundus.editor.tools.ToolManager
import com.mbrlabs.mundus.editor.ui.UI
import com.mbrlabs.mundus.editor.utils.Log
import com.mbrlabs.mundus.editor.utils.createWaterGO

/**
* Holds code for Outlines right click menu. Separated from Outline class
Expand Down Expand Up @@ -299,35 +297,7 @@ class OutlineRightClickMenu(outline: Outline) : PopupMenu() {
// add waterAsset
addWater.addListener(object : ClickListener() {
override fun clicked(event: InputEvent?, x: Float, y: Float) {
try {
Log.trace(TAG, "Add water game object in root node.")
val context = projectManager.current()
val sceneGraph = context.currScene.sceneGraph
val goID = projectManager.current().obtainID()

// Save context here so that the ID above is persisted in .pro file
kryoManager.saveProjectContext(projectManager.current())

val name = "Water $goID"
// create asset
val asset = context.assetManager.createWaterAsset(name)
asset.load()
asset.applyDependencies()

val waterGO = createWaterGO(sceneGraph,
null, goID, name, asset)
// update sceneGraph
sceneGraph.addGameObject(waterGO)
// update outline
outline.addGoToTree(null, waterGO)

projectManager.current().assetManager.addNewAsset(asset)
Mundus.postEvent(AssetImportEvent(asset))
Mundus.postEvent(SceneGraphChangedEvent())
} catch (e: Exception) {
e.printStackTrace()
}

UI.showDialog(UI.addWaterDialog)
}
})
}
Expand Down

0 comments on commit 55c6bb3

Please sign in to comment.