Beispiel #1
0
    SDGeometryHandle compile_geometry(SDRenderMode mode, SDVec2* vertices, SDuint numVertices, SDuint* indices, SDuint numIndices) {
        kglt::MeshID new_mesh = stage()->new_mesh();

        {
            auto mesh = stage()->mesh(new_mesh);
            auto submesh = mesh->new_submesh(
                stage()->get_material_with_alias("diffuse_render"),
                (mode == SD_RENDER_MODE_TRIANGLES) ? kglt::MESH_ARRANGEMENT_TRIANGLES : kglt::MESH_ARRANGEMENT_LINES, true
            );

            for(SDuint i = 0; i < numVertices; ++i) {
                mesh->shared_data().position(vertices[i]);
                mesh->shared_data().diffuse(kglt::Colour::WHITE);
                mesh->shared_data().move_next();
            }

            for(SDuint i = 0; i < numIndices; ++i) {
                mesh->submesh(submesh).index_data().index(indices[i]);
            }

            mesh->submesh(submesh).index_data().done();
            mesh->shared_data().done();

        }

        kglt::ActorID new_actor = stage()->new_actor(new_mesh);
        return new_actor.value();
    }
Beispiel #2
0
void Debug::draw_line(const Vec3 &start, const Vec3 &end, const Colour &colour, double duration, bool depth_test) {

    auto mesh = stage_.mesh(mesh_);

    DebugElement element;
    element.submesh = mesh->new_submesh(material_, MESH_ARRANGEMENT_LINE_STRIP, /*shares_vertices=*/ false);
    element.colour = colour;
    element.duration = duration;
    element.depth_test = depth_test;
    element.type = DebugElementType::DET_LINE;

    auto& submesh = mesh->submesh(element.submesh);

    submesh.vertex_data().move_to_start();
    submesh.vertex_data().position(start);
    submesh.vertex_data().diffuse(colour);
    submesh.vertex_data().move_next();

    submesh.vertex_data().position(end);
    submesh.vertex_data().diffuse(colour);
    submesh.vertex_data().done();

    submesh.index_data().index(0);
    submesh.index_data().index(1);
    submesh.index_data().done();

    elements_.push_back(element);
}
Beispiel #3
0
void Boid::enable_debug(bool value) {
    assert(actor_);
    Stage* stage = actor_->stage();
    assert(stage);

    if(value) {
        if(!debug_mesh_) {
            debug_mesh_ = stage->new_mesh();
        }

        auto mesh = stage->mesh(debug_mesh_).lock();
        mesh->clear();

        auto smi = mesh->new_submesh(kglt::MaterialID(), MESH_ARRANGEMENT_LINE_STRIP, false);
        normal_points_mesh_ = mesh->new_submesh(kglt::MaterialID(), MESH_ARRANGEMENT_POINTS, false);

        {
            auto mat = stage->material(mesh->submesh(normal_points_mesh_).material_id());
            mat->technique().pass(0).set_point_size(5);
        }

        for(uint32_t i = 0; i < path_.length(); ++i) {
            mesh->submesh(smi).vertex_data().position(path_.point(i));
            mesh->submesh(smi).vertex_data().diffuse(kglt::Colour::blue);
            mesh->submesh(smi).vertex_data().tex_coord0(kglt::Vec2());
            mesh->submesh(smi).vertex_data().tex_coord1(kglt::Vec2());
            mesh->submesh(smi).vertex_data().normal(kglt::Vec3());
            mesh->submesh(smi).vertex_data().move_next();

            mesh->submesh(smi).index_data().index(i);
        }

        mesh->submesh(smi).vertex_data().done();
        mesh->submesh(smi).index_data().done();

        if(!debug_actor_) {
            debug_actor_ = stage->new_actor(debug_mesh_);
        }
    } else {
        stage->delete_actor(debug_actor_);

        debug_actor_ = kglt::ActorID();
        debug_mesh_ = kglt::MeshID();
    }
}
Beispiel #4
0
MeshID ResourceManagerImpl::new_mesh_from_vertices(const std::vector<Vec3> &vertices, MeshArrangement arrangement, bool garbage_collect) {
    //FIXME: THis is literally a copy/paste of the function above, we can templatize this
    MeshID m = new_mesh(garbage_collect);

    auto new_mesh = mesh(m);
    auto smi = new_mesh->new_submesh(arrangement);
    int i = 0;
    for(auto v: vertices) {
        new_mesh->shared_data().position(v);
        new_mesh->shared_data().diffuse(kglt::Colour::WHITE);
        new_mesh->shared_data().normal(kglt::Vec3());
        new_mesh->shared_data().tex_coord0(kglt::Vec2());
        new_mesh->shared_data().move_next();
        new_mesh->submesh(smi)->index_data().index(i++);
    }

    new_mesh->shared_data().done();
    new_mesh->submesh(smi)->index_data().done();
    MeshManager::mark_as_uncollected(m);
    return m;
}