From eabf741a8d76aa9400a071c37227504378fc6315 Mon Sep 17 00:00:00 2001 From: Tamito Kajiyama Date: Mon, 28 May 2012 23:53:28 +0000 Subject: Fix for the WithinImageBorderUP1D predicate not working with a ViewEdge such that none of the SVertices are within the image boundary but an FEdge intersects with the image boundary. The problem was reported by edna through the BA Freestyle thread, with a .blend file for reproducing the bug. Thanks! --- .../BPy_WithinImageBoundaryUP1D.cpp | 88 ++++++++++++++++++++++ .../UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.h | 29 +++++++ 2 files changed, 117 insertions(+) create mode 100644 source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp create mode 100644 source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.h (limited to 'source/blender/freestyle/intern/python/UnaryPredicate1D') diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp new file mode 100644 index 00000000000..9beae103113 --- /dev/null +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp @@ -0,0 +1,88 @@ +#include "BPy_WithinImageBoundaryUP1D.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/////////////////////////////////////////////////////////////////////////////////////////// + +//------------------------INSTANCE METHODS ---------------------------------- + +static char WithinImageBoundaryUP1D___doc__[] = +"Class hierarchy: :class:`UnaryPredicate1D` > :class:`WithinImageBoundaryUP1D`\n" +"\n" +".. method:: __init__(xmin, ymin, xmax, ymax)\n" +"\n" +" Builds an WithinImageBoundaryUP1D object.\n" +"\n" +" :arg xmin: X lower bound of the image boundary.\n" +" :type xmin: float\n" +" :arg ymin: Y lower bound of the image boundary.\n" +" :type ymin: float\n" +" :arg xmax: X upper bound of the image boundary.\n" +" :type xmax: float\n" +" :arg ymax: Y upper bound of the image boundary.\n" +" :type ymax: float\n" +"\n" +".. method:: __call__(inter)\n" +"\n" +" Returns true if the Interface1D intersects with image boundary.\n"; + +static int WithinImageBoundaryUP1D___init__( BPy_WithinImageBoundaryUP1D* self, PyObject *args ) +{ + double xmin, ymin, xmax, ymax; + + if(!( PyArg_ParseTuple(args, "dddd", &xmin, &ymin, &xmax, &ymax) )) + return -1; + self->py_up1D.up1D = new Predicates1D::WithinImageBoundaryUP1D(xmin, ymin, xmax, ymax); + return 0; +} + +/*-----------------------BPy_TrueUP1D type definition ------------------------------*/ + +PyTypeObject WithinImageBoundaryUP1D_Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "WithinImageBoundaryUP1D", /* tp_name */ + sizeof(BPy_WithinImageBoundaryUP1D), /* tp_basicsize */ + 0, /* tp_itemsize */ + 0, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_reserved */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + WithinImageBoundaryUP1D___doc__, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + &UnaryPredicate1D_Type, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)WithinImageBoundaryUP1D___init__, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ +}; + +/////////////////////////////////////////////////////////////////////////////////////////// + +#ifdef __cplusplus +} +#endif diff --git a/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.h b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.h new file mode 100644 index 00000000000..2bd3e698a21 --- /dev/null +++ b/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.h @@ -0,0 +1,29 @@ +#ifndef FREESTYLE_PYTHON_WITHINIMAGEBOUNDARYUP1D_H +#define FREESTYLE_PYTHON_WITHINIMAGEBOUNDARYUP1D_H + +#include "../BPy_UnaryPredicate1D.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/////////////////////////////////////////////////////////////////////////////////////////// + +#include + +extern PyTypeObject WithinImageBoundaryUP1D_Type; + +#define BPy_WithinImageBoundaryUP1D_Check(v) ( PyObject_IsInstance( (PyObject *) v, (PyObject *) &WithinImageBoundaryUP1D_Type) ) + +/*---------------------------Python BPy_WithinImageBoundaryUP1D structure definition----------*/ +typedef struct { + BPy_UnaryPredicate1D py_up1D; +} BPy_WithinImageBoundaryUP1D; + +/////////////////////////////////////////////////////////////////////////////////////////// + +#ifdef __cplusplus +} +#endif + +#endif /* FREESTYLE_PYTHON_WITHINIMAGEBOUNDARYUP1D_H */ -- cgit v1.2.3