From 907afc6577ade1a4c48b702c3874681bd87c1aa0 Mon Sep 17 00:00:00 2001 From: Halbear Date: Mon, 18 May 2026 22:07:15 +0100 Subject: [PATCH] 3D Rendering oh yeaaaahhhhh --- resources/shaders/scene_fragment.glsl | 3 +- resources/shaders/scene_fragment.glsl.spv | Bin 428 -> 656 bytes resources/shaders/scene_vertex.glsl | 10 ++- resources/shaders/scene_vertex.glsl.spv | Bin 896 -> 1524 bytes .../Terrain4J/EngineCore/Main/GameCore.java | 76 ++++++++++++++---- .../EngineCore/Main/PrimaryRuntime.java | 2 +- .../Rendering/Projection/Project3D.java | 3 + .../DisplayToScreen/SceneRender.java | 48 ++++++++++- 8 files changed, 119 insertions(+), 23 deletions(-) diff --git a/resources/shaders/scene_fragment.glsl b/resources/shaders/scene_fragment.glsl index 130d3f9..a89e0ab 100644 --- a/resources/shaders/scene_fragment.glsl +++ b/resources/shaders/scene_fragment.glsl @@ -1,8 +1,9 @@ #version 450 +layout(location = 0) in vec2 inTextCoords; layout(location = 0) out vec4 outFragColor; void main() { - outFragColor = vec4(1, 0, 0, 1); + outFragColor = vec4(inTextCoords.x, inTextCoords.y, 0, 1); } \ No newline at end of file diff --git a/resources/shaders/scene_fragment.glsl.spv b/resources/shaders/scene_fragment.glsl.spv index 7e0e9b852d4c5d7fc3de284fcd5d7484d84cb43b..62e20c0768a0bcbc4529d5e83d43e32947acdb71 100644 GIT binary patch literal 656 zcmYk2OH0F05QWD+Y;En!+SZj+Tnfd7iXbXdG@C#L-G|Zy3B;zfsp!t%=C5)ic)m1& zUYN|BbI+YQnPTCzVzy&-YuJ%(PR9yjOx$jo9rwi@trCB9ae0oSX~k5Crezf?DHHG0 zaL&b^Vqejg4qgLP71h=3M~_NYGspFu$;5FVz1d>nt&*=O@S<=Ycz(DHW=Z%FpsQ}_ z!uc#(``d!D6x(yl^2_Xaojfh4Z{s+Mmx2b5pK$&fd?w>KUivF|N3YQz19ZUXa@>_; zJfEcQEv@^icf}1A1L^rUFg}L*R+ZTf{7r_L0f)Y(jGn&e>&jY5%A*J40j?+9P#!8c zXBlp8VEVqL8ZABZ`-6-F!}k=N9QRZ7eSf9R-~;a*JpPI)D?jK<@3sOz%)HI|buvEJ jbTbWebIqY@_-Ac`T?`bwgU1gZ?lh6zaQCObxK{iF?@u&W delta 140 zcmbQhx`vsTnMs+Qfq{{Mn}L^scOtK;FdG940|OZ6CT8XVnGBp0BfDAMfkK><1sS7l zw1F%(pfDFmj-kOG#^(m}85ndJ*nyCNfd_~|YCz&33}R3I!zd$S$H2_M3FLqj`~_NV G0mJ~y#|%yY diff --git a/resources/shaders/scene_vertex.glsl b/resources/shaders/scene_vertex.glsl index 5a51046..88901d0 100644 --- a/resources/shaders/scene_vertex.glsl +++ b/resources/shaders/scene_vertex.glsl @@ -1,8 +1,16 @@ #version 450 layout(location = 0) in vec3 inPos; +layout(location = 1) in vec2 intTextCoords; +layout(location = 0) out vec2 outTextCoords; + +layout(push_constant) uniform matrices{ + mat4 projectionMatrix; + mat4 modelMatrix; +} push_constants; void main() { - gl_Position = vec4(inPos,1); + gl_Position = push_constants.projectionMatrix * push_constants.modelMatrix * vec4(inPos,1); + outTextCoords = intTextCoords; } \ No newline at end of file diff --git a/resources/shaders/scene_vertex.glsl.spv b/resources/shaders/scene_vertex.glsl.spv index b94dfb30f02972c3919e89a345a950060dabcc51..25b2690c930542d3563a946701b112b73563e6ba 100644 GIT binary patch literal 1524 zcmZ9L+iuf95QdkWT3XstN)JE@F5y%H6&HYz5GNJnUZiSK5w}+4Sg^>kBiliRD_#K} ziKpTQiT`uFQRr6Vnfd3R*_p|1mh_qPPk%+Zs9J{Bsbd39S^W$PU=EO*ED?Ja(Rrix1Ih zv7e^dz~TH38u35eSHJ9xIS-VL&2idc^aF-=7&&0$fZZ>-Ia#Jj)~usCJs(L{M`y8eqT1VT^yg^4(zGk5p|fIL!CcD zcq?!8Wwvz*^RlxSVlwB31l)19WW!-@$GIXK{FmyGb5%kfI2`8ZJu&-xahS=IxHsmo zoeHC0huy3&dOy}?*iA>`N#GM_hd))9*ewb7!=Yz(dPl-LVXl{&93LLNv8x9X_C$<* L;{Vmwo=N@zxjK3y delta 307 zcmX|+OA5k35JY>N=zw9+#83Qy3NBp>f~a@^As!*_vM?UOTp{E%;U zrmH7;__?vVHa8+le6cbv>@tGFrjAmt5F* diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/GameCore.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/GameCore.java index 656bee9..10fa98a 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/GameCore.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/GameCore.java @@ -1,15 +1,25 @@ package net.halbear.Terrain4J.EngineCore.Main; +import net.halbear.Terrain4J.EngineCore.Logic.EngineConfig; import net.halbear.Terrain4J.EngineCore.Logic.EngineInstance; import net.halbear.Terrain4J.EngineCore.Logic.GameLogic; import net.halbear.Terrain4J.EngineCore.Logic.InitData; +import net.halbear.Terrain4J.EngineCore.Main.Scene.Actor; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.MeshData; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.ModelData; +import org.joml.Vector3f; import java.util.ArrayList; import java.util.List; public class GameCore implements GameLogic { + + private final Vector3f rotatingAngle = new Vector3f(1, 1, 1); + private float angle = 0; + private List angles = new ArrayList<>(); + private Actor CubeActor; + private List CubeActors = new ArrayList<>(); + @Override public void cleanup() { @@ -17,22 +27,52 @@ public class GameCore implements GameLogic { @Override public InitData Initialise(EngineInstance engineInstance) { - var ModelID = "TriangleModel"; - List MeshDataList = new ArrayList<>(); - for(int i = 0; i < 5; i++){ - float PosXOffset = -1 + (float)Math.random() * 2; - float PosYOffset = -1 + (float)Math.random() * 2; - MeshDataList.add( - new MeshData("triangle-mesh" + i, new float[]{ - PosXOffset, PosYOffset, 0.00f, - PosXOffset + 0.05f,PosYOffset + 0.15f, 0.0f, - PosXOffset + 0.1f, PosYOffset, 0.0f}, - new int[]{0, 1, 2}) - ); + float[] positions = new float[]{ + -0.25f, 0.25f, 0.25f, + -0.25f, -0.25f, 0.25f, + 0.25f, -0.25f, 0.25f, + 0.25f, 0.25f, 0.25f, + -0.25f, 0.25f, -0.25f, + 0.25f, 0.25f, -0.25f, + -0.25f, -0.25f, -0.25f, + 0.25f, -0.25f, -0.25f, + }; + float[] textCoords = new float[]{ + 0.0f, 0.0f, + 0.5f, 0.0f, + 1.0f, 0.0f, + 1.0f, 0.5f, + 1.0f, 1.0f, + 0.5f, 1.0f, + 0.0f, 1.0f, + 0.0f, 0.5f, + }; + int[] indices = new int[]{ + // Front face + 0, 1, 3, 3, 1, 2, + // Top Face + 4, 0, 3, 5, 4, 3, + // Right face + 3, 2, 7, 5, 3, 7, + // Left face + 6, 1, 0, 6, 0, 4, + // Bottom face + 2, 1, 6, 2, 6, 7, + // Back face + 7, 6, 4, 7, 4, 5, + }; + var modelID = "CubeModel"; + MeshData meshData = new MeshData("cube_mesh", positions, textCoords, indices); + List meshDataList = new ArrayList<>(); + meshDataList.add(meshData); + ModelData modelData = new ModelData(modelID, meshDataList); + List models = new ArrayList<>(); + models.add(modelData); + for(int i = 0; i < 150; i++) { + angles.add((float)Math.floor(Math.random() * 360)); + CubeActors.add(new Actor("CubeActor", modelID, new Vector3f(-4f + (float)Math.floor(Math.random() * 8), -4f + (float)Math.floor(Math.random() * 8), -2f + (float)Math.floor(Math.random() * -8)))); + engineInstance.scene().AddActor(CubeActors.get(i)); } - ModelData modelData = new ModelData(ModelID, MeshDataList); - List models = new ArrayList<>(); - models.add(modelData); return new InitData(models); } @@ -43,7 +83,11 @@ public class GameCore implements GameLogic { @Override public void Update(EngineInstance engineInstance, long FrameDiffNanoSeconds) { - + for(int i = 0; i < angles.size(); i++) { + angles.set(i, (angles.get(i) + 1.0f) % 360); + CubeActors.get(i).GetRotation().identity().rotateAxis((float) EngineConfig.DegToRad * angles.get(i), rotatingAngle); + CubeActors.get(i).UpdateModelMatrix(); + } } @Override diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/PrimaryRuntime.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/PrimaryRuntime.java index c65bc51..0685780 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Main/PrimaryRuntime.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Main/PrimaryRuntime.java @@ -27,8 +27,8 @@ public class PrimaryRuntime { public PrimaryRuntime(String windowTitle, GameLogic appLogic) { window = new Window(windowTitle); - InitData initData = appLogic.Initialise(engineInstance); engineInstance = new EngineInstance(window, new Scene(window)); + InitData initData = appLogic.Initialise(engineInstance); PrimaryThread = new MainThread(engineInstance, appLogic); FastThread = new FastTickThread(engineInstance, appLogic); DrawingThread = new RenderThread(window, engineInstance, initData, appLogic); diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Rendering/Projection/Project3D.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Rendering/Projection/Project3D.java index 5d7bfd7..32f501a 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Rendering/Projection/Project3D.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Rendering/Projection/Project3D.java @@ -26,6 +26,9 @@ public class Project3D { public float GetNearZ(){ return ZNearPlane; } + + public Matrix4f GetProjectionMatrix(){return ProjectionMatrix;} + public void Resize(int Width, int Height){ ProjectionMatrix.identity(); ProjectionMatrix.perspective(FOV, (float)Width/(float)Height, ZNearPlane, ZFarPlane, true); diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DisplayToScreen/SceneRender.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DisplayToScreen/SceneRender.java index 10e0a85..03da83a 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DisplayToScreen/SceneRender.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Structure/DisplayToScreen/SceneRender.java @@ -1,7 +1,11 @@ package net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DisplayToScreen; +import net.halbear.Terrain4J.EngineCore.Display.Render; import net.halbear.Terrain4J.EngineCore.Logic.EngineConfig; +import net.halbear.Terrain4J.EngineCore.Logic.EngineInstance; import net.halbear.Terrain4J.EngineCore.Logic.VulkanContext; +import net.halbear.Terrain4J.EngineCore.Main.Scene.Actor; +import net.halbear.Terrain4J.EngineCore.Main.Scene.Scene; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Pipeline.Images.Attachment; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Pipeline.Pipeline; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Pipeline.PipelineBuildInfo; @@ -14,6 +18,7 @@ import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.VulkanMesh; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.VulkanModel; import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DeviceLayers.CommandBuffer; import net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanUtils; +import org.joml.Matrix4f; import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryUtil; import org.lwjgl.util.shaderc.Shaderc; @@ -22,6 +27,7 @@ import org.lwjgl.vulkan.*; import java.nio.ByteBuffer; import java.nio.LongBuffer; import java.util.Arrays; +import java.util.List; import static org.lwjgl.vulkan.KHRSwapchain.VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; import static org.lwjgl.vulkan.KHRSynchronization2.VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR; @@ -143,7 +149,7 @@ public class SceneRender {//dynamic rendering RenderInfo = CreateRenderInfo(vulkanContext, AttachmentInfoColour, AttInfoDepth); } - public void Render(VulkanContext vulkanContext, CommandBuffer commandBuffer,ModelsCache modelsCache, int ImageIndex){ + public void Render(EngineInstance engineInstance,VulkanContext vulkanContext, CommandBuffer commandBuffer, ModelsCache modelsCache, int ImageIndex){ UpdateColours(vulkanContext); try(var MemStack = MemoryStack.stackPush()){ SwapChain swapChain = vulkanContext.GetSwapChain(); @@ -184,8 +190,25 @@ public class SceneRender {//dynamic rendering LongBuffer offsets = MemStack.mallocLong(1).put(0,0L); LongBuffer vertexBuffer = MemStack.mallocLong(1); - //Fetch Actor Code to be written Later - var VulkanModels = modelsCache.GetModelMap().values(); + Scene scene = engineInstance.scene(); + List Actors = scene.GetActors(); + int ActorCount = Actors.size(); + for(int i = 0; i < ActorCount; i++){ + var Actor = Actors.get(i); + VulkanModel model = modelsCache.GetModel(Actor.GetModelID()); + List VkMeshList = model.GetVkMeshList(); + int MeshCount = VkMeshList.size(); + SetPushConstants(CommandHandle, scene.GetProjection().GetProjectionMatrix(), Actor.GetModelMatrix()); + for(int j = 0; j < MeshCount; j++){ + var VkMesh = VkMeshList.get(j); + vertexBuffer.put(0,VkMesh.VerticesBuffer().GetBuffer()); + vkCmdBindVertexBuffers(CommandHandle,0,vertexBuffer,offsets); + vkCmdBindIndexBuffer(CommandHandle,VkMesh.IndicesBuffer().GetBuffer(),0,VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(CommandHandle,VkMesh.IndicesCount(),1,0,0,0); + } + } + + /*var VulkanModels = modelsCache.GetModelMap().values(); // old outdated code for(VulkanModel VkModel : VulkanModels){ for(VulkanMesh mesh : VkModel.GetVkMeshList()){ @@ -194,7 +217,7 @@ public class SceneRender {//dynamic rendering vkCmdBindIndexBuffer(CommandHandle,mesh.IndicesBuffer().GetBuffer(),0,VK_INDEX_TYPE_UINT32); vkCmdDrawIndexed(CommandHandle,mesh.IndicesCount(),1,0,0,0); } - } + }*/ vkCmdEndRendering(CommandHandle); VulkanUtils.ImageBarrier(MemStack, CommandHandle, SwapChainImage, @@ -205,6 +228,23 @@ public class SceneRender {//dynamic rendering } } + private void SetPushConstants(VkCommandBuffer CmdHandle, Matrix4f ProjectionMatrix, Matrix4f modelMatrix){ + ProjectionMatrix.get(PushConstBuffer); + modelMatrix.get(VulkanUtils.MATRIX4X4_SIZE,PushConstBuffer); + vkCmdPushConstants(CmdHandle, VkPipeline.GetVulkanPipelineLayout(), VK_SHADER_STAGE_VERTEX_BIT, 0, PushConstBuffer); + } + + public void Resize(VulkanContext VkCtx){ + Arrays.asList(RenderInfo).forEach(VkRenderingInfo::free); + Arrays.asList(AttInfoDepth).forEach(VkRenderingAttachmentInfo::free); + Arrays.asList(AttachmentInfoColour).forEach(VkRenderingAttachmentInfo.Buffer::free); + Arrays.asList(AttDepth).forEach(Attachment->Attachment.CleanUp(VkCtx)); + AttDepth = createDepthAttachments(VkCtx); + AttachmentInfoColour = CreateColourAttachmentsInfo(VkCtx, ClearValueColour); + AttInfoDepth = createDepthAttachmentsInfo(VkCtx, AttDepth, ClearValueDepth); + RenderInfo = CreateRenderInfo(VkCtx, AttachmentInfoColour, AttInfoDepth); + } + private static VkRenderingInfo[] CreateRenderInfo(VulkanContext vulkanContext, VkRenderingAttachmentInfo.Buffer[] ColourAttachments, VkRenderingAttachmentInfo[] DepthAttachments){ SwapChain swapChain = vulkanContext.GetSwapChain(); int ImageCount = swapChain.GetImageCount();