feat: implement multi-layer texture binding

This commit is contained in:
daoge_cmd
2026-03-03 21:20:10 +08:00
parent 5422191ed4
commit d2bc3342dc
12 changed files with 38 additions and 12 deletions

View File

@@ -428,7 +428,7 @@ void Textures::bindTextureLayers(ResourceLocation *resource)
for( int i = 0; i < layers; i++ ) for( int i = 0; i < layers; i++ )
{ {
RenderManager.TextureBind(loadTexture(resource->getTexture(i))); RenderManager.TextureBind(i, loadTexture(resource->getTexture(i)));
} }
} }
@@ -1520,3 +1520,4 @@ bool Textures::IsOriginalImage(TEXTURE_NAME texId, const wstring& name)
return false; return false;
} }

View File

@@ -145,6 +145,7 @@ public:
int TextureCreate(); int TextureCreate();
void TextureFree(int idx); void TextureFree(int idx);
void TextureBind(int idx); void TextureBind(int idx);
void TextureBind(int layer, int idx);
void TextureBindVertex(int idx); void TextureBindVertex(int idx);
void TextureSetTextureLevels(int levels); void TextureSetTextureLevels(int levels);
int TextureGetTextureLevels(); int TextureGetTextureLevels();
@@ -300,3 +301,4 @@ const int GL_TRIANGLE_STRIP = C4JRender::PRIMITIVE_TYPE_TRIANGLE_STRIP;
extern C4JRender RenderManager; extern C4JRender RenderManager;

View File

@@ -3,6 +3,17 @@
#include "..\Minecraft.World\IntBuffer.h" #include "..\Minecraft.World\IntBuffer.h"
#include "..\Minecraft.World\ByteBuffer.h" #include "..\Minecraft.World\ByteBuffer.h"
static int g_activeTextureLayer = 0;
static int getTextureLayer(int textureUnit)
{
if (textureUnit == GL_TEXTURE1)
return 1;
if (textureUnit >= GL_TEXTURE0)
return textureUnit - GL_TEXTURE0;
return 0;
}
void glViewport(int x, int y, int w, int h) void glViewport(int x, int y, int w, int h)
{ {
// We don't really need anything here because minecraft doesn't current do anything other than the default viewport // We don't really need anything here because minecraft doesn't current do anything other than the default viewport
@@ -139,7 +150,7 @@ void Display::swapBuffers()
void glBindTexture(int target,int texture) void glBindTexture(int target,int texture)
{ {
RenderManager.TextureBind(texture); RenderManager.TextureBind(g_activeTextureLayer, texture);
} }
void glTexImage2D(int target,int level,int internalformat,int width,int height,int border,int format,int type, ByteBuffer *data) void glTexImage2D(int target,int level,int internalformat,int width,int height,int border,int format,int type, ByteBuffer *data)
@@ -190,7 +201,7 @@ void glDisable(int state)
switch(state) switch(state)
{ {
case GL_TEXTURE_2D: case GL_TEXTURE_2D:
RenderManager.TextureBind(-1); RenderManager.TextureBind(g_activeTextureLayer, -1);
break; break;
case GL_BLEND: case GL_BLEND:
RenderManager.StateSetBlendEnable(false); RenderManager.StateSetBlendEnable(false);
@@ -391,3 +402,22 @@ void glCullFace(int dir)
{ {
RenderManager.StateSetFaceCullCW( dir == GL_BACK); RenderManager.StateSetFaceCullCW( dir == GL_BACK);
} }
void glClientActiveTexture(int texture)
{
glActiveTexture(texture);
}
void glActiveTexture(int texture)
{
int layer = getTextureLayer(texture);
if (layer < 0)
{
layer = 0;
}
else if (layer > 3)
{
layer = 3;
}
g_activeTextureLayer = layer;
}

View File

@@ -122,13 +122,6 @@ void glColorMaterial(int,int)
} }
//1.8.2 //1.8.2
void glClientActiveTexture(int)
{
}
void glActiveTexture(int)
{
}
void glFlush() void glFlush()
{ {