rut_mesh_t * rut_mesh_copy(rut_mesh_t *mesh) { rut_buffer_t **buffers; int n_buffers = 0; rut_buffer_t **attribute_buffers; rut_buffer_t **attribute_buffers_map; rut_attribute_t **attributes; rut_mesh_t *copy; int i; buffers = c_alloca(sizeof(void *) * mesh->n_attributes); attribute_buffers = c_alloca(sizeof(void *) * mesh->n_attributes); attribute_buffers_map = c_alloca(sizeof(void *) * mesh->n_attributes); /* NB: * attributes may refer to shared buffers so we need to first * figure out how many unique buffers the mesh refers too... */ for (i = 0; i < mesh->n_attributes; i++) { int j; for (j = 0; i < n_buffers; j++) if (buffers[j] == mesh->attributes[i]->buffered.buffer) break; if (j < n_buffers) attribute_buffers_map[i] = attribute_buffers[j]; else { attribute_buffers[n_buffers] = rut_buffer_new(mesh->attributes[i]->buffered.buffer->size); memcpy(attribute_buffers[n_buffers]->data, mesh->attributes[i]->buffered.buffer->data, mesh->attributes[i]->buffered.buffer->size); attribute_buffers_map[i] = attribute_buffers[n_buffers]; buffers[n_buffers++] = mesh->attributes[i]->buffered.buffer; } } attributes = c_alloca(sizeof(void *) * mesh->n_attributes); for (i = 0; i < mesh->n_attributes; i++) { if (mesh->attributes[i]->is_buffered) { attributes[i] = rut_attribute_new(attribute_buffers_map[i], mesh->attributes[i]->name, mesh->attributes[i]->buffered.stride, mesh->attributes[i]->buffered.offset, mesh->attributes[i]->buffered.n_components, mesh->attributes[i]->buffered.type); } else { attributes[i] = rut_attribute_new_const(mesh->attributes[i]->name, mesh->attributes[i]->constant.n_components, mesh->attributes[i]->constant.n_columns, mesh->attributes[i]->constant.transpose, mesh->attributes[i]->constant.value); } attributes[i]->normalized = mesh->attributes[i]->normalized; attributes[i]->instance_stride = mesh->attributes[i]->instance_stride; } copy = rut_mesh_new(mesh->mode, mesh->n_vertices, attributes, mesh->n_attributes); for (i = 0; i < mesh->n_attributes; i++) rut_object_unref(attributes[i]); if (mesh->indices_buffer) { rut_buffer_t *indices_buffer = rut_buffer_new(mesh->indices_buffer->size); memcpy(indices_buffer->data, mesh->indices_buffer->data, mesh->indices_buffer->size); rut_mesh_set_indices( copy, mesh->indices_type, indices_buffer, mesh->n_indices); rut_object_unref(indices_buffer); } return copy; }
static RutMesh * mesh_new_grid (CoglVerticesMode mode, int n_vertices, int n_indices, GridVertex *vertices, unsigned int *indices) { RutMesh *mesh; RutAttribute *attributes[10]; RutBuffer *vertex_buffer; RutBuffer *index_buffer; vertex_buffer = rut_buffer_new (sizeof (GridVertex) * n_vertices); index_buffer = rut_buffer_new (sizeof (unsigned int) * n_indices); memcpy (vertex_buffer->data, vertices, sizeof (GridVertex) * n_vertices); memcpy (index_buffer->data, indices, sizeof (unsigned int) * n_indices); attributes[0] = rut_attribute_new (vertex_buffer, "cogl_position_in", sizeof (GridVertex), offsetof (GridVertex, x0), 2, RUT_ATTRIBUTE_TYPE_FLOAT); attributes[1] = rut_attribute_new (vertex_buffer, "cogl_tex_coord0_in", sizeof (GridVertex), offsetof (GridVertex, s0), 2, RUT_ATTRIBUTE_TYPE_FLOAT); attributes[2] = rut_attribute_new (vertex_buffer, "cogl_tex_coord1_in", sizeof (GridVertex), offsetof (GridVertex, s3), 2, RUT_ATTRIBUTE_TYPE_FLOAT); attributes[3] = rut_attribute_new (vertex_buffer, "cogl_tex_coord4_in", sizeof (GridVertex), offsetof (GridVertex, s3), 2, RUT_ATTRIBUTE_TYPE_FLOAT); attributes[4] = rut_attribute_new (vertex_buffer, "cogl_tex_coord7_in", sizeof (GridVertex), offsetof (GridVertex, s3), 2, RUT_ATTRIBUTE_TYPE_FLOAT); attributes[5] = rut_attribute_new (vertex_buffer, "cogl_tex_coord11_in", sizeof (GridVertex), offsetof (GridVertex, s0), 2, RUT_ATTRIBUTE_TYPE_FLOAT); attributes[6] = rut_attribute_new (vertex_buffer, "cogl_normal_in", sizeof (GridVertex), offsetof (GridVertex, nx), 3, RUT_ATTRIBUTE_TYPE_FLOAT); attributes[7] = rut_attribute_new (vertex_buffer, "tangent_in", sizeof (GridVertex), offsetof (GridVertex, tx), 3, RUT_ATTRIBUTE_TYPE_FLOAT); attributes[8] = rut_attribute_new (vertex_buffer, "cell_xy", sizeof (GridVertex), offsetof (GridVertex, x1), 2, RUT_ATTRIBUTE_TYPE_FLOAT); attributes[9] = rut_attribute_new (vertex_buffer, "cell_st", sizeof (GridVertex), offsetof (GridVertex, s1), 4, RUT_ATTRIBUTE_TYPE_FLOAT); mesh = rut_mesh_new (mode, n_vertices, attributes, 10); rut_mesh_set_indices (mesh, COGL_INDICES_TYPE_UNSIGNED_INT, index_buffer, n_indices); g_free (vertices); g_free (indices); return mesh; }