Hello all,

I am wrapping a very simple C++ library in a package (to read wavefront 3D obj files). The results come back as a std::vector of a struct which contains various fields using datatypes such as float, float[], std::string. I am going to return this as a list of lists. Each of the sublists will contain a set of named elements defined by the struct.

My question is what is the most efficient way to do this in present Rcpp? To overcome verbosity of using Named, I have opted for a macro that looks something like this:

  #define MNAME(X) Named(#X, m.X)

(see snippet below). Is there a better way to do this?

Also I feel there must a better way to to make a numeric vector from

  float ambient[3];

than

Named("ambient", NumericVector::create(m.ambient[0], m.ambient[1], m.ambient[2]))

But I am not finding it. Many thanks for any suggestions!

Best,

Greg.

#define MNAME(X) Named(#X, m.X)
  List ml;
  for(unsigned int i=0; i<materials.size(); i++) {
    tinyobj::material_t m=materials[i];
    /* typedef struct {
        std::string name;

        float ambient[3];
        float diffuse[3];
        float specular[3];
        float transmittance[3];
        float emission[3];
        float shininess;
        float ior;      // index of refraction
        float dissolve; // 1 == opaque; 0 == fully transparent
// illumination model (see http://www.fileformat.info/format/material/)
        int illum;

        std::string ambient_texname;
        std::string diffuse_texname;
        std::string specular_texname;
        std::string normal_texname;
        std::map<std::string, std::string> unknown_parameter;
      } material_t; */
ml[m.name]=List::create(Named("ambient", NumericVector::create(m.ambient[0], m.ambient[1], m.ambient[2])), Named("diffuse", NumericVector::create(m.diffuse[0], m.diffuse[1], m.diffuse[2])), Named("specular", NumericVector::create(m.specular[0], m.specular[1], m.specular[2])), Named("transmittance", NumericVector::create(m.transmittance[0], m.transmittance[1], m.transmittance[2])), Named("emission", NumericVector::create(m.emission[0], m.emission[1], m.emission[2])),
                            MNAME(shininess),
                            MNAME(ior), MNAME(dissolve), MNAME(illum),
MNAME(ambient_texname), MNAME(diffuse_texname), MNAME(specular_texname), MNAME(normal_texname));
  }


--
Gregory Jefferis, PhD
Division of Neurobiology
MRC Laboratory of Molecular Biology
Francis Crick Avenue
Cambridge Biomedical Campus
Cambridge, CB2 OQH, UK

http://www2.mrc-lmb.cam.ac.uk/group-leaders/h-to-m/g-jefferis
http://jefferislab.org
http://flybrain.stanford.edu
_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to