diff options
Diffstat (limited to 'main.lua')
-rw-r--r-- | main.lua | 231 |
1 files changed, 44 insertions, 187 deletions
@@ -1,197 +1,54 @@ require 'honey.std' --- initialize honey -window = honey.init() -window:setInputMode(glfw.CURSOR, glfw.CURSOR_DISABLED) - --- setup vector graphics -local vg = nvg.CreateContext() -local november = nvg.CreateFont(vg, "November", "assets/november.regular.ttf") -local vw, vh = 640, 480 - --- setup physics -local space = ode.HashSpaceCreate(ode.Space0) -local world = ode.WorldCreate() -ode.WorldSetGravity(world, 0, -10, 0) -ode.WorldSetCFM(world, 1e-5) -local physicsGc = honey.util.gc_canary(function() - ode.SpaceDestroy(space) - ode.WorldDestroy(world) -end) - - --- setup ecs -local entities = honey.ecs.EntityDb() -local systems = honey.ecs.SystemDb(entities) -local script = honey.ecs.script -systems:addSystem(honey.ecs.node.system) -systems:addSystem(honey.ecs.render.system) -systems:addSystem(honey.ecs.script.system) -systems:addSystem(honey.ecs.collision.system, {space=space}) -systems:addSystem(honey.ecs.physics.system, {space=space, world=world}) - -function setupEntities() - local terrain = entities:createEntityWithComponents{ - node = { - matrix = Mat4():identity():translate(Vec3{4,0,0}), - }, - renderMesh = { - textures = { - ourTexture = { - filename = "assets/green+grass-1024x1024.jpg", - }, - }, - shader = { - vertex = "vertex.glsl", - fragment = "fragment.glsl", - }, - mesh = { filename = "assets/terrain.obj", index=1 }, - }, - collision = { - class = "trimesh", - filename = "assets/terrain.obj", - }, - } - --- local plane = entities:createEntity() --- entities:addComponents(plane, { --- node = { --- matrix = Mat4() --- :identity() --- :rotateZ(math.rad(5)) --- }, --- collision = { --- class = "plane", --- }, --- }) --- --- local planeMesh = entities:createEntityWithComponents{ --- node = { --- parent = plane, --- matrix = Mat4():identity():rotateX(0.5*math.pi):scale(Vec3{20,20,20}), --- }, --- renderMesh = { --- textures = { --- ourTexture={ --- filename="assets/green+grass-1024x1024.jpg" --- } --- }, --- shader = { vertex="vertex.glsl", fragment="fragment.glsl" }, --- mesh = { filename="builtin.quad", index=1 }, --- }, --- } - - - - local id = entities:createEntity() - entities:addComponents(id, { - renderMesh = { - textures = { - ourTexture={ filename="77155.png" } - }, - shader = { vertex="vertex.glsl", fragment="fragment.glsl" }, - mesh = { filename="assets/icosahedron.obj", index=1 }, - }, - node = { - matrix = Mat4() - :identity() - :translate(Vec3{0,1,0}) - :rotateZ(math.rad(45)), - }, - collision = { - class = "sphere", - radius = 1, - }, - physics = { - mass = { - class = "sphere", - density = 1, - radius = 1, - }, - surface = true, - velocity = Vec3{ 0, 0, 0 }, - angularVelocity = Vec3{ 0, 0, 0 }, - }, - }) - - local id2 = entities:createEntity() - entities:addComponents(id2, { - renderMesh = { - shader = { vertex="vertex.glsl", fragment="fragment.glsl" }, - --mesh = { filename="assets/tetrahedron.obj", index=1 }, - mesh = { filename="builtin.quad", index=1 }, - }, - node = { - parent=id, - matrix=Mat4():identity():translate(Vec3{0, 2, 0}), - }, - }) - - local quad = entities:createEntity() - entities:addComponents(quad, { - renderQuad = { - shader = { vertex="vertex.glsl", fragment="fragment.glsl" }, - textures = { ourTexture = { filename = "44d9a0ec1c18e6126a5e9d9d9317f5ac.png" } }, - }, - }) - - require('character')(entities) - - local skybox = entities:createEntityWithComponents{ - node = { - matrix = Mat4():identity():scale(Vec3{2,2,2}):rotateX(math.rad(90)) - }, - renderMesh = { - mesh = { - filename="assets/skybox.obj", - index=1, - }, - shader = { vertex="vertex.glsl", fragment="fragment.glsl" }, - textures = { - ourTexture = { - filename = "assets/skyboxsun5deg2_tn.jpg" - --filename = "assets/skybox.png" - } - }, - }, - } - - local misc = entities:createEntityWithComponents{ - onKey = { script = "scripts.loadSaveQuit" }, - onFramebufferSize = { script = "scripts.viewportResize" }, - } -end -setupEntities() +local gl = honey.gl - --- connect event handler scripts -window:bindEvents(entities) - ---entities:load("save") - - --- main loop -local time = 0 -honey.loop(window, function(dt) - time = time + dt - if time > 1 then - time = time-1 - print(collectgarbage("count")) - end +-- initialize honey +honey.init() + + +local db = honey.ecs.EntityDb() +local systems = honey.ecs.SystemDb(db) + +systems:addSystems(honey.ecs.node.system) +systems:addSystems(honey.ecs.render.system) +systems:addSystems(honey.ecs.script.system) + +-- camera +db:createEntityWithComponents{ + node = { + matrix = Mat4() + :identity() + :translate(Vec3{0,0,10}), + }, + camera = { + projection = Mat4() + :perspective(90, 640/480, 0.1, 1000) + }, +} + +-- mesh +db:createEntityWithComponents{ + node = { + matrix = Mat4() + :identity(), + }, + renderMesh = { + mesh = { + filename = "assets/dodecahedron.obj", + index = 1, + }, + textures = { + ourTexture = { filename = "assets/green-grass.jpg" }, + }, + shader = { vertex="vertex.glsl", fragment="fragment.glsl" }, + }, +} + +honey.loop(function(dt) gl.ClearColor(0.2, 0.4, 1.0, 1.0) gl.Clear(gl.COLOR_BUFFER_BIT + gl.DEPTH_BUFFER_BIT + gl.STENCIL_BUFFER_BIT) - - gl.Enable(gl.DEPTH_TEST) - gl.Disable(gl.CULL_FACE) - systems:update(dt) - nvg.BeginFrame(vg, vw, vh, 1.0) - nvg.StrokeColor(vg, nvg.RGBf(1, 1, 1)) - nvg.FontFace(vg, "November") - nvg.Text(vg, 50, 50, "fps: "..tostring(math.floor(1/dt))) - nvg.EndFrame(vg) end) - -- clean up honey.terminate() |