Commit Graph

252 Commits

Author SHA1 Message Date
Tamito Kajiyama
56c76ba21c Added missing #include <typeinfo> to BPy_Convert.h. 2009-08-08 11:18:40 +00:00
Tamito Kajiyama
ff110c17f7 Fixed argument checking in __init__ methods of Interface1D, Predicates,
Functions, and StrokeShader types.
2009-08-03 15:19:51 +00:00
Tamito Kajiyama
d4ff63fe20 * Fixed uninitialized pointers in "__init__" methods of UnaryFunction1D types.
There was a known issue for a long time that we occasionally encountered
strange "TypeError: an integer is required" and "RuntimeWarning: tp_compare
didn't return -1 or -2 for exception", as shown in the following unit test
log.  The source of the former error was PyInt_AsLong(obj) being used by
IntegrationType_from_BPy_IntegrationType(obj), where "obj" was not properly
initialized in "__init__" before the converter was called.  The TypeError
was left unattended for a while and showed up when a comparison occurred
and the TypeError was detected, which resulted in the latter warning.

> runTest (__main__.UnaryFunction1DDoubleInitTestCase) ...
> .\blender:211: RuntimeWarning: tp_compare didn't return -1 or -2 for exception
> ERROR
> 
> ======================================================================
> ERROR: runTest (__main__.UnaryFunction1DDoubleInitTestCase)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
>   File "init_tests.py", line 211, in runTest
> TypeError: an integer is required
> 
> ----------------------------------------------------------------------

* Also removed unnecessary error messages in "__init__" methods of
UnaryFunction1D types.
2009-08-03 14:38:15 +00:00
Tamito Kajiyama
e2eb4d567c Fixed the handling of constructor arguments in the following Python
types: Interface0D, SVertex, ViewVertex, StrokeVertex, NonTVertex,
and TVertex.
2009-08-02 22:39:21 +00:00
Tamito Kajiyama
74027eafcb SWIG/directors dependency removal (cont'd)
Removed all castToSomething() methods from Interface0D's subclasses.
These methods are useless, because introspection-based automatic type
conversion takes place whenever it is applicable.

If you need to rewrite old style modules that rely on the cast methods,
apply the following rewriting rules:

- SVertex.castToSVertex()
- TVertex.castToViewVertex()
- TVertex.castToTVertex()
- NonTVertex.castToViewVertex()
- NonTVertex.castToNonTVertex()

  These 5 methods return an object itself, so just removing a method
  call will suffice.  If you need to handle objects in a different way
  depending on their types, then you can use Python's type checking
  idioms such as "type(obj) is T" and "isinstance(obj, T)".  Example:

    [Original]
    v = it.getObject()
    # try to convert v into a TVertex object
    vertex = v.castToTVertex()
    if vertex != None:
	... # do something on the TVertex object
    # try to convert v into a NonTVertex object
    vertex = v.castToNonTVertex()
    if vertex != None:
	... # do something on the NonTVertex object

    [Rewritten]
    vertex = it.getObject()
    if type(vertex) is TVertex:
	... # do something on the TVertex object
    elif type(vertex) is NonTVertex:
	... # do something on the NonTVertex object

- SVertex.castToViewVertex()
- SVertex.castToTVertex()
- SVertex.castToNonTVertex()

  Use SVertex.viewvertex() instead.  You don't need to care about
  which cast method is appropriate.  SVertex.viewvertex() does, if
  necessary, introspection-based automatic type conversion for you.

- NonTVertex.castToSVertex()

  Use NonTVertex.svertex() instead.

- CurvePoint.castToSVertex()

  Let cp be a CurvePoint object, then this method can be expressed as
  follows:

    if cp.t2d() == 0.0:
	return cp.A() # returns an SVertex
    elif cp.t2d() == 1.0:
	return cp.B() # returns an SVertex
    return None

- CurvePoint.castToViewVertex()
- CurvePoint.castToTVertex()
- CurvePoint.castToNonVertex()

  Similarly, these 3 methods can be expressed as follows:

    if cp.t2d() == 0.0:
	return cp.A().viewvertex()
    elif cp.t2d() == 1.0:
	return cp.B().viewvertex()
    return None
2009-08-02 19:36:18 +00:00
Tamito Kajiyama
0ea01da4ba Fixed the argument parsing in CurvePoint.__init__(). 2009-08-02 18:25:26 +00:00
Tamito Kajiyama
cc19c8e270 * Fixed __init__() method so as to corecttly handle arguments.
* Fixed refcount issues in diffuse(), specular(), ambient() and
emission() methods.  Also changed the type of their returned values
from list to tuple.
2009-08-02 17:38:51 +00:00
Tamito Kajiyama
acf97994bc SWIG/directors dependency removal (cont'd)
* Added to python/BPy_Convert.{cpp,h} 4 utility converters below for
better introspection-based automatic type conversion.

  PyObject * Any_BPy_Interface0D_from_Interface0D( Interface0D& if0D );
  PyObject * Any_BPy_Interface1D_from_Interface1D( Interface1D& if1D );
  PyObject * Any_BPy_FEdge_from_FEdge( FEdge& fe );
  PyObject * Any_BPy_ViewVertex_from_ViewVertex( ViewVertex& vv );

There are 4 corresponding converters without the "Any_" prefix.  All
calls of them in the code base were replaced with these new converters
so that the introspection-based automatic conversion would take place
universally.

* python/BPy_Convert.{cpp,h}: Those C++ to Python converters having
had a "_ptr" suffix were renamed to a name without the suffix, and
their arguments were changed so as to take a reference (e.g.,
ViewVertex&) instead of a pointer (e.g., ViewVertex *).  The changed
converters and their new function prototypes are listed below.  These
converters now return a Python wrapper object that retains the passed
reference, instead of retaining a newly created C++ object by the
converters.

  // Interface0D converters
  PyObject * BPy_Interface0D_from_Interface0D( Interface0D& if0D );
  PyObject * BPy_CurvePoint_from_CurvePoint( CurvePoint& cp );
  PyObject * BPy_StrokeVertex_from_StrokeVertex( StrokeVertex& sv );
  PyObject * BPy_SVertex_from_SVertex( SVertex& sv );
  PyObject * BPy_ViewVertex_from_ViewVertex( ViewVertex& vv );
  PyObject * BPy_TVertex_from_TVertex( TVertex& tv );
  PyObject * BPy_NonTVertex_from_NonTVertex( NonTVertex& ntv );
  // Interface1D converters
  PyObject * BPy_Interface1D_from_Interface1D( Interface1D& if1D );
  PyObject * BPy_Chain_from_Chain( Chain& c );
  PyObject * BPy_FEdge_from_FEdge( FEdge& fe );
  PyObject * BPy_FEdgeSharp_from_FEdgeSharp( FEdgeSharp& fes );
  PyObject * BPy_FEdgeSmooth_from_FEdgeSmooth( FEdgeSmooth& fes );
  PyObject * BPy_Stroke_from_Stroke( Stroke& s );
  PyObject * BPy_ViewEdge_from_ViewEdge( ViewEdge& ve );
  PyObject * BPy_directedViewEdge_from_directedViewEdge( ViewVertex::directedViewEdge& dve );
  // some other converters
  PyObject * BPy_ViewShape_from_ViewShape( ViewShape& vs );
  PyObject * BPy_SShape_from_SShape( SShape& ss );
  PyObject * BPy_FrsMaterial_from_FrsMaterial( FrsMaterial& m );
  PyObject * BPy_StrokeAttribute_from_StrokeAttribute( StrokeAttribute& sa );

* Added a "borrowed" flag to the definitions of Python types being
used to wrap C++ components of Freestyle's internal data structures.
The flag indicates whether or not a Python wrapper object has a
reference to a C++ object that comprises the internal data structures.
The deallocation routines of the Python types check this flag and
release a wrapped C++ object only when it is not part of the internal
data structures.  The following files were modified:

  python/BPy_FrsMaterial.{cpp,h}
  python/BPy_Interface0D.{cpp,h}
  python/BPy_Interface1D.{cpp,h}
  python/BPy_SShape.{cpp,h}
  python/BPy_StrokeAttribute.{cpp,h}
  python/BPy_ViewShape.{cpp,h}
  python/Interface0D/BPy_CurvePoint.cpp
  python/Interface0D/BPy_SVertex.cpp
  python/Interface0D/BPy_ViewVertex.cpp
  python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp
  python/Interface0D/ViewVertex/BPy_NonTVertex.cpp
  python/Interface0D/ViewVertex/BPy_TVertex.cpp
  python/Interface1D/BPy_FEdge.cpp
  python/Interface1D/BPy_FrsCurve.cpp
  python/Interface1D/BPy_Stroke.cpp
  python/Interface1D/BPy_ViewEdge.cpp
  python/Interface1D/Curve/BPy_Chain.cpp
  python/Interface1D/FEdge/BPy_FEdgeSharp.cpp
  python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp

* view_map/Interface[01]D.h, python/BPy_Interface[01]D.cpp: Removed
from the Interface0D and Interface1D C++ classes a back pointer to a
Python wrapper object and all "director" calls.  These classes (and
their subclasses) are used to build Freestyle's main data structures
(such as a view map and strokes) and their class hierarchy is static.
Python wrappers of these C++ classes are only used to access the data
structures from the Python layer, and not intended to extend the data
structures by subclassing the Python wrappers.  Without the necessity
of subclassing in the Python layer, the back pointer to a wrapping
Python object and "director" calls would be useless (actually they
were not used at all), so they were all removed.

* python/Director.{cpp,h}: Removed the definitions of directors that
were no longer used.

* stroke/Stroke.{cpp,h}: Removed an (unused) back pointer to a Python
wrapper object.

* python/BPy_ViewMap.cpp: Fixed a possible null pointer reference.

* python/Interface1D/BPy_FEdge.cpp: Fixed parameter checking in
FEdge___init__().
2009-08-02 16:23:18 +00:00
Tamito Kajiyama
6d1ad351f3 Changed the type of returned value of BPy_directedViewEdge_from_directedViewEdge()
from list to tuple.
2009-08-01 18:03:43 +00:00
Tamito Kajiyama
2c829e9bd3 Disabled the Python wrapper of ViewVertex::edgesEnd(), since the
method returns a non-functional orientedViewEdgeIterator instance.
The iteration from the end to the beginning of the sequence relies
on orientedViewEdgeIterator::decrement() which is not actually
implemented in the C++ class.  As a quick fix, the edgesEnd method
now raises a NotImplementedError.
2009-07-31 23:49:12 +00:00
Tamito Kajiyama
631df8cc01 Added boundary checking to Iterator::increment() and Iterator::decrement()
to avoid an immediate crash.  Now these methods raise a RuntimeError when
the iteration is already at the end.
2009-07-31 23:16:38 +00:00
Tamito Kajiyama
ba9943e4a7 * Implemented Python's iterator protocol in Interface0DIterator and
orientedViewEdgeIterator.

* Simplified Python-related error handling in C++ class definitions.
The definitions of the following C++ methods were simplified and most
code segments using the C/Python API were moved to Director.cpp.

  ChainingIterator::init()
  ChainingIterator::traverse()
  UnaryPredicate0D::operator()()
  UnaryPredicate1D::operator()()
  BinaryPredicate0D::operator()()
  BinaryPredicate1D::operator()()
  UnaryFunction0D::operator()()
  UnaryFunction1D::operator()()
  StrokeShader.shade()

* Moved part of the introspection-based automatic type conversion code
from BPy_Interface0DIterator.cpp and Director.cpp to BPy_Convert.cpp
for the sake of better code organization.

* Fixed an uninitialized member in StrokeVertexIterator___init__().
2009-07-31 22:13:48 +00:00
Tamito Kajiyama
6134a41270 Fixed typoes in error messages. 2009-07-31 21:44:59 +00:00
Tamito Kajiyama
d62f844b12 Fixed typoes in error messages. 2009-07-31 21:44:02 +00:00
Tamito Kajiyama
4e78dff629 Added Python error handling to StrokeShader::shade(). Also made
a measure to avoid an infinite loop due to non-proper overriding
of the shade method.
2009-07-31 21:03:22 +00:00
Tamito Kajiyama
3771d648d0 Added minor changes. 2009-07-29 18:49:03 +00:00
Tamito Kajiyama
7600037924 Added changes to the AdjacencyIterator type to support Python's
iterator protocol.  Now the following code in the conventional
SWIG-based syntax:

    it = AdjacencyIterator(iter)
    while not it.isEnd():
        ve = it.getObject()
        ...
        it.increment()

can be written using the iterator protocol as follows:

    for ve in AdjacencyIterator(iter):
        ...
2009-07-29 00:18:13 +00:00
Tamito Kajiyama
8eb1064f41 Implemented a measure to avoid an infinite loop triggered when
ChainingIterator::init() and ChainingIterator::traverse() were
not properly overloaded in a subclass.
2009-07-29 00:11:41 +00:00
Tamito Kajiyama
bf0365ceb0 * BPy_IntegrationType.cpp: Added a Python wrapper of integrate function.
* Fixed uninitialized fields in the "__init__" methods of UnaryFunction0D
types.  Also added missing argument validation codes to some of the types,
and removed redundant validation error messages.
2009-07-28 00:29:30 +00:00
Tamito Kajiyama
fe5b6a556c * Fixed compiler errors in UnaryFunction0DVectorViewShape::__call__()
and UnaryFunction1DVectorViewShape::__call__().

* Added a Python wrapper of ViewEdge::qi().
2009-07-27 19:34:52 +00:00
Tamito Kajiyama
52f639277b Second attempt to fix a null pointer reference in deallocators of
built-in types (the first was in revision 21877).  When an exception
has raised within from the __init__ method of a user-defined class
derived from a built-in type (e.g., UnaryPredicate0D and
BinaryPredicate1D), some member variables of the base type are
left uninitialized, leading to a null pointer reference in the
"__dealloc__" function in the base type.  To avoid this, pointer
checking was added in the deallocators of those built-in types that
can be used to define a subclass by a user.
2009-07-26 20:20:25 +00:00
Tamito Kajiyama
69853d3e40 Reverted the change in revision 21877 in Interface0D___dealloc__(). 2009-07-26 17:29:25 +00:00
Tamito Kajiyama
730fb1021c Made predicate and function types callable in the sense that
callable(I, T) returns True when I is an object of a type T or
of a subtype of T.  Also implemented a measure to avoid an
infinite loop when user-defined predicate and function classes
do not properly overload the __call__ method (including the
cases of directly instantiating the base classes such as
UnaryPredicate0D and BinaryPredicate1D).
2009-07-26 16:15:28 +00:00
Tamito Kajiyama
78ce17fce8 Implemented Python wrappers of context functions (such as GetTimeStampCF). 2009-07-26 11:19:37 +00:00
Tamito Kajiyama
fec3ddabb1 * Better support for vector-like objects in method arguments.
Now the following methods in the Freestyle Python API accept
not only Blender.Mathutils.Vector instances but also lists and
tuples having an appropriate number of elements.

  FrsNoise::turbulence2()
  FrsNoise::turbulence3()
  FrsNoise::smoothNoise2()
  FrsNoise::smoothNoise3()
  SVertex::__init__()
  SVertex::setPoint3D()
  SVertex::setPoint2D()
  SVertex::AddNormal()
  FEdgeSharp::setNormalA()
  FEdgeSharp::setNormalB()
  FEdgeSmooth::setNormal()
  CalligraphicShader::__init__()
  StrokeAttribute::setAttributeVec2f()
  StrokeAttribute::setAttributeVec3f()
  StrokeAttribute::setColor()
  StrokeVertex::setPoint()

* Added the following converters for the sake of the improvements
mentioned above.

  Vec2f_ptr_from_PyObject()
  Vec3f_ptr_from_PyObject()
  Vec3r_ptr_from_PyObject()
  Vec2f_ptr_from_PyList()
  Vec3f_ptr_from_PyList()
  Vec3r_ptr_from_PyList()
  Vec2f_ptr_from_PyTuple()
  Vec3f_ptr_from_PyTuple()
  Vec3r_ptr_from_PyTuple()

Those converters with the suffixes _PyList and _PyTuple accept
only lists and tuples having an appropriate number of elements,
respectively, while those with the suffix _PyObject accept lists,
tuples, or Blender.Mathutils.Vector instances.

* Fixed a null pointer reference in Interface0D___dealloc__().

* Corrected the names of 3 methods in the FEdgeSmooth class.
2009-07-25 11:27:18 +00:00
Tamito Kajiyama
aff53f5217 Fixed compiler errors caused by the changes in revision 21700. 2009-07-24 23:34:25 +00:00
Tamito Kajiyama
f19ae70820 Fixed a refcount bug concerning ChainPredicateIterator. 2009-07-21 19:44:15 +00:00
Tamito Kajiyama
5fed0560d9 * Introspection-based automatic type conversion from a generic C++ object
to a specific Python object.  The conversion takes place in the following
places.
- Interface0DIterator_getObject (BPy_Interface0DIterator.cpp)
- Director_BPy_BinaryPredicate1D___call__ (Director.cpp)
- Director_BPy_UnaryPredicate1D___call__ (Director.cpp)
- SVertex_viewvertex (BPy_SVertex.cpp)
- BPy_FEdge_from_FEdge (BPy_Convert.cpp)
This is a tentative list and more conversions are expected to be added.

* Added the following two converter functions to BPy_Convert.{cpp,h}:
- BPy_NonTVertex_from_NonTVertex_ptr
- BPy_TVertex_from_TVertex_ptr
2009-07-19 23:17:30 +00:00
Tamito Kajiyama
1cb1d0e6e9 Added a missing wrapper for AdjacencyIterator::isIncoming(). 2009-07-19 23:03:26 +00:00
Tamito Kajiyama
770267437b Fixed uninitialized pointers in ViewVertex instances returned by the
castToViewVertex method.
2009-07-19 23:01:25 +00:00
Tamito Kajiyama
47fddb50c5 Fixed uninitialized pointers in Interface0DIterator instances returned by
the castToInterface0DIterator method.
2009-07-19 16:37:55 +00:00
Tamito Kajiyama
2f5e1969ed Improvements on error handling in the Python API. 2009-04-04 15:26:12 +00:00
Tamito Kajiyama
bff81e3394 Relaxed type checking concerning boolean arguments so that not only
True and False but also various other boolean expressions (e.g., 0,
1, and None) are accepted.
2009-04-04 14:50:54 +00:00
Tamito Kajiyama
acfd7c82ab Relaxed type checking concerning boolean arguments in class constructors
and __call__ methods so that not only True and False but also various
other boolean expressions (e.g., 0, 1, and None) are accepted.
2009-04-03 20:03:09 +00:00
Tamito Kajiyama
67e4d7dc63 Improvements on error handling in the Python API. 2009-03-31 22:45:11 +00:00
Tamito Kajiyama
3c60dd404e * fixed uninitialized variables.
* fixed a bug that was introduced in the last commit.
2009-03-30 19:25:27 +00:00
Tamito Kajiyama
a377b74638 Improvements on error handling in the Python API. 2009-03-29 21:50:10 +00:00
Tamito Kajiyama
fbd92e985e * improved error handling in CurvePointIterator constructor.
* changed CurvePointIterator::getObject() according to the changes
in revision 19456.
2009-03-29 21:05:03 +00:00
Tamito Kajiyama
ded03e34bf * Added BPy_Chain_from_Chain_ptr().
* Changed BPy_CurvePoint_from_CurvePoint( CurvePoint& cp ) to
BPy_CurvePoint_from_CurvePoint_ptr( CurvePoint *cp ) so that it
retains a CurvePoint pointer instead of a CurvePoint instance.
2009-03-29 21:00:26 +00:00
Tamito Kajiyama
6dfcbf166b Fixed a typo in the last commit. 2009-03-29 18:46:17 +00:00
Tamito Kajiyama
68e088f1cf Improvements on error handling in the Python API. 2009-03-29 17:44:14 +00:00
Tamito Kajiyama
f86309d672 Removed the declaration of an undefined static function, to suppress a compiler warning.
Also made minor changes to make IntegrationType a subclass of the built-in int type.
2009-03-21 12:09:58 +00:00
Tamito Kajiyama
c1611c346f Fixed editing errors in the last commit... 2009-03-20 23:19:47 +00:00
Tamito Kajiyama
c5fe802ec8 Fixed an uninitialized variable. 2009-03-20 22:44:04 +00:00
Tamito Kajiyama
85291f0fea Improvements in error handling at Python-C++ boundaries.
Also exported the Operators.chain() function.
2009-03-20 22:42:59 +00:00
Tamito Kajiyama
0c7e5323e8 Improvements in error handling at Python-C++ boundaries. 2009-03-20 22:41:27 +00:00
Tamito Kajiyama
6ba34d18b5 Fixed incorrect argument checking. 2009-03-14 13:27:41 +00:00
Tamito Kajiyama
f38183d6b4 Fixed the subclassing of int to define the IntegrationType type.
Also changed the type of integration type constants from int to IntegrationType.
2009-03-14 13:20:06 +00:00
Tamito Kajiyama
52e289ee3b Fixed StrokeVertex::setPoint() to accept a Blender Vector object as the argument.
Now this method accepts 2D coordinates in the following three forms:
a) Python list of 2 real numbers: setPoint([x, y])
b) Blender Vector of 2 elements: setPoint(Vector(x, y))
c) 2 real numbers: setPoint(x, y)

[The log of Revision 19283 had a wrong message...]
2009-03-14 13:11:34 +00:00
Tamito Kajiyama
c14e91590e Fixed StrokeVertex::setPoint() to accept a Blender Vector object as the argument.
Now this method accepts 2D coordinates in the following three forms:
a) Python list of 2 real numbers: setPoint([x, y])
b) Blender Vector of 2 elements: setPoint(Vector(x, y))
c) 2 real numbers: setPoint(x, y)
2009-03-14 13:06:09 +00:00