В моей системе GLfloat
и GLdouble
определены как:
typedef float GLfloat;
typedef double GLdouble;
И числовой тип данных R всегда равен double
. Таким образом, вы можете использовать &m[0]
или m.begin()
напрямую, чтобы получить что-то конвертируемое в GLdouble *
без необходимости копировать данные. Для GLfloat
это невозможно, поскольку требуется преобразование (с потерями) для перехода от (64-битного) double
, используемого R, к (32-битному) float
.
Некоторый код какИллюстрация:
Sys.setenv(PKG_LIBS="-lGL -lglfw")
Rcpp::sourceCpp(code = '
#include <Rcpp.h>
#include <GLFW/glfw3.h>
using namespace Rcpp;
// [[Rcpp::export("glLoadMatrixd")]]
void gl_load_matrixd(Rcpp::NumericMatrix m) {
const GLdouble * _double_v = &m[0];
glLoadMatrixd(_double_v);
}
')
glLoadMatrixd(matrix(runif(10), 2, 5))
Кстати, я понятия не имею, какие размеры должна иметь такая матрица. 2х5, вероятно, неверно ...