Ejemplo n.º 1
0
void BKE_mesh_texspace_copy_from_object(Mesh *me, Object *ob)
{
	float *texloc, *texrot, *texsize;
	short *texflag;

	if (BKE_object_obdata_texspace_get(ob, &texflag, &texloc, &texsize, &texrot)) {
		me->texflag = *texflag;
		copy_v3_v3(me->loc, texloc);
		copy_v3_v3(me->size, texsize);
		copy_v3_v3(me->rot, texrot);
	}
}
Ejemplo n.º 2
0
void RE_sample_point_density(Scene *scene, PointDensity *pd,
                             int resolution, float *values)
{
	const size_t resolution2 = resolution * resolution;
	Object *object = pd->object;
	size_t x, y, z;
	float min[3], max[3], dim[3], mat[4][4];

	if (object == NULL) {
		sample_dummy_point_density(resolution, values);
		return;
	}

	if (pd->source == TEX_PD_PSYS) {
		ParticleSystem *psys;
		if (pd->psys == 0) {
			sample_dummy_point_density(resolution, values);
			return;
		}
		psys = BLI_findlink(&object->particlesystem, pd->psys - 1);
		if (psys == NULL) {
			sample_dummy_point_density(resolution, values);
			return;
		}
		particle_system_minmax(scene, object, psys, pd->radius, min, max);
	}
	else {
		float radius[3] = {pd->radius, pd->radius, pd->radius};
		float *loc, *size;
		BKE_object_obdata_texspace_get(pd->object, NULL, &loc, &size, NULL);
		sub_v3_v3v3(min, loc, size);
		add_v3_v3v3(max, loc, size);
		/* Adjust texture space to include density points on the boundaries. */
		sub_v3_v3(min, radius);
		add_v3_v3(max, radius);
	}

	sub_v3_v3v3(dim, max, min);
	if (dim[0] <= 0.0f || dim[1] <= 0.0f || dim[2] <= 0.0f) {
		sample_dummy_point_density(resolution, values);
		return;
	}

	/* Same matricies/resolution as dupli_render_particle_set(). */
	unit_m4(mat);

	BLI_mutex_lock(&sample_mutex);
	cache_pointdensity_ex(scene, pd, mat, mat, 1, 1);
	for (z = 0; z < resolution; ++z) {
		for (y = 0; y < resolution; ++y) {
			for (x = 0; x < resolution; ++x) {
				size_t index = z * resolution2 + y * resolution + x;
				float texvec[3];
				float age, vec[3];
				TexResult texres;

				copy_v3_v3(texvec, min);
				texvec[0] += dim[0] * (float)x / (float)resolution;
				texvec[1] += dim[1] * (float)y / (float)resolution;
				texvec[2] += dim[2] * (float)z / (float)resolution;

				pointdensity(pd, texvec, &texres, &age, vec);
				pointdensity_color(pd, &texres, age, vec);

				copy_v3_v3(&values[index*4 + 0], &texres.tr);
				values[index*4 + 3] = texres.tin;
			}
		}
	}
	free_pointdensity(pd);
	BLI_mutex_unlock(&sample_mutex);
}