Skip to content

Commit 381b05d

Browse files
committed
start using Jackson to parse yaml matdefs
1 parent d8dd146 commit 381b05d

File tree

13 files changed

+367
-21
lines changed

13 files changed

+367
-21
lines changed

jme3-core/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ dependencies {
2020
testImplementation project(':jme3-desktop')
2121
testRuntimeOnly project(':jme3-plugins')
2222

23+
// jackson yaml parsing
24+
implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.14.2"
25+
2326
// Use LWJGL3 directly in core. This destroys LWJGL2 and JOGL compatibility.
2427
api (libs.lwjgl3.awt) {
2528
exclude group: 'org.lwjgl', module: 'lwjgl'
@@ -34,6 +37,7 @@ dependencies {
3437
api libs.lwjgl3.vulkan
3538
api libs.lwjgl3.shaderc
3639

40+
// include natives
3741
runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-windows') })
3842
runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-windows-x86') })
3943
runtimeOnly(variantOf(libs.lwjgl3.base){ classifier('natives-linux') })

jme3-core/src/main/java/com/jme3/material/Material.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@
3636
import com.jme3.scene.Geometry;
3737
import com.jme3.texture.Texture;
3838
import com.jme3.vulkan.buffers.GpuBuffer;
39-
import com.jme3.vulkan.frames.SingleResource;
40-
import com.jme3.vulkan.frames.VersionedResource;
4139

4240
/**
4341
* <code>Material</code> describes the rendering style for a given
@@ -48,7 +46,7 @@
4846
* shader.
4947
* </p>
5048
*
51-
* @author Kirill Vainer
49+
* @author codex
5250
*/
5351
public interface Material extends Savable {
5452

jme3-core/src/main/java/com/jme3/math/Matrix3f.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@
3434
import com.jme3.export.*;
3535
import com.jme3.util.BufferUtils;
3636
import com.jme3.util.TempVars;
37+
import com.jme3.vulkan.buffers.BufferMember;
38+
3739
import java.io.IOException;
40+
import java.nio.ByteBuffer;
3841
import java.nio.FloatBuffer;
3942
import java.util.logging.Logger;
4043

@@ -55,7 +58,7 @@
5558
* @author Mark Powell
5659
* @author Joshua Slack
5760
*/
58-
public final class Matrix3f implements Savable, Cloneable, java.io.Serializable {
61+
public final class Matrix3f implements BufferMember, Savable, Cloneable, java.io.Serializable {
5962

6063
static final long serialVersionUID = 1;
6164

@@ -1500,4 +1503,17 @@ public Matrix3f clone() {
15001503
throw new AssertionError(); // can not happen
15011504
}
15021505
}
1506+
1507+
@Override
1508+
public void fillBuffer(ByteBuffer buffer) {
1509+
buffer.putFloat(m00).putFloat(m10).putFloat(m20)
1510+
.putFloat(m01).putFloat(m11).putFloat(m21)
1511+
.putFloat(m02).putFloat(m12).putFloat(m22);
1512+
}
1513+
1514+
@Override
1515+
public int getSizeInBytes() {
1516+
return 9 * Float.BYTES;
1517+
}
1518+
15031519
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.jme3.vulkan.buffers;
2+
3+
import java.nio.ByteBuffer;
4+
5+
public interface BufferMember {
6+
7+
/**
8+
* Fills {@link #getSizeInBytes()} bytes of {@code buffer},
9+
* starting from the buffer's current position and incrementing
10+
* the position by {@link #getSizeInBytes()} bytes.
11+
*
12+
* @param buffer buffer to fill
13+
*/
14+
void fillBuffer(ByteBuffer buffer);
15+
16+
/**
17+
* Gets the size of this member in bytes.
18+
*
19+
* @return size in bytes
20+
*/
21+
int getSizeInBytes();
22+
23+
}

jme3-core/src/main/java/com/jme3/vulkan/descriptors/Descriptor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import com.jme3.vulkan.util.IntEnum;
44

5+
import java.util.HashMap;
6+
import java.util.Map;
7+
58
import static org.lwjgl.vulkan.VK10.*;
69

710
public enum Descriptor implements IntEnum<Descriptor> {
@@ -29,4 +32,6 @@ public int getEnum() {
2932
return vkEnum;
3033
}
3134

35+
private static final Map<String, IntEnum<Descriptor>> custom = new HashMap<>();
36+
3237
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.jme3.vulkan.material;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
6+
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
7+
import com.jme3.vulkan.descriptors.Descriptor;
8+
import com.jme3.vulkan.descriptors.DescriptorPool;
9+
import com.jme3.vulkan.material.uniforms.BufferUniform;
10+
import com.jme3.vulkan.material.uniforms.TextureUniform;
11+
import com.jme3.vulkan.material.uniforms.Uniform;
12+
import com.jme3.vulkan.pipelines.GraphicsPipeline;
13+
import com.jme3.vulkan.util.ReflectionArgs;
14+
15+
import java.io.IOException;
16+
import java.io.InputStream;
17+
import java.lang.reflect.InvocationTargetException;
18+
import java.util.*;
19+
import java.util.function.BiFunction;
20+
import java.util.function.Function;
21+
22+
public class LoadedMaterial extends NewMaterial {
23+
24+
private static final Map<String, Function<ReflectionArgs, Object>> natives = new HashMap<>();
25+
26+
public LoadedMaterial(DescriptorPool pool, String fileName) {
27+
super(pool);
28+
ObjectMapper mapper = YAMLMapper.builder()
29+
.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER)
30+
.build();
31+
InputStream stream = null;
32+
Map<Integer, List<Uniform<?>>> sets = new HashMap<>();
33+
try {
34+
JsonNode root = mapper.readTree(stream);
35+
JsonNode imports = root.get("imports");
36+
JsonNode parameters = root.get("parameters");
37+
parameters.fields();
38+
for (Iterator<Map.Entry<String, JsonNode>> it = parameters.fields(); it.hasNext();) {
39+
Map.Entry<String, JsonNode> param = it.next();
40+
int set = Objects.requireNonNull(param.getValue().get("set"),
41+
"Set index not defined in \"" + param.getKey() + "\"").asInt();
42+
sets.computeIfAbsent(set, n -> new ArrayList<>()).add(
43+
instantiate(param.getKey(), param.getValue(), imports));
44+
}
45+
// add uniforms to sets
46+
for (Map.Entry<Integer, List<Uniform<?>>> set : sets.entrySet()) {
47+
addSet(set.getKey(), set.getValue().toArray(new Uniform[0]));
48+
}
49+
// load pipelines
50+
JsonNode pipelines = root.get("pipelines");
51+
for (Iterator<Map.Entry<String, JsonNode>> it = pipelines.fields(); it.hasNext();) {
52+
Map.Entry<String, JsonNode> pipeline = it.next();
53+
Object state = instantiate(pipeline.getKey(), pipeline.getValue(), imports);
54+
}
55+
} catch (IOException
56+
| ClassNotFoundException
57+
| NoSuchMethodException
58+
| InvocationTargetException
59+
| InstantiationException
60+
| IllegalAccessException e) {
61+
throw new RuntimeException(e);
62+
}
63+
}
64+
65+
}

jme3-core/src/main/java/com/jme3/vulkan/material/UniformSet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public UniformSet(int setIndex, Uniform... uniforms) {
2222
for (Uniform u : uniforms) {
2323
int i = u.getBindingIndex();
2424
if (bindings.get(i)) {
25-
throw new IllegalArgumentException("Duplicate binding index in set: " + u.getBindingIndex());
25+
throw new IllegalArgumentException("Duplicate binding index in set " + setIndex + ": " + u.getBindingIndex());
2626
}
2727
bindings.set(i);
2828
}

jme3-core/src/main/java/com/jme3/vulkan/material/uniforms/AbstractUniform.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package com.jme3.vulkan.material.uniforms;
22

3+
import com.fasterxml.jackson.databind.JsonNode;
34
import com.jme3.vulkan.descriptors.Descriptor;
45
import com.jme3.vulkan.descriptors.SetLayoutBinding;
56
import com.jme3.vulkan.frames.VersionedResource;
67
import com.jme3.vulkan.shader.ShaderStage;
78
import com.jme3.vulkan.util.Flag;
9+
import com.jme3.vulkan.util.FlagParser;
810
import com.jme3.vulkan.util.IntEnum;
11+
import com.jme3.vulkan.util.ReflectionArgs;
12+
13+
import java.util.Objects;
914

1015
public abstract class AbstractUniform <T> implements Uniform<T> {
1116

@@ -22,6 +27,15 @@ public AbstractUniform(String name, IntEnum<Descriptor> type, int bindingIndex,
2227
this.stages = stages;
2328
}
2429

30+
public AbstractUniform(IntEnum<Descriptor> type, ReflectionArgs args) {
31+
this.name = args.getName();
32+
this.type = type;
33+
this.bindingIndex = Objects.requireNonNull(args.getProperties().get("binding"),
34+
"Binding index is not specified for \"" + name + "\"").asInt();
35+
this.stages = FlagParser.parseFlag(ShaderStage.class,
36+
args.getProperties().get("stages"), ShaderStage.All);
37+
}
38+
2539
@Override
2640
public SetLayoutBinding createBinding() {
2741
return new SetLayoutBinding(type, bindingIndex, 1, stages);

jme3-core/src/main/java/com/jme3/vulkan/material/uniforms/BufferUniform.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,53 @@
11
package com.jme3.vulkan.material.uniforms;
22

3+
import com.fasterxml.jackson.databind.JsonNode;
34
import com.jme3.vulkan.buffers.*;
5+
import com.jme3.vulkan.buffers.generate.BufferGenerator;
46
import com.jme3.vulkan.descriptors.Descriptor;
57
import com.jme3.vulkan.descriptors.DescriptorSetWriter;
68
import com.jme3.vulkan.descriptors.SetLayoutBinding;
9+
import com.jme3.vulkan.memory.MemorySize;
10+
import com.jme3.vulkan.mesh.AccessFrequency;
711
import com.jme3.vulkan.shader.ShaderStage;
812
import com.jme3.vulkan.util.Flag;
913
import com.jme3.vulkan.util.IntEnum;
14+
import com.jme3.vulkan.util.ReflectionArgs;
1015
import org.lwjgl.system.MemoryStack;
1116
import org.lwjgl.vulkan.VkDescriptorBufferInfo;
1217
import org.lwjgl.vulkan.VkWriteDescriptorSet;
1318

14-
import java.util.Objects;
19+
import java.nio.ByteBuffer;
20+
import java.util.*;
1521

1622
public class BufferUniform extends AbstractUniform<GpuBuffer> {
1723

1824
public BufferUniform(String name, IntEnum<Descriptor> type, int bindingIndex, Flag<ShaderStage> stages) {
1925
super(name, type, bindingIndex, stages);
2026
}
2127

28+
public BufferUniform(IntEnum<Descriptor> type, ReflectionArgs args) {
29+
super(type, args);
30+
if (args.getProperties().has("usage")) {
31+
AccessFrequency usage = AccessFrequency.valueOf(args.getProperties().get("usage").asText());
32+
List<BufferMember> members = new ArrayList<>();
33+
int size = 0;
34+
for (Iterator<Map.Entry<String, JsonNode>> it = args.getProperties().get("layout").fields(); it.hasNext();) {
35+
Map.Entry<String, JsonNode> el = it.next();
36+
BufferMember member = args.create(el.getKey(), el.getValue()).instantiate();
37+
members.add(member);
38+
size += member.getSizeInBytes();
39+
}
40+
value = args.getGenerator().createBuffer(MemorySize.bytes(size), BufferUsage.Uniform, usage);
41+
ByteBuffer bytes = value.mapBytes();
42+
bytes.clear();
43+
for (BufferMember m : members) {
44+
m.fillBuffer(bytes);
45+
}
46+
bytes.flip();
47+
value.unmap();
48+
}
49+
}
50+
2251
@Override
2352
public DescriptorSetWriter createWriter() {
2453
if (value == null) {

jme3-core/src/main/java/com/jme3/vulkan/material/uniforms/TextureUniform.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package com.jme3.vulkan.material.uniforms;
22

3+
import com.fasterxml.jackson.databind.JsonNode;
34
import com.jme3.texture.Texture;
45
import com.jme3.vulkan.descriptors.Descriptor;
56
import com.jme3.vulkan.descriptors.DescriptorSetWriter;
67
import com.jme3.vulkan.descriptors.SetLayoutBinding;
78
import com.jme3.vulkan.images.VulkanImage;
89
import com.jme3.vulkan.shader.ShaderStage;
910
import com.jme3.vulkan.util.Flag;
11+
import com.jme3.vulkan.util.FlagParser;
1012
import com.jme3.vulkan.util.IntEnum;
13+
import com.jme3.vulkan.util.ReflectionArgs;
1114
import org.lwjgl.system.MemoryStack;
1215
import org.lwjgl.vulkan.VkDescriptorImageInfo;
1316
import org.lwjgl.vulkan.VkWriteDescriptorSet;
@@ -23,6 +26,14 @@ public TextureUniform(String name, IntEnum<VulkanImage.Layout> layout, int bindi
2326
this.layout = layout;
2427
}
2528

29+
public TextureUniform(ReflectionArgs args) {
30+
super(Descriptor.CombinedImageSampler, args);
31+
this.layout = FlagParser.parseEnum(VulkanImage.Layout.class, args.getProperties().get("layout").asText());
32+
if (args.getProperties().has("default")) {
33+
value = args.getAssetManager().loadTexture(args.getProperties().get("default").asText());
34+
}
35+
}
36+
2637
@Override
2738
public DescriptorSetWriter createWriter() {
2839
if (value == null) {

0 commit comments

Comments
 (0)