It crashes
This commit is contained in:
parent
c2aa4ec895
commit
66783c4cc5
24 changed files with 27993 additions and 82 deletions
|
|
@ -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){
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ public class DescriptorSet {
|
|||
.sType$Default()
|
||||
.dstSet(VkDescriptorSet)
|
||||
.dstBinding(Binding)
|
||||
.descriptorType(Type)
|
||||
.descriptorCount(1)
|
||||
.pBufferInfo(BufferInfo);
|
||||
vkUpdateDescriptorSets(device.FetchVulkanDevice(),DescriptorBuffer,null);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue