Example #1
0
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();
    }
}
Example #2
0
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();
    }
}