int main(int argc,char *argv[])
{
	gtk_init(&argc,&argv);
	initialize();
	signals();
	packing();
	gtk_widget_show_all(window);
	gtk_main();
}
Esempio n. 2
0
int Msg_util::err_packing(const char* err_info, char* msg)
{
	Msg_field fields((char*) "ERR", (char*) "", (char*) "", err_info);
	return packing(&fields, msg);
}
Esempio n. 3
0
void Map::update_tile(int x_pos, int y_pos, const std::string layer_name, const std::string tile_name) {
    int tile_id = -1;
    std::shared_ptr<TileSet> tileset;
    for (std::shared_ptr<TileSet> tileset_i : tilesets) {
        try {
            tile_id = tileset_i->get_atlas()->get_name_index(tile_name);
            tileset = tileset_i;
            break;
        } catch (std::exception) {
            continue;
        }
    }
    if (tile_id == -1) {
        // Tile not found.
        throw std::runtime_error("Tile not found: " + tile_name);
    }

    // Build the data for the update
    GLfloat *data;
    size_t data_size(sizeof(GLfloat) * num_tile_dimensions * num_tile_vertices);

    // Get a buffer for the data
    try {
        data = new GLfloat[data_size];
    }
    catch(std::bad_alloc& ba) {
        LOG(ERROR) << "Couldn't allocate memory in Map::update_tile";
        return;
    }

    // Get the texture coordinates for this tile
    // GLfloat *tileset_ptr = &tileset_tex_coords[(tile_id)*8]; //*8 as 8 coordinates per tile
    std::tuple<float,float,float,float> coords(tileset->get_atlas()->index_to_coords(tile_id));

    //bottom left
    data[0]  = std::get<0>(coords);
    data[1]  = std::get<2>(coords);

    //top left
    data[2]  = std::get<0>(coords);
    data[3]  = std::get<3>(coords);

    //bottom right
    data[4]  = std::get<1>(coords);
    data[5]  = std::get<2>(coords);

    //top left
    data[6]  = std::get<0>(coords);
    data[7]  = std::get<3>(coords);

    //top right
    data[8]  = std::get<1>(coords);
    data[9]  = std::get<3>(coords);

    //bottom right
    data[10] = std::get<1>(coords);
    data[11] = std::get<2>(coords);


    // Find the layer from the layer name name.
    std::shared_ptr<Layer> layer;
    int layer_num;
    for (unsigned int i = 0; i < layer_ids.size(); i++) {
        std::shared_ptr<Layer> layer_test(ObjectManager::get_instance().get_object<Layer>(layer_ids[i]));
        if (layer_test->get_name() == layer_name) {
            layer = layer_test;
            layer_num = i;
            break;
        }
    }

    if (!layer) {
        throw std::runtime_error("Layer not found: " + layer_name);
    }

    // Put it into the buffers

    Layer::Packing packing(layer->get_packing());

    // Add this tile to the layer data structure
    layer->update_tile(x_pos, y_pos, tile_id, tileset);

    int tile_offset;

    // Perform O(1) update. no need to do mapping changes
    if (packing == Layer::Packing::DENSE) {
        tile_offset = y_pos * map_width + x_pos;

        // Update the buffer
        // Just update that tile directly
        RenderableComponent *renderable_component(layer->get_renderable_component());
        renderable_component->update_texture_buffer(
            sizeof(GLfloat) * tile_offset * num_tile_vertices * num_tile_dimensions,
            data_size,
            data
        );
    }
    else {
        // TODO: create a small buffer to hold these updates rather than rebuilding the entire buffer

        // Generate the new tile's data
        GLfloat* vertex_data = nullptr;

        // Get a buffer for the data
        try {
            vertex_data = new GLfloat[data_size];
        }
        catch(std::bad_alloc& ba) {
            LOG(ERROR) << "Couldn't allocate memory in Map::update_tile";
            data = nullptr;
            return;
        }

        // Set the needed data

        // bottom left
        vertex_data[0]  = float(x_pos);
        vertex_data[1]  = float(y_pos);

        // top left
        vertex_data[2]  = float(x_pos);
        vertex_data[3]  = float(y_pos + 1);

        // bottom right
        vertex_data[4]  = float(x_pos + 1);
        vertex_data[5]  = float(y_pos);

        // top left
        vertex_data[6]  = float(x_pos);
        vertex_data[7]  = float(y_pos + 1);

        // top right
        vertex_data[8]  = float(x_pos + 1);
        vertex_data[9]  = float(y_pos + 1);

        // bottom right
        vertex_data[10] = float(x_pos + 1);
        vertex_data[11] = float(y_pos);

        // Fetch the offset from the data buffer
        // Tile offset in floats
        int offset((*layer_mappings[layer_num])[y_pos*map_width + x_pos]);

        // Recalculate the layer mappings
        bool overwrite(recalculate_layer_mappings(x_pos, y_pos, layer_num));

        // TODO: small buffer
        // Get the data
        RenderableComponent* layer_renderable_component(layer->get_renderable_component());

        GLfloat* layer_texture_data(layer_renderable_component->get_texture_coords_data());
        GLfloat* layer_vertex_data (layer_renderable_component->get_vertex_data());

        size_t texture_data_size(layer_renderable_component->get_texture_coords_data_size());
        size_t vertex_data_size (layer_renderable_component->get_vertex_data_size());

        if (overwrite) {
            // We just need to overwrite the tile
            // Update the buffer
            // Just update that tile directly
            layer_renderable_component->update_texture_buffer(offset*sizeof(GLfloat), data_size, data);
        }
        else {
            // We need to insert the tile: expand the buffers

            //Generate the new buffers
            GLfloat *new_texture_data;
            GLfloat *new_vertex_data;
            int new_texture_data_size(int(texture_data_size + data_size));
            int new_vertex_data_size (int( vertex_data_size + data_size));

            try {
                new_texture_data = new GLfloat[new_texture_data_size];
                new_vertex_data  = new GLfloat[new_vertex_data_size];
            }
            catch(std::bad_alloc& ba) {
                LOG(ERROR) << "Couldn't allocate memory for new texture and vertex buffers in Map::update_tile";
                return;
            }

            //Copy the first part of the original data
            int data_length(num_tile_vertices * num_tile_dimensions);
            std::copy(layer_vertex_data, &layer_vertex_data[offset], new_vertex_data);
            std::copy(layer_texture_data, &layer_texture_data[offset], new_texture_data);

            //Insert the new data into the correct position
            std::copy(vertex_data, &vertex_data[data_length], &new_vertex_data[offset]);
            std::copy(data, &data[data_length], &new_texture_data[offset]);

            //Copy the rest of the original data
            std::copy(&layer_vertex_data[offset], &layer_vertex_data[vertex_data_size], &new_vertex_data[offset + data_length]);
            std::copy(&layer_texture_data[offset], &layer_texture_data[texture_data_size], &new_texture_data[offset + data_length]);

            //Set the new data
            layer_renderable_component->set_vertex_data(new_vertex_data, new_vertex_data_size, false);
            layer_renderable_component->set_num_vertices_render(new_texture_data_size / (int(sizeof(GLfloat)) * num_tile_dimensions));
            layer_renderable_component->set_texture_coords_data(new_texture_data, new_texture_data_size, false);
        }
        delete[] vertex_data;
    }
    delete[] data;
}