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