25 #include "eos/render/detail/render_detail.hpp" 26 #include "eos/render/utils.hpp" 28 #include "opencv2/core/core.hpp" 30 #include "boost/optional.hpp" 125 std::pair<cv::Mat, cv::Mat>
render(
Mesh mesh, cv::Mat model_view_matrix, cv::Mat projection_matrix,
int viewport_width,
int viewport_height,
const boost::optional<Texture>& texture = boost::none,
bool enable_backface_culling =
false,
bool enable_near_clipping =
true,
bool enable_far_clipping =
true)
140 Mat colourbuffer = Mat::zeros(viewport_height, viewport_width, CV_8UC4);
141 Mat depthbuffer = std::numeric_limits<float>::max() * Mat::ones(viewport_height, viewport_width, CV_64FC1);
146 vector<detail::Vertex> clipspace_vertices;
147 clipspace_vertices.reserve(mesh.
vertices.size());
148 for (
int i = 0; i < mesh.
vertices.size(); ++i) {
149 Mat clipspace_coords = projection_matrix * model_view_matrix * Mat(mesh.
vertices[i]);
150 cv::Vec3f vertex_colour;
151 if (mesh.
colors.empty()) {
152 vertex_colour = cv::Vec3f(0.5f, 0.5f, 0.5f);
155 vertex_colour = mesh.
colors[i];
157 clipspace_vertices.push_back(detail::Vertex(clipspace_coords, vertex_colour, mesh.
texcoords[i]));
163 vector<detail::TriangleToRasterize> triangles_to_raster;
164 for (
const auto& tri_indices : mesh.
tvi) {
172 unsigned char visibility_bits[3];
173 for (
unsigned char k = 0; k < 3; k++)
175 visibility_bits[k] = 0;
176 float x_cc = clipspace_vertices[tri_indices[k]].position[0];
177 float y_cc = clipspace_vertices[tri_indices[k]].position[1];
178 float z_cc = clipspace_vertices[tri_indices[k]].position[2];
179 float w_cc = clipspace_vertices[tri_indices[k]].position[3];
181 visibility_bits[k] |= 1;
183 visibility_bits[k] |= 2;
185 visibility_bits[k] |= 4;
187 visibility_bits[k] |= 8;
188 if (enable_near_clipping && z_cc < -w_cc)
189 visibility_bits[k] |= 16;
190 if (enable_far_clipping && z_cc > w_cc)
191 visibility_bits[k] |= 32;
194 if ((visibility_bits[0] & visibility_bits[1] & visibility_bits[2]) > 0)
199 if ((visibility_bits[0] | visibility_bits[1] | visibility_bits[2]) == 0)
201 boost::optional<detail::TriangleToRasterize> t = detail::process_prospective_tri(clipspace_vertices[tri_indices[0]], clipspace_vertices[tri_indices[1]], clipspace_vertices[tri_indices[2]], viewport_width, viewport_height, enable_backface_culling);
203 triangles_to_raster.push_back(*t);
208 std::vector<detail::Vertex> vertices;
209 vertices.push_back(clipspace_vertices[tri_indices[0]]);
210 vertices.push_back(clipspace_vertices[tri_indices[1]]);
211 vertices.push_back(clipspace_vertices[tri_indices[2]]);
213 if (enable_near_clipping)
215 vertices = detail::clip_polygon_to_plane_in_4d(vertices, cv::Vec4f(0.0f, 0.0f, -1.0f, -1.0f));
219 if (vertices.size() >= 3)
221 for (
unsigned char k = 0; k < vertices.size() - 2; k++)
223 boost::optional<detail::TriangleToRasterize> t = detail::process_prospective_tri(vertices[0], vertices[1 + k], vertices[2 + k], viewport_width, viewport_height, enable_backface_culling);
225 triangles_to_raster.push_back(*t);
232 for (
const auto& tri : triangles_to_raster) {
233 detail::raster_triangle(tri, colourbuffer, depthbuffer, texture, enable_far_clipping);
235 return std::make_pair(colourbuffer, depthbuffer);
std::pair< cv::Mat, cv::Mat > render(Mesh mesh, cv::Mat model_view_matrix, cv::Mat projection_matrix, int viewport_width, int viewport_height, const boost::optional< Texture > &texture=boost::none, bool enable_backface_culling=false, bool enable_near_clipping=true, bool enable_far_clipping=true)
Definition: render.hpp:125
Namespace containing all of eos's 3D model fitting functionality.
std::vector< cv::Vec4f > vertices
3D vertex positions.
Definition: Mesh.hpp:47
std::vector< cv::Vec3f > colors
Colour information for each vertex. Expected to be in RGB order.
Definition: Mesh.hpp:48
This class represents a 3D mesh consisting of vertices, vertex colour information and texture coordin...
Definition: Mesh.hpp:45
std::vector< std::array< int, 3 > > tvi
Triangle vertex indices.
Definition: Mesh.hpp:51
std::vector< cv::Vec2f > texcoords
Texture coordinates for each vertex.
Definition: Mesh.hpp:49