[1198] | 1 | import OpenGL.GL as gl
|
---|
| 2 | from OpenGL.raw.GL.VERSION.GL_1_5 import GL_STATIC_DRAW
|
---|
| 3 | from gui.visual.rawModel import RawModel
|
---|
| 4 | from PIL import Image
|
---|
| 5 | import numpy as np
|
---|
| 6 | from typing import List
|
---|
| 7 |
|
---|
| 8 | class Loader:
|
---|
| 9 | def __init__(self) -> None:
|
---|
| 10 | self.vaos = []
|
---|
| 11 | self.vbos = []
|
---|
| 12 | self.textures = []
|
---|
| 13 |
|
---|
| 14 | def loadToVao5(self, positions, textureCoords, normals, indieces, vertexCount: int):
|
---|
| 15 | vaoid = self.createVAO()
|
---|
| 16 | self.bindIndicesBuffer(indieces)
|
---|
| 17 | self.storeDataInAttributeList(0, 3, positions)
|
---|
| 18 | self.storeDataInAttributeList(1, 2, textureCoords)
|
---|
| 19 | self.storeDataInAttributeList(2, 3, normals)
|
---|
| 20 | self.unbindVAO()
|
---|
| 21 | return RawModel(vaoid, vertexCount)
|
---|
| 22 |
|
---|
| 23 | def loadToVao3(self, positions, textureCoords, vertexCount: int):
|
---|
| 24 | vaoid = self.createVAO()
|
---|
| 25 | self.storeDataInAttributeList(0, 3, positions)
|
---|
| 26 | self.storeDataInAttributeList(1, 2, textureCoords)
|
---|
| 27 | self.unbindVAO()
|
---|
| 28 | return RawModel(vaoid, vertexCount)
|
---|
| 29 |
|
---|
| 30 | def loadToVao2(self, positions, colors, vertexCount: int):
|
---|
| 31 | vaoid = self.createVAO()
|
---|
| 32 | self.storeDataInAttributeList(0, 3, positions)
|
---|
| 33 | self.storeDataInAttributeList(1, 3, colors)
|
---|
| 34 | self.unbindVAO()
|
---|
| 35 | return RawModel(vaoid, vertexCount)
|
---|
| 36 |
|
---|
| 37 | def loadToVao1(self, positions, vertexCount: int):
|
---|
| 38 | vaoid = self.createVAO()
|
---|
| 39 | self.storeDataInAttributeList(0, 3, positions)
|
---|
| 40 | self.unbindVAO()
|
---|
| 41 | return RawModel(vaoid, vertexCount)
|
---|
| 42 |
|
---|
| 43 | def loadTexture(self, filename: str) -> int:
|
---|
| 44 | image = Image.open(filename)
|
---|
| 45 | img_data = np.array(list(image.getdata()), np.uint8)
|
---|
| 46 |
|
---|
| 47 | textureid = gl.glGenTextures(1)
|
---|
| 48 | gl.glBindTexture(gl.GL_TEXTURE_2D, textureid)
|
---|
| 49 | colors = gl.GL_RGB
|
---|
| 50 | if image.mode == 'RGBA':
|
---|
| 51 | colors = gl.GL_RGBA
|
---|
| 52 | gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGB, image.width, image.height, 0, colors, gl.GL_UNSIGNED_BYTE, img_data)
|
---|
| 53 |
|
---|
| 54 | gl.glGenerateMipmap(gl.GL_TEXTURE_2D)
|
---|
| 55 | gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR_MIPMAP_LINEAR),
|
---|
| 56 | gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_LOD_BIAS, -2.4)
|
---|
| 57 |
|
---|
| 58 | self.textures.append(textureid)
|
---|
| 59 | return textureid
|
---|
| 60 |
|
---|
| 61 | def loadCubemap(self, filenames: List[str]) -> int:
|
---|
| 62 | if len(filenames) != 6:
|
---|
| 63 | raise Exception("filenames must contain exactly 6 textures")
|
---|
| 64 | textureid = gl.glGenTextures(1)
|
---|
| 65 | gl.glBindTexture(gl.GL_TEXTURE_CUBE_MAP, textureid)
|
---|
| 66 |
|
---|
| 67 | for i, filename in enumerate(filenames):
|
---|
| 68 | image = Image.open(filename)
|
---|
| 69 | img_data = np.array(list(image.getdata()), np.uint8)
|
---|
| 70 | colors = gl.GL_RGB
|
---|
| 71 | if image.mode == "RGBA":
|
---|
| 72 | colors = gl.GL_RGBA
|
---|
| 73 | gl.glTexImage2D(gl.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, gl.GL_RGB, image.width, image.height, 0, colors, gl.GL_UNSIGNED_BYTE, img_data)
|
---|
| 74 |
|
---|
| 75 | gl.glTexParameteri(gl.GL_TEXTURE_CUBE_MAP, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR)
|
---|
| 76 | gl.glTexParameteri(gl.GL_TEXTURE_CUBE_MAP, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR)
|
---|
| 77 | gl.glTexParameteri(gl.GL_TEXTURE_CUBE_MAP, gl.GL_TEXTURE_WRAP_S, gl.GL_CLAMP_TO_EDGE)
|
---|
| 78 | gl.glTexParameteri(gl.GL_TEXTURE_CUBE_MAP, gl.GL_TEXTURE_WRAP_T, gl.GL_CLAMP_TO_EDGE)
|
---|
| 79 | gl.glTexParameteri(gl.GL_TEXTURE_CUBE_MAP, gl.GL_TEXTURE_WRAP_R, gl.GL_CLAMP_TO_EDGE)
|
---|
| 80 |
|
---|
| 81 | return textureid
|
---|
| 82 |
|
---|
| 83 | def cleanUp(self):
|
---|
| 84 | for vao in self.vaos:
|
---|
| 85 | gl.glDeleteVertexArrays(1, vao)
|
---|
| 86 |
|
---|
| 87 | for vbo in self.vbos:
|
---|
| 88 | gl.glDeleteBuffers(1, vbo)
|
---|
| 89 |
|
---|
| 90 | for texture in self.textures:
|
---|
| 91 | gl.glDeleteTextures(1, texture)
|
---|
| 92 |
|
---|
| 93 | def createVAO(self):
|
---|
| 94 | vao_id = gl.glGenVertexArrays(1)
|
---|
| 95 | self.vaos.append(vao_id)
|
---|
| 96 | gl.glBindVertexArray(vao_id)
|
---|
| 97 | return vao_id
|
---|
| 98 |
|
---|
| 99 | def storeDataInAttributeList(self, attributeNumber: int, coordinateSize: int, data: list):
|
---|
| 100 | vboid = gl.glGenBuffers(1)
|
---|
| 101 | self.vbos.append(vboid)
|
---|
| 102 | gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vboid)
|
---|
| 103 | npdata = np.array(data, dtype=np.float32)
|
---|
| 104 | gl.glBufferData(gl.GL_ARRAY_BUFFER, len(data) * 4, npdata, gl.GL_STATIC_DRAW)
|
---|
| 105 | gl.glVertexAttribPointer(attributeNumber, coordinateSize, gl.GL_FLOAT, gl.GL_FALSE, 0, None)
|
---|
| 106 |
|
---|
| 107 | gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)
|
---|
| 108 |
|
---|
| 109 | def unbindVAO(self):
|
---|
| 110 | gl.glBindVertexArray(0)
|
---|
| 111 |
|
---|
| 112 | def bindIndicesBuffer(self, indices):
|
---|
| 113 | vboid = gl.glGenBuffers(1)
|
---|
| 114 | self.vbos.append(vboid)
|
---|
| 115 | gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, vboid)
|
---|
| 116 | npindices = np.array(indices, dtype=np.int32)
|
---|
| 117 | gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, len(indices) * 4, npindices, GL_STATIC_DRAW)
|
---|
| 118 | gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0) |
---|