def __init__(self,vs: str,fs: str,MaxText=8): self.MaxQuadCount = 2000 self.MaxVertexCount = self.MaxQuadCount * 4 self.MaxIndexCount = self.MaxQuadCount * 6 self.MaxTextures = MaxText self.QuadVA = 0 self.QuadVB = 0 self.QuadIB = 0 self.WhiteTexture = 0 #The first texture unit is reserv for a 1x1 white texture self.IndexCount = 0 self.QuadBuffer = [Vertex()] self.QuadBufferPtr = 0 self.TextureSlots = [0] * self.MaxTextures self.TextureSlotIndex = 1 self.TexCoords = [vec2(0,0), vec2(1,0), vec2(1,1), vec2(0,1)] self.shader = Shader(vs,fs) print("Texture Units: " + str(self.MaxTextures)) self.QuadVA = glGenVertexArrays(1) glBindVertexArray(self.QuadVA) self.QuadVB = glGenBuffers(1) glBindBuffer(GL_ARRAY_BUFFER, self.QuadVB) glBufferData(GL_ARRAY_BUFFER, self.MaxVertexCount * 10 * sizeOfFloat, None, GL_DYNAMIC_DRAW) #Layout Position glEnableVertexAttribArray(0) glVertexAttribPointer(0,3,GL_FLOAT, GL_FALSE, 10*sizeOfFloat,ctypes.c_void_p(0)) #The last parm is the offset, can't find a offset function #Layout Color glEnableVertexAttribArray(1) glVertexAttribPointer(1,4,GL_FLOAT, GL_FALSE, 10*sizeOfFloat,ctypes.c_void_p(12)) #Layout TexCoords glEnableVertexAttribArray(2) glVertexAttribPointer(2,2,GL_FLOAT, GL_FALSE, 10*sizeOfFloat,ctypes.c_void_p(28)) #Layout TexIndex glEnableVertexAttribArray(3) glVertexAttribPointer(3,1,GL_FLOAT, GL_FALSE, 10*sizeOfFloat,ctypes.c_void_p(36)) self.shader.Bind() loc = self.shader.GetUniformLocation("u_Textures") samplers = [] for i in range(0,self.MaxTextures,1): samplers.append(i) glUniform1iv(loc, self.MaxTextures ,numpy.array(samplers,dtype=numpy.int32)) indices = [0] * self.MaxIndexCount offset = 0 for i in range(0,self.MaxIndexCount,6): indices[i + 0] = 0 + offset indices[i + 1] = 1 + offset indices[i + 2] = 2 + offset indices[i + 3] = 2 + offset indices[i + 4] = 3 + offset indices[i + 5] = 0 + offset offset += 4 self.QuadIB = glGenBuffers(1) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,self.QuadIB) glBufferData(GL_ELEMENT_ARRAY_BUFFER,size=None,data=numpy.array(indices,dtype=numpy.uint32),usage=GL_STATIC_DRAW) self.WhiteTexture = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, self.WhiteTexture) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) white_color = [[255,255,255,255]] glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, white_color) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) self.TextureSlots[0] = self.WhiteTexture for i in range(1,self.MaxTextures,1): self.TextureSlots[i] = 0