Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 37 additions & 6 deletions src/main/java/com/cleanroommc/modularui/test/ResizerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
import com.cleanroommc.modularui.screen.CustomModularScreen;
import com.cleanroommc.modularui.screen.ModularPanel;
import com.cleanroommc.modularui.screen.viewport.GuiContext;
import com.cleanroommc.modularui.utils.fakeworld.BlockInfo;
import com.cleanroommc.modularui.utils.fakeworld.BoxSchema;
import com.cleanroommc.modularui.utils.fakeworld.SchemaRenderer;
import com.cleanroommc.modularui.utils.fakeworld.*;

import com.cleanroommc.modularui.widgets.SchemaWidget;

import net.minecraft.client.Minecraft;
import net.minecraft.init.Blocks;
import net.minecraft.init.MobEffects;
import net.minecraft.potion.Potion;
import net.minecraft.tileentity.TileEntityBeacon;
import net.minecraft.util.math.BlockPos;

import org.jetbrains.annotations.NotNull;
Expand All @@ -29,7 +32,7 @@ public class ResizerTest extends CustomModularScreen {
world.addBlock(new BlockPos(0, 0, 0), new BlockInfo(Blocks.DIAMOND_BLOCK.getDefaultState()));
world.addBlock(new BlockPos(0, 1, 0), new BlockInfo(Blocks.BEDROCK.getDefaultState()));
world.addBlock(new BlockPos(1, 0, 1), new BlockInfo(Blocks.GOLD_BLOCK.getDefaultState()));*/
return ModularPanel.defaultPanel("main")
/* return ModularPanel.defaultPanel("main")
.size(150)
.overlay(new SchemaRenderer(BoxSchema.of(Minecraft.getMinecraft().world, new BlockPos(Minecraft.getMinecraft().player), 5))
.cameraFunc((camera, schema) -> {
Expand All @@ -39,6 +42,34 @@ public class ResizerTest extends CustomModularScreen {
camera.setLookAt(new BlockPos(Minecraft.getMinecraft().player), 20, yaw, pitch);
})
.isometric(true)
.asIcon().size(140));
.asIcon().size(140));*/

var plane = ModularPanel.defaultPanel("main").size(170);

SimpleSchema world = new SimpleSchema.Builder()
.add(new BlockPos(0, 0, 0), Blocks.DIAMOND_BLOCK.getDefaultState())
.add(new BlockPos(0, 1, 0), Blocks.BEDROCK.getDefaultState())
.add(new BlockPos(0, 2, 0), Blocks.WOOL.getDefaultState())
.add(new BlockPos(1, 0, 1), Blocks.GOLD_BLOCK.getDefaultState())
.add(new BlockPos(0, 3, 0), Blocks.BEACON.getDefaultState())
.build();

var schemaRenderer = new SchemaRenderer(world);
var layerUpDown = new SchemaWidget.LayerUpDown();
world.setRenderFilter(layerUpDown.makeSchemaFilter());
world.applyRenderFilter();

plane.child(layerUpDown.bottom(1).left(1).size(16));

var disableTESR = new SchemaWidget.DisableTESR().bottom(1).left(18).size(16);
schemaRenderer.disableTESR(disableTESR.makeSuppler());
plane.child(disableTESR);


var shnemaW = new SchemaWidget(schemaRenderer).size(120);
plane.child(shnemaW);

return plane;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,24 @@
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;

import java.util.function.BiPredicate;

public class BoxSchema extends PosListSchema {

public static BoxSchema of(World world, BlockPos center, int r) {
return new BoxSchema(world, center.add(-r, -r, -r), center.add(r, r, r));
return new BoxSchema(world, center.add(-r, -r, -r), center.add(r, r, r), (blockPos, blockInfo) -> true);
}

public static BoxSchema of(World world, BlockPos center, int r, BiPredicate<BlockPos, BlockInfo> renderFilter) {
return new BoxSchema(world, center.add(-r, -r, -r), center.add(r, r, r), renderFilter);
}

private final World world;
private final BlockPos min, max;
private final Vec3d center;

public BoxSchema(World world, BlockPos min, BlockPos max) {
super(world, BlockPosUtil.getAllInside(min, max, false));
public BoxSchema(World world, BlockPos min, BlockPos max, BiPredicate<BlockPos, BlockInfo> renderFilter) {
super(world, BlockPosUtil.getAllInside(min, max, false), renderFilter);
this.world = world;
this.min = BlockPosUtil.getMin(min, max);
this.max = BlockPosUtil.getMax(min, max);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.cleanroommc.modularui.utils.fakeworld;

import net.minecraft.util.math.BlockPos;

import org.jetbrains.annotations.NotNull;

import java.util.function.BiPredicate;

/**
* This schema gets filtered on insertion. <p>
* If the filter changes, it will not get applied to ealready set blocks
*/
public interface IFilteredSchema extends ISchema {

void setRenderFilter(@NotNull BiPredicate<BlockPos, BlockInfo> renderFilter);

@NotNull BiPredicate<BlockPos, BlockInfo> getRenderFilter();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.cleanroommc.modularui.utils.fakeworld;

import net.minecraft.util.math.BlockPos;

import org.jetbrains.annotations.Unmodifiable;

import java.util.Map;

/**
* This schema gets filtered on insertion. <p>
* If the filter changes, it will need to manually call {@link IMemorizingFilteredSchema#applyRenderFilter()}
*/
public interface IMemorizingFilteredSchema extends IFilteredSchema {

@Unmodifiable Map<BlockPos, BlockInfo> getOriginalSchema();
void applyRenderFilter();
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import org.apache.commons.lang3.tuple.Pair;

import java.util.Map;
import java.util.function.BiPredicate;
import java.util.function.Consumer;

public interface ISchema extends Iterable<Map.Entry<BlockPos, BlockInfo>> {

Expand All @@ -15,4 +17,5 @@ public interface ISchema extends Iterable<Map.Entry<BlockPos, BlockInfo>> {
Vec3d getFocus();

BlockPos getOrigin();

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,28 @@

import java.util.Iterator;
import java.util.Map;
import java.util.function.BiPredicate;

public abstract class PosListSchema implements ISchema {
public abstract class PosListSchema implements IFilteredSchema {

private final World world;
private final Iterable<? extends BlockPos> posList;
private BiPredicate<BlockPos, BlockInfo> renderFilter;

public PosListSchema(World world, Iterable<? extends BlockPos> posList) {
public PosListSchema(World world, Iterable<? extends BlockPos> posList, BiPredicate<BlockPos, BlockInfo> renderFilter) {
this.world = world;
this.posList = posList;
this.renderFilter = renderFilter;
}

@Override
public void setRenderFilter(@NotNull BiPredicate<BlockPos, BlockInfo> renderFilter) {
this.renderFilter = renderFilter;
}

@Override
public @NotNull BiPredicate<BlockPos, BlockInfo> getRenderFilter() {
return renderFilter;
}

@Override
Expand All @@ -42,7 +55,10 @@ public boolean hasNext() {
public Pair<BlockPos, BlockInfo> next() {
BlockPos pos = posIt.next();
pair.setLeft(pos);
pair.setRight(BlockInfo.Mut.SHARED.set(PosListSchema.this.world, pos));
BlockInfo.Mut.SHARED.set(PosListSchema.this.world, pos);
if (renderFilter.test(pos, BlockInfo.Mut.SHARED)) {
pair.setRight(BlockInfo.Mut.SHARED);
} else pair.setRight(BlockInfo.EMPTY);
return pair;
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,14 @@
import org.lwjgl.opengl.EXTFramebufferObject;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.GLU;
import org.lwjgl.util.vector.ReadableVector3f;
import org.lwjgl.util.vector.Vector3f;

import java.util.Objects;
import java.util.function.BiConsumer;
import java.util.function.BooleanSupplier;
import java.util.function.Consumer;
import java.util.function.DoubleSupplier;

public class SchemaRenderer implements IDrawable {

Expand All @@ -37,6 +41,8 @@ public class SchemaRenderer implements IDrawable {
private final Framebuffer framebuffer;
private final Camera camera = new Camera(new Vector3f(), new Vector3f());
private boolean cameraSetup = false;
private DoubleSupplier scale;
private BooleanSupplier disableTESR;
private Consumer<IRayTracer> onRayTrace;
private Consumer<Projection> afterRender;
private BiConsumer<Camera, ISchema> cameraFunc;
Expand Down Expand Up @@ -72,6 +78,24 @@ public SchemaRenderer isometric(boolean isometric) {
return this;
}

public SchemaRenderer scale(double scale) {
return scale(() -> scale);
}

public SchemaRenderer scale(DoubleSupplier scale) {
this.scale = scale;
return this;
}

public SchemaRenderer disableTESR(boolean disable) {
return disableTESR(() -> disable);
}

public SchemaRenderer disableTESR(BooleanSupplier disable) {
this.disableTESR = disable;
return this;
}

@Override
public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) {
render(x, y, width, height, context.getMouseX(), context.getMouseY());
Expand All @@ -81,6 +105,14 @@ public void render(int x, int y, int width, int height, int mouseX, int mouseY)
if (this.cameraFunc != null) {
this.cameraFunc.accept(this.camera, this.schema);
}
if (Objects.nonNull(scale)) {
Vector3f cameraPos = camera.getPos();
Vector3f looking = camera.getLookAt();
Vector3f.sub(cameraPos, looking, cameraPos);
if (cameraPos.length() != 0.0f) cameraPos.normalise();
cameraPos.scale((float) scale.getAsDouble());
Vector3f.add(looking, cameraPos, cameraPos);
}
int lastFbo = bindFBO();
setupCamera(this.framebuffer.framebufferWidth, this.framebuffer.framebufferHeight);
renderWorld();
Expand Down Expand Up @@ -159,18 +191,20 @@ private void renderWorld() {
GlStateManager.enableLighting();

// render TESR
for (int pass = 0; pass < 2; pass++) {
ForgeHooksClient.setRenderPass(pass);
int finalPass = pass;
GlStateManager.color(1, 1, 1, 1);
setDefaultPassRenderState(pass);
this.schema.forEach(pair -> {
BlockPos pos = pair.getKey();
TileEntity tile = pair.getValue().getTileEntity();
if (tile != null && tile.shouldRenderInPass(finalPass)) {
TileEntityRendererDispatcher.instance.render(tile, pos.getX(), pos.getY(), pos.getZ(), 0);
}
});
if (disableTESR == null || !disableTESR.getAsBoolean()) {
for (int pass = 0; pass < 2; pass++) {
ForgeHooksClient.setRenderPass(pass);
int finalPass = pass;
GlStateManager.color(1, 1, 1, 1);
setDefaultPassRenderState(pass);
this.schema.forEach(pair -> {
BlockPos pos = pair.getKey();
TileEntity tile = pair.getValue().getTileEntity();
if (tile != null && tile.shouldRenderInPass(finalPass)) {
TileEntityRendererDispatcher.instance.render(tile, pos.getX(), pos.getY(), pos.getZ(), 0);
}
});
}
}
ForgeHooksClient.setRenderPass(-1);
GlStateManager.enableDepth();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,42 @@

import java.util.Iterator;
import java.util.Map;
import java.util.function.BiPredicate;

public class SchemaWorld extends DummyWorld implements ISchema {
public class SchemaWorld extends DummyWorld implements IFilteredSchema {

private final ObjectLinkedOpenHashSet<BlockPos> blocks = new ObjectLinkedOpenHashSet<>();
private BiPredicate<BlockPos, BlockInfo> renderFilter;
private final BlockPos.MutableBlockPos min = new BlockPos.MutableBlockPos();
private final BlockPos.MutableBlockPos max = new BlockPos.MutableBlockPos();

public SchemaWorld() {
this((blockPos, blockInfo) -> true);
}

public SchemaWorld(BiPredicate<BlockPos, BlockInfo> renderFilter) {
this.renderFilter = renderFilter;
}

@Override
public void setRenderFilter(@NotNull BiPredicate<BlockPos, BlockInfo> renderFilter) {
this.renderFilter = renderFilter;
}

@Override
public @NotNull BiPredicate<BlockPos, BlockInfo> getRenderFilter() {
return renderFilter;
}

@Override
public boolean setBlockState(@NotNull BlockPos pos, @NotNull IBlockState newState, int flags) {
boolean b = super.setBlockState(pos, newState, flags);
boolean renderTest;
boolean state;
if (renderFilter.test(pos, BlockInfo.of(this, pos))) {
renderTest = true;
state = super.setBlockState(pos, newState, flags);
} else renderTest = state = false;

if (newState.getBlock().isAir(newState, this, pos)) {
if (this.blocks.remove(pos) && BlockPosUtil.isOnBorder(min, max, pos)) {
if (this.blocks.isEmpty()) {
Expand All @@ -37,14 +63,15 @@ public boolean setBlockState(@NotNull BlockPos pos, @NotNull IBlockState newStat
}
}
} else if (this.blocks.isEmpty()) {
if (!renderTest) return false;
this.blocks.add(pos);
this.min.setPos(pos);
this.max.setPos(pos);
} else if (this.blocks.add(pos)) {
} else if (renderTest && this.blocks.add(pos)) {
BlockPosUtil.setMin(this.min, pos);
BlockPosUtil.setMax(this.max, pos);
}
return b;
return renderTest && state;
}

@Override
Expand Down
Loading