[1198] | 1 | from gui.visual.staticShader import StaticShader
|
---|
| 2 | from gui.visual.entity import Entity
|
---|
| 3 | import OpenGL.GL as gl
|
---|
| 4 | import glm
|
---|
| 5 |
|
---|
| 6 | class EntityRenderer:
|
---|
| 7 | def __init__(self, staticShader: StaticShader, projectionMatrix) -> None:
|
---|
| 8 | self.shader = staticShader
|
---|
| 9 | self.shader.start()
|
---|
| 10 | self.loadProjectionMatrix(projectionMatrix)
|
---|
| 11 |
|
---|
| 12 | def render(self, entities: dict, textures: bool):
|
---|
| 13 | for item in entities.items():
|
---|
| 14 | self.prepareModelData(item[0], textures)
|
---|
| 15 | batch = item[1]
|
---|
| 16 | for entity in batch:
|
---|
| 17 | self.prepareInstance(entity)
|
---|
| 18 | gl.glDrawElements(gl.GL_TRIANGLES, item[0].rawModel.vertexCount, gl.GL_UNSIGNED_INT, None)
|
---|
| 19 | self.unbindModelData()
|
---|
| 20 |
|
---|
| 21 | def prepareModelData(self, model, textures: bool):
|
---|
| 22 | rawModel = model.rawModel
|
---|
| 23 | gl.glBindVertexArray(rawModel.vaoID)
|
---|
| 24 | gl.glEnableVertexAttribArray(0)
|
---|
| 25 | gl.glEnableVertexAttribArray(1)
|
---|
| 26 | gl.glEnableVertexAttribArray(2)
|
---|
| 27 |
|
---|
| 28 | self.shader.loadTextureOn(textures)
|
---|
| 29 |
|
---|
| 30 | if textures:
|
---|
| 31 | gl.glActiveTexture(gl.GL_TEXTURE0)
|
---|
| 32 | gl.glBindTexture(gl.GL_TEXTURE_2D, model.texture.id)
|
---|
| 33 | else:
|
---|
| 34 | gl.glBindTexture(gl.GL_TEXTURE_2D, 0)
|
---|
| 35 | gl.glDisable(gl.GL_TEXTURE_2D)
|
---|
| 36 |
|
---|
| 37 | def unbindModelData(self):
|
---|
| 38 | gl.glDisableVertexAttribArray(0)
|
---|
| 39 | gl.glDisableVertexAttribArray(1)
|
---|
| 40 | gl.glDisableVertexAttribArray(2)
|
---|
| 41 | gl.glBindVertexArray(0)
|
---|
| 42 |
|
---|
| 43 | def createTransformationMatrix(self, entity: Entity):
|
---|
| 44 | matrix = glm.mat4(1)
|
---|
| 45 | matrix = glm.translate(matrix, entity.position)
|
---|
| 46 |
|
---|
| 47 | if entity.angle is not None:
|
---|
| 48 | matrix = glm.rotate(matrix, entity.angle, entity.vector)
|
---|
| 49 | elif entity.rotMatrix is not None:
|
---|
| 50 | matrix = matrix * entity.rotMatrix
|
---|
| 51 | else:
|
---|
| 52 | matrix = glm.rotate(matrix, entity.rotX, glm.vec3(1, 0, 0))
|
---|
| 53 | matrix = glm.rotate(matrix, entity.rotY, glm.vec3(0, 1, 0))
|
---|
| 54 | matrix = glm.rotate(matrix, entity.rotZ, glm.vec3(0, 0, 1))
|
---|
| 55 |
|
---|
| 56 | if entity.scaleX is not None and entity.scaleY is not None and entity.scaleZ is not None:
|
---|
| 57 | matrix = glm.scale(matrix, glm.vec3(entity.scaleX, entity.scaleY, entity.scaleZ))
|
---|
| 58 | else:
|
---|
| 59 | matrix = glm.scale(matrix, glm.vec3(entity.scale))
|
---|
| 60 |
|
---|
| 61 | return matrix
|
---|
| 62 |
|
---|
| 63 | def prepareInstance(self, entity: Entity):
|
---|
| 64 | transformationMatrix = self.createTransformationMatrix(entity)
|
---|
| 65 | self.shader.loadTransformationMatrix(transformationMatrix)
|
---|
| 66 |
|
---|
| 67 | if entity.color:
|
---|
| 68 | self.shader.loadColor(entity.color)
|
---|
| 69 |
|
---|
| 70 | def loadProjectionMatrix(self, projectionMatrix):
|
---|
| 71 | self.shader.loadProjectionMatrix(projectionMatrix) |
---|