more than 1 model support
parent
037337fff8
commit
6d203ac01b
|
@ -119,6 +119,7 @@ import com.github.hydos.ginger.engine.vulkan.misc.AlignmentUtils;
|
|||
import com.github.hydos.ginger.engine.vulkan.misc.Frame;
|
||||
import com.github.hydos.ginger.engine.vulkan.misc.VKModelLoader;
|
||||
import com.github.hydos.ginger.engine.vulkan.misc.VKModelLoader.VKMesh;
|
||||
import com.github.hydos.ginger.engine.vulkan.render.VKBufferMesh;
|
||||
import com.github.hydos.ginger.engine.vulkan.render.VKRenderManager;
|
||||
import com.github.hydos.ginger.engine.vulkan.render.renderers.EntityRenderer;
|
||||
import com.github.hydos.ginger.engine.vulkan.swapchain.VKSwapchainManager;
|
||||
|
@ -267,8 +268,6 @@ public class VulkanExample {
|
|||
createTextureImageView();
|
||||
createTextureSampler();
|
||||
loadModel();
|
||||
createVertexBuffer();
|
||||
createIndexBuffer();
|
||||
createDescriptorSetLayout();
|
||||
VKSwapchainManager.createSwapChainObjects();
|
||||
createSyncObjects();
|
||||
|
@ -1159,32 +1158,15 @@ public class VulkanExample {
|
|||
File modelFile = new File(ClassLoader.getSystemClassLoader().getResource("models/chalet.obj").getFile());
|
||||
|
||||
VKMesh model = VKModelLoader.loadModel(modelFile, aiProcess_FlipUVs | aiProcess_DropNormals);
|
||||
|
||||
final int vertexCount = model.positions.size();
|
||||
|
||||
VKVariables.vertices = new VKVertex[vertexCount];
|
||||
|
||||
final Vector3fc color = new Vector3f(1.0f, 1.0f, 1.0f);
|
||||
|
||||
for(int i = 0;i < vertexCount;i++) {
|
||||
VKVariables.vertices[i] = new VKVertex(
|
||||
model.positions.get(i),
|
||||
color,
|
||||
model.texCoords.get(i));
|
||||
}
|
||||
|
||||
VKVariables.indices = new int[model.indices.size()];
|
||||
|
||||
for(int i = 0;i < VKVariables.indices.length;i++) {
|
||||
VKVariables.indices[i] = model.indices.get(i);
|
||||
}
|
||||
EntityRenderer renderer = (EntityRenderer) VKRenderManager.getInstance().renderers.get(0); //tmp
|
||||
renderer.processEntity(model);
|
||||
}
|
||||
|
||||
private void createVertexBuffer() {
|
||||
public static VKBufferMesh createVertexBuffer(VKBufferMesh processedMesh) {
|
||||
|
||||
try(MemoryStack stack = stackPush()) {
|
||||
|
||||
long bufferSize = VKVertex.SIZEOF * VKVariables.vertices.length;
|
||||
long bufferSize = VKVertex.SIZEOF * processedMesh.vertices.length;
|
||||
|
||||
LongBuffer pBuffer = stack.mallocLong(1);
|
||||
LongBuffer pBufferMemory = stack.mallocLong(1);
|
||||
|
@ -1201,7 +1183,7 @@ public class VulkanExample {
|
|||
|
||||
vkMapMemory(VKVariables.device, stagingBufferMemory, 0, bufferSize, 0, data);
|
||||
{
|
||||
memcpy(data.getByteBuffer(0, (int) bufferSize), VKVariables.vertices);
|
||||
memcpy(data.getByteBuffer(0, (int) bufferSize), processedMesh.vertices);
|
||||
}
|
||||
vkUnmapMemory(VKVariables.device, stagingBufferMemory);
|
||||
|
||||
|
@ -1211,21 +1193,23 @@ public class VulkanExample {
|
|||
pBuffer,
|
||||
pBufferMemory);
|
||||
|
||||
VKVariables.vertexBuffer = pBuffer.get(0);
|
||||
VKVariables.vertexBufferMemory = pBufferMemory.get(0);
|
||||
processedMesh.vertexBuffer = pBuffer.get(0);
|
||||
processedMesh.vertexBufferMemory = pBufferMemory.get(0);
|
||||
|
||||
copyBuffer(stagingBuffer, VKVariables.vertexBuffer, bufferSize);
|
||||
copyBuffer(stagingBuffer, processedMesh.vertexBuffer, bufferSize);
|
||||
|
||||
vkDestroyBuffer(VKVariables.device, stagingBuffer, null);
|
||||
vkFreeMemory(VKVariables.device, stagingBufferMemory, null);
|
||||
|
||||
return processedMesh;
|
||||
}
|
||||
}
|
||||
|
||||
private void createIndexBuffer() {
|
||||
public static VKBufferMesh createIndexBuffer(VKBufferMesh processedMesh) {
|
||||
|
||||
try(MemoryStack stack = stackPush()) {
|
||||
|
||||
long bufferSize = Integer.BYTES * VKVariables.indices.length;
|
||||
long bufferSize = Integer.BYTES * processedMesh.indices.length;
|
||||
|
||||
LongBuffer pBuffer = stack.mallocLong(1);
|
||||
LongBuffer pBufferMemory = stack.mallocLong(1);
|
||||
|
@ -1242,7 +1226,7 @@ public class VulkanExample {
|
|||
|
||||
vkMapMemory(VKVariables.device, stagingBufferMemory, 0, bufferSize, 0, data);
|
||||
{
|
||||
memcpy(data.getByteBuffer(0, (int) bufferSize), VKVariables.indices);
|
||||
memcpy(data.getByteBuffer(0, (int) bufferSize), processedMesh.indices);
|
||||
}
|
||||
vkUnmapMemory(VKVariables.device, stagingBufferMemory);
|
||||
|
||||
|
@ -1252,13 +1236,14 @@ public class VulkanExample {
|
|||
pBuffer,
|
||||
pBufferMemory);
|
||||
|
||||
VKVariables.indexBuffer = pBuffer.get(0);
|
||||
VKVariables.indexBufferMemory = pBufferMemory.get(0);
|
||||
processedMesh.indexBuffer = pBuffer.get(0);
|
||||
processedMesh.indexBufferMemory = pBufferMemory.get(0);
|
||||
|
||||
copyBuffer(stagingBuffer, VKVariables.indexBuffer, bufferSize);
|
||||
copyBuffer(stagingBuffer, processedMesh.indexBuffer, bufferSize);
|
||||
|
||||
vkDestroyBuffer(VKVariables.device, stagingBuffer, null);
|
||||
vkFreeMemory(VKVariables.device, stagingBufferMemory, null);
|
||||
return processedMesh;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1452,7 +1437,7 @@ public class VulkanExample {
|
|||
}
|
||||
}
|
||||
|
||||
private void copyBuffer(long srcBuffer, long dstBuffer, long size) {
|
||||
private static void copyBuffer(long srcBuffer, long dstBuffer, long size) {
|
||||
|
||||
try(MemoryStack stack = stackPush()) {
|
||||
|
||||
|
@ -1467,7 +1452,7 @@ public class VulkanExample {
|
|||
}
|
||||
}
|
||||
|
||||
private void memcpy(ByteBuffer buffer, VKVertex[] vertices) {
|
||||
private static void memcpy(ByteBuffer buffer, VKVertex[] vertices) {
|
||||
for(VKVertex vertex : vertices) {
|
||||
buffer.putFloat(vertex.pos.x());
|
||||
buffer.putFloat(vertex.pos.y());
|
||||
|
@ -1482,7 +1467,7 @@ public class VulkanExample {
|
|||
}
|
||||
}
|
||||
|
||||
private void memcpy(ByteBuffer buffer, int[] indices) {
|
||||
private static void memcpy(ByteBuffer buffer, int[] indices) {
|
||||
|
||||
for(int index : indices) {
|
||||
buffer.putInt(index);
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
package com.github.hydos.ginger.engine.vulkan.render;
|
||||
|
||||
import com.github.hydos.ginger.VulkanExample.VKVertex;
|
||||
import com.github.hydos.ginger.engine.vulkan.misc.VKModelLoader.VKMesh;
|
||||
|
||||
public class VKBufferMesh
|
||||
{
|
||||
|
||||
public long vertexBuffer;
|
||||
public long indexBuffer;
|
||||
public VKMesh vkMesh;
|
||||
public int[] indices;
|
||||
public VKVertex[] vertices;
|
||||
public long vertexBufferMemory;
|
||||
public long indexBufferMemory;
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -8,36 +8,80 @@ import static org.lwjgl.vulkan.VK10.vkCmdBindVertexBuffers;
|
|||
import static org.lwjgl.vulkan.VK10.vkCmdDrawIndexed;
|
||||
|
||||
import java.nio.LongBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.joml.Vector3f;
|
||||
import org.joml.Vector3fc;
|
||||
import org.lwjgl.system.MemoryStack;
|
||||
import org.lwjgl.vulkan.VkCommandBuffer;
|
||||
|
||||
import com.github.hydos.ginger.VulkanExample;
|
||||
import com.github.hydos.ginger.VulkanExample.VKVertex;
|
||||
import com.github.hydos.ginger.engine.common.render.Renderer;
|
||||
import com.github.hydos.ginger.engine.vulkan.VKVariables;
|
||||
import com.github.hydos.ginger.engine.vulkan.misc.VKModelLoader.VKMesh;
|
||||
import com.github.hydos.ginger.engine.vulkan.render.VKBufferMesh;
|
||||
|
||||
public class EntityRenderer extends Renderer
|
||||
{
|
||||
|
||||
public List<VKBufferMesh> entities;//TODO: batch rendering
|
||||
|
||||
public EntityRenderer() {
|
||||
priority = 1;
|
||||
entities = new ArrayList<VKBufferMesh>();
|
||||
}
|
||||
|
||||
public void processEntity(VKMesh mesh) {
|
||||
VKBufferMesh processedMesh = new VKBufferMesh();
|
||||
processedMesh.vkMesh = mesh;
|
||||
int vertexCount = mesh.positions.size();
|
||||
|
||||
processedMesh.vertices = new VKVertex[vertexCount];
|
||||
|
||||
Vector3f color = new Vector3f(1.0f, 1.0f, 1.0f);
|
||||
|
||||
for(int i = 0;i < vertexCount;i++) {
|
||||
processedMesh.vertices[i] = new VKVertex(
|
||||
mesh.positions.get(i),
|
||||
color,
|
||||
mesh.texCoords.get(i));
|
||||
}
|
||||
|
||||
processedMesh.indices = new int[mesh.indices.size()];
|
||||
|
||||
for(int i = 0;i < processedMesh.indices.length;i++) {
|
||||
processedMesh.indices[i] = mesh.indices.get(i);
|
||||
}
|
||||
|
||||
processedMesh = VulkanExample.createVertexBuffer(processedMesh);
|
||||
processedMesh = VulkanExample.createIndexBuffer(processedMesh);
|
||||
entities.add(processedMesh);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void VKRender(MemoryStack stack, VkCommandBuffer commandBuffer, int index)
|
||||
{
|
||||
LongBuffer vertexBuffers = stack.longs(VKVariables.vertexBuffer);
|
||||
LongBuffer offsets = stack.longs(0);
|
||||
vkCmdBindVertexBuffers(commandBuffer, 0, vertexBuffers, offsets);
|
||||
|
||||
for(VKBufferMesh entity : entities)
|
||||
{
|
||||
LongBuffer vertexBuffers = stack.longs(entity.vertexBuffer);
|
||||
LongBuffer offsets = stack.longs(0);
|
||||
vkCmdBindVertexBuffers(commandBuffer, 0, vertexBuffers, offsets);
|
||||
|
||||
vkCmdBindIndexBuffer(commandBuffer, VKVariables.indexBuffer, 0, VK_INDEX_TYPE_UINT32);
|
||||
vkCmdBindIndexBuffer(commandBuffer, entity.indexBuffer, 0, VK_INDEX_TYPE_UINT32);
|
||||
|
||||
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
|
||||
VKVariables.pipelineLayout,
|
||||
0, stack.longs(
|
||||
VKVariables.descriptorSets.get(index)
|
||||
),
|
||||
null);
|
||||
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
|
||||
VKVariables.pipelineLayout,
|
||||
0, stack.longs(
|
||||
VKVariables.descriptorSets.get(index)
|
||||
),
|
||||
null);
|
||||
|
||||
vkCmdDrawIndexed(commandBuffer, entity.vkMesh.indices.size(), 1, 0, 0, 0);
|
||||
}
|
||||
|
||||
vkCmdDrawIndexed(commandBuffer, VKVariables.indices.length, 1, 0, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue