- 4,045
- 63
- 645
Народ, помогите разобраться в одной вещи.
Переписываю рендер неба для своего измерения.
Меняю через getSkyRenderer() в провайдере мира.
На данный момент скопипастил ванильное и всё, вроде бы, работает, но смущает меня один момент, а именно:
В RenderGlobal() есть следующие методы:
В них происходит генерация VBO для неба и звёзд.
Вот пример звёзд:
Я запихнул их в метод render() своего RenderSky, но что-то мне подсказывает, что грузиться они должны только один раз.
Подскажите, плиз, верно ли я считаю, и как лучше поступить в моём случае?
Переписываю рендер неба для своего измерения.
Меняю через getSkyRenderer() в провайдере мира.
На данный момент скопипастил ванильное и всё, вроде бы, работает, но смущает меня один момент, а именно:
В RenderGlobal() есть следующие методы:
Код:
this.generateStars();
this.generateSky();
this.generateSky2();
В них происходит генерация VBO для неба и звёзд.
Вот пример звёзд:
Код:
private void generateStars()
{
Tessellator tessellator = Tessellator.getInstance();
VertexBuffer vertexbuffer = tessellator.getBuffer();
if (this.starVBO != null)
{
this.starVBO.deleteGlBuffers();
}
if (this.starGLCallList >= 0)
{
GLAllocation.deleteDisplayLists(this.starGLCallList);
this.starGLCallList = -1;
}
if (this.vboEnabled)
{
this.starVBO = new net.minecraft.client.renderer.vertex.VertexBuffer(this.vertexBufferFormat);
this.renderStars(vertexbuffer);
vertexbuffer.finishDrawing();
vertexbuffer.reset();
this.starVBO.bufferData(vertexbuffer.getByteBuffer());
}
else
{
this.starGLCallList = GLAllocation.generateDisplayLists(1);
GlStateManager.pushMatrix();
GlStateManager.glNewList(this.starGLCallList, 4864);
this.renderStars(vertexbuffer);
tessellator.draw();
GlStateManager.glEndList();
GlStateManager.popMatrix();
}
}
private void renderStars(VertexBuffer worldRendererIn)
{
Random random = new Random(10842L);
worldRendererIn.begin(7, DefaultVertexFormats.POSITION);
for (int i = 0; i < 1500; ++i)
{
double d0 = (double)(random.nextFloat() * 2.0F - 1.0F);
double d1 = (double)(random.nextFloat() * 2.0F - 1.0F);
double d2 = (double)(random.nextFloat() * 2.0F - 1.0F);
double d3 = (double)(0.15F + random.nextFloat() * 0.1F);
double d4 = d0 * d0 + d1 * d1 + d2 * d2;
if (d4 < 1.0D && d4 > 0.01D)
{
d4 = 1.0D / Math.sqrt(d4);
d0 = d0 * d4;
d1 = d1 * d4;
d2 = d2 * d4;
double d5 = d0 * 100.0D;
double d6 = d1 * 100.0D;
double d7 = d2 * 100.0D;
double d8 = Math.atan2(d0, d2);
double d9 = Math.sin(d8);
double d10 = Math.cos(d8);
double d11 = Math.atan2(Math.sqrt(d0 * d0 + d2 * d2), d1);
double d12 = Math.sin(d11);
double d13 = Math.cos(d11);
double d14 = random.nextDouble() * Math.PI * 2.0D;
double d15 = Math.sin(d14);
double d16 = Math.cos(d14);
for (int j = 0; j < 4; ++j)
{
double d17 = 0.0D;
double d18 = (double)((j & 2) - 1) * d3;
double d19 = (double)((j + 1 & 2) - 1) * d3;
double d20 = 0.0D;
double d21 = d18 * d16 - d19 * d15;
double d22 = d19 * d16 + d18 * d15;
double d23 = d21 * d12 + 0.0D * d13;
double d24 = 0.0D * d12 - d21 * d13;
double d25 = d24 * d9 - d22 * d10;
double d26 = d22 * d9 + d24 * d10;
worldRendererIn.pos(d5 + d25, d6 + d23, d7 + d26).endVertex();
}
}
}
}
Я запихнул их в метод render() своего RenderSky, но что-то мне подсказывает, что грузиться они должны только один раз.
Подскажите, плиз, верно ли я считаю, и как лучше поступить в моём случае?