It crashes

This commit is contained in:
Halbear 2026-06-04 22:57:09 +01:00
parent c2aa4ec895
commit 66783c4cc5
24 changed files with 27993 additions and 82 deletions

Binary file not shown.

View file

@ -0,0 +1,15 @@
{
"id": "cube",
"meshes": [
{
"id": "cubemtl_0",
"material_id": "cube-mat-1",
"offset_vtx": 0,
"vtx_size": 480,
"offset_idx": 0,
"idx_size": 144
}
],
"vtx_path": "resources/models/cube/cube.vtx",
"idx_path": "resources/models/cube/cube.idx"
}

View file

@ -0,0 +1,5 @@
newmtl cubemtl
Kd 0.00 0.00 0.00
Ka 0.59 0.45 0.35
Ks 0.59 0.45 0.35
map_Kd cube.png

View file

@ -0,0 +1,88 @@
mtllib cube.mtl
o cube
v -0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v -0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
v 0.500000 0.500000 0.500000
v 0.500000 0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
v -0.500000 0.500000 0.500000
v -0.500000 0.500000 -0.500000
v 0.500000 0.500000 0.500000
v 0.500000 0.500000 -0.500000
v -0.500000 -0.500000 0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 0.500000
v 0.500000 -0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v -0.500000 0.500000 -0.500000
v 0.500000 0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
vt 0.000000 1.000000
vt 0.250000 1.000000
vt 0.000000 0.500000
vt 0.250000 0.500000
vt 0.250000 1.000000
vt 0.500000 1.000000
vt 0.250000 0.500000
vt 0.500000 0.500000
vt 0.500000 1.000000
vt 0.750000 1.000000
vt 0.500000 0.500000
vt 0.750000 0.500000
vt 0.750000 1.000000
vt 1.000000 1.000000
vt 0.750000 0.500000
vt 1.000000 0.500000
vt 0.000000 0.000000
vt 0.250000 0.000000
vt 0.000000 0.500000
vt 0.250000 0.500000
vt 0.250000 0.500000
vt 0.500000 0.500000
vt 0.250000 0.000000
vt 0.500000 0.000000
vn 0.000000 0.000000 1.000000
vn -1.000000 0.000000 0.000000
vn 1.000000 0.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 0.000000 -1.000000
g cubemtl
usemtl cubemtl
f 1/3/1 2/1/1 4/4/1
f 2/1/1 3/2/1 4/4/1
f 5/8/2 6/6/2 8/7/2
f 6/6/2 7/5/2 8/7/2
f 9/11/3 10/9/3 12/12/3
f 10/9/3 12/12/3 11/10/3
f 13/15/4 14/13/4 15/16/4
f 14/13/4 16/14/4 15/16/4
f 17/19/5 18/17/5 19/20/5
f 18/17/5 20/18/5 19/20/5
f 21/24/6 22/22/6 24/23/6
f 22/22/6 23/21/6 24/23/6

Binary file not shown.

View file

@ -0,0 +1,22 @@
[
{
"id": "cube-mat-0",
"texture_path": "",
"diffuse_color": {
"x": 0.6,
"y": 0.6,
"z": 0.6,
"w": 1.0
}
},
{
"id": "cube-mat-1",
"texture_path": "resources/models/cube/cube.png",
"diffuse_color": {
"x": 0.0,
"y": 0.0,
"z": 0.0,
"w": 1.0
}
}
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

View file

@ -0,0 +1,4 @@
# Made in Blockbench 5.1.4
newmtl m_1306cabb-1c39-88cc-7a28-6065072778b2
map_Kd SloopBluePaintedSpruce.png
newmtl none

File diff suppressed because it is too large Load diff

View file

@ -3,6 +3,9 @@ package net.halbear.Terrain4J.EngineCore.Display;
import net.halbear.Terrain4J.EngineCore.Logic.EngineInstance; import net.halbear.Terrain4J.EngineCore.Logic.EngineInstance;
import net.halbear.Terrain4J.EngineCore.Logic.InitData; import net.halbear.Terrain4J.EngineCore.Logic.InitData;
import net.halbear.Terrain4J.EngineCore.Logic.Rendering.VulkanContext; import net.halbear.Terrain4J.EngineCore.Logic.Rendering.VulkanContext;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Pipeline.Images.TextureCache;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.MaterialData;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.MaterialsCache;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.ModelData; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.ModelData;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.ModelsCache; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.ModelsCache;
import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DeviceLayers.CommandBuffer; import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DeviceLayers.CommandBuffer;
@ -41,6 +44,9 @@ public class Render {
private final VulkanContext RendererContext; private final VulkanContext RendererContext;
private boolean Resize = false; private boolean Resize = false;
private final MaterialsCache materialsCache;
private TextureCache textureCache;
public Render(EngineInstance engineInstance) { public Render(EngineInstance engineInstance) {
RendererContext = new VulkanContext(engineInstance.window()); RendererContext = new VulkanContext(engineInstance.window());
CurrentFrame = 0; CurrentFrame = 0;
@ -62,15 +68,28 @@ public class Render {
RenderCompleteSemaphores[i] = new Semaphore(RendererContext); RenderCompleteSemaphores[i] = new Semaphore(RendererContext);
} }
sceneRender = new SceneRender(RendererContext); sceneRender = new SceneRender(RendererContext);
textureCache = new TextureCache();
materialsCache = new MaterialsCache();
modelsCache = new ModelsCache(); modelsCache = new ModelsCache();
Resize = false; Resize = false;
} }
public void Initialise(InitData initData){ public void Initialise(InitData initData){
List<MaterialData> Materials = initData.Materials();
Logger.debug("Loading {} Materials", Materials.size());
materialsCache.LoadMaterials(RendererContext, Materials,textureCache, CommandPools[0], GraphicsQueue);
Logger.debug("Loaded {} Materials", Materials.size());
Logger.debug("Transitioning Textures");
textureCache.TransitionTexts(RendererContext, CommandPools[0], GraphicsQueue);
Logger.debug("Transitioned Textures");
List<ModelData> Models = initData.Models(); List<ModelData> Models = initData.Models();
Logger.debug("Loading {} models", Models.size()); Logger.debug("Loading {} models", Models.size());
modelsCache.loadModels(RendererContext, Models, CommandPools[0], GraphicsQueue); modelsCache.loadModels(RendererContext, Models, CommandPools[0], GraphicsQueue);
Logger.debug("Loaded {} models", Models.size()); Logger.debug("Loaded {} models", Models.size());
sceneRender.LoadMaterials(RendererContext,materialsCache,textureCache);
} }
private void RecordingStart(CommandPool commandPool, CommandBuffer commandBuffer){ private void RecordingStart(CommandPool commandPool, CommandBuffer commandBuffer){
@ -99,6 +118,8 @@ public class Render {
} }
Logger.debug("Command pools cleaned up"); Logger.debug("Command pools cleaned up");
modelsCache.CleanUp(RendererContext); modelsCache.CleanUp(RendererContext);
materialsCache.CleanUp(RendererContext);
textureCache.CleanUp(RendererContext);
RendererContext.cleanup(); RendererContext.cleanup();
} }
public void render(EngineInstance engineInstance){ public void render(EngineInstance engineInstance){
@ -112,7 +133,7 @@ public class Render {
resize(engineInstance); resize(engineInstance);
return; return;
} }
sceneRender.Render(engineInstance,RendererContext,CommandBuffer, modelsCache,ImageIndex); sceneRender.Render(engineInstance,RendererContext,CommandBuffer, modelsCache,materialsCache,ImageIndex);
RecordingStop(CommandBuffer); RecordingStop(CommandBuffer);
Submit(CommandBuffer, CurrentFrame, ImageIndex); Submit(CommandBuffer, CurrentFrame, ImageIndex);
Resize = swapChain.PresentImage(PresentQueue, RenderCompleteSemaphores[ImageIndex],ImageIndex); Resize = swapChain.PresentImage(PresentQueue, RenderCompleteSemaphores[ImageIndex],ImageIndex);
@ -139,7 +160,7 @@ public class Render {
VkExtent2D extend = RendererContext.GetSwapChain().GetSwapChainExtent(); VkExtent2D extend = RendererContext.GetSwapChain().GetSwapChainExtent();
engineInstance.scene().GetProjection().Resize(extend.width(),extend.height()); engineInstance.scene().GetProjection().Resize(extend.width(),extend.height());
sceneRender.Resize(RendererContext); sceneRender.Resize(engineInstance,RendererContext);
} }
private void ResetFence(int currentFrame){ private void ResetFence(int currentFrame){

View file

@ -44,17 +44,20 @@ public class EngineConfig {
private String PhysicalDeviceName; private String PhysicalDeviceName;
private int RequestedImages; private int RequestedImages;
private String IconPath = "/WindowResources/Icon/"; private String IconPath = "/WindowResources/Icon/";
private String DefaultTexturePath = "/EngineResources/Texture/DefaultTexture.png"; private String DefaultTexturePath = "Resources/EngineResources/Texture/DefaultTexture.png";
private String IconName = "ProgramIcon.png"; private String IconName = "ProgramIcon.png";
private float FOV = 60f; private float FOV = 60f;
private float zFarPlane; private float zFarPlane;
private float zNearPlane; private float zNearPlane;
private boolean GPU_SUPPORTS_LOGGING = true; private boolean GPU_SUPPORTS_LOGGING = true;
private int MaxDescriptors = 1000;
public void GPU_Does_Not_Support_Logging(){ public void GPU_Does_Not_Support_Logging(){
GPU_SUPPORTS_LOGGING = false; GPU_SUPPORTS_LOGGING = false;
} }
public boolean doesGPUSupportLogging(){return GPU_SUPPORTS_LOGGING;} public boolean doesGPUSupportLogging(){return GPU_SUPPORTS_LOGGING;}
public String GetDefaultTexturePath(){return DefaultTexturePath;}
public int GetMaxDescriptors(){return MaxDescriptors;}
private EngineConfig() { private EngineConfig() {
var EngineConfigVar = new Properties(); var EngineConfigVar = new Properties();
@ -108,6 +111,7 @@ public class EngineConfig {
TickRate = Integer.parseInt(EngineConfigVar.getOrDefault("master_tick_rate", DEFAULT_TICKRATE).toString()); TickRate = Integer.parseInt(EngineConfigVar.getOrDefault("master_tick_rate", DEFAULT_TICKRATE).toString());
Width = Integer.parseInt(EngineConfigVar.getOrDefault("display_width", "1280").toString()); Width = Integer.parseInt(EngineConfigVar.getOrDefault("display_width", "1280").toString());
Height = Integer.parseInt(EngineConfigVar.getOrDefault("display_height", "720").toString()); Height = Integer.parseInt(EngineConfigVar.getOrDefault("display_height", "720").toString());
MaxDescriptors = Integer.parseInt(EngineConfigVar.getOrDefault("MaxDescriptors", "1000").toString());
VSYNC = Boolean.parseBoolean(EngineConfigVar.getOrDefault("vsync", true).toString()); VSYNC = Boolean.parseBoolean(EngineConfigVar.getOrDefault("vsync", true).toString());
vkValidated = Boolean.parseBoolean(EngineConfigVar.getOrDefault("vkValidated", false).toString()); vkValidated = Boolean.parseBoolean(EngineConfigVar.getOrDefault("vkValidated", false).toString());
RequestedImages = Integer.parseInt(EngineConfigVar.getOrDefault("RequestedImages", 3).toString()); RequestedImages = Integer.parseInt(EngineConfigVar.getOrDefault("RequestedImages", 3).toString());
@ -144,6 +148,7 @@ public class EngineConfig {
EngineConfigVar.setProperty("z_near_plane","1"); EngineConfigVar.setProperty("z_near_plane","1");
EngineConfigVar.setProperty("z_far_plane","100"); EngineConfigVar.setProperty("z_far_plane","100");
EngineConfigVar.setProperty("DefaultTexturePath",DefaultTexturePath); EngineConfigVar.setProperty("DefaultTexturePath",DefaultTexturePath);
EngineConfigVar.setProperty("MaxDescriptors","1000");
EngineConfigVar.store(new FileWriter(path.toAbsolutePath().toString() + "/" + FILENAME), "created new properties file"); EngineConfigVar.store(new FileWriter(path.toAbsolutePath().toString() + "/" + FILENAME), "created new properties file");
Logger.debug("Wrote New Config File [{}]", ConfigFile.getAbsolutePath()); Logger.debug("Wrote New Config File [{}]", ConfigFile.getAbsolutePath());
} catch (IOException excp2) { } catch (IOException excp2) {

View file

@ -1,8 +1,9 @@
package net.halbear.Terrain4J.EngineCore.Logic; package net.halbear.Terrain4J.EngineCore.Logic;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.MaterialData;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.ModelData; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.ModelData;
import java.util.List; import java.util.List;
public record InitData(List<ModelData> Models) { public record InitData(List<ModelData> Models, List<MaterialData> Materials) {
} }

View file

@ -4,10 +4,13 @@ import net.halbear.Terrain4J.EngineCore.Logic.EngineConfig;
import net.halbear.Terrain4J.EngineCore.Logic.EngineInstance; import net.halbear.Terrain4J.EngineCore.Logic.EngineInstance;
import net.halbear.Terrain4J.EngineCore.Logic.GameLogic; import net.halbear.Terrain4J.EngineCore.Logic.GameLogic;
import net.halbear.Terrain4J.EngineCore.Logic.InitData; import net.halbear.Terrain4J.EngineCore.Logic.InitData;
import net.halbear.Terrain4J.EngineCore.Logic.Rendering.ModelLoader;
import net.halbear.Terrain4J.EngineCore.Main.Scene.Actor; import net.halbear.Terrain4J.EngineCore.Main.Scene.Actor;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.MeshData; import net.halbear.Terrain4J.EngineCore.Main.Scene.Scene;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.MaterialData;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.ModelData; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.ModelData;
import org.joml.Vector3f; import org.joml.Vector3f;
import org.tinylog.Logger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -28,54 +31,17 @@ public class GameCore implements GameLogic {
@Override @Override
public InitData Initialise(EngineInstance engineInstance) { public InitData Initialise(EngineInstance engineInstance) {
float[] positions = new float[]{ Scene scene = engineInstance.scene();
-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,
};
List<MeshData> meshDataList = new ArrayList<>();
List<ModelData> models = new ArrayList<>(); List<ModelData> models = new ArrayList<>();
var modelID = "CubeModel";
MeshData meshData = new MeshData("cube_mesh", positions, textCoords, indices); ModelData SloopModel = ModelLoader.LoadModel("resources/Models/Cube/cube.json");
meshDataList.add(meshData); models.add(SloopModel);
ModelData modelData = new ModelData(modelID, meshDataList); Logger.trace(SloopModel.ID());
models.add(modelData); Actor SloopActor = new Actor("CubeEntity",SloopModel.ID(),new Vector3f(0.0f,0.0f,-20.0f));
for(int i = 0; i < 1000; i++) { scene.AddActor(SloopActor);
angles.add((float)Math.floor(Math.random() * 360));
Velocities.add(new Vector3f((float)(-2 + (4* Math.random())),(float)(-2 + (4* Math.random())),(float)(-2 + (4* Math.random())))); List<MaterialData> materials = new ArrayList<>(ModelLoader.LoadMaterials("resources/Models/Cube/cube_mat.json"));
CubeActors.add(new Actor("CubeActor", modelID, new Vector3f(-25f + (float)Math.floor(Math.random() *50), -25f + (float)Math.floor(Math.random() * 50), -2f + (float)Math.floor(Math.random() * -15)))); return new InitData(models,materials);
engineInstance.scene().AddActor(CubeActors.get(i));
}
return new InitData(models);
} }
@Override @Override

View file

@ -44,6 +44,7 @@ public class DescriptorSet {
.sType$Default() .sType$Default()
.dstSet(VkDescriptorSet) .dstSet(VkDescriptorSet)
.dstBinding(Binding) .dstBinding(Binding)
.descriptorType(Type)
.descriptorCount(1) .descriptorCount(1)
.pBufferInfo(BufferInfo); .pBufferInfo(BufferInfo);
vkUpdateDescriptorSets(device.FetchVulkanDevice(),DescriptorBuffer,null); vkUpdateDescriptorSets(device.FetchVulkanDevice(),DescriptorBuffer,null);

View file

@ -30,7 +30,7 @@ public class TextureSampler {
.minLod(0.0f) .minLod(0.0f)
.maxLod(textureSamplerInfo.MipLevels()) .maxLod(textureSamplerInfo.MipLevels())
.mipLodBias(0.0f); .mipLodBias(0.0f);
if(textureSamplerInfo.Anisotrophy() && VkCtx.GetDevice().SamplesAnisotropy()){ if(textureSamplerInfo.Anisotropy() && VkCtx.GetDevice().SamplesAnisotropy()){
SamplerInfo SamplerInfo
.anisotropyEnable(true) .anisotropyEnable(true)
.maxAnisotropy(MAX_ANISOTROPY); .maxAnisotropy(MAX_ANISOTROPY);

View file

@ -53,7 +53,7 @@ public class MaterialsCache {
} }
VulkanMaterial newMaterial = new VulkanMaterial(Material.ID()); VulkanMaterial newMaterial = new VulkanMaterial(Material.ID());
MaterialsMap.put(newMaterial.ID(), newMaterial); MaterialsMap.put(newMaterial.ID(), newMaterial);
Logger.trace(Material.toString());
Material.DiffuseColour().get(Offset, data); Material.DiffuseColour().get(Offset, data);
data.putInt(Offset + VulkanUtils.VEC4_SIZE, ValidTexture ? 1 : 0); data.putInt(Offset + VulkanUtils.VEC4_SIZE, ValidTexture ? 1 : 0);
data.putInt(Offset + VulkanUtils.VEC4_SIZE + VulkanUtils.INT_SIZE, textureCache.GetPosition(TexturePath)); data.putInt(Offset + VulkanUtils.VEC4_SIZE + VulkanUtils.INT_SIZE, textureCache.GetPosition(TexturePath));
@ -72,7 +72,7 @@ public class MaterialsCache {
} }
private void CleanUp(VulkanContext VkCtx){ public void CleanUp(VulkanContext VkCtx){
if(MaterialsBuffer != null){ if(MaterialsBuffer != null){
MaterialsBuffer.cleanup(VkCtx); MaterialsBuffer.cleanup(VkCtx);
} }

View file

@ -8,16 +8,16 @@ import net.halbear.Terrain4J.EngineCore.Main.PrimaryRuntime;
import net.halbear.Terrain4J.EngineCore.Main.Scene.Actor; import net.halbear.Terrain4J.EngineCore.Main.Scene.Actor;
import net.halbear.Terrain4J.EngineCore.Main.Scene.Scene; 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.Images.Attachment;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Pipeline.Images.Texture;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Pipeline.Images.TextureCache; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Pipeline.Images.TextureCache;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Pipeline.Pipeline; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Pipeline.Pipeline;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Pipeline.PipelineBuildInfo; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Pipeline.PipelineBuildInfo;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Pipeline.PushConstantsRange; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Pipeline.PushConstantsRange;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Shader.*; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Shader.*;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VertexBufferStructure; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VertexBufferStructure;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.ModelsCache; import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.*;
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.Structure.DeviceLayers.CommandBuffer;
import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DeviceLayers.Device;
import net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanBuffer; import net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanBuffer;
import net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanUtils; import net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanUtils;
import org.joml.Matrix4f; import org.joml.Matrix4f;
@ -25,6 +25,7 @@ import org.lwjgl.system.MemoryStack;
import org.lwjgl.system.MemoryUtil; import org.lwjgl.system.MemoryUtil;
import org.lwjgl.util.shaderc.Shaderc; import org.lwjgl.util.shaderc.Shaderc;
import org.lwjgl.vulkan.*; import org.lwjgl.vulkan.*;
import org.tinylog.Logger;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.LongBuffer; import java.nio.LongBuffer;
@ -141,15 +142,17 @@ public class SceneRender {//dynamic rendering
}; };
} }
private static Pipeline CreatePipeline(VulkanContext VkCtx, ShaderModule[] ShaderModules){ private static Pipeline CreatePipeline(VulkanContext VkCtx, ShaderModule[] ShaderModules, DescriptorSetLayout[] DescriptorSetLayouts){
var vertexBufferStructure = new VertexBufferStructure(); var vertexBufferStructure = new VertexBufferStructure();
var BuildInfo = new PipelineBuildInfo(ShaderModules,vertexBufferStructure.getVertexInput(), var BuildInfo = new PipelineBuildInfo(ShaderModules,vertexBufferStructure.getVertexInput(),
VkCtx.GetSurface().GetSurfaceFormat().ImageFormat()) VkCtx.GetSurface().GetSurfaceFormat().ImageFormat())
.SetDepthFormat(DEPTH_FORMAT) .SetDepthFormat(DEPTH_FORMAT)
.SetPushConstantRanges( .SetPushConstantRanges(
new PushConstantsRange[]{ new PushConstantsRange[]{
new PushConstantsRange(VK_SHADER_STAGE_VERTEX_BIT,0,VulkanUtils.MATRIX4X4_SIZE * 2) new PushConstantsRange(VK_SHADER_STAGE_VERTEX_BIT,0,VulkanUtils.MATRIX4X4_SIZE * 2),
}); new PushConstantsRange(VK_SHADER_STAGE_FRAGMENT_BIT,VulkanUtils.MATRIX4X4_SIZE,VulkanUtils.INT_SIZE)
})
.SetDescriptorSetLayouts(DescriptorSetLayouts);
var pipeline = new Pipeline(VkCtx, BuildInfo); var pipeline = new Pipeline(VkCtx, BuildInfo);
vertexBufferStructure.cleanup(); vertexBufferStructure.cleanup();
return pipeline; return pipeline;
@ -182,7 +185,7 @@ public class SceneRender {//dynamic rendering
RenderInfo = CreateRenderInfo(vulkanContext, AttachmentInfoColour, AttInfoDepth); RenderInfo = CreateRenderInfo(vulkanContext, AttachmentInfoColour, AttInfoDepth);
} }
public void Render(EngineInstance engineInstance,VulkanContext vulkanContext, CommandBuffer commandBuffer, ModelsCache modelsCache, int ImageIndex){ public void Render(EngineInstance engineInstance,VulkanContext vulkanContext, CommandBuffer commandBuffer, ModelsCache modelsCache,MaterialsCache materialsCache, int ImageIndex){
UpdateColours(vulkanContext); UpdateColours(vulkanContext);
try(var MemStack = MemoryStack.stackPush()){ try(var MemStack = MemoryStack.stackPush()){
SwapChain swapChain = vulkanContext.GetSwapChain(); SwapChain swapChain = vulkanContext.GetSwapChain();
@ -221,35 +224,39 @@ public class SceneRender {//dynamic rendering
LongBuffer offsets = MemStack.mallocLong(1).put(0,0L); LongBuffer offsets = MemStack.mallocLong(1).put(0,0L);
LongBuffer vertexBuffer = MemStack.mallocLong(1); LongBuffer vertexBuffer = MemStack.mallocLong(1);
Scene scene = engineInstance.scene(); Scene scene = engineInstance.scene();
List<Actor> Actors = scene.GetActors(); List<Actor> Actors = scene.GetActors();
int ActorCount = Actors.size(); int ActorCount = Actors.size();
DescriptorAllocator descriptorAllocator = vulkanContext.GetDescriptorAllocator();
LongBuffer DescriptorSets = MemStack.mallocLong(3)
.put(0,descriptorAllocator.GetDescriptorSet(DESCRIPTOR_ID_PRJ).GetVkDescriptorSet())
.put(1,descriptorAllocator.GetDescriptorSet(DESCRIPTOR_ID_MAT).GetVkDescriptorSet())
.put(2,descriptorAllocator.GetDescriptorSet(DESCRIPTOR_ID_TEXT).GetVkDescriptorSet());
vkCmdBindDescriptorSets(CommandHandle, VK_PIPELINE_BIND_POINT_GRAPHICS, VkPipeline.GetVulkanPipelineLayout(),0,DescriptorSets,null);
for(int i = 0; i < ActorCount; i++){ for(int i = 0; i < ActorCount; i++){
var Actor = Actors.get(i); var Actor = Actors.get(i);
VulkanModel model = modelsCache.GetModel(Actor.GetModelID()); VulkanModel model = modelsCache.GetModel(Actor.GetModelID());
List<VulkanMesh> VkMeshList = model.GetVkMeshList(); List<VulkanMesh> VkMeshList = model.GetVkMeshList();
int MeshCount = VkMeshList.size(); int MeshCount = VkMeshList.size();
SetPushConstants(CommandHandle, scene.GetProjection().GetProjectionMatrix(), Actor.GetModelMatrix());
for(int j = 0; j < MeshCount; j++){ for(int j = 0; j < MeshCount; j++){
var VkMesh = VkMeshList.get(j); var VkMesh = VkMeshList.get(j);
String MaterialID = VkMesh.MaterialID();
int MaterialIndex = materialsCache.GetPosition(MaterialID);
VulkanMaterial vulkanMaterial = materialsCache.GetMaterial(MaterialID);
if(vulkanMaterial == null){
Logger.warn("Mesh [{}] in model [{}] does not have material",j,model.GetID());
continue;
}
SetPushConstants(CommandHandle, Actor.GetModelMatrix(),MaterialIndex);
vertexBuffer.put(0,VkMesh.VerticesBuffer().GetBuffer()); vertexBuffer.put(0,VkMesh.VerticesBuffer().GetBuffer());
vkCmdBindVertexBuffers(CommandHandle,0,vertexBuffer,offsets); vkCmdBindVertexBuffers(CommandHandle,0,vertexBuffer,offsets);
vkCmdBindIndexBuffer(CommandHandle,VkMesh.IndicesBuffer().GetBuffer(),0,VK_INDEX_TYPE_UINT32); vkCmdBindIndexBuffer(CommandHandle,VkMesh.IndicesBuffer().GetBuffer(),0,VK_INDEX_TYPE_UINT32);
vkCmdDrawIndexed(CommandHandle,VkMesh.IndicesCount(),1,0,0,0); 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()){
vertexBuffer.put(0,mesh.VerticesBuffer().GetBuffer());
vkCmdBindVertexBuffers(CommandHandle,0,vertexBuffer,offsets);
vkCmdBindIndexBuffer(CommandHandle,mesh.IndicesBuffer().GetBuffer(),0,VK_INDEX_TYPE_UINT32);
vkCmdDrawIndexed(CommandHandle,mesh.IndicesCount(),1,0,0,0);
}
}*/
vkCmdEndRendering(CommandHandle); vkCmdEndRendering(CommandHandle);
VulkanUtils.ImageBarrier(MemStack, CommandHandle, SwapChainImage, VulkanUtils.ImageBarrier(MemStack, CommandHandle, SwapChainImage,
@ -259,13 +266,14 @@ public class SceneRender {//dynamic rendering
VK_IMAGE_ASPECT_COLOR_BIT); VK_IMAGE_ASPECT_COLOR_BIT);
} }
} }
private void SetPushConstants(VkCommandBuffer CmdHandle, Matrix4f ProjectionMatrix, Matrix4f modelMatrix){ private void SetPushConstants(VkCommandBuffer CmdHandle, Matrix4f ModelMatrix, int MaterialIndex){
ProjectionMatrix.get(PushConstBuffer); ModelMatrix.get(0,PushConstBuffer);
modelMatrix.get(VulkanUtils.MATRIX4X4_SIZE,PushConstBuffer); PushConstBuffer.putInt(VulkanUtils.MATRIX4X4_SIZE, MaterialIndex);
vkCmdPushConstants(CmdHandle, VkPipeline.GetVulkanPipelineLayout(), VK_SHADER_STAGE_VERTEX_BIT, 0, PushConstBuffer); vkCmdPushConstants(CmdHandle, VkPipeline.GetVulkanPipelineLayout(), VK_SHADER_STAGE_VERTEX_BIT, 0, PushConstBuffer.slice(0,VulkanUtils.MATRIX4X4_SIZE));
vkCmdPushConstants(CmdHandle, VkPipeline.GetVulkanPipelineLayout(), VK_SHADER_STAGE_FRAGMENT_BIT, VulkanUtils.MATRIX4X4_SIZE, PushConstBuffer.slice(VulkanUtils.MATRIX4X4_SIZE, VulkanUtils.INT_SIZE));
} }
public void Resize(VulkanContext VkCtx){ public void Resize(EngineInstance instance, VulkanContext VkCtx){
Arrays.asList(RenderInfo).forEach(VkRenderingInfo::free); Arrays.asList(RenderInfo).forEach(VkRenderingInfo::free);
Arrays.asList(AttInfoDepth).forEach(VkRenderingAttachmentInfo::free); Arrays.asList(AttInfoDepth).forEach(VkRenderingAttachmentInfo::free);
Arrays.asList(AttachmentInfoColour).forEach(VkRenderingAttachmentInfo.Buffer::free); Arrays.asList(AttachmentInfoColour).forEach(VkRenderingAttachmentInfo.Buffer::free);
@ -274,6 +282,19 @@ public class SceneRender {//dynamic rendering
AttachmentInfoColour = CreateColourAttachmentsInfo(VkCtx, ClearValueColour); AttachmentInfoColour = CreateColourAttachmentsInfo(VkCtx, ClearValueColour);
AttInfoDepth = createDepthAttachmentsInfo(VkCtx, AttDepth, ClearValueDepth); AttInfoDepth = createDepthAttachmentsInfo(VkCtx, AttDepth, ClearValueDepth);
RenderInfo = CreateRenderInfo(VkCtx, AttachmentInfoColour, AttInfoDepth); RenderInfo = CreateRenderInfo(VkCtx, AttachmentInfoColour, AttInfoDepth);
VulkanUtils.CopyMatrixToBuffer(VkCtx, BufferProjectionMatrix, instance.scene().GetProjection().GetProjectionMatrix(),0);
}
public void LoadMaterials(VulkanContext VkCtx, MaterialsCache materialsCache, TextureCache textureCache){
DescriptorAllocator descriptorAllocator = VkCtx.GetDescriptorAllocator();
Device device = VkCtx.GetDevice();
DescriptorSet descriptorSet = descriptorAllocator.AddDescriptorSet(device,DESCRIPTOR_ID_MAT,descriptorLayoutFragStorage);
DescriptorSetLayout.LayoutInformation LayoutInfo = descriptorLayoutFragStorage.GetLayoutInfo();
var Buffer = materialsCache.GetMaterialsBuffer();
descriptorSet.SetBuffer(device,Buffer,Buffer.GetRequestedSize(),LayoutInfo.Binding(),LayoutInfo.DescriptorType());
List<ImageView> imageViews = textureCache.GetTextureList().stream().map(Texture::GetImageView).toList();
descriptorSet = VkCtx.GetDescriptorAllocator().AddDescriptorSet(device,DESCRIPTOR_ID_TEXT,descriptorLayoutTexture);
descriptorSet.SetImageArray(device,imageViews,textureSampler,0);
} }
private static VkRenderingInfo[] CreateRenderInfo(VulkanContext vulkanContext, VkRenderingAttachmentInfo.Buffer[] ColourAttachments, VkRenderingAttachmentInfo[] DepthAttachments){ private static VkRenderingInfo[] CreateRenderInfo(VulkanContext vulkanContext, VkRenderingAttachmentInfo.Buffer[] ColourAttachments, VkRenderingAttachmentInfo[] DepthAttachments){
@ -322,6 +343,10 @@ public class SceneRender {//dynamic rendering
MemoryUtil.memFree(PushConstBuffer); MemoryUtil.memFree(PushConstBuffer);
ClearValueDepth.free(); ClearValueDepth.free();
ClearValueColour.free(); ClearValueColour.free();
BufferProjectionMatrix.cleanup(VkCtx);
descriptorLayoutFragStorage.CleanUp(VkCtx);
descriptorLayoutTexture.CleanUp(VkCtx);
descriptorLayoutVertexUniform.CleanUp(VkCtx);
textureSampler.CleanUp(VkCtx);
} }
} }

View file

@ -1,9 +1,15 @@
package net.halbear.Terrain4J.EngineCore.Vulkan.Util; package net.halbear.Terrain4J.EngineCore.Vulkan.Util;
import net.halbear.Terrain4J.EngineCore.Logic.Rendering.VulkanContext; import net.halbear.Terrain4J.EngineCore.Logic.Rendering.VulkanContext;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Shader.DescriptorSet;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.Shader.DescriptorSetLayout;
import net.halbear.Terrain4J.EngineCore.Vulkan.Structure.DeviceLayers.Device;
import org.joml.Matrix4f;
import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryStack;
import org.lwjgl.system.MemoryUtil;
import org.lwjgl.vulkan.*; import org.lwjgl.vulkan.*;
import java.nio.ByteBuffer;
import java.util.Locale; import java.util.Locale;
import static org.lwjgl.vulkan.VK13.*; import static org.lwjgl.vulkan.VK13.*;
@ -17,6 +23,20 @@ public class VulkanUtils {
public static final int MATRIX4X4_SIZE = 16 * FLOAT_SIZE; public static final int MATRIX4X4_SIZE = 16 * FLOAT_SIZE;
public static final int VEC4_SIZE = 4 * FLOAT_SIZE; public static final int VEC4_SIZE = 4 * FLOAT_SIZE;
public static void CopyMatrixToBuffer(VulkanContext VkCtx, VulkanBuffer VkBuffer, Matrix4f matrix, int Offset){
long MappedMemory = VkBuffer.MapMemory(VkCtx);
ByteBuffer matrixBuffer = MemoryUtil.memByteBuffer(MappedMemory, (int)VkBuffer.GetRequestedSize());
matrix.get(Offset, matrixBuffer);
VkBuffer.UnMapMemory(VkCtx);
}
public static VulkanBuffer CreateHostVisibleBuffer(VulkanContext VkCtx, long BufferSize, int Usage, String ID, DescriptorSetLayout layout){
var Buffer = new VulkanBuffer(VkCtx, BufferSize, Usage, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Device device = VkCtx.GetDevice();
DescriptorSet descriptorSet = VkCtx.GetDescriptorAllocator().AddDescriptorSet(device, ID, layout);
descriptorSet.SetBuffer(device, Buffer, Buffer.GetRequestedSize(), layout.GetLayoutInfo().Binding(),layout.GetLayoutInfo().DescriptorType());
return Buffer;
}
public static int MemoryTypeFromProperties(VulkanContext vulkanContext, int TypeBits, int ReqMask){ public static int MemoryTypeFromProperties(VulkanContext vulkanContext, int TypeBits, int ReqMask){
int result = -1; int result = -1;
VkMemoryType.Buffer MemoryTypes = vulkanContext.GetPhysicalDevice().GetMemoryProperties().memoryTypes(); VkMemoryType.Buffer MemoryTypes = vulkanContext.GetPhysicalDevice().GetMemoryProperties().memoryTypes();

View file

@ -28,7 +28,7 @@ vkValidated=true
vsync=false vsync=false
#Vsync images #Vsync images
RequestedImages=3 RequestedImages=3
DefaultTexturePath=/EngineResources/Texture/DefaultTexture.png DefaultTexturePath=Resources/EngineResources/Texture/DefaultTexture.png
#This is the name of the GPU you want the engine to use #This is the name of the GPU you want the engine to use
PhysicalDeviceName= PhysicalDeviceName=