mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2024-11-14 06:24:12 +01:00
Instandirect
- Finishing touches on the unification
This commit is contained in:
parent
bf03f084c3
commit
03c2df4664
@ -1,8 +1,9 @@
|
|||||||
package com.jozufozu.flywheel.api.pipeline;
|
package com.jozufozu.flywheel.api.pipeline;
|
||||||
|
|
||||||
import java.util.function.Function;
|
import java.util.function.BiFunction;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.struct.StructType;
|
import com.jozufozu.flywheel.api.struct.StructType;
|
||||||
|
import com.jozufozu.flywheel.api.vertex.VertexType;
|
||||||
import com.jozufozu.flywheel.backend.gl.GLSLVersion;
|
import com.jozufozu.flywheel.backend.gl.GLSLVersion;
|
||||||
import com.jozufozu.flywheel.core.SourceComponent;
|
import com.jozufozu.flywheel.core.SourceComponent;
|
||||||
import com.jozufozu.flywheel.core.source.FileResolution;
|
import com.jozufozu.flywheel.core.source.FileResolution;
|
||||||
@ -16,11 +17,11 @@ public record PipelineShader(GLSLVersion glslVersion, FileResolution vertex, Fil
|
|||||||
* @param structType The struct type to convert.
|
* @param structType The struct type to convert.
|
||||||
* @return A source component defining functions that unpack a representation of the given struct type.
|
* @return A source component defining functions that unpack a representation of the given struct type.
|
||||||
*/
|
*/
|
||||||
public SourceComponent assemble(StructType<?> structType) {
|
public SourceComponent assemble(VertexType vertexType, StructType<?> structType) {
|
||||||
return factory.apply(structType);
|
return factory.apply(vertexType, structType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface InstanceAssemblerFactory extends Function<StructType<?>, SourceComponent> {
|
public interface InstanceAssemblerFactory extends BiFunction<VertexType, StructType<?>, SourceComponent> {
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,6 @@ public interface StructType<S extends InstancedPart> {
|
|||||||
|
|
||||||
VertexTransformer<S> getVertexTransformer();
|
VertexTransformer<S> getVertexTransformer();
|
||||||
|
|
||||||
StorageBufferWriter<S> getStorageBufferWriter();
|
|
||||||
|
|
||||||
interface VertexTransformer<S extends InstancedPart> {
|
interface VertexTransformer<S extends InstancedPart> {
|
||||||
void transform(MutableVertexList vertexList, S struct, ClientLevel level);
|
void transform(MutableVertexList vertexList, S struct, ClientLevel level);
|
||||||
}
|
}
|
||||||
|
@ -9,5 +9,6 @@ public interface StructWriter<S extends InstancedPart> {
|
|||||||
/**
|
/**
|
||||||
* Write the given struct to the given memory address.
|
* Write the given struct to the given memory address.
|
||||||
*/
|
*/
|
||||||
void write(long ptr, S struct);
|
void write(final long ptr, final S struct);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,7 @@ public class PipelineCompiler extends Memoizer<PipelineCompiler.Context, GlProgr
|
|||||||
ImmutableList<SourceComponent> getVertexComponents() {
|
ImmutableList<SourceComponent> getVertexComponents() {
|
||||||
var layout = vertexType.getLayoutShader()
|
var layout = vertexType.getLayoutShader()
|
||||||
.getFile();
|
.getFile();
|
||||||
var instanceAssembly = pipelineShader.assemble(structType);
|
var instanceAssembly = pipelineShader.assemble(vertexType, structType);
|
||||||
var instance = structType.getInstanceShader()
|
var instance = structType.getInstanceShader()
|
||||||
.getFile();
|
.getFile();
|
||||||
var material = this.material.getVertexShader()
|
var material = this.material.getVertexShader()
|
||||||
@ -133,7 +133,6 @@ public class PipelineCompiler extends Memoizer<PipelineCompiler.Context, GlProgr
|
|||||||
StringBuilder finalSource = new StringBuilder(key.generateHeader());
|
StringBuilder finalSource = new StringBuilder(key.generateHeader());
|
||||||
finalSource.append("#extension GL_ARB_explicit_attrib_location : enable\n");
|
finalSource.append("#extension GL_ARB_explicit_attrib_location : enable\n");
|
||||||
finalSource.append("#extension GL_ARB_conservative_depth : enable\n");
|
finalSource.append("#extension GL_ARB_conservative_depth : enable\n");
|
||||||
finalSource.append("#extension GL_ARB_enhanced_layouts : enable\n");
|
|
||||||
|
|
||||||
var ctx = new CompilationContext();
|
var ctx = new CompilationContext();
|
||||||
|
|
||||||
|
@ -13,8 +13,8 @@ import static org.lwjgl.opengl.GL46.glVertexArrayVertexBuffer;
|
|||||||
|
|
||||||
import com.jozufozu.flywheel.api.RenderStage;
|
import com.jozufozu.flywheel.api.RenderStage;
|
||||||
import com.jozufozu.flywheel.api.instancer.InstancedPart;
|
import com.jozufozu.flywheel.api.instancer.InstancedPart;
|
||||||
import com.jozufozu.flywheel.api.struct.StorageBufferWriter;
|
|
||||||
import com.jozufozu.flywheel.api.struct.StructType;
|
import com.jozufozu.flywheel.api.struct.StructType;
|
||||||
|
import com.jozufozu.flywheel.api.struct.StructWriter;
|
||||||
import com.jozufozu.flywheel.api.vertex.VertexType;
|
import com.jozufozu.flywheel.api.vertex.VertexType;
|
||||||
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
|
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
|
||||||
import com.jozufozu.flywheel.backend.instancing.PipelineCompiler;
|
import com.jozufozu.flywheel.backend.instancing.PipelineCompiler;
|
||||||
@ -27,7 +27,7 @@ public class IndirectCullingGroup<T extends InstancedPart> {
|
|||||||
|
|
||||||
private static final int BARRIER_BITS = GL_SHADER_STORAGE_BARRIER_BIT | GL_COMMAND_BARRIER_BIT;
|
private static final int BARRIER_BITS = GL_SHADER_STORAGE_BARRIER_BIT | GL_COMMAND_BARRIER_BIT;
|
||||||
|
|
||||||
final StorageBufferWriter<T> storageBufferWriter;
|
final StructWriter<T> storageBufferWriter;
|
||||||
final GlProgram compute;
|
final GlProgram compute;
|
||||||
final GlProgram draw;
|
final GlProgram draw;
|
||||||
private final VertexType vertexType;
|
private final VertexType vertexType;
|
||||||
@ -48,9 +48,10 @@ public class IndirectCullingGroup<T extends InstancedPart> {
|
|||||||
|
|
||||||
IndirectCullingGroup(StructType<T> structType, VertexType vertexType) {
|
IndirectCullingGroup(StructType<T> structType, VertexType vertexType) {
|
||||||
this.vertexType = vertexType;
|
this.vertexType = vertexType;
|
||||||
storageBufferWriter = structType.getStorageBufferWriter();
|
storageBufferWriter = structType.getWriter();
|
||||||
|
|
||||||
objectStride = storageBufferWriter.getAlignment();
|
objectStride = structType.getLayout()
|
||||||
|
.getStride();
|
||||||
buffers = new IndirectBuffers(objectStride);
|
buffers = new IndirectBuffers(objectStride);
|
||||||
buffers.createBuffers();
|
buffers.createBuffers();
|
||||||
buffers.createObjectStorage(128);
|
buffers.createObjectStorage(128);
|
||||||
|
@ -4,21 +4,22 @@ import org.lwjgl.system.MemoryUtil;
|
|||||||
|
|
||||||
import com.jozufozu.flywheel.api.instancer.InstancedPart;
|
import com.jozufozu.flywheel.api.instancer.InstancedPart;
|
||||||
import com.jozufozu.flywheel.api.struct.StructType;
|
import com.jozufozu.flywheel.api.struct.StructType;
|
||||||
|
import com.jozufozu.flywheel.api.struct.StructWriter;
|
||||||
import com.jozufozu.flywheel.backend.instancing.AbstractInstancer;
|
import com.jozufozu.flywheel.backend.instancing.AbstractInstancer;
|
||||||
import com.jozufozu.flywheel.core.layout.BufferLayout;
|
|
||||||
|
|
||||||
public class IndirectInstancer<D extends InstancedPart> extends AbstractInstancer<D> {
|
public class IndirectInstancer<D extends InstancedPart> extends AbstractInstancer<D> {
|
||||||
|
|
||||||
public final BufferLayout instanceFormat;
|
private final long objectStride;
|
||||||
public final IndirectModel<D> parent;
|
private final StructWriter<D> writer;
|
||||||
int instanceCount = 0;
|
int instanceCount = 0;
|
||||||
|
|
||||||
boolean anyToUpdate;
|
boolean anyToUpdate;
|
||||||
|
|
||||||
public IndirectInstancer(IndirectModel<D> parent, StructType<D> type) {
|
public IndirectInstancer(StructType<D> type) {
|
||||||
super(type);
|
super(type);
|
||||||
this.parent = parent;
|
this.objectStride = type.getLayout()
|
||||||
this.instanceFormat = type.getLayout();
|
.getStride();
|
||||||
|
writer = type.getWriter();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -41,12 +42,10 @@ public class IndirectInstancer<D extends InstancedPart> extends AbstractInstance
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void writeSparse(long objectPtr, long batchIDPtr, int batchID) {
|
public void writeSparse(long objectPtr, long batchIDPtr, int batchID) {
|
||||||
var storageBufferWriter = this.type.getStorageBufferWriter();
|
|
||||||
long objectStride = storageBufferWriter.getAlignment();
|
|
||||||
for (int i = 0, size = data.size(); i < size; i++) {
|
for (int i = 0, size = data.size(); i < size; i++) {
|
||||||
final var element = data.get(i);
|
final var element = data.get(i);
|
||||||
if (element.checkDirtyAndClear()) {
|
if (element.checkDirtyAndClear()) {
|
||||||
storageBufferWriter.write(objectPtr + i * objectStride, element);
|
writer.write(objectPtr + i * objectStride, element);
|
||||||
|
|
||||||
MemoryUtil.memPutInt(batchIDPtr + i * IndirectBuffers.INT_SIZE, batchID);
|
MemoryUtil.memPutInt(batchIDPtr + i * IndirectBuffers.INT_SIZE, batchID);
|
||||||
}
|
}
|
||||||
@ -54,11 +53,9 @@ public class IndirectInstancer<D extends InstancedPart> extends AbstractInstance
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void writeFull(long objectPtr, long batchIDPtr, int batchID) {
|
public void writeFull(long objectPtr, long batchIDPtr, int batchID) {
|
||||||
var storageBufferWriter = this.type.getStorageBufferWriter();
|
|
||||||
var objectStride = storageBufferWriter.getAlignment();
|
|
||||||
for (var object : data) {
|
for (var object : data) {
|
||||||
// write object
|
// write object
|
||||||
storageBufferWriter.write(objectPtr, object);
|
writer.write(objectPtr, object);
|
||||||
objectPtr += objectStride;
|
objectPtr += objectStride;
|
||||||
|
|
||||||
// write batchID
|
// write batchID
|
||||||
|
@ -11,7 +11,7 @@ public class IndirectModel<D extends InstancedPart> {
|
|||||||
|
|
||||||
public IndirectModel(StructType<D> type, Model model) {
|
public IndirectModel(StructType<D> type, Model model) {
|
||||||
this.model = model;
|
this.model = model;
|
||||||
this.instancer = new IndirectInstancer<>(this, type);
|
this.instancer = new IndirectInstancer<>(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void init(IndirectDrawManager indirectDrawManager) {
|
public void init(IndirectDrawManager indirectDrawManager) {
|
||||||
|
@ -29,9 +29,10 @@ public class Components {
|
|||||||
public static final ContextShader WORLD = ComponentRegistry.register(new ContextShader(WorldProgram::new, Files.WORLD_VERTEX, Files.WORLD_FRAGMENT));
|
public static final ContextShader WORLD = ComponentRegistry.register(new ContextShader(WorldProgram::new, Files.WORLD_VERTEX, Files.WORLD_FRAGMENT));
|
||||||
public static final ContextShader CRUMBLING = ComponentRegistry.register(new ContextShader(CrumblingProgram::new, Files.WORLD_VERTEX, Files.CRUMBLING_FRAGMENT));
|
public static final ContextShader CRUMBLING = ComponentRegistry.register(new ContextShader(CrumblingProgram::new, Files.WORLD_VERTEX, Files.CRUMBLING_FRAGMENT));
|
||||||
|
|
||||||
public static final PipelineShader INSTANCED_ARRAYS = new PipelineShader(GLSLVersion.V420, Pipeline.INSTANCED_ARRAYS_DRAW, Pipeline.DRAW_FRAGMENT, (structType) -> structType.getLayout()
|
public static final PipelineShader INSTANCED_ARRAYS = new PipelineShader(GLSLVersion.V420, Pipeline.INSTANCED_ARRAYS_DRAW, Pipeline.DRAW_FRAGMENT, (vertexType, structType) -> structType.getLayout()
|
||||||
.getInstancedArraysComponent());
|
.getInstancedArraysComponent(vertexType.getLayout()
|
||||||
public static final PipelineShader INDIRECT = new PipelineShader(GLSLVersion.V460, Pipeline.INDIRECT_DRAW, Pipeline.DRAW_FRAGMENT, (structType) -> structType.getLayout()
|
.getAttributeCount()));
|
||||||
|
public static final PipelineShader INDIRECT = new PipelineShader(GLSLVersion.V460, Pipeline.INDIRECT_DRAW, Pipeline.DRAW_FRAGMENT, (vertexType, structType) -> structType.getLayout()
|
||||||
.getIndirectComponent());
|
.getIndirectComponent());
|
||||||
public static final FileResolution UTIL_TYPES = FileResolution.get(Flywheel.rl("util/types.glsl"));
|
public static final FileResolution UTIL_TYPES = FileResolution.get(Flywheel.rl("util/types.glsl"));
|
||||||
|
|
||||||
|
@ -59,8 +59,8 @@ public class BufferLayout {
|
|||||||
return stride;
|
return stride;
|
||||||
}
|
}
|
||||||
|
|
||||||
public InstancedArraysComponent getInstancedArraysComponent() {
|
public InstancedArraysComponent getInstancedArraysComponent(int baseIndex) {
|
||||||
return new InstancedArraysComponent();
|
return new InstancedArraysComponent(baseIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IndirectComponent getIndirectComponent() {
|
public IndirectComponent getIndirectComponent() {
|
||||||
@ -109,6 +109,14 @@ public class BufferLayout {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class InstancedArraysComponent implements SourceComponent {
|
public class InstancedArraysComponent implements SourceComponent {
|
||||||
|
private static final String ATTRIBUTE_SUFFIX = "_vertex_in";
|
||||||
|
|
||||||
|
private final int baseIndex;
|
||||||
|
|
||||||
|
public InstancedArraysComponent(int baseIndex) {
|
||||||
|
this.baseIndex = baseIndex;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<? extends SourceComponent> included() {
|
public Collection<? extends SourceComponent> included() {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
@ -116,7 +124,8 @@ public class BufferLayout {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String source(CompilationContext ctx) {
|
public String source(CompilationContext ctx) {
|
||||||
return generateInstancedArrays(5, "Instance");
|
var generated = generateInstancedArrays("Instance");
|
||||||
|
return ctx.generatedHeader(generated, name().toString()) + generated;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -124,17 +133,16 @@ public class BufferLayout {
|
|||||||
return Flywheel.rl("generated_instanced_arrays");
|
return Flywheel.rl("generated_instanced_arrays");
|
||||||
}
|
}
|
||||||
|
|
||||||
public String generateInstancedArrays(int baseIndex, String structName) {
|
public String generateInstancedArrays(String structName) {
|
||||||
var builder = new GlslBuilder();
|
var builder = new GlslBuilder();
|
||||||
builder.define("FlwInstance", structName);
|
builder.define("FlwInstance", structName);
|
||||||
|
|
||||||
int i = baseIndex;
|
int i = baseIndex;
|
||||||
final var attributeSuffix = "_vertex_in";
|
|
||||||
for (var field : layoutItems) {
|
for (var field : layoutItems) {
|
||||||
builder.vertexInput()
|
builder.vertexInput()
|
||||||
.binding(i)
|
.binding(i)
|
||||||
.type(field.type.typeName())
|
.type(field.type.typeName())
|
||||||
.name(field.name + attributeSuffix);
|
.name(field.name + ATTRIBUTE_SUFFIX);
|
||||||
|
|
||||||
i += field.type.attributeCount();
|
i += field.type.attributeCount();
|
||||||
}
|
}
|
||||||
@ -155,7 +163,7 @@ public class BufferLayout {
|
|||||||
.name("flw_unpackInstance");
|
.name("flw_unpackInstance");
|
||||||
|
|
||||||
var args = layoutItems.stream()
|
var args = layoutItems.stream()
|
||||||
.map(it -> new GlslExpr.Variable(it.name + attributeSuffix))
|
.map(it -> new GlslExpr.Variable(it.name + ATTRIBUTE_SUFFIX))
|
||||||
.map(GlslExpr::minPrint)
|
.map(GlslExpr::minPrint)
|
||||||
.collect(Collectors.joining(", "));
|
.collect(Collectors.joining(", "));
|
||||||
|
|
||||||
@ -169,7 +177,7 @@ public class BufferLayout {
|
|||||||
|
|
||||||
private static final String UNPACK_ARG = "p";
|
private static final String UNPACK_ARG = "p";
|
||||||
|
|
||||||
private static GlslExpr intoGlsl(LayoutItem layoutItem) {
|
private static GlslExpr genGlslForLayoutItem(LayoutItem layoutItem) {
|
||||||
return GlslExpr.variable(UNPACK_ARG)
|
return GlslExpr.variable(UNPACK_ARG)
|
||||||
.access(layoutItem.name)
|
.access(layoutItem.name)
|
||||||
.transform(layoutItem.type::unpack);
|
.transform(layoutItem.type::unpack);
|
||||||
@ -187,8 +195,8 @@ public class BufferLayout {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String source(CompilationContext ctx) {
|
public String source(CompilationContext ctx) {
|
||||||
var content = generateIndirect("IndirectStruct");
|
var generated = generateIndirect("IndirectStruct");
|
||||||
return ctx.generatedHeader(content, name().toString()) + content;
|
return ctx.generatedHeader(generated, name().toString()) + generated;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String generateIndirect(String structName) {
|
public String generateIndirect(String structName) {
|
||||||
@ -216,7 +224,7 @@ public class BufferLayout {
|
|||||||
.argumentIn(packedStructName, UNPACK_ARG);
|
.argumentIn(packedStructName, UNPACK_ARG);
|
||||||
|
|
||||||
var args = layoutItems.stream()
|
var args = layoutItems.stream()
|
||||||
.map(IndirectComponent::intoGlsl)
|
.map(IndirectComponent::genGlslForLayoutItem)
|
||||||
.map(GlslExpr::minPrint)
|
.map(GlslExpr::minPrint)
|
||||||
.collect(Collectors.joining(", "));
|
.collect(Collectors.joining(", "));
|
||||||
|
|
||||||
|
@ -10,12 +10,23 @@ public class CommonItems {
|
|||||||
private static final String VEC4_TYPE = "vec4";
|
private static final String VEC4_TYPE = "vec4";
|
||||||
private static final String VEC2_TYPE = "vec2";
|
private static final String VEC2_TYPE = "vec2";
|
||||||
private static final String FLOAT_TYPE = "float";
|
private static final String FLOAT_TYPE = "float";
|
||||||
|
private static final String IVEC2_TYPE = "ivec2";
|
||||||
|
private static final String UINT_TYPE = "uint";
|
||||||
|
private static final String VEC4F_TYPE = "Vec4F";
|
||||||
|
private static final String VEC3F_TYPE = "Vec3F";
|
||||||
|
private static final String LIGHT_COORD_TYPE = "LightCoord";
|
||||||
|
public static final PrimitiveItem LIGHT_COORD = PrimitiveItem.builder()
|
||||||
|
.setAttribute(new VertexAttributeI(GlNumericType.USHORT, 2))
|
||||||
|
.setTypeName(IVEC2_TYPE)
|
||||||
|
.setPackedTypeName(LIGHT_COORD_TYPE)
|
||||||
|
.unpack(expr -> expr.callFunction("unpackLightCoord"))
|
||||||
|
.createPrimitiveItem();
|
||||||
|
|
||||||
public static final PrimitiveItem FLOAT = PrimitiveItem.builder()
|
public static final PrimitiveItem FLOAT = PrimitiveItem.builder()
|
||||||
.setAttribute(new VertexAttributeF(GlNumericType.FLOAT, 1, false))
|
.setAttribute(new VertexAttributeF(GlNumericType.FLOAT, 1, false))
|
||||||
.setTypeName(FLOAT_TYPE)
|
.setTypeName(FLOAT_TYPE)
|
||||||
.setPackedTypeName(FLOAT_TYPE)
|
.setPackedTypeName(FLOAT_TYPE)
|
||||||
.createPrimitiveItem();
|
.createPrimitiveItem();
|
||||||
private static final String UINT_TYPE = "uint";
|
|
||||||
public static final PrimitiveItem NORM_3x8 = PrimitiveItem.builder()
|
public static final PrimitiveItem NORM_3x8 = PrimitiveItem.builder()
|
||||||
.setAttribute(new VertexAttributeF(GlNumericType.BYTE, 3, true))
|
.setAttribute(new VertexAttributeF(GlNumericType.BYTE, 3, true))
|
||||||
.setTypeName(VEC3_TYPE)
|
.setTypeName(VEC3_TYPE)
|
||||||
@ -36,35 +47,25 @@ public class CommonItems {
|
|||||||
.unpack(expr -> expr.callFunction("unpackUnorm4x8")
|
.unpack(expr -> expr.callFunction("unpackUnorm4x8")
|
||||||
.swizzle("xyz"))
|
.swizzle("xyz"))
|
||||||
.createPrimitiveItem();
|
.createPrimitiveItem();
|
||||||
private static final String IVEC2_TYPE = "ivec2";
|
|
||||||
private static final String VEC4F_TYPE = "Vec4F";
|
|
||||||
public static final PrimitiveItem VEC4 = PrimitiveItem.builder()
|
public static final PrimitiveItem VEC4 = PrimitiveItem.builder()
|
||||||
.setAttribute(new VertexAttributeF(GlNumericType.FLOAT, 4, false))
|
.setAttribute(new VertexAttributeF(GlNumericType.FLOAT, 4, false))
|
||||||
.setTypeName(VEC4_TYPE)
|
.setTypeName(VEC4_TYPE)
|
||||||
.setPackedTypeName(VEC4F_TYPE)
|
.setPackedTypeName(VEC4F_TYPE)
|
||||||
.unpack(expr -> expr.callFunction("unpackVec4F"))
|
.unpack(expr -> expr.callFunction("unpackVec4F"))
|
||||||
.createPrimitiveItem();
|
.createPrimitiveItem();
|
||||||
private static final String VEC3F_TYPE = "Vec3F";
|
|
||||||
public static final PrimitiveItem VEC3 = PrimitiveItem.builder()
|
public static final PrimitiveItem VEC3 = PrimitiveItem.builder()
|
||||||
.setAttribute(new VertexAttributeF(GlNumericType.FLOAT, 3, false))
|
.setAttribute(new VertexAttributeF(GlNumericType.FLOAT, 3, false))
|
||||||
.setTypeName(VEC3_TYPE)
|
.setTypeName(VEC3_TYPE)
|
||||||
.setPackedTypeName(VEC3F_TYPE)
|
.setPackedTypeName(VEC3F_TYPE)
|
||||||
.unpack(expr -> expr.callFunction("unpackVec3F"))
|
.unpack(expr -> expr.callFunction("unpackVec3F"))
|
||||||
.createPrimitiveItem();
|
.createPrimitiveItem();
|
||||||
private static final String VEC2F_TYPE = "Vec2F";
|
|
||||||
public static final PrimitiveItem VEC2 = PrimitiveItem.builder()
|
public static final PrimitiveItem VEC2 = PrimitiveItem.builder()
|
||||||
.setAttribute(new VertexAttributeF(GlNumericType.FLOAT, 2, false))
|
.setAttribute(new VertexAttributeF(GlNumericType.FLOAT, 2, false))
|
||||||
.setTypeName(VEC2_TYPE)
|
.setTypeName(VEC2_TYPE)
|
||||||
.setPackedTypeName(VEC2F_TYPE)
|
.setPackedTypeName(VEC2F_TYPE)
|
||||||
.unpack(expr -> expr.callFunction("unpackVec2F"))
|
.unpack(expr -> expr.callFunction("unpackVec2F"))
|
||||||
.createPrimitiveItem();
|
.createPrimitiveItem();
|
||||||
private static final String LIGHT_COORD_TYPE = "LightCoord";
|
private static final String VEC2F_TYPE = "Vec2F";
|
||||||
public static final PrimitiveItem LIGHT_COORD = PrimitiveItem.builder()
|
|
||||||
.setAttribute(new VertexAttributeI(GlNumericType.USHORT, 2))
|
|
||||||
.setTypeName(VEC2_TYPE)
|
|
||||||
.setPackedTypeName(LIGHT_COORD_TYPE)
|
|
||||||
.unpack(expr -> expr.callFunction("unpackLightCoord"))
|
|
||||||
.createPrimitiveItem();
|
|
||||||
|
|
||||||
|
|
||||||
public static final MatrixItem MAT3 = new MatrixItem(3, 3, "mat3", "Mat3F", "unpackMat3F");
|
public static final MatrixItem MAT3 = new MatrixItem(3, 3, "mat3", "Mat3F", "unpackMat3F");
|
||||||
|
@ -14,6 +14,7 @@ public class CompilationContext {
|
|||||||
private String generatedSource = "";
|
private String generatedSource = "";
|
||||||
private int generatedLines = 0;
|
private int generatedLines = 0;
|
||||||
|
|
||||||
|
|
||||||
String sourceHeader(SourceFile sourceFile) {
|
String sourceHeader(SourceFile sourceFile) {
|
||||||
return "#line " + 0 + ' ' + getOrCreateFileID(sourceFile) + " // " + sourceFile.name + '\n';
|
return "#line " + 0 + ' ' + getOrCreateFileID(sourceFile) + " // " + sourceFile.name + '\n';
|
||||||
}
|
}
|
||||||
|
@ -6,12 +6,12 @@ import com.jozufozu.flywheel.api.struct.StructWriter;
|
|||||||
|
|
||||||
public abstract class ColoredLitWriter<D extends ColoredLitPart> implements StructWriter<D> {
|
public abstract class ColoredLitWriter<D extends ColoredLitPart> implements StructWriter<D> {
|
||||||
@Override
|
@Override
|
||||||
public void write(long ptr, D d) {
|
public void write(final long ptr, final D d) {
|
||||||
MemoryUtil.memPutByte(ptr, d.blockLight);
|
MemoryUtil.memPutShort(ptr, d.blockLight);
|
||||||
MemoryUtil.memPutByte(ptr + 1, d.skyLight);
|
MemoryUtil.memPutShort(ptr + 2, d.skyLight);
|
||||||
MemoryUtil.memPutByte(ptr + 2, d.r);
|
MemoryUtil.memPutByte(ptr + 4, d.r);
|
||||||
MemoryUtil.memPutByte(ptr + 3, d.g);
|
MemoryUtil.memPutByte(ptr + 5, d.g);
|
||||||
MemoryUtil.memPutByte(ptr + 4, d.b);
|
MemoryUtil.memPutByte(ptr + 6, d.b);
|
||||||
MemoryUtil.memPutByte(ptr + 5, d.a);
|
MemoryUtil.memPutByte(ptr + 7, d.a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,43 +0,0 @@
|
|||||||
package com.jozufozu.flywheel.core.structs.oriented;
|
|
||||||
|
|
||||||
|
|
||||||
import org.lwjgl.system.MemoryUtil;
|
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.struct.StorageBufferWriter;
|
|
||||||
|
|
||||||
public class OrientedStorageWriter implements StorageBufferWriter<OrientedPart> {
|
|
||||||
|
|
||||||
public static final OrientedStorageWriter INSTANCE = new OrientedStorageWriter();
|
|
||||||
|
|
||||||
private OrientedStorageWriter() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void write(final long ptr, OrientedPart d) {
|
|
||||||
MemoryUtil.memPutFloat(ptr, d.qX);
|
|
||||||
MemoryUtil.memPutFloat(ptr + 4, d.qY);
|
|
||||||
MemoryUtil.memPutFloat(ptr + 8, d.qZ);
|
|
||||||
MemoryUtil.memPutFloat(ptr + 12, d.qW);
|
|
||||||
|
|
||||||
MemoryUtil.memPutFloat(ptr + 16, d.posX);
|
|
||||||
MemoryUtil.memPutFloat(ptr + 20, d.posY);
|
|
||||||
MemoryUtil.memPutFloat(ptr + 24, d.posZ);
|
|
||||||
|
|
||||||
MemoryUtil.memPutFloat(ptr + 28, d.pivotX);
|
|
||||||
MemoryUtil.memPutFloat(ptr + 32, d.pivotY);
|
|
||||||
MemoryUtil.memPutFloat(ptr + 36, d.pivotZ);
|
|
||||||
|
|
||||||
MemoryUtil.memPutShort(ptr + 40, d.skyLight);
|
|
||||||
MemoryUtil.memPutShort(ptr + 42, d.blockLight);
|
|
||||||
|
|
||||||
MemoryUtil.memPutByte(ptr + 44, d.r);
|
|
||||||
MemoryUtil.memPutByte(ptr + 45, d.g);
|
|
||||||
MemoryUtil.memPutByte(ptr + 46, d.b);
|
|
||||||
MemoryUtil.memPutByte(ptr + 47, d.a);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getAlignment() {
|
|
||||||
return 48;
|
|
||||||
}
|
|
||||||
}
|
|
@ -37,11 +37,6 @@ public class OrientedType implements StructType<OrientedPart> {
|
|||||||
return OrientedWriter.INSTANCE;
|
return OrientedWriter.INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public OrientedStorageWriter getStorageBufferWriter() {
|
|
||||||
return OrientedStorageWriter.INSTANCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FileResolution getInstanceShader() {
|
public FileResolution getInstanceShader() {
|
||||||
return Components.Files.ORIENTED;
|
return Components.Files.ORIENTED;
|
||||||
|
@ -11,15 +11,16 @@ public class OrientedWriter extends ColoredLitWriter<OrientedPart> {
|
|||||||
public void write(long ptr, OrientedPart d) {
|
public void write(long ptr, OrientedPart d) {
|
||||||
super.write(ptr, d);
|
super.write(ptr, d);
|
||||||
|
|
||||||
MemoryUtil.memPutFloat(ptr + 6, d.posX);
|
MemoryUtil.memPutFloat(ptr + 8, d.posX);
|
||||||
MemoryUtil.memPutFloat(ptr + 10, d.posY);
|
MemoryUtil.memPutFloat(ptr + 12, d.posY);
|
||||||
MemoryUtil.memPutFloat(ptr + 14, d.posZ);
|
MemoryUtil.memPutFloat(ptr + 16, d.posZ);
|
||||||
MemoryUtil.memPutFloat(ptr + 18, d.pivotX);
|
MemoryUtil.memPutFloat(ptr + 20, d.pivotX);
|
||||||
MemoryUtil.memPutFloat(ptr + 22, d.pivotY);
|
MemoryUtil.memPutFloat(ptr + 24, d.pivotY);
|
||||||
MemoryUtil.memPutFloat(ptr + 26, d.pivotZ);
|
MemoryUtil.memPutFloat(ptr + 28, d.pivotZ);
|
||||||
MemoryUtil.memPutFloat(ptr + 30, d.qX);
|
MemoryUtil.memPutFloat(ptr + 32, d.qX);
|
||||||
MemoryUtil.memPutFloat(ptr + 34, d.qY);
|
MemoryUtil.memPutFloat(ptr + 36, d.qY);
|
||||||
MemoryUtil.memPutFloat(ptr + 38, d.qZ);
|
MemoryUtil.memPutFloat(ptr + 40, d.qZ);
|
||||||
MemoryUtil.memPutFloat(ptr + 42, d.qW);
|
MemoryUtil.memPutFloat(ptr + 44, d.qW);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
package com.jozufozu.flywheel.core.structs.transformed;
|
|
||||||
|
|
||||||
import org.lwjgl.system.MemoryUtil;
|
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.struct.StorageBufferWriter;
|
|
||||||
import com.jozufozu.flywheel.extension.MatrixWrite;
|
|
||||||
|
|
||||||
public class TransformedStorageWriter implements StorageBufferWriter<TransformedPart> {
|
|
||||||
|
|
||||||
public static final TransformedStorageWriter INSTANCE = new TransformedStorageWriter();
|
|
||||||
|
|
||||||
private TransformedStorageWriter() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void write(long ptr, TransformedPart instance) {
|
|
||||||
MatrixWrite.writeUnsafe(instance.model, ptr);
|
|
||||||
MatrixWrite.writeUnsafe(instance.normal, ptr + 64);
|
|
||||||
MemoryUtil.memPutByte(ptr + 100, instance.r);
|
|
||||||
MemoryUtil.memPutByte(ptr + 101, instance.g);
|
|
||||||
MemoryUtil.memPutByte(ptr + 102, instance.b);
|
|
||||||
MemoryUtil.memPutByte(ptr + 103, instance.a);
|
|
||||||
MemoryUtil.memPutShort(ptr + 104, instance.skyLight);
|
|
||||||
MemoryUtil.memPutShort(ptr + 106, instance.blockLight);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getAlignment() {
|
|
||||||
return 108;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +1,5 @@
|
|||||||
package com.jozufozu.flywheel.core.structs.transformed;
|
package com.jozufozu.flywheel.core.structs.transformed;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.struct.StorageBufferWriter;
|
|
||||||
import com.jozufozu.flywheel.api.struct.StructType;
|
import com.jozufozu.flywheel.api.struct.StructType;
|
||||||
import com.jozufozu.flywheel.api.struct.StructWriter;
|
import com.jozufozu.flywheel.api.struct.StructWriter;
|
||||||
import com.jozufozu.flywheel.core.Components;
|
import com.jozufozu.flywheel.core.Components;
|
||||||
@ -34,11 +33,6 @@ public class TransformedType implements StructType<TransformedPart> {
|
|||||||
return TransformedWriter.INSTANCE;
|
return TransformedWriter.INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public StorageBufferWriter<TransformedPart> getStorageBufferWriter() {
|
|
||||||
return TransformedStorageWriter.INSTANCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FileResolution getInstanceShader() {
|
public FileResolution getInstanceShader() {
|
||||||
return Components.Files.TRANSFORMED;
|
return Components.Files.TRANSFORMED;
|
||||||
|
@ -7,11 +7,10 @@ public class TransformedWriter extends ColoredLitWriter<TransformedPart> {
|
|||||||
public static final TransformedWriter INSTANCE = new TransformedWriter();
|
public static final TransformedWriter INSTANCE = new TransformedWriter();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(long ptr, TransformedPart d) {
|
public void write(final long ptr, final TransformedPart d) {
|
||||||
super.write(ptr, d);
|
super.write(ptr, d);
|
||||||
ptr += 6;
|
MatrixWrite.writeUnsafe(d.model, ptr + 8);
|
||||||
|
MatrixWrite.writeUnsafe(d.normal, ptr + 72);
|
||||||
((MatrixWrite) (Object) d.model).flywheel$writeUnsafe(ptr);
|
|
||||||
((MatrixWrite) (Object) d.normal).flywheel$writeUnsafe(ptr + 4 * 16);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,6 @@ void flw_instanceVertex(in FlwInstance i) {
|
|||||||
flw_vertexPos = vec4(rotateVertexByQuat(flw_vertexPos.xyz - i.pivot, i.rotation) + i.pivot + i.position, 1.0);
|
flw_vertexPos = vec4(rotateVertexByQuat(flw_vertexPos.xyz - i.pivot, i.rotation) + i.pivot + i.position, 1.0);
|
||||||
flw_vertexNormal = rotateVertexByQuat(flw_vertexNormal, i.rotation);
|
flw_vertexNormal = rotateVertexByQuat(flw_vertexNormal, i.rotation);
|
||||||
flw_vertexColor = i.color;
|
flw_vertexColor = i.color;
|
||||||
flw_vertexLight = i.light;
|
flw_vertexLight = i.light / 15.0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -14,6 +14,6 @@ void flw_instanceVertex(in FlwInstance i) {
|
|||||||
flw_vertexPos = i.pose * flw_vertexPos;
|
flw_vertexPos = i.pose * flw_vertexPos;
|
||||||
flw_vertexNormal = i.normal * flw_vertexNormal;
|
flw_vertexNormal = i.normal * flw_vertexNormal;
|
||||||
flw_vertexColor = i.color;
|
flw_vertexColor = i.color;
|
||||||
flw_vertexLight = i.light;
|
flw_vertexLight = i.light / 15.0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -5,7 +5,6 @@ layout(location = 1) in vec4 _flw_v_color;
|
|||||||
layout(location = 2) in vec2 _flw_v_texCoord;
|
layout(location = 2) in vec2 _flw_v_texCoord;
|
||||||
layout(location = 3) in ivec2 _flw_v_light;
|
layout(location = 3) in ivec2 _flw_v_light;
|
||||||
layout(location = 4) in vec3 _flw_v_normal;
|
layout(location = 4) in vec3 _flw_v_normal;
|
||||||
#define FLW_INSTANCE_BASE_INDEX 5
|
|
||||||
|
|
||||||
void flw_layoutVertex() {
|
void flw_layoutVertex() {
|
||||||
flw_vertexPos = vec4(_flw_v_pos, 1.0);
|
flw_vertexPos = vec4(_flw_v_pos, 1.0);
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
layout(location = 0) in vec3 _flw_v_pos;
|
layout(location = 0) in vec3 _flw_v_pos;
|
||||||
layout(location = 1) in vec2 _flw_v_texCoord;
|
layout(location = 1) in vec2 _flw_v_texCoord;
|
||||||
layout(location = 2) in vec3 _flw_v_normal;
|
layout(location = 2) in vec3 _flw_v_normal;
|
||||||
#define FLW_INSTANCE_BASE_INDEX 3
|
|
||||||
|
|
||||||
void flw_layoutVertex() {
|
void flw_layoutVertex() {
|
||||||
flw_vertexPos = vec4(_flw_v_pos, 1.0);
|
flw_vertexPos = vec4(_flw_v_pos, 1.0);
|
||||||
|
@ -66,6 +66,6 @@ void unpackBoundingSphere(in BoundingSphere sphere, out vec3 center, out float r
|
|||||||
radius = sphere.radius;
|
radius = sphere.radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec2 unpackLightCoord(in LightCoord light) {
|
ivec2 unpackLightCoord(in LightCoord light) {
|
||||||
return vec2(float((light.p >> 16) & 0xFFFFu), float(light.p & 0xFFFFu)) / 15.0;
|
return ivec2(light.p & 0xFFFFu, (light.p >> 16) & 0xFFFFu);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user