mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2025-02-09 19:55:02 +01:00
Sanstexts
- Add EmbeddedLevel to api - Move all context api/lib stuffs into backend - Move context shaders into internal - Inline Shader and TextureSource interfaces - Move matrix bounding sphere transform into util - Add uniforms to cull shader to allow it to work with embedded levels - Engine has 2 instancer methods, one that accepts an EmbeddedLevel and one without the parameter - Change VisualizationContext#withContext to #embed - Remove crumbling stuff from Contexts
This commit is contained in:
parent
94ae32b9a7
commit
e55d506511
45 changed files with 261 additions and 223 deletions
|
@ -11,6 +11,7 @@ import com.jozufozu.flywheel.api.visualization.VisualizationManager;
|
||||||
import com.jozufozu.flywheel.backend.Backends;
|
import com.jozufozu.flywheel.backend.Backends;
|
||||||
import com.jozufozu.flywheel.backend.ShaderIndices;
|
import com.jozufozu.flywheel.backend.ShaderIndices;
|
||||||
import com.jozufozu.flywheel.backend.compile.FlwPrograms;
|
import com.jozufozu.flywheel.backend.compile.FlwPrograms;
|
||||||
|
import com.jozufozu.flywheel.backend.context.ContextShaders;
|
||||||
import com.jozufozu.flywheel.backend.engine.uniform.Uniforms;
|
import com.jozufozu.flywheel.backend.engine.uniform.Uniforms;
|
||||||
import com.jozufozu.flywheel.config.BackendArgument;
|
import com.jozufozu.flywheel.config.BackendArgument;
|
||||||
import com.jozufozu.flywheel.config.FlwCommands;
|
import com.jozufozu.flywheel.config.FlwCommands;
|
||||||
|
@ -19,7 +20,6 @@ import com.jozufozu.flywheel.impl.BackendManagerImpl;
|
||||||
import com.jozufozu.flywheel.impl.registry.IdRegistryImpl;
|
import com.jozufozu.flywheel.impl.registry.IdRegistryImpl;
|
||||||
import com.jozufozu.flywheel.impl.registry.RegistryImpl;
|
import com.jozufozu.flywheel.impl.registry.RegistryImpl;
|
||||||
import com.jozufozu.flywheel.impl.visualization.VisualizationEventHandler;
|
import com.jozufozu.flywheel.impl.visualization.VisualizationEventHandler;
|
||||||
import com.jozufozu.flywheel.lib.context.ContextShaders;
|
|
||||||
import com.jozufozu.flywheel.lib.instance.InstanceTypes;
|
import com.jozufozu.flywheel.lib.instance.InstanceTypes;
|
||||||
import com.jozufozu.flywheel.lib.material.CutoutShaders;
|
import com.jozufozu.flywheel.lib.material.CutoutShaders;
|
||||||
import com.jozufozu.flywheel.lib.material.FogShaders;
|
import com.jozufozu.flywheel.lib.material.FogShaders;
|
||||||
|
|
|
@ -3,7 +3,6 @@ package com.jozufozu.flywheel.api.backend;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.BackendImplemented;
|
import com.jozufozu.flywheel.api.BackendImplemented;
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
import com.jozufozu.flywheel.api.event.RenderContext;
|
import com.jozufozu.flywheel.api.event.RenderContext;
|
||||||
import com.jozufozu.flywheel.api.event.RenderStage;
|
import com.jozufozu.flywheel.api.event.RenderStage;
|
||||||
import com.jozufozu.flywheel.api.instance.Instance;
|
import com.jozufozu.flywheel.api.instance.Instance;
|
||||||
|
@ -13,6 +12,7 @@ import com.jozufozu.flywheel.api.instance.InstancerProvider;
|
||||||
import com.jozufozu.flywheel.api.model.Model;
|
import com.jozufozu.flywheel.api.model.Model;
|
||||||
import com.jozufozu.flywheel.api.task.Plan;
|
import com.jozufozu.flywheel.api.task.Plan;
|
||||||
import com.jozufozu.flywheel.api.task.TaskExecutor;
|
import com.jozufozu.flywheel.api.task.TaskExecutor;
|
||||||
|
import com.jozufozu.flywheel.api.visualization.EmbeddedLevel;
|
||||||
|
|
||||||
import net.minecraft.client.Camera;
|
import net.minecraft.client.Camera;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
@ -32,7 +32,9 @@ public interface Engine {
|
||||||
* @return An instancer for the given instance type, model, and render stage.
|
* @return An instancer for the given instance type, model, and render stage.
|
||||||
* @see InstancerProvider
|
* @see InstancerProvider
|
||||||
*/
|
*/
|
||||||
<I extends Instance> Instancer<I> instancer(InstanceType<I> type, Context context, Model model, RenderStage stage);
|
<I extends Instance> Instancer<I> instancer(InstanceType<I> type, Model model, RenderStage stage);
|
||||||
|
|
||||||
|
<I extends Instance> Instancer<I> instancer(EmbeddedLevel world, InstanceType<I> type, Model model, RenderStage stage);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a plan that will be executed every frame.
|
* Create a plan that will be executed every frame.
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
package com.jozufozu.flywheel.api.context;
|
|
||||||
|
|
||||||
import org.joml.Matrix4fc;
|
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.BackendImplemented;
|
|
||||||
|
|
||||||
@BackendImplemented
|
|
||||||
public interface Shader {
|
|
||||||
void setTexture(String glslName, Texture texture);
|
|
||||||
|
|
||||||
void setFloat(String glslName, float value);
|
|
||||||
|
|
||||||
void setVec2(String glslName, float x, float y);
|
|
||||||
|
|
||||||
void setVec3(String glslName, float x, float y, float z);
|
|
||||||
|
|
||||||
void setVec4(String glslName, float x, float y, float z, float w);
|
|
||||||
|
|
||||||
void setMat4(String glslName, Matrix4fc matrix);
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
package com.jozufozu.flywheel.api.context;
|
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.BackendImplemented;
|
|
||||||
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
|
|
||||||
@BackendImplemented
|
|
||||||
public interface TextureSource {
|
|
||||||
/**
|
|
||||||
* Get a built-in texture by its resource location.
|
|
||||||
*
|
|
||||||
* @param texture The texture's resource location.
|
|
||||||
* @return The texture.
|
|
||||||
*/
|
|
||||||
Texture byName(ResourceLocation texture);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the overlay texture.
|
|
||||||
*
|
|
||||||
* @return The overlay texture.
|
|
||||||
*/
|
|
||||||
Texture overlay();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the light texture.
|
|
||||||
*
|
|
||||||
* @return The light texture.
|
|
||||||
*/
|
|
||||||
Texture light();
|
|
||||||
|
|
||||||
// TODO: Allow creating dynamic textures.
|
|
||||||
}
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
package com.jozufozu.flywheel.api.visualization;
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
|
|
||||||
|
import net.minecraft.world.phys.AABB;
|
||||||
|
|
||||||
|
public interface EmbeddedLevel {
|
||||||
|
void transform(PoseStack stack);
|
||||||
|
|
||||||
|
AABB boundingBox();
|
||||||
|
}
|
|
@ -2,8 +2,8 @@ package com.jozufozu.flywheel.api.visualization;
|
||||||
|
|
||||||
import org.jetbrains.annotations.ApiStatus;
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
import com.jozufozu.flywheel.api.instance.InstancerProvider;
|
import com.jozufozu.flywheel.api.instance.InstancerProvider;
|
||||||
|
import com.jozufozu.flywheel.backend.context.Context;
|
||||||
|
|
||||||
import net.minecraft.core.Vec3i;
|
import net.minecraft.core.Vec3i;
|
||||||
|
|
||||||
|
@ -32,5 +32,5 @@ public interface VisualizationContext {
|
||||||
* @return A new {@link VisualizationContext} for use with child visuals.
|
* @return A new {@link VisualizationContext} for use with child visuals.
|
||||||
*/
|
*/
|
||||||
@ApiStatus.Experimental
|
@ApiStatus.Experimental
|
||||||
VisualizationContext withContext(Context context, Vec3i renderOrigin);
|
VisualizationContext embed(EmbeddedLevel world);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,12 +8,12 @@ import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.jozufozu.flywheel.Flywheel;
|
import com.jozufozu.flywheel.Flywheel;
|
||||||
import com.jozufozu.flywheel.api.context.ContextShader;
|
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceType;
|
import com.jozufozu.flywheel.api.instance.InstanceType;
|
||||||
import com.jozufozu.flywheel.backend.ShaderIndices;
|
import com.jozufozu.flywheel.backend.ShaderIndices;
|
||||||
import com.jozufozu.flywheel.backend.compile.component.UberShaderComponent;
|
import com.jozufozu.flywheel.backend.compile.component.UberShaderComponent;
|
||||||
import com.jozufozu.flywheel.backend.compile.core.CompilerStats;
|
import com.jozufozu.flywheel.backend.compile.core.CompilerStats;
|
||||||
import com.jozufozu.flywheel.backend.compile.core.SourceLoader;
|
import com.jozufozu.flywheel.backend.compile.core.SourceLoader;
|
||||||
|
import com.jozufozu.flywheel.backend.context.ContextShader;
|
||||||
import com.jozufozu.flywheel.backend.glsl.ShaderSources;
|
import com.jozufozu.flywheel.backend.glsl.ShaderSources;
|
||||||
import com.jozufozu.flywheel.backend.glsl.SourceComponent;
|
import com.jozufozu.flywheel.backend.glsl.SourceComponent;
|
||||||
import com.jozufozu.flywheel.backend.glsl.generate.FnSignature;
|
import com.jozufozu.flywheel.backend.glsl.generate.FnSignature;
|
||||||
|
|
|
@ -7,11 +7,11 @@ import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.jozufozu.flywheel.Flywheel;
|
import com.jozufozu.flywheel.Flywheel;
|
||||||
import com.jozufozu.flywheel.api.context.ContextShader;
|
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceType;
|
import com.jozufozu.flywheel.api.instance.InstanceType;
|
||||||
import com.jozufozu.flywheel.backend.compile.component.IndirectComponent;
|
import com.jozufozu.flywheel.backend.compile.component.IndirectComponent;
|
||||||
import com.jozufozu.flywheel.backend.compile.core.CompilationHarness;
|
import com.jozufozu.flywheel.backend.compile.core.CompilationHarness;
|
||||||
import com.jozufozu.flywheel.backend.compile.core.Compile;
|
import com.jozufozu.flywheel.backend.compile.core.Compile;
|
||||||
|
import com.jozufozu.flywheel.backend.context.ContextShader;
|
||||||
import com.jozufozu.flywheel.backend.gl.GlCompat;
|
import com.jozufozu.flywheel.backend.gl.GlCompat;
|
||||||
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
|
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
|
||||||
import com.jozufozu.flywheel.backend.gl.shader.ShaderType;
|
import com.jozufozu.flywheel.backend.gl.shader.ShaderType;
|
||||||
|
|
|
@ -6,8 +6,8 @@ import java.util.Map;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.jozufozu.flywheel.api.context.ContextShader;
|
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceType;
|
import com.jozufozu.flywheel.api.instance.InstanceType;
|
||||||
|
import com.jozufozu.flywheel.backend.context.ContextShader;
|
||||||
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
|
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
|
||||||
import com.jozufozu.flywheel.backend.glsl.ShaderSources;
|
import com.jozufozu.flywheel.backend.glsl.ShaderSources;
|
||||||
import com.jozufozu.flywheel.backend.glsl.SourceComponent;
|
import com.jozufozu.flywheel.backend.glsl.SourceComponent;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package com.jozufozu.flywheel.backend.compile;
|
package com.jozufozu.flywheel.backend.compile;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.ContextShader;
|
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceType;
|
import com.jozufozu.flywheel.api.instance.InstanceType;
|
||||||
|
import com.jozufozu.flywheel.backend.context.ContextShader;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents the entire context of a program's usage.
|
* Represents the entire context of a program's usage.
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package com.jozufozu.flywheel.api.context;
|
package com.jozufozu.flywheel.backend.context;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.material.Material;
|
import com.jozufozu.flywheel.api.material.Material;
|
||||||
|
import com.jozufozu.flywheel.backend.engine.textures.TextureSource;
|
||||||
|
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
|
||||||
|
|
||||||
public interface Context {
|
public interface Context {
|
||||||
ContextShader contextShader();
|
ContextShader contextShader();
|
||||||
|
@ -12,5 +14,5 @@ public interface Context {
|
||||||
* @param shader The shader to prepare.
|
* @param shader The shader to prepare.
|
||||||
* @param textureSource Source of the textures to use.
|
* @param textureSource Source of the textures to use.
|
||||||
*/
|
*/
|
||||||
void prepare(Material material, Shader shader, TextureSource textureSource);
|
void prepare(Material material, GlProgram shader, TextureSource textureSource);
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package com.jozufozu.flywheel.api.context;
|
package com.jozufozu.flywheel.backend.context;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.internal.InternalFlywheelApi;
|
import com.jozufozu.flywheel.api.internal.InternalFlywheelApi;
|
||||||
import com.jozufozu.flywheel.api.registry.Registry;
|
import com.jozufozu.flywheel.api.registry.Registry;
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.jozufozu.flywheel.backend.context;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
|
|
||||||
|
import com.jozufozu.flywheel.Flywheel;
|
||||||
|
|
||||||
|
public class ContextShaders {
|
||||||
|
public static final SimpleContextShader DEFAULT = ContextShader.REGISTRY.registerAndGet(new SimpleContextShader(Flywheel.rl("internal/context/default.vert"), Flywheel.rl("internal/context/default.frag")));
|
||||||
|
public static final SimpleContextShader CRUMBLING = ContextShader.REGISTRY.registerAndGet(new SimpleContextShader(Flywheel.rl("internal/context/crumbling.vert"), Flywheel.rl("internal/context/crumbling.frag")));
|
||||||
|
public static final SimpleContextShader EMBEDDED = ContextShader.REGISTRY.registerAndGet(new SimpleContextShader(Flywheel.rl("internal/context/embedded.vert"), Flywheel.rl("internal/context/embedded.frag")));
|
||||||
|
|
||||||
|
private ContextShaders() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiStatus.Internal
|
||||||
|
public static void init() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.jozufozu.flywheel.backend.context;
|
||||||
|
|
||||||
|
public final class Contexts {
|
||||||
|
public static final Context DEFAULT = SimpleContext.builder(ContextShaders.DEFAULT)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
private Contexts() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
package com.jozufozu.flywheel.backend.context;
|
||||||
|
|
||||||
|
import com.jozufozu.flywheel.api.material.Material;
|
||||||
|
import com.jozufozu.flywheel.api.visualization.EmbeddedLevel;
|
||||||
|
import com.jozufozu.flywheel.backend.engine.textures.TextureSource;
|
||||||
|
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
|
||||||
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
|
|
||||||
|
public class EmbeddedContext implements Context {
|
||||||
|
private final EmbeddedLevel world;
|
||||||
|
|
||||||
|
public EmbeddedContext(EmbeddedLevel world) {
|
||||||
|
this.world = world;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ContextShader contextShader() {
|
||||||
|
return ContextShaders.EMBEDDED;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void prepare(Material material, GlProgram shader, TextureSource textureSource) {
|
||||||
|
var stack = new PoseStack();
|
||||||
|
world.transform(stack);
|
||||||
|
|
||||||
|
// shader.setVec3("create_oneOverLightBoxSize");
|
||||||
|
// shader.setVec3("create_lightVolumeMin");
|
||||||
|
shader.setMat4("_flw_model", stack.last()
|
||||||
|
.pose());
|
||||||
|
shader.setMat3("_flw_normal", stack.last()
|
||||||
|
.normal());
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,12 +1,10 @@
|
||||||
package com.jozufozu.flywheel.lib.context;
|
package com.jozufozu.flywheel.backend.context;
|
||||||
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
import com.jozufozu.flywheel.api.context.ContextShader;
|
|
||||||
import com.jozufozu.flywheel.api.context.Shader;
|
|
||||||
import com.jozufozu.flywheel.api.context.TextureSource;
|
|
||||||
import com.jozufozu.flywheel.api.material.Material;
|
import com.jozufozu.flywheel.api.material.Material;
|
||||||
|
import com.jozufozu.flywheel.backend.engine.textures.TextureSource;
|
||||||
|
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
|
||||||
|
|
||||||
public class SimpleContext implements Context {
|
public class SimpleContext implements Context {
|
||||||
private final ContextShader contextShader;
|
private final ContextShader contextShader;
|
||||||
|
@ -27,13 +25,13 @@ public class SimpleContext implements Context {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void prepare(Material material, Shader shader, TextureSource textureSource) {
|
public void prepare(Material material, GlProgram shader, TextureSource textureSource) {
|
||||||
preparation.prepare(material, shader, textureSource);
|
preparation.prepare(material, shader, textureSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface Preparation {
|
public interface Preparation {
|
||||||
void prepare(Material material, Shader shader, TextureSource textureSource);
|
void prepare(Material material, GlProgram shader, TextureSource textureSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Builder {
|
public static class Builder {
|
|
@ -1,6 +1,4 @@
|
||||||
package com.jozufozu.flywheel.lib.context;
|
package com.jozufozu.flywheel.backend.context;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.ContextShader;
|
|
||||||
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package com.jozufozu.flywheel.api.context;
|
package com.jozufozu.flywheel.backend.context;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.BackendImplemented;
|
import com.jozufozu.flywheel.api.BackendImplemented;
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
package com.jozufozu.flywheel.backend.engine;
|
package com.jozufozu.flywheel.backend.engine;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.backend.Engine;
|
import com.jozufozu.flywheel.api.backend.Engine;
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
import com.jozufozu.flywheel.api.event.RenderStage;
|
import com.jozufozu.flywheel.api.event.RenderStage;
|
||||||
import com.jozufozu.flywheel.api.instance.Instance;
|
import com.jozufozu.flywheel.api.instance.Instance;
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceType;
|
import com.jozufozu.flywheel.api.instance.InstanceType;
|
||||||
import com.jozufozu.flywheel.api.instance.Instancer;
|
import com.jozufozu.flywheel.api.instance.Instancer;
|
||||||
import com.jozufozu.flywheel.api.model.Model;
|
import com.jozufozu.flywheel.api.model.Model;
|
||||||
|
import com.jozufozu.flywheel.api.visualization.EmbeddedLevel;
|
||||||
|
import com.jozufozu.flywheel.backend.context.Contexts;
|
||||||
|
import com.jozufozu.flywheel.backend.context.EmbeddedContext;
|
||||||
|
|
||||||
import net.minecraft.client.Camera;
|
import net.minecraft.client.Camera;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
@ -22,8 +24,13 @@ public abstract class AbstractEngine implements Engine {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <I extends Instance> Instancer<I> instancer(InstanceType<I> type, Context context, Model model, RenderStage stage) {
|
public <I extends Instance> Instancer<I> instancer(InstanceType<I> type, Model model, RenderStage stage) {
|
||||||
return getStorage().getInstancer(type, context, model, stage);
|
return getStorage().getInstancer(type, Contexts.DEFAULT, model, stage);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <I extends Instance> Instancer<I> instancer(EmbeddedLevel world, InstanceType<I> type, Model model, RenderStage stage) {
|
||||||
|
return getStorage().getInstancer(type, new EmbeddedContext(world), model, stage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -2,10 +2,10 @@ package com.jozufozu.flywheel.backend.engine;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
import com.jozufozu.flywheel.api.instance.Instance;
|
import com.jozufozu.flywheel.api.instance.Instance;
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceType;
|
import com.jozufozu.flywheel.api.instance.InstanceType;
|
||||||
import com.jozufozu.flywheel.api.instance.Instancer;
|
import com.jozufozu.flywheel.api.instance.Instancer;
|
||||||
|
import com.jozufozu.flywheel.backend.context.Context;
|
||||||
import com.jozufozu.flywheel.lib.util.AtomicBitset;
|
import com.jozufozu.flywheel.lib.util.AtomicBitset;
|
||||||
|
|
||||||
public abstract class AbstractInstancer<I extends Instance> implements Instancer<I> {
|
public abstract class AbstractInstancer<I extends Instance> implements Instancer<I> {
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
package com.jozufozu.flywheel.backend.engine;
|
package com.jozufozu.flywheel.backend.engine;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
import com.jozufozu.flywheel.api.event.RenderStage;
|
import com.jozufozu.flywheel.api.event.RenderStage;
|
||||||
import com.jozufozu.flywheel.api.instance.Instance;
|
import com.jozufozu.flywheel.api.instance.Instance;
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceType;
|
import com.jozufozu.flywheel.api.instance.InstanceType;
|
||||||
import com.jozufozu.flywheel.api.model.Model;
|
import com.jozufozu.flywheel.api.model.Model;
|
||||||
|
import com.jozufozu.flywheel.backend.context.Context;
|
||||||
|
|
||||||
public record InstancerKey<I extends Instance>(InstanceType<I> type, Context context, Model model, RenderStage stage) {
|
public record InstancerKey<I extends Instance>(InstanceType<I> type, Context context, Model model, RenderStage stage) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,12 +6,12 @@ import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.Flywheel;
|
import com.jozufozu.flywheel.Flywheel;
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
import com.jozufozu.flywheel.api.event.RenderStage;
|
import com.jozufozu.flywheel.api.event.RenderStage;
|
||||||
import com.jozufozu.flywheel.api.instance.Instance;
|
import com.jozufozu.flywheel.api.instance.Instance;
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceType;
|
import com.jozufozu.flywheel.api.instance.InstanceType;
|
||||||
import com.jozufozu.flywheel.api.instance.Instancer;
|
import com.jozufozu.flywheel.api.instance.Instancer;
|
||||||
import com.jozufozu.flywheel.api.model.Model;
|
import com.jozufozu.flywheel.api.model.Model;
|
||||||
|
import com.jozufozu.flywheel.backend.context.Context;
|
||||||
|
|
||||||
public abstract class InstancerStorage<N extends AbstractInstancer<?>> {
|
public abstract class InstancerStorage<N extends AbstractInstancer<?>> {
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -16,22 +16,22 @@ import java.util.EnumMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
import com.jozufozu.flywheel.api.event.RenderStage;
|
import com.jozufozu.flywheel.api.event.RenderStage;
|
||||||
import com.jozufozu.flywheel.api.instance.Instance;
|
import com.jozufozu.flywheel.api.instance.Instance;
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceType;
|
import com.jozufozu.flywheel.api.instance.InstanceType;
|
||||||
import com.jozufozu.flywheel.api.material.Material;
|
import com.jozufozu.flywheel.api.material.Material;
|
||||||
import com.jozufozu.flywheel.api.model.Model;
|
import com.jozufozu.flywheel.api.model.Model;
|
||||||
import com.jozufozu.flywheel.backend.compile.IndirectPrograms;
|
import com.jozufozu.flywheel.backend.compile.IndirectPrograms;
|
||||||
|
import com.jozufozu.flywheel.backend.context.Context;
|
||||||
|
import com.jozufozu.flywheel.backend.context.SimpleContextShader;
|
||||||
import com.jozufozu.flywheel.backend.engine.MaterialRenderState;
|
import com.jozufozu.flywheel.backend.engine.MaterialRenderState;
|
||||||
import com.jozufozu.flywheel.backend.engine.MeshPool;
|
import com.jozufozu.flywheel.backend.engine.MeshPool;
|
||||||
import com.jozufozu.flywheel.backend.engine.textures.TextureBinder;
|
import com.jozufozu.flywheel.backend.engine.textures.TextureBinder;
|
||||||
import com.jozufozu.flywheel.backend.engine.textures.TextureSourceImpl;
|
import com.jozufozu.flywheel.backend.engine.textures.TextureSource;
|
||||||
import com.jozufozu.flywheel.backend.engine.uniform.Uniforms;
|
import com.jozufozu.flywheel.backend.engine.uniform.Uniforms;
|
||||||
import com.jozufozu.flywheel.backend.gl.Driver;
|
import com.jozufozu.flywheel.backend.gl.Driver;
|
||||||
import com.jozufozu.flywheel.backend.gl.GlCompat;
|
import com.jozufozu.flywheel.backend.gl.GlCompat;
|
||||||
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
|
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
|
||||||
import com.jozufozu.flywheel.lib.context.SimpleContextShader;
|
|
||||||
|
|
||||||
public class IndirectCullingGroup<I extends Instance> {
|
public class IndirectCullingGroup<I extends Instance> {
|
||||||
private static final Comparator<IndirectDraw> DRAW_COMPARATOR = Comparator.comparing(IndirectDraw::stage)
|
private static final Comparator<IndirectDraw> DRAW_COMPARATOR = Comparator.comparing(IndirectDraw::stage)
|
||||||
|
@ -191,7 +191,7 @@ public class IndirectCullingGroup<I extends Instance> {
|
||||||
needsDrawSort = true;
|
needsDrawSort = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void submit(RenderStage stage, TextureSourceImpl textures) {
|
public void submit(RenderStage stage, TextureSource textures) {
|
||||||
if (nothingToDo(stage)) {
|
if (nothingToDo(stage)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,11 +12,12 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.backend.Engine;
|
import com.jozufozu.flywheel.api.backend.Engine;
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
import com.jozufozu.flywheel.api.event.RenderStage;
|
import com.jozufozu.flywheel.api.event.RenderStage;
|
||||||
import com.jozufozu.flywheel.api.instance.Instance;
|
import com.jozufozu.flywheel.api.instance.Instance;
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceType;
|
import com.jozufozu.flywheel.api.instance.InstanceType;
|
||||||
import com.jozufozu.flywheel.backend.compile.IndirectPrograms;
|
import com.jozufozu.flywheel.backend.compile.IndirectPrograms;
|
||||||
|
import com.jozufozu.flywheel.backend.context.Context;
|
||||||
|
import com.jozufozu.flywheel.backend.context.ContextShaders;
|
||||||
import com.jozufozu.flywheel.backend.engine.CommonCrumbling;
|
import com.jozufozu.flywheel.backend.engine.CommonCrumbling;
|
||||||
import com.jozufozu.flywheel.backend.engine.InstanceHandleImpl;
|
import com.jozufozu.flywheel.backend.engine.InstanceHandleImpl;
|
||||||
import com.jozufozu.flywheel.backend.engine.InstancerKey;
|
import com.jozufozu.flywheel.backend.engine.InstancerKey;
|
||||||
|
@ -24,14 +25,12 @@ import com.jozufozu.flywheel.backend.engine.InstancerStorage;
|
||||||
import com.jozufozu.flywheel.backend.engine.MaterialRenderState;
|
import com.jozufozu.flywheel.backend.engine.MaterialRenderState;
|
||||||
import com.jozufozu.flywheel.backend.engine.MeshPool;
|
import com.jozufozu.flywheel.backend.engine.MeshPool;
|
||||||
import com.jozufozu.flywheel.backend.engine.textures.TextureBinder;
|
import com.jozufozu.flywheel.backend.engine.textures.TextureBinder;
|
||||||
import com.jozufozu.flywheel.backend.engine.textures.TextureSourceImpl;
|
import com.jozufozu.flywheel.backend.engine.textures.TextureSource;
|
||||||
import com.jozufozu.flywheel.backend.engine.uniform.Uniforms;
|
import com.jozufozu.flywheel.backend.engine.uniform.Uniforms;
|
||||||
import com.jozufozu.flywheel.backend.gl.GlStateTracker;
|
import com.jozufozu.flywheel.backend.gl.GlStateTracker;
|
||||||
import com.jozufozu.flywheel.backend.gl.array.GlVertexArray;
|
import com.jozufozu.flywheel.backend.gl.array.GlVertexArray;
|
||||||
import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer;
|
import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer;
|
||||||
import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType;
|
import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType;
|
||||||
import com.jozufozu.flywheel.lib.context.ContextShaders;
|
|
||||||
import com.jozufozu.flywheel.lib.context.Contexts;
|
|
||||||
import com.jozufozu.flywheel.lib.material.SimpleMaterial;
|
import com.jozufozu.flywheel.lib.material.SimpleMaterial;
|
||||||
import com.jozufozu.flywheel.lib.memory.MemoryBlock;
|
import com.jozufozu.flywheel.lib.memory.MemoryBlock;
|
||||||
import com.jozufozu.flywheel.lib.util.Pair;
|
import com.jozufozu.flywheel.lib.util.Pair;
|
||||||
|
@ -45,7 +44,7 @@ public class IndirectDrawManager extends InstancerStorage<IndirectInstancer<?>>
|
||||||
private final StagingBuffer stagingBuffer;
|
private final StagingBuffer stagingBuffer;
|
||||||
private final MeshPool meshPool;
|
private final MeshPool meshPool;
|
||||||
private final GlVertexArray vertexArray;
|
private final GlVertexArray vertexArray;
|
||||||
private final TextureSourceImpl textures = new TextureSourceImpl();
|
private final TextureSource textures = new TextureSource();
|
||||||
private final Map<GroupKey<?>, IndirectCullingGroup<?>> cullingGroups = new HashMap<>();
|
private final Map<GroupKey<?>, IndirectCullingGroup<?>> cullingGroups = new HashMap<>();
|
||||||
private final GlBuffer crumblingDrawBuffer = new GlBuffer();
|
private final GlBuffer crumblingDrawBuffer = new GlBuffer();
|
||||||
|
|
||||||
|
@ -169,6 +168,8 @@ public class IndirectDrawManager extends InstancerStorage<IndirectInstancer<?>>
|
||||||
.bindWithContextShader(ContextShaders.CRUMBLING);
|
.bindWithContextShader(ContextShaders.CRUMBLING);
|
||||||
|
|
||||||
for (var progressEntry : byProgress.int2ObjectEntrySet()) {
|
for (var progressEntry : byProgress.int2ObjectEntrySet()) {
|
||||||
|
program.setTexture("crumblingTex", textures.byName(ModelBakery.BREAKING_LOCATIONS.get(progressEntry.getIntKey())));
|
||||||
|
|
||||||
for (var instanceHandlePair : progressEntry.getValue()) {
|
for (var instanceHandlePair : progressEntry.getValue()) {
|
||||||
IndirectInstancer<?> instancer = instanceHandlePair.first();
|
IndirectInstancer<?> instancer = instanceHandlePair.first();
|
||||||
int instanceIndex = instanceHandlePair.second().index;
|
int instanceIndex = instanceHandlePair.second().index;
|
||||||
|
@ -177,9 +178,7 @@ public class IndirectDrawManager extends InstancerStorage<IndirectInstancer<?>>
|
||||||
|
|
||||||
// Transform the material to be suited for crumbling.
|
// Transform the material to be suited for crumbling.
|
||||||
CommonCrumbling.applyCrumblingProperties(crumblingMaterial, draw.material());
|
CommonCrumbling.applyCrumblingProperties(crumblingMaterial, draw.material());
|
||||||
var context = Contexts.CRUMBLING.get(progressEntry.getIntKey());
|
|
||||||
|
|
||||||
context.prepare(crumblingMaterial, program, textures);
|
|
||||||
MaterialRenderState.setup(crumblingMaterial);
|
MaterialRenderState.setup(crumblingMaterial);
|
||||||
|
|
||||||
// Upload the draw command.
|
// Upload the draw command.
|
||||||
|
@ -188,12 +187,12 @@ public class IndirectDrawManager extends InstancerStorage<IndirectInstancer<?>>
|
||||||
|
|
||||||
// Submit! Everything is already bound by here.
|
// Submit! Everything is already bound by here.
|
||||||
glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, 0);
|
glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TextureBinder.resetTextureBindings();
|
TextureBinder.resetTextureBindings();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MaterialRenderState.reset();
|
MaterialRenderState.reset();
|
||||||
TextureBinder.resetLightAndOverlay();
|
TextureBinder.resetLightAndOverlay();
|
||||||
|
|
|
@ -6,11 +6,11 @@ import java.util.List;
|
||||||
import org.joml.Vector4fc;
|
import org.joml.Vector4fc;
|
||||||
import org.lwjgl.system.MemoryUtil;
|
import org.lwjgl.system.MemoryUtil;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
import com.jozufozu.flywheel.api.instance.Instance;
|
import com.jozufozu.flywheel.api.instance.Instance;
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceType;
|
import com.jozufozu.flywheel.api.instance.InstanceType;
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceWriter;
|
import com.jozufozu.flywheel.api.instance.InstanceWriter;
|
||||||
import com.jozufozu.flywheel.api.model.Model;
|
import com.jozufozu.flywheel.api.model.Model;
|
||||||
|
import com.jozufozu.flywheel.backend.context.Context;
|
||||||
import com.jozufozu.flywheel.backend.engine.AbstractInstancer;
|
import com.jozufozu.flywheel.backend.engine.AbstractInstancer;
|
||||||
|
|
||||||
public class IndirectInstancer<I extends Instance> extends AbstractInstancer<I> {
|
public class IndirectInstancer<I extends Instance> extends AbstractInstancer<I> {
|
||||||
|
|
|
@ -20,6 +20,7 @@ import com.jozufozu.flywheel.api.instance.Instance;
|
||||||
import com.jozufozu.flywheel.api.material.Material;
|
import com.jozufozu.flywheel.api.material.Material;
|
||||||
import com.jozufozu.flywheel.backend.ShaderIndices;
|
import com.jozufozu.flywheel.backend.ShaderIndices;
|
||||||
import com.jozufozu.flywheel.backend.compile.InstancingPrograms;
|
import com.jozufozu.flywheel.backend.compile.InstancingPrograms;
|
||||||
|
import com.jozufozu.flywheel.backend.context.ContextShaders;
|
||||||
import com.jozufozu.flywheel.backend.engine.CommonCrumbling;
|
import com.jozufozu.flywheel.backend.engine.CommonCrumbling;
|
||||||
import com.jozufozu.flywheel.backend.engine.InstanceHandleImpl;
|
import com.jozufozu.flywheel.backend.engine.InstanceHandleImpl;
|
||||||
import com.jozufozu.flywheel.backend.engine.InstancerKey;
|
import com.jozufozu.flywheel.backend.engine.InstancerKey;
|
||||||
|
@ -28,15 +29,13 @@ import com.jozufozu.flywheel.backend.engine.MaterialEncoder;
|
||||||
import com.jozufozu.flywheel.backend.engine.MaterialRenderState;
|
import com.jozufozu.flywheel.backend.engine.MaterialRenderState;
|
||||||
import com.jozufozu.flywheel.backend.engine.MeshPool;
|
import com.jozufozu.flywheel.backend.engine.MeshPool;
|
||||||
import com.jozufozu.flywheel.backend.engine.textures.TextureBinder;
|
import com.jozufozu.flywheel.backend.engine.textures.TextureBinder;
|
||||||
import com.jozufozu.flywheel.backend.engine.textures.TextureSourceImpl;
|
import com.jozufozu.flywheel.backend.engine.textures.TextureSource;
|
||||||
import com.jozufozu.flywheel.backend.engine.uniform.Uniforms;
|
import com.jozufozu.flywheel.backend.engine.uniform.Uniforms;
|
||||||
import com.jozufozu.flywheel.backend.gl.GlStateTracker;
|
import com.jozufozu.flywheel.backend.gl.GlStateTracker;
|
||||||
import com.jozufozu.flywheel.backend.gl.GlTextureUnit;
|
import com.jozufozu.flywheel.backend.gl.GlTextureUnit;
|
||||||
import com.jozufozu.flywheel.backend.gl.TextureBuffer;
|
import com.jozufozu.flywheel.backend.gl.TextureBuffer;
|
||||||
import com.jozufozu.flywheel.backend.gl.array.GlVertexArray;
|
import com.jozufozu.flywheel.backend.gl.array.GlVertexArray;
|
||||||
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
|
import com.jozufozu.flywheel.backend.gl.shader.GlProgram;
|
||||||
import com.jozufozu.flywheel.lib.context.ContextShaders;
|
|
||||||
import com.jozufozu.flywheel.lib.context.Contexts;
|
|
||||||
import com.jozufozu.flywheel.lib.material.SimpleMaterial;
|
import com.jozufozu.flywheel.lib.material.SimpleMaterial;
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
|
||||||
|
@ -54,7 +53,7 @@ public class InstancedDrawManager extends InstancerStorage<InstancedInstancer<?>
|
||||||
*/
|
*/
|
||||||
private final MeshPool meshPool;
|
private final MeshPool meshPool;
|
||||||
private final GlVertexArray vao;
|
private final GlVertexArray vao;
|
||||||
private final TextureSourceImpl textures;
|
private final TextureSource textures;
|
||||||
private final TextureBuffer instanceTexture;
|
private final TextureBuffer instanceTexture;
|
||||||
|
|
||||||
public InstancedDrawManager(InstancingPrograms programs) {
|
public InstancedDrawManager(InstancingPrograms programs) {
|
||||||
|
@ -63,7 +62,7 @@ public class InstancedDrawManager extends InstancerStorage<InstancedInstancer<?>
|
||||||
|
|
||||||
meshPool = new MeshPool();
|
meshPool = new MeshPool();
|
||||||
vao = GlVertexArray.create();
|
vao = GlVertexArray.create();
|
||||||
textures = new TextureSourceImpl();
|
textures = new TextureSource();
|
||||||
instanceTexture = new TextureBuffer();
|
instanceTexture = new TextureBuffer();
|
||||||
|
|
||||||
meshPool.bind(vao);
|
meshPool.bind(vao);
|
||||||
|
@ -223,8 +222,7 @@ public class InstancedDrawManager extends InstancerStorage<InstancedInstancer<?>
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var context = Contexts.CRUMBLING.get(progressEntry.getIntKey());
|
program.setTexture("crumblingTex", textures.byName(ModelBakery.BREAKING_LOCATIONS.get(progressEntry.getIntKey())));
|
||||||
context.prepare(crumblingMaterial, program, textures);
|
|
||||||
|
|
||||||
GlTextureUnit.T3.makeActive();
|
GlTextureUnit.T3.makeActive();
|
||||||
program.setSamplerBinding("_flw_instances", 3);
|
program.setSamplerBinding("_flw_instances", 3);
|
||||||
|
|
|
@ -5,10 +5,10 @@ import java.util.List;
|
||||||
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
import com.jozufozu.flywheel.api.instance.Instance;
|
import com.jozufozu.flywheel.api.instance.Instance;
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceType;
|
import com.jozufozu.flywheel.api.instance.InstanceType;
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceWriter;
|
import com.jozufozu.flywheel.api.instance.InstanceWriter;
|
||||||
|
import com.jozufozu.flywheel.backend.context.Context;
|
||||||
import com.jozufozu.flywheel.backend.engine.AbstractInstancer;
|
import com.jozufozu.flywheel.backend.engine.AbstractInstancer;
|
||||||
import com.jozufozu.flywheel.backend.gl.TextureBuffer;
|
import com.jozufozu.flywheel.backend.gl.TextureBuffer;
|
||||||
import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer;
|
import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package com.jozufozu.flywheel.backend.engine.instancing;
|
package com.jozufozu.flywheel.backend.engine.instancing;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceType;
|
import com.jozufozu.flywheel.api.instance.InstanceType;
|
||||||
import com.jozufozu.flywheel.api.material.Material;
|
import com.jozufozu.flywheel.api.material.Material;
|
||||||
|
import com.jozufozu.flywheel.backend.context.Context;
|
||||||
|
|
||||||
public record ShaderState(Material material, InstanceType<?> instanceType, Context context) {
|
public record ShaderState(Material material, InstanceType<?> instanceType, Context context) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package com.jozufozu.flywheel.backend.engine.textures;
|
package com.jozufozu.flywheel.backend.engine.textures;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.Texture;
|
import com.jozufozu.flywheel.backend.context.Texture;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal base interface that {@link com.jozufozu.flywheel.backend.gl.shader.GlProgram GlProgram} expects.
|
* Internal base interface that {@link com.jozufozu.flywheel.backend.gl.shader.GlProgram GlProgram} expects.
|
||||||
|
|
|
@ -3,8 +3,7 @@ package com.jozufozu.flywheel.backend.engine.textures;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.Texture;
|
import com.jozufozu.flywheel.backend.context.Texture;
|
||||||
import com.jozufozu.flywheel.api.context.TextureSource;
|
|
||||||
import com.jozufozu.flywheel.backend.mixin.LightTextureAccessor;
|
import com.jozufozu.flywheel.backend.mixin.LightTextureAccessor;
|
||||||
import com.jozufozu.flywheel.backend.mixin.OverlayTextureAccessor;
|
import com.jozufozu.flywheel.backend.mixin.OverlayTextureAccessor;
|
||||||
|
|
||||||
|
@ -12,13 +11,13 @@ import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.renderer.texture.AbstractTexture;
|
import net.minecraft.client.renderer.texture.AbstractTexture;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
|
||||||
public class TextureSourceImpl implements TextureSource {
|
public class TextureSource {
|
||||||
|
|
||||||
private final DirectTexture lightTexture;
|
private final DirectTexture lightTexture;
|
||||||
private final DirectTexture overlayTexture;
|
private final DirectTexture overlayTexture;
|
||||||
private final Map<ResourceLocation, WrappedTexture> wrappers = new HashMap<>();
|
private final Map<ResourceLocation, WrappedTexture> wrappers = new HashMap<>();
|
||||||
|
|
||||||
public TextureSourceImpl() {
|
public TextureSource() {
|
||||||
var gameRenderer = Minecraft.getInstance().gameRenderer;
|
var gameRenderer = Minecraft.getInstance().gameRenderer;
|
||||||
|
|
||||||
this.lightTexture = new DirectTexture(((LightTextureAccessor) gameRenderer.lightTexture()).flywheel$texture()
|
this.lightTexture = new DirectTexture(((LightTextureAccessor) gameRenderer.lightTexture()).flywheel$texture()
|
||||||
|
@ -28,19 +27,32 @@ public class TextureSourceImpl implements TextureSource {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
|
* Get a built-in texture by its resource location.
|
||||||
|
*
|
||||||
|
* @param texture The texture's resource location.
|
||||||
|
* @return The texture.
|
||||||
|
*/
|
||||||
public Texture byName(ResourceLocation texture) {
|
public Texture byName(ResourceLocation texture) {
|
||||||
return wrappers.computeIfAbsent(texture, key -> new WrappedTexture(Minecraft.getInstance()
|
return wrappers.computeIfAbsent(texture, key -> new WrappedTexture(Minecraft.getInstance()
|
||||||
.getTextureManager()
|
.getTextureManager()
|
||||||
.getTexture(key)));
|
.getTexture(key)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
|
* Get the overlay texture.
|
||||||
|
*
|
||||||
|
* @return The overlay texture.
|
||||||
|
*/
|
||||||
public Texture overlay() {
|
public Texture overlay() {
|
||||||
return overlayTexture;
|
return overlayTexture;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
|
* Get the light texture.
|
||||||
|
*
|
||||||
|
* @return The light texture.
|
||||||
|
*/
|
||||||
public Texture light() {
|
public Texture light() {
|
||||||
return lightTexture;
|
return lightTexture;
|
||||||
}
|
}
|
|
@ -8,16 +8,17 @@ import static org.lwjgl.opengl.GL20.glUniform1i;
|
||||||
import static org.lwjgl.opengl.GL20.glUniform2f;
|
import static org.lwjgl.opengl.GL20.glUniform2f;
|
||||||
import static org.lwjgl.opengl.GL20.glUniform3f;
|
import static org.lwjgl.opengl.GL20.glUniform3f;
|
||||||
import static org.lwjgl.opengl.GL20.glUniform4f;
|
import static org.lwjgl.opengl.GL20.glUniform4f;
|
||||||
|
import static org.lwjgl.opengl.GL20.glUniformMatrix3fv;
|
||||||
import static org.lwjgl.opengl.GL20.glUniformMatrix4fv;
|
import static org.lwjgl.opengl.GL20.glUniformMatrix4fv;
|
||||||
import static org.lwjgl.opengl.GL31.GL_INVALID_INDEX;
|
import static org.lwjgl.opengl.GL31.GL_INVALID_INDEX;
|
||||||
import static org.lwjgl.opengl.GL31.glGetUniformBlockIndex;
|
import static org.lwjgl.opengl.GL31.glGetUniformBlockIndex;
|
||||||
import static org.lwjgl.opengl.GL31.glUniformBlockBinding;
|
import static org.lwjgl.opengl.GL31.glUniformBlockBinding;
|
||||||
|
|
||||||
|
import org.joml.Matrix3fc;
|
||||||
import org.joml.Matrix4fc;
|
import org.joml.Matrix4fc;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.Shader;
|
import com.jozufozu.flywheel.backend.context.Texture;
|
||||||
import com.jozufozu.flywheel.api.context.Texture;
|
|
||||||
import com.jozufozu.flywheel.backend.engine.textures.IdentifiedTexture;
|
import com.jozufozu.flywheel.backend.engine.textures.IdentifiedTexture;
|
||||||
import com.jozufozu.flywheel.backend.engine.textures.TextureBinder;
|
import com.jozufozu.flywheel.backend.engine.textures.TextureBinder;
|
||||||
import com.jozufozu.flywheel.backend.gl.GlObject;
|
import com.jozufozu.flywheel.backend.gl.GlObject;
|
||||||
|
@ -27,7 +28,7 @@ import com.mojang.logging.LogUtils;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2IntMap;
|
import it.unimi.dsi.fastutil.objects.Object2IntMap;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
|
||||||
|
|
||||||
public class GlProgram extends GlObject implements Shader {
|
public class GlProgram extends GlObject {
|
||||||
private static final Logger LOGGER = LogUtils.getLogger();
|
private static final Logger LOGGER = LogUtils.getLogger();
|
||||||
|
|
||||||
private final Object2IntMap<String> uniformLocationCache = new Object2IntOpenHashMap<>();
|
private final Object2IntMap<String> uniformLocationCache = new Object2IntOpenHashMap<>();
|
||||||
|
@ -44,10 +45,7 @@ public class GlProgram extends GlObject implements Shader {
|
||||||
ProgramManager.glUseProgram(0);
|
ProgramManager.glUseProgram(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setTexture(String glslName, Texture texture) {
|
public void setTexture(String glslName, Texture texture) {
|
||||||
throwIfReserved(glslName);
|
|
||||||
|
|
||||||
if (!(texture instanceof IdentifiedTexture identified)) {
|
if (!(texture instanceof IdentifiedTexture identified)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -64,10 +62,7 @@ public class GlProgram extends GlObject implements Shader {
|
||||||
glUniform1i(uniform, binding);
|
glUniform1i(uniform, binding);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setFloat(String glslName, float value) {
|
public void setFloat(String glslName, float value) {
|
||||||
throwIfReserved(glslName);
|
|
||||||
|
|
||||||
int uniform = getUniformLocation(glslName);
|
int uniform = getUniformLocation(glslName);
|
||||||
|
|
||||||
if (uniform < 0) {
|
if (uniform < 0) {
|
||||||
|
@ -77,10 +72,7 @@ public class GlProgram extends GlObject implements Shader {
|
||||||
glUniform1f(uniform, value);
|
glUniform1f(uniform, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setVec2(String glslName, float x, float y) {
|
public void setVec2(String glslName, float x, float y) {
|
||||||
throwIfReserved(glslName);
|
|
||||||
|
|
||||||
int uniform = getUniformLocation(glslName);
|
int uniform = getUniformLocation(glslName);
|
||||||
|
|
||||||
if (uniform < 0) {
|
if (uniform < 0) {
|
||||||
|
@ -90,10 +82,7 @@ public class GlProgram extends GlObject implements Shader {
|
||||||
glUniform2f(uniform, x, y);
|
glUniform2f(uniform, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setVec3(String glslName, float x, float y, float z) {
|
public void setVec3(String glslName, float x, float y, float z) {
|
||||||
throwIfReserved(glslName);
|
|
||||||
|
|
||||||
int uniform = getUniformLocation(glslName);
|
int uniform = getUniformLocation(glslName);
|
||||||
|
|
||||||
if (uniform < 0) {
|
if (uniform < 0) {
|
||||||
|
@ -103,10 +92,7 @@ public class GlProgram extends GlObject implements Shader {
|
||||||
glUniform3f(uniform, x, y, z);
|
glUniform3f(uniform, x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setVec4(String glslName, float x, float y, float z, float w) {
|
public void setVec4(String glslName, float x, float y, float z, float w) {
|
||||||
throwIfReserved(glslName);
|
|
||||||
|
|
||||||
int uniform = getUniformLocation(glslName);
|
int uniform = getUniformLocation(glslName);
|
||||||
|
|
||||||
if (uniform < 0) {
|
if (uniform < 0) {
|
||||||
|
@ -116,10 +102,7 @@ public class GlProgram extends GlObject implements Shader {
|
||||||
glUniform4f(uniform, x, y, z, w);
|
glUniform4f(uniform, x, y, z, w);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setMat4(String glslName, Matrix4fc matrix) {
|
public void setMat4(String glslName, Matrix4fc matrix) {
|
||||||
throwIfReserved(glslName);
|
|
||||||
|
|
||||||
int uniform = getUniformLocation(glslName);
|
int uniform = getUniformLocation(glslName);
|
||||||
|
|
||||||
if (uniform < 0) {
|
if (uniform < 0) {
|
||||||
|
@ -129,6 +112,16 @@ public class GlProgram extends GlObject implements Shader {
|
||||||
glUniformMatrix4fv(uniform, false, matrix.get(new float[16]));
|
glUniformMatrix4fv(uniform, false, matrix.get(new float[16]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setMat3(String glslName, Matrix3fc matrix) {
|
||||||
|
int uniform = getUniformLocation(glslName);
|
||||||
|
|
||||||
|
if (uniform < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
glUniformMatrix3fv(uniform, false, matrix.get(new float[9]));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the index of the uniform with the given name.
|
* Retrieves the index of the uniform with the given name.
|
||||||
*
|
*
|
||||||
|
@ -179,18 +172,4 @@ public class GlProgram extends GlObject implements Shader {
|
||||||
protected void deleteInternal(int handle) {
|
protected void deleteInternal(int handle) {
|
||||||
glDeleteProgram(handle);
|
glDeleteProgram(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void throwIfReserved(String glslName) {
|
|
||||||
if (glslName.startsWith("flw_")) {
|
|
||||||
throw new IllegalArgumentException("Uniform names starting with flw_are reserved");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (glslName.startsWith("_flw_")) {
|
|
||||||
throw new IllegalArgumentException("Uniform names starting with _flw_ are reserved for internal use");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (glslName.startsWith("gl_")) {
|
|
||||||
throw new IllegalArgumentException("Uniform names cannot start with gl_");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,25 +3,63 @@ package com.jozufozu.flywheel.impl.visualization;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.backend.Engine;
|
import com.jozufozu.flywheel.api.backend.Engine;
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
import com.jozufozu.flywheel.api.event.RenderStage;
|
import com.jozufozu.flywheel.api.event.RenderStage;
|
||||||
import com.jozufozu.flywheel.api.instance.Instance;
|
import com.jozufozu.flywheel.api.instance.Instance;
|
||||||
import com.jozufozu.flywheel.api.instance.InstanceType;
|
import com.jozufozu.flywheel.api.instance.InstanceType;
|
||||||
import com.jozufozu.flywheel.api.instance.Instancer;
|
import com.jozufozu.flywheel.api.instance.Instancer;
|
||||||
import com.jozufozu.flywheel.api.instance.InstancerProvider;
|
import com.jozufozu.flywheel.api.instance.InstancerProvider;
|
||||||
import com.jozufozu.flywheel.api.model.Model;
|
import com.jozufozu.flywheel.api.model.Model;
|
||||||
|
import com.jozufozu.flywheel.api.visualization.EmbeddedLevel;
|
||||||
import com.jozufozu.flywheel.api.visualization.VisualizationContext;
|
import com.jozufozu.flywheel.api.visualization.VisualizationContext;
|
||||||
|
|
||||||
public record InstancerProviderImpl(Engine engine,
|
public class InstancerProviderImpl implements InstancerProvider, Supplier<VisualizationContext> {
|
||||||
Context context,
|
protected final Engine engine;
|
||||||
RenderStage renderStage) implements InstancerProvider, Supplier<VisualizationContext> {
|
protected final RenderStage renderStage;
|
||||||
|
|
||||||
|
public InstancerProviderImpl(Engine engine, RenderStage renderStage) {
|
||||||
|
this.engine = engine;
|
||||||
|
this.renderStage = renderStage;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <I extends Instance> Instancer<I> instancer(InstanceType<I> type, Model model) {
|
public <I extends Instance> Instancer<I> instancer(InstanceType<I> type, Model model) {
|
||||||
return engine.instancer(type, context, model, renderStage);
|
return engine.instancer(type, model, renderStage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VisualizationContext get() {
|
public VisualizationContext get() {
|
||||||
return new VisualizationContextImpl(this, engine.renderOrigin());
|
return new VisualizationContextImpl(this, engine.renderOrigin());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Embedded embed(EmbeddedLevel world) {
|
||||||
|
return new Embedded(engine, world, renderStage);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "InstancerProviderImpl[" + "engine=" + engine + ", " + "renderStage=" + renderStage + ']';
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class Embedded extends InstancerProviderImpl {
|
||||||
|
private final EmbeddedLevel world;
|
||||||
|
|
||||||
|
public Embedded(Engine engine, EmbeddedLevel world, RenderStage renderStage) {
|
||||||
|
super(engine, renderStage);
|
||||||
|
this.world = world;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <I extends Instance> Instancer<I> instancer(InstanceType<I> type, Model model) {
|
||||||
|
return engine.instancer(world, type, model, renderStage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public EmbeddedLevel world() {
|
||||||
|
return world;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "InstancerProviderImpl.EmbeddedImpl[" + "world=" + world + ", " + "engine=" + engine + ", " + "renderStage=" + renderStage + ']';
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package com.jozufozu.flywheel.impl.visualization;
|
package com.jozufozu.flywheel.impl.visualization;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
import com.jozufozu.flywheel.api.instance.InstancerProvider;
|
import com.jozufozu.flywheel.api.instance.InstancerProvider;
|
||||||
|
import com.jozufozu.flywheel.api.visualization.EmbeddedLevel;
|
||||||
import com.jozufozu.flywheel.api.visualization.VisualizationContext;
|
import com.jozufozu.flywheel.api.visualization.VisualizationContext;
|
||||||
|
|
||||||
import net.minecraft.core.Vec3i;
|
import net.minecraft.core.Vec3i;
|
||||||
|
@ -15,8 +15,7 @@ import net.minecraft.core.Vec3i;
|
||||||
*/
|
*/
|
||||||
public record VisualizationContextImpl(InstancerProviderImpl instancerProvider, Vec3i renderOrigin) implements VisualizationContext {
|
public record VisualizationContextImpl(InstancerProviderImpl instancerProvider, Vec3i renderOrigin) implements VisualizationContext {
|
||||||
@Override
|
@Override
|
||||||
public VisualizationContext withContext(Context context, Vec3i renderOrigin) {
|
public VisualizationContext embed(EmbeddedLevel world) {
|
||||||
var provider = new InstancerProviderImpl(instancerProvider.engine(), context, instancerProvider.renderStage());
|
return new VisualizationContextImpl(instancerProvider.embed(world), renderOrigin);
|
||||||
return new VisualizationContextImpl(provider, renderOrigin);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,6 @@ import com.jozufozu.flywheel.impl.visualization.manager.VisualManagerImpl;
|
||||||
import com.jozufozu.flywheel.impl.visualization.ratelimit.BandedPrimeLimiter;
|
import com.jozufozu.flywheel.impl.visualization.ratelimit.BandedPrimeLimiter;
|
||||||
import com.jozufozu.flywheel.impl.visualization.ratelimit.DistanceUpdateLimiterImpl;
|
import com.jozufozu.flywheel.impl.visualization.ratelimit.DistanceUpdateLimiterImpl;
|
||||||
import com.jozufozu.flywheel.impl.visualization.ratelimit.NonLimiter;
|
import com.jozufozu.flywheel.impl.visualization.ratelimit.NonLimiter;
|
||||||
import com.jozufozu.flywheel.lib.context.Contexts;
|
|
||||||
import com.jozufozu.flywheel.lib.task.Flag;
|
import com.jozufozu.flywheel.lib.task.Flag;
|
||||||
import com.jozufozu.flywheel.lib.task.IfElsePlan;
|
import com.jozufozu.flywheel.lib.task.IfElsePlan;
|
||||||
import com.jozufozu.flywheel.lib.task.MapContextPlan;
|
import com.jozufozu.flywheel.lib.task.MapContextPlan;
|
||||||
|
@ -85,9 +84,9 @@ public class VisualizationManagerImpl implements VisualizationManager {
|
||||||
.createEngine(level);
|
.createEngine(level);
|
||||||
taskExecutor = FlwTaskExecutor.get();
|
taskExecutor = FlwTaskExecutor.get();
|
||||||
|
|
||||||
var blockEntitiesStorage = new BlockEntityStorage(new InstancerProviderImpl(engine, Contexts.DEFAULT, RenderStage.AFTER_BLOCK_ENTITIES));
|
var blockEntitiesStorage = new BlockEntityStorage(new InstancerProviderImpl(engine, RenderStage.AFTER_BLOCK_ENTITIES));
|
||||||
var entitiesStorage = new EntityStorage(new InstancerProviderImpl(engine, Contexts.DEFAULT, RenderStage.AFTER_ENTITIES));
|
var entitiesStorage = new EntityStorage(new InstancerProviderImpl(engine, RenderStage.AFTER_ENTITIES));
|
||||||
var effectsStorage = new EffectStorage(new InstancerProviderImpl(engine, Contexts.DEFAULT, RenderStage.AFTER_PARTICLES));
|
var effectsStorage = new EffectStorage(new InstancerProviderImpl(engine, RenderStage.AFTER_PARTICLES));
|
||||||
|
|
||||||
blockEntities = new VisualManagerImpl<>(blockEntitiesStorage);
|
blockEntities = new VisualManagerImpl<>(blockEntitiesStorage);
|
||||||
entities = new VisualManagerImpl<>(entitiesStorage);
|
entities = new VisualManagerImpl<>(entitiesStorage);
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
package com.jozufozu.flywheel.lib.context;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.ApiStatus;
|
|
||||||
|
|
||||||
import com.jozufozu.flywheel.Flywheel;
|
|
||||||
import com.jozufozu.flywheel.api.context.ContextShader;
|
|
||||||
|
|
||||||
public class ContextShaders {
|
|
||||||
public static final SimpleContextShader DEFAULT = ContextShader.REGISTRY.registerAndGet(new SimpleContextShader(Flywheel.rl("context/default.vert"), Flywheel.rl("context/default.frag")));
|
|
||||||
public static final SimpleContextShader CRUMBLING = ContextShader.REGISTRY.registerAndGet(new SimpleContextShader(Flywheel.rl("context/crumbling.vert"), Flywheel.rl("context/crumbling.frag")));
|
|
||||||
|
|
||||||
private ContextShaders() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiStatus.Internal
|
|
||||||
public static void init() {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
package com.jozufozu.flywheel.lib.context;
|
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.context.Context;
|
|
||||||
|
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
|
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
|
|
||||||
import net.minecraft.client.resources.model.ModelBakery;
|
|
||||||
|
|
||||||
public final class Contexts {
|
|
||||||
public static final Context DEFAULT = SimpleContext.builder(ContextShaders.DEFAULT)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
public static final Int2ObjectMap<Context> CRUMBLING;
|
|
||||||
|
|
||||||
static {
|
|
||||||
var map = new Int2ObjectArrayMap<Context>();
|
|
||||||
|
|
||||||
for (int i = 0; i < ModelBakery.BREAKING_LOCATIONS.size(); i++) {
|
|
||||||
var crumblingLocation = ModelBakery.BREAKING_LOCATIONS.get(i);
|
|
||||||
map.put(i, SimpleContext.builder(ContextShaders.CRUMBLING)
|
|
||||||
.preparation((material, shader, textureSource) -> {
|
|
||||||
shader.setTexture("crumblingTex", textureSource.byName(crumblingLocation));
|
|
||||||
})
|
|
||||||
.build());
|
|
||||||
}
|
|
||||||
|
|
||||||
CRUMBLING = Int2ObjectMaps.unmodifiable(map);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Contexts() {
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,14 +1,5 @@
|
||||||
|
#include "flywheel:util/matrix.glsl"
|
||||||
|
|
||||||
void flw_transformBoundingSphere(in FlwInstance i, inout vec3 center, inout float radius) {
|
void flw_transformBoundingSphere(in FlwInstance i, inout vec3 center, inout float radius) {
|
||||||
mat4 pose = i.pose;
|
transformBoundingSphere(i.pose, center, radius);
|
||||||
center = (pose * vec4(center, 1.0)).xyz;
|
|
||||||
|
|
||||||
vec3 c0 = pose[0].xyz;
|
|
||||||
vec3 c1 = pose[1].xyz;
|
|
||||||
vec3 c2 = pose[2].xyz;
|
|
||||||
|
|
||||||
// Comute the squared maximum to avoid 2 unnecessary sqrts.
|
|
||||||
// I don't think this makes it any faster but why not /shrug
|
|
||||||
float scaleSqr = max(dot(c0, c0), max(dot(c1, c1), dot(c2, c2)));
|
|
||||||
float scale = sqrt(scaleSqr);
|
|
||||||
radius *= scale;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
uniform sampler3D _flw_lightVolume;
|
||||||
|
|
||||||
|
in vec3 _flw_lightVolumeCoord;
|
||||||
|
|
||||||
|
void flw_beginFragment() {
|
||||||
|
flw_fragLight = max(flw_fragLight, texture(_flw_lightVolume, _flw_lightVolumeCoord).rg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flw_endFragment() {
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
uniform vec3 _flw_oneOverLightBoxSize;
|
||||||
|
uniform vec3 _flw_lightVolumeMin;
|
||||||
|
uniform mat4 _flw_model;
|
||||||
|
uniform mat3 _flw_normal;
|
||||||
|
|
||||||
|
out vec3 _flw_lightVolumeCoord;
|
||||||
|
|
||||||
|
void flw_beginVertex() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void flw_endVertex() {
|
||||||
|
_flw_lightVolumeCoord = (flw_vertexPos.xyz - _flw_lightVolumeMin) * _flw_oneOverLightBoxSize;
|
||||||
|
|
||||||
|
flw_vertexPos = _flw_model * flw_vertexPos;
|
||||||
|
flw_vertexNormal = _flw_normal * flw_vertexNormal;
|
||||||
|
}
|
|
@ -2,6 +2,7 @@
|
||||||
#include "flywheel:internal/indirect/model_descriptor.glsl"
|
#include "flywheel:internal/indirect/model_descriptor.glsl"
|
||||||
#include "flywheel:internal/indirect/object.glsl"
|
#include "flywheel:internal/indirect/object.glsl"
|
||||||
#include "flywheel:internal/uniforms/frame.glsl"
|
#include "flywheel:internal/uniforms/frame.glsl"
|
||||||
|
#include "flywheel:util/matrix.glsl"
|
||||||
|
|
||||||
layout(local_size_x = _FLW_SUBGROUP_SIZE) in;
|
layout(local_size_x = _FLW_SUBGROUP_SIZE) in;
|
||||||
|
|
||||||
|
@ -17,6 +18,9 @@ layout(std430, binding = _FLW_MODEL_BUFFER_BINDING) restrict buffer ModelBuffer
|
||||||
ModelDescriptor models[];
|
ModelDescriptor models[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
uniform mat4 _flw_embeddedModel;
|
||||||
|
uniform bool _flw_useEmbeddedModel = false;
|
||||||
|
|
||||||
// Disgustingly vectorized sphere frustum intersection taking advantage of ahead of time packing.
|
// Disgustingly vectorized sphere frustum intersection taking advantage of ahead of time packing.
|
||||||
// Only uses 6 fmas and some boolean ops.
|
// Only uses 6 fmas and some boolean ops.
|
||||||
// See also:
|
// See also:
|
||||||
|
@ -41,6 +45,10 @@ bool _flw_isVisible(uint objectIndex, uint modelIndex) {
|
||||||
|
|
||||||
flw_transformBoundingSphere(instance, center, radius);
|
flw_transformBoundingSphere(instance, center, radius);
|
||||||
|
|
||||||
|
if (_flw_useEmbeddedModel) {
|
||||||
|
transformBoundingSphere(_flw_embeddedModel, center, radius);
|
||||||
|
}
|
||||||
|
|
||||||
return _flw_testSphere(center, radius);
|
return _flw_testSphere(center, radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,3 +41,17 @@ mat3 modelToNormal(mat4 mat) {
|
||||||
m[2] = mat[2].xyz;
|
m[2] = mat[2].xyz;
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void transformBoundingSphere(in mat4 mat, inout vec3 center, inout float radius) {
|
||||||
|
center = (mat * vec4(center, 1.)).xyz;
|
||||||
|
|
||||||
|
vec3 c0 = mat[0].xyz;
|
||||||
|
vec3 c1 = mat[1].xyz;
|
||||||
|
vec3 c2 = mat[2].xyz;
|
||||||
|
|
||||||
|
// Comute the squared maximum to avoid 2 unnecessary sqrts.
|
||||||
|
// I don't think this makes it any faster but why not /shrug
|
||||||
|
float scaleSqr = max(dot(c0, c0), max(dot(c1, c1), dot(c2, c2)));
|
||||||
|
float scale = sqrt(scaleSqr);
|
||||||
|
radius *= scale;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue