diff --git a/Coffee3D.iml b/Coffee3D.iml index 2f3880d..5ea20b6 100644 --- a/Coffee3D.iml +++ b/Coffee3D.iml @@ -8,8 +8,8 @@ - + \ No newline at end of file diff --git a/gameContent/assets/world/defaultWorld.map b/gameContent/assets/world/defaultWorld.map index 9796b0a..ed82291 100644 Binary files a/gameContent/assets/world/defaultWorld.map and b/gameContent/assets/world/defaultWorld.map differ diff --git a/imgui.ini b/imgui.ini index 77f2593..0f0daa8 100644 --- a/imgui.ini +++ b/imgui.ini @@ -310,7 +310,7 @@ Collapsed=0 DockId=0x0000000A,1 [Window][statistics] -Pos=188,212 +Pos=57,148 Size=628,651 Collapsed=0 diff --git a/out/production/Coffee3D/META-INF/MANIFEST.MF b/out/production/Coffee3D/META-INF/MANIFEST.MF index 0f6e129..75ebc5d 100644 --- a/out/production/Coffee3D/META-INF/MANIFEST.MF +++ b/out/production/Coffee3D/META-INF/MANIFEST.MF @@ -1,3 +1,3 @@ Manifest-Version: 1.0 -Main-Class: coffee3D.MainGame +Main-Class: coffee3D.Main diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF index 0f6e129..75ebc5d 100644 --- a/src/META-INF/MANIFEST.MF +++ b/src/META-INF/MANIFEST.MF @@ -1,3 +1,3 @@ Manifest-Version: 1.0 -Main-Class: coffee3D.MainGame +Main-Class: coffee3D.Main diff --git a/src/coffee3D/core/maths/MathLibrary.java b/src/coffee3D/core/maths/MathLibrary.java index 087387c..1469093 100644 --- a/src/coffee3D/core/maths/MathLibrary.java +++ b/src/coffee3D/core/maths/MathLibrary.java @@ -78,4 +78,14 @@ public static double GetSegmentDistanceToLine(Vector3f lineOrigin, Vector3f line return distance; } + + public static void LinePlaneIntersection(Vector3f planePoint, Vector3f planeNormal, Vector3f lineDirection, Vector3f lineOrigin, Vector3f hitPoint) { + dir1.set(lineDirection).normalize(); + if (planeNormal.dot(dir1) == 0) { + hitPoint.set(0); + return; + } + float t = (planeNormal.dot(planePoint) - planeNormal.dot(lineOrigin)) / planeNormal.dot(dir1); + hitPoint.set(lineDirection).mul(t).add(lineOrigin); + } } diff --git a/src/coffee3D/core/navigation/NavMeshGrid.java b/src/coffee3D/core/navigation/NavMeshGrid.java index 56bee2b..652643f 100644 --- a/src/coffee3D/core/navigation/NavMeshGrid.java +++ b/src/coffee3D/core/navigation/NavMeshGrid.java @@ -1,36 +1,45 @@ package coffee3D.core.navigation; -import coffee3D.core.io.log.Log; import org.joml.Vector2i; import org.joml.Vector3f; +import java.io.Serializable; import java.util.ArrayList; -public class NavMeshGrid { +public class NavMeshGrid implements Serializable { + + private static final long serialVersionUID = -4528707062414566942L; + private final NavmeshPoint[] _navMesh; private final Vector3f _navmeshLocation; private final Vector2i _size; private final float _cellSize; - - public NavMeshGrid(Vector3f navMeshLocation, NavmeshPoint[] navMesh, Vector2i navmeshSize, float cellSize) { - _navMesh = navMesh; + public NavMeshGrid(Vector3f navMeshLocation, Vector2i navmeshSize, float cellSize) { + _navMesh = new NavmeshPoint[navmeshSize.x * navmeshSize.y]; _navmeshLocation = navMeshLocation; _size = navmeshSize; _cellSize = cellSize; - if (navMesh.length != navmeshSize.x * navmeshSize.y) Log.Fail("invalid navmesh values"); for (int i = 0; i < _navMesh.length; ++i) { - _navMesh[i].location.set(i % _size.x, i / _size.y); + _navMesh[i] = new NavmeshPoint(); + _navMesh[i].location.set(i % _size.x, i / _size.x); + _navMesh[i].isNavigable = false; } } + public Vector3f getNavmeshLocation() { return _navmeshLocation; } + + public final NavmeshPoint[] getNavmesh() { + return _navMesh; + } + + public float getCellSize() { return _cellSize; } + public Vector2i getGridSize() { return _size; } public NavigationPath findPathToLocation(Vector3f from, Vector3f to) { NavmeshPoint start = findClosestNavmeshPoint(from); NavmeshPoint end = findClosestNavmeshPoint(to); ArrayList pathPoints = new ArrayList<>(); - - return new NavigationPath(null); } @@ -56,15 +65,15 @@ public NavmeshPoint findClosestNavmeshPoint(Vector3f worldPosition) { public void worldToLocal(Vector3f world, Vector2i local) { local.set( - (int) ((world.x - _navmeshLocation.x) * _cellSize), - (int) ((world.y - _navmeshLocation.y) * _cellSize) + (int) ((world.x - _navmeshLocation.x) / _cellSize + _cellSize / 2), + (int) ((world.y - _navmeshLocation.y) / _cellSize + _cellSize / 2) ); } public void localToWorld(Vector2i local, Vector3f world) { world.set( - (local.x / _cellSize) + _navmeshLocation.x, - (local.y / _cellSize) + _navmeshLocation.y, + (local.x * _cellSize) + _navmeshLocation.x, + (local.y * _cellSize) + _navmeshLocation.y, _navmeshLocation.z ); } diff --git a/src/coffee3D/core/navigation/NavigableActor.java b/src/coffee3D/core/navigation/NavigableActor.java index 9dda631..8de9840 100644 --- a/src/coffee3D/core/navigation/NavigableActor.java +++ b/src/coffee3D/core/navigation/NavigableActor.java @@ -7,6 +7,8 @@ public class NavigableActor extends SceneComponent { + private static final long serialVersionUID = 2644030132802605634L; + public NavigableActor(Vector3f position, Quaternionf rotation, Vector3f scale) { super(position, rotation, scale); } diff --git a/src/coffee3D/core/navigation/NavmeshComponent.java b/src/coffee3D/core/navigation/NavmeshComponent.java new file mode 100644 index 0000000..d06e5e7 --- /dev/null +++ b/src/coffee3D/core/navigation/NavmeshComponent.java @@ -0,0 +1,161 @@ +package coffee3D.core.navigation; + +import coffee3D.core.maths.MathLibrary; +import coffee3D.core.renderer.RenderMode; +import coffee3D.core.renderer.RenderUtils; +import coffee3D.core.renderer.Window; +import coffee3D.core.renderer.debug.DebugRenderer; +import coffee3D.core.renderer.scene.RenderScene; +import coffee3D.core.renderer.scene.Scene; +import coffee3D.core.renderer.scene.SceneComponent; +import coffee3D.core.types.Color; +import coffee3D.core.types.SphereBound; +import coffee3D.core.types.TypeHelper; +import org.joml.Quaternionf; +import org.joml.Vector2i; +import org.joml.Vector3f; +import org.lwjgl.glfw.GLFW; + +import static org.lwjgl.opengl.GL11.*; + +public class NavmeshComponent extends SceneComponent { + + private static final long serialVersionUID = -4773537143224102110L; + + protected int _sizeX; + protected int _sizeY; + protected float _cellSize; + private NavMeshGrid _navmesh; + private transient SphereBound bounds; + + public NavmeshComponent(Vector3f position, Quaternionf rotation, Vector3f scale) { + super(position, rotation, scale); + _sizeX = 100; + _sizeY = 40; + _cellSize = 1f; + newNavmesh(); + } + + @Override + protected void draw(Scene context) {} + + @Override + public void postDraw(Scene context) { + super.draw(context); + + if (_cellSize != _navmesh.getCellSize() || + _sizeX != _navmesh.getGridSize().x || + _sizeY != _navmesh.getGridSize().y + ) newNavmesh(); + + _navmesh.getNavmeshLocation().set(getWorldPosition()); + if (isSelected()) { + visualize((RenderScene) context); + edit((RenderScene) context); + } + } + + + @Override + public SphereBound getBound() { + if (bounds == null) { + bounds = new SphereBound(); + } + bounds.radius = _cellSize * Math.max(_sizeX, _sizeY); + bounds.position.set(getWorldPosition()); + return bounds; + } + + private void newNavmesh() { + _navmesh = new NavMeshGrid(getWorldPosition(), new Vector2i(_sizeX, _sizeY), _cellSize); + } + + private transient Vector3f _center; + private transient Vector3f _worldPosA; + private transient Vector3f _worldPosB; + private transient Vector3f _worldPosC; + private transient Vector3f _worldPosD; + private transient Color navigableColor; + private transient Color notNavigableColor; + private transient Color selectionColor; + + private void visualize(RenderScene context) { + + if (_center == null) _center = new Vector3f(); + if (_worldPosA == null) _worldPosA = new Vector3f(); + if (_worldPosB == null) _worldPosB = new Vector3f(); + if (_worldPosC == null) _worldPosC = new Vector3f(); + if (_worldPosD == null) _worldPosD = new Vector3f(); + if (navigableColor == null) navigableColor = new Color(0, 1, 0, 0.8f); + if (notNavigableColor == null) notNavigableColor = new Color(1, 0, 0, 0.2f); + if (selectionColor == null) selectionColor = new Color(1, 1, 0, 0.5f); + + if (RenderUtils.RENDER_MODE == RenderMode.Select) { + RenderUtils.getPickMaterialDrawList()[0].use(context); + RenderUtils.getPickMaterialDrawList()[0].getResource().setIntParameter("pickId", getComponentIndex() + 1); + RenderUtils.getPickMaterialDrawList()[0].getResource().setModelMatrix(TypeHelper.getMat4().identity()); + + _worldPosA.set(getWorldPosition()); + _worldPosB.set(_worldPosA).add(_sizeX * _cellSize, 0, 0); + _worldPosC.set(_worldPosA).add(_sizeX * _cellSize, _sizeY * _cellSize, 0); + _worldPosD.set(_worldPosA).add(0, _sizeY * _cellSize, 0); + + glMatrixMode(GL_MODELVIEW); + glBegin(GL_QUADS); + { + glVertex3f(_worldPosA.x, _worldPosA.y, _worldPosA.z); + glVertex3f(_worldPosB.x, _worldPosB.y, _worldPosB.z); + glVertex3f(_worldPosC.x, _worldPosC.y, _worldPosC.z); + glVertex3f(_worldPosD.x, _worldPosD.y, _worldPosD.z); + } + glEnd(); + } + + if (RenderUtils.RENDER_MODE != RenderMode.Color) return; + + DebugRenderer.DrawDebugBox(context, getWorldPosition(), _worldPosA.set(getWorldPosition()).add(_sizeX * _cellSize, _sizeY * _cellSize, 0), Color.BLUE); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + float halfGridSize = _navmesh.getCellSize() / 2; + RenderUtils.getDebugMaterial().getResource().setModelMatrix(TypeHelper.getMat4().identity()); + + for (NavmeshPoint _points : _navmesh.getNavmesh()) { + _navmesh.localToWorld(_points.location, _center); + _worldPosA.set(_center).add(-halfGridSize, -halfGridSize, 0); + _worldPosB.set(_center).add(halfGridSize, -halfGridSize, 0); + _worldPosC.set(_center).add(halfGridSize, halfGridSize, 0); + _worldPosD.set(_center).add(-halfGridSize, halfGridSize, 0); + + RenderUtils.getDebugMaterial().use(context); + RenderUtils.getDebugMaterial().setColor(_points.isNavigable ? navigableColor : notNavigableColor); + glMatrixMode(GL_MODELVIEW); + glBegin(GL_QUADS); + { + glVertex3f(_worldPosA.x, _worldPosA.y, _worldPosA.z); + glVertex3f(_worldPosB.x, _worldPosB.y, _worldPosB.z); + glVertex3f(_worldPosC.x, _worldPosC.y, _worldPosC.z); + glVertex3f(_worldPosD.x, _worldPosD.y, _worldPosD.z); + } + glEnd(); + } + glDisable(GL_BLEND); + } + + private static final Vector3f Inter = new Vector3f(); + private static final Vector3f up = new Vector3f(0, 0, 1); + private static final Vector3f camDir = new Vector3f(0); + private static final Vector2i local = new Vector2i(0); + + private void edit(RenderScene scene) { + + if (GLFW.glfwGetMouseButton(Window.GetPrimaryWindow().getGlfwWindowHandle(), GLFW.GLFW_MOUSE_BUTTON_1) == GLFW.GLFW_PRESS) { + scene.getCursorSceneDirection(camDir); + MathLibrary.LinePlaneIntersection(getWorldPosition(), up, camDir, scene.getCamera().getWorldPosition(), Inter); + _navmesh.worldToLocal(Inter, local); + if (_navmesh.getPoint(local) != null) { + _navmesh.getPoint(local).isNavigable = GLFW.glfwGetKey(Window.GetPrimaryWindow().getGlfwWindowHandle(), GLFW.GLFW_KEY_LEFT_SHIFT) != GLFW.GLFW_PRESS; + } + } + } +} diff --git a/src/coffee3D/core/navigation/NavmeshPoint.java b/src/coffee3D/core/navigation/NavmeshPoint.java index 2e04d3e..69ca2d3 100644 --- a/src/coffee3D/core/navigation/NavmeshPoint.java +++ b/src/coffee3D/core/navigation/NavmeshPoint.java @@ -2,7 +2,10 @@ import org.joml.Vector2i; -public class NavmeshPoint { +import java.io.Serializable; + +public class NavmeshPoint implements Serializable { + private static final long serialVersionUID = 6011416635037746495L; public boolean isNavigable = false; public final Vector2i location = new Vector2i(); } diff --git a/src/coffee3D/core/navigation/navmeshComponent.java b/src/coffee3D/core/navigation/navmeshComponent.java deleted file mode 100644 index 5933ee5..0000000 --- a/src/coffee3D/core/navigation/navmeshComponent.java +++ /dev/null @@ -1,14 +0,0 @@ -package coffee3D.core.navigation; - -import coffee3D.core.renderer.scene.SceneComponent; -import org.joml.Quaternionf; -import org.joml.Vector3f; - -public class navmeshComponent extends SceneComponent { - - public navmeshComponent(Vector3f position, Quaternionf rotation, Vector3f scale) { - super(position, rotation, scale); - } - - -} diff --git a/src/coffee3D/core/renderer/scene/DrawList.java b/src/coffee3D/core/renderer/scene/DrawList.java index 3da180c..3957a72 100644 --- a/src/coffee3D/core/renderer/scene/DrawList.java +++ b/src/coffee3D/core/renderer/scene/DrawList.java @@ -43,7 +43,15 @@ private void sortDrawList() { }); } + public void preRender(RenderScene context) { + for (SceneComponent component : frustumDrawList) component.preDrawInternal(context); + } + public void render(RenderScene context) { for (SceneComponent component : frustumDrawList) component.drawInternal(context); } + + public void postRender(RenderScene context) { + for (SceneComponent component : frustumDrawList) component.postDrawInternal(context); + } } diff --git a/src/coffee3D/core/renderer/scene/HitResult.java b/src/coffee3D/core/renderer/scene/HitResult.java index e52fcf1..40c0e39 100644 --- a/src/coffee3D/core/renderer/scene/HitResult.java +++ b/src/coffee3D/core/renderer/scene/HitResult.java @@ -43,9 +43,11 @@ protected void update(RenderScene scene, Framebuffer pickBuffer) { drawList.build(scene.getComponents(), viewMatrix, Scene.getProjection(pickBuffer.getWidth(), pickBuffer.getHeight(), scene.getCamera())); - RenderUtils.CheckGLErrors(); + drawList.preRender(scene); + glClear(GL_DEPTH_BUFFER_BIT); drawList.render(scene); - RenderUtils.CheckGLErrors(); + glClear(GL_DEPTH_BUFFER_BIT); + drawList.postRender(scene); glReadPixels(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, _hitColor); glReadPixels(0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, _hitDepth); diff --git a/src/coffee3D/core/renderer/scene/RenderScene.java b/src/coffee3D/core/renderer/scene/RenderScene.java index f46137b..a77188a 100644 --- a/src/coffee3D/core/renderer/scene/RenderScene.java +++ b/src/coffee3D/core/renderer/scene/RenderScene.java @@ -121,7 +121,11 @@ public boolean renderScene() { glDisable(GL_CULL_FACE); glCullFace(GL_FRONT); glFrontFace(GL_CW); + _drawList.preRender(this); + glClear(GL_DEPTH_BUFFER_BIT); _drawList.render(this); + glClear(GL_DEPTH_BUFFER_BIT); + _drawList.postRender(this); } else if (_sceneSettings.hasStencilBuffer()) _stencilBuffer.use(this); @@ -184,9 +188,12 @@ public void preDraw() { skyBoxMesh.setMaterial(getSkyboxMaterial(), 0); skyBoxMesh.drawInternal(this); } + _drawList.preRender(this); } - public void postDraw() {} + public void postDraw() { + _drawList.postRender(this); + } public void resizeBuffers(int sizeX, int sizeY) { if (_colorBuffer != null) _colorBuffer.resizeFramebuffer(sizeX, sizeY); diff --git a/src/coffee3D/core/renderer/scene/SceneComponent.java b/src/coffee3D/core/renderer/scene/SceneComponent.java index 4e12a5e..cc58949 100644 --- a/src/coffee3D/core/renderer/scene/SceneComponent.java +++ b/src/coffee3D/core/renderer/scene/SceneComponent.java @@ -31,10 +31,13 @@ public class SceneComponent implements Serializable { private static final long serialVersionUID = 744620683032598971L; protected String _componentName; - protected transient int _stencilValue; + private transient int _stencilValue; + private transient boolean _isSelected; public int getStencilValue() { return _stencilValue; } public void setStencilValue(int stencilValue) { _stencilValue = stencilValue; } + public void setIsSelected(boolean isSelected) { setStencilValue(isSelected ? 1 : 0); _isSelected = isSelected; } + public boolean isSelected() { return _isSelected; } public String getComponentName() { return _componentName; @@ -61,6 +64,14 @@ public SceneComponent(Vector3f position, Quaternionf rotation, Vector3f scale) { _stencilValue = 0; } + protected final void preDrawInternal(Scene context) { + preDraw(context); + if (_children != null) { + for (SceneComponent comp : _children) { + comp.preDrawInternal(context); + } + } + } /** * draw a root component and its children to given scene @@ -75,6 +86,17 @@ protected final void drawInternal(Scene context) { } } + protected final void postDrawInternal(Scene context) { + postDraw(context); + if (_children != null) { + for (SceneComponent comp : _children) { + comp.postDrawInternal(context); + } + } + } + + protected void preDraw(Scene context) {} + /** * implement to draw stuff * @param context scene context @@ -83,6 +105,8 @@ protected void draw(Scene context) { drawBillboard(context, null, (float) Math.max(0.3, Math.min(2, ((RenderScene)context).getCamera().getWorldPosition().distance(getWorldPosition()) / 50))); } + protected void postDraw(Scene context) {} + public TextureResource getComponentIcon() { return AssetReferences.GetIconSceneComponent().getResource(); } private static MeshResource _billboardMesh; diff --git a/src/coffee3D/editor/components/GizmoComponent.java b/src/coffee3D/editor/components/GizmoComponent.java index 7d59a42..6c2ead9 100644 --- a/src/coffee3D/editor/components/GizmoComponent.java +++ b/src/coffee3D/editor/components/GizmoComponent.java @@ -70,7 +70,7 @@ public GizmoMovementDirection getGizmoMovementMode() { } @Override - public void draw(Scene context) { + public void postDraw(Scene context) { float mouseDeltaX = (float) IEngineModule.Get().GetController().getCursorPosX() - mousePosX; float mouseDeltaY = (float) IEngineModule.Get().GetController().getCursorPosY() - mousePosY; mousePosX = (float) IEngineModule.Get().GetController().getCursorPosX(); diff --git a/src/coffee3D/editor/renderer/EditorScene.java b/src/coffee3D/editor/renderer/EditorScene.java index b96e49d..5cb2906 100644 --- a/src/coffee3D/editor/renderer/EditorScene.java +++ b/src/coffee3D/editor/renderer/EditorScene.java @@ -8,16 +8,19 @@ public class EditorScene extends RenderScene { private final GizmoComponent _gizmo = new GizmoComponent(); - public EditorScene(RenderSceneSettings settings) { super(settings); } + @Override + public void preDraw() { + super.preDraw(); + } + @Override public void postDraw() { super.postDraw(); - - _gizmo.draw(this); + _gizmo.postDraw(this); } public GizmoComponent getGizmo() { diff --git a/src/coffee3D/editor/ui/EditorUI.java b/src/coffee3D/editor/ui/EditorUI.java index a3ce584..07ca3c3 100644 --- a/src/coffee3D/editor/ui/EditorUI.java +++ b/src/coffee3D/editor/ui/EditorUI.java @@ -46,7 +46,6 @@ public static void DrawMenuBar(RenderScene context) { if (ImGui.menuItem("Content browser")) new ContentBrowser("Content browser"); ImGui.separator(); if (ImGui.menuItem("Resource viewer")) new ResourcesViewer("resource viewer"); - if (ImGui.menuItem("Stat window")) new StatWindow(context, "Stat window"); ImGui.separator(); if (ImGui.menuItem("Style editor")) new StyleEditor("Style editor"); if (ImGui.menuItem("Engine settings")) new EngineSettingsViewer("Engine settings"); diff --git a/src/coffee3D/editor/ui/levelEditor/LevelEditorViewport.java b/src/coffee3D/editor/ui/levelEditor/LevelEditorViewport.java index 20d5258..fb1eba9 100644 --- a/src/coffee3D/editor/ui/levelEditor/LevelEditorViewport.java +++ b/src/coffee3D/editor/ui/levelEditor/LevelEditorViewport.java @@ -9,6 +9,7 @@ import coffee3D.core.io.inputs.IInputListener; import coffee3D.core.io.log.Log; import coffee3D.core.io.settings.EngineSettings; +import coffee3D.core.navigation.NavmeshComponent; import coffee3D.core.renderer.RenderUtils; import coffee3D.core.renderer.scene.Components.AudioComponent; import coffee3D.core.renderer.scene.Components.BillboardComponent; @@ -63,6 +64,10 @@ protected void draw() { }); ImGui.endMenu(); } + if (ImGui.beginMenu("add")) { + if (ImGui.menuItem("Navmesh")) addNavmesh(); + ImGui.endMenu(); + } if (ImGui.beginMenu("debug")) { if (ImGui.menuItem(getScene().isFrustumFrozen() ? "unfreeze frustum culling" : "freeze frustum culling")) getScene().freezeFrustum(!getScene().isFrustumFrozen()); @@ -105,29 +110,12 @@ protected void draw() { { String assetName = new String(data); Asset droppedAsset = AssetManager.FindAsset(assetName); - Vector3f position; - if (getScene().getHitResult().component != null) { - position = new Vector3f(getScene().getHitResult().position); - } - else { - if (droppedAsset instanceof StaticMesh) { - position = new Vector3f( - getScene().getCamera().getForwardVector()) - .mul(2 * ((StaticMesh) droppedAsset).getBound().radius) - .add(getScene().getCamera().getRelativePosition()) - .sub(((StaticMesh) droppedAsset).getBound().position); - } - else { - position = new Vector3f( - getScene().getCamera().getForwardVector()).mul(2).add(getScene().getCamera().getRelativePosition()); - } - } if (droppedAsset instanceof StaticMesh) { StaticMeshComponent sm = new StaticMeshComponent( (StaticMesh)droppedAsset, - position, + getDropPosition(droppedAsset), new Quaternionf().identity(), new Vector3f(1,1,1)); sm.attachToScene(getScene()); @@ -138,7 +126,7 @@ protected void draw() { if (droppedAsset instanceof Texture2D) { BillboardComponent bb = new BillboardComponent( (Texture2D)droppedAsset, - new Vector3f(getScene().getCamera().getForwardVector()).mul(2).add(getScene().getCamera().getRelativePosition()), + getDropPosition(droppedAsset), new Quaternionf().identity(), new Vector3f(1,1,1)); bb.attachToScene(getScene()); @@ -149,7 +137,7 @@ protected void draw() { if (droppedAsset instanceof SoundWave) { AudioComponent bb = new AudioComponent( (SoundWave) droppedAsset, - new Vector3f(getScene().getCamera().getForwardVector()).mul(2).add(getScene().getCamera().getRelativePosition()), + getDropPosition(droppedAsset), new Quaternionf().identity(), new Vector3f(1,1,1)); bb.attachToScene(getScene()); @@ -167,6 +155,32 @@ protected void draw() { } } + + private Vector3f getDropPosition(Asset sourceAsset) { + if (getScene().getHitResult().component != null) { + return new Vector3f(getScene().getHitResult().position); + } + else { + if (sourceAsset instanceof StaticMesh) { + return new Vector3f( + getScene().getCamera().getForwardVector()) + .mul(2 * ((StaticMesh) sourceAsset).getBound().radius) + .add(getScene().getCamera().getRelativePosition()) + .sub(((StaticMesh) sourceAsset).getBound().position); + } + else { + return new Vector3f( + getScene().getCamera().getForwardVector()).mul(2).add(getScene().getCamera().getRelativePosition()); + } + } + } + + private void addNavmesh() { + NavmeshComponent navmesh = new NavmeshComponent(new Vector3f(0), new Quaternionf().identity(), new Vector3f(1)); + navmesh.attachToScene(getScene()); + navmesh.setComponentName("navmesh"); + } + public void editComponent(SceneComponent comp) { ((EditorScene)getScene()).getGizmo().setComponent(comp); if (_inspector == null) _inspector = new ComponentInspector("component inspector"); @@ -259,7 +273,7 @@ public void mouseButtonCallback(int button, int action, int mods) { } else { if (getEditedComponent() != null) { - getEditedComponent().setStencilValue(0); + getEditedComponent().setIsSelected(false); } if (getGizmo().displayTranslation()) getGizmo().beginTranslation(false); else if (!Window.GetPrimaryWindow().captureMouse()) editComponent(getScene().getHitResult().component); diff --git a/src/coffee3D/editor/ui/levelEditor/tools/ComponentInspector.java b/src/coffee3D/editor/ui/levelEditor/tools/ComponentInspector.java index da2751c..2afbf6f 100644 --- a/src/coffee3D/editor/ui/levelEditor/tools/ComponentInspector.java +++ b/src/coffee3D/editor/ui/levelEditor/tools/ComponentInspector.java @@ -15,7 +15,7 @@ public ComponentInspector(String windowName) { protected void draw() { drawComponentProperties(); if (_editedComponent != null) { - _editedComponent.setStencilValue(1); + _editedComponent.setIsSelected(true); } } @@ -23,13 +23,13 @@ protected void draw() { public void close() { super.close(); if (_editedComponent != null) { - _editedComponent.setStencilValue(0); + _editedComponent.setIsSelected(false); } } public void setComponent(SceneComponent inComponent) { if (_editedComponent != null) { - _editedComponent.setStencilValue(0); + _editedComponent.setIsSelected(false); } _editedComponent = inComponent; } diff --git a/src/coffee3D/editor/ui/propertyHelper/StructureReader.java b/src/coffee3D/editor/ui/propertyHelper/StructureReader.java index aa29f5b..352c13c 100644 --- a/src/coffee3D/editor/ui/propertyHelper/StructureReader.java +++ b/src/coffee3D/editor/ui/propertyHelper/StructureReader.java @@ -66,7 +66,7 @@ private static void drawObjectDefault(Object obj, Class cl) { } private static void WriteField(Field field, Object obj) { - if (Modifier.isStatic(field.getModifiers()) || Modifier.isFinal(field.getModifiers()) || Modifier.isTransient(field.getModifiers())|| Modifier.isPrivate(field.getModifiers())) return; + if (Modifier.isStatic(field.getModifiers()) || Modifier.isFinal(field.getModifiers()) || Modifier.isPrivate(field.getModifiers())) return; field.setAccessible(true); debugIndex++;