__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));
}
Exemple #4
0
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;
			}
		}
	}
}