Tessellator

Версия Minecraft
1.7.10
271
2
0
Как с помощью tessellator'a нарисовать текстуру?
 

timaxa007

Модератор
5,831
409
672
Код:
private static void voidRender(Tessellator tessellator, int w_min, int w_max, int h_min, int h_max, final ResourceLocation texture) {
	mc.getTextureManager().bindTexture(texture);
	tessellator.startDrawingQuads();
	tessellator.addVertexWithUV((double)w_min, (double)h_max, 0.0D, 0.0D, 1.0D);
	tessellator.addVertexWithUV((double)w_max, (double)h_max, 0.0D, 1.0D, 1.0D);
	tessellator.addVertexWithUV((double)w_max, (double)h_min, 0.0D, 1.0D, 0.0D);
	tessellator.addVertexWithUV((double)w_min, (double)h_min, 0.0D, 0.0D, 0.0D);
	tessellator.draw();
}
 

timaxa007

Модератор
5,831
409
672
Код:
public class EventWeaponsClient {
	//--------------------------------------------------------------------------------------------------------------
	private static final Minecraft mc = Minecraft.getMinecraft();
	//--------------------------------------------------------------------------------------------------------------
	@SubscribeEvent
	public void onRenderCrosshairs(RenderGameOverlayEvent.Pre e) {
		EntityClientPlayerMP player = UtilSMT.getPlayerClient();
		ItemStack current = player.getCurrentEquippedItem();

		if (current != null && current.getItem() instanceof IScope && current.getTagCompound() != null) {
			NBTTagCompound nbt = current.getTagCompound();
			if (e.type.equals(ElementType.CROSSHAIRS) && nbt.hasKey("Aim") && nbt.getBoolean("Aim")) {

				Tessellator tessellator = Tessellator.instance;

				int width = e.resolution.getScaledWidth();
				int height = e.resolution.getScaledHeight();

				GL11.glPushMatrix();
				GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
				GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

				int w_min = 0;
				int w_max = width;
				int h_min = 0;
				int h_max = height;

				if (width > height) {
					w_min = (width / 2) - (height /2);
					w_max = (width / 2) + (height /2);
					//-------------------------------------------------------------
					voidRender(tessellator, 0, w_min, h_min, h_max, new ResourceLocation("timaxa007", "textures/gui/scope/scope_blank_null.png"));
					voidRender(tessellator, w_max, width, h_min, h_max, new ResourceLocation("timaxa007", "textures/gui/scope/scope_blank_null.png"));
					//-------------------------------------------------------------
				} else if (height > width) {
					h_min = (height / 2) - (width /2);
					h_max = (height / 2) + (width /2);
					//-------------------------------------------------------------
					voidRender(tessellator, w_min, w_max, 0, h_min, new ResourceLocation("timaxa007", "textures/gui/scope/scope_blank_null.png"));
					voidRender(tessellator, w_min, w_max, h_max, height, new ResourceLocation("timaxa007", "textures/gui/scope/scope_blank_null.png"));
					//-------------------------------------------------------------
				}

				//-------------------------------------------------------------
				voidRender(tessellator, w_min, w_max, h_min, h_max, new ResourceLocation("timaxa007", "textures/gui/scope/scope_blank_11.png"));
				//-------------------------------------------------------------
				GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
				GL11.glPopMatrix();

				//mc.getTextureManager().bindTexture(resLoc);
				//mc.ingameGUI.drawTexturedModalRect(x, y, 0, 0, 32, 32); 

				e.setCanceled(true);
			}
		}
	}
	//--------------------------------------------------------------------------------------------------------------
	private static void voidRender(Tessellator tessellator, int w_min, int w_max, int h_min, int h_max, final ResourceLocation texture) {
		mc.getTextureManager().bindTexture(texture);
		tessellator.startDrawingQuads();
		tessellator.addVertexWithUV((double)w_min, (double)h_max, -90.0D, 0.0D, 1.0D);
		tessellator.addVertexWithUV((double)w_max, (double)h_max, -90.0D, 1.0D, 1.0D);
		tessellator.addVertexWithUV((double)w_max, (double)h_min, -90.0D, 1.0D, 0.0D);
		tessellator.addVertexWithUV((double)w_min, (double)h_min, -90.0D, 0.0D, 0.0D);
		tessellator.draw();
	}
	//--------------------------------------------------------------------------------------------------------------
}


Это старый пример (плохой), нового нет, но он работает.
 
271
2
0
timaxa007 я хочу зарендерить текстуру на блоке когда игрок смотрит на него(как при анимации ломании блока)
 

timaxa007

Модератор
5,831
409
672
Код:
//
bindTexture(texture);
Tessellator tessellator = Tessellator.instance;
boxWithUV(tessellator, 0D, 0D, 0D, 1D, 1D, 1D);
//

public static void boxWithUV(Tessellator tessellator, double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
	tessellator.startDrawingQuads();
	//Top
	tessellator.addVertexWithUV(maxX, maxY, minZ, maxX, minZ);
	tessellator.addVertexWithUV(minX, maxY, minZ, minX, minZ);
	tessellator.addVertexWithUV(minX, maxY, maxZ, minX, maxZ);
	tessellator.addVertexWithUV(maxX, maxY, maxZ, maxX, maxZ);
	//Bottom
	tessellator.addVertexWithUV(maxX, minY, maxZ, maxX, maxZ);
	tessellator.addVertexWithUV(minX, minY, maxZ, minX, maxZ);
	tessellator.addVertexWithUV(minX, minY, minZ, minX, minZ);
	tessellator.addVertexWithUV(maxX, minY, minZ, maxX, minZ);
	//North
	tessellator.addVertexWithUV(maxX, minY, minZ, minX, maxY);
	tessellator.addVertexWithUV(minX, minY, minZ, maxX, maxY);
	tessellator.addVertexWithUV(minX, maxY, minZ, maxX, minY);
	tessellator.addVertexWithUV(maxX, maxY, minZ, minX, minY);
	//South
	tessellator.addVertexWithUV(maxX, maxY, maxZ, maxX, minY);
	tessellator.addVertexWithUV(minX, maxY, maxZ, minX, minY);
	tessellator.addVertexWithUV(minX, minY, maxZ, minX, maxY);
	tessellator.addVertexWithUV(maxX, minY, maxZ, maxX, maxY);
	//West
	tessellator.addVertexWithUV(minX, maxY, maxZ, maxY, minZ);
	tessellator.addVertexWithUV(minX, maxY, minZ, minY, minZ);
	tessellator.addVertexWithUV(minX, minY, minZ, minY, maxZ);
	tessellator.addVertexWithUV(minX, minY, maxZ, maxY, maxZ);
	//East
	tessellator.addVertexWithUV(maxX, minY, maxZ, minY, maxZ);
	tessellator.addVertexWithUV(maxX, minY, minZ, maxY, maxZ);
	tessellator.addVertexWithUV(maxX, maxY, minZ, maxY, minZ);
	tessellator.addVertexWithUV(maxX, maxY, maxZ, minY, minZ);

	tessellator.draw();
}
 
271
2
0
GL11.glPushMatrix();
GL11.glTranslated(x_fix, y_fix, z_fix);
GL11.glEnable(GL11.GL_BLEND);
GL11.glDisable(GL11.GL_TEXTURE_2D);
//

mc.getTextureManager().bindTexture(new ResourceLocation("mod:textures/blocks/VoltBlock.png"));
Tessellator tessellator = Tessellator.instance;
boxWithUV(tessellator, aabb.maxX, aabb.maxY, aabb.maxZ, aabb.minX, aabb.minY, aabb.minZ);



//
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glDisable(GL11.GL_BLEND);
GL11.glPopMatrix();
рендерится белым
 
271
2
0
А как сделать чтоб рендерился только та сторона на которую смотрит игрок?
 

timaxa007

Модератор
5,831
409
672
Код:
static Minecraft mc = Minecraft.getMinecraft();
static Tessellator tessellator = Tessellator.instance;
static ResourceLocation texture = new ResourceLocation("modid", "textures/texture.png");

@SubscribeEvent
public void renderSide(DrawBlockHighlightEvent event) {
	if (event.target != null && event.target.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) {
		double x_fix = -(mc.thePlayer.lastTickPosX + (mc.thePlayer.posX - mc.thePlayer.lastTickPosX) * event.partialTicks);
		double y_fix = -(mc.thePlayer.lastTickPosY + (mc.thePlayer.posY - mc.thePlayer.lastTickPosY) * event.partialTicks);
		double z_fix = -(mc.thePlayer.lastTickPosZ + (mc.thePlayer.posZ - mc.thePlayer.lastTickPosZ) * event.partialTicks);
		GL11.glPushMatrix();
		GL11.glTranslated(
				(double)event.target.blockX + x_fix,
				(double)event.target.blockY + y_fix,
				(double)event.target.blockZ + z_fix
				);
		AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(
				0D - 0.005D,
				0D - 0.005D,
				0D - 0.005D,
				1D + 0.005D,
				1D + 0.005D,
				1D + 0.005D
				);
		double icon_minX = aabb.minX < 0D ? 0D : aabb.minX;
		double icon_minY = aabb.minY < 0D ? 0D : aabb.minY;
		double icon_minZ = aabb.minZ < 0D ? 0D : aabb.minZ;
		double icon_maxX = aabb.maxX > 1D ? 1D : aabb.maxX;
		double icon_maxY = aabb.maxY > 1D ? 1D : aabb.maxY;
		double icon_maxZ = aabb.maxZ > 1D ? 1D : aabb.maxZ;
		mc.getTextureManager().bindTexture(texture);
		tessellator.startDrawingQuads();
		switch(event.target.sideHit) {
		case 1:
			//Top
			tessellator.addVertexWithUV(aabb.maxX, aabb.maxY, aabb.minZ, icon_maxX, icon_minZ);
			tessellator.addVertexWithUV(aabb.minX, aabb.maxY, aabb.minZ, icon_minX, icon_minZ);
			tessellator.addVertexWithUV(aabb.minX, aabb.maxY, aabb.maxZ, icon_minX, icon_maxZ);
			tessellator.addVertexWithUV(aabb.maxX, aabb.maxY, aabb.maxZ, icon_maxX, icon_maxZ);
			break;
		case 0:
			//Bottom
			tessellator.addVertexWithUV(aabb.maxX, aabb.minY, aabb.maxZ, icon_maxX, icon_maxZ);
			tessellator.addVertexWithUV(aabb.minX, aabb.minY, aabb.maxZ, icon_minX, icon_maxZ);
			tessellator.addVertexWithUV(aabb.minX, aabb.minY, aabb.minZ, icon_minX, icon_minZ);
			tessellator.addVertexWithUV(aabb.maxX, aabb.minY, aabb.minZ, icon_maxX, icon_minZ);
			break;
		case 2:
			//North
			tessellator.addVertexWithUV(aabb.maxX, aabb.minY, aabb.minZ, icon_minX, icon_maxY);
			tessellator.addVertexWithUV(aabb.minX, aabb.minY, aabb.minZ, icon_maxX, icon_maxY);
			tessellator.addVertexWithUV(aabb.minX, aabb.maxY, aabb.minZ, icon_maxX, icon_minY);
			tessellator.addVertexWithUV(aabb.maxX, aabb.maxY, aabb.minZ, icon_minX, icon_minY);
			break;
		case 3:
			//South
			tessellator.addVertexWithUV(aabb.maxX, aabb.maxY, aabb.maxZ, icon_maxX, icon_minY);
			tessellator.addVertexWithUV(aabb.minX, aabb.maxY, aabb.maxZ, icon_minX, icon_minY);
			tessellator.addVertexWithUV(aabb.minX, aabb.minY, aabb.maxZ, icon_minX, icon_maxY);
			tessellator.addVertexWithUV(aabb.maxX, aabb.minY, aabb.maxZ, icon_maxX, icon_maxY);
			break;
		case 4:
			//West
			tessellator.addVertexWithUV(aabb.minX, aabb.maxY, aabb.maxZ, icon_maxY, icon_minZ);
			tessellator.addVertexWithUV(aabb.minX, aabb.maxY, aabb.minZ, icon_minY, icon_minZ);
			tessellator.addVertexWithUV(aabb.minX, aabb.minY, aabb.minZ, icon_minY, icon_maxZ);
			tessellator.addVertexWithUV(aabb.minX, aabb.minY, aabb.maxZ, icon_maxY, icon_maxZ);
			break;
		case 5:
			//East
			tessellator.addVertexWithUV(aabb.maxX, aabb.minY, aabb.maxZ, icon_minY, icon_maxZ);
			tessellator.addVertexWithUV(aabb.maxX, aabb.minY, aabb.minZ, icon_maxY, icon_maxZ);
			tessellator.addVertexWithUV(aabb.maxX, aabb.maxY, aabb.minZ, icon_maxY, icon_minZ);
			tessellator.addVertexWithUV(aabb.maxX, aabb.maxY, aabb.maxZ, icon_minY, icon_minZ);
			break;
		}
		tessellator.draw();
		GL11.glPopMatrix();
	}
}
 
271
2
0
timaxa007, вопрос не по теме,а как через ивен проверить нажал ли игрок правую/левею кнопку мыши держа айтем
 

timaxa007

Модератор
5,831
409
672
Левую или правую или атаковал или применяет это предмет? Что такое "ивен"? "Ивент" (/Евент/Эвент) что-ли?


Есть как-бы готовый эвент если на серверной стороне, а если на клиентской, можно проверять зажатость ПКМ/ЛКМ через OpenGL, либо по KeyBinding если нужно проверку атаки или использование предмета.


timaxa007 написал(а):
эвент если на серверной стороне
PlayerInteractEvent


org.lwjgl.input.Mouse.isButtonDown(0) - 0 это обычно ЛКМ, 1 - это ПКМ, 2 - это СКМ, а дальше значения в зависимости от настройки мышки.


Код:
import net.minecraft.client.settings.GameSettings;
Minecraft mc = Minecraft.getMinecraft();
Код:
if (GameSettings.isKeyDown(mc.gameSettings.keyBindAttack))
Код:
if (GameSettings.isKeyDown(mc.gameSettings.keyBindUseItem))
 
271
2
0
Я имею виду можно ли както так
if(mc.thePlayer.getCurrentEquippedItem().getItem().onItemUse() == true)..
 

timaxa007

Модератор
5,831
409
672
Если имеется виду про действие в один клик, то вроде нет. Если типа как лука натягивание тетивы, поедание еды или питься воды - то там вроде как можно это узнать.


Но вроде можно через эвент PlayerInteractEvent, что-то подобное проверять.
 

timaxa007

Модератор
5,831
409
672
Изменяя точки вершин у tessellator'а и координаты текстуры.
Код:
tessellator.addVertexWithUV(x, y, z, u, v);
x, y, z - координаты точки вершины в 3D пространстве.
u, v - координаты точки на текстуре (от 0 до 1 в double типе).
 
Сверху