[Bf-blender-cvs] [4478808] mathutils_bvhtree: mathutils_bvhtree: Support various types of DerivedMesh data, based on requested settings.
Lukas Tönne
noreply at git.blender.org
Wed Apr 29 11:30:54 CEST 2015
Commit: 44788083c11f6a264f73fc6d10a3b9e9dfdad607
Author: Lukas Tönne
Date: Wed Apr 29 10:12:35 2015 +0200
Branches: mathutils_bvhtree
https://developer.blender.org/rB44788083c11f6a264f73fc6d10a3b9e9dfdad607
mathutils_bvhtree: Support various types of DerivedMesh data, based on
requested settings.
===================================================================
M source/blender/python/mathutils/mathutils_bvhtree.c
===================================================================
diff --git a/source/blender/python/mathutils/mathutils_bvhtree.c b/source/blender/python/mathutils/mathutils_bvhtree.c
index 656bc9b..7ac3e85 100644
--- a/source/blender/python/mathutils/mathutils_bvhtree.c
+++ b/source/blender/python/mathutils/mathutils_bvhtree.c
@@ -76,6 +76,58 @@ typedef struct {
/* -------------------------------------------------------------------- */
/* Utility helper functions */
+/* return various derived meshes based on requested settings */
+static DerivedMesh *bvh_get_derived_mesh(const char *funcname, struct Scene *scene, Object *ob, bool use_deform, bool use_render, bool use_cage)
+{
+ /* we only need minimum mesh data for topology and vertex locations */
+ CustomDataMask mask = CD_MASK_BAREMESH;
+
+ /* Write the display mesh into the dummy mesh */
+ if (use_deform) {
+ if (use_render) {
+ if (use_cage) {
+ PyErr_Format(PyExc_ValueError,
+ "%s(...): cage arg is unsupported when (render=True)", funcname);
+ return NULL;
+ }
+ else {
+ return mesh_create_derived_render(scene, ob, mask);
+ }
+ }
+ else {
+ if (use_cage) {
+ return mesh_get_derived_deform(scene, ob, mask); /* ob->derivedDeform */
+ }
+ else {
+ return mesh_get_derived_final(scene, ob, mask); /* ob->derivedFinal */
+ }
+ }
+ }
+ else {
+ /* !use_deform */
+ if (use_render) {
+ if (use_cage) {
+ PyErr_Format(PyExc_ValueError,
+ "%s(...): cage arg is unsupported when (render=True)", funcname);
+ return NULL;
+ }
+ else {
+ return mesh_create_derived_no_deform_render(scene, ob, NULL, mask);
+ }
+ }
+ else {
+ if (use_cage) {
+ PyErr_Format(PyExc_ValueError,
+ "%s(...): cage arg is unsupported when (deform=False, render=False)", funcname);
+ return NULL;
+ }
+ else {
+ return mesh_create_derived_no_deform(scene, ob, NULL, mask);
+ }
+ }
+ }
+}
+
static int dm_tessface_to_poly_index(DerivedMesh *dm, int tessface_index)
{
if (tessface_index != ORIGINDEX_NONE && tessface_index < dm->getNumTessFaces(dm)) {
@@ -183,55 +235,70 @@ PyTypeObject PyBVHTree_Type = {
static int PyBVHTreeDerivedMesh__tp_init(PyBVHTree_DerivedMesh *self, PyObject *args, PyObject *kwargs)
{
BVHTreeFromMesh *meshdata = &self->meshdata;
- const char *keywords[] = {"object", "type", NULL};
+ const char *keywords[] = {"object", "scene", "type", "deform", "render", "cage", NULL};
- PyObject *py_ob;
+ PyObject *py_ob, *py_scene;
Object *ob;
+ struct Scene *scene;
+ DerivedMesh *dm;
const char *type = "POLYS";
+ int use_deform = true;
+ int use_render = false;
+ int use_cage = false;
+ bool success;
if (PyBVHTree_Type.tp_init((PyObject *)self, args, kwargs) < 0)
return -1;
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, (char *)"O|s:BVHTreeDerivedMesh", (char **)keywords,
- &py_ob, &type))
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, (char *)"OO|siii:BVHTreeDerivedMesh", (char **)keywords,
+ &py_ob, &py_scene, &type, &use_deform, &use_render, &use_cage))
{
return -1;
}
ob = PyC_RNA_AsPointer(py_ob, "Object");
- if (!ob) {
+ scene = PyC_RNA_AsPointer(py_scene, "Scene");
+ if (!ob || !scene) {
return -1;
}
+ self->ob = ob;
- if (ob->derivedFinal == NULL) {
- PyErr_Format(PyExc_ValueError, "Object '%.200s' has no mesh data to be used for BVH tree", ob->id.name + 2);
+ dm = bvh_get_derived_mesh("BVHTree", scene, ob, use_deform, use_render, use_cage);
+ if (!dm) {
return -1;
}
- self->ob = ob;
-
if (STREQ(type, "FACES")) {
- bvhtree_from_mesh_faces(meshdata, ob->derivedFinal, 0.0f, 4, 6);
+ bvhtree_from_mesh_faces(meshdata, dm, 0.0f, 4, 6);
self->use_poly_index = false;
+ success = true;
}
else if (STREQ(type, "POLYS")) {
- bvhtree_from_mesh_faces(meshdata, ob->derivedFinal, 0.0f, 4, 6);
+ bvhtree_from_mesh_faces(meshdata, dm, 0.0f, 4, 6);
self->use_poly_index = true;
+ success = true;
}
else if (STREQ(type, "VERTS")) {
- bvhtree_from_mesh_verts(meshdata, ob->derivedFinal, 0.0f, 4, 6);
+ bvhtree_from_mesh_verts(meshdata, dm, 0.0f, 4, 6);
self->use_poly_index = false;
+ success = true;
}
else if (STREQ(type, "EDGES")) {
- bvhtree_from_mesh_edges(meshdata, ob->derivedFinal, 0.0f, 4, 6);
+ bvhtree_from_mesh_edges(meshdata, dm, 0.0f, 4, 6);
self->use_poly_index = false;
+ success = true;
}
else {
PyErr_Format(PyExc_ValueError, "'type' must be 'FACES', 'POLYS', 'VERTS' or 'EDGES', not '%.200s'", type);
- return -1;
+ success = false;
}
- return 0;
+ dm->release(dm);
+
+ if (success)
+ return 0;
+ else
+ return -1;
}
static void PyBVHTreeDerivedMesh__tp_dealloc(PyBVHTree_DerivedMesh *self)
@@ -418,7 +485,6 @@ PyTypeObject PyBVHTreeDerivedMesh_Type = {
/* -------------------------------------------------------------------- */
/* BVHTreeBMesh */
-
static int PyBVHTreeBMesh__tp_init(PyBVHTree_BMesh *self, PyObject *args, PyObject *kwargs)
{
const char *keywords[] = {"bm", NULL};
More information about the Bf-blender-cvs
mailing list