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

View file

@ -44,17 +44,20 @@ public class EngineConfig {
private String PhysicalDeviceName;
private int RequestedImages;
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 float FOV = 60f;
private float zFarPlane;
private float zNearPlane;
private boolean GPU_SUPPORTS_LOGGING = true;
private int MaxDescriptors = 1000;
public void GPU_Does_Not_Support_Logging(){
GPU_SUPPORTS_LOGGING = false;
}
public boolean doesGPUSupportLogging(){return GPU_SUPPORTS_LOGGING;}
public String GetDefaultTexturePath(){return DefaultTexturePath;}
public int GetMaxDescriptors(){return MaxDescriptors;}
private EngineConfig() {
var EngineConfigVar = new Properties();
@ -108,6 +111,7 @@ public class EngineConfig {
TickRate = Integer.parseInt(EngineConfigVar.getOrDefault("master_tick_rate", DEFAULT_TICKRATE).toString());
Width = Integer.parseInt(EngineConfigVar.getOrDefault("display_width", "1280").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());
vkValidated = Boolean.parseBoolean(EngineConfigVar.getOrDefault("vkValidated", false).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_far_plane","100");
EngineConfigVar.setProperty("DefaultTexturePath",DefaultTexturePath);
EngineConfigVar.setProperty("MaxDescriptors","1000");
EngineConfigVar.store(new FileWriter(path.toAbsolutePath().toString() + "/" + FILENAME), "created new properties file");
Logger.debug("Wrote New Config File [{}]", ConfigFile.getAbsolutePath());
} catch (IOException excp2) {

View file

@ -1,8 +1,9 @@
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 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.GameLogic;
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.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 org.joml.Vector3f;
import org.tinylog.Logger;
import java.util.ArrayList;
import java.util.List;
@ -28,54 +31,17 @@ public class GameCore implements GameLogic {
@Override
public InitData Initialise(EngineInstance engineInstance) {
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,
};
List<MeshData> meshDataList = new ArrayList<>();
Scene scene = engineInstance.scene();
List<ModelData> models = new ArrayList<>();
var modelID = "CubeModel";
MeshData meshData = new MeshData("cube_mesh", positions, textCoords, indices);
meshDataList.add(meshData);
ModelData modelData = new ModelData(modelID, meshDataList);
models.add(modelData);
for(int i = 0; i < 1000; i++) {
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()))));
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))));
engineInstance.scene().AddActor(CubeActors.get(i));
}
return new InitData(models);
ModelData SloopModel = ModelLoader.LoadModel("resources/Models/Cube/cube.json");
models.add(SloopModel);
Logger.trace(SloopModel.ID());
Actor SloopActor = new Actor("CubeEntity",SloopModel.ID(),new Vector3f(0.0f,0.0f,-20.0f));
scene.AddActor(SloopActor);
List<MaterialData> materials = new ArrayList<>(ModelLoader.LoadMaterials("resources/Models/Cube/cube_mat.json"));
return new InitData(models,materials);
}
@Override

View file

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

View file

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

View file

@ -53,7 +53,7 @@ public class MaterialsCache {
}
VulkanMaterial newMaterial = new VulkanMaterial(Material.ID());
MaterialsMap.put(newMaterial.ID(), newMaterial);
Logger.trace(Material.toString());
Material.DiffuseColour().get(Offset, data);
data.putInt(Offset + VulkanUtils.VEC4_SIZE, ValidTexture ? 1 : 0);
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){
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.Scene;
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.Pipeline;
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.Shader.*;
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.VulkanMesh;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.VulkanModel;
import net.halbear.Terrain4J.EngineCore.Vulkan.Rendering.VkModel.*;
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.VulkanUtils;
import org.joml.Matrix4f;
@ -25,6 +25,7 @@ import org.lwjgl.system.MemoryStack;
import org.lwjgl.system.MemoryUtil;
import org.lwjgl.util.shaderc.Shaderc;
import org.lwjgl.vulkan.*;
import org.tinylog.Logger;
import java.nio.ByteBuffer;
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 BuildInfo = new PipelineBuildInfo(ShaderModules,vertexBufferStructure.getVertexInput(),
VkCtx.GetSurface().GetSurfaceFormat().ImageFormat())
.SetDepthFormat(DEPTH_FORMAT)
.SetPushConstantRanges(
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);
vertexBufferStructure.cleanup();
return pipeline;
@ -182,7 +185,7 @@ public class SceneRender {//dynamic rendering
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);
try(var MemStack = MemoryStack.stackPush()){
SwapChain swapChain = vulkanContext.GetSwapChain();
@ -221,35 +224,39 @@ public class SceneRender {//dynamic rendering
LongBuffer offsets = MemStack.mallocLong(1).put(0,0L);
LongBuffer vertexBuffer = MemStack.mallocLong(1);
Scene scene = engineInstance.scene();
List<Actor> Actors = scene.GetActors();
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++){
var Actor = Actors.get(i);
VulkanModel model = modelsCache.GetModel(Actor.GetModelID());
List<VulkanMesh> 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);
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());
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()){
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);
VulkanUtils.ImageBarrier(MemStack, CommandHandle, SwapChainImage,
@ -259,13 +266,14 @@ public class SceneRender {//dynamic rendering
VK_IMAGE_ASPECT_COLOR_BIT);
}
}
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);
private void SetPushConstants(VkCommandBuffer CmdHandle, Matrix4f ModelMatrix, int MaterialIndex){
ModelMatrix.get(0,PushConstBuffer);
PushConstBuffer.putInt(VulkanUtils.MATRIX4X4_SIZE, MaterialIndex);
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(AttInfoDepth).forEach(VkRenderingAttachmentInfo::free);
Arrays.asList(AttachmentInfoColour).forEach(VkRenderingAttachmentInfo.Buffer::free);
@ -274,6 +282,19 @@ public class SceneRender {//dynamic rendering
AttachmentInfoColour = CreateColourAttachmentsInfo(VkCtx, ClearValueColour);
AttInfoDepth = createDepthAttachmentsInfo(VkCtx, AttDepth, ClearValueDepth);
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){
@ -322,6 +343,10 @@ public class SceneRender {//dynamic rendering
MemoryUtil.memFree(PushConstBuffer);
ClearValueDepth.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;
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.MemoryUtil;
import org.lwjgl.vulkan.*;
import java.nio.ByteBuffer;
import java.util.Locale;
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 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){
int result = -1;
VkMemoryType.Buffer MemoryTypes = vulkanContext.GetPhysicalDevice().GetMemoryProperties().memoryTypes();

View file

@ -28,7 +28,7 @@ vkValidated=true
vsync=false
#Vsync images
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
PhysicalDeviceName=