Skip to content

Commit ab514b7

Browse files
committed
added GeometryBatch to cleanly and optimally handling renders; a lot more miscellaneous changes
1 parent d3860c6 commit ab514b7

29 files changed

+2152
-0
lines changed
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package com.jme3.scene.mesh;
2+
3+
import com.jme3.scene.GlVertexBuffer;
4+
import com.jme3.util.BufferUtils;
5+
import com.jme3.vulkan.mesh.AttributeModifier;
6+
import com.jme3.vulkan.mesh.VertexWriter;
7+
8+
import java.nio.ByteBuffer;
9+
10+
public class GlMeshModifier implements AttributeModifier {
11+
12+
private final GlVertexBuffer vertices;
13+
private final ByteBuffer buffer;
14+
private final int bytesPerComponent;
15+
16+
public GlMeshModifier(GlVertexBuffer vertices) {
17+
this.vertices = vertices;
18+
this.buffer = BufferUtils.interfaceByteBuffer(vertices.getData());
19+
this.bytesPerComponent = vertices.getStride() / vertices.getNumComponents();
20+
}
21+
22+
@Override
23+
public void close() {}
24+
25+
public int vertexToPosition(int vertex) {
26+
return vertex * vertices.getStride();
27+
}
28+
29+
public int vertexToPosition(int vertex, int component) {
30+
return vertex * vertices.getStride() + component * bytesPerComponent;
31+
}
32+
33+
public int positionToVertex(int position) {
34+
return position / vertices.getStride();
35+
}
36+
37+
@Override
38+
public VertexWriter limit(int vertex) {
39+
buffer.limit(vertexToPosition(vertex));
40+
return this;
41+
}
42+
43+
@Override
44+
public VertexWriter putByte(int vertex, int component, byte value) {
45+
buffer.put(vertexToPosition(vertex, component), value);
46+
return this;
47+
}
48+
49+
@Override
50+
public VertexWriter putShort(int vertex, int component, short value) {
51+
buffer.putShort(vertexToPosition(vertex, component), value);
52+
return this;
53+
}
54+
55+
@Override
56+
public VertexWriter putInt(int vertex, int component, int value) {
57+
buffer.putInt(vertexToPosition(vertex, component), value);
58+
return this;
59+
}
60+
61+
@Override
62+
public VertexWriter putFloat(int vertex, int component, float value) {
63+
buffer.putFloat(vertexToPosition(vertex, component), value);
64+
return this;
65+
}
66+
67+
@Override
68+
public VertexWriter putDouble(int vertex, int component, double value) {
69+
buffer.putDouble(vertexToPosition(vertex, component), value);
70+
return this;
71+
}
72+
73+
@Override
74+
public VertexWriter putLong(int vertex, int component, long value) {
75+
buffer.putLong(vertexToPosition(vertex, component), value);
76+
return this;
77+
}
78+
79+
@Override
80+
public int capacity() {
81+
return positionToVertex(buffer.position());
82+
}
83+
84+
@Override
85+
public int limit() {
86+
return positionToVertex(buffer.limit());
87+
}
88+
89+
@Override
90+
public int components() {
91+
return vertices.getNumComponents();
92+
}
93+
94+
@Override
95+
public byte getByte(int vertex, int component) {
96+
return buffer.get(vertexToPosition(vertex, component));
97+
}
98+
99+
@Override
100+
public short getShort(int vertex, int component) {
101+
return buffer.getShort(vertexToPosition(vertex, component));
102+
}
103+
104+
@Override
105+
public int getInt(int vertex, int component) {
106+
return buffer.getInt(vertexToPosition(vertex, component));
107+
}
108+
109+
@Override
110+
public float getFloat(int vertex, int component) {
111+
return buffer.getFloat(vertexToPosition(vertex, component));
112+
}
113+
114+
@Override
115+
public double getDouble(int vertex, int component) {
116+
return buffer.getDouble(vertexToPosition(vertex, component));
117+
}
118+
119+
@Override
120+
public long getLong(int vertex, int component) {
121+
return buffer.getLong(vertexToPosition(vertex, component));
122+
}
123+
124+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.jme3.util;
2+
3+
import org.lwjgl.system.MemoryStack;
4+
5+
public abstract class AbstractBuilder implements AutoCloseable {
6+
7+
protected final MemoryStack stack = MemoryStack.stackPush();
8+
9+
@Override
10+
public void close() {
11+
build();
12+
stack.pop();
13+
}
14+
15+
protected abstract void build();
16+
17+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.jme3.util;
2+
3+
import java.util.Iterator;
4+
5+
public class ArrayIterator <T> implements Iterable<T>, Iterator<T> {
6+
7+
private final T[] array;
8+
private int index = 0;
9+
10+
@SafeVarargs
11+
public ArrayIterator(T... array) {
12+
this.array = array;
13+
}
14+
15+
@Override
16+
public Iterator<T> iterator() {
17+
return this;
18+
}
19+
20+
@Override
21+
public boolean hasNext() {
22+
return index < array.length;
23+
}
24+
25+
@Override
26+
public T next() {
27+
return array[index++];
28+
}
29+
30+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package com.jme3.util;
2+
3+
import com.jme3.util.natives.Native;
4+
import com.jme3.util.natives.NativeReference;
5+
import com.jme3.vulkan.buffers.GpuBuffer;
6+
import com.jme3.vulkan.memory.MemorySize;
7+
import org.lwjgl.PointerBuffer;
8+
import org.lwjgl.system.MemoryUtil;
9+
10+
import java.nio.*;
11+
12+
public class NioBuffer implements GpuBuffer, Native<Long> {
13+
14+
private final PointerBuffer address = MemoryUtil.memCallocPointer(1);
15+
private final NativeReference ref;
16+
private ByteBuffer buffer;
17+
private MemorySize size;
18+
private int padding;
19+
private long baseBufferAddress;
20+
private int lastMappedOffset = -1;
21+
22+
public NioBuffer(MemorySize size) {
23+
this(size, 0);
24+
}
25+
26+
public NioBuffer(MemorySize size, int padding) {
27+
this.size = size;
28+
this.padding = padding;
29+
buffer = MemoryUtil.memCalloc(size.getElements() + padding, size.getBytesPerElement());
30+
buffer.limit(size.getBytes());
31+
baseBufferAddress = MemoryUtil.memAddress(buffer, 0);
32+
ref = Native.get().register(this);
33+
}
34+
35+
@Override
36+
public PointerBuffer map(int offset, int size) {
37+
if (offset < 0) {
38+
throw new IllegalArgumentException("Offset cannot be negative.");
39+
}
40+
if (offset != lastMappedOffset) {
41+
if (offset == 0) {
42+
address.put(0, baseBufferAddress);
43+
} else {
44+
address.put(0, MemoryUtil.memAddress(buffer, offset));
45+
}
46+
lastMappedOffset = offset;
47+
}
48+
return address;
49+
}
50+
51+
@Override
52+
public void unmap() {}
53+
54+
@Override
55+
public MemorySize size() {
56+
return size;
57+
}
58+
59+
@Override
60+
public long getId() {
61+
return baseBufferAddress;
62+
}
63+
64+
@Override
65+
public void resize(int elements) {
66+
if (elements < 0) {
67+
throw new IllegalArgumentException("Buffer size cannot be negative.");
68+
}
69+
if (elements != size.getElements()) {
70+
size = new MemorySize(elements, size.getBytesPerElement());
71+
if (size.getBytes() > buffer.capacity()) {
72+
ByteBuffer newBuffer = MemoryUtil.memRealloc(buffer, size.getBytes(padding));
73+
if (newBuffer != buffer) {
74+
buffer = newBuffer;
75+
baseBufferAddress = MemoryUtil.memAddress(buffer, 0);
76+
ref.refresh();
77+
}
78+
}
79+
buffer.limit(size.getBytes());
80+
}
81+
}
82+
83+
@Override
84+
public Long getNativeObject() {
85+
return baseBufferAddress;
86+
}
87+
88+
@Override
89+
public Runnable createNativeDestroyer() {
90+
return () -> {
91+
MemoryUtil.memFree(buffer);
92+
MemoryUtil.memFree(address);
93+
};
94+
}
95+
96+
@Override
97+
public void prematureNativeDestruction() {}
98+
99+
@Override
100+
public NativeReference getNativeReference() {
101+
return ref;
102+
}
103+
104+
public void setPadding(int padding) {
105+
this.padding = padding;
106+
}
107+
108+
public ByteBuffer getBuffer() {
109+
return buffer;
110+
}
111+
112+
public int getPadding() {
113+
return padding;
114+
}
115+
116+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.jme3.vulkan;
2+
3+
import com.jme3.vulkan.util.IntEnum;
4+
import org.lwjgl.vulkan.KHRSurface;
5+
6+
public enum ColorSpace implements IntEnum<ColorSpace> {
7+
8+
KhrSrgbNonlinear(KHRSurface.VK_COLOR_SPACE_SRGB_NONLINEAR_KHR);
9+
10+
private final int vkEnum;
11+
12+
ColorSpace(int vkEnum) {
13+
this.vkEnum = vkEnum;
14+
}
15+
16+
@Override
17+
public int getEnum() {
18+
return vkEnum;
19+
}
20+
21+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.jme3.vulkan;
2+
3+
import com.jme3.vulkan.util.Flag;
4+
5+
import static org.lwjgl.vulkan.VK10.*;
6+
7+
public enum FormatFeature implements Flag<FormatFeature> {
8+
9+
DepthStencilAttachment(VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT),
10+
BlitDst(VK_FORMAT_FEATURE_BLIT_DST_BIT),
11+
BlitSrc(VK_FORMAT_FEATURE_BLIT_SRC_BIT),
12+
ColorAttachment(VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT),
13+
ColorAttachmentBlend(VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT),
14+
SampledImage(VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT),
15+
SampledImageFilterLinear(VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT),
16+
StorageImageAtomic(VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT),
17+
StorageImage(VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT),
18+
StorageTexelBufferAtomic(VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT),
19+
StorageTexelBuffer(VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT),
20+
UniformTexelBuffer(VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT),
21+
VertexBuffer(VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT);
22+
23+
private final int bits;
24+
25+
FormatFeature(int bits) {
26+
this.bits = bits;
27+
}
28+
29+
@Override
30+
public int bits() {
31+
return 0;
32+
}
33+
34+
}

0 commit comments

Comments
 (0)