@Override protected @Nonnull BoundingBox getBounds() { return new BoundingBox(getPos()).expand(4, 1d, 4); } });
/** * Returns the vertices of the corners for the specified face in counter clockwise order. */ public @Nonnull List<Vertex> getCornersWithUvForFace(@Nonnull EnumFacing face) { return getCornersWithUvForFace(face, 0, 1, 0, 1); }
public @Nonnull BoundingBox createBoundsForConnectionController(@Nonnull EnumFacing dir, @Nonnull Offset offset) { Vector3d nonUniformScale = ForgeDirectionOffsets.forDirCopy(dir); nonUniformScale.scale(0.5); nonUniformScale.x = 0.8 * (1 - Math.abs(nonUniformScale.x)); nonUniformScale.y = 0.8 * (1 - Math.abs(nonUniformScale.y)); nonUniformScale.z = 0.8 * (1 - Math.abs(nonUniformScale.z)); BoundingBox bb = CORE_BOUNDS; bb = bb.scale(nonUniformScale.x, nonUniformScale.y, nonUniformScale.z); double offsetFromEnd = Math.min(bb.sizeX(), bb.sizeY()); offsetFromEnd = Math.min(offsetFromEnd, bb.sizeZ()); offsetFromEnd = Math.max(offsetFromEnd, 0.075); double transMag = 0.5 - (offsetFromEnd * 1.2); Vector3d trans = ForgeDirectionOffsets.forDirCopy(dir); trans.scale(transMag); bb = bb.translate(trans); bb = bb.translate(getTranslation(dir, offset)); return bb; }
BoundingBox bb = cube.expand(-xLen, -yLen, -zLen); float maxV = texture.getMaxV(); double sideScale = Math.max(bb.sizeX(), bb.sizeY()) * 2 / 16f; sideScale = Math.max(sideScale, bb.sizeZ() * 2 / 16f); double width = Math.min(bb.sizeX(), bb.sizeY()) * 15f / 16f; List<Vertex> corners = bb.getCornersWithUvForFace(dir, minU, maxU, minV, maxV); moveEdgeCorners(corners, vDir, width); moveEdgeCorners(corners, componentDirection.getOpposite(), sideScale); corners = bb.getCornersWithUvForFace(dir, minU, maxU, minV, maxV); moveEdgeCorners(corners, vDir.getOpposite(), width); moveEdgeCorners(corners, componentDirection.getOpposite(), sideScale); List<Vertex> corners = component.bound.getCornersWithUvForFace(component.getDirection(), tex2.getMinU(), tex2.getMaxU(), tex2.getMinV(), tex2.getMaxV()); List<Vertex> vertices = new ArrayList<>(); for (Vertex c : corners) {
public @Nonnull BoundingBox scale(double x, double y, double z) { double w = ((maxX - minX) * (1 - x)) / 2; double h = ((maxY - minY) * (1 - y)) / 2; double d = ((maxZ - minZ) * (1 - z)) / 2; return new BoundingBox(minX + w, minY + h, minZ + d, maxX - w, maxY - h, maxZ - d); }
private @Nonnull BoundingBox createConduitBounds(Class<? extends IConduit> type, EnumFacing dir, @Nonnull Offset offset) { BoundingBox bb = CORE_BOUNDS; Vector3d min = bb.getMin(); Vector3d max = bb.getMax(); min.add(trans); max.add(trans); bb = new BoundingBox(VecmathUtil.clamp(min, 0, 1), VecmathUtil.clamp(max, 0, 1)); return bb;
@Override protected void setVerticesForTransmission(@Nonnull BoundingBox bound, @Nonnull EnumFacing id) { float yScale = getRatioForConnection(id); float scale = 0.7f; float xs = id.getFrontOffsetX() == 0 ? scale : 1; float ys = id.getFrontOffsetY() == 0 ? Math.min(yScale, scale) : yScale; float zs = id.getFrontOffsetZ() == 0 ? scale : 1; double sizeY = bound.sizeY(); bound = bound.scale(xs, ys, zs); double transY = (bound.sizeY() - sizeY) / 2; Vector3d translation = new Vector3d(0, transY + 0.025, 0); setupVertices(bound.translate(translation)); }
dir = dir.getOpposite(); float trans = 0.0125f; minBB = minBB.translate(dir.getFrontOffsetX() * trans, dir.getFrontOffsetY() * trans, dir.getFrontOffsetZ() * trans); float scale = 0.7f; minBB = minBB.scale(1 + Math.abs(dir.getFrontOffsetX()) * scale, 1 + Math.abs(dir.getFrontOffsetY()) * scale, 1 + Math.abs(dir.getFrontOffsetZ()) * scale); } else { minBB = minBB.scale(1.09, 1.09, 1.09); minBB = new BoundingBox(0, 0, 0, 1, 1, 1); minBB = new BoundingBox(0, 0, 0, 1, 1, 1);
double zOff = componentDirection.getFrontOffsetZ() * offSize; bbb = component.bound.scale(xScale, yScale, zScale); bbb = bbb.translate(new Vector3d(xOff, yOff, zOff)); List<Vertex> corners = bbb.getCornersWithUvForFace(face, texture.getMinU(), texture.getMaxU(), texture.getMinV(), texture.getMaxV()); for (Vertex corner : corners) { data.add(new CachableRenderStatement.AddVertexWithUV(corner.x(), corner.y(), corner.z(), corner.uv.x, corner.uv.y, colorv));
public @Nonnull BoundingBox scale(double xyz) { return scale(xyz, xyz, xyz); }
BoundingBox bb = new BoundingBox(pos).setMaxY(pos.getY() + (level / 15d)); float minV1 = tex1.getMinV(); float maxV1 = tex1.getInterpolatedV(8); for (Vertex v : bb.getCornersWithUvForFace(EnumFacing.DOWN, minU1, maxU1, minV1, maxV1)) { worldRendererIn.pos(v.x(), v.y(), v.z()).color(0.5F, 0.5F, 0.5F, 1.0F).tex(v.u(), v.v()).lightmap(240, 240).endVertex(); for (Vertex v : bb.getCornersWithUvForFace(EnumFacing.UP, minU1, maxU1, minV1, maxV1)) { worldRendererIn.pos(v.x(), v.y(), v.z()).color(0.5F, 0.5F, 0.5F, 1.0F).tex(v.u(), v.v()).lightmap(240, 240).endVertex();
for (CollidableComponent innerCC : conduitsBounds) { if (!IPowerConduit.COLOR_CONTROLLER_ID.equals(innerCC.data) && !IPowerConduit.COLOR_CONTROLLER_ID.equals(conCC.data) && conCC != innerCC && conCC.bound.intersects(innerCC.bound)) { bb = cBB.bound; } else { bb = bb.expandBy(cBB.bound); bb = bb.scale(1.05, 1.05, 1.05); CollidableComponent cc = new CollidableComponent(null, bb, null, ConduitConnectorType.INTERNAL); cachedConnectors.add(cc); if (cores.size() > 1) { BoundingBox bb = cores.get(0).bound; double area = bb.getArea(); for (CollidableComponent cc : cores) { bb = bb.expandBy(cc.bound); if (bb.getArea() > area * 1.5f) { bb = bb.scale(1.05, 1.05, 1.05); CollidableComponent cc = new CollidableComponent(null, bb, null, ConduitConnectorType.INTERNAL); cachedConnectors.add(cc); CollidableComponent cc = cachedConnectors.get(i); if (cc.conduitType == null && cc.data == ConduitConnectorType.INTERNAL) { conBB = conBB == null ? cc.bound : conBB.expandBy(cc.bound); cachedConnectors.remove(i); i--;
protected void renderConduitDynamic(@Nonnull IConduitTexture tex, @Nonnull IClientConduit.WithDefaultRendering conduit, @Nonnull CollidableComponent component, float brightness) { GlStateManager.color(1, 1, 1); if (component.isDirectional() && component.data == null) { final EnumFacing componentDirection = component.getDirection(); float scaleFactor = 0.75f; float xLen = Math.abs(componentDirection.getFrontOffsetX()) == 1 ? 1 : scaleFactor; float yLen = Math.abs(componentDirection.getFrontOffsetY()) == 1 ? 1 : scaleFactor; float zLen = Math.abs(componentDirection.getFrontOffsetZ()) == 1 ? 1 : scaleFactor; BoundingBox cube = component.bound; BoundingBox bb = cube.scale(xLen, yLen, zLen); TextureAtlasSprite sprite = tex.getSprite(); drawDynamicSection(bb, sprite.getInterpolatedU(tex.getUv().x * 16), sprite.getInterpolatedU(tex.getUv().z * 16), sprite.getInterpolatedV(tex.getUv().y * 16), sprite.getInterpolatedV(tex.getUv().w * 16), componentDirection, false, conduit.shouldMirrorTexture()); if (conduit.getConnectionMode(componentDirection) == ConnectionMode.DISABLED) { TextureAtlasSprite tex2 = ConduitBundleRenderManager.instance.getConnectorIcon(component.data); List<Vertex> corners = component.bound.getCornersWithUvForFace(componentDirection, tex2.getMinU(), tex2.getMaxU(), tex2.getMinV(), tex2.getMaxV()); RenderUtil.addVerticesToTessellator(corners, DefaultVertexFormats.POSITION_TEX, false); } } else { // TODO: HL: I commented this out because component.getDirection() (the second to last parameter) is always null in // this else branch and drawDynamicSection() with isTransmission=true (last parameter) would NPE on it. (Not a // mistake in the component.dir encapsulation, this was that way before.) // drawDynamicSection(component.bound, tex.getMinU(), tex.getMaxU(), tex.getMinV(), tex.getMaxV(), dir, true); } }
@Override public void renderParticle(@Nonnull BufferBuilder worldRendererIn, @Nonnull Entity entityIn, float partialTicks, float rotationX, float rotationZ, float rotationYZ, float rotationXY, float rotationXZ) { if (particleAge < 0) { return; } GlStateManager.pushMatrix(); GlStateManager.enableLighting(); GlStateManager.disableLighting(); GlStateManager.disableCull(); GlStateManager.enableBlend(); GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240); RenderUtil.bindBlockTexture(); GlStateManager.depthMask(false); float scale = Math.min((particleAge + partialTicks) / INIT_TIME, 1); float fade = particleAge < FADE_TIME ? 1f : ((particleMaxAge - particleAge) / (float) (particleMaxAge - FADE_TIME)); GlStateManager.translate(-interpPosX, -interpPosY, -interpPosZ); GlStateManager.color(getRedColorF(), getGreenColorF(), getBlueColorF(), particleAlpha * fade); RenderUtil.renderBoundingBox((new BoundingBox(getBoundingBox())).scale(scale), IconUtil.instance.whiteTexture); GlStateManager.depthMask(true); GlStateManager.disableBlend(); GlStateManager.enableCull(); GlStateManager.enableLighting(); GlStateManager.popMatrix(); }
private void renderSelection() { if (selection == null) { return; } BoundingBox bb = new BoundingBox(selection.config.getLocation()); TextureAtlasSprite icon = selectedFaceIcon.get(TextureAtlasSprite.class); List<Vertex> corners = bb.getCornersWithUvForFace(selection.face, icon.getMinU(), icon.getMaxU(), icon.getMinV(), icon.getMaxV()); GlStateManager.disableDepth(); GlStateManager.disableLighting(); RenderUtil.bindBlockTexture(); BufferBuilder tes = Tessellator.getInstance().getBuffer(); GlStateManager.color(1, 1, 1); Vector3d trans = new Vector3d((-origin.x) + eye.x, (-origin.y) + eye.y, (-origin.z) + eye.z); tes.setTranslation(trans.x, trans.y, trans.z); RenderUtil.addVerticesToTessellator(corners, DefaultVertexFormats.POSITION_TEX, true); Tessellator.getInstance().draw(); tes.setTranslation(0, 0, 0); }
@Override public @Nonnull BoundingBox getBounds() { if (isSpawnMode) { if (bounds != null) { return bounds; } bounds = ISpawnerCallback.super.getBounds(); if (capturedMob != null) { Entity ent = capturedMob.getEntity(world, false); if (ent != null) { int height = Math.max((int) Math.ceil(ent.height) - 1, 0); return bounds = bounds.setMaxY(bounds.maxY + height); } } } return new BoundingBox(getPos()); }
@Override public boolean isInBounds(@Nonnull BlockPos pos) { return bb.contains(pos); }
if (component != null && (component == conBB || conBB == null || !conBB.bound.contains(component.bound))) { if (component.conduitType != null) { IClientConduit.WithDefaultRendering conduit = (IClientConduit.WithDefaultRendering) bundle.getConduit(component.conduitType); BakedQuadBuilder.addBakedQuads(quads, BoundingBox.UNIT_CUBE.scale(.10), ConduitBundleRenderManager.instance.getWireFrameIcon()); BakedQuadBuilder.addBakedQuads(quads, BoundingBox.UNIT_CUBE.scale(.15), ConduitBundleRenderManager.instance.getWireFrameIcon()); BakedQuadBuilder.addBakedQuads(quads, BoundingBox.UNIT_CUBE.scale(.20), ConduitBundleRenderManager.instance.getWireFrameIcon()); BakedQuadBuilder.addBakedQuads(quads, BoundingBox.UNIT_CUBE.scale(.25), ConduitBundleRenderManager.instance.getWireFrameIcon());
protected void addTransmissionQuads(@Nonnull IConduitTexture tex, Vector4f color, @Nonnull BlockRenderLayer layer, @Nonnull IConduit conduit, @Nonnull CollidableComponent component, float selfIllum, @Nonnull List<BakedQuad> quads) { if (layer != getTransmissionQuadsLayer()) { return; } float shrink = 1 / 32f; final EnumFacing componentDirection = component.getDirection(); float xLen = Math.abs(componentDirection.getFrontOffsetX()) == 1 ? 0 : shrink; float yLen = Math.abs(componentDirection.getFrontOffsetY()) == 1 ? 0 : shrink; float zLen = Math.abs(componentDirection.getFrontOffsetZ()) == 1 ? 0 : shrink; BoundingBox cube = component.bound; BoundingBox bb = cube.expand(-xLen, -yLen, -zLen); addQuadsForSection(bb, tex, componentDirection, quads, color); }