Это следующий вопрос: Предоставление структуры C с помощью Rcpp?
@ DirkEddelbuettel справедливо раскритиковал этот вышеупомянутый вопрос как слишком широкий по объему, поэтому я здесьпытаясь быть более точным в моих целях, предоставляя некоторый реальный код, иллюстрирующий мою попытку решить эту проблему.
Описание проблемы
Первое, что нужно : обратите внимание, что яиспользуйте (в некоторой степени, к сожалению, я изменю это в конце концов) два похожих имени в моем коде: GLuint
и Gluint
.
Я пытаюсь обернуть эту функциональность C OpenGL в R (взято отсюда: OpenGL Текстурные объекты и параметры ):
GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
Подход
Я использую Rcpp для достижения этих целей:
- Обеспечить способвыделение объекта
Gluint
из R;возможно, путем создания экземпляра объекта S4, который оборачивает объект C (GLuint
tex) внутри? - Затем, предоставьте R-функцию с именем
gl_gen_textures
, которая принимает целое число, и этот объект упоминается в 1. Внутренне этоФункция gl_gen_textures
получает доступ к адресу памяти объекта GLuint
C и передает его в glGenTextures
(функция библиотеки C). - В конечном итоге предоставляет способ уничтожения объекта
Gluint
, созданного в R, инаряду с этим внутренний GLuint
C объект.
Фактический код
#include <Rcpp.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
using namespace Rcpp;
class Gluint {
public:
Gluint() {}
GLuint obj;
};
RCPP_MODULE(gluint_module) {
class_<Gluint>("Gluint")
.constructor()
.field("obj", &Gluint::obj)
;
}
//' @export
// [[Rcpp::export]]
void gl_gen_textures(unsigned int n, Gluint& tex) {
uint32_t _n;
_n = (uint32_t) n; // Convert unsigned int to uint32_t.
glGenTextures((GLsizei) _n, &(tex.obj));
}
Ошибки
В настоящее время этот код не компилируется. Я получаю следующие ошибки:
А вот фрагмент функции gl_gen_textures
, сгенерированной в строках Rcpp :: Exports.cpp 136-146:
// gl_gen_textures
void gl_gen_textures(unsigned int n, Gluint& tex);
RcppExport SEXP _glfw_gl_gen_textures(SEXP nSEXP, SEXP texSEXP) {
BEGIN_RCPP
Rcpp::RNGScope rcpp_rngScope_gen;
Rcpp::traits::input_parameter< unsigned int >::type n(nSEXP);
Rcpp::traits::input_parameter< Gluint& >::type tex(texSEXP);
gl_gen_textures(n, tex);
return R_NilValue;
END_RCPP
}