summaryrefslogtreecommitdiff
path: root/demo/fancy/honey.lua
diff options
context:
space:
mode:
Diffstat (limited to 'demo/fancy/honey.lua')
-rw-r--r--demo/fancy/honey.lua283
1 files changed, 283 insertions, 0 deletions
diff --git a/demo/fancy/honey.lua b/demo/fancy/honey.lua
new file mode 100644
index 0000000..4b1526f
--- /dev/null
+++ b/demo/fancy/honey.lua
@@ -0,0 +1,283 @@
+local gl = honey.gl
+local window = honey.window
+
+
+--===== initialize audio =====--
+
+local engine = honey.audio.engine_init()
+honey.audio.engine_play_sound(engine, 'example_sound.ogg')
+
+
+--====== initialize opengl ======--
+
+gl.Init()
+window.setHint(window.hintType.contextVersionMajor, 3)
+window.setHint(window.hintType.contextVersionMinor, 3)
+window.setHint(window.hintType.openGlProfile, window.profileType.openGlCoreProfile)
+
+
+--====== create window ======--
+
+local w = window.create(640, 480, 'hello, world!')
+window.makeContextCurrent(w)
+gl.InitGlad()
+gl.Enable(gl.DEPTH_TEST)
+
+window.setFramebufferSizeCallback(w, function(_, width, height)
+ print(string.format("resize: (%d, %d)", width, height))
+ gl.setViewport(0, 0, width, height)
+end)
+
+
+--====== compile shaders ======--
+
+local vertexShaderSource = [[
+#version 330 core
+layout (location = 0) in vec3 aPos;
+layout (location = 1) in vec2 aTexCoord;
+
+uniform mat4 model;
+uniform mat4 view;
+uniform mat4 projection;
+
+out vec2 TexCoord;
+
+void main()
+{
+ gl_Position = projection * view * model * vec4(aPos, 1.0);
+ TexCoord = aTexCoord;
+}
+]]
+
+local fragmentShaderSource = [[
+#version 330 core
+out vec4 FragColor;
+
+in vec2 TexCoord;
+
+uniform sampler2D ourTexture;
+
+void main()
+{
+ FragColor = texture(ourTexture, TexCoord);
+}
+]]
+
+-- vertex shader
+local vertexShader = gl.CreateShader(gl.VERTEX_SHADER)
+gl.ShaderSource(vertexShader, vertexShaderSource)
+gl.CompileShader(vertexShader)
+
+-- fragment shader
+local fragmentShader = gl.CreateShader(gl.FRAGMENT_SHADER)
+gl.ShaderSource(fragmentShader, fragmentShaderSource)
+gl.CompileShader(fragmentShader)
+
+-- link
+local shader = gl.CreateProgram()
+gl.AttachShader(shader, vertexShader)
+gl.AttachShader(shader, fragmentShader)
+gl.LinkProgram(shader)
+-- clean up
+gl.DeleteShader(vertexShader)
+gl.DeleteShader(fragmentShader)
+
+
+--====== set up mesh data manually ======--
+
+local vertices = {
+-- positions uvs
+ 0.5, 0.5, 0.0, 1.0, 1.0, -- top right
+ 0.5, -0.5, 0.0, 1.0, 0.0, -- bottom right
+ -0.5, -0.5, 0.0, 0.0, 0.0, -- bottom let
+ -0.5, 0.5, 0.0, 0.0, 1.0 -- top let
+}
+local indices = {
+ 0, 1, 3, -- first triangle
+ 1, 2, 3 -- second triangle
+}
+
+-- buffers
+local vertexArray = gl.GenVertexArrays()
+local vertexBuffer = gl.GenBuffers()
+local elementBuffer = gl.GenBuffers()
+
+gl.BindVertexArray(vertexArray)
+
+gl.BindBuffer(gl.ARRAY_BUFFER, vertexBuffer)
+gl.BufferData(gl.ARRAY_BUFFER, gl.FLOAT, vertices, gl.STATIC_DRAW)
+
+gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementBuffer)
+gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, gl.UNSIGNED_INT, indices, gl.STATIC_DRAW)
+
+-- position
+gl.VertexAttribPointer(0, 3, false, 5, 0)
+gl.EnableVertexAttribArray(0)
+
+-- uv
+gl.VertexAttribPointer(1, 2, false, 5, 3)
+gl.EnableVertexAttribArray(1)
+
+
+--===== load mesh from file =====--
+
+local scene = honey.import.importFile('suzanne.dae')
+local mesh = scene.meshes[1]
+local suzanne = {}
+suzanne.vertices = {}
+print('mesh.vertices', #mesh.vertices)
+for i=1,#mesh.vertices do
+ local position = mesh.vertices[i]
+ local uv = mesh.uvs[1][i]
+ table.insert(suzanne.vertices, position.x)
+ table.insert(suzanne.vertices, position.y)
+ table.insert(suzanne.vertices, position.z)
+ table.insert(suzanne.vertices, uv.x)
+ table.insert(suzanne.vertices, uv.y)
+end
+suzanne.indices = {}
+for _, face in ipairs(mesh.faces) do
+ assert(#face == 3)
+ for _, i in ipairs(face) do
+ table.insert(suzanne.indices, i)
+ end
+end
+print('mesh.faces', #mesh.faces)
+print('suzanne.indices', #suzanne.indices)
+
+suzanne.vertexArr = gl.GenVertexArrays()
+suzanne.vertexBuf = gl.GenBuffers()
+suzanne.elementBuf = gl.GenBuffers()
+
+gl.BindVertexArray(suzanne.vertexArr)
+gl.BindBuffer(gl.ARRAY_BUFFER, suzanne.vertexBuf)
+gl.BufferData(gl.ARRAY_BUFFER, gl.FLOAT, suzanne.vertices, gl.STATIC_DRAW)
+
+gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, suzanne.elementBuf)
+gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, gl.UNSIGNED_INT, suzanne.indices, gl.STATIC_DRAW)
+
+gl.VertexAttribPointer(0, 3, false, 5, 0)
+gl.EnableVertexAttribArray(0)
+gl.VertexAttribPointer(1, 2, false, 5, 3)
+gl.EnableVertexAttribArray(1)
+
+
+--====== load texture ======--
+
+local texture = gl.GenTextures()
+gl.BindTexture(gl.TEXTURE_2D, texture)
+
+gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT)
+gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT)
+
+gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
+gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
+
+local image, width, height = honey.image.load('container.jpg', 3)
+gl.TexImage2D(
+ gl.TEXTURE_2D, 0,
+ gl.RGB, width, height,
+ gl.RGB, gl.UNSIGNED_BYTE,
+ image
+)
+gl.GenerateMipmap(gl.TEXTURE_2D)
+honey.image.destroy(image)
+
+-- connect shader samplers to texture units
+gl.UseProgram(shader)
+gl.Uniform1i(gl.GetUniformLocation(shader, 'ourTexture'), 0)
+
+
+--===== generate cairo texture =====--
+
+local image = honey.image
+local surface = image.surface_create(image.FORMAT_ARGB32, 512, 512)
+local cr = image.context_create(surface)
+image.context_select_font_face(cr, "sans-serif", image.FONT_SLANT_NORMAL, image.FONT_WEIGHT_NORMAL)
+image.context_set_font_size(cr, 32)
+image.context_set_source_rgb(cr, 1, 0, 0)
+image.context_move_to(cr, 100, 100)
+image.context_show_text(cr, "hello, world!")
+local data = image.surface_get_data(surface)
+gl.BindTexture(gl.TEXTURE_2D, texture)
+gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_SWIZZLE_R, gl.BLUE)
+gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_SWIZZLE_B, gl.RED)
+--gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_SWIZZLE_A, gl.RED)
+gl.TexImage2D(
+ gl.TEXTURE_2D, 0,
+ gl.RGB, width, height,
+ gl.RGBA, gl.UNSIGNED_BYTE,
+ data
+)
+gl.GenerateMipmap(gl.TEXTURE_2D)
+
+
+--====== matrices ======--
+
+local model = honey.glm.mat4()
+local axis1 = honey.glm.vec3()
+honey.glm.vec3_set(axis1, 0, 1.0)
+honey.glm.vec3_set(axis1, 1, 0.0)
+honey.glm.vec3_set(axis1, 2, 0.0)
+
+local axis2 = honey.glm.vec3()
+honey.glm.vec3_set(axis2, 0, 0.0)
+honey.glm.vec3_set(axis2, 1, 1.0)
+honey.glm.vec3_set(axis2, 2, 0.0)
+
+local view = honey.glm.mat4()
+honey.glm.mat4_identity(view)
+local translation = honey.glm.vec3()
+honey.glm.vec3_set(translation, 0, 0.0)
+honey.glm.vec3_set(translation, 1, 0.0)
+honey.glm.vec3_set(translation, 2, -3.0)
+honey.glm.translate(view, translation)
+
+local projection = honey.glm.mat4()
+honey.glm.perspective(math.rad(45), 800/600, 0.1, 100, projection)
+
+
+--====== main loop ======--
+
+local transform = honey.glm.mat4()
+
+while not window.shouldClose(w) do
+ local time = window.getTime()
+
+ gl.ClearColor(0.2, 0.3, 0.3, 1.0)
+ gl.Clear(gl.COLOR_BUFFER_BIT + gl.DEPTH_BUFFER_BIT)
+
+ gl.ActiveTexture(0)
+ gl.BindTexture(gl.TEXTURE_2D, texture)
+
+ gl.UseProgram(shader)
+
+ local modelL = gl.GetUniformLocation(shader, 'model')
+ local viewL = gl.GetUniformLocation(shader, 'view')
+ local projectionL = gl.GetUniformLocation(shader, 'projection')
+
+ honey.glm.mat4_identity(model)
+ honey.glm.rotate(model, 0.5*math.pi*time, axis2)
+ honey.glm.rotate(model, math.rad(-90), axis1)
+
+ gl.UniformMatrix4fv(modelL, false, model)
+ gl.UniformMatrix4fv(viewL, false, view)
+ gl.UniformMatrix4fv(projectionL, false, projection)
+
+ --gl.BindVertexArray(vertexArray)
+ --gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, 0)
+
+ gl.BindVertexArray(suzanne.vertexArr)
+ gl.DrawElements(gl.TRIANGLES, 3*#mesh.faces, gl.UNSIGNED_INT, 0)
+
+ window.swapBuffers(w)
+ window.pollEvents()
+end
+
+--===== shut down =====--
+
+window.destroy(w)
+gl.Terminate()
+honey.audio.engine_uninit(engine)
+image.surface_destroy(surface)
+image.context_destroy(cr)