From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- Minecraft.Client/Tesselator.h | 178 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 Minecraft.Client/Tesselator.h (limited to 'Minecraft.Client/Tesselator.h') diff --git a/Minecraft.Client/Tesselator.h b/Minecraft.Client/Tesselator.h new file mode 100644 index 00000000..72a458c2 --- /dev/null +++ b/Minecraft.Client/Tesselator.h @@ -0,0 +1,178 @@ +#pragma once + +class ChunkRebuildData; + +class Tesselator { + // private static boolean TRIANGLE_MODE = false; + friend ChunkRebuildData; +private: + static bool TRIANGLE_MODE; + static bool USE_VBO; + + static const int MAX_MEMORY_USE = 16 * 1024 * 1024; + static const int MAX_FLOATS = MAX_MEMORY_USE / 4 / 2; + + intArray *_array; + + int vertices; + float u, v; + int _tex2; + int col; + bool hasColor; + bool hasTexture; + bool hasTexture2; + bool hasNormal; + int p ; + bool useCompactFormat360; // 4J - added + bool useProjectedTexturePixelShader; // 4J - added +public: + int count; +private: + bool _noColor; + int mode; + float xo, yo, zo; + float xoo, yoo, zoo; + int _normal; + + // 4J - added for thread local storage +public: + static void CreateNewThreadStorage(int bytes); +private: + static DWORD tlsIdx; +public: + static Tesselator *getInstance(); + +private: + bool tesselating; + bool mipmapEnable; // 4J added + + bool vboMode; + IntBuffer *vboIds; + int vboId; + int vboCounts; + int size; + + Tesselator(int size); +public: + Tesselator *getUniqueInstance(int size); + void end(); +private: + void clear(); + + // 4J - added to handle compact quad vertex format, which need packaged up as quads + unsigned int m_ix[4],m_iy[4],m_iz[4]; + unsigned int m_clr[4]; + unsigned int m_u[4], m_v[4]; + unsigned int m_t2[4]; + void packCompactQuad(); + +#ifdef __PSVITA__ + // AP - alpha cut out is expensive on vita. Use this to defer primitives that use icons with alpha + bool alphaCutOutEnabled; + + // this is the cut out enabled vertex array + intArray *_array2; + int vertices2; + int p2; +#endif + +public: + + // 4J MGH - added, to calculate tight bounds + class Bounds + { + public: + void reset() + { + boundingBox[0] = FLT_MAX; + boundingBox[1] = FLT_MAX; + boundingBox[2] = FLT_MAX; + boundingBox[3] = -FLT_MAX; + boundingBox[4] = -FLT_MAX; + boundingBox[5] = -FLT_MAX; + } + void addVert(float x, float y, float z) + { + if(x < boundingBox[0]) + boundingBox[0] = x; + if(y < boundingBox[1]) + boundingBox[1] = y; + if(z < boundingBox[2]) + boundingBox[2] = z; + + if(x > boundingBox[3]) + boundingBox[3] = x; + if(y > boundingBox[4]) + boundingBox[4] = y; + if(z > boundingBox[5]) + boundingBox[5] = z; + } + void addBounds(Bounds& ob) + { + if(ob.boundingBox[0] < boundingBox[0]) + boundingBox[0] = ob.boundingBox[0]; + if(ob.boundingBox[1] < boundingBox[1]) + boundingBox[1] = ob.boundingBox[1]; + if(ob.boundingBox[2] < boundingBox[2]) + boundingBox[2] = ob.boundingBox[2]; + + if(ob.boundingBox[3] > boundingBox[3]) + boundingBox[3] = ob.boundingBox[3]; + if(ob.boundingBox[4] > boundingBox[4]) + boundingBox[4] = ob.boundingBox[4]; + if(ob.boundingBox[5] > boundingBox[5]) + boundingBox[5] = ob.boundingBox[5]; + } + float boundingBox[6]; // 4J MGH added + + } bounds; + + void begin(); + void begin(int mode); + void useCompactVertices(bool enable); // 4J added + bool getCompactVertices(); // AP added + void useProjectedTexture(bool enable); // 4J added + void tex(float u, float v); + void tex2(int tex2); // 4J - change brought forward from 1.8.2 + void color(float r, float g, float b); + void color(float r, float g, float b, float a); + void color(int r, int g, int b); + void color(int r, int g, int b, int a); + void color(byte r, byte g, byte b); + void vertexUV(float x, float y, float z, float u, float v); + void vertex(float x, float y, float z); + void color(int c); + void color(int c, int alpha); + void noColor(); + void normal(float x, float y, float z); + void offset(float xo, float yo, float zo); + void addOffset(float x, float y, float z); + bool setMipmapEnable(bool enable); // 4J added + + bool hasMaxVertices(); // 4J Added +#ifdef __PSVITA__ + // AP - alpha cut out is expensive on vita. Use this to defer primitives that use icons with alpha + void setAlphaCutOut(bool enable); + bool getCutOutFound(); + + // AP - a faster way of creating a compressed tile quad + void tileQuad(float x1, float y1, float z1, float u1, float v1, float r1, float g1, float b1, int tex1, + float x2, float y2, float z2, float u2, float v2, float r2, float g2, float b2, int tex2, + float x3, float y3, float z3, float u3, float v3, float r3, float g3, float b3, int tex3, + float x4, float y4, float z4, float u4, float v4, float r4, float g4, float b4, int tex4); + // AP - a faster way of creating rain quads + void tileRainQuad(float x1, float y1, float z1, float u1, float v1, + float x2, float y2, float z2, float u2, float v2, + float x3, float y3, float z3, float u3, float v3, + float x4, float y4, float z4, float u4, float v4, + float r1, float g1, float b1, float a1, + float r2, float g2, float b2, float a2, int tex1); + // AP - a faster way of creating particles + void tileParticleQuad(float x1, float y1, float z1, float u1, float v1, + float x2, float y2, float z2, float u2, float v2, + float x3, float y3, float z3, float u3, float v3, + float x4, float y4, float z4, float u4, float v4, + float r1, float g1, float b1, float a1); +#endif + +}; -- cgit v1.2.3