__forceinline void _computeFroxelCenterAndExtent(const simdfrustum& frustum, const simdmat4& matrix_proj_view, const simdvec3& light_froxels_dims, simdfloat x, simdfloat y, simdfloat z, simdvec3* center, simdvec3* extent, int froxel_z_distribution_factor) { simdvec3 aabb_min = _project(matrix_proj_view, _froxelCorner(simdvec3(x, y, z), light_froxels_dims, frustum, froxel_z_distribution_factor)); simdvec3 aabb_max = _project(matrix_proj_view, _froxelCorner(simdvec3(x + simdfloat(1.0f), y + simdfloat(1.0f), z + simdfloat(1.0f)), light_froxels_dims, frustum, froxel_z_distribution_factor)); *center = simdfloat(0.5f) * (aabb_min + aabb_max); *extent = simdfloat(0.5f) * (aabb_max - aabb_min); }
void PinholePointProjector::project(IntImage &indexImage, DepthImage &depthImage, const PointVector &points) const { assert(_imageRows && _imageCols && "PinholePointProjector: _imageRows and _imageCols are zero"); indexImage.create(_imageRows, _imageCols); depthImage.create(_imageRows, _imageCols); depthImage.setTo(cv::Scalar(std::numeric_limits<float>::max())); indexImage.setTo(cv::Scalar(-1)); float *drowPtrs[_imageRows]; int *irowPtrs[_imageRows]; for(int i = 0; i < _imageRows; i++) { drowPtrs[i] = &depthImage(i, 0); irowPtrs[i] = &indexImage(i, 0); } const Point *point = &points[0]; for(size_t i = 0; i < points.size(); i++, point++) { int x, y; float d; if(!_project(x, y, d, *point) || d < _minDistance || d > _maxDistance || x < 0 || x >= indexImage.cols || y < 0 || y >= indexImage.rows) continue; float &otherDistance = drowPtrs[y][x]; int &otherIndex = irowPtrs[y][x]; if(!otherDistance || otherDistance > d) { otherDistance = d; otherIndex = i; } } }
QJSValue THREEVector3::project(QJSValue cameraValue) { QJSValue pMatrix = cameraValue.property(QStringLiteral("projectionMatrix")); QJSValue wMatrix = cameraValue.property(QStringLiteral("matrixWorld")); THREEMatrix4 *projectionMatrix = THREEMatrix4::getAsTHREEMatrix4(pMatrix); if (!projectionMatrix) { qDebug() << "THREEVector3::" << __FUNCTION__ << " projectionMatrix parameter was not THREEMatrix4 was " << pMatrix.toQObject(); return m_engine->newQObject(this); } THREEMatrix4 *matrixWorld = THREEMatrix4::getAsTHREEMatrix4(wMatrix); if (!matrixWorld) { qDebug() << "THREEVector3::" << __FUNCTION__ << " matrixWorld parameter was not THREEMatrix4 was " << wMatrix.toQObject(); return m_engine->newQObject(this); } return m_engine->newQObject(_project(projectionMatrix, matrixWorld)); }
static void select_quad(void) { int q, x, y, v, viewport[4]; float modelview[16], proj[16]; best_quad = -1; best_depth = 1000000.0f; nos_mouse_pos(&x, &y); if(x == 0 || y == 0) { return; } glGetFloatv(GL_PROJECTION_MATRIX, proj); glGetFloatv(GL_MODELVIEW_MATRIX, modelview); glGetIntegerv(GL_VIEWPORT, viewport); y = viewport[3] - y; for(v = 0; v < model.vertexes; ++v) { _project(model.vertex_pos[v], modelview, proj, viewport, vertexes_projected[v]); } for(q = 0; q < model.quads; ++q) { float *quad[4]; if(unpacker.deleted_quads[q]) { continue; } quad[0] = vertexes_projected[model.quad_index[q][0]]; quad[1] = vertexes_projected[model.quad_index[q][1]]; quad[2] = vertexes_projected[model.quad_index[q][2]]; quad[3] = vertexes_projected[model.quad_index[q][3]]; if(polygon_inside(4, quad, (float)x, (float)y)) { float depth = quad[0][2] + quad[1][2] + quad[2][2] + quad[3][2]; if(depth < best_depth && polygon_area(4, quad) > 0.0f) { best_quad = q; best_depth = depth; } } } }