require 'honey.std' local glfw = honey.glfw local gl = honey.gl local Vec3 = honey.Vec3 local Mat4 = honey.Mat4 local window = honey.init() gl.Enable(gl.DEPTH_TEST) local model = Mat4() model:identity() local view = Mat4() view:identity() view:translate(Vec3{0, 0, -3}) local projection = Mat4() projection:perspective(math.rad(45), 640/480, 0.1, 100) local vertexShaderSource = [[ #version 410 core layout (location = 0) in vec3 in_position; layout (location = 1) in vec3 in_normal; layout (location = 2) in vec2 in_tex; uniform mat4 model; uniform mat4 view; uniform mat4 projection; out vec3 position; out vec3 normal; out vec2 tex; void main() { gl_Position = projection * view * model * vec4(in_position, 1.0); position = in_position; //normal = vec3(model * vec4(in_normal, 1.0f)); normal = in_normal; tex = in_tex; } ]] local fragmentShaderSource = [[ #version 410 core out vec4 FragColor; in vec3 position; in vec3 normal; in vec2 tex; uniform sampler2D ourTexture; void main() { FragColor = vec4(normal, 1.0f); //FragColor = vec4(tex, 1.0f, 1.0f); //FragColor = texture(ourTexture, TexCoord); } ]] local shader = honey.Shader{ vertex = vertexShaderSource, fragment = fragmentShaderSource, } local tetra = honey.mesh.loadFile("assets/tetrahedron.obj")[1] local cube = honey.mesh.loadFile("assets/cube.obj")[1] local octa = honey.mesh.loadFile("assets/octahedron.obj")[1] local dodeca = honey.mesh.loadFile("assets/dodecahedron.obj")[1] local icosa = honey.mesh.loadFile("assets/icosahedron.obj")[1] local meshes = { tetra, cube, octa, dodeca, icosa } local meshIndex = 1 local mesh = meshes[1] window:setKeyCallback(function(_, key, scancode, action, mods) if action ~= glfw.PRESS then return end if key == glfw.KEY_SPACE then meshIndex = meshIndex + 1 if meshIndex > #meshes then meshIndex = 1 end mesh = meshes[meshIndex] elseif key == glfw.KEY_ESCAPE then window:setShouldClose(true) end end) while not window:shouldClose() do local time = glfw.GetTime() model:identity() model:rotateY(0.5 * math.pi * time) model:rotateX(0.05 * math.pi * time) --model:scale(0.2 * Vec3{1, 1, 1}) gl.ClearColor(0.2, 0.4, 1.0, 1.0) gl.Clear(gl.COLOR_BUFFER_BIT + gl.DEPTH_BUFFER_BIT) shader:use() shader:setMatrix('model', model) shader:setMatrix('view', view) shader:setMatrix('projection', projection) mesh:drawElements() window:swapBuffers() glfw.PollEvents() end honey.terminate()