Привет, есть цель создать блок с многослойной текстурой, а именно
Все вышеописанное удалось реализовать, но возникла проблема в том, что кусок текстуры соседнего блока файтиться с текстурой самого блока и текстурой креста (см. картинку) (однако сам крест с текстурой самого блока ведет себя нормально несмотря на то, что текстура креста проходит кастомную загрузку).
Можно ли это как-нибудь исправить? Как мне кажется проблема не в текстуре, а в кваде, который я генерирую.

Код getQuads
Код putVertex (взято с форума)
- layer 1: текстура самого блока (желтая)
- layer 2: кусок текстуры соседнего блока (со стороны прилегания)
- layer 3: Шов (крест)
Все вышеописанное удалось реализовать, но возникла проблема в том, что кусок текстуры соседнего блока файтиться с текстурой самого блока и текстурой креста (см. картинку) (однако сам крест с текстурой самого блока ведет себя нормально несмотря на то, что текстура креста проходит кастомную загрузку).
Можно ли это как-нибудь исправить? Как мне кажется проблема не в текстуре, а в кваде, который я генерирую.

Код getQuads
getQuads:
public List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) {
List<BakedQuad> bakedQuads = new ArrayList<>();
if (state instanceof IExtendedBlockState && side != null) {
IExtendedBlockState blockState = (IExtendedBlockState) state;
ExchangeValue value = blockState.getValue(FramePanelBlock.EXCHANGE);
List<BakedQuad> baseQuads = this.base.getQuads(state, side, rand);
bakedQuads.add(baseQuads.get(0)); // добавляем квад с текстурой самого блока
if (!EnumFacing.UP.equals(side) && !EnumFacing.DOWN.equals(side)) {
this.getOverlayQuads(bakedQuads, side, (FramePanelType[]) value.getValue(side.getName())); // добавляем квад с текстурой соседнего блока
if (baseQuads.size() > 1) {
bakedQuads.add(baseQuads.get(1)); // добавляем квад с текстурой шва
}
}
}
return bakedQuads;
}
private void getOverlayQuads(List<BakedQuad> bakedQuads, EnumFacing side, FramePanelType[] overlays) {
for (int i = 0; i < overlays.length; i++) {
if (overlays[i] != null) {
BakedQuad quad = this.createBakedQuad(side, overlays[i], i);
if (quad != null) {
bakedQuads.add(quad);
}
}
}
}
private BakedQuad createBakedQuad(EnumFacing side, FramePanelType panelType, int overlayType) {
OverlayElement element = OverlayService.getOverlayElement(panelType, overlayType);
if (element != null) {
UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(this.format);
builder.setQuadOrientation(side);
builder.setTexture(this.getParticleTexture()); // текстура-заглушка самого блока
Vec3d[] vertex = element.getRawQuad(side);
for (int i = 0; i < vertex.length; i++) { // создание квада на основе кадрированной текстуры соседнего блока
ModelUtil.putVertex(builder, this.format, Optional.empty(), side,
(float) vertex[i].x * 0.0625f, (float) vertex[i].y * 0.0625f, (float) vertex[i].z * 0.0625f,
element.getTextureU(i), element.getTextureV(i), 1.0f, 1.0f, 1.0f, 1.0f);
}
return builder.build();
}
return null;
}
Код putVertex (взято с форума)
putVertex:
public static void putVertex(UnpackedBakedQuad.Builder builder, VertexFormat format, Optional<TRSRTransformation> transform, EnumFacing side, float x, float y, float z, float u, float v, float r, float g, float b, float a) {
Vector4f vec = new Vector4f();
for (int e = 0; e < format.getElementCount(); e++) {
switch (format.getElement(e).getUsage()) {
case POSITION:
if (transform.isPresent()) {
vec.x = x;
vec.y = y;
vec.z = z;
vec.w = 1;
transform.get().getMatrix().transform(vec);
builder.put(e, vec.x, vec.y, vec.z, vec.w);
} else {
builder.put(e, x, y, z, 1);
}
break;
case COLOR:
builder.put(e, r, g, b, a);
break;
case UV:
if(u != -1 && v != -1) {
if (format.getElement(e).getIndex() == 0) {
builder.put(e, u, v, 0f, 1f);
break;
}
}
case NORMAL:
builder.put(e, (float) side.getFrontOffsetX(), (float) side.getFrontOffsetY(), (float) side.getFrontOffsetZ(), 0f);
break;
default:
builder.put(e);
break;
}
}
}
Последнее редактирование: