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 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() -- 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 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()