1
2//
3// This source file is part of appleseed.
4// Visit http://appleseedhq.net/ for additional information and resources.
5//
6// This software is released under the MIT license.
7//
8// Copyright (c) 2016-2017 Esteban Tovagliari, The appleseedhq Organization
9//
10// Permission is hereby granted, free of charge, to any person obtaining a copy
11// of this software and associated documentation files (the "Software"), to deal
12// in the Software without restriction, including without limitation the rights
13// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14// copies of the Software, and to permit persons to whom the Software is
15// furnished to do so, subject to the following conditions:
16//
17// The above copyright notice and this permission notice shall be included in
18// all copies or substantial portions of the Software.
19//
20// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26// THE SOFTWARE.
27//
28
29// appleseed.python headers.
30#include "pyseed.h" // has to be first, to avoid redefinition warnings
31
32// appleseed.foundation headers.
33#include "foundation/math/basis.h"
34#include "foundation/utility/iostreamop.h"
35
36// Standard headers.
37#include <cstddef>
38#include <memory>
39
40namespace bpy = boost::python;
41using namespace foundation;
42using namespace std;
43
44namespace
45{
46 template <typename T>
47 Vector<T, 3> transform_to_local(const Basis3<T>& basis, const Vector<T, 3>& v)
48 {
49 return basis.transform_to_local(v);
50 }
51
52 template <typename T>
53 Vector<T, 3> transform_to_parent(const Basis3<T>& basis, const Vector<T, 3>& v)
54 {
55 return basis.transform_to_parent(v);
56 }
57
58 template <typename T>
59 void do_bind_basis(const char* class_name)
60 {
61 bpy::class_<Basis3<T> >(class_name)
62 .def(bpy::init<>())
63 .def(bpy::init<Vector<T, 3> >())
64 .def(bpy::init<Vector<T, 3>, Vector<T, 3> >())
65 .def(bpy::init<Vector<T, 3>, Vector<T, 3>, Vector<T, 3> >())
66
67 .def("transform_to_local", &transform_to_local<T>)
68 .def("transform_to_parent", &transform_to_parent<T>)
69 .def("get_normal", &Basis3<T>::get_normal, bpy::return_value_policy<bpy::copy_const_reference>())
70 .def("get_tangent_u", &Basis3<T>::get_tangent_u, bpy::return_value_policy<bpy::copy_const_reference>())
71 .def("get_tangent_v", &Basis3<T>::get_tangent_v, bpy::return_value_policy<bpy::copy_const_reference>())
72 ;
73 }
74}
75
76void bind_basis()
77{
78 do_bind_basis<float>("Basis3f");
79 do_bind_basis<double>("Basis3d");
80}
81