summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fragment.glsl15
-rw-r--r--honey/init.lua22
-rw-r--r--honey/shader.lua15
-rw-r--r--honey/std.lua1
-rw-r--r--main.lua88
-rw-r--r--vertex.glsl21
6 files changed, 86 insertions, 76 deletions
diff --git a/fragment.glsl b/fragment.glsl
new file mode 100644
index 0000000..27dbbfa
--- /dev/null
+++ b/fragment.glsl
@@ -0,0 +1,15 @@
+#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);
+}
diff --git a/honey/init.lua b/honey/init.lua
index c3dda37..6afa324 100644
--- a/honey/init.lua
+++ b/honey/init.lua
@@ -2,9 +2,9 @@ local glfw = honey.glfw
local gl = honey.gl
local window = require 'honey.window'
-local hinit = {}
-setmetatable(hinit, {__index=_G})
-setfenv(1, hinit)
+local module = {}
+setmetatable(module, {__index=_G})
+setfenv(1, module)
function init(width, height, title)
@@ -16,14 +16,28 @@ function init(width, height, title)
local window = honey.Window(width, height, title)
glfw.MakeContextCurrent(window.win)
gl.InitGlad()
+ gl.Enable(gl.DEPTH_TEST)
return window
end
+function loop(window, update)
+ local prevTime = 0
+ while not window:shouldClose() do
+ local time = glfw.GetTime()
+ local dt = time - prevTime
+ prevTime = time
+ update(dt)
+ window:swapBuffers()
+ glfw.PollEvents()
+ end
+end
+
+
function terminate()
glfw.Terminate()
end
-return hinit
+return module
diff --git a/honey/shader.lua b/honey/shader.lua
index 1fb9f5b..083b260 100644
--- a/honey/shader.lua
+++ b/honey/shader.lua
@@ -15,11 +15,26 @@ local function compileShader(source, type)
return shader
end
+local function readFile(filename)
+ local f, err = io.open(filename)
+ if not f then error(err) end
+ local str = f:read("*a")
+ f:close()
+ return str
+end
+
function Shader.new(_, sources)
local self = {}
self.locations = {}
self.links = {}
+ if sources.vertexFile then
+ sources.vertex = readFile(sources.vertexFile)
+ end
+ if sources.fragmentFile then
+ sources.fragment = readFile(sources.fragmentFile)
+ end
+
local shaders = {}
if sources.vertex then
table.insert(shaders, compileShader(sources.vertex, gl.VERTEX_SHADER))
diff --git a/honey/std.lua b/honey/std.lua
index 028a2a8..7cb7695 100644
--- a/honey/std.lua
+++ b/honey/std.lua
@@ -1,6 +1,7 @@
local init = require 'honey.init'
honey.init = init.init
+honey.loop = init.loop
honey.terminate = init.terminate
honey.ecs = require 'honey.ecs'
diff --git a/main.lua b/main.lua
index 8dd9207..0019711 100644
--- a/main.lua
+++ b/main.lua
@@ -1,6 +1,5 @@
require 'honey.std'
-
local glfw = honey.glfw
local gl = honey.gl
local Vec3 = honey.Vec3
@@ -9,86 +8,41 @@ local ecs = honey.ecs
local systems = honey.standardSystems
--- camera matrices
+-- initialize honey
+local window = honey.init()
+
+-- create camera matrices
local camera = {
view=Mat4():identity():translate(Vec3{0, 0, -60}),
projection=Mat4():perspective(math.rad(45), 640/480, 0.1, 100),
}
-
-
+-- setup ecs
local level = ecs.Level()
level:addSystem(systems.transformCascade)
level:addSystem(systems.renderCam(camera))
level:addSystem(systems.update)
-
-
-local window = honey.init()
-gl.Enable(gl.DEPTH_TEST)
-
-
-
-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);
-}
-]]
-
+-- create shader
local shader = honey.Shader{
- vertex = vertexShaderSource,
- fragment = fragmentShaderSource,
+ vertexFile = "vertex.glsl",
+ fragmentFile = "fragment.glsl",
}
+-- load models
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]
-
+-- update function for each entity
function updateTransform(self, dt)
self.transform:rotateY(0.3 * math.pi * dt)
self.transform:rotateX(0.1 * math.pi * dt)
end
-
+-- create entities
function growLine(prev, depth)
if depth == 0 then return prev end
@@ -104,7 +58,6 @@ function growLine(prev, depth)
return growLine(entity, depth-1)
end
-
local leaf = {
transform=Mat4():identity():translate(Vec3{2, 0, 0}),
parent=false,
@@ -114,28 +67,19 @@ local leaf = {
local root = growLine(leaf, 24)
level:addEntity(root)
-
+-- close window on ESCAPE key
window:setKeyCallback(function(_, key)
if key == glfw.KEY_ESCAPE then
window:setShouldClose(true)
end
end)
-
-
-local prevTime = 0
-while not window:shouldClose() do
- local time = glfw.GetTime()
- local dt = time - prevTime
- prevTime = time
-
+-- main loop
+honey.loop(window, function(dt)
gl.ClearColor(0.2, 0.4, 1.0, 1.0)
gl.Clear(gl.COLOR_BUFFER_BIT + gl.DEPTH_BUFFER_BIT)
-
level:update(dt)
+end)
- window:swapBuffers()
- glfw.PollEvents()
-end
-
+-- clean up
honey.terminate()
diff --git a/vertex.glsl b/vertex.glsl
new file mode 100644
index 0000000..1e9fb67
--- /dev/null
+++ b/vertex.glsl
@@ -0,0 +1,21 @@
+#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;
+}