void generate_geometries(vector<Geometry*>& geometries) { num_triangles = 0; num_object = geometries.size(); for (int i = 0; i < num_object; ++i) num_triangles += geometries[i]->vertex.size() / 3; float* vertex_buffer = new float[num_triangles * 9]; float* normal_buffer = new float[num_triangles * 9]; float* tex_buffer = new float[num_triangles * 6]; float* index_buffer = new float[num_triangles]; float* material = new float[21 * num_object]; float* v_ptr = vertex_buffer, *n_ptr = normal_buffer, *m_ptr = material, *t_ptr = tex_buffer; int s = 0; for (int i = 0; i < num_object; ++i) { if (use_bvh) { geometries[i]->applyTransform(); memcpy(v_ptr, geometries[i]->t_vertex.data(), geometries[i]->t_vertex.size() * 3 * sizeof(float)); v_ptr += geometries[i]->vertex.size() * 3; memcpy(n_ptr, geometries[i]->t_normal.data(), geometries[i]->t_normal.size() * 3 * sizeof(float)); n_ptr += geometries[i]->t_normal.size() * 3; } else { memcpy(v_ptr, geometries[i]->vertex.data(), geometries[i]->vertex.size() * 3 * sizeof(float)); v_ptr += geometries[i]->vertex.size() * 3; memcpy(n_ptr, geometries[i]->normal.data(), geometries[i]->normal.size() * 3 * sizeof(float)); n_ptr += geometries[i]->normal.size() * 3; } memcpy(t_ptr, geometries[i]->uv.data(), geometries[i]->uv.size() * 2 * sizeof(float)); t_ptr += geometries[i]->uv.size() * 2; *m_ptr++ = geometries[i]->kd; *m_ptr++ = geometries[i]->ks; *m_ptr++ = geometries[i]->tex; *m_ptr++ = geometries[i]->offset.x; *m_ptr++ = geometries[i]->offset.y; *m_ptr++ = geometries[i]->offset.z; *m_ptr++ = geometries[i]->x_axis.x; *m_ptr++ = geometries[i]->x_axis.y; *m_ptr++ = geometries[i]->x_axis.z; *m_ptr++ = geometries[i]->y_axis.x; *m_ptr++ = geometries[i]->y_axis.y; *m_ptr++ = geometries[i]->y_axis.z; *m_ptr++ = geometries[i]->s.x; *m_ptr++ = geometries[i]->s.y; *m_ptr++ = geometries[i]->s.z; for (int j = s / 3; j < s / 3 + geometries[i]->vertex.size() / 3; ++j) index_buffer[j] = i; s += geometries[i]->vertex.size(); *m_ptr++ = s; *m_ptr++ = geometries[i]->ka; *m_ptr++ = geometries[i]->kr; *m_ptr++ = geometries[i]->kf; *m_ptr++ = geometries[i]->nr; *m_ptr++ = geometries[i]->alpha; } BVH* bvh = new BVH(vertex_buffer, normal_buffer, tex_buffer, index_buffer, num_triangles); vector<float> bvh_buffer; bvh->genBuffer(bvh_buffer); mesh_texture = create_texture_2D(vertex_buffer, 9, num_triangles, mesh_texture); normal_texture = create_texture_2D(normal_buffer, 9, num_triangles, normal_texture); material_texture = create_texture_2D(material, 21, num_object, material_texture); tex_texture = create_texture_2D(tex_buffer, 6, num_triangles, tex_texture); index_texture = create_texture(index_buffer, num_triangles, index_texture); bvh_texture = create_texture_2D(bvh_buffer.data(), 11, bvh_buffer.size() / 11, bvh_texture); sampler_texture = create_texture(samples, 2 * SAMPLE_SIZE * SAMPLE_SIZE + 2, sampler_texture); num_bvh = bvh_buffer.size() / 11; delete[] vertex_buffer; delete[] normal_buffer; delete[] tex_buffer; delete[] material; }