Недавно задавал вопрос, о том, как сделать собственную фигуру при помощи BufferBuilder. Мне хоть и предлагали готовые решения, мне они всё равно не помогли. Не люблю чужой код. Вообщем, над проблемой я много работал. И не зря, результат есть. Forge рисуют треугольники как простой четырехугольник, у которого 3 вершины расположены на одной прямой. Но вопрос не в том.
Известно, что можно добавлять слои к частям тела игрока
Так вот, я решил расширить ModelRenderer, использовав мой класс, наследованный, собственно, от выше указанного:
Да, для тестирования пока использовал простые кубы, а не объемный параллелограмм, с целью удобства работы. Так вот, в итоге ничего не прорисовывается . Вот, кстати, сама модель, которую рисую на игроке:
Я не показываю свою необразованность и стремление показать то, как, не имея знаний в движке DirectX, пытаюсь его использовать. Это финальный шаг подготовительного этапа к разработке, не хочу потом над рендером больше работать
Известно, что можно добавлять слои к частям тела игрока
Minecraft.getMinecraft().getRenderManager().getSkinMap().get("slim").getMainModel().bipedRightArm.addChild(ModelRenderer model); //добавляет ведущей руке какую-то модель
Java:
public class newModelRenderer extends ModelRenderer {
private boolean compiled=false;
public int textureOffsetX,textureOffsetY;
public ModelBase baseModel;
public List<ModelBox> paralList=new ArrayList<>();
private int displayList;
public newModelRenderer(ModelBase model, String boxNameIn) {
super(model, boxNameIn);
this.baseModel=model;
}
public newModelRenderer(ModelBase model) {
super(model);
this.baseModel=model;
}
public newModelRenderer(ModelBase model, int texOffX, int texOffY) {
super(model, texOffX, texOffY);
this.textureOffsetX=texOffX;
this.textureOffsetY=texOffY;
this.baseModel=model;
}
public newModelRenderer addParal(String partName, float offX, float offY, float offZ, int width, int height, int depth,float deg)
{
TextureOffset textureoffset = this.baseModel.getTextureOffset(partName);
this.setTextureOffset(textureoffset.textureOffsetX, textureoffset.textureOffsetY);
this.paralList.add((new ModelBox(this, this.textureOffsetX, this.textureOffsetY, offX, offY, offZ, width, height, depth, 0.0F)).setBoxName(partName));
return this;
}
public newModelRenderer addParal(float offX, float offY, float offZ, int width, int height, int depth, float deg)
{
this.paralList.add(new ModelBox(this, this.textureOffsetX, this.textureOffsetY, offX, offY, offZ, width, height, depth, 0.0F));
return this;
}
public newModelRenderer addParal(float offX, float offY, float offZ, int width, int height, int depth, float deg, boolean mirrored)
{
this.paralList.add(new ModelBox(this, this.textureOffsetX, this.textureOffsetY, offX, offY, offZ, width, height, depth, 0.0F, mirrored));
return this;
}
public void addParal(float offX, float offY, float offZ, int width, int height, int depth, float deg, float scaleFactor)
{
this.paralList.add(new ModelBox(this, this.textureOffsetX, this.textureOffsetY, offX, offY, offZ, width, height, depth, scaleFactor));
}
@Override
@SideOnly(Side.CLIENT)
public void render(float scale)
{
super.render(scale);
if (!super.isHidden) {
if (super.showModel) {
if (!this.compiled) {
this.compileDisplayList(scale);
}
GlStateManager.translate(this.offsetX, this.offsetY, this.offsetZ);
}
}
}
@Override
@SideOnly(Side.CLIENT)
public void renderWithRotation(float scale)
{
super.renderWithRotation(scale);
if (!super.isHidden) {
if (super.showModel) {
if (!this.compiled) {
this.compileDisplayList(scale);
}
GlStateManager.pushMatrix();
GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale);
if (this.rotateAngleY != 0.0F)
{
GlStateManager.rotate(this.rotateAngleY * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F);
}
if (this.rotateAngleX != 0.0F)
{
GlStateManager.rotate(this.rotateAngleX * (180F / (float)Math.PI), 1.0F, 0.0F, 0.0F);
}
if (this.rotateAngleZ != 0.0F)
{
GlStateManager.rotate(this.rotateAngleZ * (180F / (float)Math.PI), 0.0F, 0.0F, 1.0F);
}
GlStateManager.callList(this.displayList);
GlStateManager.popMatrix();
}
}
}
@Override
@SideOnly(Side.CLIENT)
public void postRender(float scale){
super.postRender(scale);
if (!super.isHidden) {
if (super.showModel) {
if (!this.compiled) {
this.compileDisplayList(scale);
}
if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F)
{
if (this.rotationPointX != 0.0F || this.rotationPointY != 0.0F || this.rotationPointZ != 0.0F)
{
GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale);
}
}
else
{
GlStateManager.translate(this.rotationPointX * scale, this.rotationPointY * scale, this.rotationPointZ * scale);
if (this.rotateAngleZ != 0.0F)
{
GlStateManager.rotate(this.rotateAngleZ * (180F / (float)Math.PI), 0.0F, 0.0F, 1.0F);
}
if (this.rotateAngleY != 0.0F)
{
GlStateManager.rotate(this.rotateAngleY * (180F / (float)Math.PI), 0.0F, 1.0F, 0.0F);
}
if (this.rotateAngleX != 0.0F)
{
GlStateManager.rotate(this.rotateAngleX * (180F / (float)Math.PI), 1.0F, 0.0F, 0.0F);
}
}
}
}
}
private void compileDisplayList(Float scale){
this.displayList = GLAllocation.generateDisplayLists(1);
GlStateManager.glNewList(this.displayList, 4864);
BufferBuilder bufferbuilder = Tessellator.getInstance().getBuffer();
for (int i = 0; i < this.paralList.size(); ++i)
{
((ModelBox)this.paralList.get(i)).render(bufferbuilder, scale);
}
GlStateManager.glEndList();
this.compiled = true;
}
@Override
public void setRotationPoint(float rotationPointXIn, float rotationPointYIn, float rotationPointZIn)
{
super.setRotationPoint(rotationPointXIn,rotationPointYIn,rotationPointZIn);
this.rotationPointX = rotationPointXIn;
this.rotationPointY = rotationPointYIn;
this.rotationPointZ = rotationPointZIn;
}
public newModelRenderer arm=new newModelRenderer(this).addParal(5F,5F,5F,5,5,5,35F); //выполняю в стандартном классе, наследованном от ModelBase
Последнее редактирование: