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++;