Skip to content

Commit eeec5e1

Browse files
committed
create vulkan material loader
1 parent c1fca53 commit eeec5e1

File tree

13 files changed

+107
-68
lines changed

13 files changed

+107
-68
lines changed

jme3-core/src/main/java/com/jme3/backend/Engine.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ public interface Engine {
2828
Mesh createMesh(int vertices, int instances);
2929

3030
@Deprecated
31-
VertexBinding createMeshVertexBinding(IntEnum<InputRate> rate, Consumer<VertexBinding.Builder> config);
31+
default VertexBinding createMeshVertexBinding(IntEnum<InputRate> rate, Consumer<VertexBinding.Builder> config) {
32+
return null;
33+
}
3234

3335
GpuBuffer createBuffer(MemorySize size, Flag<BufferUsage> bufUsage, GlVertexBuffer.Usage dataUsage);
3436

jme3-core/src/main/java/com/jme3/backend/SimpleVulkanEngine.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.jme3.backend;
22

33
import com.jme3.app.Application;
4+
import com.jme3.asset.AssetKey;
45
import com.jme3.material.Material;
6+
import com.jme3.material.plugins.VulkanMaterialLoader;
57
import com.jme3.renderer.Camera;
68
import com.jme3.renderer.ViewPort;
79
import com.jme3.renderer.queue.RenderQueue;
@@ -30,6 +32,8 @@
3032
import com.jme3.vulkan.devices.GeneralPhysicalDevice;
3133
import com.jme3.vulkan.devices.LogicalDevice;
3234
import com.jme3.vulkan.images.*;
35+
import com.jme3.vulkan.material.NewMaterial;
36+
import com.jme3.vulkan.material.VulkanMaterial;
3337
import com.jme3.vulkan.memory.MemoryProp;
3438
import com.jme3.vulkan.memory.MemorySize;
3539
import com.jme3.vulkan.mesh.*;
@@ -93,8 +97,13 @@ public VertexBinding createMeshVertexBinding(IntEnum<InputRate> rate, Consumer<V
9397
}
9498

9599
@Override
96-
public Material createMaterial(String matdefName) {
97-
return null;
100+
public VulkanMaterial createMaterial() {
101+
return new NewMaterial();
102+
}
103+
104+
@Override
105+
public VulkanMaterial createMaterial(String matdefName) {
106+
return app.getAssetManager().loadAsset(new AssetKey<>(matdefName));
98107
}
99108

100109
@Override
@@ -121,6 +130,8 @@ public GpuBuffer createBuffer(MemorySize size, Flag<BufferUsage> bufUsage, GlVer
121130

122131
public void initialize() {
123132

133+
app.getAssetManager().registerLoader(VulkanMaterialLoader.class, "j4md");
134+
124135
instance = VulkanInstance.build(VulkanInstance.Version.v10, i -> {
125136
i.addGlfwExtensions();
126137
i.addDebugExtension(); // for game development only

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ public Texture getTexture(String name) {
687687
* @param value the Texture object previously loaded by the asset manager
688688
*/
689689
@Override
690-
public void setTexture(String name, Texture value) {
690+
public void setTexture(String name, Texture<?, ?> value) {
691691
if (value == null) {
692692
// clear it
693693
clearParam(name);

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,19 @@ public interface Material extends Savable {
5555

5656
void setUniformBuffer(String name, GpuBuffer buffer);
5757

58-
void setTexture(String name, Texture texture);
58+
void setTexture(String name, Texture<?, ?> texture);
5959

6060
void setParam(String uniform, String param, Object value);
6161

6262
void clearParam(String uniform, String param);
6363

6464
<T> T getParam(String uniform, String name);
6565

66-
Texture getTexture(String name);
66+
Texture<?, ?> getTexture(String name);
6767

68-
void addUniform(String name, Uniform uniform);
68+
void setUniform(String name, Uniform<?> uniform);
6969

70-
/* ----- COMPATABILITY WITH OLD MATERIAL ----- */
70+
/* ----- COMPATIBILITY WITH OLD MATERIAL ----- */
7171

7272
default int getSortId() {
7373
return 0;

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

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.jme3.vulkan.material;
22

3+
import com.jme3.asset.AssetKey;
4+
import com.jme3.asset.CloneableSmartAsset;
35
import com.jme3.dev.NotFullyImplemented;
46
import com.jme3.export.JmeExporter;
57
import com.jme3.export.JmeImporter;
@@ -22,12 +24,27 @@
2224
/**
2325
* Relates shader uniform values to shader descriptor sets and bindings.
2426
*/
25-
public class NewMaterial implements VulkanMaterial {
27+
public class NewMaterial implements VulkanMaterial, CloneableSmartAsset {
2628

2729
private final Map<String, VulkanUniform<?>> uniforms = new HashMap<>();
2830
private final Map<String, VulkanTechnique> techniques = new HashMap<>();
2931
private final Map<DescriptorSetLayout, CachedDescriptorSet> setCache = new HashMap<>();
3032

33+
@Override
34+
public CloneableSmartAsset clone() {
35+
return null;
36+
}
37+
38+
@Override
39+
public void setKey(AssetKey key) {
40+
41+
}
42+
43+
@Override
44+
public AssetKey getKey() {
45+
return null;
46+
}
47+
3148
@Override
3249
public void bind(CommandBuffer cmd, Pipeline pipeline, DescriptorPool pool) {
3350
List<DescriptorSetLayout> layouts = pipeline.getLayout().getSetLayouts();
@@ -69,14 +86,14 @@ public void bind(CommandBuffer cmd, Pipeline pipeline, DescriptorPool pool) {
6986
}
7087

7188
@Override
72-
public void setUniform(String name, GpuBuffer buffer) {
89+
public void setUniformBuffer(String name, GpuBuffer buffer) {
7390
BufferUniform u = getUniform(name);
7491
u.set(buffer);
7592
}
7693

7794
@Override
78-
public void setTexture(String name, Texture texture) {
79-
Uniform<Texture> u = getUniform(name);
95+
public void setTexture(String name, Texture<?, ?> texture) {
96+
Uniform<Texture<?, ?>> u = getUniform(name);
8097
u.set(texture);
8198
}
8299

@@ -120,15 +137,17 @@ public void read(JmeImporter im) throws IOException {
120137
throw new UnsupportedOperationException("Importing not yet supported.");
121138
}
122139

123-
public void addUniform(String name, Uniform<?> uniform) {
140+
@Override
141+
public void setUniform(String name, Uniform<?> uniform) {
124142
if (!(uniform instanceof VulkanUniform)) {
125143
throw new ClassCastException("Uniform must implement VulkanUniform to be used in a Vulkan context.");
126144
}
127145
uniforms.put(name, (VulkanUniform<?>)uniform);
128146
}
129147

148+
@SuppressWarnings("unchecked")
130149
@Override
131-
public <T extends Uniform> T getUniform(String name) {
150+
public <T extends Uniform<?>> T getUniform(String name) {
132151
return (T)uniforms.get(name);
133152
}
134153

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ public class TestMaterial extends NewMaterial {
1010
private final TextureUniform baseColorMap = new TextureUniform(VulkanImage.Layout.ShaderReadOnlyOptimal);
1111

1212
public TestMaterial() {
13-
addUniform("Matrices", matrices);
14-
addUniform("BaseColorMap", baseColorMap);
13+
setUniform("Matrices", matrices);
14+
setUniform("BaseColorMap", baseColorMap);
1515
}
1616

1717
public BufferUniform getMatrices() {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ public interface VulkanMaterial extends Material {
1212

1313
VulkanTechnique getTechnique(String name);
1414

15-
<T extends Uniform> T getUniform(String name);
15+
<T extends Uniform<?>> T getUniform(String name);
1616

1717
}

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@ public class VulkanTechnique {
2020
private final Map<String, String> uniformDefines = new HashMap<>();
2121
private final Map<String, Integer> attributes = new HashMap<>();
2222
private final RenderState state = new RenderState();
23+
24+
public SetLayoutBinding addBinding(int set, String name, SetLayoutBinding binding) {
25+
while (set >= bindings.size()) {
26+
bindings.add(null);
27+
}
28+
Map<String, SetLayoutBinding> bindingMap = bindings.get(set);
29+
if (bindingMap == null) {
30+
bindings.set(set, bindingMap = new HashMap<>());
31+
}
32+
return bindingMap.put(name, binding);
33+
}
2334

2435
public void setShaderSource(ShaderStage stage, String assetName) {
2536
shaders.put(stage, assetName);
@@ -68,10 +79,11 @@ public Collection<ShaderModule> getShaders(LogicalDevice<?> device, AssetManager
6879
public PipelineLayout getLayout(LogicalDevice<?> device, Cache<PipelineLayout> layoutCache, Cache<DescriptorSetLayout> setCache) {
6980
return PipelineLayout.build(device, p -> {
7081
p.setCache(layoutCache);
71-
for (Map<String, SetLayoutBinding> bMap : bindings) {
72-
if (!bMap.isEmpty()) {
73-
p.nextUniformSet(DescriptorSetLayout.build(device, bMap, setCache));
82+
for (Map<String, SetLayoutBinding> set : bindings) {
83+
if (set == null) {
84+
throw new IllegalStateException("Each set layout must have at least one binding.");
7485
}
86+
p.nextUniformSet(DescriptorSetLayout.build(device, set, setCache));
7587
}
7688
});
7789
}

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515

1616
import java.util.Objects;
1717

18-
public class TextureUniform implements Uniform<Texture> {
18+
public class TextureUniform implements VulkanUniform<Texture<?, ?>> {
1919

2020
private final IntEnum<VulkanImage.Layout> layout;
21-
private Texture value;
21+
private Texture<?, ?> value;
2222

2323
public TextureUniform(IntEnum<VulkanImage.Layout> layout) {
2424
this.layout = layout;
@@ -33,12 +33,17 @@ public DescriptorSetWriter createWriter(SetLayoutBinding binding) {
3333
}
3434

3535
@Override
36-
public void set(Texture value) {
36+
public SetLayoutBinding createBinding(IntEnum<Descriptor> type, int binding, Flag<ShaderStage> stages) {
37+
return new SetLayoutBinding(type, binding, 1, stages);
38+
}
39+
40+
@Override
41+
public void set(Texture<?, ?> value) {
3742
this.value = value;
3843
}
3944

4045
@Override
41-
public Texture get() {
46+
public Texture<?, ?> get() {
4247
return value;
4348
}
4449

@@ -56,7 +61,7 @@ private static class Writer extends AbstractSetWriter {
5661
private final long samplerId, viewId;
5762
private final IntEnum<VulkanImage.Layout> layout;
5863

59-
public Writer(SetLayoutBinding binding, Texture texture, IntEnum<VulkanImage.Layout> layout) {
64+
public Writer(SetLayoutBinding binding, Texture<?, ?> texture, IntEnum<VulkanImage.Layout> layout) {
6065
super(binding, 0, 1);
6166
this.samplerId = texture.getId();
6267
this.viewId = texture.getView().getId();

jme3-core/src/main/java/com/jme3/vulkan/mesh/MeshLayout.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.jme3.vulkan.mesh;
22

3+
import com.jme3.vulkan.Format;
34
import com.jme3.vulkan.mesh.attribute.Attribute;
45
import com.jme3.vulkan.pipeline.VertexPipeline;
6+
import com.jme3.vulkan.util.IntEnum;
57
import org.lwjgl.system.MemoryStack;
68
import org.lwjgl.vulkan.VkVertexInputAttributeDescription;
79
import org.lwjgl.vulkan.VkVertexInputBindingDescription;

0 commit comments

Comments
 (0)