mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-12-15 23:43:43 +01:00
pulleys are lit
stabilized things are sort of lit but man is it jank light volumes have a more sane constructor try to mess around with contraption layering but it's still jank
This commit is contained in:
parent
9df796029f
commit
33e66c6e89
12 changed files with 196 additions and 21 deletions
|
@ -190,7 +190,7 @@ public abstract class Contraption {
|
||||||
// Create subcontraptions
|
// Create subcontraptions
|
||||||
for (BlockFace blockFace : pendingSubContraptions) {
|
for (BlockFace blockFace : pendingSubContraptions) {
|
||||||
Direction face = blockFace.getFace();
|
Direction face = blockFace.getFace();
|
||||||
StabilizedContraption subContraption = new StabilizedContraption(this, face);
|
StabilizedContraption subContraption = new StabilizedContraption(entity.getUniqueID(), face);
|
||||||
World world = entity.world;
|
World world = entity.world;
|
||||||
BlockPos pos = blockFace.getPos();
|
BlockPos pos = blockFace.getPos();
|
||||||
if (!subContraption.assemble(world, pos))
|
if (!subContraption.assemble(world, pos))
|
||||||
|
|
|
@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be
|
||||||
|
|
||||||
import com.simibubi.create.foundation.render.light.ContraptionLighter;
|
import com.simibubi.create.foundation.render.light.ContraptionLighter;
|
||||||
import com.simibubi.create.foundation.render.light.GridAlignedBB;
|
import com.simibubi.create.foundation.render.light.GridAlignedBB;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
|
||||||
|
|
||||||
public class BearingLighter extends ContraptionLighter<BearingContraption> {
|
public class BearingLighter extends ContraptionLighter<BearingContraption> {
|
||||||
|
|
||||||
|
|
|
@ -1,24 +1,31 @@
|
||||||
package com.simibubi.create.content.contraptions.components.structureMovement.bearing;
|
package com.simibubi.create.content.contraptions.components.structureMovement.bearing;
|
||||||
|
|
||||||
|
import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity;
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes;
|
import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes;
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
|
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
|
||||||
|
|
||||||
|
import com.simibubi.create.foundation.render.light.ContraptionLighter;
|
||||||
|
import com.simibubi.create.foundation.utility.NBTHelper;
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.Direction.Axis;
|
import net.minecraft.util.Direction.Axis;
|
||||||
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
public class StabilizedContraption extends Contraption {
|
public class StabilizedContraption extends Contraption {
|
||||||
|
|
||||||
public Contraption parent;
|
public UUID parentID;
|
||||||
|
|
||||||
private Direction facing;
|
private Direction facing;
|
||||||
|
|
||||||
public StabilizedContraption() {}
|
public StabilizedContraption() {}
|
||||||
|
|
||||||
public StabilizedContraption(Contraption parent, Direction facing) {
|
public StabilizedContraption(UUID parentID, Direction facing) {
|
||||||
this.parent = parent;
|
this.parentID = parentID;
|
||||||
this.facing = facing;
|
this.facing = facing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +40,7 @@ public class StabilizedContraption extends Contraption {
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isAnchoringBlockAt(BlockPos pos) {
|
protected boolean isAnchoringBlockAt(BlockPos pos) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -48,12 +55,14 @@ public class StabilizedContraption extends Contraption {
|
||||||
public CompoundNBT writeNBT(boolean spawnPacket) {
|
public CompoundNBT writeNBT(boolean spawnPacket) {
|
||||||
CompoundNBT tag = super.writeNBT(spawnPacket);
|
CompoundNBT tag = super.writeNBT(spawnPacket);
|
||||||
tag.putInt("Facing", facing.getIndex());
|
tag.putInt("Facing", facing.getIndex());
|
||||||
|
tag.putUniqueId("Parent", parentID);
|
||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void readNBT(World world, CompoundNBT tag, boolean spawnData) {
|
public void readNBT(World world, CompoundNBT tag, boolean spawnData) {
|
||||||
facing = Direction.byIndex(tag.getInt("Facing"));
|
facing = Direction.byIndex(tag.getInt("Facing"));
|
||||||
|
parentID = tag.getUniqueId("Parent");
|
||||||
super.readNBT(world, tag, spawnData);
|
super.readNBT(world, tag, spawnData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,4 +75,8 @@ public class StabilizedContraption extends Contraption {
|
||||||
return facing;
|
return facing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ContraptionLighter<?> makeLighter() {
|
||||||
|
return new StabilizedLighter(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
package com.simibubi.create.content.contraptions.components.structureMovement.bearing;
|
||||||
|
|
||||||
|
import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity;
|
||||||
|
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
|
||||||
|
import com.simibubi.create.foundation.render.light.ContraptionLighter;
|
||||||
|
import com.simibubi.create.foundation.render.light.GridAlignedBB;
|
||||||
|
import net.minecraft.client.world.ClientWorld;
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.util.math.Vec3i;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class StabilizedLighter extends ContraptionLighter<StabilizedContraption> {
|
||||||
|
public StabilizedLighter(StabilizedContraption contraption) {
|
||||||
|
super(contraption);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GridAlignedBB getContraptionBounds() {
|
||||||
|
GridAlignedBB bb = GridAlignedBB.fromAABB(contraption.bounds);
|
||||||
|
|
||||||
|
// TODO: this whole thing is a hack and is not generalizable
|
||||||
|
Iterable<Entity> allEntities = ((ClientWorld) contraption.entity.world).getAllEntities();
|
||||||
|
|
||||||
|
for (Entity entity : allEntities) {
|
||||||
|
|
||||||
|
if (entity.getUniqueID() == contraption.parentID && entity instanceof AbstractContraptionEntity) {
|
||||||
|
Contraption mountedOn = ((AbstractContraptionEntity) entity).getContraption();
|
||||||
|
|
||||||
|
GridAlignedBB mountedBounds = GridAlignedBB.fromAABB(mountedOn.bounds);
|
||||||
|
|
||||||
|
Vec3i dir = contraption.getFacing().getDirectionVec();
|
||||||
|
|
||||||
|
int mulX = 1 - Math.abs(dir.getX());
|
||||||
|
int mulY = 1 - Math.abs(dir.getY());
|
||||||
|
int mulZ = 1 - Math.abs(dir.getZ());
|
||||||
|
|
||||||
|
bb.minX -= mulX * mountedBounds.sizeX();
|
||||||
|
bb.minY -= mulY * mountedBounds.sizeY();
|
||||||
|
bb.minZ -= mulZ * mountedBounds.sizeZ();
|
||||||
|
bb.maxX += mulX * mountedBounds.sizeX();
|
||||||
|
bb.maxY += mulY * mountedBounds.sizeY();
|
||||||
|
bb.maxZ += mulZ * mountedBounds.sizeZ();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bb.translate(contraption.anchor);
|
||||||
|
|
||||||
|
return bb;
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.pu
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes;
|
import com.simibubi.create.content.contraptions.components.structureMovement.AllContraptionTypes;
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption;
|
import com.simibubi.create.content.contraptions.components.structureMovement.TranslatingContraption;
|
||||||
|
|
||||||
|
import com.simibubi.create.foundation.render.light.ContraptionLighter;
|
||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
@ -53,4 +54,8 @@ public class PulleyContraption extends TranslatingContraption {
|
||||||
super.readNBT(world, nbt, spawnData);
|
super.readNBT(world, nbt, spawnData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ContraptionLighter<?> makeLighter() {
|
||||||
|
return new PulleyLighter(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.simibubi.create.content.contraptions.components.structureMovement.pulley;
|
||||||
|
|
||||||
|
import com.simibubi.create.AllBlocks;
|
||||||
|
import com.simibubi.create.foundation.render.light.ContraptionLighter;
|
||||||
|
import com.simibubi.create.foundation.render.light.GridAlignedBB;
|
||||||
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
public class PulleyLighter extends ContraptionLighter<PulleyContraption> {
|
||||||
|
public PulleyLighter(PulleyContraption contraption) {
|
||||||
|
super(contraption);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GridAlignedBB getContraptionBounds() {
|
||||||
|
|
||||||
|
GridAlignedBB bounds = GridAlignedBB.fromAABB(contraption.bounds);
|
||||||
|
|
||||||
|
World world = contraption.entity.world;
|
||||||
|
|
||||||
|
BlockPos.Mutable pos = new BlockPos.Mutable(contraption.anchor);
|
||||||
|
while (!AllBlocks.ROPE_PULLEY.has(world.getBlockState(pos)) && pos.getY() < 256) {
|
||||||
|
pos.move(0, 1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bounds.translate(pos);
|
||||||
|
bounds.minY = 1; // the super constructor will take care of making this 0
|
||||||
|
|
||||||
|
return bounds;
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,7 +20,7 @@ public class RenderInLayerMixin {
|
||||||
* layer-correct custom rendering. RenderWorldLast is not refined enough for rendering world objects.
|
* layer-correct custom rendering. RenderWorldLast is not refined enough for rendering world objects.
|
||||||
* This should probably be a forge event.
|
* This should probably be a forge event.
|
||||||
*/
|
*/
|
||||||
@Inject(at = @At("HEAD"), method = "renderLayer")
|
@Inject(at = @At("TAIL"), method = "renderLayer")
|
||||||
private void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) {
|
private void renderLayer(RenderType type, MatrixStack stack, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) {
|
||||||
FastRenderDispatcher.renderLayer(type, stack, cameraX, cameraY, cameraZ);
|
FastRenderDispatcher.renderLayer(type, stack, cameraX, cameraY, cameraZ);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.simibubi.create.foundation.render;
|
package com.simibubi.create.foundation.render;
|
||||||
|
|
||||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
|
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
|
||||||
import com.simibubi.create.foundation.render.light.LightVolume;
|
import com.simibubi.create.foundation.render.light.LightVolume;
|
||||||
import com.simibubi.create.foundation.render.shader.Shader;
|
import com.simibubi.create.foundation.render.shader.Shader;
|
||||||
|
@ -14,9 +15,7 @@ import net.minecraft.util.math.SectionPos;
|
||||||
import net.minecraft.world.ILightReader;
|
import net.minecraft.world.ILightReader;
|
||||||
import net.minecraft.world.LightType;
|
import net.minecraft.world.LightType;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import org.lwjgl.opengl.GL11;
|
import org.lwjgl.opengl.*;
|
||||||
import org.lwjgl.opengl.GL13;
|
|
||||||
import org.lwjgl.opengl.GL40;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -53,6 +52,11 @@ public class ContraptionRenderDispatcher {
|
||||||
if (renderers.isEmpty()) return;
|
if (renderers.isEmpty()) return;
|
||||||
|
|
||||||
FastKineticRenderer.setup(Minecraft.getInstance().gameRenderer);
|
FastKineticRenderer.setup(Minecraft.getInstance().gameRenderer);
|
||||||
|
// if (renderType == RenderType.getTranslucent()) {
|
||||||
|
// GL30.glEnable(GL11.GL_DEPTH_TEST);
|
||||||
|
// GL20.glDepthFunc(GL20.GL_LESS);
|
||||||
|
// RenderSystem.defaultBlendFunc();
|
||||||
|
// }
|
||||||
GL11.glEnable(GL13.GL_TEXTURE_3D);
|
GL11.glEnable(GL13.GL_TEXTURE_3D);
|
||||||
GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4
|
GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4
|
||||||
|
|
||||||
|
@ -81,6 +85,10 @@ public class ContraptionRenderDispatcher {
|
||||||
|
|
||||||
ShaderHelper.releaseShader();
|
ShaderHelper.releaseShader();
|
||||||
|
|
||||||
|
// if (renderType == RenderType.getTranslucent()) {
|
||||||
|
// GL30.glEnable(GL11.GL_DEPTH_TEST);
|
||||||
|
// GL20.glDepthFunc(GL20.GL_LEQUAL);
|
||||||
|
// }
|
||||||
GL11.glDisable(GL13.GL_TEXTURE_3D);
|
GL11.glDisable(GL13.GL_TEXTURE_3D);
|
||||||
FastKineticRenderer.teardown();
|
FastKineticRenderer.teardown();
|
||||||
GL13.glActiveTexture(GL40.GL_TEXTURE0);
|
GL13.glActiveTexture(GL40.GL_TEXTURE0);
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.simibubi.create.foundation.render;
|
package com.simibubi.create.foundation.render;
|
||||||
|
|
||||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
import com.simibubi.create.CreateClient;
|
import com.simibubi.create.CreateClient;
|
||||||
import com.simibubi.create.foundation.render.instancing.IInstanceRendered;
|
import com.simibubi.create.foundation.render.instancing.IInstanceRendered;
|
||||||
import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer;
|
import com.simibubi.create.foundation.render.instancing.IInstancedTileEntityRenderer;
|
||||||
|
@ -22,6 +23,8 @@ import net.minecraft.util.math.SectionPos;
|
||||||
import net.minecraft.world.ILightReader;
|
import net.minecraft.world.ILightReader;
|
||||||
import net.minecraft.world.LightType;
|
import net.minecraft.world.LightType;
|
||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
|
import org.lwjgl.opengl.GL11;
|
||||||
|
import org.lwjgl.opengl.GL30;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ -40,7 +43,12 @@ public class FastRenderDispatcher {
|
||||||
Matrix4f projection = getProjectionMatrix();
|
Matrix4f projection = getProjectionMatrix();
|
||||||
|
|
||||||
if (type == FastKineticRenderer.getKineticRenderLayer()) {
|
if (type == FastKineticRenderer.getKineticRenderLayer()) {
|
||||||
|
RenderSystem.enableDepthTest();
|
||||||
|
RenderSystem.enableCull();
|
||||||
|
GL11.glCullFace(GL11.GL_BACK);
|
||||||
CreateClient.kineticRenderer.renderInstancesAsWorld(type, projection, view);
|
CreateClient.kineticRenderer.renderInstancesAsWorld(type, projection, view);
|
||||||
|
RenderSystem.disableCull();
|
||||||
|
//RenderSystem.disableDepthTest();
|
||||||
}
|
}
|
||||||
|
|
||||||
ContraptionRenderDispatcher.renderLayer(type, projection, view);
|
ContraptionRenderDispatcher.renderLayer(type, projection, view);
|
||||||
|
|
|
@ -15,11 +15,11 @@ public abstract class ContraptionLighter<C extends Contraption> {
|
||||||
this.contraption = contraption;
|
this.contraption = contraption;
|
||||||
|
|
||||||
GridAlignedBB bounds = getContraptionBounds();
|
GridAlignedBB bounds = getContraptionBounds();
|
||||||
bounds.grow(1); // so we have at least enough data on the edges to avoid artifacts
|
bounds.grow(1); // so we have at least enough data on the edges to avoid artifacts and have smooth lighting
|
||||||
GridAlignedBB importantArea = GridAlignedBB.copy(bounds);
|
bounds.minY = Math.max(bounds.minY, 0);
|
||||||
bounds.nextPowerOf2Centered();
|
bounds.maxY = Math.min(bounds.maxY, 255);
|
||||||
|
|
||||||
lightVolume = new LightVolume(bounds, importantArea);
|
lightVolume = new LightVolume(bounds);
|
||||||
|
|
||||||
lightVolume.initialize(contraption.entity.world);
|
lightVolume.initialize(contraption.entity.world);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
package com.simibubi.create.foundation.render.light;
|
package com.simibubi.create.foundation.render.light;
|
||||||
|
|
||||||
import com.simibubi.create.foundation.render.RenderMath;
|
import com.simibubi.create.foundation.render.RenderMath;
|
||||||
|
import com.simibubi.create.foundation.utility.VecHelper;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
import net.minecraft.util.math.SectionPos;
|
import net.minecraft.util.math.SectionPos;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.util.math.Vec3i;
|
import net.minecraft.util.math.Vec3i;
|
||||||
|
|
||||||
import static com.simibubi.create.foundation.render.RenderMath.isPowerOf2;
|
import static com.simibubi.create.foundation.render.RenderMath.isPowerOf2;
|
||||||
|
@ -99,6 +101,55 @@ public class GridAlignedBB {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void mirrorAbout(Direction.Axis axis) {
|
||||||
|
Vec3i axisVec = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getDirectionVec();
|
||||||
|
int flipX = axisVec.getX() - 1;
|
||||||
|
int flipY = axisVec.getY() - 1;
|
||||||
|
int flipZ = axisVec.getZ() - 1;
|
||||||
|
|
||||||
|
int maxX = this.maxX * flipX;
|
||||||
|
int maxY = this.maxY * flipY;
|
||||||
|
int maxZ = this.maxZ * flipZ;
|
||||||
|
this.maxX = this.minX * flipX;
|
||||||
|
this.maxY = this.minY * flipY;
|
||||||
|
this.maxZ = this.minZ * flipZ;
|
||||||
|
this.minX = maxX;
|
||||||
|
this.minY = maxY;
|
||||||
|
this.minZ = maxZ;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void expandAroundAxis(Direction.Axis axis) {
|
||||||
|
int maxXDiff = Math.max(this.maxX - 1, -this.minX);
|
||||||
|
int maxYDiff = Math.max(this.maxY - 1, -this.minY);
|
||||||
|
int maxZDiff = Math.max(this.maxZ - 1, -this.minZ);
|
||||||
|
|
||||||
|
int maxDiff;
|
||||||
|
if (axis == Direction.Axis.X)
|
||||||
|
maxDiff = Math.max(maxZDiff, maxYDiff);
|
||||||
|
else if (axis == Direction.Axis.Y)
|
||||||
|
maxDiff = Math.max(maxZDiff, maxXDiff);
|
||||||
|
else if (axis == Direction.Axis.Z)
|
||||||
|
maxDiff = Math.max(maxXDiff, maxYDiff);
|
||||||
|
else
|
||||||
|
maxDiff = 0;
|
||||||
|
|
||||||
|
Vec3i axisVec = Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getDirectionVec();
|
||||||
|
int axisX = axisVec.getX();
|
||||||
|
int axisY = axisVec.getY();
|
||||||
|
int axisZ = axisVec.getZ();
|
||||||
|
|
||||||
|
int planeX = 1 - axisX;
|
||||||
|
int planeY = 1 - axisY;
|
||||||
|
int planeZ = 1 - axisZ;
|
||||||
|
|
||||||
|
minX = axisX * minX - maxDiff * planeX;
|
||||||
|
minY = axisY * minY - maxDiff * planeY;
|
||||||
|
minZ = axisZ * minZ - maxDiff * planeZ;
|
||||||
|
maxX = axisX * maxX + (maxDiff + 1) * planeX;
|
||||||
|
maxY = axisY * maxY + (maxDiff + 1) * planeY;
|
||||||
|
maxZ = axisZ * maxZ + (maxDiff + 1) * planeZ;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Grow this bounding box to have power of 2 side length, scaling from the center.
|
* Grow this bounding box to have power of 2 side length, scaling from the center.
|
||||||
*/
|
*/
|
||||||
|
@ -192,6 +243,15 @@ public class GridAlignedBB {
|
||||||
this.maxZ = Math.max(this.maxZ, other.maxZ);
|
this.maxZ = Math.max(this.maxZ, other.maxZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void unionAssign(AxisAlignedBB other) {
|
||||||
|
this.minX = Math.min(this.minX, (int) Math.floor(other.minX));
|
||||||
|
this.minY = Math.min(this.minY, (int) Math.floor(other.minY));
|
||||||
|
this.minZ = Math.min(this.minZ, (int) Math.floor(other.minZ));
|
||||||
|
this.maxX = Math.max(this.maxX, (int) Math.ceil(other.maxX));
|
||||||
|
this.maxY = Math.max(this.maxY, (int) Math.ceil(other.maxY));
|
||||||
|
this.maxZ = Math.max(this.maxZ, (int) Math.ceil(other.maxZ));
|
||||||
|
}
|
||||||
|
|
||||||
public boolean intersects(GridAlignedBB other) {
|
public boolean intersects(GridAlignedBB other) {
|
||||||
return this.intersects(other.minX, other.minY, other.minZ, other.maxX, other.maxY, other.maxZ);
|
return this.intersects(other.minX, other.minY, other.minZ, other.maxX, other.maxY, other.maxZ);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,13 +24,10 @@ public class LightVolume {
|
||||||
|
|
||||||
private int glTexture;
|
private int glTexture;
|
||||||
|
|
||||||
public LightVolume(GridAlignedBB textureVolume, GridAlignedBB sampleVolume) {
|
public LightVolume(GridAlignedBB sampleVolume) {
|
||||||
// the gpu requires that all textures have power of 2 side lengths
|
this.sampleVolume = GridAlignedBB.copy(sampleVolume);
|
||||||
if (!textureVolume.hasPowerOf2Sides())
|
sampleVolume.nextPowerOf2Centered();
|
||||||
throw new IllegalArgumentException("LightVolume must have power of 2 side lengths");
|
this.textureVolume = sampleVolume;
|
||||||
|
|
||||||
this.textureVolume = textureVolume;
|
|
||||||
this.sampleVolume = sampleVolume;
|
|
||||||
|
|
||||||
this.glTexture = GL11.glGenTextures();
|
this.glTexture = GL11.glGenTextures();
|
||||||
this.lightData = MemoryUtil.memAlloc(this.textureVolume.volume() * 2); // TODO: maybe figure out how to pack light coords into a single byte
|
this.lightData = MemoryUtil.memAlloc(this.textureVolume.volume() * 2); // TODO: maybe figure out how to pack light coords into a single byte
|
||||||
|
|
Loading…
Reference in a new issue