[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47145] branches/soc-2008-mxcurioni: Fix for the WithinImageBorderUP1D predicate not working with a ViewEdge such that

Bastien Montagne montagne29 at wanadoo.fr
Tue May 29 08:20:59 CEST 2012


Hi Tamito,

I’m getting that error when trying to build, at link time:

Linking CXX executable ../../bin/blender
../../lib/libbf_freestyle.a(BPy_UnaryPredicate1D.cpp.o): In function 
`UnaryPredicate1D_Init':
BPy_UnaryPredicate1D.cpp:(.text+0x6cc): undefined reference to 
`WithinImageBoundaryUP1D_Type'
collect2: ld returned 1 exit status
make[2]: *** [bin/blender] Erreur 1
make[1]: *** [source/creator/CMakeFiles/blender.dir/all] Erreur 2
make: *** [all] Erreur 2

(I wonder what happens, includes seem ok...)

Le mar. 29 mai 2012 01:53:28 CEST, Tamito Kajiyama a écrit :
> Revision: 47145
>            http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47145
> Author:   kjym3
> Date:     2012-05-28 23:53:28 +0000 (Mon, 28 May 2012)
> Log Message:
> -----------
> 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!
>
> Modified Paths:
> --------------
>      branches/soc-2008-mxcurioni/release/scripts/freestyle/style_modules/parameter_editor.py
>      branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp
>      branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/Predicates1D.h
>
> Added Paths:
> -----------
>      branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp
>      branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.h
>
> Modified: branches/soc-2008-mxcurioni/release/scripts/freestyle/style_modules/parameter_editor.py
> ===================================================================
> --- branches/soc-2008-mxcurioni/release/scripts/freestyle/style_modules/parameter_editor.py	2012-05-28 23:51:06 UTC (rev 47144)
> +++ branches/soc-2008-mxcurioni/release/scripts/freestyle/style_modules/parameter_editor.py	2012-05-28 23:53:28 UTC (rev 47145)
> @@ -697,27 +697,6 @@
>               return not found
>           return found
>
> -class WithinImageBorderUP1D(UnaryPredicate1D):
> -    def __init__(self, xmin, xmax, ymin, ymax):
> -        UnaryPredicate1D.__init__(self)
> -        self._xmin = xmin
> -        self._xmax = xmax
> -        self._ymin = ymin
> -        self._ymax = ymax
> -    def getName(self):
> -        return "WithinImageBorderUP1D"
> -    def __call__(self, inter):
> -        it = inter.verticesBegin()
> -        while not it.isEnd():
> -            if self.withinBorder(it.getObject()):
> -                return True
> -            it.increment()
> -        return False
> -    def withinBorder(self, vert):
> -        x = vert.getProjectedX()
> -        y = vert.getProjectedY()
> -        return self._xmin<= x<= self._xmax and self._ymin<= y<= self._ymax
> -
>   # Stroke caps
>
>   def iter_stroke_vertices(stroke):
> @@ -1108,7 +1087,7 @@
>           else:
>               xmin, xmax = 0.0, float(w)
>               ymin, ymax = 0.0, float(h)
> -        upred = WithinImageBorderUP1D(xmin, xmax, ymin, ymax)
> +        upred = WithinImageBoundaryUP1D(xmin, ymin, xmax, ymax)
>           selection_criteria.append(upred)
>       # select feature edges
>       upred = join_unary_predicates(selection_criteria, AndUP1D)
>
> Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp
> ===================================================================
> --- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp	2012-05-28 23:51:06 UTC (rev 47144)
> +++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/BPy_UnaryPredicate1D.cpp	2012-05-28 23:53:28 UTC (rev 47145)
> @@ -12,6 +12,7 @@
>   #include "UnaryPredicate1D/BPy_QuantitativeInvisibilityUP1D.h"
>   #include "UnaryPredicate1D/BPy_ShapeUP1D.h"
>   #include "UnaryPredicate1D/BPy_TrueUP1D.h"
> +#include "UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.h"
>
>   #ifdef __cplusplus
>   extern "C" {
> @@ -75,6 +76,11 @@
>   	Py_INCREF(&TrueUP1D_Type );
>   	PyModule_AddObject(module, "TrueUP1D", (PyObject *)&TrueUP1D_Type);
>
> +	if( PyType_Ready(&WithinImageBoundaryUP1D_Type )<  0 )
> +		return -1;
> +	Py_INCREF(&WithinImageBoundaryUP1D_Type );
> +	PyModule_AddObject(module, "WithinImageBoundaryUP1D", (PyObject *)&WithinImageBoundaryUP1D_Type);
> +	
>   	return 0;
>   }
>
>
> Added: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp
> ===================================================================
> --- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp	                        (rev 0)
> +++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.cpp	2012-05-28 23:53:28 UTC (rev 47145)
> @@ -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
>
> Added: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.h
> ===================================================================
> --- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.h	                        (rev 0)
> +++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/python/UnaryPredicate1D/BPy_WithinImageBoundaryUP1D.h	2012-05-28 23:53:28 UTC (rev 47145)
> @@ -0,0 +1,29 @@
> +#ifndef FREESTYLE_PYTHON_WITHINIMAGEBOUNDARYUP1D_H
> +#define FREESTYLE_PYTHON_WITHINIMAGEBOUNDARYUP1D_H
> +
> +#include "../BPy_UnaryPredicate1D.h"
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +///////////////////////////////////////////////////////////////////////////////////////////
> +
> +#include<Python.h>
> +
> +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 */
>
> Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/Predicates1D.h
> ===================================================================
> --- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/Predicates1D.h	2012-05-28 23:51:06 UTC (rev 47144)
> +++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/stroke/Predicates1D.h	2012-05-28 23:53:28 UTC (rev 47145)
> @@ -358,6 +358,63 @@
>       }
>     };
>
> +  // WithinImageBoundaryUP1D
> +  /*! Returns true if the Interface1D is (partly) within the image boundary.
> +   */
> +  class WithinImageBoundaryUP1D: public UnaryPredicate1D
> +  {
> +  private:
> +    real _xmin, _ymin, _xmax, _ymax;
> +  public:
> +    /*! Builds the Predicate.
> +     *  \param xmin
> +     *    The X lower bound of the image boundary.
> +     *  \param ymin
> +     *    The Y lower bound of the image boundary.
> +     *  \param xmax
> +     *    The X upper bound of the image boundary.
> +     *  \param ymax
> +     *    The Y upper bound of the image boundary.
> +     */
> +	WithinImageBoundaryUP1D(const real xmin, const real ymin, const real xmax, const real ymax) :
> +		_xmin(xmin), _ymin(ymin), _xmax(xmax), _ymax(ymax) {}
> +    /*! Returns the string "WithinImageBoundaryUP1D"*/
> +    string getName() const {
> +      return "WithinImageBoundaryUP1D";
> +    }
> +    /*! The () operator. */
> +    int operator()(Interface1D&  inter) {
> +	  // 1st pass: check if a point is within the image boundary.
> +	  Interface0DIterator it = inter.verticesBegin(), itend = inter.verticesEnd();
> +	  for (; it != itend; ++it) {
> +		real x = (*it).getProjectedX();
> +		real y = (*it).getProjectedY();
> +		if (_xmin<= x&&  x<= _xmax&&  _ymin<= y&&  y<= _ymax) {
> +		  result = true;
> +		  return 0;
> +		}
> +	  }
> +	  // 2nd pass: check if a line segment intersects with the image boundary.
> +	  it = inter.verticesBegin();
> +	  if (it != itend) {
> +		Vec2r pmin(_xmin, _ymin);
> +		Vec2r pmax(_xmax, _ymax);
> +		Vec2r prev((*it).getPoint2D());
> +		++it;
> +		for (; it != itend; ++it) {
> +		  Vec2r p((*it).getPoint2D());
> +		  if (GeomUtils::intersect2dSeg2dArea (pmin, pmax, prev, p)) {
> +			result = true;
> +			return 0;
> +		  }
> +		  prev = p;
> +		}
> +	  }
> +	  result = false;
> +      return 0;
> +    }
> +  };
> +
>     //
>     //   Binary Predicates definitions
>     //
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>


More information about the Bf-committers mailing list