int main(int, char**) { TrollEngine engine; GLFWWindow win(1280, 720, "TrollEngine GLFW Window", true, true); win.setResizeCallback([] (int w, int h) { glViewport(0, 0, w, h); }); win.showCursor(false); std::cout << win.context_info() << std::endl; glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glEnable(GL_BLEND); glBlendEquation(GL_FUNC_ADD); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glClearColor(0.2f, 0.2f, 0.2f, 1.f); glClearDepth(1.f); glDepthFunc(GL_LESS); ProgramBuilder pb; pb.vertexShader("vs.glsl") .fragmentShader("fs.glsl") .uniform("tex", ProgramBuilder::UniformType::Int) .uniform("modelView", ProgramBuilder::UniformType::Mat4) .uniform("camera", ProgramBuilder::UniformType::Mat4) .uniform("projection", ProgramBuilder::UniformType::Mat4); auto program = std::move(pb.build()); UBO<TextOptions> opts; opts.data = {true, false, false, 0.1f}; opts.upload_std140(); auto optsIndex = program.getUniformBlockIndex("Options"); program.uniformBlockBinding(optsIndex, 0); opts.bindBase(GL_UNIFORM_BUFFER, 0); auto texImg = GreyscaleImage::load("distanceField.png"); auto tex = Texture::fromImage(texImg); glm::mat4 p = glm::perspective(glm::radians(55.f), 16.f / 9.f, 0.1f, 100.f), t = glm::translate(glm::mat4(1.f), glm::vec3(-6.f, 0.f, -7.f)), r = glm::rotate(glm::mat4(1.f), 0.f, glm::vec3(0.f, 1.f, 0.f)), m = t * r; SceneGraph scene; vector<glm::vec2> uvs = stringTexCoords("Hello world!"); auto quadStrip = Mesh::quadStrip(uvs); auto quadStripObj = quadStrip->instantiate(m, &program, &tex); scene.addChild(quadStripObj); program.use(); auto ubTexture = program.getUniform("tex"), ubModelView = program.getUniform("modelView"), ubProjection = program.getUniform("projection"); auto uTexture = dynamic_cast<Uniform<int>*>(ubTexture); auto uModelView = dynamic_cast<Uniform<glm::mat4>*>(ubModelView); auto uProjection = dynamic_cast<Uniform<glm::mat4>*>(ubProjection); uTexture->set(0); uModelView->set(m); uProjection->set(p); win.registerKeyCallback('A', [&] () { opts.data.softenRange = min(opts.data.softenRange + 0.1f, 0.95f); opts.upload_std140(); }); win.registerKeyCallback('E', [&] () { opts.data.softenRange = max(opts.data.softenRange - 0.1f, 0.05f); opts.upload_std140(); }); while(!win.shouldClose()) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); scene.render(); win.swapBuffers(); win.pollEvents(); } }
int main(int, char**) { TrollEngine engine; GLFWWindow win(1280, 720, "TrollEngine GLFW Window", true, true); win.setResizeCallback([] (int w, int h) { glViewport(0, 0, w, h); }); win.showCursor(false); std::cout << win.context_info() << std::endl; glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glClearColor(0.f, 0.f, 0.f, 1.f); glClearDepth(1.f); glDepthFunc(GL_LESS); UBO<Material> uboMat; uboMat.data.Ka = glm::vec3(0.1f, 0.1f, 0.1f); uboMat.data.Ks = glm::vec3(0.4f, 0.4f, 0.4f); uboMat.data.alpha = 2.2f; uboMat.upload_std140(); UBO<Light> uboLight; uboLight.data.diffuseColor = glm::vec3(0.9f, 0.9f, 0.9f); uboLight.data.specularColor = glm::vec3(0.9f, 0.9f, 0.7f); uboLight.data.position = glm::vec3(5.f, 5.f, -5.f); uboLight.upload_std140(); Camera<TransformMat> camera; ProgramBuilder pb; pb.vertexShader("vs.glsl") .fragmentShader("fs.glsl") .uniform("tex", ProgramBuilder::UniformType::Int) .uniform("modelView", ProgramBuilder::UniformType::Mat4) .uniform("camera", ProgramBuilder::UniformType::Mat4) .uniform("cameraWorldPos", ProgramBuilder::UniformType::Vec3) .uniform("projection", ProgramBuilder::UniformType::Mat4) .uniform("normalTransform", ProgramBuilder::UniformType::Mat3); auto program = std::move(pb.build()); auto matIndex = program.getUniformBlockIndex("Material"), lightIndex = program.getUniformBlockIndex("Light"); program.uniformBlockBinding(matIndex, 0); program.uniformBlockBinding(lightIndex, 1); uboMat.bindBase(GL_UNIFORM_BUFFER, 0); uboLight.bindBase(GL_UNIFORM_BUFFER, 1); auto tex = Texture::fromImage(RGBImage::load("metal.jpg")); SceneImporter imp; imp.readFile("teapot.obj", SceneImporter::PostProcess::JoinVertices | SceneImporter::PostProcess::GenerateNormals | SceneImporter::PostProcess::FlipWindingOrder); std::unique_ptr<Mesh> teapot = imp.instantiateMesh(*imp.meshes()[0]); std::unique_ptr<Mesh> top = imp.instantiateMesh(*imp.meshes()[1]); SceneGraph scene; auto teapotNode = teapot->instantiate(glm::mat4(1.f), &program); auto topNode = top->instantiate(glm::mat4(1.f), &program); teapotNode->set_texture(&tex); topNode->set_texture(&tex); scene.addChild(teapotNode); scene.addChild(topNode); float theta = 0.f, dt = 0.1f; glm::mat4 p = glm::perspective(glm::radians(55.f), 16.f / 9.f, 0.1f, 100.f), t = glm::translate(glm::mat4(1.f), glm::vec3(0.f, -.5f, -2.f)), s = glm::scale(glm::mat4(1.f), glm::vec3(1.f/100, 1.f/100, 1.f/100)), r = glm::rotate(glm::mat4(1.f), 0.f, glm::vec3(0.f, 1.f, 0.f)), m = t * r * s; glm::mat3 nt = glm::inverseTranspose(glm::mat3(m)); glm::vec3 cameraWorldPos = glm::vec3(camera.transform().matrix()[3]); program.use(); auto ubTexture = program.getUniform("tex"), ubModelView = program.getUniform("modelView"), ubCamera = program.getUniform("camera"), ubCameraWorldPos = program.getUniform("cameraWorldPos"), ubProjection = program.getUniform("projection"), ubNormalTransform = program.getUniform("normalTransform"); auto uTexture = dynamic_cast<Uniform<int>*>(ubTexture); auto uModelView = dynamic_cast<Uniform<glm::mat4>*>(ubModelView); auto uCamera = dynamic_cast<Uniform<glm::mat4>*>(ubCamera); auto uCameraWorldPos = dynamic_cast<Uniform<glm::vec3>*>(ubCameraWorldPos); auto uProjection = dynamic_cast<Uniform<glm::mat4>*>(ubProjection); auto uNormalTransform = dynamic_cast<Uniform<glm::mat3>*>(ubNormalTransform); uTexture->set(0); uModelView->set(m); uCamera->set(camera.transform().matrix()); uCameraWorldPos->set(cameraWorldPos); uProjection->set(p); uNormalTransform->set(nt); win.registerKeyCallback('E', [&] () { theta += dt; r = glm::rotate(glm::mat4(1.f), theta, glm::vec3(0.f, 1.f, 0.f)), m = t * r * s; uModelView->set(m); }); win.registerKeyCallback('A', [&] () { theta -= dt; r = glm::rotate(glm::mat4(1.f), theta, glm::vec3(0.f, 1.f, 0.f)), m = t * r * s; uModelView->set(m); }); while(!win.shouldClose()) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); scene.render(); win.swapBuffers(); win.pollEvents(); } }