1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
import moderngl
import numpy
from headless import HeadlessTestCase
from moderngl_window.opengl.vao import VAO, BufferInfo, VAOError
class VaoTestCase(HeadlessTestCase):
def createProgram(self):
return self.ctx.program(
vertex_shader="""
#version 330
in vec3 position;
in vec3 normal;
out vec3 v_normal;
void main() {
gl_Position = vec4(position, 1.0);
v_normal = normalize(normal);
}
""",
fragment_shader="""
#version 330
out vec4 fragColor;
in vec3 v_normal;
void main() {
float col = length(v_normal);
fragColor = vec4(col);
}
""",
)
def test_create(self):
mesh = VAO("test", mode=moderngl.LINES)
mesh.buffer(
numpy.array([0.0, 0.0, 0.0, 1.0, 1.0, 1.0], dtype="f4"), "3f", "position"
)
mesh.buffer(
numpy.array([0.0, 0.0, 1.0, 1.0, 0.0, 1.0], dtype="f4"), "3f", "normal"
)
mesh.buffer(numpy.array([0.0, 0.0, 1.0, 1.0], dtype="f4"), "2f", "uv")
# Ensure basic properties are correct
self.assertEqual(mesh.name, "test")
self.assertEqual(mesh.vertex_count, 2)
self.assertEqual(mesh.mode, moderngl.LINES)
# Ensure buffers are present
self.assertIsInstance(mesh.get_buffer_by_name("position"), BufferInfo)
self.assertIsInstance(mesh.get_buffer_by_name("normal"), BufferInfo)
self.assertIsInstance(mesh.get_buffer_by_name("uv"), BufferInfo)
self.assertEqual(mesh.get_buffer_by_name("something"), None)
# Create a progam using a subset of the buffers
prog = self.createProgram()
vao = mesh.instance(prog)
self.assertIsInstance(vao, moderngl.VertexArray)
# Render directly with VAO and VertexArray instance
mesh.render(prog)
vao.render()
def test_illegal_draw_mode(self):
"""Create vao with illegal draw mode"""
with self.assertRaises(VAOError):
VAO(mode=1337)
def test_add_illegal_buffer(self):
"""Attempt to add illegal buffer"""
vao = VAO()
with self.assertRaises(VAOError):
vao.buffer("stuff", "1f", "in_position")
def test_normalized_types(self):
"""Ensure VAO wrapper can handle normalized types"""
# prog = self.createProgram()
mesh = VAO("test", mode=moderngl.LINES)
mesh.buffer(
numpy.array([0.0, 0.0, 0.0, 1.0, 1.0, 1.0], dtype="i4"), "3ni", "position"
)
mesh.buffer(
numpy.array([0.0, 0.0, 1.0, 1.0, 0.0, 1.0], dtype="f4"), "3nf", "normal"
)
mesh.buffer(numpy.array([0.0, 0.0, 1.0, 1.0], dtype="f4"), "2f", "uv")
# Uncomment in moderngl 5.6+
# mesh.instance(prog)
def test_divisors(self):
"""Test defining buffers with different divisor types"""
mesh = VAO("test", mode=moderngl.LINES)
mesh.buffer(
numpy.array([0.0, 0.0, 0.0, 1.0, 1.0, 1.0], dtype="f4"), "3f/v", "position"
)
mesh.buffer(
numpy.array([0.0, 0.0, 1.0, 1.0, 0.0, 1.0], dtype="f4"), "3f/r", "normal"
)
mesh.buffer(numpy.array([0.0, 0.0, 1.0, 1.0], dtype="f4"), "2f/i", "uv")
buffer1 = mesh.get_buffer_by_name("position")
buffer2 = mesh.get_buffer_by_name("normal")
buffer3 = mesh.get_buffer_by_name("uv")
attributes = ["position", "normal", "uv"]
self.assertEqual(
buffer1.content(attributes), (buffer1.buffer, "3f/v", "position")
)
self.assertEqual(
buffer2.content(attributes), (buffer2.buffer, "3f/r", "normal")
)
self.assertEqual(buffer3.content(attributes), (buffer3.buffer, "2f/i", "uv"))
|