23 #include "core/normgrid.h"
26 using namespace mondschein;
29 Bezierpatch::Bezierpatch() : curves()
34 Bezierpatch::Bezierpatch(
const std::vector<Beziercurve_p> &_c) : curves(_c)
39 Bezierpatch::Bezierpatch(Bezierpatch_c _b) : curves(_b->curves)
44 Bezierpatch::~Bezierpatch()
49 Bezierpatch &Bezierpatch::operator=(Bezierpatch_c _b)
63 std::string err(*boost::get_error_info<exception_error>(e));
64 err+=
", called in function\n\t";
65 err+=
"Eigen::Vector4d mondschein::math::Bezierpatch::operator()(float64 _t,float64 _u) const";
83 return curves.size()-1;
92 std::vector<Eigen::Vector3d> v;
93 for (
uint32 i=0; i<curves.size(); ++i)
95 v.push_back(curves.at(i)->get_point(_t));
99 for (
uint32 j=1; j<v.size(); ++j)
101 for (
uint32 k=0; k<v.size()-j; ++k)
103 v.at(j)=(1-_u)*v.at(j)+_u*v.at(j+1);
110 std::string err(*boost::get_error_info<exception_error>(e));
111 err+=
", called in function\n\t";
112 err+=
"Eigen::Vector3d mondschein::math::Bezierpatch::get_point(float64 _t,float64 _u) const";
115 catch (std::exception &e)
117 std::string err(
"Mondschein Engine ERROR: ");
119 err+=
", exception raised in function\n\t";
120 err+=
"Eigen::Vector3d mondschein::math::Bezierpatch::get_point(float64 _t,float64 _u) const";
127 if ((_n<2) || (_m<2))
129 std::string err(
"Mondschein Engine ERROR: Cannot construct a square mesh out of ");
130 err+=_n; err+=
"x"; err+=_m;
131 err+=
" vertices. Exception raised in function\n\t";
132 err+=
"mondschein::scene::Mesh_p mondschein::math::Bezierpatch::generate_mesh(uint32 _n,uint32 _m,";
133 err+=
"mondschein::math::normal_calculation_e _normals) const";
140 std::vector<std::vector<Eigen::Vector3d> > grid;
143 std::vector<Eigen::Vector3d> _grid;
148 grid.push_back(_grid);
151 std::vector<Eigen::Vector3d> normals;
155 normals=ng->flat(grid);
159 normals=ng->flat_inv(grid);
163 normals=ng->intermediate(grid);
166 case INTERMEDIATE_INV:
167 normals=ng->intermediate_inv(grid);
171 std::string err(
"Mondschein Engine ERROR: Normal calculation type not supported. ");
172 err+=
"Exception raised in function\n\t";
173 err+=
"mondschein::scene::Mesh_p mondschein::math::Bezierpatch::generate_mesh(float64 _n,";
174 err+=
"float64 _m, mondschein::normal_calculation_e _normals) const";
178 std::vector<Eigen::Vector4d> v;
179 std::vector<Eigen::Vector3d> vn;
180 std::vector<Eigen::Vector4d> vt;
181 std::vector<Eigen::Vector4d> vc;
183 for (
uint32 i=0; i<grid.size()-1; ++i)
185 for (
uint32 j=0; j<grid.at(i).size()-1; ++i)
187 tmp << grid.at(i).at(j),1.0;
189 tmp << grid.at(i+1).at(j),1.0;
191 tmp << grid.at(i).at(j+1),1.0;
193 if (_normals < INTERMEDIATE)
195 vn.push_back(normals.at(grid.at(i).size()*i+j*2));
196 vn.push_back(normals.at(grid.at(i).size()*i+j*2));
197 vn.push_back(normals.at(grid.at(i).size()*i+j*2));
201 vn.push_back(normals.at(grid.at(i).size()*(i)+j));
202 vn.push_back(normals.at(grid.at(i+1).size()*(i+1)+j));
203 vn.push_back(normals.at(grid.at(i).size()*(i)+j+1));
205 vt.push_back(Eigen::Vector4d(static_cast<float64>(i)/grid.size(),
static_cast<float64>(j)/grid.at(i).size(),
207 vt.push_back(Eigen::Vector4d(static_cast<float64>(i+1)/grid.size(),
static_cast<float64>(j)/grid.at(i).size(),
209 vt.push_back(Eigen::Vector4d(static_cast<float64>(i)/grid.size(),
static_cast<float64>(j+1)/grid.at(i).size(),
211 vc.push_back(Eigen::Vector4d(1.0,1.0,1.0,1.0));
212 vc.push_back(Eigen::Vector4d(1.0,1.0,1.0,1.0));
213 vc.push_back(Eigen::Vector4d(1.0,1.0,1.0,1.0));
215 tmp << grid.at(i).at(j+1),1.0;
217 tmp << grid.at(i+1).at(j),1.0;
219 tmp << grid.at(i+1).at(j+1),1.0;
221 if (_normals < INTERMEDIATE)
223 vn.push_back(normals.at(grid.at(i).size()*i+j*2+1));
224 vn.push_back(normals.at(grid.at(i).size()*i+j*2+1));
225 vn.push_back(normals.at(grid.at(i).size()*i+j*2+1));
229 vn.push_back(normals.at(grid.at(i).size()*(i)+j+1));
230 vn.push_back(normals.at(grid.at(i+1).size()*(i+1)+j));
231 vn.push_back(normals.at(grid.at(i+1).size()*(i+1)+j+1));
233 vt.push_back(Eigen::Vector4d(static_cast<float64>(i)/grid.size(),
static_cast<float64>(j+1)/grid.at(i).size(),
235 vt.push_back(Eigen::Vector4d(static_cast<float64>(i+1)/grid.size(),
static_cast<float64>(j)/grid.at(i).size(),
237 vt.push_back(Eigen::Vector4d(static_cast<float64>(i+1)/grid.size(),
static_cast<float64>(j+1)/grid.at(i).size(),
239 vc.push_back(Eigen::Vector4d(1.0,1.0,1.0,1.0));
240 vc.push_back(Eigen::Vector4d(1.0,1.0,1.0,1.0));
241 vc.push_back(Eigen::Vector4d(1.0,1.0,1.0,1.0));
248 std::string err(*boost::get_error_info<exception_error>(e));
249 err+=
", called in function\n\t";
250 err+=
"mondschein::scene::Mesh_p mondschein::math::Bezierpatch::generate_mesh(float64 _t,float64 _u,";
251 err+=
"normal_calculation_e _normals) const";